dlibのimglabを使って学習モデルを作った

以下記事の続きです。

https://qiita.com/dafukui/items/5c0946a875caa3184e5e

基本的には以下公式の内容を実行しました。

http://dlib.net/train_object_detector.py.html

結論から書くと以下のようなスクリプトを作成、実行することで学習モデル（.svmファイル）を作成することができました。

```sh
$ python train_object_detector.py faces
```

```python:train_object_detector.py
import os
import sys

import dlib

if len(sys.argv) != 2:
    print("引数漏れ")
    exit()
prefix = sys.argv[1]

test_folder = f"./{prefix}/test"
train_folder = f"./{prefix}/train"


options = dlib.simple_object_detector_training_options()

options.add_left_right_image_flips = False
# trueにするとオブジェクトが左右対称であると想定し、トレーニング画像の左右の反転を追加します。
# これにより、訓練データセットのサイズが2倍になります。

options.C = 5
# トレーナーはサポートベクターマシンの一種であり，通常のSVMのCパラメータを持っています。 一般的に、Cを大きくすると学習データへの適合性が高くなりますが、オーバーフィッティングになる可能性があります。
# 訓練された検出器が、訓練されていない画像のテストセットでどのように動作するかをチェックして、経験的に最適なC値を見つける必要があります。 
# 単に値を5に設定するのではなく、いくつかの異なるC値を試してみて，自分のデータに最も適したものを見つけてください。

options.num_threads = 2
options.be_verbose = True
# 最速のトレーニングのために、あなたのコンピュータのCPUコアの数をコードに伝えてください。

training_xml_path = os.path.join(train_folder, "all.xml")
testing_xml_path = os.path.join(test_folder, "all.xml")
# "all.xml"はdlibのimglabでアノテーションして作ったxmlリストです
# テストデータでもxmlリストが必要です。アノテーションは不要です

dlib.train_simple_object_detector(training_xml_path, f"{prefix}_detector.svm", options)
# 実行プログラムと同じ階層にsvmファイルが出力される。

print("Training accuracy: {}".format(
    dlib.test_simple_object_detector(training_xml_path, f"{prefix}_detector.svm")))
# 訓練データを使って作成した学習モデルをテスト。 このステートメントでは、精度、再現率、そして平均精度を表示します

print("Testing accuracy: {}".format(
    dlib.test_simple_object_detector(testing_xml_path, f"{prefix}_detector.svm")))
# オーバーフィッティングせずに本当に動作しているかどうかを知るために、トレーニングされていない画像をテスト

```

ディレクトリ構造は以下のような形です。

```sh
.
├── faces_detector.svm
├── train_object_detector.py
├── test
│   ├── all.xml
│   ├── image_metadata_stylesheet.xsl
│   ├── me.jpg
│   └── me2.jpg
└── train
    ├── Balloon.jpg
    ├── Girl.jpg
    ├── Lenna.jpg
    ├── all.xml
    └── image_metadata_stylesheet.xsl
```

実行結果

```sh
Training with C: 5
Training with epsilon: 0.01
Training using 2 threads.
Training with sliding window 70 pixels wide by 92 pixels tall.
objective:     10.6719
objective gap: 10.6677
risk:          2.13354
risk gap:      2.13354
num planes:    3
iter:          1

objective:     7.3174
objective gap: 7.26215
risk:          1.45245
risk gap:      1.45243
num planes:    4
iter:          2

objective:     4.393
objective gap: 4.29638
risk:          0.857655
risk gap:      0.859276
num planes:    5
iter:          3

objective:     1.39609
objective gap: 1.27106
risk:          0.252774
risk gap:      0.254212
num planes:    6
iter:          4

objective:     4.72606
objective gap: 4.59817
risk:          0.919644
risk gap:      0.919633
num planes:    7
iter:          5

objective:     2.48008
objective gap: 2.3341
risk:          0.466854
risk gap:      0.46682
num planes:    8
iter:          6

objective:     1.49184
objective gap: 1.33803
risk:          0.267633
risk gap:      0.267606
num planes:    9
iter:          7

objective:     0.906588
objective gap: 0.749118
risk:          0.149864
risk gap:      0.149824
num planes:    10
iter:          8

objective:     0.645909
objective gap: 0.487267
risk:          0.0974875
risk gap:      0.0974534
num planes:    11
iter:          9

objective:     0.584771
objective gap: 0.425368
risk:          0.0851151
risk gap:      0.0850736
num planes:    12
iter:          10

objective:     0.519052
objective gap: 0.359169
risk:          0.0718609
risk gap:      0.0718339
num planes:    13
iter:          11

objective:     0.330373
objective gap: 0.169977
risk:          0.0340573
risk gap:      0.0339953
num planes:    14
iter:          12

objective:     0.308032
objective gap: 0.147416
risk:          0.0295197
risk gap:      0.0294832
num planes:    15
iter:          13

objective:     0.261714
objective gap: 0.101029
risk:          0.0202236
risk gap:      0.0202057
num planes:    16
iter:          14

objective:     0.223733
objective gap: 0.0629782
risk:          0.0126564
risk gap:      0.0125956
num planes:    17
iter:          15

objective:     0.192716
objective gap: 0.0319327
risk:          0.00633729
risk gap:      0.00638654
num planes:    18
iter:          16

objective:     0.179985
objective gap: 0.0191835
risk:          0.0038297
risk gap:      0.00383671
num planes:    19
iter:          17

objective:     0.175389
objective gap: 0.0145817
risk:          0.00290856
risk gap:      0.00291635
num planes:    20
iter:          18

Training complete.
Trained with C: 5
Training with epsilon: 0.01
Trained using 2 threads.
Trained with sliding window 70 pixels wide by 92 pixels tall.
Saved detector to file faces_detector.svm
Training accuracy: precision: 1, recall: 1, average precision: 1
Testing accuracy: precision: 0, recall: 1, average precision: 1
```

Testing accuracyのprecisionが0なので、精度はイマイチですね。
精度が上がるように訓練を見直す必要がありそうです。

以上、ご参考にまでに。