機械学習データの集め方についての追記です。
機械学習を成し遂げている人は、自分の目的に必要なデータを収集することを大事にしています。
画像技術を用いてデータの収集を加速しよう。
動き差分を利用して、変化のあったときだけ画像を集める。
動き差分は、実装が簡単なので、例えばRaspberryPiでも簡単にインストールできる。
motion
ラズパイでの例 ラズパイで動体検知対応の監視カメラを作る
Ubuntuでの例 Motion でライブカメラ+動体検知サーバー構築
動き差分を利用すれば定点カメラの場合、動いているものがない状況での撮影データを無視できるので、変化のない画像を大量に保存してしまうことを減らせる。
動画からの前景抽出で、動いているオブジェクトの範囲を自動抽出する。
OpenCV には動画から背景除去を行うライブラリが実装されている。そのライブラリは、定点カメラの動画の過去のフレームのデータから、pixel単位ごとに背景の値を保持して、背景と異なる領域、前景部分をpixel単位で判定して返すライブラリになっている。
そのため、その1枚のフレームの画像に対してBGRチャネルのほかにアルファチャネルを持っていて、アルファチャネルに前景判定の結果が入っている。前景部分には255、背景部分には0のカウントを持っている。物体の影によって画素値が変化する場合には、半分の値を返す。
そうすることで、動いている対象の領域を画素単位で絞り込めるという利点を持っている。
人や動物やクルマなどの動くものの検出を行う場合には、動いている対象が見つかって、その対象物の領域が画素単位でわかるというのは、その後の学習を考えた時に利点が多い。
検出枠を矩形で指定するやりかたで機械学習させるときの問題点
- 何の工夫もなしに学習させると、背景によって対象の検出率が変わるという結果になりやすい。
- 矩形で検出枠を指定して学習させる場合だと、対象物の輪郭がなんであるのかを通常指定できないので、本当に対象物に固有の特徴を効果的に学習させることができない。
画素単位で対象物がわかることを利用して、背景差し替え画像を利用したときの利点
- 背景を置き換えることができるので、学習の結果への背景の影響を低減できる。
- 原画像と背景差し替え画像とを同時に学習させると、その2つに対して共通な前景部分、前景画像の輪郭が特徴として選択されやすくなる。
このようなことから、画像を撮影する時点で工夫して、背景除去画像を撮影するのは価値がある。
緩めのしきい値で検出器を動かして、誤検出が多くてもいいから集める。
定点カメラのように視野が固定の場合には、動き差分や背景除去が使えますが、移動しているカメラからの画像では、そういった手法が使えません。
その場合でも、既存の検出器を使って画像を収集すると方法があります。
ゆるめのしきい値で検出器を動かせば、未検出を減らすことができます。
そのようにして収集したデータから、学習用のデータを絞り込む方が、全ての時間撮影し続けている画像から絞り込むよりも格段に楽になります。
単純な分類器で、明白な対象外を除去しよう
libsvmやsciki-learn などのSVMを使って、明白な対象外のデータを除外することでも、学習データを効率的に集めることができる。
他のセンサのトリガーイベントをもとに、画像を収集しよう。
他のセンサの出力をトリガーとして画像を収集する。例:人感センサの利用。
検出フレームに後続の数フレームのデータを保存する。
- 仮に人検出の場合としよう。人の姿勢が変動して検出が途切れることはありがちである。しかし、検出が途切れても後続の数フレームは、データを保存するようにしておけば、学習用の画像を収集できる。未検出になってしまった後続フレームを目視で確認した上で優先的に学習に加えれば、現状の学習で足りていない部分を補うための学習データとすることがっできる。
全数処理しようと考えるな
- 最初の100個よりは、ランダムな100個。
- 同じ日の1000個よりは、100個づつを10日分。
既存のデータベースから、自分の目的にあうデータを抜き出そう
paper VGGFace2: A dataset for recognising faces across pose and age