これは, 人工知能技術戦略会議等主催 第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要素で表現する方法である.
RGBは「原色の組み合わせ」で色を表現するが, この方法だと各要素を変動させた場合に色がどう変化するかがイメージしにくい.
一方, HSVでは色を「色相」「鮮やかさ」「明るさ」といった直感的にわかりやすい方法で表現するため, もしかしたら「色」識別では効果があるのでは?
ということで, HSV変換にはOpenCVのcv2.cvtColor(img, cv2.COLOR_BGR2HSV)を利用した.
OpenCVでHSV変換した場合, 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 | ||||
green | ||||
red | ||||
white | ||||
off_white | ||||
light_gray | ||||
yellow |
参考として, ヒストグラム画像の作成コードを載せておく.
コード:
# 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して, 「色」分類精度を確認してみた.
ベースModel | RGB | HSV | Hist(Log) |
VGG19 | 0.655 | - | 0.670 |
Xception | 0.664 | 0.616 | 0.637 |
RGB画像そのまま, ヒストグラム画像あたりは0.65~0.67程度の分類精度が出た.
コンパクトなモデルを検討する際にも, この2つの画像を利用することにする.
今回は, データ利用方法について試したことを紹介した.
次回は, モデリングについて試したことをいくつか紹介する.
----
参照URL:
[1] 人工知能技術戦略会議等主催 第1回AIチャレンジコンテスト
[2] 第1回 FR FRONTIER :ファッション画像における洋服の「色」分類
[3] 最先端のビジネス課題にチャレンジ!
[4] HSV色空間 - Wikipedia
詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~
| TensorFlowで学ぶディープラーニング入門 ~畳み込みニューラルネットワーク徹底解説~
| Learning Tensorflow: A Guide to Building Deep Learning Systems
| Tensorflow Machine Learning Cookbook
|