顔写真を8名に分類するタスクで分類モデルの精度と学習所要時間を検証した。
短時間で学習できること、少数の学習データでも高い精度で分類できることが確認された。
顔写真から人を特定するタスク
下記8名の写真をYahoo!画像検索で収集し顔の部分を切り出して作成した、8クラス292枚の顔写真を用いる。データセットそのものは、肖像権と著作権の問題から公開しない。
0 武井咲
1 中越典子
2 ケンドーコバヤシ
3 伊原剛志
4 小蜜
5 照英
6 壇蜜
7 木村祐一また、分類対象とする8名の画像は特徴量抽出器の学習に使ったデータセットには含まれていない。
分類器はノード50個の中間層を持つ多層パーセプトロンとする。
学習済みの画像特徴量抽出器を切り替えて検証を行う。
- 1
- データセットを 訓練データ:評価データ = 7:3 の割合でランダムに振り分け、訓練データのみで学習させる。
- 学習した識別モデルの、評価データに対する正答率を確認する。
- 学習と評価を30epoch実施するのにかかった時間を計測する。
- 2
- 検証項目1の訓練データと評価データを逆転させて同様の検証を行い、訓練データが少ない場合の識別性能を確認する。
比較のため、v1のCNN再学習による精度と速度も掲載する。chainerのバージョンが変わったためv1モデルの精度も再計測したところ、v1作成時の報告よりも精度が向上した。chainer自体の改善によるものと思われるが、具体的な理由は不明。
| 項目 | 値 |
|---|---|
| CPU | Ryzen 1700 |
| Memory | 16GB |
| Disk | M.2 SSD 256GB |
| OS | Ubuntu 16.04 |
| Cuda | 8.0 |
| Python | 3.5.2 |
| chainer | 3.2.0 |
| cupy | 2.2.0 |
CPUは8Core16Threadのモデルであるが、環境変数OMP_NUM_THREADS=1を設定して1Threadのみ使用した。
| 特徴量抽出器 | 精度(%) | 学習時間(秒) |
|---|---|---|
| V_10 | 96.2 | 11.4 |
| V_12 | 92.5 | 11.6 |
| V_16 | 98.7 | 12.6 |
| V_20 | 98.7 | 13.7 |
| V2_12 | 95.0 | 14.4 |
| V2_16 | 96.2 | 16.8 |
| V2_20 | 97.5 | 19.7 |
| 備考: v1 A_16再学習 | 86.1 | 120.3 |
| 備考: v1 I2_24再学習 | 83.3 | 148.1 |
| 特徴量抽出器 | 精度(%) | 学習時間(秒) |
|---|---|---|
| V_10 | 86.3 | 5.9 |
| V_12 | 85.0 | 6.4 |
| V_16 | 88.6 | 7.3 |
| V_20 | 85.4 | 8.3 |
| V2_12 | 84.0 | 8.8 |
| V2_16 | 88.6 | 11.3 |
| V2_20 | 91.8 | 14.1 |
| 備考: v1 A_16再学習 | 62.2 | 106.4 |
| 備考: v1 I2_24再学習 | 71.3 | 149.1 |
パラメータを増やすことは学習時間の増加に直結するが、必ずしも特徴量抽出器としての性能に繋がるわけではないことが分かった。
速度と精度のバランスを求めるならV_16を、精度を再優先するならV2_20を選択するのが良いと思われる。
v1と比べると精度・速度ともに大幅に改善している。
Raspberry Pi上での学習速度はまだ計測していない。v1時には1人あたり訓練画像9枚、評価画像なしでA_16を30epoch再学習するのに1人あたり50秒程度の所要時間だった。単純に比例計算すれば、今回のモデルでは1人あたり10秒以下で学習が完了することが期待できる。
特徴量抽出器の学習(v1の事前学習)に用いた120クラス16576枚のデータを訓練8:評価2で分割し
- 学習所要時間: 200epoch学習・評価するのにかかった時間
- 精度: 評価データに対する識別精度の最高値
- モデルサイズ: 学習結果としてに出力されるnpzファイルのサイズ
を比較した。また、評価データから10枚の画像をランダムに選び、1枚ずつ推論するのにかかった時間を計測し、平均値を推論所要時間とした。
なお、学習にはGPU(Geforce GTX 1070)を、推論にはCPUを1Coreのみ使用(環境変数OMP_NUM_THREADS=1を設定)した。
| モデル | 学習所要時間(秒) | 精度(%) | モデルサイズ(MB) | 推論所要時間(ミリ秒/枚) |
|---|---|---|---|---|
| V_10 | 4166 | 85.7 | 0.19 | 9.28 |
| V_12 | 4168 | 88.4 | 0.26 | 10.41 |
| V_16 | 4140 | 90.5 | 0.43 | 13.56 |
| V_20 | 4128 | 91.5 | 0.65 | 17.21 |
| V2_12 | 4850 | 89.9 | 2.5 | 18.77 |
| V2_16 | 4869 | 91.7 | 4.2 | 26.92 |
| V2_20 | 4843 | 92.0 | 6.5 | 36.42 |
| A_16(v1) | 2761 | 56.3 | 0.66 | 6.29 |
| I2_24(v1) | 8102 | 58.1 | 1.2 | 9.85 |
v1のモデルと比較してv2のモデルは全体的に精度が向上した。基本的にはフィルタ数を増やしたほうが精度が高い。GPUを使用した学習時は並列処理ができるためフィルタ数を増やしても所要時間に変化はないが、CPUを用いた推論はフィルタ数に応じて所要時間が延びる。行列が小さいためか、CPUを複数Core使用しても逆に速度が遅くなり、1Coreに制限した時が最速だった。
Raspberry Pi上での推論速度はまだ計測していない。Raspberry Pi3上で A_16(v1) での推論速度が約0.2秒/枚であったことから、V_16なら0.4秒程度、V2_16でも1秒以内には推論できると期待される。
今回実装したモデルは、2つとも顔写真による人物分類以外のデータセットでも良い性能を示すことが確認されている。