반응형

YOLO는 많은 사람들이 사용하고 있는 객체 인식 오픈소스입니다.

이미 선행학습 (Pre-trained)된 데이터도 있지만, 제가 원하는 클래스는 송전탑 (Transmission tower) 클래스입니다.

따라서 해당 클래스만 학습해보도록 하겠습니다.

환경: Ubuntu 18.04 LTS

데이터 셋을 구하기 위해 먼저 크롤링을 해줍니다.

구글 크롬 드라이버를 이용할 것입니다.

크롬 드라이버를 본인의 크롬 버전에 맞게 다운로드 받습니다.

Link: https://chromedriver.chromium.org/downloads

크롬 버전 확인 방법은 그림 1과 같습니다.

그림 1

 

그림 1-1

크롤러 프로그램은 google-images-download를 사용했습니다.

Link: https://github.com/ultralytics/google-images-download

Readme에 적힌대로 진행하면 크롤링을 진행할 수 있습니다.

다음은 레이블링을 해야합니다.

이미지 내에 객체의 좌표를 로깅하는 것입니다.

본 포스팅에선 YOLO mark를 사용했습니다.

Link: https://github.com/AlexeyAB/Yolo_mark


  1. git clone https://github.com/AlexeyAB/Yolo_mark
  2. cd Yolo_mark
  3. cmake .
  4. make
  5. chmod u+x ./linux_mark.sh
  6. ./linux_mark.sh

위 커맨드들을 입력해주시면 그림 2와 같은 창이 팝업됩니다.

그림 2


저는 이미 송전탑 이미지들을 넣어놔서 다음과 같은 이미지가 나오지만, 처음에는 비행기 그림이 나옵니다.

크롤링한 이미지들을 다음 경로에 넣어주면 그림 2와 같아집니다.

Path: Yolo_mark/x64/Release/data/img

레이블링 하는 법은 마우스 드래그로 합니다.

다른 상세한 단축키들은 h키를 눌러 확인할 수 있습니다.

클래스 명을 바꿔주는 방법은 다음 경로에 있는 파일을 수정하면 됩니다.

Path: Yolo_mark/x64/Release/data/obj.names

클래스 개수를 수정해주는 파일은 다음 경로의 파일입니다. 파일 내용 중 classes를 바꿔주면 됩니다.

Path: Yolo_mark/x64/Release/data/obj.data

그림 3은 드래그 후의 결과입니다. 드래그 한 후 다음 이미지로 넘어가면 train.txt로 저장되는데 이를 yolo 학습때 사용하면 됩니다.

그림 3

YOLO프로그램이 있는 darknet 폴더로 들어갑니다.

 

현재 저희는레이블링을 하며 names, data, image 데이터 셋 3가지의 custom data를 만들었습니다. 이를 학습에 이용하기 위해 수정해봅니다.

 

기본적으로 data 파일은 cfg폴더에 있고, names파일과 image data는 data폴더에 있습니다.

 

각자 맞는 장소에 옮겨줍니다.

 

이때 train.txt파일 내부에는 이전 Yolo mark에서 레이블링 진행했던 경로로 되어있는데, 경로를 다음 커맨드로 일괄 치환해줍니다.

 

  1. vi train.txt
  2. :%s/x64\/Release\///i
  3. wq

선행학습된 weight 파일을 받아줍니다.

 

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

 



여기서 문제점이 있습니다. 기본적으로 -gpus 옵션은 다중 gpu도 가능한데, gpus를 enable하려면 makefile을 수정해야합니다.

makefile 1번째 줄의 GPU=0를 GPU=1로 바꿔줍니다.

본 블로깅에선 CUDA 10.1버전을 사용했는데 바꿔준 후 make를 하면 에러가 납니다. 제 생각엔 CUDA 10버전부터는 불가능한 것으로 보입니다. 따라서 CUDA 9버전이 설치되어 있는 서버에서 진행했습니다.

또한 weight를 저장하는 간격을 설정하기 위해 detector.c를 수정해 줍니다.

그림 4에서 빨간색으로 밑줄 친 부분이 몇 epoch에 weight를 저장할지 설정하는 것입니다. 기존 10000을 100으로 바꾸었습니다.

그림 4

이후 학습 커맨드를 입력해줍니다.

 

./darknet detector train data/obj.data cfg/yolov3.cfg darknet53.conv.74 -gpus 0,1

학습 가중치 파일은 backup폴더에 저장됩니다.

그림 6과 같이 학습이 되는 것을 볼 수 있습니다.

그림 5

반응형

'인공지능' 카테고리의 다른 글

pytorch model summary  (0) 2021.03.16
GRU VS LSTM  (0) 2021.03.15
YOLO V5 사용하기  (0) 2021.03.15
YOLO V3 원하는 객체만 바운더리 박스 칠하기  (0) 2021.01.05
인공지능 관련 용어집  (0) 2021.01.05
반응형

인공지능 관련 연구를 하며 YOLO를 많이 접하게 됩니다.

이때 사용하는 기능은 객체 인식 후 바운더리 박스의 좌표 값, 정확도 임계값 또는 특정 클래스만 인식 등이 있습니다.

어떤 소스를 고쳐야 하는지 알아봅니다.

참고: L = 줄 번호

환경은 Ubuntu 18.04 LTS, C, C++ 버전입니다.

먼저 darknet.c L400 에 있는 main 함수를 보겠습니다.

실행시킬때 넘겨받는 옵션들을 처리하게 됩니다.

일반적인 테스트 프로세스는 yolo를 실행할 때 detect 옵션을 줍니다.

따라서 main 함수에서 detector.c L562 test_detector 함수로 들어갑니다.

test_detector

L 577~585: 파일 경로가 옵션으로 주어졌으면 해당 파일이 input image, 아니라면 입력할 수 있도록 함
L 597: 객체 인식
L 600: 객체 인식 결과 변수 할당
L 604: 박스 그리기
L 605: 메모리 해제
L 606~615: 이미지 저장

이 부분에서 dets라는 변수는 YOLO 네트워크의 결과물이라고 할 수 있습니다.

이러한 dets 변수를 파라미터로 갖고 draw_detections 함수로 들어갑니다.

draw_detections는 image.c L239 에 정의되어있습니다.

이 함수에서 앞서 언급한 작업을 진행할 수 있습니다.

dets[i].prob : 정확도
names[j] : 클래스
L 294 : label 입력 제거한다면 label이 결과물에 표시되지 않습니다.
draw_box_width(): 바운더리 박스 그리는 함수 마찬가지로 제거하면 박스가 그려지지 않습니다.
left, top, right, bot: 인식된 객체의 바운더리 박스 좌표

위 변수들을 적당히 조합한다면 그림 1과 같이 원하는 객체만 박스를 그릴 수 있습니다.

 

반응형

'인공지능' 카테고리의 다른 글

pytorch model summary  (0) 2021.03.16
GRU VS LSTM  (0) 2021.03.15
YOLO V5 사용하기  (0) 2021.03.15
YOLO v3 커스텀 데이터 셋 학습  (0) 2021.01.05
인공지능 관련 용어집  (0) 2021.01.05

+ Recent posts