본문 바로가기

Capstone/2019-1 Capstone

⑥ Darknet(YOLOv3)

Darknet


Darknet 이란?


C언어로 작성된 물체 인식 오픈 소스 신경망입니다.

그 중 YOLOv3 신경망을 사용했습니다.


YOLOv3을 사용한 이유는 레이어가 많아서 탐지하는데 시간이 걸리지만 작은 물체까지 탐지가 가능합니다.


논문 : YOLOv3


Darknet 사용법

참고 링크(https://github.com/AlexeyAB/darknet#how-to-train-tiny-yolo-to-detect-your-custom-objects)


1) 라벨링


1-1) Yolo_mark를 설치후 

https://github.com/AlexeyAB/Yolo_mark

cmake .
make
./linux_mark.sh

1-2) x64/Release/data/img에 있는 기존의 이미지는 지우고 커스텀할 이미지를 넣는다.


1-3) x64/Release/data/obj.data의 내용을 수정

classes= 1
train  = data/train.txt
valid  = data/train.txt
names = data/obj.names
backup = backup
cs

1-4) x64/Release/data/obj.names의 내용을 수정
disease
cs

1-5) 아래와 같이 라벨링
<단축키>
space - 사진 넘기기
c - clear
0~9 - label


1-6) train.txt를 데이터 비율에 맞춰 train.txt와 valid.txt로 나누기


1-7) train.txt와 valid.txt와 img폴더(.jpg, .txt)를 darknet/data/ 로 이동


2) Training


2-1) yolov3.cfg 내용을 아래와 같이 바꿉니다.

  • batch를 batch=64로 수정 
  • subdivision을 subdivisions=8 수정 
  • 3개의 [yolo] 레이어의 class를 수정 (Line 610, 696, 783)
  • 3개의 [yolo] 레이어 바로 위의 [convolution] 레이어의 filters의 수를 filters=(class + 5) * 3로 수정 (Line 603, 689, 776)
2-2) darknet/cfg/coco.data의 내용을 수정

classes= 1
train  = /capstone/Jeongmin/darknet/data/train.txt
valid  = /capstone/Jeongmin/darknet/data/valid.txt
#valid = data/coco_val_5k.list
names = data/coco.names
backup = backup/
#eval=coco
cs

2-3) darknet/data/coco.names의 내용을 수정

disease
cs

2-4) 이미지 라벨링
본문 1)을 참고

2-5) 이미 전처리된 신경망을 다운 받습니다. 

2-6) GPU 사용을 위해 Makefile을 수정합니다.
빨간 부분만 사용할 GPU에 맞춰 수정합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
GPU=1
CUDNN=1
OPENCV=1
OPENMP=0
DEBUG=0
 
ARCH= -gencode arch=compute_61,code=[sm_61,compute_61]
#      -gencode arch=compute_20,code=[sm_20,sm_21] \ This one is deprecated?
 
# This is what I use, uncomment if you know your arch and want to specify
# ARCH= -gencode arch=compute_52,code=compute_52
 
VPATH=./src/:./examples
SLIB=libdarknet.so
ALIB=libdarknet.a
EXEC=darknet
OBJDIR=./obj/
 
CC=gcc
CPP=g++
NVCC=nvcc 
AR=ar
ARFLAGS=rcs
OPTS=-Ofast
LDFLAGS= -lm -pthread 
COMMON= -Iinclude/ -Isrc/
CFLAGS=-Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC
 
ifeq ($(OPENMP), 1
CFLAGS+= -fopenmp
endif
 
ifeq ($(DEBUG), 1
OPTS=-O0 -g
endif
 
CFLAGS+=$(OPTS)
 
ifeq ($(OPENCV), 1
COMMON+= -DOPENCV
CFLAGS+= -DOPENCV
LDFLAGS+= `pkg-config --libs opencv` -lstdc++
COMMON+= `pkg-config --cflags opencv` 
endif
 
ifeq ($(GPU), 1
COMMON+= -DGPU -I/usr/local/cuda-9.1/include/
CFLAGS+= -DGPU
LDFLAGS+= -L/usr/local/cuda-9.1/lib64 -lcuda -lcudart -lcublas -lcurand
endif
 
cs

2-7) ./darknet detector train cfg/coco.data cfg/yolov3.cfg darknet53.conv.74 -gpus 0,1,2,3로 학습 실행

     ./darknet detector train cfg/coco.data cfg/yolov3.cfg backup/yolov3_6500.weights -gpus 2,3로 중간부터 학습


3) Test


사진으로 테스트 ./darknet detector test cfg/coco.data cfg/yolov3.cfg backup/yolov3_16000.weights test_disease/56.jpg

비디오로 테스트 ./darknet detector demo cfg/coco.data cfg/yolov3.cfg backup_corn/yolov3_10000.weights test1.mp478.jpg


결과



추가)

이후 파이썬(detector.py)을 사용해 탐지하기 위해서 코드를 아래와 같이 수정했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# Stupid python path shit.
# Instead just add darknet.py to somewhere in your python path
# OK actually that might not be a great idea, idk, work in progress
# Use at your own risk. or don't, i don't care
 
import sys, os
sys.path.append(os.path.join(os.getcwd(),'python/'))
sys.path.append(os.getcwd().replace('darknet'''))
sys.path.append(os.getcwd().replace('darknet''temp/'))
sys.path.append(os.getcwd().replace('darknet''slice/'))
import darknet as dn
import pdb
 
dn.set_gpu(0)
net = dn.load_net("cfg/yolov3.cfg".encode('utf-8'), "backup_corn/yolov3_34000.weights".encode('utf-8'), 0)
meta = dn.load_meta("cfg/coco.data".encode('utf-8'))
 
 
path = '../slice/'
file_list = os.listdir(path)
if ".DS_Store" in file_list:
    file_list.remove(".DS_Store")
 
total_file_num = len(file_list)
current_file_num = int()
 
= open('../detection_result.txt''a')
    
for file_name in file_list:
    filepath = path + file_name
    r = dn.detect(net, meta, filepath.encode('utf-8'))
 
    current_file_num = current_file_num + 1
    print(str(current_file_num) + '///' + str(total_file_num))
    
    if r:
        print(r)
        print(file_name)
        
        with open('../detection_result.txt''a') as fileobject:
            fileobject.write(file_name)
            fileobject.write('\n')
 
print("END")
 
cs


반응형

'Capstone > 2019-1 Capstone' 카테고리의 다른 글

⑧ 캡스톤 최종결과물  (2) 2019.08.22
⑦ TCP 통신  (0) 2019.06.21
⑤ Darkflow : YOLO의 Tensorflow 버전  (5) 2019.06.21
④ 이미지 수집 & 데이터 불리기  (0) 2019.05.27
③ Docker  (0) 2019.05.20