こんにちは。サイエンス統括本部で画像処理エンジニアをしている伊藤です。Yahoo! BEAUTYで新たにヘアカラー検索機能がリリースされました。大量にあるヘアスタイルの写真を画像解析することで、細かい色味を指定しての検索ができるようになっています。
本記事では、これを実現するために実装したヘア領域抽出やカラー抽出といった画像解析技術を紹介いたします。
※本記事のヘアスタイル画像は、Yahoo! BEAUTY ガイドラインに従い利用しています。
Yahoo! BEAUTY ヘアスタイル検索とは
Yahoo! BEAUTYのヘアスタイル検索は、自分の理想のヘアスタイル、スタイリストを探すためのサービスです。ユーザーは、タグや条件を指定して検索します。
課題: 細かいヘアカラーを検索できない
検索対象となるヘアスタイル画像は主にスタイリストの方がタグなどを付けて投稿しています。ヘアカラーを検索したい場合、「ブラウン系」「ピンク系」などのタグで検索できますが、そもそも色系のタグが含まれていない画像もたくさんあり、検索できません。また明るめのブラウン・暗めのブラウン、と細かい明るさなどは主観によるのでタグ化が難しく、やはり検索対象にできません。
今回の施策: 画像解析を利用したヘアカラー検索
そこで、画像解析を利用したヘアカラー検索の取り組みを行いました。カラー抽出を行うことで、色系のタグが付与されていない画像も検索対象にでき、細かい明るさなども指定できるようになりました。
ヘアスタイルページのヘアカラーパレットのアイコンから、ベースとなる色を選びます。
ベースとなる色を選んだら、明るさのスライダーが出現するので、そこで明るさを選ぶことができます。
明るさのスライダーを変化させることにより、細かい明るさの指定が可能です。
ヘアカラー検索手法
ヘアカラー検索の手法について、画像解析の箇所を中心に説明します。
全体フロー
入力となるヘアスタイル画像に対して、まずヘアセグメンテーションを行い、ヘア領域のみを抽出します。ヘア領域に対してノイズ除去の処理をして、ヘアカラーを抽出します。ヘアカラーはHSV表色系の値で抽出し、検索データベースに保存します。検索時に、色の名前からHSVの値のレンジにマッピングし、対象となる画像を取得します。
ヘアセグメンテーション
ヘアセグメンテーションを行い、ヘア領域を抽出します。セマンティックセグメンテーション手法のPSPNet(Pyramid Scene Parsing Network)を利用しました。
セグメンテーションには、セマンティックセグメンテーション(ヘア領域ならどれも同じ)や、インスタンスセグメンテーション(違う人物のヘア領域は区別する)などの種類があります。Yahoo! BEAUTYのヘアスタイル画像は1画像に1人しか写っていないこともあり、セマンティックセグメンテーションの手法を利用しました。
PSPNetは、Pyramidという名前の通り複数スケールの特徴量を使ったディープラーニングのモデルです。backboneにはResNet101を利用しました。
PyTorchで学習されたモデルをonnx形式に変換し、ONNX Runtimeで推論する実装にしました。
ヘア領域のノイズ除去
ヘア領域からヘアカラーを抽出するにあたって、ヘアセグメンテーションの誤検出の問題や、領域の境目で背景の色が混ざってしまう問題がありました。そこで、モルフォロジー変換の収縮処理を行うことにより、ノイズ除去を行いました。
モルフォロジー変換とは、古くからある画像処理の手法で、主に2値画像を対象に収縮や膨張の処理を行い、ノイズ除去を行う手法です。実装にはOpenCVを利用しました。
ヘアカラー抽出
全体カラーの値として、ヘア領域の画素値を平均化して抽出します。後続処理の色の名前へのマッピングや明るさ調整のため、RGBからHSV表色系に変換します。
(出典:HSV color space visualization; HSV as a cylindrical object. Created by Wapcaplet / CC BY-SA 3.0)
HSV表色系は、色をH(色相)、S(彩度)、V(明度)で表します。例えば、同じ色味で明るさ(V)のみを調整するということがしやすいため、この表色系に変換しています。
サービスへは未リリースですが、部分カラーの抽出も行っています。インナーカラーや裾カラーなど2種類の色を持つヘアスタイルの主要カラーと部分カラーを抽出します。
ヘア領域の画素に対して、色を特徴量として、k=2でk-meansクラスタリングを行います。大きい方の領域を主要カラー、小さい方の領域を部分カラーとして抽出します。
k-meansの特徴量として、RGBやHSVではなく、Lab表色系のaとbを利用しました。RGBの値では、明るさの影響を受けてうまくいきませんでした。HSV表色系では、明るさの成分を除外できますが、H(色相)は色が円状に配置され最小値の0と最大値の360が同じ色になってしまうため、距離計算には向きません。そこで、Lab表色系のaとbを使ってクラスタリングするとうまく行ったので、そちらの方法を取りました。
表色系の変換、k-meansクラスタリングの実装にはOpenCVを利用しました。
色の名前から色の値へのマッピング
「くすみカラー_ベージュ」や「ビビッドカラー_ピンク」などの色の名前から、HSVの値のレンジへのマッピングを行います。これにより、サービスUIのカラーパレットや明るさのスライダーの値と紐づけて、検索できます。
どんな色の定義を作るかと、色のマッピングについては、美容領域の知識があるサービス担当者にやってもらいました。
リリースまでの道のり
今回の取り組みの特徴としては、ユーザーがUIを操作しながら希望通りのヘアカラーを検索できそうかという点が重要になります。画像処理のタスクとしてよくあるテストデータの精度の評価値を上げるためにモデリングを頑張るという取り組みとは異なっています。
そこで、早めに自分の方でインタラクティブなデモを作成し、結果を見つつ修正を繰り返しながら進めていました。デモの作成には、StreamlitというPythonでWebアプリが簡単に作成できるフレームワークを利用しました。
左がクエリで、右が検索結果です。クエリでは表色系の指定、色の値、前後どれぐらいの値の範囲まで検索するかを指定できます。検索結果では、ヘアセグメンテーションがうまく行っているかなども見られるようになっています。
最終的にHSV表色系を利用していますが、デモ上で他の表色系のHSLやLabも検討し、HSVが1番思い通りの色を検索しやすかったのでそうしました。また、色のマッピング範囲の検討(例えば、「くすみカラー_ベージュ」はHは20〜35でSは30〜60の値にするなど)もこのデモツールで行ってもらいました。
サービスへは未リリースですが、部分カラーの検索もデモでは可能で、インナーカラーや裾カラーなどのヘアスタイルから部分カラーの検索もできます。
おわりに
本記事では、Yahoo! BEAUTYにリリースされたヘアカラー検索機能について、画像解析技術を中心に紹介しました。
私の所属する画像処理チームでは、社内のさまざまなサービスと連携しながら、コンピュータビジョン、画像認識領域の技術開発や応用に取り組んでいます。現在、この分野のポジションも募集しておりますので、ご興味がありましたら、ぜひご応募ください。
こちらの記事のご感想を聞かせください。
- 学びがある
- わかりやすい
- 新しい視点
ご感想ありがとうございました
- 伊藤 文啓
- 画像処理エンジニア
- サイエンス統括本部で画像処理エンジニアをしています。社内向けに画像解析のモデルやAPIを提供しています。