タオル交換監視の機械学習モデルの改善
概要
WEBカメラで掛タオルを監視し、交換されたら通知するシステムを作りました。
「タオルがあるかないか」はWEBカメラの画像を機械学習して判定しているのですが、やはり最初のうちは誤検出が多かったです。色々工夫して誤検出を減らすことができたので方法をご紹介します。
1 部屋の電気が消えているときは判定しない
まず最初に誤検出が多かったのは、電気が消えていて部屋が暗いときです。
学習はすべて明るいときの画像を用いたので、暗いと画像内の明度差が変わって誤検出したのでしょう。
対策として、部屋が暗いときはそもそも判定しない、ことにしました。
もちろん、暗いときの画像を学習モデルに追加してもいいのですが、アプリケーションの性質上部屋の電気が消えているときにタオル交換が起こることは有り得ないので、そもそも判定しない、ということにしました。この方が再学習のコストもかかりませんし、処理の負荷も減ります。
具体的には、画像を取得後、その画像の「明るさ」を計算し、閾値を上回った場合のみ画像判定の処理に入るようにします。(「明るさ」の計算方法は前項参照)
2 「ある」を細かく分類する
次に誤検出が多かったのは、体が被ってタオルの一部が隠れたり、タオルで手を拭いた瞬間などです。
対策として、タオルの状態をより細かく分類することにしました。
これまでは、タオルが「ある」と「ない」と「判定不能」(タオルが体などで完全に隠れてしまった場合など)の3種類でした。
これを、「ある」「使用中」「体が被っている」「ない」「判定不能」の5種類に分類を増やしました(これまでは使用中でも体が被っていても「ある」と分類していました)。
そして、実際の判定処理では、上記5種類のどれかを推測した後、「使用中」「体が被っている」「ある」のいずれかから「ない」に変化したら「タオル交換が行われた」と判定します。
この修正の前後で「あるなし」の正解率(「使用中」「体が被っている」は「ある」に再変換し、「ある」「なし」「判定不能」の3種類に分類した場合の正解率)を計算しました。
結果、0.82 → 0.94と改善しました。
「結局3分類に戻すんかい」と思われたかもしれませんが、実際のアプリケーションを考えれば「使用中」と「体が被っている」を間違えても問題はないのです。分類を増やしたのは学習の効率を上げるためです。
最後に
2番目の「分類を細かくする」というのはとある書籍で読んだのですが、こういうところで役立つんだなあと実感しました。
参考になれば是非取り入れてみてください。
ただ、だいぶ減ったとはいえまだ誤検出はあるのでこれからも改善を続けたいです。
Comentários