ココアのお勉強ブログ

技術職の一般人です。趣味でコード書いたりソフト触ったり。

keras-yolo3を使ってYOLOv3とtinyYOLOv3を軽く実装

以下のリンクのkeras-yolo3実装方法を簡単に書いていきます。

github.com

 

1. 事前準備

事前に以下のアプリ/モジュールをインストールしておく必要があります。 

  • Python3
  • numpy==1.15.1
  • Pillow==5.3.0
  • scipy==1.1.0
  • tensorflow-gpu==1.11.0
  • keras==2.2.4
  • seaborn==0.9.0
  • opencv==3.4.1

また、GPUNVIDIA社製)を使用する場合は、CUDAやcuDNN等のインストールが必要になります。

なお、ここではそれぞれのインストール方法等は省略します。

まずはgitからcloneします。。

git clone https://github.com/qqwweee/keras-yolo3.git

 

keras-yolo3に移動する。

cd keras-yolo3

 

2. 学習済みモデルの準備

次にyolov3のdarknetでの学習済みモデルをダウンロードします。

https://pjreddie.com/media/files/yolov3.weights

yolov3.weightsはkeras-yolo3/に置きます。

 

これをkeras用にコンバートします。

python convert.py -w yolov3.cfg yolov3.weights model_data/yolo_weights.h5

 

 

3. yolo.pyの実行

yolo.pyの最後に以下のコードを追加する。

def detect_img(yolo):

    img = input('Input image filename:')

    try:

         image = Image.open(img)

    except:

          print('Open Error! Try again!')

    else:

        r_image = yolo.detect_image(image)

        print(type(r_image))

        import cv2

        cv2.imwrite("out.jpg", np.asarray(r_image)[..., ::-1])

        r_image.show()

 

if __name__ == '__main__':

    detect_img(YOLO())

 

コマンドでyolo.pyを実行する。

python yolo.py

入力画像のファイル名が求められるので入力する。

今回は以下の馬、人、犬が含まれる画像(person.jpg)を用いた。

person.jpgを入力する。

f:id:hotcocoastudy:20190213000544p:plain

person.jpg

f:id:hotcocoastudy:20190213000635p:plain

実際に下のような画像が出てくる。

f:id:hotcocoastudy:20190213000701p:plain

検出結果(YOLOv3)

 

4. tinyYOLOv3の実行

tinyモデルはyolo-v3の計算が少ないモデルなので、cpuでも使いやすい。

まず学習済みモデルをダウンロードする。

https://pjreddie.com/media/files/yolov3-tiny.weights

 

これをkeras用にコンバートする。

python convert.py yolov3-tiny.cfg yolov3-tiny.weights model_data/tiny_yolo_weights.h5

 

yolo.py をコピーして yolo_tiny.py という名前にします。27、28行目を以下のように変更します。

"model_path": 'model_data/tiny_yolo_weights.h5',

"anchors_path": 'model_data/tiny_yolo_anchors.txt',

 

yolo_tiny.pyを実行する。

python yolo_tiny.py

 

先ほどと同様person.jpgを入力すると結果が出力される。

f:id:hotcocoastudy:20190213000828p:plain

検出結果(tinyYOLOv3)

tinyだと若干精度が悪くなるが早い。

 

 

5. YOLOv3学習(PASCLA VOC2007)

データセットは元画像(〇〇.jpg)とアノテーションファイル(train.txt)があれば良い。

アノテーションファイルのフォーマットは

path/to/img1.jpg 50,100,150,200,0 30,50,200,120,3

path/to/img2.jpg 120,300,250,600,2

のように「画像パス」と、その「座標(top, left, bottom, right)」、「クラスID」を入れます。

 

今回はデータセットとしてpascal voc 2007を利用する。

http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar

http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar

 

vocを利用する場合voc_annotation.pyを実行する。

python voc_annotation.py

すると「2007_train.txt」、「2007_val.txt」、「2007_test.txt」が作られるので、「2007_train.txt」の名前だけ「train.txt」に修正する。

 

Vocのアノテーションが上で説明したようなフォーマットになっていることが分かる。

 

f:id:hotcocoastudy:20190213000957p:plain

Vocのアノテーション

train.pyのバッチサイズ(batch_size)とエポック数(epochs)を設定します。

デフォルト値でも実行できますが、処理が重い際は調整して下さい。

train.pyを実行すると学習が始まります。

python train.py

学習が終わると「trained_weights_stage_1.h5」と「trained_weights_final.h5」がlog/000/に生成されます。

後者のほうがよく学習できているファイルです。

 

学習したh5ファイルで物体検出を行いたい場合、

「trained_weights_final.h5」をmodel_data/に移動させ、

yolo.pyの23行目"model_path"部分を

"model_path": 'model_data/ trained_weights_final.h5'

と書きかえます。

 

クラスラベルを指定します。yolo.pyの25行目を

classes_path = 'model_data/voc_classes.txt'

と書きかえVOC用のラベルを指定します。

 

そしてyolo.pyを実行することで自分で用意したh5ファイルで学習を行うことができます。

python yolo.py

 

6. tinyYOLOv3学習(PASCLA VOC2007)

tinyYOLOv3を使用するには、train.pyの20行目を

anchors_path = 'model_data/tiny_yolo_anchors.txt'

と書きかえてtrain.pyを実行すると学習できます。

 

YOLOv3の時同様「trained_weights_final.h5」をmodel_data/に移動させ、

yolo.pyの23~25行部分を

"model_path": 'model_data/ trained_weights_final.h5'

"anchors_path": 'model_data/tiny_yolo_anchors.txt',

"classes_path": 'model_data/voc_classes.txt',

と書きかえます。

 

そしてyolo.pyを実行することで自分で用意したh5ファイルで学習を行うことができます。

python yolo.py

 

f:id:hotcocoastudy:20190213001608p:plain

学習させたファイルを用いた検出結果(tinyYOLOv3)