2018년 12월 4일 화요일

[YOLO V3] 개인 데이터기반 학습(가중치 파일 만들기)[COMMAND INCLUDED]

<내 데이터로 학습시키기 = 내 데이터로 학습시켜서 가중치 파일 만들어보자>

<jpg형식의 img파일을 txt파일로 자동변환!>

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

$ cmake .
$ make


1) 학습시킬 이미지들을 /home/[USER_NAME]/Yolo_mark/x64/Release/data/img폴더 안에 넣어줍니다.

2) /home/[USER_NAME]/Yolo_mark/x64/Release/data폴더 아래에 있는 obj.names, obj.data, train.txt 파일들을 내 학습데이터들에 맞게 수정해줍니다.
EX. 저같은 경우는 엘리베이터 버튼들을 인식하기 위해서 one~nine + up/down버튼을 object_id로 잡았습니다. 이런경우의 파일 구성은 다음과 같습니다.

classes는 내가 찾으려는 객체의 갯수를 의미합니다.
저는 지금 one-nine까지, up/down를 찾으려고 하는 경우입니다.
수정해야 할 부분은 저 부분입니다. 나머지 부분은 임의로 수정한거니 classes만 바꿔주세요.

 이부분은 정말 중요합니다. 나중에 img.txt 파일이 만들어지면
다음과 같이 만들어집니다.
이 의미는object_id=1 시작점인 (0.53, 0.48)을 의미합니다.
(뒤의 두 숫자는 잘 모르겠네요.)
어쨋든, 제가 말씀 드리고 싶은 부분은 
여기서 1이 의미하는 부분은 obj.names파일에서의 object_id의 위치입니다.
위에서부터 0-one, 1-two, 2-three, 3-four, 4-five ...입니다.
나중에 사진을 각자 작업하고 합쳐야 할 때, 이 순서를 지켜야 합니다.
새로운 obj.names 순서를 만든다면, 다른 이름으로 학습하게 됩니다.

 이미지파일의 위치를 저장하는 파일입니다. 
자동으로 생성되는 파일이니, 따로 작성하시지 않으셔도 됩니다.
(참고로, Yolo_mark에서 작업을 하고 darknet으로 작업장을 옮겨야 되는데, 이 부분에선
앞에 있는 "x64/Release/ "폴더 부분을 지워 아래와 같이 구성해야한다.
이 부분에 대해선 2가지 방법이 있습니다.
1) /home/[USER_NAME]/work/darknet/아래에
x64/Release를 구성한다(darknet아래에 x64폴더, Release폴더 생성)
/home/[USER_NAME]/work/darknet/x64/Release/data/img폴더 안에
img파일 들을 넣어줍니다.
-> 직접 실행하는 건 빨라도, 확실히 프로그래머가 할 일은 아닌거 같네요. 하하
2)  파일의 내부의 x64/Release부분을 일일이 삭제시켜줍니다.
-> 프로그램적으로 삭제할 수 있도록 차후 제거 프로그램을 작성해보도록 합시다.


...

$ ./linux_mark.sh


(tip. image_num은 Space 바를 누르면 마우스 없이 다음 그림으로 넘어갑니다.(화살표 키로 그림선택 이동가능) + 그리고 Object id는 숫자판으로 이동가능합니다.(단, 0-9번 까지의 object만 가능))


---------------------------------------------------------------------------------------------------------
자,이제 다 구성했으면! darknet폴더로 이동해봅시다.

우리가 준비해야 될 것은? 실행명령어를 보면 힌트를 얻을 수 있습니다.
./darknet detector train data/obj.data yolo-obj.cfg darknet19_448.conv.23

1. obj.data파일
(Yolo_mark과정으로 통해서 만듦OK
2.yolo-obj.cfg파일 -> yolov3.cfg
(참조 사이트의 예제는 yolo v1을 사용하고 있으니 그 모델을 참조하고 싶으면 참조사이트를 참조합시다.)
(어떤 yolo모델을 쓸거냐에 따라 다릅니다. 여기서 나는 yolov3모델을씁니다.
darknet/cfg파일을 들어가면 yolov3.cfg 파일을 발견할 수 있습니다.)

3.darknet19_448.conv.23파일
(이 파일은 다운로드 받읍시다! : http://pjreddie.com/media/files/darknet19_448.conv.23 )

자, 중요한 yolov3.cfg 파일을 열어봅시다.
여기서 수정해야 할 부분? 3가지
0)batch - 1)classes갯수 (=object_id갯수)- 2) filters갯수

0)batch
   6line에 있는 batch를 수정합니다.
