tensorflowで物体認識(YOLOv2)をやってみる

以前chainer版は試しました。
今回はtensorflowで実装されたYOLOv2をやってみたいと思います。

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
[追記]
今回はkeras中心の構成になっており、tensorflowの実装は
後日記述したこちらを参考にしてください
weekendproject9.hatenablog.com
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

[環境]
 win7 64bit
 GTX 960
 python3.5
 tensolfolw 1.2.1
 keras 2.0.8


[準備]
参考HPがlinuxのやりかたなのでwinでの手順を書いていきます。
まず下記リンクからzipをDL→解凍。
GitHub - allanzelener/YAD2K: YAD2K: Yet Another Darknet 2 Keras
次に以下のURLをクリックしてDLし、先ほど解凍したフォルダに移動。
http://pjreddie.com/media/files/yolo.weights

次に以下のURLをクリックして同じフォルダに"yolo.cfg"を作成して中身をコピペ
https://raw.githubusercontent.com/pjreddie/darknet/master/cfg/yolo.cfg

ライブラリ追加インストール

pip install numpy h5py pillow
pip install tensorflow-gpu==1.2.1
pip install keras==2.0.8

[物体認識テスト]
まずモデルを生成します

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

実行するとwindowsならエラーがでます。
以下エラー内容(自分のをコピーし忘れたので人のを借用しました)

表示内容
____________________________________________________________________________________________________ 
Layer (type) Output Shape Param #Connected to
====================================================================================================
 lambda_1 (Lambda) (None, 3, 160, 320) 0
lambda_input_1[0][0]
____________________________________________________________________________________________________ 
convolution2d_1 (Convolution2D) (None, 1, 40, 16) 327696

.....
.....続く

エラー内容
Traceback (most recent call last):
  File "./yad2k.py", line 270, in <module>
    _main(parser.parse_args())
  File "./yad2k.py", line 254, in _main
    model.save('{}'.format(output_path))
  File "C:\Users\DanMo\Anaconda3\envs\py35cv3\lib\site-packages\keras\engine\topology.py", line 2506, in save
    save_model(self, filepath, overwrite, include_optimizer)
  File "C:\Users\DanMo\Anaconda3\envs\py35cv3\lib\site-packages\keras\models.py", line 106, in save_model
    'config': model.get_config()
  File "C:\Users\DanMo\Anaconda3\envs\py35cv3\lib\site-packages\keras\engine\topology.py", line 2322, in get_config
    layer_config = layer.get_config()
  File "C:\Users\DanMo\Anaconda3\envs\py35cv3\lib\site-packages\keras\layers\core.py", line 661, in get_config
    function = func_dump(self.function)
  File "C:\Users\DanMo\Anaconda3\envs\py35cv3\lib\site-packages\keras\utils\generic_utils.py", line 176, in func_dump
    code = marshal.dumps(func.__code__).decode('raw_unicode_escape')
UnicodeDecodeError: 'rawunicodeescape' codec can't decode bytes in position 195-196: truncated \uXXXX

どうやらwinだと特殊文字があってだめとのこと。
エラーが出ているkerasを書き換えに行きます。
Anacondaを使っている人は以下にインストールしたフォルダがあります
 C:\ProgramData\Anaconda3\Lib\site-packages\keras\utils 
もしくはここ
 C:\Users\ユーザー名\Anaconda3\Lib\site-packages\keras\utils 
ここの”generic_utils.py”を開き 175行目をコメントアウト、その下に新たに書き込みます

175    #code = marshal.dumps(func.__code__).decode('raw_unicode_escape')
176    code = marshal.dumps(func.__code__).replace(b'\\',b'/').decode('raw_unicode_escape')

セーブしたら再度実行

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

今回はできました(194MBのファイルが生成される)

次に本題の物体認識です。

python test_yolo.py model_data/yolo.h5

実行するとimagesフォルダのoutフォルダに結果が表示されました。

f:id:weekendproject9:20170918180348j:plain:w350
f:id:weekendproject9:20170918180822j:plain:w350
f:id:weekendproject9:20170918180755j:plain:w350
f:id:weekendproject9:20170918180829j:plain:w350


2017/09/19 [追記]

PermissionError: [Errno 13] Permission denied:~~~~
というエラーが出ていたので対処しました。

・67行付近のoutputフォルダを生成しているifをコメントアウトを以下に変更

    c_path  = os.getcwd()#カレントディレクトリ取得
    output_file = "out"#出力フォルダ名
    o_path =  os.path.join(c_path,output_file)#出力フォルダパス生成
    if not os.path.exists(o_path):
        print('Creating output path {}'.format(o_path))
        os.mkdir(o_path)#生成

・205行付近の画像保存を以下に変更

  image.save(os.path.join(o_path, image_file), quality=90)

[参考]
YOLOv2(Keras/TensorFlow)でディープラーニングによる画像の物体検出を行う - Qiita
YOLOv2(TensorFlow)を使ってリアルタイムオブジェクト認識をしてみる - Qiita
UnicodeDecodeError · Issue #60 · allanzelener/YAD2K · GitHub
python - Keras model.to_json() error: 'rawunicodeescape' codec can't decode bytes in position 94-98: truncated \uXXXX - Stack Overflow
keras/generic_utils.py at master · fchollet/keras · GitHub