블로그 이미지
pgmr이상현
Instagram:sh_lee77 머신비전, YOLO, 영상처리, Deep Learning, 딥러닝

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

앞 포스팅에서 YOLO의 데이터 학습까지 해서 야생동물(고라니, 멧돼지)를

인식하는 것 까지 끝 맞췄습니다. 


이제는 인식한 야생동물을 물총으로 추적하면서 쫓아내는 일만이 남았습니다.

우리는 물총을 제어하기 위해서 아두이노(Arduino)를 사용하기로 했습니다.


설계한 구성도를 한번 보도록 하겠습니다.

구성도를 설명하자면 Cam은 물총 위에 있으며, 야생동물이 인식되기까지 계속하여 물총과 함께 물총 밑에있는 servomotor를사용, 180도 회전합니다.


YOLO로 야생동물이 인식이 되면, Bounding Box의 정 중앙 좌표값을 계산해,

Http서버로 전송하게 됩니다.


그럼 Arduino는 Http서버에서 좌표를 받아와 야생동물의 위치로 물총을

위치시키고, 손잡이 방아쇠부분에 있는 360도 servomotor를 회전시켜

물총을 발사하게 설계하였습니다. 

posted by pgmr이상현

지금까지 많은 Deep Learning Detection Algorithm중에서 왜 YOLO를 사용해야 하는지, 또 YOLO를 사용하기 위해선 어떠한 환경설정을 해야하는지, 그리고 YOLO의 예제사용 및 YOLO의 분석까지 포스팅 했습니다.


이제는 직접 데이터학습을 어떻게 시키는지에 대해 포스팅 해보도록 하겠습니다.


[1]번 포스팅을 보면 우리는 야생동물로 인한 피해를 줄이기 위해, 

Deep Learning(YOLO)기반의 Smart Scarecrow를 개발하기로 했다고 했습니다. 


그렇기 때문에 우리는 야생동물인 고라니333장 멧돼지222장 그리고 야생동물은 아니지만 강아지222장을 학습시켰습니다. 

이미지 학습에 앞서 이미지파일은 확장자가 모두 JPG이여야 합니다. 그렇기 때문에 데이터들을 수집하시고, 알씨 프로그램을 설치해서 이미지파일들을 모두 드래그후에 이미지 포맷변환을 통해서 한꺼번에 모두 JPG로 변환시킬 수 있으니 참고하시길 바랍니다.


YOLO_MARK github - YOLO_MARK의 github로 Mark의 사용법을 알 수 있습니다.


Darknet github - 데이터학습에 관한 정보를 참고할 수 있습니다.



1. YOLO_MARK


YOLO를 학습시키기 위해서는 YOLO_MARK가 필요합니다.

YOLO-MARK는 이미지파일들에 직접 본인이 Bounding Box를 그려줌으로써 Box의 좌표를 지정해줄 수 있습니다. YOLO_MARK를 설치해 보겠습니다.

git clone https://github.com/AlexeyAB/Yolo_mark

설치를 했다면 yolo-mark디렉토리가 생성되었을 겁니다. 그렇다면 yolo_mark 디렉토리로 이동 후 make하고 yolo_mark를 실행해 보겠습니다.

cmake . make ./linux_mark.sh


YOLO_MARK가 실행된 것을 확인할 수 있습니다. 위에보면

image num은 0번째 이미지인가 1번째 이미지인가를 알려줍니다.

object id는 Class분류 라고 생각하면 되는데 object id로 몇개의 분류를 하고 있는가도 확인해볼 수 있습니다.


2. YOLO_MARK Labeling


yolo_mark/x64/Release/data/img

경로안에 기존에 있던 이미지파일들을 삭제합니다.

그리고 그안에 본인들이 하고싶은 이미지파일을 넣어주시면 됩니다.

저 같은경우에는 위에서 말한대로 고라니333장 멧돼지222장 강아지222장의

JPG 이미지파일을 넣었습니다.


yolo_mark/x64/Release/data  -경로에서

vi obj.data

obj.data를 열게되면 위와같은 정보가 나옵니다. 여기서 맨위에 classes= 2로 되어 있는데 이는 몇개로 분류할 것인가를 설정해주는 곳 입니다. 현재 2개로 분류되어 있는걸 알 수 있습니다. 본인은 고라니, 멧돼지, 강아지 총 3개의 분류를 해야하기 때문에 3으로 변경했습니다.


yolo_mark/x64/Release/data  -경로에서

vi obj.names

obj.names는 말그대로 분류할 class에 이름을 붙여주는 겁니다. 하여 본인은 고라니, 멧돼지, 강아지 총3개의 분류를 할 것이기 때문에 위와같이 했습니다.

그럼다시 cd..해서 yolo_mark 디렉토리로 이동해 줍시다.


./linux_mark.sh

yolo_mark를 실행합니다. 

그리고 Bounding Box를 직접 그려넣어 Labeling을 합니다.

위와같이 직접 마우스로 Bounding Box를 직접 그려넣어주면,

jpg파일 옆에 txt파일이 생성된 것을 확인할 수 있습니다.

이 txt파일 안에는 우리가 그려넣어준 Box의 좌표값이 들어있습니다.


3. 데이터 학습하기


yolo_mark/x64/Release 경로로 이동해 줍니다.

vi yolo-obj.cfg

그럼 위와같이 cfg파일이 열리게 되는데, 맨아래로 내려가 줍니다.

