본문 바로가기
졸업 작품 (Capstone)/Theft Chaser (YOLO)

[10] Yolo_mark labeling(라벨링) & 경로 설정

by Late Bloomer Lee 2019. 6. 22.
728x90

먼저, 지금까지 제 글을 보며 따라와 주신 분들 일단 감사합니다.

 


 

현재 많은 것을 해왔는데, 드디어 YOLO를 제대로 활용할 때가 왔습니다.

 

다시 한번 말씀드리자면, 저희의 작품 이름은 Theft Chaser입니다.

학습 전에 앞서 저희 팀은 의심받는 행동 혹은 도둑질하는 상황을 어떻게 나눌까 하고 고민했습니다.

그래서 최종적으로 나온 결론은,,,

 

1. 에코백이나 가방에 훔치는 행위 ( 클래스 이름을 theft_ecoback 으로 명명 )
2. 점퍼나 코트 안쪽에 숨기는 행위 ( 클래스 이름을 theft_inner_pocket 으로 명명 )

3. 소매 안쪽에 숨기는 행위 ( 클래스 이름을 theft_sleeve 로 명명 )

 

위에 보이시는 바와 같이 총 세 가지로 분류했습니다.

 

일단 라벨링을 할 데이터(이미지)를 구할 곳을 저희가 계속 찾아보았습니다.

구글링은 기본이고 여러 검색 방법을 동원해서 찾아봤지만,

그마저도 화질이 좋지 않은 해외 도난 동영상이 대부분이었습니다.

( 도난을 잡아내는 전문 유튜브 채널도 있긴 하다. 하지만 조작성도 어느 정도 보이므로... )

국내 대형매장이나 편의점에서 일어난 도난 동영상은 제대로 된 것이 물론 당연히 없었습니다.

데이터를 정말 구하기가 힘들었습니다.

 

물론! 해외 도난 동영상을 이용해 의심 행동을 하는 구간부터 끝날 때까지 이미지를 프레임 단위로 잘라서 학습시켜도 됩니다만, 이러면 테스트를 할 데이터가 애매해지리라 생각했기 때문에 시도하지 않았습니다.

 

그래서 내린 결론! 저희는 해외 도난 동영상을 테스트 용으로만 사용하고 저희가 직접 '도난 시연 동영상'을 편의점에서 허락을 맡은 뒤, 촬영을 했으며 동영상을 적절히 편집한 후, ( 좌우 반전이라던지 - 이러면 데이터 불리기가 수월하다 )

프레임 단위로 잘라서 중요 행위만 이미지로 만들어서 학습시켰습니다.

( 참고로 이미지는 확장자명이 .jpg 만 가능
( JPG, JPEG, jpeg 다 안된다. 이미지 파일을 한글 이름으로 저장해도 안된다. 유니코드 에러가 난다. )

 


 

참고로 프레임별로 동영상에서 이미지 뽑아오는 방법은 터미널 상에서 명령어를 이용해서 잘랐습니다.

혹시 저와 같은 방법으로 진행하실 분들을 위해 사용법을 바로 아래에 써놓겠습니다.

 

※ ffmpeg 사용법 ㄱ

 

1. 터미널을 키고 sudo apt install ffmpeg 입력

2. 편집하고 싶은 동영상이 있는 경로로 가준다.

3. 다음 명령어를 입력해준다. ( 마지막 줄이 최종 명령어입니다. 설명 잘 읽으세요! 띄어쓰기도 유의! ) 

 

ffmpeg -i [ 동영상 제목.확장자 ] -vf fps=[ 1초당 x 프레임으로 잘라져서 저장됨 ] [ 저장되는 번호의 순서 or 이름 설정 ]%d.jpg

ffmpeg -i [ Inner_pocket1.mp4 ] -vf fps=[ 31 ] [ 0 ]%d.jpg

ffmpeg -i Inner_pocket1.mp4 -vf fps=31 0%d.jpg ( 최종 코드 예시 )
( 초당 31장씩 캡쳐했다. 1초당 30~31장 정도가 겹치는 사진이 없이,  프레임별로 잘 끊겨서 나온다 )
( 번호는 0부터 저장됨 - 001, 002 이런 순서 )

 


서론이 길었습니다! 그럼 바로 라벨링을 하는 방법에 대해 쓰겠습니다!

 

(1) 이미지 라벨링을 위해 Yolo_mark를 git clone 해줍니다.

   ( 이제부터 Linux/Unix 명령어를 안다는 전제 하에 작성 )

 

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) 그러면 아래 사진처럼 나옵니다. 여기서 라벨링을 해주는 겁니다. 내부 기능을 간단히 설명하자면,,,

 

 

- 키보드 자판 h 를 눌러서, 단축키를 확인할 수 있습니다.

- 스페이스 바( Space Bar )를 누르면 다음 이미지로 이동이 가능합니다.

- c 는 현재 보고 있는 이미지의 라벨링을 초기화시켜줍니다.
- 0~9까지 눌러서 원하는 object(클래스)로 적용할 수 있다.

 

 

