본문 바로가기
프로그래밍/OpenCV

[OpenCV] YOLO, YOLO_MARK Object Detect :: 우주를놀라게하자

by 우주를놀라게하자 2019. 7. 14.
반응형
SMALL

저번 글에선 YOLO를 설치하는 방법에 대해서 적었었는데, 이번에는 YOLO를 사용하여 나만의 YOLO Object를 찾는 방법에 대해서 정리하고자 한다.

 

object를 훈련시키기 위해선 일단 image에서 특정 object가 어떤 것인지 알려주어야 하지 않는가? 때문에 YOLO_Mark라는 툴을 사용하여 image내에서 특정 object를 알려주게 할 것이다.

 

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

깃에서 받아주게 되면 해당 폴더에 Yolo_mark란 폴더가 생성이 된 것을 확인할 수 있다.

 

git에서 받은 폴더(Yolo_mark)에 들어간 후 코드로 된 파일을 컴파일해주는 작업을 해준다.

 

Bash창

$cmake .

$make

$./linux_mark.sh

 

make를 해주고 실행을 해주면 초기 Yolo-mark 화면이 다음 화면처럼 나타나게 된다.

 

yolo_mark.sh

그림을 잘 보시면 왼쪽 위에 Object id : 0 
이 부분이 바로 Yolo를 통해 화면상에서 인식될 Object의 숫자입니다.

그럼 기존에 yolo_mark/x64/Release/data/img에 있는 
이미지들을 모두 삭제하고 우리가 수집한 이미지들을 넣어 놓습니다.

 

yolo_mark/x64/Release/data 에서 obj.data의 파일을 열어보면 아래와 같은 내용을 보여준다.

 여기서 기존의 classes=2로 되어있는 부분 즉, 인식할 object의 갯수라고 생각하시면 됩니다. 필자는 인식할 object 갯수를 1개로 할 예정이기 때문에 1개로 수정을 했다.

 

그 후 우리가 찾을 object의 이름을 수정하기 위해서, yolo_mark/x64/Release/data에 obj.names를 수정해주자.

필자는 5000원권 지폐를 찾을 예정이기 때문에 obj.names의 이름을 5000won이라고 수정했다.

 

그리고 다시 Yolo_mark의 폴더에서 linux_mark.sh을 실행시켜준다.

==>./linux_mark.sh을 bash창에서 입력하면 열 수 있다. 파일을 열게 되면 아래와 같이 우리가 yolo_mark/x64/Release/data/img에 넣어준 image를 확인할 수 있다.

linux_mark.sh

위의 상단 부분을 잘라서 캡처했지만 중요한 건 위의 사진의 좌측 상단 Object id: 0은 우리가 찾을 object의 이름이다. 

이제 image에서 우리가 찾을 object를 드래그해서 지정을 해준다.

마킹을 취소하려면 c를 누르면 된다.

저장하고 다음 그림으로 넘어가려면 space bar를 누르면 된다.

 

 

Marking을 하면 Yolo_mark/x64/Release/data/img에 마킹한 좌표 값이 들어 있는 txt 파일이 생성이 됩니다.

그리고 Yolo_mark/x64/Release/data의 train.txt에 마킹한 이미지의 경로가 다음과 입력됩니다.

 

 train.txt

yolo_mark/x64/Release/data/img에 마킹한 좌표 값이 들어 있는 txt 파일을 darknet/data/img로 다 옮겨주자.

 

[이미지 훈련]

 

Yolo_mark로 마킹한 이미지를 학습시켜 weight 파일을 만들어 테스트해보자

 

새롭게 cfg파일을 작성해도 되지만 나는 yolov3.cfg 파일을 복사, 수정하여 사용했다.

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

  • yolo_mark/x64/Release/data 경로 안에 있는 image 디렉토리와 obj.names , obj.data , train.txt를 darknet/data 경로로 이동해 줍니다.(obj.data에 들어가면 classes 항목이 있는데 이 부분은 우리가 지정할 클래스의 갯수 즉, 분류할 갯수를 말하는 것이기 때문에 본인이 분류하는 갯수를 적어두면 된다.)

  • train.txt 파일을 수정해주자.위의 사진에서 알 수 있듯 기존에 있는 train.txt에는 yolo_mark폴더의 경로가 있다 그렇기 때문에 우리는 darknet의 경로에 맞게 수정해 주어야한다.(좀 잘렸는데..   data/img/money1.jpeg 로 우리가 darknet img폴더에 넣어준 경로이다.   )