맨아래 [region]에 보면 classes=3이라고 보입니다. 우리는 3가지의 분류를 했기 

때문에 3인 것을 확인할 수 있습니다.


그리고 그 위 [convolutional] 아래 filters=40이라고 있습니다. 40인 이유는 

filters 숫자= 5 * (classes+5) 입니다. 우리는 3가지 분류를 했기 때문에

5 * (3+5) = 40 이기 때문에 40이란 숫자를 넣어 주었습니다. 이 내용은

맨 위에 yolo_mark github 링크에서 확인할 수 있습니다.

다른 convolutional은 수정하지 않습니다.


  • convolutional layer 설치 - darknet디렉토리안에 받아 줍니다.

http://pjreddie.com/media/files/darknet19_448.conv.23



  • yolo-obj.cfg파일도 darknet 디렉토리로 이동해 줍니다.

  • yolo_mark/x64/Release/data 경로안에 있는 image 디렉토리와 obj.names , obj.data , train.txt를 darknet/data 경로로 이동해 줍니다.


자 그럼 이제 진짜 데이터학습을 해보도록 하겠습니다.

cd darknet

./darknet detector train data/obj.data yolo-obj.cfg darknet19_448.conv.23

자 그럼 위와같이 학습이 진행되는데 맨 아래보면 1이 보입니다. 

이제 학습을 1번했다는 것 입니다. 724.731750 avg는 loss 즉, 손실율의 평균인데

가장 낮아질때까지 학습을 계속 진행하면 됩니다.


우리팀은 총 45000번의 학습을 진행하였습니다. 학습시간은 대략 50시간정도 걸렸는데 이것은 우리의 PC Nvidia GTX1070 8G기준 시간입니다.


이렇게 학습을 진행하게되면 Backup디렉토리 안에 자동으로 학습된 가중치파일이 저장이 됩니다. Backup디렉토리를 확인을 해보면 아래와 같습니다.

위와같이 가중치파일은 weights파일이 생성된 것을 확인할 수 있습니다.

이제는 학습된 가중치파일로 YOLO를 실행시켜 보겠습니다.


  1. 이미지파일 실행
  2. ./darknet detector test data/obj.data yolo-obj.cfg backup/ yolo-obj_800.weights data/<image file>
  1. 동영상파일 실행
  2. ./darknet detector demo data/obj.data yolo-obj.cfg backup/ yolo-obj_800.weights data/<video file>
  1. Webcam 실행
  2. ./darknet detector demo data/obj.data yolo-obj.cfg backup/ yolo-obj_800.weights data


4. 실행결과



Webcam으로 실행 시킨 결과 wild boar, gorany가

잘 인식이 되는 것을 확인할 수 있습니다.

Webcam같은 경우에는 Logitech c920제품을 사용했습니다.


이것으로 YOLO데이터학습 포스팅을 마무리 하도록 하겠습니다.

posted by pgmr이상현


이번 포스팅에서는 YOLO의 구성 즉, YOLO 분석에 관한 포스팅을 하겠습니다.


1. YOLO


YOLO 페이지 - 앞 포스팅에서 링크를 걸었지만 다시 한번 링크 걸겠습니다. 


YOLO githubYOLO설치없이 YOLO source code를 확인할 수 있습니다.



Darknet 디렉토리 구조


2. cfg


cfg디렉토리를 열어보면 여러 cfg파일들을 확일할 수 있습니다.

Darknet Framework는 cfg파일의 변경 혹은 변형을 통해서, 본인만의 모델을 만들어 데이터 학습을 시킬 수 있습니다.

예를 들어 yolo-obj.cfg 파일 안의 내용인데 이 안에서 batch size라든가 classification을 몇 개를 할 것인가에 따른 class수를 변경시킬 수 있습니다.


3. data


data디렉토리는 Real Time Detection시에 Bounding Box를 그릴때 필요한 Label들의 폰트와 Label list, Test Image들이 있습니다. 

YOLO를 test할때는기본적으로 있는 data set으로 coco.data를 사용하는데, coco.data에는 어떻게 Labeling이 되어 있는지 coco.names를 열어봄으로써 확인해 보겠습니다.

화면상으로 다는 캡쳐가 안됐지만 세어보니 80개의 Label을 확인할 수 있었습니다. 이것으로 봐서 YOLO의 기본 data set은 80개의 classification이 가능하다는 것을 확인할 수 있습니다.


4. src


src디렉토리는 말그대로 source디렉토리입니다. YOLO사용에 꼭 필요한 C코드 또는 헤더파일들이 있습니다. 예를 들어보면 image.c파일은 YOLO로 Detection을 할때, Object에 그려지는 Bounding Box를 어디에 그릴지에 관한 Top, Bottom, Left, Right좌표에 대한 코드들이 있고 또 그 곳에 Bounding Box를 그려라라는 코드가 있습니다.

  

5. Makefile


마지막으로 Makefile인데 Makefile은 주로 GPU, CUDENN, OPENCV, OPENMP, DEBUG를 사용할 것인가에 관한 정보를 다루고 있습니다.

이번 포스팅은 Darknet YOLO에 관한 분석이였습니다. 다음 포스팅은 Darknet YOLO데이터학습에 관한 포스팅을 하겠습니다.

posted by pgmr이상현
prev 1 ··· 4 5 6 7 8 9 next