令和6(2024)年度・課題研究の指導のための予備実験
AIモデル「MobileNet-SSD」の転移学習による「人物の顔検知(複数人)」
使用機材 | Xavier NX AI-Computer(Nvidia) |
OS | Ubuntu 18.04 |
作業フォルダ | jetson-inference/python/training/detection/ssd/ |
データセット | tochiko |
■ 事前準備1 docker の起動
<作業エリアに移動>
cd ~/jetson-inference |
<「docker」の起動>(管理者パスワードが必要)
docker/run.sh | 以後、管理者としての作業になるので要注意! |
■ 事前準備2 作業ディレクトリの作成(作成後、アクセス権を775に設定する)
データ用 | /data/tochiko |
モデル用 | /models/tochiko |
■ 事前準備3 「labels.txt」の作成
ラベルファイル(学習用) data/tochiko/labels.txt |
カテゴリ数は、5個とする。
対象 | ラベル名 | |
1 | 生徒A | studentA |
2 | 生徒B | studentB |
3 | 生徒C | studentC |
4 | 教師A | teacherA |
5 | 教師B | teacherB |
背景(PC室) | background |
data/tochiko/labels.txt の内容
studentA studentB studentC teacherA teacherB (background) |
■ 画像キャプチャソフト「camera-capture」の起動
<作業エリアに移動>
cd ~/jetson-inference/python/trainig/detection/ssd |
<「camera-capture」の起動>
camera-capture /dev/video0 |
■ 「camera-capture」の使い方
<項目設定>(Data Capture Control)
項目名 | 設定値 | 操作 | 備考 |
Dataset Type | Detection | に変更 | |
Dataset Path | data/tochiko | を選択 | |
Class Labels | tochiko/labels.txt | を選択 | |
Current Set | train val test | の中から一つ選択 | |
Current Class | |||
JPEG Quality | 90 | 画質を調節 |
また、「Save on Unfeeze」や「Clear on Unfeeze」のチェックをはずす
<撮影の仕方>
下記の動作を繰り返す、その際、訓練・評価・試験の切り替えや、ラベル名の設定を変更する
番号 | 動作 | 備考 |
1 | カメラを対象に向ける | |
2 | 「feeze」ボタンを押す | |
3 | トリミングを行う | |
4 | 「save」ボタンを押す |
■ 転移学習のためのデータセットは、訓練用、評価用、試験用を準備する。
camera-capture を使用した場合のディレクトリ構造
分類 | ディレクトリ | ファイル | 意味・内容 |
モデル | models/tochiko/ | labels.txt | ラベルファイル |
データ | data/tochiko/Annotations | [name].xml | アノテーションファイル ・画像ファイル名 ・データセット ・ラベル名 ・切り取り情報 |
data/tochiko/ImageSets/Main | test.txt | 試験用の画像ファイル名 | |
train.txt | 訓練用の画像ファイル名 | ||
trainval.txt | 訓練評価用の画像ファイル名 | ||
val.txt | 評価用の画像ファイル名 | ||
data/tochiko/JPEGImages | [name].jpg | 全ての画像ファイル (切り取り前の原画像) |
目 的 | 格納ディレクトリ(同一場所) | 生徒1 | 生徒2 | 生徒3 | 教師1 | 教師2 | 背景 | 計 |
訓練用 | data/tochiko/JPEGImages | 23 | 26 | 20 | 23 | 30 | 31 | 153 |
評価用 | data/tochiko/JPEGImages | 4 | 4 | 4 | 4 | 4 | 4 | 24 |
試験用 | data/tochiko/JPEGImages | 4 | 4 | 4 | 4 | 4 | 4 | 24 |
合 計 | 31 | 34 | 28 | 31 | 38 | 39 | 201 |
■ 転移学習のコマンド
作業 | 転移学習 | Transfer Learning with PyTorch |
分野 | 物体検知 | Object Detection |
AIモデル | MobileNet-SSD | 高速な物体検知が可能 高い認識性能&軽量モデル |
データセット | tochiko | data/tochiko(オリジナル) |
camera-capture 使用時の 学習コマンド | python3 train_ssd.py | – – dataset-type=voc ※1 – – data=data/tochiko – – model-dir=models/tochiko – – epochs=30 |
※1 camera-capture を使用した場合の、データセット・タイプ
■ 学習済みデータの変換・転送のコマンド
作業 | 学習済みデータの onnx への転送 | ssd-mobilenet.onnx (for TensorRT ※2) |
転送コマンド | python3 onnx_export.py | – – model-dir=models/tochiko |
※2 学習したデータを「AI-Computer」で処理できるように変換・転送する
<学習結果の有効な利用法>
学習の結果は、各 Epoch 毎に、ファイルに保存される。保存されるファイル名には、学習の成果である「Loss 値」がファイル名に含まれる。従って、転送前に、一番学習結果の良い(Loss値の低い)ファイルを残して、それ以外は、消去する方法も考えられる。
■ 推論結果の格納ディレクトリ(基本的には不要)
入出力 | ディレクトリ |
入力用 | /data/tochiko/Input/ |
出力用 | /data/tochiko/Output/ |
■ 転移学習して作られた新たなモデルによる、推論のコマンド
作業 | 推論 | |
分野 | 物体検知 | Object Detection |
学習済みデータ | ssd-mobilenet.onnx | |
推論コマンド | detectnet | – – model=models/tochiko /ssd-mobilenet.onnx – – labels=models/tochiko/labels.txt ※3 – – input-blob=input_0 – – output-cvg=scores – – output-bbox=boxes |
標準入力(ビデオ) | 入力:/dev/video0 | 出力:画面表示 |
入出力データ | 入力:data/tochiko/ Input/*.jpg | 出力:data/tochiko/ Output/ |
※3 ラベルファイル(推論用) models/tochiko/labels.txt の内容に注意!
学習 | 表示用ラベル | 適用 |
〇 〇 〇 〇 〇 △ | BACKGROUND(BG) studentA studentB studentC teacherA teacherB PCroom | 無検出用(自動で追加される):置き換え 生徒A 生徒B 生徒C 教師A 教師B 背景(PC室):置き換え |
■ 認識の結果
結論から言うと、最初は、検出が上手くできなかった。
下記に示すような対策が必要と考えられる。
No. | 具体的な対策 | 対応状況 |
1 | models/tochiko/labels.txtに、 backgroundを追加 | 済み |
2 | 「背景映像(PC室)」を加えて学習する | 済み |
3 | 人物画像の撮影での工夫 ・撮影角度の固定 ・撮影大きさの統一 | 今後 |
4 | 個人の特徴が現れるような撮影に気を遣う | 今後 |
今回のモデルの特徴、学習の経緯
今回のモデルは、もともと、「画像・分類」を行うことからスタートしました。従って、学習用の画像は、デジタルカメラで撮影したものです。これらの画像を、通常の「分類の学習」を行って、「人物」を認識させようと考えていました。しかし、まったく認識できませんでした。 まず、撮影した画像は、「背景」を含めて「全身」の画像だったことが、原因であると思われます。画像の特性上、分類の学習では、「人物の特徴」を学習できなかったことが考えられます。また、分類という学習方法が、認識に適さなかったと思われます。 そこで、写真内の人物の「顔」だけを抽出して認識させようとしましたが、結局、「画像・分類」では無理であることに気付きました。「物体・検出」が適していることはわかっていましたが、当時のわたしには、「物体・検出」の学習の技術が無かったので、あきらめていました。 |
その後、「物体・検出」の学習方法も習得して、これらのデータを用いた、「顔」の検出をやってみたいと思いました。それが、今回のモデルとなります。結論から言うと、残念ながらあまり上手くはいきませんでした。理由についてお話したいと思います。 すこし、技術的なお話になります。 一般的に、「物体・検出」の際は、「camera-capture」というアプリケーションを使用して、学習用に適した形式のデータを作成します。この形式のデータを使った場合、撮影の「こつ」さえ分かれば、非常に正確に検出できます。 しかしながら、今回の場合は、通常のデジカメの画像から、「camera-capture」で生成される「voc形式」のデータを手作業で作成しました。その手作業自体には何の問題もないのですが、さきほど触れた、撮影の「こつ」が考慮されていないため、検出が上手く機能しませんでした。 具体的には、撮影データの規格(大きさ、向き)を合わせることが重要です。そのことにより、物体の特徴を学習しやすくなります。 |