前回のおさらい
除雪の完全自動化に向けて道路上の積雪を少ない/普通/多いのカテゴリで機械学習的に識別することを前回やってみました。
が、データセットに必要な道路上の積雪の画像は頑張っても各カテゴリ20枚程度しか収集することができませんでした。
「え、機械学習って大量のデータがないとダメなんじゃないの?」と思う方もいることでしょう。あるに越したことないですが、少なくてもできないことはありません。
学習サンプルが少なくとも、それなりの精度を出してくれるとても効率が良いモデルがあるのでそれを使った結果、各カテゴリが20枚弱のデータセットでも7割とまあまあ高精度な結果を得ることができるようになりました。
しかし、前回は以下のような積雪以外の不要な情報を含む画像をそのままネットワークに入力していたので、モデルが積雪の情報をいい感じに得ていたかはわからないです。

そこでですよ。
今回やること
今回は積雪の情報のみを良い感じで学習できるように、画像中の不要なオブジェクトにマスクをかけてそれをモデルに入力したらどうなるかという試みです。
まず、マスクをかける方法としてOpenCVライブラリのGrabCutを試してみました。GrabCutは前景領域の抽出をするのに有効なツールです。
道路上の雪領域をいい感じに抽出することができないかと思って試してみましたが、結果は図1の変換結果のようになりました。

GrabCutによる前景抽出はピクセルごとの色情報等で前景・後景を判別しているようなので、降雪時の一面真っ白みたいな画像は苦手なのかもしれないですね。とまあ、こんな感じでプログラムによってマスクをする作業はムラができてしまうので、Adobe Photoshopを使って手作業でマスクをかけていこうと思います。
Adobe Photoshopの導入
機械学習をするために学習サンプルを事前に加工したりすることがありますが、Photoshopを使うととても便利です。
今回の例では不要な箇所に黒塗りのマスクをしたいので、図2のようにツールバーのクイック選択ツールを選択します。

不要な領域をなぞると自動で選択されるので、その領域内を黒塗りします。手作業なので、時間がかかるというデメリットだけあるのですが、プログラムで閾値を決めるだけでは実現できないマスク処理ができます。

データセットと機械学習
前章の方法で収集した全ての画像中の不要な領域にマスクをします。
今回はモデルが積雪領域の特徴量を得ているかどうかを確認するため、ヒートマップで可視化して前回との比較をしてみます。
学習に使用したモデルは前回同様EfficientNetV2ですが、今回はEfficientNetV2をベースにGrad-CAMを適用し、モデルが画像中のどこに注目しているかをヒートマップで可視化します。
エポック数は15で試してみた結果、学習時のaccuracyは約7割でした。前回に比べ多少下がりはしましたが、その原因としてマスク処理をしたことによる特徴量の減少が考えられます。
014 / 015 | 学習時 | loss : 0.81087 | accuracy : 0.575 | 検証時 | loss: 0.99601 | accuracy : 0.600 |
015 / 015 | 学習時 | loss : 0.89234 | accuracy : 0.675 | 検証時 | loss: 0.81593 | accuracy : 0.600 |
また、評価用データに対してモデルを適用した結果、約5割と概ね良い結果となりました。
precision | recall | f1-score | support | |
0 | 0.50 | 0.50 | 0.50 | 6 |
1 | 0.67 | 0.40 | 0.50 | 5 |
2 | 0.43 | 0.60 | 0.50 | 5 |
accuracy | 0.50 | 16 |
特徴量の可視化
学習サンプルの不要な領域に対してマスクをすることで、特徴空間でどこを処理しているかを可視化してみました。その結果、右のマスクなしの学習サンプルでは建物などにヒートマップが分布しているのに対して、左の画像では雪が積もっている箇所が赤く表示されていることが確認できます。

このことから、収集した学習サンプルに事前に何らかの処理をしていた方が、目的に沿った特徴量を得られることがわかりました。
また、学習で得た結果は前回より下がってしまいましたが、学習サンプルの枚数を増やすことができればこの問題も解決できることが予想されます。
おわりに
いかがでしたでしょうか。
今回は、画像データに対して何らかの前処理をしてからモデルに入力する方法を試してみました。
その結果、不要な領域にマスクをかけた方が内部的に処理をする際に、好ましい特報量が得られることがわかりました。
次回は大量にデータがある場合を想定して、不要な領域に自動でマスク処理をする方法やアノテーションによるクラス分けについて検討していきます。
画像url
https://blog.goo.ne.jp/zenyossha/e/69b493191c6445df81f6a65fd4c4ecc1