블로그 이미지
devtang
Instagram : @taebr0 devtaehyeong@gmail.com

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Notice

2020. 7. 22. 18:27 AI/YOLO

 

 

저의 그래픽카드는 GTX 1050 Ti 이기 때문에 제 환경에 맞춰 진행하였습니다.

 

*[실행 환경]

Visual studio 2015

CUDA 10.1

cuDNN 7.6.3

OpenCV 4.0.1

기준으로 설치 튜토리얼을 진행하고, Visual Studio 가 설치되있다는 가정하에 진행하겠습니다.

 

목차

1. CUDA, cudnn 설치

2. OpenCV 설치

3. darknet 설치 및 환경 세팅

4. 간단한 예제 실행


1. CUDA 10.1 , cuDNN v7.6.3 설치

****** 주의사항 ******

참고: 저는 그래픽카드가 GTX 1050 Ti 이기 때문에 CUDA 10.1 버전을 사용할 수 있습니다.

CUDA는 버전이 다양한데, Compute capability에 따라 설치할 수 있는 버전이 있습니다. 

꼭 본인에 Compute capability에 맞는 CUDA 버전을 설치해주셔야 합니다.

CUDA 10.1 버전은 Compute capability 3.0~7.5 가 지원됩니다.

  • CUDA SDK 1.0 support for compute capability 1.0 – 1.1 (Tesla)
  • CUDA SDK 1.1 support for compute capability 1.0 – 1.1+x (Tesla)
  • CUDA SDK 2.0 support for compute capability 1.0 – 1.1+x (Tesla)
  • CUDA SDK 2.1 – 2.3.1 support for compute capability 1.0 – 1.3 (Tesla)
  • CUDA SDK 3.0 – 3.1 support for compute capability 1.0 – 2.0 (Tesla, Fermi)
  • CUDA SDK 3.2 support for compute capability 1.0 – 2.1 (Tesla, Fermi)
  • CUDA SDK 4.0 – 4.2 support for compute capability 1.0 – 2.1+x (Tesla, Fermi, more?).
  • CUDA SDK 5.0 – 5.5 support for compute capability 1.0 – 3.5 (Tesla, Fermi, Kepler).
  • CUDA SDK 6.0 support for compute capability 1.0 – 3.5 (Tesla, Fermi, Kepler).
  • CUDA SDK 6.5 support for compute capability 1.1 – 5.x (Tesla, Fermi, Kepler, Maxwell). Last version with support for compute capability 1.x (Tesla)
  • CUDA SDK 7.0 – 7.5 support for compute capability 2.0 – 5.x (Fermi, Kepler, Maxwell)
  • CUDA SDK 8.0 support for compute capability 2.0 – 6.x (Fermi, Kepler, Maxwell, Pascal). Last version with support for compute capability 2.x (Fermi) (Pascal GTX 1070Ti Not Support)
  • CUDA SDK 9.0 – 9.2 support for compute capability 3.0 – 7.2 (Kepler, Maxwell, Pascal, Volta) (Pascal GTX 1070Ti Not Support CUDA SDK 9.0 and support CUDA SDK 9.2)
  • CUDA SDK 10.0 – 10.2 support for compute capability 3.0 – 7.5 (Kepler, Maxwell, Pascal, Volta, Turing). Last version with support for compute capability 3.x (Kepler). 10.2 is the last official release for macOS, as support will not be available for macOS in newer releases. (저는 Compute capability가 6.1 이므로 10.1 버전을 사용할 수 있습니다.)
  • CUDA SDK 11.0 – support for compute capability 5.2 - 8.0 (Maxwell, Pascal, Volta, Turing, Ampere)

저는 GTX 1050 Ti 이므로 Compute capability가 6.1 버전입니다.

자세한 내용은 아래 사이트를 참조하시면 됩니다.

https://en.wikipedia.org/wiki/CUDA

 

CUDA - Wikipedia

CUDA (Compute Unified Device Architecture) is a parallel computing platform and application programming interface (API) model created by Nvidia.[1] It allows software developers and software engineers to use a CUDA-enabled graphics processing unit (GPU) fo

en.wikipedia.org

 


https://developer.nvidia.com/cuda-toolkit-archive

 

CUDA Toolkit Archive

Previous releases of the CUDA Toolkit, GPU Computing SDK, documentation and developer drivers can be found using the links below. Please select the release you want from the list below, and be sure to check www.nvidia.com/drivers for more recent production

developer.nvidia.com

위의 페이지에 들어가서 CUDA Toolkit 10.1 [Feb 2019] 버전을 클릭해줍니다.

클릭을 하시고 들어가시면 아래와 같이 local 로 설정하여 다운받아서 실행해줍니다.

exe[network]는 네트워크에서 나눠서 다운받는것이고 exe[local]은 설치파일을 한번에 받아놓는 방식입니다.

저는 local 방식으로 설치했습니다.

 

설치 옵션은 빠른 설치로 진행해줍니다.

설치된 저의 경로는 아래와 같습니다.

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1

 

다운로드가 완료되었으면 cuDNN을 설치합니다.

cuDNN을 다운받으려면 NVIDIA 회원가입 후 로그인 된 상태에서 가능합니다.

https://developer.nvidia.com/rdp/cudnn-archive

 

cuDNN Archive

NVIDIA cuDNN is a GPU-accelerated library of primitives for deep neural networks.

developer.nvidia.com

 

회원가입이 되셨으면 위의 사이트에 들어가서 v7.6.3 버전을 다운받아 줍니다.

위의 사진처럼 Download cuDNN v7.6.3 for CUDA 10.1 이면 10.1 버전용 cuDNN 이라는 뜻입니다. 

v7.6.3 이지만 CUDA 9.0 ,10.0 , 10.1 버전 등 각자 본인에 버전에 맞는 파일이 다르기때문에 주의해서 다운받아줍시다.

 

다운로드가 완료되면 폴더가 하나 있는데 저는 D드라이브에 넣어뒀습니다. 저의 cuDNN 경로는 아래와 같습니다.

