ここでは、物体認識の機械学習モデル (darknet YOLO v2形式) の作成方法を、以下の手順で説明します。

  1. 画像データの収集
  2. 学習データの作成
  3. 機械学習モデルの作成

補足資料:LabelImg によるアノテーションデータ作成

画像データの収集

物体認識の機械学習データに用いる、画像データを以下の手順で準備します。

1. PC上の作業フォルダ内に、画像格納用のフォルダを新規作成しimagesと名付けます。

2. 認識する物体が含まれる画像データを準備し、imagesフォルダの配下に置きます。
その際、以下の点にご注意ください。
・画像ファイルフォーマットはJPEGにし、拡張子を「.jpg」に統一してください。
   (.jpegや.pngなどの異なる拡張子が混在すると、学習時にエラーが発生します)
・画像サイズは416×416ピクセル以上が望ましいです。
・画像枚数は認識する物体ごとに、数百枚~数千枚程度が目安です。
・1画像あたりのファイルサイズを300~500KB程度に調整すると、処理がスムーズに進みます。
・ファイル名を「英数表記+連番」にすることで、管理が便利になります。
  例: image001.jpg, image002.jpg, …

学習データの作成

学習データは、(1)準備した画像データ、(2)クラス情報データ(認識する物体の名称リスト)、および(3)各画像に対するアノテーションデータ(認識する物体の画像内の矩形領域を示した注釈情報)の3つで構成されます。クラス情報データとアノテーションデータは、以下の手順で追加します。

1. クラス情報データは、認識する物体の名称リストです。テキストエディタでファイルを新規作成し、認識する項目を各行に1つずつ記載します。例えば、person, dog, cat の3つを認識する学習モデルを構築する場合、各行にそのラベルを記載します。この記載順で、認識する物体の識別子は、先頭行を0として、通し番号で割り当てられます。(person=0, dog=1, cat=2となります)

2, クラス情報データのファイル編集を完了し保存します。ファイル名称は任意に決めることができますが、ここでは、imagesフォルダと同じPC上の作業フォルダ配下に、obj.names という名称にします。

3. 次に、PC上の作業フォルダ内に、アノテーションデータファイル格納用のフォルダを新規作成し、labelsと名付けます。作業フォルダ直下は以下のようになります。

4. images フォルダ配下の各画像に含まれる物体に対して、アノテーションを付加します。各物体のアノテーションは、矩形領域で表現します。以下の写真1では「person」のアノテーションを図示しています。

実際には、アノテーションデータはlabelsフォルダ配下に、テキストファイル形式で保存します。その際、対応する画像データのファイル名の拡張子.jpgを.txtに変換した名称で保存する必要があります。

アノテーションデータファイルには、各行に1つの物体についてのアノテーションデータとして、物体の識別子(数字)、矩形領域の中心点の座標(x,y)、およびサイズ (w,h) の情報を記載します。

 図1の1行目は、識別子0 (=person)、(x,y)=(0.221543, 0.712291), (w,h)=(0.166489, 0.532322) を表現しています。認識する物体の矩形領域の座標(x,y)、およびサイズ(w,h)は、画像全体との比で表現し、値は0以上1以下の範囲となります。

GUIで、アノテーションを画像に付加するツールとして、以下のものが公開されています(英語)。詳細は本ドキュメント最後に記載しています、「補足資料:LabelImgによるアノテーションデータ作成」をご参照ください。

名称  :LabelImg
概要  :Widows, Mac等マルチプラットフォームで動作するアノテーションデータ作成ツール。
入手先 :https://github.com/tzutalin/labelImg

機械学習モデルの作成

学習モデルを以下のステップで作成します。

1. darknet の準備

学習モデルを作成するコンピュータのターミナル環境で、以下の手順により、darknet環境を構築します。

$ git clone https://github.com/pjreddie/darknet
$ cd darkent
$ make

GPU環境(CUDA環境)で学習環境を構築する場合は、最後のmakeコマンドを実行する前に darknet/Makefile を編集し、先頭行を GPU=1 と設定します。

2. 初回時の学習用に、学習済の重みデータを、以下の場所から取得します。

$ wget https://pjreddie.com/media/files/darknet19_448.conv.23

3. 学習データを設置します。

$ cd data
$ mkdir learning_data (任意のフォルダ)

「1.画像データの収集」、「2.学習データの作成」で準備した画像データ、アノテーションデータ、クラス情報データを以下のように配置します。

