最近注目を浴びることが多くなった「Deep Learning」と、それを用いた画像に関する施策周りの実装・事例について、リクルートグループにおける実際の開発経験を基に解説していく連載。今回は、Deep Learning/CNN(Convolutional Neural Net)をどうビジネスに活用しているかに焦点を当て、その試行錯誤の過程を紹介します。
最近注目を浴びることが多くなった「Deep Learning(ディープラーニング)」と、それを用いた画像に関する施策周りの実装・事例について、リクルートグループにおける実際の開発経験を基に解説していく本連載。
第3回の今回は、リクルートグループにおける画像解析の事例を紹介し、CNN(Convolutional Neural Net)をどうビジネスに活用しているかに焦点を当てます。また、ビジネスへの活用に当たり、CNNだけでは乗り超えられない壁を乗り越えるまでの試行錯誤の過程を紹介します。
海外のサイトなどを含め、最近はCNNの使い方を紹介する記事や、CNNを用いた画像解析の事例を目にする機会が本当に増えました。これにより、「画像データにCNNを適応すれば、何かができる!」という期待感がジワジワと高まっているように思えます。しかし筆者の経験からすると、CNNは画像解析において物体認識などの大切な役割を担うものの、それだけではビジネスに活用できない場合がほとんどです。
前回紹介したCaffeのようなオープンソースソフトウエアが出現し、その使い方を説明するサイトや書籍が多少増えた現在、“CNNを動かすこと”自体は、そこまでハードルが高いことではありません。しかしCNNをビジネスに活用するために本当に大切なのは、活用の目的を明確にした上で、「いかにしてCNNでの解析をしやすく事前に準備するのか」「いかにしてCNNでの解析結果を利用するのか」の2点に尽きます。そして、これを実現するためには、CNN以外の画像解析における知識/技術も必要となります。
以降は、実際のリクルートグループの事例を見ながら、この2点をどう試行錯誤したかを紹介していきます。
ホットペッパービューティー(リクルートライフスタイル運営)では、画像解析を用いて二つのサービスを提供しています。一つ目は、類似ネイル検索機能で、二つ目は39色でのカラー検索機能です。今回は、類似ネイル検索機能について見ていきます。
類似ネイル検索機能の目的は、類似するネイル画像をカスタマーに提示することによる回遊率の向上や、それに伴うCVR(コンバージョンレート)の上昇です。この機能を実現するためには、「類似するネイル」の定義が必要です。今回は、「ネイルのデザイン」と「ネイルの色」が似ていることを類似の定義としました。
「ネイルのデザイン」の判別に当たり、初めはクライアントが付与しているタグを利用しました。1枚1枚のネイル画像に対して、約20種類のデザインタグのうちの1つが付与されています。まずは、このタグを正解データとしてCNNを実行していきましたが、全然精度が出ませんでした。未知の画像を投入し、その予測結果を見て、絶望して吐きそうになったことをよく覚えています。
この結果を受け、なぜかと自問したときに、「ネイル画像は単一のデザインで作られていないケースがかなりある」というところに着目しました。すなわち、人差し指はフラワーデザインだが中指は水玉デザイン、など複数のデザインからなるネイル画像に、単一のタグを付与すること自体に無理があるのだと考えたのです。
そこで、CNNを適応する前処理として、爪の箇所を特定する処理を実施することにしました。そして、爪の箇所として認識した画像に対してCNNでデザイン判別を実施し、ネイル画像にデザインAがX本、デザインBがY本映っている、といった形で認識して類似度を出そうと考えました。この「爪を特定する」行為がCNNでの解析を行いやすくする事前準備に、「爪ごとにデザイン判別して類似度を出す」行為がCNNの解析結果の活用方法に、それぞれ該当します。
ネイルの爪箇所の特定には、HOG(Histograms of Oriented Gradients)特徴量で作る学習器と、その学習器を複数用意して一番精度の良い学習器の誤差率によって重みを更新するAdaBoostを用いた多数決で実現しています。ネイル画像の左上から順に局所画像をスライドし、その局所画像の勾配(勾配:色の変化が激しい箇所=エッジ)の角度を取得してヒストグラム化します。このヒストグラムを用いて、事前に学習しておいた複数の学習器にかけて爪かどうかを判別しています。これにより、ネイル画像全体の中で、どこに爪が映っているのかを特定します。
次に、特定した爪画像が何のデザインであるかをCNNで判別します。今度は、ネイル画像全体ではなく、爪画像一つ一つを対象とした学習が必要となります。そこで、HOG特徴量+AdaBoostで爪画像を大量に取得し、人目で1枚1枚を見て、適切な正解タグを付与していきました。これは非常に大きな負荷が掛かる作業でした。20人がそれぞれ1つのタグを担当し、業務の合間を縫ってタグ付け作業を辛抱強く実施していった結果、精度は飛躍的に高まり、CNNの持ち味がやっと引き出された形となりました。下記はネイル画像からデザイン判別までの流れです。
続いて、「ネイルの色」の判別です。色の判別もデザイン時同様、爪箇所の特定処理を前処理として実施しました。そして、残った爪と判別された箇所に関して、RGB値を取得し、1000個のカラービンに分けてヒストグラムを作成しました。本来、色とは、R:256 × G:256 × B:256の1677万7216通りがあるのですが、これを1000種類まで圧縮した形を利用しました。これにより、「爪の箇所の色が取得できる、やったぜ、楽勝!!」と思ったら、ここでも落とし穴がたくさんありました。
まず、ネイルの箇所を切り取っても、肌色がかなり多くの割合を占めることが判明しました。そのため、近い色を持つ検索をすると、肌色と肌色がマッチしてしまい、肝心のネイルを施している箇所の色が近い画像が検索できませんでした。これを回避するために、1000色のビンの中で、肌色を定義しました。これは、全ネイル画像をRGB値の1000ビン圧縮バージョンで頻度を取り、最多頻出のビンを抽出して肌色のビンを目視で追加/削除しながら、最適な肌色の定義をしていきました。
さらに、爪を四角形で特定するという処理上の理由により、背景が爪画像に混ざってしまいました。これにより、色の類似度を取ると、背景に影響されてしまう結果となってしまいました。これは、爪と識別した箇所とそうでない箇所の差分を取り、背景色を特定することで対処しました。つまり、爪と判断した箇所によく使われる色の中で、爪でないと判断した箇所でよく使われる色を背景色と断定し、これを類似検索時に利用しないことで背景色での類似性を外しています。
Copyright © ITmedia, Inc. All Rights Reserved.