D:\cuda

 


2. OpenCV 4.0.1 설치

 

https://opencv.org/releases/page/2/

 

Releases – Page 2

 

opencv.org

위의 홈페이지 들어가서 4.0.1 버전을 클릭해줍니다.

 

저는 D드라이브에 설치를 진행하였습니다.


3. Darknet 설치 및 환경 세팅 (중요)

 

 

darknet-master.zip
7.71MB

파일을 받아주고 압축을 풀어줍니다.

darknet-master -> build -> darknet 폴더에 들어가면 darknet.vcxproj 파일이 있습니다.

저는 편집을 편리하게 하기위해 Notepad++ 라는 프로그램을 설치하였습니다.

오른쪽 버튼 클릭을하면 Edit with Notepad++ 로 수정할 수 있습니다.

 

 

2번째 line에 본인의 Visual Studio 버전에 맞게 수정해주시면 됩니다. 저는 2015 버전을 쓰기때문에

ToolsVersion="14.0"으로 지정하였습니다.

 

 

55번째 라인에

$(VCTargetsPath)\BuildCustomizations\CUDA 10.0.props을 

 

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\visual_studio_integration\MSBuildExtensions\CUDA 10.1.props로 바꿔줍니다.

 

마찬가지로 마지막 줄에 있는 

$(VCTargetsPath)\BuildCustomizations\CUDA 10.0.props 부분도

 

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\visual_studio_integration\MSBuildExtensions\CUDA 10.1.targets 으로 바꿔줍니다.

 

이제 darknet.sln 을 실행해서 프로젝트 -> 속성으로 들어가줍니다.

 

구성을 Release 플랫폼을 x64 로 바꿔주고 아래의 세팅을 하셔야합니다.

 

C/C++ -> 일반(general) -> 추가 포함 디렉터리(additional include directories) 을 편집해줘야 합니다.

 

제 기준으로 편집 전

 $(OPENCV_DIR)\include;

 C:\opencv_3.0\opencv\build\include;

 ..\..\include;

 ..\..\3rdparty\stb\include;

 ..\..\3rdparty\pthreads\include;

 %(AdditionalIncludeDirectories);

 $(CudaToolkitIncludeDir);

 $(CUDNN)\include;

 $(cudnn)\include

편집 후

 

D:\opencv\build\include
..\..\include
..\..\3rdparty\stb\include
..\..\3rdparty\pthreads\include
%(AdditionalIncludeDirectories)
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\include
D:\cuda\include

 

위의 과정은 OpenCV 와 CUDA , cuDNN 의 올바른 include 경로를 설정해주는 과정입니다.

 

다음으로 CUDA C/C++ -> Device -> Code Generation 에서 자신의 Compute capability에 맞게 수정해줍니다.

 

거의다왔습니다!!

링커(Linker) -> 일반(general) -> 추가 라이브러리 디렉터리(Additional Library Directories) 를 편집해줘야 합니다.

 

제 기준으로 편집 전

 C:\opencv_2.4.9\opencv\build\x86\vc14\lib;

 C:\opencv_2.4.9\opencv\build\x86\vc12\lib;

 $(CUDA_PATH)lib\$(PlatformName);

 $(cudnn)\lib\x64;

 ..\..\3rdparty\pthreads\lib;

 %(AdditionalLibraryDirectories)

D:\opencv\build\x64\vc14\lib;

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\lib\$(PlatformName);

D:\cuda\lib\x64; 

..\..\3rdparty\pthreads\lib;

%(AdditionalLibraryDirectories)

 

편집 후입니다.


YOLO에서 CUDA와 OpenCV를 실행을 위한 dll 파일들을 옮겨줘야합니다.

 

 

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin 에서 

cublas64_10.dll

cudart64_101.dll

curand64_10.dll

cusolver64_10.dll

 

D:\opencv\build\x64\vc14\bin 에서

opencv_world401.dll

opencv_world401d.dll

opencv_ffmpeg401_64.dll

 

총 7개의 파일을 darknet-master\build\darknet\x64 폴더 안에 넣어줍니다.

 

 

넣어주시고 다시 darknet.sln 파일을 실행시킨 후에 

Release 에 x64인지 확인해 주시고 빌드(B) -> 솔루션 빌드 를 진행시켜줍니다.

 

휴~~ 드디어 빌드가 완료되었습니다. 성공이 되셨다면 YOLO 세팅이 정상적으로 된것입니다. 

 


4. 간단한 예제 실행

yolov3.weights (236 MB COCO Yolo v3): https://pjreddie.com/media/files/yolov3.weights

 

우선 미리 훈련된 weights 파일을 다운받아서 

darknet-master\build\darknet\x64 폴더안에 넣어줍니다.

 

폴더에 들어가서 빈 곳에 Shift + 오른쪽버튼을 누르면 위의 사진과 같이 여기에 PowerShell 창 열기가 뜹니다.

간단한 예제를 돌려보겠습니다. 

./darknet.exe detector test data/coco.data yolov3.cfg yolov3.weights data/dog.jpg 

 

원본 사진의 object detection 결과입니다.

 

정상적으로 설치가 되어서 위와 같이 object detection 이 성공적으로 되네요~

혹시나 설치과정중에 에러가 발생하면 댓글 남겨주세요. 설치하느라 고생하셨습니다~!!

posted by devtang
2020. 4. 14. 17:05 AI/Keras

 

 

 

본 게시물은 전 게시물의 세팅환경에서 진행하였습니다.

 

numpy 1.15
tensorflow 1.4
keras 2.0.3
cuda8.0
cudnn 5.1

 

https://ultrakid.tistory.com/22

 

[Keras] Anaconda를 이용한 Faster R-CNN 세팅 및 예제 실행

본 글은 Windows 10 환경에서 Anaconda에 가상환경을 세팅하여 진행하였습니다. Faster R-CNN Faster R-CNN의 가장 핵심 부분은 Region Proposal Network(RPN) 입니다. R-CNN은 이미지 내에 객체가 존재할 것 같..

ultrakid.tistory.com

