keras-yolo3を使ってYOLOv3とtinyYOLOv3を軽く実装
以下のリンクのkeras-yolo3実装方法を簡単に書いていきます。
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
また、GPU(NVIDIA社製)を使用する場合は、CUDAやcuDNN等のインストールが必要になります。
なお、ここではそれぞれのインストール方法等は省略します。
まずはgitからcloneします。。
keras-yolo3に移動する。
cd keras-yolo3 |
2. 学習済みモデルの準備
次にyolov3のdarknetでの学習済みモデルをダウンロードします。
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を入力する。
実際に下のような画像が出てくる。
4. tinyYOLOv3の実行
tinyモデルはyolo-v3の計算が少ないモデルなので、cpuでも使いやすい。
まず学習済みモデルをダウンロードする。
これを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を入力すると結果が出力される。
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のアノテーションが上で説明したようなフォーマットになっていることが分かる。
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 |