みらいテックラボ

音声・画像認識や機械学習など, 週末プログラマである管理人が興味のある技術の紹介や実際にトライしてみた様子などメモしていく.

第1回FR FRONTIER:ファッション画像における洋服の「色」分類にチャレンジ!!(2)

これは, 人工知能技術戦略会議等主催 第1回AIチャレンジコンテスト[1]に引き続き, ユニクロを展開しているファーストリテイリング主催で今年4月~7月に開催された「第1回 FR FRONTIER :ファッション画像における洋服の「色」分類」[2][3]にチャレンジしたときの取組みについて, 数回に分けて紹介するものである.


関連記事:
第1回FR FRONTIER:ファッション画像における洋服の「色」分類にチャレンジ!!(1)
・第1回FR FRONTIER:ファッション画像における洋服の「色」分類にチャレンジ!!(2)
第1回FR FRONTIER:ファッション画像における洋服の「色」分類にチャレンジ!!(3)
第1回FR FRONTIER:ファッション画像における洋服の「色」分類にチャレンジ!!(4)
第1回FR FRONTIER:ファッション画像における洋服の「色」分類にチャレンジ!!(5)

前回に続き, 今回はデータ利用方法について試したことをいくつか紹介する.

2. データ利用方法

今回は物体識別ではなく「色」分類なので, 元の画像以外にも色の特徴を表現する方法がないかについて検討してみた.

2.1 HSV色空間[4]
HSVは色を「色相(Hue)」「彩度(Saturation)」「明度(Value・Brightness)」の3要素で表現する方法である.
f:id:moonlight-aska:20170730130321j:plain:w300

RGBは「原色の組み合わせ」で色を表現するが, この方法だと各要素を変動させた場合に色がどう変化するかがイメージしにくい.
一方, HSVでは色を「色相」「鮮やかさ」「明るさ」といった直感的にわかりやすい方法で表現するため, もしかしたら「色」識別では効果があるのでは?
ということで, HSV変換にはOpenCVのcv2.cvtColor(img, cv2.COLOR_BGR2HSV)を利用した.
OpenCVHSV変換した場合, Hueは[0,179], Saturationは[0,255],Valueは[0,255]の範囲の値をとる.
HSV変換した結果を, 画像(H→B, S→G, V→Rに割り当て)として表示すると, 以下のようになった.

例)

(残念ながら, ファーストリテイリング様から画像利用許諾が得られませんでした.)

HSV変換したものを画像としてみるのはどうかと思うが, 「色」識別しやすくなったようには思えない.

2.2 ヒストグラム
色特徴というと, RGBそれぞれのヒストグラムもありかと思う.
単純にRGBヒストグラムを作成すると, 背景色(白色)や服の色が限定されるため, 一工夫が必要となった.
3種類のヒストグラムを作成し画像表示してみると, 以下のようになった.
(1) 単純にRGBのヒストグラムを作成.
(2) 背景の白色分を除去して作成.
(3) 頻度の対数をとって作成.

例)