공부를 하던중에 사실 Faster R-CNN 기반의 Real-time object detection(실시간 물체 인식)에 관한 예제를 찾고 있었으나, 몇일동안 찾아도 Windows 기반으로 구축된 글은 외국 사이트를 뒤져봐도 저의 능력으론 찾지 못했습니다..

 

Faster R-CNN 추론한 사진 (GTA 5)

 

그나마 다행인건 동영상을 인식하는 예제가 있긴 했는데 살펴보니 동영상 자체를 input시켜 detection 하는 것이 아닌 동영상을 프레임?으로 쪼개어 사진 한장마다 인식을해서 인식이된 모든 사진을 다시 합쳐 동영상형태로 만드는 예제 코드를 찾았습니다. 처리 모델로는 ResNet50 을 사용하였습니다.

 

우선 전 게시물에 예제 코드를 하나 받아야합니다.

https://github.com/riadhayachi/faster-rcnn-keras/blob/master/test_frcnn_count.py

 

riadhayachi/faster-rcnn-keras

object detection in video. Contribute to riadhayachi/faster-rcnn-keras development by creating an account on GitHub.

github.com

 

다운을 받고 폴더안에 넣어줍니다.

마찬가지로 Anaconda Prompt를 실행시켜 만들어준 fasterRCNN 가상환경을 activate 해줍시다.

자이제 위의 폴더로 들어가서 코드를 입력합니다.

python test_frcnn_count.py --input_file 경로/처리할동영상.mp4 --output_file 경로/출력동영상이름.mp4 --frame_rate=25

frame rate는 25로 default값을 설정해줍니다.

 

띠용..

텐서플로우도 backend로 실행 잘되는가 싶더니 코드에 문제가 없지만 TypeError가 떴습니다.

https://github.com/pender/chatbot-rnn/issues/31

 

Pickle TypeError: a bytes-like object is required, not 'str' · Issue #31 · pender/chatbot-rnn

Getting this error: Traceback (most recent call last): File "chatbot.py", line 301, in main() File "chatbot.py", line 35, in main sample_main(args) File "chatbot.py", ...

github.com

 

음영 처리된 부분중 with open(config_output_filename, 'r') as f_in: 부분에서 'r'을 'rb'로 고쳐야합니다.

 

 

 

또 음영처리된 174번째 라인중 저부분이 원래는 var로 되어있으나 str(var)로 고쳐줘야합니다..

 

 

 

도대체 어디서부터 잘못된걸까 이틀동안 찾아본것 같습니다.

아마 이 코드가 python2.x버전대에서 작성한 코드라서 3.6버전에 안맞았던 것 같습니다.

2버전에서 3버전으로 올라가면서 문법이 약간씩 수정되었다고 합니다.

https://sebastianraschka.com/Articles/2014_python_2_3_key_diff.html

 

The key differences between Python 2.7.x and Python 3.x with examples

Many beginning Python users are wondering with which version of Python they should start. My answer to this question is usually something along the lines “ju...

sebastianraschka.com

아래와 같이 변경해줍니다.

cv2.rectangle(img_scaled,(x1, y1),(x2, y2), (int(class_to_color[key][0]),int(class_to_color[key][1]),int(class_to_color[key][2])),2)

이제 다시 코드를 입력하고 실행시켜줍니다.

python test_frcnn_count.py --input_file 경로/처리할동영상.mp4 --output_file 경로/출력동영상이름.mp4 --frame_rate=25

동영상을 프레임으로 쪼개어 한장씩 Object Detection을 수행한후 종합된 result image를 다시 합치는 방식입니다.

 

 

 

아래는 변환된 동영상입니다.

https://youtu.be/CyvN4hZTMxo

 

 

posted by devtang
2020. 4. 3. 13:19 AI/Keras

본 글은 Windows 10 환경에서 Anaconda에 가상환경을 세팅하여 진행하였습니다.

 

Faster R-CNN

Faster R-CNN 구조

Faster R-CNN의 가장 핵심 부분은 Region Proposal Network(RPN) 입니다.

R-CNN은 이미지 내에 객체가 존재할 것 같은 위치를 제안 하면, 제한된 위치의 이미지를 잘라냅니다.

잘라낸 이미지의 feature map을 추출하여 그것에 대해 CNN(Convolutional Neural Network)을 사용했습니다.

 

하지만 Faster R-CNN은 잘라낸 영역마다 CNN을 사용하는것이 아니라 이미지 전체를 CNN에 통과시킨 후,

큰 feature map을 추출해내어  제안된 영역을 feature map에 투영하는 방식입니다.

즉 여러번 처리할일을 한번에 하게되어 처리속도가 전 모델보다 훨씬 빨라졌으며, 전작 대비 정확도가 상승했습니다.

 

우선 Anaconda 과Visual C++ 2015 Build Tools 가 설치되있는 가정하에 진행하겠습니다.

 

아나콘다 프롬프트창을 열어줍니다. 저는 가상환경이름을 fasterRCNN으로 지었습니다.

(base) C:\Users\@USERNAME@>conda create -n fasterRCNN python=3.6 pip

가상환경이 설정된 후 가상환경으로 진입합니다.

activate fasterRCNN

진입하면 다음과 같습니다.

pip install tensorflow-gpu==1.4

pip install keras==2.0.3

pip install numpy==1.15
pip install sklearn h5py

pip install opencv-python ipython

필요한 요소들을 설치해줍니다. (cudatoolkit==8.0 cudnn==5.1 버전사용, 혹시나 cuda 관련 에러뜰시 따로 설치필요!)

 

그리고 faster R-CNN을 git에 들어가서 다운로드해줍니다.

https://github.com/you359/Keras-FasterRCNN

 

you359/Keras-FasterRCNN

keras implementation of Faster R-CNN. Contribute to you359/Keras-FasterRCNN development by creating an account on GitHub.

github.com

저는 이폴더를 바탕화면에 두었습니다.

 

그리고 예제에 필요한 웨이트파일을 다운받아서 git에서 받은 faster rcnn폴더에 넣어줍니다.

 

