Coinsは動物園なのか

Source: Deep Learning on Medium

keras + YOLOを使って検証してみた

coins Advent Calendar 2019 6日目

coinsのアドカレにお邪魔します.klisのkamiこと村上です.
決してcoinsをバカにしているわけではありません.以前Coinsは動物園といってるcoinsの人がいたので情報学群らしく科学的に検証しようと思います.
(ちなみに言ってた人はアドカレの1,2日目の人たちです)

YOLO

検証するにあたって畳み込みニューラルネットワーク(CNN)による教師あり深層学習を使います.今回使う手法は教師あり機械学習のYOLOです.YOLOとは”You only live once”の略で,物体検出の手法です.物体の認識と位置把握を同時に高速にできるものです.
YOLOのコンセプト曰く,

“Humans glance at an image and instantly know what objects are in the image, where they are, and how they interact. “
「人類は画像を一目見て,瞬時にそれが画像の中にある物体が何であるのか,どこにあるのか,どのように相互作用しているのかを理解する.」

らしい.とにかくYOLOの独自モデルを作って推論をするところまでをやってみます.といってもネットに転がっているソースコードを拝借しつつGoogle Colaboratoryのマシンパワーを借りて学習をします.

教師あり機械学習と準備

教師あり機械学習のフェーズは,

が基本となります.今回はテストデータによる検証の後めんどくさいので調節を行いませんが本来は教師データの一部を用いて調節を行います.

今回はkeras-yolo3というyoloを使いやすくしたものを使います.

zsh
cd ~/Desktop/
git clone https://github.com/sleepless-se/keras-yolo3

でデスクトップにCloneします.

1.教師データをあつめる

まず教師データ(画像)を集めなければなりません.YOLOでは600枚ほどで精度が出るようです.
教師画像を集めるには iCrawler を使います. iCrawlerはpython環境で動くクレーパーで,webから画像を集めてきてくれます.先ほどの~/Desktop/keras-yolo3/ にて最小構成で実行してみます.

pip install icrawler

Python
from
icrawler.builtin import GoogleImageCrawler crawler = GoogleImageCrawler(storage={"root_dir": "images"}) crawler.crawl(keyword="動物園 animal 動物 zoo", max_num=1000)

無事 /images/ にダウンロードされたことだと思います.

脳死作業

ここから脳死作業をします.1000枚ほど集まった画像から使えない画像を削除します.無論手作業です.X<

Fig. へえ〜勉強になるの図
FIg. マレーシア国立動物園ではパンダが見れるらしい

こうして作業にかかった時間3時間,集まったデータ450枚.無給です.ちょっと足りないけどまあいいっか.

2. 教師画像をリサイズ

32 px*32 pxのフィルターを通すため,32の倍数四方の正方形画像にリサイズします.

.../keras-yolo3/ にて

python resize_images.py

を実行することによってアスペクト比を保持したまま320 px*320 pxにリサイズされます.

3.ラベル付けとアノテーション

ラベル付とアノテーションをします.ラベル付とアノテーションをとはそれぞれ,物体が何というものか命名する,その物体がどこにあるかを教える作業です.もちろん手作業で450枚一枚一枚やっていきます.7時間ほどかかりました.アノテーションをにはMicrosoftが開発したVoTTを使います.VoTTの使い方はこの辺をご参照してね.
アノテーションを書き出すと書き出し先にxxxxPascalVOC-export ディレクトリが作成されます.

4. 学習

GoogleColabにて学習をします.Google Colaboratory(通称Colab)はGPUやTPU環境を無料で使えるJupyternotebook環境で,TensorFlowをサポートしています.
親切な人がColabに学習環境を公開してくれているのでこちらを使います.

https://colab.research.google.com/drive/1rpkQo9wMRZi7YLU8zMxfaprw2gTxevOy

学習の準備

xxxxPascalVOC-export ディレクトリをzipにします.英語名にリネームします.ちなみにColabでは ! をつけることでシェルコマンドを実行できます.

!git clone https://github.com/sleepless-se/keras-yolo3.git
%cd keras-yolo3
%cd VOCDevkit/VOC2007
%cd /content/keras-yolo3/VOCDevkit/VOC2007
from google.colab import files
uploaded = files.upload()
!ls

ここで先程のzipをアップロードします.

!unzip Archive
%cd /content/keras-yolo3/
!python make_train_files.py
!python voc_annotation.py zoo animal

ここのzoo と animal はラベル名を入力します.

!wget https://pjreddie.com/media/files/yolov3.weights
!python convert.py -w yolov3.cfg yolov3.weights model_data/yolo_weights.h5
!python train.py

重み付けと学習を実行します.

classes = "model_data/voc_classes.txt"
files.download(classes)
trained = 'logs/000/trained_weights_final.h5'
files.download(trained)

学習がおわったら .txt.h5 をダウンロードします.

5. 推論

学習ができたら実際に推論をしてみます.

cp trained_weights_final.h5 ~/Desktop/keras-yolo3/logos/000/
cp
voc_classes.txt ~/Desktop/keras-yolo3/model_data

trained_weights_final.h5keras-yolo3/logs/000
voc_classes.txtkeras-yolo3/model_data
それぞれ入れます.

あとは実行して出力をまちます

python yolo_video.py --image <image_file_path>

実行

今回は

この画像を使って推論します.
結果は,,,
動物園 zoo の中に動物 animal がいますね! 動物園です!

ということでcoinsは動物園です