概要

人工知能を使って、自分の顔を見る「顔ロボット」を製作しました。
ディープラーニングの物体検出(YOLOv3)に独自データを学習させました。独自データは、自分の顔です(独自データで1クラスを学習する場合)。その後、自分の顔と、ロボットプロジェクトのメンバー3名の顔の合計4クラスで学習しました(独自データで4クラスを学習する場合)。
顔ロボットの左目にカメラを組み込んでいます。カメラ映像からリアルタイムで物体(自分の顔)を検出します。検出された物体(自分の顔)に向かってロボットの顔が追従します。追従する目標は、私以外に、学習済みの3名の顔でも可能です。

動画

自分の顔を見る顔ロボット(ディープラーニング)

説明

環境

Windows 10 Pro  OMEN by HP 15 Corei7-8750H 16GB GeForce GTX1070 with Max-Q Design(8GB)

手順(独自データで1クラスを学習する場合)

1.自分の写真を250枚ほど撮影しました。画像サイズは624 x 416に縮小しました。

2.アノテーション

1)アノテーションツール BBoX-Label-Tool を使って、顔の位置にバウンディングボックスとラベルをつけました。
BBoX-Label-Toolでラベルづけの画像

BBoX-Label-Toolでラベルづけ(BBoX-Label-ToolはPython3で動くように修正して使いました。)

(注意)自分の写真250枚と、他人の写真を合わせて750枚くらいを使いました。
(自分の写真だけだと、自分と他人が区別できないという結果になりましたので一度やり直しました。)

2)フォーマットを変換します。

BBox Label Tool で出力されるフォーマット

[category number(1~)]
[bounding box left X] [bounding box top Y] [bounding box right X] [bounding box bottom Y]

1
187 49 344 238

YOLO用のフォーマット

[object-class(0~)] [x_center] [y_center] [width] [height]

上の例のBBox Label Tool で出力された値をYOLOのフォーマットに換算する

0 (187+344)/2/624 (49+238)/2/416 (344-187)/624 (238-49)/416

計算結果

P1000254s.txt・・・画像ファイルP1000254s.jpgに対応している

0 0.4254807692307692 0.3449519230769231 0.2516025641025641 0.45432692307692313

 

3.設定ファイルの修正は、darknet公式手順の通りに行いました。

darknet  How to train (to detect your custom objects):

yolo-obj.cfg

batch=64
#subdivisions=8(8ではエラーが出た)
subdivisions=16

classes=1 #610、696、783行
filters=18 #603、689、776行

フィルタの計算式 filters = (classes + 5) x 3 = (1+5) x 3 = 18

obj.names

sakamoto

obj.data

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

train.txt・・・画像ファイル名の一覧

data/obj/P1000254s.JPG
data/obj/P1000255s.JPG
data/obj/P1000260s.JPG
data/obj/P1000261s.JPG
data/obj/P1000262s.JPG
 以下省略

 

4.学習
学習させます。

darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74

4800イテレーションで8時間かかりました。(darknet公式によると、1クラス当たり2000イテレーションで4000以上とのこと。)

4800: 0.007190, 0.018359 avg loss

学習中の平均損失のグラフの画像

学習中の平均損失のグラフ

 

5.実行
webカメラでリアルタイム物体検出を実行します。

darknet.exe detector demo data/obj.data yolo-obj.cfg yolo-obj_4800.weights -c 1

独自データで4クラスを学習する場合

その後、自分の顔と、ロボットプロジェクトのメンバー3名の顔の合計4クラスで学習しました。

手順は上と同じです。4クラスに変更するに当たり変更した箇所です。

yolo-obj.cfg 4クラスに変更

batch=64 #subdivisions=8(8ではエラーが出た)
subdivisions=16
classes=4 #610、696、783行
filters=27 #603、689、776行

フィルタの計算式 filters = (classes + 5) x 3 = (4+5) x 3 = 27

obj.names クラスのラベルを4つに変更

sakamoto
kanemasu
miki
nisizaki

obj.data 4クラスに変更

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

train.txt 画像データに合わせて変更

学習には、8300イテレーションで13時間かかりました。(darknet公式によると、1クラス当たり2000イテレーションで4000以上とのこと。)

8300: 0.010128, 0.014646 avg loss