이제 예측할 input image를 넣을 폴더를 생성해줍니다.

(fasterRCNN) C:\Users\@USERNAME@\Desktop\keras-frcnn-master>mkdir images

images 폴더안에 자신이 예측하고싶은 사진을 넣습니다.

저는 YOLO 예제돌릴때 쓰는 개사진과 바다에 배가 떠있는 사진을 예제로 테스트해봤습니다.

(fasterRCNN) C:\Users\@USERNAME@\Desktop\keras-frcnn-master>python test_frcnn.py -p images

 

제 컴퓨터의 그래픽카드는 GTX1050TI이며 한사진당 detection 시 2초정도 걸린것 같습니다.

 

참고사이트

https://github.com/you359/Keras-FasterRCNN

 

you359/Keras-FasterRCNN

keras implementation of Faster R-CNN. Contribute to you359/Keras-FasterRCNN development by creating an account on GitHub.

github.com

https://inspace4u.github.io/dllab/lecture/2017/09/09/Keras_FRCNN_Testing.html

 

Keras 기반 F-RCNN 실습

본 포스트에서는 Keras 기반으로 구현한 Faster RCNN 코드를 직접 실행 및 실습해 보겠습니다. 실행 환경 이 예제에서는 기본적인 Tensorflow와 Keras 이외에 이미지 처리를 위한 OpenCV 라이브러리와 대용량 데이터를 다루는 포맷인 hdf5를 지원하기 위한 h5py 패키지가 추가로 필요합니다. 만약 Windows 10에서 텐서플로우, 케라스 오프라인 설치 또는 Windows 7 포스트의 설명을 따라 환경을 구축하셨다면 이 두 패키지가

inspace4u.github.io

2020-08-12 수정 내용

weights 파일이 본글에서 만료되어서 아래 링크를 클릭하시면 다운받으실 수 있습니다!!

https://drive.google.com/file/d/1oQbhyRJFLRmbd9d2msAZCL77_nXbJvLR/view?usp=sharing

 

model_frcnn.hdf5

 

drive.google.com

config.pickle
0.00MB

 

posted by devtang
2020. 4. 1. 18:17 AI/Keras

이번 게시물은 Windows10 에서 Anaconda 가상환경에 Mask R-CNN 을 세팅하여 간단한 사진 예제를 돌려보겠습니다.

 

우선 Mask R-CNN이란 무엇인가?

 

Mask R-CNN : Mask Region-based Convolutional Network

 

COCO dataset 이미지 검출 예제 사진

 Mask R-CNN은 원래 있던 Faster-RCNN에 기반한 모델입니다. 간단하게 말하면 Faster R-CNN으로 Object를 검출한 box 안에 Object에 예측된 부분을 mask 씌워준 것입니다. 기존의 Faster R-CNN을 Object Detection 역할로 하고 각각의 RoI(Region of Interest)에 mask를 입혀주는 작은 FCN(Fully Covolutional Network)를 추가해준 것입니다. 또한 RoI Pooling이아닌 RoIAlign를 사용했다는데 , mask accuracy가 증가하였다고 합니다. 자세한 내용은 추후에 포스팅 할 예정입니다. 

Mask R-CNN framework

 

Mask R-CNN 세팅하기

기본적으로 Anaconda가 세팅이 되어있어야합니다. 이글은 Windows10을 기준으로 작성합니다.

 

GPU를 사용하기 위해 CUDA 와 CUDNN을 설치해야하는데 버전이 맞지 않으면 호환이 되지 않아 오류가 날 가능성이 큽니다. 제가 구동한 버전은 아래와 같습니다.

cuda v9.0

cudnn v7.0.x (저는 7.0.2로 가장 구버전을 선택해서 사용했습니다.)

 

cuda 설치

https://developer.nvidia.com/cuda-toolkit

 

cudnn 설치

https://developer.nvidia.com/cudnn

(NVIDIA 로그인 후 다운로드가 가능합니다.)

 

cudnn을 깔면 이파일들이 나오는데 bin, include, lib폴더안에 내용물을 

자기가 깔아준 CUDA 폴더 경로에 붙여넣기 해줍니다.

제기준으로 경로입니다. C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0

특별한 설정없으면 위의 경로가 맞으실 거에요.

 

이제 윈도우 키 + 시스템 환경 변수 편집 입력 하시면 시스템 속성이 나옵니다.

환경 변수 클릭후 시스템 변수 편집에 cudnn 이라고 새로 만들주고 경로를 붙혀넣어 줍니다.

 

 

 

설정이 완료되었으면 아나콘다 프롬프트를 실행시킵니다.

본격적으로 Mask R-CNN 환경 세팅을 위한 가상환경을 만들어 줍니다. python3.6 과 pip을 추가 설치해주는 명령어에요

(base) C:\Users\@USERNAME@>conda create -n MaskRCNN python=3.6 pip

세팅이 끝난후에 activate MaskRCNN 을 입력하면 아래 사진과 같이 가상환경에 정상적으로 들어간 것을 확인해주세요.

이제 Mask R-CNN을 구성하는데 필요한 파일들을 설치해줘야 합니다.

추가적으로 Visual C++ 2015 Build Tools 설치가 필요합니다.

pip install tensorflow-gpu==1.5 

pip install keras==2.2.0 

pip install cython matplotlib scikit-image h5py Pillow jupyter pandas numpy scipy 

pip install opencv-python ipython

-------------------------------

저는 바탕화면에 Mask_RCNN폴더를 만들어 설치하였습니다. 



cd Desktop //바탕화면으로 이동 

mkdir Mask_RCNN // Mask_RCNN 이라는 폴더 생성 

cd Mask_RCNN // Mask_RCNN 폴더로 이동

-------------------------------

conda install -c anaconda git //git을 이용하기위한 설치 

git clone https://github.com/matterport/Mask_RCNN.git  // Mask_RCNN파일 설치 

-------------------------------

git clone https://github.com/philferriere/cocoapi.git // cocotools 설치 

pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=pythonAPI 

