こんにちは、田中です。
今日はディープラーニングを使ったピンぼけ写真検出について書いてみます。
るくみー撮影アプリの課題
弊社では保育士の方にiPodアプリを提供し、アプリを使って園内の日常写真を撮ってもらっています。 自動的にサーバーにアップロードされ、その後も簡単に保護者へ公開・販売できるので写真の管理がとても楽になります。
簡単、手軽、気軽に日常写真を撮れるのはよいのですがピンぼけ写真など公開に適さない写真もたくさん含まれてしまいます..。( ;∀;)
現状はこれらを1枚1枚チェックして公開/非公開を選別する必要があり、相応の負担となっています。><
これを流行りのディープラーニングを使って自動化しようというのが今回の試みです。
今回はいくつかある公開NG写真の種別のうちピンボケ写真だけを対象としています。
ピンぼけ写真とそうでない写真
着目したのは画像の周波数成分です。
正常写真 | ピンぼけ写真 |
---|---|
![]() |
![]() |
高周波成分を含む (エッジ部分が鮮明) |
高周波成分を含まない (エッジ部分がのっぺりしている) |
これにFFT (Fast Fourier Transform) をかけて周波数を画像として可視化してみます。
正常写真(FFT) | ピンぼけ写真(FFT) |
---|---|
![]() |
![]() |
おお、明らかに違います。分類できそうな気がしてきます。(*´Д`)
FFTのコードは以下の記事を参考にしました。
正直なところ、ディープラーニングを使わずともSVMなどの検出器で分類できそうな気はします。。
が、ディープラーニングの勉強も兼ねているのでディープラーニングを使います。
学習データセット
学習につかった写真の枚数は以下の通りです。
正常写真 | ピンぼけ写真 | |
---|---|---|
ラベル | 0 | 1 |
枚数 | 9000 | 9000 |
正常写真は実際にるくみー撮影アプリからアップロードされた写真を適当にピックアップして使い、ピンぼけ写真は正常写真にガウシアンフィルタをかけて人工的に作りました。
学習モデル
モデルはMNISTの分類で使ったものを使い回しているだけで適当です。。 (;^_^A
ディープラーニングのライブラリは chainer を使いました。 国産のライブラリでコードも直観的に書けるので気に入っています。
学習は 20 epochs 回し、GPU使って 約90秒、CPUだと 約10分でした。 CPUでも十分学習できます。
評価
正常写真 と ピンぼけ写真 をそれぞれ 50 枚ずつピックアップして評価しました。 ピンぼけ写真は NG写真と判定されている写真の中からぼけを含む写真を適当に選んでいます。
ピンぼけ写真 | 正常写真 | |
---|---|---|
「ぼけ写真」と判定した数 | 28 | 0 |
「正常写真」と判定した数 | 22 | 50 |
モデルも学習データセットの作りも適当なこともあり、ピンぼけ写真の分類性能はそこそこです。 ただ、特筆すべきは正常写真をピンぼけ写真として誤分類することがなかったということでしょう。 これはつまり実用性が高いことを意味しています。
ちなみに、ピンぼけ写真を正常写真と分類してしまったのは被写体の一部だけがぼけていた写真などが多かったです。 全体的にぼけた写真を学習させたのでこれは仕方ないですね。。
API & ボット
せっかくなので Heroku 上にAPIとして実装して社内のslackチャンネルからボット経由で使えるようにしてみました。 :-)
さいごに
私は参加してないのですがつい先日2/21, 22に「CNET Japan Live 2017 ビジネスに必須となるA.Iの可能性 」というイベントが開催されたようです。 そのWebページ上で 「導入前に知っておきたいAI活用のコツ~賢くコスト削減するには~」というタイトルで講演を行ったLIPの松村さんの発表スライドを見つけました。
https://japan.cnet.com/storage/2017/03/06/643b6711c05f9cb45f7fd46c3201d504/l03.JPG
(写真引用元)
写真チェックとAIの相性はかなり良いのではと思います。( ̄ー ̄)
ピンぼけ写真以外のNG写真の検出にもチャレンジしていきたいと思います。