Yolo_How_it_Works2_700

YOLO는 정확도를 유지한 채로 연산량을 대폭 줄여 동영상에 가장 사랑받는 Object Detector입니다. 원 저자는 C를 이용하여 프로그램을 짰기 때문에, TensorFlow의 Tensorboard와 같은 유용한 기능들을 사용할 수 없는 점이 아쉬웠습니다. 하지만 훌륭한 분이 TensorFlow 버전 YOLO인 DarkFlow를 만들어주었습니다.

오늘 TensorFlow 버전 YOLO, DarkFlow를 설치하고 실행해 보겠습니다.

##1. Anaconda 환경 세팅 및 설치

Anaconda는 이미 설치되어 있다고 가정하겠습니다. 만약 아직 설치하지 않으셨다면 아래 포스트를 참고해주세요.

Anaconda 가상환경 설치

conda create -n tf3 python=3.6

Anaconda 가상환경 실행

source activate tf3

TensorFlow-gpu 설치

공식문서의 설치 가이드를 참고합니다. \ 아래 {Package URL}에는 이 링크에서 해당하는 URL을 붙여넣는다.

#Install TensorFlow-GPU
pip install --ignore-installed --upgrade {PACKAGE_URL}

Install OpenCV

conda install -c conda-forge opencv

Install Cython

conda install -c anaconda cython

2. DarkFlow 설치

#clone repository
git clone https://github.com/thtrieu/darkflow
cd DarkFlow

#build
python3 setup.py build_ext --inplace

이제 ./flow로 실행할 수 있습니다.

Weight 다운받기

*.weight 파일은 용량이 크기 때문에, Github에서 함께 받을 수 없습니다. 아래 링크를 이용하여 *.weight파일을 받아주세요.

다운 받았다면, bin/ 폴더로 옮겨줍니다.

3. 한번 돌려보기

./flow --imgdir sample_img/ --model cfg/yolo.cfg --load bin/yolo.weights

잘 되죠?

3. Darkflow 사용하기

공식문서에 친절하게 설명되어 있는 내용들입니다.
찾아보기 편하도록 중요한 것만 뽑아보겠습니다.

--load : weight 불러오기

# 1. Load tiny-yolo.weights
./flow --model cfg/tiny-yolo.cfg --load bin/tiny-yolo.weights

# 2. To completely initialize a model, leave the --load option
./flow --model cfg/yolo-new.cfg

# 3. It is useful to reuse the first identical layers of tiny for `yolo-new`
./flow --model cfg/yolo-new.cfg --load bin/tiny-yolo.weights
# this will print out which layers are reused, which are initialized

--imgdir : 이미지 경로 지정하기

--gpu 1.0 : gpu 100% 가동!

# Forward all images in sample_img/ using tiny yolo and 100% GPU usage
flow --imgdir sample_img/ --model cfg/tiny-yolo.cfg --load bin/tiny-yolo.weights --gpu 1.0

--json : json으로 출력하기

[{"label":"person", "confidence": 0.56, "topleft": {"x": 184, "y": 101}, "bottomright": {"x": 274, "y": 382}},
{"label": "dog", "confidence": 0.32, "topleft": {"x": 71, "y": 263}, "bottomright": {"x": 193, "y": 353}},
{"label": "horse", "confidence": 0.76, "topleft": {"x": 412, "y": 109}, "bottomright": {"x": 592,"y": 337}}]

output

[{"label":"person", "confidence": 0.56, "topleft": {"x": 184, "y": 101}, "bottomright": {"x": 274, "y": 382}},
{"label": "dog", "confidence": 0.32, "topleft": {"x": 71, "y": 263}, "bottomright": {"x": 193, "y": 353}},
{"label": "horse", "confidence": 0.76, "topleft": {"x": 412, "y": 109}, "bottomright": {"x": 592,"y": 337}}]

4. new model 학습하기

--train 옵션으로 학습시작하기

# Initialize yolo-new from yolo-tiny, then train the net on 100% GPU:
./flow --model cfg/yolo-new.cfg --load bin/tiny-yolo.weights --train --gpu 1.0

# Completely initialize yolo-new and train it with ADAM optimizer
./flow --model cfg/yolo-new.cfg --train --trainer adam

# Resume the most recent checkpoint for training
./flow --train --model cfg/yolo-new.cfg --load -1

# Test with checkpoint at step 1500
./flow --model cfg/yolo-new.cfg --load 1500

# Fine tuning yolo-tiny from the original one
./flow --train --model cfg/tiny-yolo.cfg --load bin/tiny-yolo.weights
# Download the Pascal VOC dataset:
curl -O https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar
tar xf VOCtest_06-Nov-2007.tar

# An example of the Pascal VOC annotation format:
vim VOCdevkit/VOC2007/Annotations/000001.xml

# Train the net on the Pascal dataset:
flow --model cfg/yolo-new.cfg --train --dataset "~/VOCdevkit/VOC2007/JPEGImages" --annotation "~/VOCdevkit/VOC2007/Annotations"

5. 나만의 Dataset으로 학습하기

  1. tiny-yolo-voc.cfg을 복사한 후 tiny-yolo-voc-3c.cfg로 이름바꾸어줍니다.
  2. tiny-yolo-voc.cfg파일을 연 후 [region]레이어에서 classes 를 바꾸어줍니다.
...
[region]
anchors = 1.08,1.19,  3.42,4.41,  6.63,11.38,  9.42,5.11,  16.62,10.52
bias_match=1
classes=3
coords=4
num=5
softmax=1
...
  1. tiny-yolo-voc.cfg파일에서 [convolutional]레이어의 filters를 *num(classes + 5)** 로 수정해줍니다. 만약 num=5, classes=3 이라면 ** 5(3+5) = 40 ** 이므로 filters=40이 됩니다. ```python … [convolutional] size=1 stride=1 pad=1 filters=40 #num(classes + 5) activation=linear

[region] anchors = 1.08,1.19, 3.42,4.41, 6.63,11.38, 9.42,5.11, 16.62,10.52 …

4. <kbd>labels.txt</kbd>를 만들어 줍니다.
```sh
label1
label2
label3

6. Camera/video file demo

7. 다른 어플리케이션에서 darkflow 사용하기

cv2.imread를 이용해 이미지를 먼저 불러온 후 return_predict(img)를 사용해야 합니다.
output은 json형태로 나타납 다.

from darkflow.net.build import TFNet
import cv2

options = {"model": "cfg/yolo.cfg", "load": "bin/yolo.weights", "threshold": 0.1}

tfnet = TFNet(options)

imgcv = cv2.imread("./sample_img/sample_dog.jpg")
result = tfnet.return_predict(imgcv)
print(result)

8. built graph 저장하기

## Saving the lastest checkpoint to protobuf file
./flow --model cfg/yolo.cfg --load -1 --savepb

## Saving graph and weights to protobuf file
./flow --model cfg/yolo.cfg --load bin/yolo.weights --savepb

Comments

Eungbean Lee's Picture

About Eungbean Lee

Lee is a Student, Programmer, Engineer, Designer and a DJ

Seoul, South Korea https://eungbean.github.io