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-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)
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 |
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() f = 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 |