블로그 이미지
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. 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 next