概要
人工知能を使って、自分の顔を見る「顔ロボット」を製作しました。
ディープラーニングの物体検出(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は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