-------------------------------

git clone https://github.com/aleju/imgaug.git // imgaug 설치 

pip install imgaug

-------------------------------

https://github.com/matterport/Mask_RCNN/releases 

 

matterport/Mask_RCNN

Mask R-CNN for object detection and instance segmentation on Keras and TensorFlow - matterport/Mask_RCNN

github.com

추가적으로 이사이트에 들어가서 
mask_rcnn_coco.h5.file 을 다운로드하여 Mask_RCNN 폴더에 넣어줍니다.

 

 

이제 주피터 노트북을 이용하여 예제를 실행해 보도록 하겠습니다.

Mask_RCNN 폴더내에 samples 폴더에 들어가서 demo.ipynb 파일을 실행시켜서 데모를 구동해봅니다.

 

 

성공적으로 구동이 되었습니다. 

# Load a random image from the images folder 

 file_names = next(os.walk(IMAGE_DIR))[2]

 image = skimage.io.imread(os.path.join(IMAGE_DIR, random.choice(file_names)))

Mask_RCNN폴더내에 images에 자신이 원하는 사진을 넣고 아래와 같이 코드 수정을 하면 다른 사진도 돌려볼 수 있습니다.

# Load a random image from the images folder

 filename = os.path.join(IMAGE_DIR, 'doge.jpg')

 image= skimage.io.imread(filename)

 

글 읽어주셔서 감사합니다.

 

 

추가적으로 오류나는 사항있으면 댓글로 알려주세요!!

 

 

참고사이트

https://www.youtube.com/watch?v=2TikTv6PWDw

 

https://n1094.tistory.com/42

 

https://medium.com/zylapp/review-of-deep-learning-algorithms-for-object-detection-c1f3d437b852

 

https://reyrei.tistory.com/11

 

posted by devtang
2020. 3. 27. 17:40 AI/Keras

앞 게시물에 사용한 Dense는 fully-connected(FC) layer로써 1차원 배열 데이터로 한정됩니다. 

그러나 컬러 사진 1장은 3차원 배열 데이터이기 때문에 FC신경망을 이용하여 사진을 학습시키기 위해서는

3차원 데이터를 1차원 데이터로 평면화 시켜서 학습 시켜줘야합니다.

 

따라서 신경망이 추출 및 학습시에 굉장히 비효율적이고 정확도를 높이는 데 한계가 있을 수 밖에 없습니다.

이미지 공간 정보를 유지한 상태에서 학습을 시킬 수 있는 모델이 바로 CNN(Convolutional Neural Network)입니다.

 

CNN의 구조

Convolution 신경망은 이미지가 가지는 특성이 고려되어 설계된 신경망이므로 영상 처리에 주로 사용됩니다.

CNN의 구조는 위의 그림과 같이 그림에 한 필터가 순회적으로 돌며 합성곱을 계산하여 그 결과로 하나의

피쳐맵을 형성합니다. 

Convolution 과정

합성곱을 함으로써 얻게되는 효과는 아래 사진을 보면 쉽게 이해할 수 있습니다.

왼쪽에 숫자 30으로 이루어진 부분을 따라 그려보면 오른쪽의 그림과 거의 비슷한 모양입니다.

사진이 픽셀 데이터로 구성되어있음을 알 수 있습니다.

 

 

Polling 은 컨볼루션 레이어의 출력 이미지에서 합성곱을 계산하여 주요값을 뽑아 크기가 작게 출력하여 만듭니다.

아래의 그림을 보시면 4X4의 map에서 2X2 네칸으로 나눌수 있는데 각 칸의 최고 크기의 숫자를 뽑아서 2X2로 resize한 모습입니다.

 

본래 신경망은 인간의 신경계를 모사한 것인데 뉴런이 큰 신호에 반응하는 것과 유사합니다.

주요값을 뽑아서 resize시키는 max pooling을 거치면 노이즈 감소, 속도 증가, 영상의 분별력 강화등이 이점이 있습니다.

 

CNN은 overfitting(너무 학습시켜서 오히려 역효과가 발생하는 현상)을  방지할 수 있습니다.

 

keras에서 CNN을 이용하여 손글씨를 학습해보도록 하겠습니다.

from keras import layers
from keras import models

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))

컨볼루션 레이어중 Conv2D 레이어를 사용했습니다. 영상인식에 주로 사용되는 레이어입니다.

 

Conv2D(32, (3,3) , activation ='relu', input_shape=(28,28,1))

32 : 컨볼루션 필터의 수 입니다.

(3,3) : 컨볼루션 커널의 행열입니다.

활성화 함수로는 'relu'를 이용하였습니다. 

input_shape=(28,28,1) : 입력값을 28X28 로 주었고, 흑백 사진인 채널1을 사용하였습니다.

 

MaxPooling2D(2,2) : 축소 비율을 2,2로 지정하였습니다.

 

model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

Convolution과 MaxPooling 과정을 거쳤으니 주요 특징들만 추출 되었을 것입니다. 

추출된 주요 특징은 전결합층(Fully-connected)에 전달되어 학습됩니다. 위의 컨볼루션과 풀링의 과정은 2차원 자료를 다루지만 전결합층에 전달하기 위해선 1차원 자료로 바꿔줘야 합니다. Flatten의 원리는 아래의 사진과 같은 느낌입니다.

model.summary()

model.summary()를 이용하여 출력타입을 확인할 수있는데

 

conv2d_9 (Conv2D) (None,3,3,64) 에서

flatten_3 (Flatten) (None,576) 으로 바뀌었습니다.

 

즉 flatten 과정을 거쳐 3X3X64 = 576576으로 평탄화 되어 두개의 Dense층으로 들어갔습니다.

 

from keras.datasets import mnist
from keras.utils import to_categorical

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32') / 255

test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32') / 255

train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

 

학습할 데이터와 테스트할 데이터 셋을 설정했습니다. 

model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=5, batch_size=64)
test_loss, test_acc = model.evaluate(test_images, test_labels)

모델을 컴파일 설정 후 테스트를 진행하는 과정입니다.

