BASE開発チームブログスマートフォン用の表示で見るBASE開発チームブログ2018-11-07ALOCCを使った「文字画像」を判別する試み機械学習どうもお久しぶりです。BASEビール部部長の氏原です。最近急に涼しくなりましたね。ハイアルなベルギービールでも飲んで温まるといい季節ですよ。Detection」を実装して商品画像フィルタにならないか試してみたことについてお話しようと思います。Classifierとはあるクラスに属するか否かの判別器です。ある画像に写っているものがQRコードか否かとか、水着か否かとかです。Classifier(ALOCC)が使えないか試したという内容です。皆さんショッピングアプリ「BASE」を使ったことはおありでしょうか?数多くの商品が並んでいて、私は米とか肉とか買ってます。そんな中こんな商品たちを見かけたことはないでしょうか?またはおすすめショップのところのこういうのとかこちらは、お知らせをひとつの商品として登録するとこのように表示されます。本来的な商品画像の使用法とは異なりますが、登録自体は可能です。これらの商品ではない商品がショップのページに出てくるのは特に問題ないのですが、もし検索とかで出てきたら探している商品と違うなぁと思ってしまうのではないでしょうか?この問題を解決するために商品ではない商品を自動で発見して検索等には出ないようにする機能を開発しています。QRコード画像については現在検索等からの除外を開始しています。今回お話するのはお知らせ等の文字画像の検出について今取り組んでいることの紹介です。Detectionについて単純に文字画像か否かの判別器を作ることを考えると以下のような問題があります。文字画像ではない画像、という教師データをどう集める?文字画像以外の画像では幅が広すぎる文字画像とはなにか?がはっきりとわからない。Detectionでは軽減できそうだったので、使えそうかどうか試してみました。実験結果に行く前にこの手法を簡単に解説しておきます。論文に乗ってた画像そのまま上げます。)構造としてはGANにインスパイアされたものになります。DiscriminatorなのはGANと同じで、GANでGeneratorだった部分がReinforcerとなっています。ReInforcerは画像(元の画像にノイズを追加したもの)を与えられて、何かしらの画像を出力します。DiscriminatorはReinforcerが出力した画像と元の画像を見分けるように学習させ、ReinforcerはDiscriminatorを騙すように学習します。学習の目的さて、では上記ネットワーク構造は何を意図しているのでしょうか?これは元画像との違いを検出する検出器を作ろうとしているのです。学習に使う画像は検出したいターゲットのクラスの画像だけ、今回の私の用途で言えば文字画像だけいいのです。文字画像以外の画像というものを教師として揃える必要がありません。これはありがたいです。教師を作るためにこれは文字画像、これは文字画像ではない...と延々とやってるとこれはどっちだろうかという画像が出てきてだんだん混乱してきます。これは文字画像にしたいなってものを集めるだけでいいのはとても楽です。ターゲットに似た画像を生成するようになります。特定のターゲットクラスの画像しか学習してないので、ターゲットのクラスではない画像を渡すとぐちゃぐちゃな画像が生成される、ということを期待しています。今回は文字画像を学習させるので文字画像っぽいものは綺麗に再構築されるけど、それ以外はぐちゃっとなってほしいというわけです。再構築された画像、つまりターゲットから少しでも違う画像を見分けようとするため、違いに敏感になるように学習されます。ターゲットとの違い、つまり新規性の検出器となります。返す結果が1に近いほど新規性がない、つまり学習した文字画像に近い画像ということになり、0に近いほど新規性の高い見たことがない画像ということになります。)論文ではペンギン画像を学習させています。通した結果、ペンギン画像はペンギン画像として再構築されていますが、ペンギンでない画像はなにか汚い画像になっています。渡すと元の画像を渡すよりも綺麗にペンギンとそれ以外を判別できるようになると主張されています。実装さて、一応論文の著者の方のgithubはあったのですが、tensorflowがゴリゴリでわかりづらかったのでpytorchを使って実装してみました。ReinforcerReinforcerの中身は受け取った画像をConv2dで畳み込むencoderと、Deconvするdecorderです。GANだとパラメータ受け取ってDeconvしていくだけなので、ここがちょっと違います。xDiscriminatorDiscriminatorはGANと何も変わりません。受け取った画像を畳み込んで全結合層に渡すだけですね。学習の仕方もGANとほぼ変わりません。文字画像を学習させてみた結果、文字画像はそこそこ綺麗に再構築され、それ以外は結構ぐちゃっとなるようになったようです。かました方が落ちてます。positive、つまり本来文字画像じゃないのに文字画像と認識してしまった率は多少改善されました。positiveはできる限り抑えたいところです。いう意味ではそこそこ意味はあるのかなと思います。文字画像はそこまで綺麗にいかない、というか論文の結果の画像が綺麗にできすぎ。何か書いてない(もしくは私がちゃんと読めてない)工夫があるのかも。Reinforcerは論文にはない工夫を追加した(まだ実験中なので内容は内緒)。しないとただのGANにしかならない。ターゲット画像以外の画像渡しても普通にそこそこ綺麗な画像が再構築される。Normarizationは偉大。まとめ文字画像を正確に判別できるようになるまではまだまだ道のりが長そうです。3%といっても画像は1日に何万枚と上げられてきますので、間違いの絶対数はそこそこ多くなります。理想的には桁をもう一つ下げたいところです。今回の判別器では、単純に文字画像判別器を作ったときに弾かれがちだった文字Tシャツはかなり高精度で文字画像ではなく商品であると認識できるようになりました。STOREより)引き続き良きユーザー体験を提供できるように頑張っていきます。)の開発チームによるブログです。Groupの大木です。Developerをしている東口です。Groupのマネージャーをしている山田です。12/1から始まっ...Archiveスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。