나는 git clone으로 darknet 프레임워크를 받아와서 컴파일을 해주면 colab의 내장 cuda, cudnn와 버전 충돌이 발생해서 미리 컴파일된 darknet과 호환되는 cudnn을 직접 가져왔다.
from google.colab import drive
drive.mount('/content/drive')
!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결과가 나온다면 된다.
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 학습을 위한 전반적인 다크넷 프레임워크 준비가 완료되었다.
!cp -r "/content/drive/My Drive/darknet/custom" .
여기서 시간이 제법 소요된다.
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)번을 선택하였다.
!./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까지 학습한다.
!./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이 제일 좋았다.
이제 yolov3-tiny 커스텀 학습이 끝나고 다음 포스팅은 썸네일에서 보았듯이, 라즈베리파이에서 학습된 yolov3-tiny 모델을 이용해서 파이카메라로 실시간 판별하는 과정을 정리할 것이다.
진행하시는 프로젝트가 저랑 엄청 비슷하시네요! 덕분에 많이 배워갑니다 :)