CNN을 이용한 손글씨셋 인식의 정확도는 0.9929정도 나왔습니다.

 

참고사이트

----------------------------------------------------------------------------------------------------------------------------------

https://bskyvision.com/412

 

딥러닝 알고리즘의 대세, 컨볼루션 신경망(convolutional neural network, CNN)

인공지능이 핫하다. 핫한지 벌써 오래다. 인공지능이 발전하게 된 계기는 크게 세가지로 볼 수 있다. 딥러닝 알고리즘의 발전. 데이터량의 폭발적인 증가. GPU의 발전. 딥러닝 알고리즘은 가장 간단한 피드포워드..

bskyvision.com

https://sonofgodcom.wordpress.com/2018/12/31/cnn%EC%9D%84-%EC%9D%B4%ED%95%B4%ED%95%B4%EB%B3%B4%EC%9E%90-fully-connected-layer%EB%8A%94-%EB%AD%94%EA%B0%80/

 

CNN을 이해해보자. fully connected layer는 뭔가

*본 글은 개인 공부를 위해 복사 및 인용한 글들의 출처를 명시하고 적는 글입니다. 무단 도용 및 인용으로 인한 책임은 지지 않습니다. ​ 요즘 귀차니즘에 빠졌어요. 펜으로 적기 귀찮아서 제가 찾아본 내용들은 시간 순으로 쭉 정리해서 블로깅 하려고 합니다. 머리에서 필요하다고 생각하는 거를 바로바로 찾는 과정이라 많이 두서가 없을 수 있습니다 . 존댓…

sonofgodcom.wordpress.com

https://github.com/AhnSungJoo

 

AhnSungJoo - Overview

Machine Learning & Blockchain & Quant . AhnSungJoo has 34 repositories available. Follow their code on GitHub.

github.com

 

posted by devtang
2020. 3. 26. 17:47 AI/Keras

이번 게시물에서는 Keras를 이용하여 손글씨  데이터셋을 불러와서 모델 구성 및 학습하여 Keras의 간단한 기초과정을 이해하는 게시물입니다.

 

MNIST란 이미지 데이터 셋으로 사람이 직접 쓴 글씨체 0~9까지의 이미지들로 구성되어있습니다.

케라스 데이터셋 라이브러리를 이용하여 쉽게 훈련용 이미지를 load할 수 있습니다.

 

Windows10 환경에서 진행하였으며 기본 세팅 과정은 아래의 블로그에서 참조해주세요.

https://like-edp.tistory.com/3

 

Anaconda(아나콘다) 에서 Keras(케라스) 설치하기

반갑습니다. 이번 글에서는 아나콘다를 사용하여 케라스까지 설치해보는 작업을 진행하도록 하겠습니다. 아나콘다는 일반적으로 정말 다양한 라이브러리 패키지들을 모아놓은 소프트웨어인데, Python을 포함해 연..

like-edp.tistory.com

우선 keras 모듈을 import 하여 훈련에 필요한 손글씨 데이터 셋을 불러옵니다.

import keras
from keras.datasets import mnist

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

딥러닝 모델을 학습하기 위해 train 과 test 2가지로 나눕니다.

train 은 훈련시킬 데이터이고 test는 훈련시킨 모델의 테스트용 데이터 입니다.

_images는 숫자 이미지의 정보이며 _label은 숫자 이미지의 이름입니다.

 

print(train_images[0])

import matplotlib.pyplot as plt
plt.imshow(train_images[0])
plt.show()

 

 

이미지데이터를 출력시켜 보았습니다. 출력시켜보면 배열안에 0~255 숫자 픽셀 데이터로 구성 되어있는 것을 알 수 있습니다. 추가적으로 matplotlib를 import 하여 train_images[0] 의 사진을 불러왔습니다.

 

print(train_images.shape)
print(len(train_labels))
print(train_labels)

print(test_images.shape)
print(len(test_labels))
print(test_labels)

train_image와 test_image 를 shape 명령어를 사용하여 각각의 배열 데이터의 크기를 확인할 수 있습니다.

print(train_images.shape) 

(60000,28,28)

60000 : 갯수가 6만개라는 뜻입니다.

28,28 : 하나의 배열은 28X28 로 이루어져 있습니다.

 

print(len(train_labels))

60000

train_labels 의 데이터의 길이가 60000이라는 뜻입니다.

 

이제 데이터 셋 성분을 보았으니 이 데이터들을 Normalize해줘야합니다.

train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype('float32') / 255

test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') / 255

reshape 로 출력 데이터를 같은 양식으로 통일하고 astype를 이용하여 픽셀값이 0~255사이 값이므로 255로 나누어 데이터를 0~1까지의 숫자로 변환합니다.

 

이미지 데이터들을 전처리 해주었으니  라벨 데이터 역시 One-hot encoding으로 변환 해줍니다.

 

One-hot encoding 이란?

표현하고 싶은 단어의 index에는 1의 값을 부여하고 , 다른 인덱스에는 0을 부여하는 표현 방식입니다.

print (train_labels[:10])
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
print (train_labels[:10])

train_labels 을 인코딩전에 출력하면

[ 5 0 4 1 9 2 1 3 1 4 ]

이렇게 표현이됩니다.

5를 encoding 한 결과값입니다.

[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]

배열 index (0~9)중 여섯번째가 5입니다. 정수 5 위치의 값이 1이며, 나머지값은 0으로 표현하게됩니다.

 

이제 데이터셋의 생성이 모두 완료되었습니다. 다음 단계는 모델을 구성하여 학습준비를 해야합니다.

from keras import models
from keras import layers

network = models.Sequential()
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(10, activation='softmax'))

models과 layers 를 import하여 Sequential()함수를 이용합니다.

이때 Dense 레이어를 이용하는데

Dense() 함수에 들어가는 인자는 다음과 같습니다.

 

Dense(512, activation='relu', input_shape=(28*28))

*512 는 출력 뉴런의 수를 설정합니다.

*input_shape 는 입력 뉴런의 수를 설정합니다. (행,열,채널 수) 로 구성됩니다.

