LoginSignup
1
1

More than 3 years have passed since last update.

keras-yolov3を使用する

Posted at

初めに

画像認識で物体を検出する際に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-yolo3Windows 10 で YOLOv3 を自前画像で学習させる(物体検出編)【機械学習】の内容を主に参考にしています。

モデルのダウンロード

ubuntuの場合

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の場合

  1. ソースコードをダウンロード keras-yolo3からダウンロード(code→Download zip通すとダウンロードできます)し解凍する。ここではC:\test\に解凍したとする。
  2. 重みをダウンロード 重みからダウンロード。(クリックしただけでダウンロードが始まります)
  3. yolov3.weightsをC:\test\keras-yolo3-masterに移動させる。
  4. kerasようにモデルをconvert
    1. anaconda promptから必要なものをインストールしたanaconda仮想環境に入る。
    2. C:\test\keras-yolo3-masterに移動する。例 cd C:\test\keras-yolo3-master
    3. 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など)を認識する
1. このページを参考に変更を行う
(行わないと AttributeError: 'NoneType' object has no attribute '__array_interface__'となります)

2. jpgファイルなどを認識する場合結果のウィンドウが一瞬で閉じてしまうので最後のcv2.destroyAllWindows()をする前にtime.sleepなどで停止する。(強引ですが…)
3. 以下のコマンドで起動する

demo
python yolo_video.py --model_path=model_data/yolo_weights.h5 --input=[ファイルのパス]

方法2. webカメラで撮影した画像を認識する
1. webカメラを接続する。
2. 以下のコマンドで起動する

demo
#カメラ番号は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のバージョン)

自前のデータを用いる

  1. データの画像を集める
  2. VoTTでアノテーションデータを作成するを参考に、アノテーションデータを作成する。(今回はデータの画像はjpgのものを使用しています。
    • ここでproviderをPascal VOCにし、テストとトレーニング分割はすべて(100%)trainにしました。
      (keras-yolo3の学習においてはtrainしか用いないようなので)
      (また確認をwebカメラで行ったのでテストデータは不要かなと考えています)
  3. keras-yolo3(またはkeras-yolo3-master)ディレクトリ以下にVOCdevkit/VOC2007を作成する。
  4. [任意の名前]-PascalVOC-exportの中身をそのままVOC2007内部にコピペする。
  5. VOCdevkit/VOC2007/ImageSets/Main内にクラスごとにファイルができている。これらのファイルは画像名と,1と-1で画像中にそのクラスが含まれているのかを表している(?)。ここでは画像名のみあればよいので1つのみ残してtrain.txtと名前を付け保存する。それ以外は削除してよい。またファイル中の各行末の1,-1と.jpgをすべて削除する。(行末の1は1(半角スペースと1を空白に一括置換するとよいです))
  6. voc_annotation.pyを以下のように編集する
    1. 4行目をsets=[('2007', 'train')]
    2. 6行目classesを自分の使いたいクラスに(じゃんけんの例:classes = ["gu","tyoki","pa"](VoTTでつけたタグのこと))
    3. 21行目をそれぞれ一度floatにキャストする。int(float(xmlbox.find('xmin').text))など
  7. python voc_annotation.pyを実行する。
  8. keras-yolo3(またはkeras-yolo3-master) 内部に2007_train.txtができる。
  9. model_data/voc_classes.txtをコピーして、my_classes.txtを作り、クラスを書く(gu,tyoki,paなど)
  10. train.pyを以下のように編集する
    1. 17行目をannotation_path = '2007_train.txt'
    2. 19行目を classes_path = 'model_data/my_classes.txt’
    3. 57行目と76行目の“batch_size”を32から8にする。(これはGPUのメモリが不足するため(?)でエラーが起こらなければ32のままでもよく逆にエラーが出るなら4に下げるといいかもしれません)
  11. python train.pyで学習→重みがlogs/000/trained_weights_final.h5にできる (AttributeError: module 'keras.backend' has no attribute 'control_flow_ops'と出る場合は参考のようにして解決できます。)(kerasのバージョンによるらしい)
  12. 認識の実行
    1. webカメラを接続する
    2. 以下を実行する
python yolo_video.py --model_path=logs/000/trained_weights_final.h5 --classes_path=model_data/my_classes.txt --input=[カメラ番号]
1
1
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1