티스토리 뷰

728x90

컴퓨터 세팅을 마쳤으니 이제 학습시키기 전 데이터셋에 labeling 해줘야합니다.

 

저희는 가정 내에서 영유아 안전사고가 발생할 확률이 큰 위험 행동을 

1. 엎드려서 자는 행동 ( 질식사고 )

2. 이물질을 입에 넣는 행동 ( 삼킴사고 )

3. 침대 위에 서있는 행동 ( 추락사고 )

4. 선풍기에 손을 넣는 행동 ( 손 끼임 사고 )

 

위와 같이 4가지로 분류하여 학습을 진행했습니다.

 

데이터는 학습 데이터와 테스트 데이터로 나눠 약 10000장의 이미지를 준비했습니다.

학습 데이터 : 구글 이미지에서 찾아온 이미지들과 유투브에서 가져온 동영상을 초당 5프레임으로 나눈 이미지들.

테스트 데이터 : 인형과 직접 만든 침대 프레임으로 직접 찍은 동영상 + 유투브 영상

 

이미지는 .jpg 확장자만 가능, 한글 이름은 불가능 합니다.

 

저희는 라즈베리파이에서 레이블링을 진행해줬는데 두사람이 동시에 labeling을 해서 빠르게 끝내기위해서 였습니다.

라즈베리파이에 vnc와 team viewer를 동시에 사용해서 레이블링을 하면 화면이 겹치지 않아서 레이블링 시간을 반으로 단축시킬 수 있었습니다.

우분투에서도 vnc와 팀뷰어로 해봤는데 같은 화면 공유가 되어 동시에 레이블링이 불가능하였습니다.

 


동영상 프레임으로 나누기

 

저는 https://developer-thislee.tistory.com/18?category=818795 이 티스토리를 따라,

터미널 상에서 ffmpeg 명령어를 이용해 프레임을 짤랐습니다.

 

 

1. 터미널을 열고 sudo apt install ffmpeg 입력을 해서 다운받아줍니다.

2. 편집하고 싶은 동영상이 있는 경로로 가줍니다. 여기에 이미지파일도 저장되기 때문에 애초에 이미지가 저장되길 원하는 곳에 동영상을 넣어둔 후 하시는 것이 좋습니다.

3. ffmpeg -i [ 동영상 제목.확장자 ] -vf fps=[ 1초당 x 프레임으로 잘라져서 저장됨 ] [ 이미지 이름 설정 ]%d.jpg 

즉, ffmpeg -i fan.mp4 -vf fps=5 fan0%d.jpg

 


labeling 하는 법

 

1. labeling을 하기 위해 터미널을 열고 Yolo_mark 를 다운받아줍니다.

git clone https://github.com/AlexeyAB/Yolo_mark
cd Yolo_mark   // Yolo_mark 폴더로 이동

 

 

2. 아래 명령어 차례로 입력.

cmake .
make
chmod u+x ./linux_mark.sh 
./linux_mark.sh

 

이 화면이 나옵니다.

여기서 보이는 이미지들은 필요가 없기 때문에

폴더를 검색하거나, 이 아이콘을 찾아 들어가줍니다.

3. Yolo_mark/x64/Release/data/img 경로로 들어가 들어있는 기존 이미지들을 모두 지워줍니다.

 

 

4. labeling 할 이미지들을 이 경로에 넣어줍니다.

 

 

5. 터미널 혹은 폴더에서 직접 Yolo_mark/x64/Release/data 경로로 들어가서 obj.data 파일을 수정해줍니다.

[터미널로 하는 경우]

cd Yolo_mark/x64/Release/data
vi obj.data

 

여기서 보이는 classes = 를 각자 분류하기로 했던 갯수의 숫자로 바꿔줍니다.

제 경우에는 4가 되겠죠 ?

수정 후 esc 누른 후 :wq 엔터.

 

[폴더에서 하는 경우]

수정 후 Ctrl+s (저장) 후 x눌러서 나와줍니다.

 

6. 같은 폴더에 있는 obj.names 를 열어줍니다.

분류된 클래스에 대해 이름을 각각 써줍니다.

