[라즈베리파이 4] yolov3-tiny 모델 학습하기

배뭉·2021년 6월 20일
4

Project

목록 보기
4/4
post-thumbnail

1. Compile 완료된 Darknet을 구글 드라이브에 업로드한다.

나는 git clone으로 darknet 프레임워크를 받아와서 컴파일을 해주면 colab의 내장 cuda, cudnn와 버전 충돌이 발생해서 미리 컴파일된 darknet과 호환되는 cudnn을 직접 가져왔다.

2. 앞서 생성한 5개의 파일과 학습시킬 이미지들을 custom 폴더에 업로드한다.

3. darknet폴더를 작업 디렉터리로 두고 .ipynb 노트북을 생성한다.

  • 그 다음 런타임 유형 변경을 선택하여 하드웨어 가속기를 GPU로 설정한다.

4. 구글 드라이브와 노트북 파일을 연결한다.

from google.colab import drive
drive.mount('/content/drive')

5. cuDNN 폴더안에 있는 cudnn-10.1 압축파일의 압축을 풀고 권한을 변경한다.

!tar -xzvf /content/drive/My\ Drive/darknet/cuDNN/cudnn-10.1-linux-x64-v7.6.5.32.tgz -C /usr/local/
!chmod a+r /usr/local/cuda/include/cudnn.h
!cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

이렇게 cat결과가 나온다면 된다.

6. darknet을 로드한다.

import os
if not os.path.exists('darknet'):
    os.makedirs('darknet')
%cd darknet
%ls

/content/darknet 라고 뜨면 된다.

!ls -la '/content/drive/My Drive/darknet/bin/darknet'
!cp /content/drive/My\ Drive/darknet/bin/darknet ./darknet
!chmod +x ./darknet

그리고 다크넷의 권한을 변경한다.
여기까지 완료되면 구글 colab에서 yolo 학습을 위한 전반적인 다크넷 프레임워크 준비가 완료되었다.

7. colab환경에 custom 폴더를 복사하기

!cp -r "/content/drive/My Drive/darknet/custom" .

여기서 시간이 제법 소요된다.

8. custom yolo3모델을 만들 .conv.xx 파일 가져오기

1) yolov3일 때 : darknet53.conv.74 파일 다운받기.

2) yolov3-tiny일 때 : yolov3-tiny.weights에서 yolov3-tiny.conv.15 추출하기.

!./darknet partial custom/yolov3-tiny.cfg custom/yolov3-tiny.weights yolov3-tiny.conv.15 15

yolo.weights파일은 yolo모델을 사용할 수 있는 완제품이라 할 수 있고,
yolo.conv.74는 yolov3, yolov3-tiny.conv.15는 yolov3-tiny를 커스텀으로 최종학습시킬 중간정도 학습되어 웨이트값이 어느정도 잡혀있는 반제품이라 할 수 있다.

나는 라즈베리파이에서는 yolov3가 너무 무거워서 yolov3-tiny를 학습시키기 위해 2)번을 선택하였다.

9. yolo-tiny 학습시키고 산출모델들 다운받기

!./darknet detector train custom/custom_data.data custom/yolov3-tiny.cfg custom/yolov3-tiny.conv.15 -dont_show 

from google.colab import files  
files.download('/content/darknet/backup/yolov3-tiny_1000.weights')
files.download('/content/darknet/backup/yolov3-tiny_2000.weights')
files.download('/content/darknet/backup/yolov3-tiny_3000.weights')
files.download('/content/darknet/backup/yolov3-tiny_4000.weights')
files.download('/content/darknet/backup/yolov3-tiny_final.weights')

학습시켜 놓고 딴짓하다 오면 런타임이 종료되어있는 경우가 많아서 학습이 끝나자마자 바로 산출된 모델들을 모두 다운받아준다.
.cfg에 설정한대로 클래스가 2개라 *2000인 4000epoches까지 학습한다.

10. 산출모델 성능 비교하기

!./darknet detector map custom/custom_data.data custom/yolov3-tiny.cfg custom/yolov3-tiny_2000.weights

위 코드처럼 .weights파일들을 바꿔가면서 성능을 비교해본다.