batch_size란 한 번에 몇개를 가지고 가서 처리를 할거냐는 질문이기 때문에 
개인의 GPU사정에 따라 다릅니다. 
저 같은 경우는 16까지가 MAX로 그 이상을 실행하게 되면 오류가 발생합니다.
만약, 내 컴퓨터가 정----------말 사양이 안 좋다? 
그렇다면 Testing버전처럼 1로 처리하는게 답입니다. 
저걸 바꿨는데도 안된다? 답도 없습니다ㅠㅠ

1)classes갯수 + 2) filters갯수


다음으론, classes랑 filters를 수정해줍니다.
classes는 찾으려는 물체의 갯수(object_id)만큼 적어줍니다. 
(위의 예제는 기본 예제를 기반으로 작성된 것이여서 80개의 물체를 찾고하 하는 프로그램입니다.)

yolo v1/v2는
/home/[USER_NAME]/Yolo_mark/x64/Release/yolo-obj.cfg 파일을
/home/[USER_NAME]/darknet/yolo-obj.cfg로 이동시켜줍니다.
파일의 가장 아래로 내려가면, [region]의 classes를 수정해줍니다.


 yolo v1/v2는 파일 가장 아래[region]의 classes를 수정

그리고 그 바로 위[convolutional]의 filters를 수정해줍니다.
num = number of anchors
classes = number of classes
filters=(classes + coords + 1)*num으로, 
만약 coords를 수정없이 default값을 쓴다면 
filters=(classes + 5)*5 입니다.
 
*** 여기에서 filters의 갯수는 모델에 따라 조금 차이가 존재합니다. ***
 
yolo v3의 filters는 매 [convolutional] 마다 있기 때문에 yolo를 기준으로 찾는 것이 편합니다. 
(yolo는 총 3개입니다.)
 yolo를 기준으로 바로 위에 있는 [convolutional]의 filters를 변경해주면 됩니다.
filters=(classes+5)*3 입니다.
즉, classes=1일 때, filters=18, classes=2일 때,filters=21입니다.
따라서 기본으로 255=(80+5)*3 이 설정되어 있습니다.

* 만약, 이 규칙을 지키지 않고 제멋대로 설정하거나 
잘못된 숫자를 적으면 다음과 같은 오류를 만나보실 수 있습니다^^하하

다, 이제 다 준비가 된 것 같습니다.
아, 참! 실행하시기 전에 
1) darknet 디렉터리에 yolov3.cfg파일, darknet19_448.conv.23파일이 있는지
2) darknet/data/img폴더 아래에 이미지들이 들어있는지,
3) darknet/data/아래에 obj.data, obj.names, train.txt가 있는지
확인해주시구요. 준비다 되었으면.. 갑시다!
./darknet detector train data/obj.data yolov3.cfg darknet19_448.conv.23

 


사진에서 4번째 줄쯤 보시면,
학습이 진행되면 매번 실행될 때마다 숫자가 갱신되게 되고, 
현재 125977번 학습했다는 의미가 됩니다.
avg는 loss, 즉 손실율의 평균을 의미합니다. 손실률은 낮을수록 좋습니다.
CPU로 실행시 학습도 테스팅도 굉장히 느립니다. 
GPU는 사양따라 다르지만, GTX1060(6GB)기준 1초에 1회 이상 진행이 됩니다.


 backup폴더에 가면 매 횟수마다 저장되는 것이 아니라 100회 단위로 저장됩니다. 
여기에서 100회마다, 900회까지 저장되고 그 이후론 10000회부터 저장됩니다. 
(당황하지마세요ㅋㅋ 저도 이 부분에서 뭔가 잘못된줄 알았거든요!)
만약, 이 부분을 수정하고 싶으면 참조사이트 2번을 참고하시면 됩니다.
그리고 참고로 중간에 중단했다가 재 학습이 가능합니다. 
만약에 내가 9000회까지 실행시켰는데 10000회를 못 찍고 프로그램이 종료되었다 / 종료시켰다. 경우엔 기본 backup파일에 정보가 저장됩니다. yolov3.backup파일로요! 그러니 연결해서 학습시킬 수 있답니다! 그런경우엔,다음 명령어로 실행시키시면 됩니다.
$ ./darknet detector train data/obj.data yolov3.cfg backup/yolov3.backup
(아, 물론 weights로 불러들여서 테스트하고 싶다면, 그건 안되지만요!)


참조 : http://pgmrlsh.tistory.com/6?category=766787
https://medium.com/@ribomo42/how-to-train-yolo-v2-with-your-own-data-object-and-labels-on-darknet-2b90dbfecb02

댓글 1개:

  1. yolo_mark에 있던 x64 하위 폴더내 데이터들은 darknet에서 폴더를 만들고 obj,data이런 데이터들도 모두 옮겨주면 되나요??

    답글삭제