예 )  fan_acc

       suc_acc

       fall_acc

       eat_acc

 

 

7. 저장하고 나간 후 터미널을 켜고 cd Yolo_mark , Yolo_mark 경로로 들어온 후 ./linux_mark.sh 명령어를 입력해줍니다.

labeling을 하다 끄고 다시 할 때는 ./linux_mark.sh만 입력해주면 됩니다.

아까 classes를 4로 분류했다면 0부터 3까지의 object id가 생기는데, 각자 학습시키고 싶은 부분을 마우스 드래그로 끌어 레이블링을 해주면 됩니다.

 

[단축키]

스페이스바 : 누르면 다음 이미지로 넘어감

c : 현재 보고있는 이미지의 레이블링을 삭제함

n : 스페이스바를 눌러서 이미지를 넘기지 않아도 하나의 레이블링이 생겼다면 자동으로 다음 이미지로 넘어가게 함. 한번 더 누르면 반대로 안넘어가게 함.

h : 단축키를 확인할 수 있음

 

8. 레이블링이 끝나거나 도중에 멈출 때 Ctrl+c 를 누르면 빠져나올 수 있습니다.

 

9. Yolo_mark/x64/Release/data/img 경로 보시면 이미지 1개당 txt 파일이 생겼는데, 이는 레이블링 박스 좌표 값이 들어있습니다.

 

10. Yolo_mark/x64/Release/data 경로에 train.txt 보시면 레이블링 시켰던 이미지의 파일명이 있습니다.

만약 레이블링 과정 중에 삭제한 이미지는 여기 들어가서 이미지 파일명이 기록되었나 보셔야합니다.

삭제한 이미지의 파일명이 기록이 되었는데 그대로 학습을 진행하게되면 파일 또는 이미지를 찾을 수 없다는 오류가 뜹니다. 그러니 미리미리 확인 !

 

11. 터미널에서 다시 darknet/cfg 폴더로 이동해준 후 yolov3.cfg 파일을 엽니다.

:set number + 엔터 (:set number : 라인넘버를 보여줌)

599 입력 후 Shift+g (Shift+g : 원하는 라인넘버로 이동시켜줌)

603, 610 번째 줄, 689,696 번째 줄, 776, 783 번째 줄flitersclasses 값을 수정해주어야합니다.

- YOLOv2 버전 시, filters = (classes + 5)*5로 계산

- YOLOv3 버전 시, filters = (classes + 5)*3으로 계산하면 됩니다.

최근데 yolov4도 나왔던데 yolov4를 사용하시는 분은 filters 값을 구글링 하셔서 넣으시면 됩니다.

저는 yolov3 버전이고, classes=4 이므로, filters는 27이 됩니다.

수정이 끝났으면 저장하고 나가줍니다.

 

 

12. Yolo_mark/x64/Release/data 경로에 있는 img 폴더, obj.data, obj.names, train.txt 파일들을 darknet/data 경로로 복사해줍니다.

저는 portainer를 이용해 학교 gpu를 사용했기때문에 file zilla를 통해 옮겨주었습니다.

 

 

13. darknet/data 경로로 복사했던 train.txt 보시면 /x64/Release 의 쓸때없는 경로가 붙어있는 것을 볼 수 있습니다.

vi train.txt 를 입력해 train.txt로 들어가준 후,

경로를 한 번에 수정하기 위한 문자열 치환 코드를 사용해줍니다.

첨에 뭣도 모르고 했을 때, 일일이 몇 천줄을 삭제한 기억이 납니다 ^^ ;

:%s/64\/Release\///i 를 입력해줍니다.

저희는 위에서 말씀드렸다시피 동시에 해서 그런가 간혹 줄바꿈이 안된 이상한 줄이 있어서 학습시킬 때 오류가 생겨 다시 수정하고 학습시키는 번거로움이 종종 있었습니다.

그래서 문자열 치환이 잘 되었는지

:/x64 (:/원하는문자 : 검색기능) 을 입력해 x64/Release 삭제가 잘 되었는지 봅니다.

경로가 잘 바뀌었으면 :wq 를 통해 저장 후 나와줍니다.

반응형