[2]Yolo v3 python
YOLO를 실행하기 위해 기본적으로 알아야하는 방법들이다.
이전 프로젝트에 설명한 내용들이므로 링크를 첨부하였다.
Tensorflow 기반의 Darkflow(어플 적용에 이점이 있음)
이전 프로젝트에서 사용한 YOLO 의 기본적인 사용방법을 참고하여 YOLO에 대해 익힌 상태에서
파이썬 코드를 통해 실행 시키는 방법에대해 알아보겠다.
다크넷(darknet): C로 작성한 신경망 공개소스
https://www.youtube.com/watch?v=Cgxsv1riJhI
유의 유튜브 링크를 어떻게 컴퓨터가 개체를 즉시 인식하기위해 학습하는가 알수 있다.(TED 강의)
다크 넷의 특징 : 다크넷은 C와 쿠다로 작성한 공개소스 신경망 작업틀이다. 이것은 빠르고, 설치가 쉽다, 그리고 CPU 와 GPU 계산을 지원한다.
YOLO를 사용하기 위한 순서는 다음과 같다.
이미지 수집 및 부풀리기 -> 이미지 라벨링 -> 학습 이 순서를 거쳐 자신의 모델을 만들수있다.
이번 프로젝트에서의 이미지 수집 방법은 구글 이미지 크롤러를 통한 수집, 직접 라즈베리파이를 이용해 도로 주행을 촬영한 영상들을 이용하여 부풀려 학습에 사용하였다.
탐지 결과는 다음과 같다.
동영상 추가
python 코드를 사용하기 위해서 ~/darknet/000/detector.py 를 이용하였다.
원본 코드
https://github.com/pjreddie/darknet/blob/master/examples/detector.py
# 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/'))
import darknet as dn
import pdb
dn.set_gpu(0)
net = dn.load_net("cfg/yolo-thor.cfg", "/home/pjreddie/backup/yolo-thor_final.weights", 0)
meta = dn.load_meta("cfg/thor.data")
r = dn.detect(net, meta, "data/bedroom.jpg")
print r
# And then down here you could detect a lot more images like:
r = dn.detect(net, meta, "data/eagle.jpg")
print r
r = dn.detect(net, meta, "data/giraffe.jpg")
print r
r = dn.detect(net, meta, "data/horses.jpg")
print r
r = dn.detect(net, meta, "data/person.jpg")
print r
다음의 코드를 다음과 같이 수정하여 진행하였다.
수정코드
#gps = 전송된 위치정보
#slice = 분석을 위해 동영상을 프레임단위로 자른 이미지
#gps, slice 폴더의 위치 = /Users/username/gps , /Users/username/slice
#코드의 실행위치 = /Users/username/darknet/yolo.py
#yolo 분석을 통해 탐지시 /Users/username/detection_result.txt 에 저장
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', 'gps/'))
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'), "ww/yolo_final.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)
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")
해당 코드의 실행위치는 /Users/username/darknet/yolo.py 의 파이썬 파일을 만들어 실행하였다.
다른 위치에서 실행하여도 되지만 경로를 바꿔줘야하는 불편함이있어 해당 위치에서 실행하는 것은 권장한다.
slice 폴더의 경우에는 동영상 분석하기 위해 이미지를 프레임 단위로 자른 이미지들이 들어있는 폴더이며
gps 폴더는 도로를 주행하면서 1초에 30번 기록된 위치 정보를 저장하는 폴더이다.
해당 코드를 이용하여 여러장의 이미지가 있는 디렉토리를 입력 데이터로 넣어서 여러장의 이미지를 순차적으로 탐지를 실시한다.
만약 탐지가 완료되면 저와 같은 경우는 /Users/sungjin/detection_result.txt 파일이 아래와 같이 저장된다.
만약 오류가 발생한다면 아래 블로그를 참고하여 오류의 부분을 확인 후 해결해 나아가면 도움이 될 것 같다.
https://dudgns7675.tistory.com/9
위의 코드를 이용해 실제로 탐지가 된 결과이다.
참고
https://jeongmin-lee.tistory.com/62?category=778411