ブログ名

AIで室内の人間をカウントする研究記録⑦

概要

前回はkeras-YOLOv3で独自データを用いた学習を行う方法を紹介しましたが、今回は学習済みモデルのファインチューニングを行う方法をご紹介します。

ファインチューニングとは?

ファインチューニングとは既存の学習済みモデルの重みデータを一部再学習して、新しいタスクにも適合できるようにすることをいいます。
前回ご紹介した通常の学習を行う方法では、相当な枚数の学習データがなければ精度を上げることが難しいですが、ファインチューニングでは少ないデータ数でも精度を上げることが出来ます。

特に、本研究の目標の一つである「白黒画像からの検出精度を高める」について、白黒画像で学習を行えば白黒画像からの検出精度が上がるということがAIで店舗内の人間をカウントする研究記録3の研究で分かっています。
そのため、白黒画像でYOLOv3の学習済みモデルのファインチューニングを行うことで、白黒画像から検出を行うというタスクにも適合させるといったことが出来ます。

keras-YOLOv3でのファインチューニング方法

keras-YOLOv3にはファインチューニングを行うことが出来る、train_bottleneck.pyというプログラムが同梱されています。

train_bottleneck.pyでは既存のモデルに対して、最初のステージで最後のレイヤーのみ重みを再計算し、次のステージでレイヤーの凍結を解除して全体の再計算を行うというものです。
最初のステージでは、最後から2番目のレイヤーの出力を事前に計算してから該当レイヤーの再計算を行うので、とても速いスピードで学習を行うことができます。

train_bottleneck.pyの実行

使い方は前回紹介したtrain.pyとほとんど変わりません。
学習データであるアノテーションファイルのパスとクラスファイルのパスを指定さえすればokです。
また、weights_pathのパスを変えると、チューニング元のモデルを変えることが出来ます。
もちろん、エポックやバッチサイズなどを調整することもできます。

def _main():
    annotation_path = 'train.txt' # 変更
    log_dir = 'logs/000/'
    classes_path = 'model_data/coco_classes.txt' # 変更
    anchors_path = 'model_data/yolo_anchors.txt'
    class_names = get_classes(classes_path)
    num_classes = len(class_names)
    anchors = get_anchors(anchors_path)

    input_shape = (416,416) # multiple of 32, hw

    model, bottleneck_model, last_layer_model = create_model(input_shape, anchors, num_classes,
            freeze_body=2, weights_path='model_data/yolo_weights.h5') # weights_pathを適宜変更

以上までの設定が終わったら実行します。

実行すると、初めにbottlenecks.npzというファイルが生成されます。
これはファインチューニングを行うための設計書のようなもので、これに従って学習が行われます。
プログラムファイルと同じディレクトリに”bottlenecks.npz”が無ければ自動生成され、あれば生成されずにそれに従って学習が進められます。
新たな設定でファインチューニンングを行う際は、その都度bottlenecks.npzファイルを削除して実行をしてください。

学習が終わると、"trained_weights_finel.h5"という名前で最終モデルが保存されます。
このモデルは"log_dir"に指定された場所に保存されるので、今回の場合logs/000/に保存されます。

実際に検出してみた

ファインチューニング前 f:id:shizuuuka0202:20200116225125j:plain ファインチューニング後 f:id:shizuuuka0202:20200116225149j:plain 無事精度を上げることが出来ました。

次回

学習実行時のパラメータ設定について解説していきます。


前の記事へ

目次へ戻る