darknet/data/learning_data/images/*.jpg
darknet/data/learning_data/labels/*.txt
darknet/data/learning_data/obj.names

4. 学習用データリスト、検証用データリストを準備します。

darknet/data/learning_data/train.txt
darknet/data/learning_data/test.txt

各々、学習するデータ、検証するデータの一覧を各行に記載します。train.txt とtest.txt に、ファイル名の重複がないように、以下のように data フォルダ以下のファイルパスを記載します。学習時にはtrain.txtに記載の画像ファイルのみが使用されます。

data/learning_data /images/img001.jpg
data/learning_data /images/img002.jpg
data/learning_data /images/img005.jpg

5. 学習設定ファイルを準備します。

darknet/cfg/obj.data を新規作成し、以下のように記載します。classesの値は、認識させたい物体の数を記載します。

classes= 3
train = data/learning_data/train.txt
valid = data/learning_data/test.txt
names = data/learning_data/obj.names
backup = backup

6. モデル設定ファイルを準備します。ここではすでに用意されている darknet/cfg/yolov2-voc.cfg の設定ファイルをコピーし、内容を書き換えます。

$ cp darknet/cfg/yolov2-voc.cfg darknet/cfg/obj.cfg

新しくできた obj.cfg を、以下のように調整します。Filters の値は、クラス数が 3 の場合は、40 となります。((3+5)*5 = 40)

3行目:batch=64 4行目:subdivisions=8 237行目:filters=(実際に認識させるクラス数 + 5) * 5  242行目:anchors (※) 244行目:classes=3 (実際に認識させるクラス数)

(※)anchors については、そのままの値でも学習を進めることができますが、以下のようなツールにより、anchors の値を再計算することで、精度向上する場合があります。

参考:anchors値の再計算ツール
https://github.com/Jumabek/darknet_scripts

7. 学習開始

darkent フォルダで、以下を実行すると、darknet/backup/フォルダの下に、学習モデルデータ(*.weights)が生成されます。

$ ./darknet detector train cfg/obj.data cfg/obj.cfg darknet19_448.conv.23

学習が開始すると、以下のような出力が繰り返し出力されます。


Region Avg IOU: 0.905463, Class: 0.626457, Obj: 0.836158, No Obj: 0.006927, Avg Recall: 1.000000, count: 8
Region Avg IOU: 0.837368, Class: 0.976554, Obj: 0.842887, No Obj: 0.006556, Avg Recall: 1.000000, count: 8
Region Avg IOU: 0.893971, Class: 0.960798, Obj: 0.876742, No Obj: 0.007555, Avg Recall: 1.000000, count: 8
Region Avg IOU: 0.872773, Class: 0.711470, Obj: 0.888209, No Obj: 0.006718, Avg Recall: 1.000000, count: 8
Region Avg IOU: 0.894234, Class: 0.986793, Obj: 0.884681, No Obj: 0.006898, Avg Recall: 1.000000, count: 8
Region Avg IOU: 0.847557, Class: 0.994500, Obj: 0.849292, No Obj: 0.006747, Avg Recall: 1.000000, count: 8
Region Avg IOU: 0.802273, Class: 0.650419, Obj: 0.794552, No Obj: 0.006926, Avg Recall: 1.000000, count: 8
Region Avg IOU: 0.866342, Class: 0.840821, Obj: 0.860806, No Obj: 0.006149, Avg Recall: 1.000000, count: 8
9531: 0.661146, 0.704077 avg, 0.001000 rate, 2.704480 seconds, 609984 images

最後の行の先頭の数字(赤字で示しています)は、ステップ数を表しています。学習が進むと誤差の平均値(青字で示しています)が小さな値になります。

学習は、任意のタイミングで停止できますが、精度が高い認識モデル作成を行うためには、誤差の平均値は1未満となることが目安になります。また、数万ステップ以上が必要となる場合もあり、動作環境によっては、完了までに数日から数週間が必要となる場合があります。

8. 学習の再開

学習の再開は、以下のように行います。backupフォルダの配下には、拡張子が .backup もしくは .weights という名称のファイルが多数生成されます。いずれかのファイルで、最新のもの(通常は、.backupの拡張子のもの)を指定すると、最後に保存された学習モデルを使用して、学習を再開できます。

$ ./darknet detector train cfg/obj.data cfg/obj.cfg backup/(backupフォルダ配下の最新のファイル名)

以上の手順の結果、学習完了後には、以下の3つのファイルを利用することができます。

darknet/backup/*.weights (*印部分は、backupフォルダ配下に生成されるの最新のファイル名を指定)
darknet/cfg/obj.cfg,
darknet/cfg/obj.names

フィードバック

お役に立ちましたか?

はい いいえ
お役に立ちましたか
理由をお聞かせください
フィードバックありがとうございました

このトピックへフィードバック

送信