마지막으로 우리가 훈련시킬 weight를 darknet에서 받아준다.

(해당 파일의 출처는 https://pjreddie.com/darknet/yolo)

Bash
$wget https://pjreddie.com/media/files/darknet53.conv.74

 

마지막으로 darknet폴더로 복사해서 옮긴 yolo-obj.cfg 파일을 수정해준다. 

 

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

맨아래 [region]에 보면 classes=3이라고 보일것이다. 기존에 주어진 파일은 3가지의 분류를 했기 

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

 

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

filters 숫자= 5 * (classes+5) 입니다.

 우리는 1가지 분류를 했기 때문에 5 * (1+5) = 30 이기 때문에 30이란 숫자를 넣어 주었습니다.

이 내용은 yolo_mark github 링크에서 확인할 수 있다.(https://github.com/pjreddie/darknet/issues/559)

다른 convolutional은 수정은 하지 않는다.

 

나는 이미 기존의 것을 수정해서 바꾼것을 스크린샷으로 찍어서 올린것이다.

 

이제 진짜로 훈련을 해보자!!

 

darknet 폴더 내부에서 입력을 해줘야한다.

$./darknet detector train data/obj.data yolo-obj.cfg darknet53.conv.74

 

detector train은 yolo가 제공하는 argument기 때문에 꼭 맞춰주어야하고, 추가적으로 obj.data, yolo-obj.cfg, darknet53.conv.74는 darknet폴더 내부에 우리가 파일을 둔 경로이기 때문에 경로에 맞춰서 넣어주어야한다. 위의 경로로 따지면 obj.data는 darknet폴더의 data내부에 있고, 나머지 2개의 파일은 darknet폴더 최상위에 위치하고 있음을 알 수 있다.

위의 명령어를 입력하게 되면 이제 훈련을 시작하게 된다.

yolo train

현재 필자는 23654번 훈련을 시켰다.... 2일 정도 걸렸던거 같다.... 

Loaded: 어쩌고 위의 제일 앞에 나오는 숫자가 훈련한 횟수이다. 그리고 처음엔 100단위로 훈련이 되어 weight가 저장되고, 저장된 weight는 darknet/backup폴더에 위치하고 있다. (아래와 같다)

 

* 훈련 도중에 중지를 해야하는 사항들이 생기곤 하는데 그럴때는 

./darknet detector train data/obj.data yolo-obj.cfg backup/<파일명>   ==> 경로는 본인들의 경로를 맞춰주자.

위와 같이 backup된 weight부터 훈련을 시키면 다시 기존에 훈련시키던 횟수부터 시작할 수 있다.

추가적으로 backup weight는 100회마다 자동적으로 저장되기 때문에 1099번을 훈련시키다가 다시 끊고 backup을 다시 훈련시키면 1000부터 하게되는 꼴이 된다...주의하자

 

yolo weight

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

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

 

이미지파일 실행

./darknet detector test data/obj.data yolo-obj.cfg backup/ yolo-obj_800.weights data/<image file>

Webcam 실행(webcam은 opencv가 설치되어 있지 않다면 실행이 안될것이다.)

./darknet detector demo data/obj.data yolo-obj.cfg backup/ yolo-obj_800.weights data

동영상파일 실행(동영상은 opencv가 설치되어 있지 않다면 실행이 안될것이다.)

./darknet detector demo data/obj.data yolo-obj.cfg backup/ yolo-obj_800.weights data/<video file>

 

 

 

* 기존의 다른 obj로 했을때는 약 10000을 훈련시켰을때 만족스러운 결과를 얻었다 data파일은 총 300개 가량의 data를 사용했었다. 지금 새로운 obj를 훈련시키고 있기 때문에 결과는 못올리는데 차후에 여기에 추가하겠다.

 

*참고로 cuda를 사용해서 훈련을 시키지 않으면...상당히 오래걸리므로..cuda를 사용해서 진행하길 권장한다.. 

문의사항이 있다면 언제나 질문해주면 칼답하겠다...이상!!

 

반응형
LIST