YOLOv2(Keras / TensorFlow)でディープラーニングによる画像の物体検出を行う

# やったこと
流行りのディープラーニングを使って、画像の物体検出を行いました。

![sasha-instagram-com-sanfrancisco-262826.jpg](https://qiita-image-store.s3.amazonaws.com/0/172399/f452f9e3-19f1-7490-b878-78d53268e8d5.jpeg)

今回は、*YOLOv2*というアルゴリズムを使って物体検出を行なっています。

# YOLO(You Only Look Once)とは
畳み込みニューラルネットワーク(CNN:Convolutional Neural Network)を用いた物体検出アルゴリズムです。現時点ではv1とv2が存在します。

## YOLO(YOLOv1)
論文は[こちら(2015年)](https://arxiv.org/abs/1506.02640)。

従来とは異なり、画像をバウンディングボックスで分割してクラス分類を行なっている。
> we frame object detection as a regression problem to spatially separated bounding boxes and associated class probabilities. 

結果として、45FPSの処理速度を実現した。
> Our unified architecture is extremely fast. Our base YOLO model processes images in real-time at 45 frames per second. 

## YOLO9000(YOLOv2)
論文は[こちら(2016年)](https://arxiv.org/abs/1612.08242)。

YOLOv1を改良し、9000種類の物体検出が可能になっている。
> First we propose various improvements to the YOLO detection method, both novel and drawn from prior work. 

67FPSにおいて、76.8 mAP(mean Average Precision)を達成したとのこと。
> The improved model, YOLOv2, is state-of-the-art on standard detection tasks like PASCAL VOC and COCO. At 67 FPS, YOLOv2 gets 76.8 mAP on VOC 2007.

# YOLOv2を動かす
今回は、GitHubに公開されている[YAD2K:Yet Another Darknet 2 Keras](https://github.com/allanzelener/YAD2K)を使ってみます。
これは、90%はKeras、10%はTensorFlowで実装されているとのこと。

## インストール
ソースコード及び必要なライブラリをインストールします。

```
git clone https://github.com/allanzelener/YAD2K.git
cd yad2k

pip install numpy h5py pillow
pip install tensorflow-gpu
pip install keras
```

## 設定ファイル(config)と学習済みの重み(weight)のダウンロード
[darknet](https://pjreddie.com/darknet/yolo/)にあるconfigとweightをプロジェクト直下に格納します。

```
wget http://pjreddie.com/media/files/yolo.weights
wget https://raw.githubusercontent.com/pjreddie/darknet/master/cfg/yolo.cfg
```

学習データには、[Pascal VOC Challenges](http://host.robots.ox.ac.uk/pascal/VOC/)の2007年+2012年のデータを使用しています。

## モデル生成＆予測実行
configとweightを読み込んでKeras(Tensorflow backend)のモデルを生成します。

```
./yad2k.py yolo.cfg yolo.weights model_data/yolo.h5
```

`./images`直下の画像に対して物体検出を行います。

```
./test_yolo.py model_data/yolo.h5
```

結果は`./image/out`に格納されます。

## 実行結果

画像は[Creative Commons](https://creativecommons.org/)よりCCライセンスの画像を使用しました。

判定クラスは、`person`, `car`,`dog`など全部で80クラスとなっています。
クラス名は`YAD2K/model_data/coco_classes.txt`に格納されています。

---

1. 背景の車まで認識しています。
![14323966508_5e4363fce9_z.jpg](https://qiita-image-store.s3.amazonaws.com/0/172399/4ae06fd7-ec75-5626-6753-8e00bc8d8850.jpeg)

2. スーツのおじさんも正しく認識。
![8268008683_0072848aa5_z.jpg](https://qiita-image-store.s3.amazonaws.com/0/172399/284967d6-41c8-e280-daaf-f00534d905cc.jpeg)

3. ジャンプしてもちゃんと認識しています。
![8269076712_7149b8f73a_z.jpg](https://qiita-image-store.s3.amazonaws.com/0/172399/61a80dd9-83c6-9da9-f8ed-c8261c7db252.jpeg)

4. 奥行きがある画像では、後ろの方の人が認識できていません。
![sasha-instagram-com-sanfrancisco-262826.jpg](https://qiita-image-store.s3.amazonaws.com/0/172399/f452f9e3-19f1-7490-b878-78d53268e8d5.jpeg)

5. 人がくっついていると精度が低いようです。
![bushman-509238_640.jpg](https://qiita-image-store.s3.amazonaws.com/0/172399/cd4784da-0f09-7bd4-0dd2-9796828ca8a6.jpeg)

6. 黒いシルエットでも問題なく認識できています（鳥も）。
![bridge-893200_640.jpg](https://qiita-image-store.s3.amazonaws.com/0/172399/94d8d3bc-ff81-ce84-8824-27432c3c25eb.jpeg)

# 感想
さくっと動かすだけであれば、1h程でできました。
今後は、`./yad2k.py`の内容をいじったり[ディープラーニング用のAWS AMI](https://aws.amazon.com/marketplace/pp/B06VSPXKDX)を使って独自データを学習したいと思います。

また、今回はMacにライブラリを直接インストールして動かしましたが、提供されているcondaの設定ファイルによる仮想環境ではうまく動きませんでした。今後は固定のDocker環境にて試していきたいと思います。

# 参考
- [YOLO: Real-Time Object Detection](https://pjreddie.com/darknet/yolo/)
- [Deep Learningによる一般物体検出アルゴリズムの紹介](http://tech-blog.abeja.asia/entry/object-detection-summary)