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フォルダに結果が表示されました。
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