初めに
画像認識で物体を検出する際にyolov3を使用しました。その時の使用方法のメモを残そうと思います。
使用環境
- ubuntu20.04またはwindows10
- anaconda
- tensorflow-gpu 1.13.1
- keras 2.3.1
- pillow
- matplotlib
-
conda install pillow matplotlib
で上の2つはインストールできます
-
- opencv
- ※ 注意
pip install opencv-python
でインストールする。 -
conda install opencv
でインストールすると動かないと思います。
- ※ 注意
環境構築については参考を見てください。(tensorflow-gpu 1.13.1,keras 2.3.1であることが違うので注意)
※ この記事はkeras-yolo3とWindows 10 で YOLOv3 を自前画像で学習させる(物体検出編)【機械学習】の内容を主に参考にしています。
モデルのダウンロード
ubuntuの場合
cd ~/
#ソースコードをダウンロード
git clone https://github.com/qqwweee/keras-yolo3.git
cd keras-yolo3
#重みをダウンロード
wget https://pjreddie.com/media/files/yolov3.weights
#kerasようにモデルをconvert
#kerasなどインストールしたanaconda仮想環境内で行う
python convert.py yolov3.cfg yolov3.weights model_data/yolo_weights.h5
windowsの場合
- ソースコードをダウンロード
keras-yolo3からダウンロード(code→Download zip通すとダウンロードできます)し解凍する。ここではC:\test\
に解凍したとする。 - 重みをダウンロード
重みからダウンロード。(クリックしただけでダウンロードが始まります) - yolov3.weightsを
C:\test\keras-yolo3-master
に移動させる。 - kerasようにモデルをconvert
- anaconda promptから必要なものをインストールしたanaconda仮想環境に入る。
-
C:\test\keras-yolo3-master
に移動する。例cd C:\test\keras-yolo3-master
-
python convert.py yolov3.cfg yolov3.weights model_data/yolo_weights.h5
を実行する
バグの修正
-
参考1を参考にyolo_video.pyを修正する。
-
参考2を参考にyolo.py(174行目あたり)を修正する。
-
yolo.pyの最終行
yolo.close_session()
の前にvid.release() cv2.destroyAllWindows()
を追加する。(不要かもしれない)
デモの実行
方法1. ファイル画像(.jpg,.mp4など)を認識する
-
このページを参考に変更を行う
(行わないとAttributeError: 'NoneType' object has no attribute '__array_interface__'
となります) - jpgファイルなどを認識する場合結果のウィンドウが一瞬で閉じてしまうので最後の
cv2.destroyAllWindows()
をする前にtime.sleep
などで停止する。(強引ですが…) - 以下のコマンドで起動する
python yolo_video.py --model_path=model_data/yolo_weights.h5 --input=[ファイルのパス]
方法2. webカメラで撮影した画像を認識する
- webカメラを接続する。
- 以下のコマンドで起動する
#カメラ番号はopencvのcv2.VideoCapture(int(video_path))に渡されるのでカメラの番号を設定する
python yolo_video.py --model_path=model_data/yolo_weights.h5 --input=[カメラ番号]
#動画のウィンドウ上でqを押すと終了
※InternalError (see above for traceback): Blas SGEMM launch failed : m=43264, n=32, k=64 …
のようなエラーが出る場合
参考
GPUの種類やcudaのバージョンによっては上のようなエラーが出ることがあるらしい。tensorflow-gpuとkerasのバージョンを上のものとあっているか確認する。(tensorflow-gpu1.12.0 , keras2.2.4では上のようなエラーが出ました(cuda-toolkitのバージョンの問題のようだがtensorflow-gpuやkerasのバージョンを変えればanacondaが自動的に調整してくれる))
参考(tensorflowとcudaのバージョン)
自前のデータを用いる
- データの画像を集める
- VoTTでアノテーションデータを作成するを参考に、アノテーションデータを作成する。(今回はデータの画像はjpgのものを使用しています。
- ここでproviderをPascal VOCにし、テストとトレーニング分割はすべて(100%)trainにしました。
(keras-yolo3の学習においてはtrainしか用いないようなので)
(また確認をwebカメラで行ったのでテストデータは不要かなと考えています)
-
keras-yolo3(またはkeras-yolo3-master)
ディレクトリ以下にVOCdevkit/VOC2007
を作成する。 - [任意の名前]-PascalVOC-exportの中身をそのままVOC2007内部にコピペする。
-
VOCdevkit/VOC2007/ImageSets/Main
内にクラスごとにファイルができている。これらのファイルは画像名と,1と-1で画像中にそのクラスが含まれているのかを表している(?)。ここでは画像名のみあればよいので1つのみ残してtrain.txtと名前を付け保存する。それ以外は削除してよい。またファイル中の各行末の1,-1と.jpgをすべて削除する。(行末の1は1
(半角スペースと1を空白に一括置換するとよいです)) - voc_annotation.pyを以下のように編集する
- 4行目を
sets=[('2007', 'train')]
に - 6行目classesを自分の使いたいクラスに(じゃんけんの例:
classes = ["gu","tyoki","pa"]
(VoTTでつけたタグのこと)) - 21行目をそれぞれ一度
float
にキャストする。int(float(xmlbox.find('xmin').text))
など
- 4行目を
- python voc_annotation.pyを実行する。
-
keras-yolo3(またはkeras-yolo3-master)
内部に2007_train.txt
ができる。 -
model_data/voc_classes.txt
をコピーして、my_classes.txt
を作り、クラスを書く(gu,tyoki,paなど) -
train.py
を以下のように編集する- 17行目を
annotation_path = '2007_train.txt'
に - 19行目を
classes_path = 'model_data/my_classes.txt’
に - 57行目と76行目の“batch_size”を32から8にする。(これはGPUのメモリが不足するため(?)でエラーが起こらなければ32のままでもよく逆にエラーが出るなら4に下げるといいかもしれません)
- 17行目を
-
python train.py
で学習→重みがlogs/000/trained_weights_final.h5
にできる
(AttributeError: module 'keras.backend' has no attribute 'control_flow_ops'
と出る場合は参考のようにして解決できます。)(kerasのバージョンによるらしい) - 認識の実行
- webカメラを接続する
- 以下を実行する
python yolo_video.py --model_path=logs/000/trained_weights_final.h5 --classes_path=model_data/my_classes.txt --input=[カメラ番号]