(4) 저희는 기존에 있던 이미지들은 필요가 없습니다. 아까 봤던 비행기와, 독수리 등의 사진들은 이 경로에 있습니다.

    모두 지워주세요. → Yolo_mark/x64/Release/data/img ( img 폴더 내부의 모든 파일을 지운다. )

 

 

(5) 저희 팀이 사용한 이미지는 총 7396장입니다. 사용할 이미지를 Yolo_mark/x64/Release/data/img 에 넣어주세요.

 

 

(6) 그다음 Yolo_mark/x64/Release/data 이 경로로 들어가 줘서, vi obj.data 명령어를 입력해 파일을 열어줍니다.

 

우리가 생각한 클래스는 3개다

- 아까 처음에 이야기했듯이, 저희가 만든 클래스는 3개였습니다.

- theft_ecoback
- theft_inner_pocket

- theft_sleeve 

- 그러므로 classes = 3 으로 바꿔준 겁니다.

- 저희 팀은 valid data를 사용하지 않아서 주석 처리를 했습니다.

- 수정이 끝났으면 저장하고 닫아준다. ( :wq  or  Shift+z+z )

 

 

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

 

 

- (6) 번에서 설명한 클래스들을 순서대로 적어준다.

  ( 일부러 알파벳 순으로 했습니다. ffmpeg를 사용할 때도 알파벳 순으로 했습니다. 라벨링을 최대한 빨리 해야 시간 절 약이 가능하기 때문에! )

- 저장하고 나간다.

 

 

(8) 다시 Yolo_mark 폴더로 이동해준다. 그리고 ./linux_mark.sh 명령어를 실행합니다.

 

 

- 빨간 박스object id 가 바로 클래스(classes)다. 

- 이 부분은 딱히 설명할 필요 없이 실행하는 순간 알 것이다.

- 라벨링이 끝나면 터미널에서 Ctrl + c 를 눌러 종료시킨다.

 

 

(9) 작업이 다 끝나고 다시 이 폴더로 이동! Yolo_mark/x64/Release/data/img 

 

 

(10) img 폴더에 들어가면 라벨링 한 이미지들에 대해 각각 .txt 파일로 저장되어있는데 내용에는 라벨링 박스 좌표값이 있습니다.

 

 

- 텍스트 파일의 제일 앞에 보이는 1이 바로 class 순서다. 그러니까 obj.names 에 넣은 순서, 0, 1, 2 로 저장된다.

- 그러니까 theft_inner_pockettheft_ecoback 다음 순서로 저장되어 있으니까 1로 저장된 것이다.

 

 

(11) darknet 폴더로 다시 돌아와서 cfg 폴더로 이동해준다. 그다음 yolov3.cfg 파일을 연다!

 

 

 

(12) 이 부분은 매우 중요하다. 사람들이 흔히들 하는 실수다! ( 본인도 처음에 그랬... )

 

 

- :set number 를 입력해준다.

- 599 입력 후 Shift + g 를 입력. 

- 그러면 위의 사진처럼 나온다. 여기서 빨간 박스의 filtersclasses 값을 수정해야 한다. 

- YOLOv2 버전에서는 filters=(classes + 5)*5 으로 계산,
- YOLOv3 버전에서는 filters=(classes + 5)x3 으로 계산하면 된다.

- 본인은 yolov3 버전이고 classes=3 이니 filters=24 가 된다.

- 610 번째 줄의 classes 도 3으로 변경해준다. ( classes = 3 )

 

- 위의 과정을 2번 반복해야 한다.

- 689, 696 번째 줄, 776, 783 번째 줄을  똑같이 수정해준다.

- 수정이 끝났으면 저장하고 나간다.

 

 

(13) Yolo_mark/x64/Release/data 경로에 있는 img 폴더 및 obj.data, obj.names, train.txt 파일들을

      darknet/data 경로로 복사해준다. ( 원본 파일 및 폴더는 오류를 대비해 항상 남기자 )

 

 


ㄴ여기서 잠깐 팁! ㄱ

 

YOLO 개발자 사이트를 가보면,

yolov2 에서는 train.txt, yolo-obg.cfg, obj.data obj.names

yolov3 에서는 train.txt, yolov3.cfg, coco.data, coco.names
를 수정했다.

 

그렇지만 저렇게 해줄 필요 없이 사용하는 YOLO 버전에 맞게,

yolov3.cfg( YOLOv3 전용 ), yolo-obj.cfg ( YOLOv2 전용 ), 이 둘 중 하나만 수정하고,

저처럼 obj.data, obj.names 를 그대로 사용해도 무관!


 

 

(14) darknet/data 로 옮긴 파일 중 train.txt 파일이 있을 텐데, 원래 있던 경로와 바뀌었으므로 수정해야 합니다.

 

 

- 파일을 열어준다. ( vi train.txt )

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

: 를 누르고 %s/x64\/Release\///i 를 입력한다.

 

 

(15) 그러면 아래 사진처럼 경로가 순식간에 변환됩니다. 저장하고 나가주세요.

 

 

 

 

다음 포스팅에는 YOLOv3 데이터(이미지) 학습에 대해서 다루겠습니다!

 

 

 

참고 블로그 : https://juni-94.tistory.com/10?category=802791 , https://pgmrlsh.tistory.com/6?category=766787

728x90

댓글