*activation='relu' 

*relu : (ReLU, Rectified Linear Unit), 은닉층(hidden layer) 에서 주로 사용하는 활성화 함수입니다.

*softmax : 입력받은 값을 출력으로 0~1사이의 값으로 모두 정규화하며 출력 값들의 총합은 항상 1이 되는 특성을 가진 함수 입니다. 

 

이 게시물에서 구하고자 하는 문제는 입력 이미지가 주어졌을 때 0~9 까지 각 숫자와 얼마나 비슷한지에 대한 확률을 구하는 것입니다. 숫자 9를 인식하려는데 예를들어 9일확률 80%, 8일확률 5% 로 다른 숫자에 대해서 낮은 확률로 인식할 수 있습니다. 

 

network.add를 이용하여 두 개의 Dense 계층을 연속적으로 추가하며, 합계가 1이 되는 10개의 확률 점수의 배열을 반환합니다. 각 점수는 현재의 숫자 이미지가 10개 숫자 분류 각각에 속할 확률입니다.

 

 

network.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

이제 .compile을 이용하여 학습하기전 설정을 합니다.

optimizer = 학습속도를 빠르고 안정적으로 하는 원리를 말합니다.

'Adam' , 'SGD', 등 다양한 알고리즘이 있지만 여기서 수행할 'rmsprop'은 각각의 가중치에 맞춰 학습률을 제어하는 기법입니다. 이 알고리즘은 학습률을 최근에 갱신된 가중치 기울기의 평균으로 나누는 방법입니다.

metrics 는 'accuracy' 를 이용하였으며 이는 훈련 및 시험 중에 모니터링할 측정값입니다.

 

이제 컴파일도 완료 되었으니 fit()함수를 이용하여 학습을 진행해보도록 합시다.

network.fit(train_images, train_labels, epochs=5, batch_size=128)

epochs 는 학습횟수를 의미합니다. 5를 입력하였으니 총 5번 학습을 반복합니다.

batch_size 는 몇번 학습해보고 해답을 맞출 건지 의미합니다. 즉 , 한번에 128개씩 훈련하는 것입니다.

 

test_loss, test_acc = network.evaluate(test_images, test_labels)
print('test_acc:', test_acc)

학습할때의 훈련셋 검증셋의 손실 추이를 보기위한 코드입니다.

위의 사진을 보시면 총 5번 학습 진행하였으며 70000장의 사진중 60000장이 훈련에 사용됬으며 10000장이 검증셋으로 사용되어 테스트 정확도가 0.977로 나타났습니다.

 

참고사이트

https://keras.io/ko/optimizers/#_1

 

Optimizers - Keras Documentation