layer     filters    size              input                output
   0 conv     16  3 x 3 / 1   416 x 416 x   3   ->   416 x 416 x  16 0.150 BF
   1 max          2 x 2 / 2   416 x 416 x  16   ->   208 x 208 x  16 0.003 BF
   2 conv     32  3 x 3 / 1   208 x 208 x  16   ->   208 x 208 x  32 0.399 BF
   3 max          2 x 2 / 2   208 x 208 x  32   ->   104 x 104 x  32 0.001 BF
   4 conv     64  3 x 3 / 1   104 x 104 x  32   ->   104 x 104 x  64 0.399 BF
   5 max          2 x 2 / 2   104 x 104 x  64   ->    52 x  52 x  64 0.001 BF
   6 conv    128  3 x 3 / 1    52 x  52 x  64   ->    52 x  52 x 128 0.399 BF
   7 max          2 x 2 / 2    52 x  52 x 128   ->    26 x  26 x 128 0.000 BF
   8 conv    256  3 x 3 / 1    26 x  26 x 128   ->    26 x  26 x 256 0.399 BF
   9 max          2 x 2 / 2    26 x  26 x 256   ->    13 x  13 x 256 0.000 BF
  10 conv    512  3 x 3 / 1    13 x  13 x 256   ->    13 x  13 x 512 0.399 BF
  11 max          2 x 2 / 1    13 x  13 x 512   ->    13 x  13 x 512 0.000 BF
  12 conv   1024  3 x 3 / 1    13 x  13 x 512   ->    13 x  13 x1024 1.595 BF
  13 conv    256  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 256 0.089 BF
  14 conv    512  3 x 3 / 1    13 x  13 x 256   ->    13 x  13 x 512 0.399 BF
  15 conv     21  1 x 1 / 1    13 x  13 x 512   ->    13 x  13 x  21 0.004 BF
  16 yolo
  17 route  13
  18 conv    128  1 x 1 / 1    13 x  13 x 256   ->    13 x  13 x 128 0.011 BF
  19 upsample            2x    13 x  13 x 128   ->    26 x  26 x 128
  20 route  19 8
  21 conv    256  3 x 3 / 1    26 x  26 x 384   ->    26 x  26 x 256 1.196 BF
  22 conv     21  1 x 1 / 1    26 x  26 x 256   ->    26 x  26 x  21 0.007 BF
  23 yolo
Total BFLOPS 5.449 
 Allocate additional workspace_size = 52.43 MB 
Loading weights from custom/yolov3-tiny_2000.weights...
 seen 64 
Done!

 calculation mAP (mean average precision)...
12
 detections_count = 106, unique_truth_count = 49  
class_id = 0, name = Strawberry, ap = 87.89%   	 (TP = 17, FP = 1) 
class_id = 1, name = Unripe_Strawberry, ap = 97.08%   	 (TP = 23, FP = 1) 

 for thresh = 0.25, precision = 0.95, recall = 0.82, F1-score = 0.88 
 for thresh = 0.25, TP = 40, FP = 2, FN = 9, average IoU = 73.49 % 

 IoU threshold = 50 %, used Area-Under-Curve for each unique Recall 
 mean average precision (mAP@0.50) = 0.924858, or 92.49 % 
Total Detection Time: 1.000000 Seconds

Set -points flag:
 `-points 101` for MS COCO 
 `-points 11` for PascalVOC 2007 (uncomment `difficult` in voc.data) 
 `-points 0` (AUC) for ImageNet, PascalVOC 2010-2012, your custom dataset

이렇게 테스트 결과가 나오는데 나는 2000이 제일 좋았다.

11. 마무리

이제 yolov3-tiny 커스텀 학습이 끝나고 다음 포스팅은 썸네일에서 보았듯이, 라즈베리파이에서 학습된 yolov3-tiny 모델을 이용해서 파이카메라로 실시간 판별하는 과정을 정리할 것이다.

profile
SSAFY 6th -> SEC VD SW 👨‍💻🔥

1개의 댓글

comment-user-thumbnail
2021년 8월 4일

진행하시는 프로젝트가 저랑 엄청 비슷하시네요! 덕분에 많이 배워갑니다 :)

답글 달기