ラベルオリジナル画像(1)(2)(3)
blue f:id:moonlight-aska:20170818160536p:plain:w50 f:id:moonlight-aska:20170730160323j:plain:w100 f:id:moonlight-aska:20170730160607j:plain:w100 f:id:moonlight-aska:20170730160832j:plain:w100
green f:id:moonlight-aska:20170818161328p:plain:w50 f:id:moonlight-aska:20170730160341j:plain:w100 f:id:moonlight-aska:20170730160622j:plain:w100 f:id:moonlight-aska:20170730160845j:plain:w100
red f:id:moonlight-aska:20170818161508p:plain:w50 f:id:moonlight-aska:20170730160411j:plain:w100 f:id:moonlight-aska:20170730160641j:plain:w100 f:id:moonlight-aska:20170730160902j:plain:w100
white f:id:moonlight-aska:20170818161617p:plain:w50 f:id:moonlight-aska:20170730160450j:plain:w100 f:id:moonlight-aska:20170730160659j:plain:w100 f:id:moonlight-aska:20170730160914j:plain:w100
off_white f:id:moonlight-aska:20170818161740p:plain:w50 f:id:moonlight-aska:20170730160510j:plain:w100 f:id:moonlight-aska:20170730160718j:plain:w100 f:id:moonlight-aska:20170730161156j:plain:w100
light_gray f:id:moonlight-aska:20170818161857p:plain:w50 f:id:moonlight-aska:20170730160527j:plain:w100 f:id:moonlight-aska:20170730160743j:plain:w100 f:id:moonlight-aska:20170730161208j:plain:w100
yellow f:id:moonlight-aska:20170818161954p:plain:w50 f:id:moonlight-aska:20170730160540j:plain:w100 f:id:moonlight-aska:20170730160800j:plain:w100 f:id:moonlight-aska:20170730161221j:plain:w100
(注) ファーストリテイリング様から画像利用許諾が得られませんでしたので, オリジナル画像は服の色を表示.

参考として, ヒストグラム画像の作成コードを載せておく.
コード:

# coding: utf-8

import os
import cv2
import numpy as np

TRAIN_IN_DIR = './data/train'
TRAIN_DIR = './data/hist_out'

color = {'b', 'g', 'r'}
HIST_WIDTH = 256
HIST_HEIGHT = 256
HIST_DEPTH = 3

# 各濃度の頻度
def calc_histogram(img):
    hist = []
    for i, col in enumerate(color):
        h = cv2.calcHist([img], [i], None, [256], [0,256])
        hist.append(h)
    return np.array(hist)

# 頻度から画像生成
def make_histogram_image(hist):
    img = np.zeros((HIST_HEIGHT, HIST_WIDTH, HIST_DEPTH), np.uint8)

    # 白はカウントから除去
    min_255 = np.min([hist[0,255], hist[1,255], hist[2,255]])
    max_254 = np.max([hist[0,254], hist[1,254], hist[2,254]])
    hist[:,255] -= (min_255 - max_254)
    
    # 頻度Log
    hist = np.log(hist + 1)
    # 0~255に正規化    
    hi_max = np.max(hist)
    hist = hist * 255 / hi_max
    # 画像化
    for i in range(3):
        for j in range(256):
            img[(255-int(hist[i,j])):256, j, i] = 255
    return img

# ヒストグラム画像に変換
for f in os.listdir(TRAIN_IN_DIR):
    src = os.path.join(TRAIN_IN_DIR, f)
    dest = os.path.join(TRAIN_DIR, f)
    img_src = cv2.imread(src, 1)
    hist = calc_histogram(img_src)
    hist_img = make_histogram_image(hist)
    cv2.imwrite(dest, hist_img)


2.3 学習と評価
学習済モデル(VGG19, Xception)を各データでFine Tuningして, 「色」分類精度を確認してみた.

ベースModelRGBHSVHist(Log)
VGG190.655-0.670
Xception0.6640.6160.637

RGB画像そのまま, ヒストグラム画像あたりは0.65~0.67程度の分類精度が出た.
コンパクトなモデルを検討する際にも, この2つの画像を利用することにする.

今回は, データ利用方法について試したことを紹介した.
次回は, モデリングについて試したことをいくつか紹介する.

----
参照URL:
[1] 人工知能技術戦略会議等主催 第1回AIチャレンジコンテスト
[2] 第1回 FR FRONTIER :ファッション画像における洋服の「色」分類
[3] 最先端のビジネス課題にチャレンジ!
[4] HSV色空間 - Wikipedia





詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~

詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~



Learning Tensorflow: A Guide to Building Deep Learning Systems

Learning Tensorflow: A Guide to Building Deep Learning Systems


Tensorflow Machine Learning Cookbook

Tensorflow Machine Learning Cookbook