옵티마이저의 사용법 옵티마이저는 Keras 모델을 컴파일하기 위해 필요한 두 개의 매개변수(parameter) 중 하나입니다. from keras import optimizers model = Sequential() model.add(Dense(64, kernel_initializer='uniform', input_shape=(10,))) model.add(Activation('softmax')) sgd = optimizers.SGD(lr=0.01, de

keras.io

https://tensorflow.blog/4-%ED%85%90%EC%84%9C%ED%94%8C%EB%A1%9C%EC%9A%B0-%EC%8B%B1%EA%B8%80-%EB%A0%88%EC%9D%B4%EC%96%B4-%EB%89%B4%EB%9F%B4-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-first-contact-with-tensorflow/

 

4. 텐서플로우 단일 레이어 뉴럴 네트워크 – First Contact with TensorFlow

이 글은 스페인 카탈루냐 공과대학의 Jordi Torres 교수가 텐서플로우를 소개하는 책 ‘First Contack with TensorFlow’을 번역한 것입니다. 이 글은 원 도서의 라이센스(CC BY-NC-SA 3.0)와 동일한 라이센스를 따릅니다. 파이썬 3  notebook으로 작성한 이 섹션의 코드는 여기에서 보실 수…

tensorflow.blog

 

posted by devtang
2020. 3. 20. 15:15 AI/YOLO

항상 YOLO 학습때 anchor 값이 정확히 무엇인지 몰라서 찾아봤는데 

https://github.com/pjreddie/darknet/issues/568

 

Can someone clarify the anchor box concept used in Yolo? · Issue #568 · pjreddie/darknet

I know this might be too simple for many of you. But I can not seem to find a good literature illustrating clearly and definitely for the idea and concept of anchor box in Yolo (V1,V2, andV3). Thanks!

github.com

여기서 AlexeyAB , YOLO 버전의 제작자중 한명이 댓글을 남겼습니다.

 

Anchors are initial sizes (width, height) some of which (the closest to the object size) will be resized to the object size - using some outputs from the neural network (final feature map):

 

Anchor는 초기의 크기(너비, 높이) 이며 그 중 일부 (개체 크기에 가장 가까운)는 신경망 (최종 기능 맵)의 일부 출력을 사용하여 개체 크기로 크기가 조정됩니다.

 

yolo_layer.c - get_yolo_box 함수

 

  b.x = (i + x[index + 0*stride]) / lw;
  b.y = (j + x[index + 1*stride]) / lh;
  b.w = exp(x[index + 2*stride]) * biases[2*n]   / w;
  b.h = exp(x[index + 3*stride]) * biases[2*n+1] / h;

darknet 폴더안에 yolo_layer.c 파일중 get_yolo_box 함수 안에 다음과 같은 코드가 있습니다.

대부분의 경계 상자에는 특정 높이 너비 비율이 있는데 YOLO는 경계 상자를 직접 예측하는 대신 특정 높이 너비 비율을 가진 미리 결정된 상자 세트에서 대상을 예측합니다. 이때 미리 정해진 상자 세트가 앵커 입니다.

 

따라서 학습시에 yolov3.cfg 파일을 가져와서 다음과 같이 수정합니다.

 

max_batches 는 자신의 classes * 4000 로 설정하였습니다. (저는 클래스가 6개이므로 24000)

 

그리고 cfg파일에 맨아래쪽으로 내려가면

[convolutional]
size=1
stride=1
pad=1
filters=33
activation=linear


[yolo]
mask = 0,1,2
anchors = 11, 21,  31, 62,  43, 80,  53,103,  65,125,  78,155,  51,287, 106,202,  76,350
classes=6
num=9
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1

여기서 [yolo]부분에 classes 를 각 자신이 설정한 classes 개수로 설정하고 [convolutional] 파트에 filters 수는 yoloV3 기준 (classes + 5) * 3 해준 값을 설정해줍니다. (저는 클래스가 6이므로 (6+5) * 3 = 33 해줬습니다.)

 

조금더 올려보면 마찬가지로 [yolo] 가 두개나 더 있습니다.

[yolo]와 바로 그위에 [convolutional] 를 모두 수정해줍니다.

[convolutional]
size=1
stride=1
pad=1
filters=33
activation=linear

[yolo]
mask = 6,7,8
anchors = 11, 21,  31, 62,  43, 80,  53,103,  65,125,  78,155,  51,287, 106,202,  76,350
classes=6
num=9
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1

[convolutional]
size=1
stride=1
pad=1
filters=33
activation=linear

[yolo]
mask = 3,4,5
anchors = 11, 21,  31, 62,  43, 80,  53,103,  65,125,  78,155,  51,287, 106,202,  76,350
classes=6
num=9
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1

자이제 anchors 값도 설정해줘야하는데 각자 anchors 값이 다르므로 명령어를 통해 가져옵니다.

darknet.exe detector calc_anchors data/obj.data data/yolo-obj.cfg -num_of_clusters 9 -width 416 -height 416

obj.data , cfg 파일은 본인의 경로에 맞게 설정해주시고 width 와 heights 역시 본인의 cfg 파일에 설정한 크기대로 설정해주시면 됩니다. 저는 416 416으로 맞췄습니다.

코드를 실행해주면 평균 IoU % 값이 뜨고 anchors값이 txt로 저장이됩니다.

 

 

이후에 동일하게 설정한 cfg파일을 사용하여 학습 진행해 주면 됩니다.

 

 

posted by devtang
2020. 3. 10. 15:48 AI/YOLO

=========수정 ==========

마스크 착용 여부를 이용하여 교내 경진대회의 출전한 UCC영상입니다. 

youtu.be/OwrC1YFvGH0

========================

요즘 코로나 바이러스로 인해 전세계가 혼란입니다.

그래서 마스크를 착용하지 않으면 주변 사람에게 피해가 가니 항상 착용하도록 합시다!!

다름이 아니라

연구실에서 공부겸 간단한 개인 프로젝트를 진행해보고 있습니다. 시국이 시국인지라 마스크를 착용해야 문이 열리는 그런 시스템을 만들어보고자 하는데 착용 유무를 판단하기 위하여 YOLO를 이용하기로 했습니다.

 

class는 2가지로, 마스크를 쓴사람, 안쓴사람으로 나눠 학습했습니다. YOLO_MARK를 이용하여 라벨링 작업하였습니다.

Windows에서 학습을 진행하였으며, 컴퓨터환경은 인텔 CPU i5-6600 3.30Ghz ,NVIDIA GeForce GTX 1050 Ti 입니다.

 

 마스크를 쓴얼굴 500장, 안쓴얼굴 500장 정도 모아서 수동으로 라벨링 작업을 진행했습니다.

사실 딥러닝 학습시에 class당 500장의 사진은 굉장히 소량입니다. 추후에 더 괜찮은 아이디어가 생기면 

더 기능을 추가할 예정입니다. 연구실에서 간단한 프로젝트로 학습겸 진행해보았습니다.

 

이미지를 라벨링 하게되면 txt파일이 생기는데 파일 안에는 class num와 각 사진의 라벨을 딴 좌표값이 들어있습니다.

참고로 이미지는 크롤링을 이용하여 구글에서 사진을 뽑아서 학습에 이용가능한 사진 500장씩만 분류했습니다.

 

정상적으로 확인이 되고있습니다.

 

123: 0.814543, 1.045863 avg loss, 0.001000 rate, 5.422000 seconds, 7872 images

 

123: 현재 훈련/Batch 를 몇번 반복했는지 나타냅니다.

0.814543 : 총 손실을 나타냅니다.

1.045863 avg : 평균 손실 오차로써 최대한 낮을때까지 학습을 시켜줘야합니다. 보통 저는 0.020000정도 아래로 내려가면 학습을 중지 시킵니다.

0.001000 rate : cfg 파일안에 정의된 학습 속도 비율을 나타냅니다.

5.422000 seconds : 1batch를 학습시키는데 소요된 시간을 나타냅니다.

7872 images : 지금까지 학습에 사용된 이미지의 총갯수를 나타냅니다.

 

위의 사진은 학습한지 얼마 안됬을때 캡쳐한 사진입니다. 20000번 넘게 학습시켜본결과 제 컴퓨터로는 하루좀 넘게 켜뒀던 것 같습니다.

 

위의 사진은 약 2만 2천번 학습시켰을때 나타난 학습곡선으로 이정도로 학습된 weights 파일로 구동시켜봤습니다.

 

아래는 구현 사진과 동영상 입니다.

 

30fps정도 나오며 인식률도 500장의 데이터 치고는 양호합니다.

마스크를 꼈을때, Mask 93% 정도로 인식합니다.

 

마스크를 벗게되면, 마스크를 착용하지 않은 class이름을 NO_MASK로 정의했습니다.

역시 90%이상으로 인식합니다.

 

 

 

추가적으로 라즈베리파이GPIO와 소켓통신을 이용하여 마스크를 끼지 않았을때 출입을 하지 못하도록 막는 시스템을 구현할 예정입니다.

감사합니당. 

'AI > YOLO' 카테고리의 다른 글

[YOLO] 윈도우 버전 YOLOv3 설치 Guideline  (35) 2020.07.22
YOLO 학습시 cfg 파일 설정(anchors)  (3) 2020.03.20
posted by devtang
prev 1 2 next