kivantium活動日記

プログラムを使っていろいろやります

二次元画像判別器の作成に関する基礎検討

Abstract

Twitterに流れる大量の画像の中から二次元画像を集めることは私のQoL向上の上で非常に重要な問題である。 本研究では、著者のタイムラインに実際に流れてきた画像を分析し、二次元画像分類という問題の定義が難しいことを示した。 また、独自に定義した問題設定に基づいてデータセットを作成し、Illustration2VecとRandom Forestを組み合わせることで accuracy 0.98 を達成するモデルを作成した。 これにより今後の二次元画像収集に関する研究の方針が明らかになった。

Introduction

Twitterのタイムラインには非常に多くの画像が流れており、その中から自分の好みの二次元画像を収集することは非常に困難である。神絵師アカウントが投稿する画像はイラストばかりとは限らず、むしろ焼肉等の飯テロ画像やソシャゲのガチャ結果などの非イラスト画像の割合のほうが高い場合が多い。そのため、神絵師を集めたリストを眺めても目的の二次元画像が得られる割合が少なく、快適な画像収集ライフの妨げとなっている。

二次元画像の自動判定の問題は、オタク機械学習界隈ではよく知られている。Ideyoshiらは画素値ヒストグラムを特徴量とした機械学習モデルを用いて二次元画像判別器を作成した [1]。また、TachibanaはIllustration2Vecを元にしたニューラルネットワークを用いて二次元画像判別器を作成した [2]。

これらの研究はいずれも二次元画像として人が収集したTumblrデータ、三次元画像としてImagenetのデータを用いていた。この画像データセットにおいては二次元・三次元の区別が明確であるが、実際にタイムラインに流れてくる画像は二次元・三次元の区別が明確ではないものが数多く存在する。

本研究では、実際にタイムラインに流れてくる画像を収集し、二次元画像判別問題を正しく定義することが難しいことを示した。また、困難を回避できる独自のデータ収集基準を設定した上でデータセットの作成を行い、Illustration2VecとRandom Forestを組み合わせたモデルを用いてaccuracy 0.98を達成した。

  • [1] Mori Ideyoshi, Falsita Fawcett, Fall Through, Makoto Sawatar. 機械学習による二次元/三次元画像判別. SIG2D'13, pp. 1-6, 2013.
  • [2] Hazuki Tachibana. Illustration2Vec に基づく高精度な二次元画像判別器の作成. SIG2D'15, pp. 9-12, 2015.

Method

Twitter画像の収集

以前の記事で説明したstatuses/filterを用いて、followにkivantiumのフォロワー全員を指定して画像の収集を行った。収集期間は4月16日深夜〜4月18日昼頃である。

kivantium.hateblo.jp

二次元画像判別器の作成

以前の記事で作成した、ONNX経由でIllustration2Vecを作成するライブラリを用いて画像から特徴量を抽出し、Random Forestで分類するモデルを作成した。

ネガティブデータを0、ポジティブデータを1というディレクトリに入れて、次のようなPythonプログラムを実行した。

import os
from pprint import pprint

import numpy as np
from PIL import Image
import more_itertools
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from tqdm import tqdm

import i2v

illust2vec = i2v.make_i2v_with_onnx("illust2vec_ver200.onnx")

X = []
y = []
batch_size = 4

negative_path = '0'
negative_list = os.listdir(negative_path)
for batch in tqdm(list(more_itertools.chunked(negative_list, batch_size))):
    img_list = [Image.open(os.path.join(negative_path, f)) for f in batch]
    features = illust2vec.extract_feature(img_list)
    X.extend(features)
    y.extend([0] * len(batch))

positive_path = '1'
positive_list = os.listdir(positive_path)
for batch in tqdm(list(more_itertools.chunked(positive_list, batch_size))):
    img_list = [Image.open(os.path.join(positive_path, f)) for f in batch]
    features = illust2vec.extract_feature(img_list)
    X.extend(features)
    y.extend([1] * len(batch))

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

clf = RandomForestClassifier(max_depth=2, random_state=0)
clf.fit(X_train, y_train)
print(clf.score(X_test, y_test))

Result

Twitter画像の収集

収集された画像のうち、明らかに二次元画像と判定されるものの例を示す。

かわいい。

このように、明らかに二次元画像と判定できる画像も存在したが、一方で二次元画像と呼ぶべきなのかよく分からないものが数多く存在した。一例を上げると

  • 写真とイラストを並べた画像
LƏGS from r/Animemes

また、既存の漫画のコマやアニメ・ソシャゲのスクリーンショットなどは二次元画像であるが、特に収集したい対象ではない。

以上を踏まえて、以下のデータセット作成基準を制定した。

  • かわいい二次元画像だと私が判定したカラーの一枚絵のイラストをポジティブデータとする
  • 二次元画像だが収集したくないと判定した二次元画像と、コマ割りがあるか白黒の二次元画像は保留データとする
  • それ以外の画像をネガティブデータとする。

このような非科学的な根拠に基づいてデータセットを作成しているので以下の評価は全てデタラメである。

保留データをネガティブデータとして利用すると、ポジティブ・ネガティブの差があいまいになって学習が進みにくくなりそうだったので、とりあえず明確に区別できそうなポジティブとネガティブのデータだけを用いて評価することにした。

二次元画像判別器の評価

収集した6000枚くらいの画像のうち、以上の基準に基づいて700枚くらいをポジティブデータ、2000枚くらいをネガティブデータ、1300枚くらいを保留データとした。残りの2000枚くらいの画像はラベリングに飽きたので放置してある。

そのうち200枚のポジティブデータと350枚のネガティブデータを用いて上記のプログラムを動かして評価したところ、accuracy 0.98という結果を得た。せっかくラベリングしたのに一部のデータしか使わなかったのは思ったより特徴量抽出に時間が掛かって寝る前に学習が終わらなさそうだったからである。

Discussion

抽出した特徴量を何もチューニングしてないRandom Forestに入れるだけでaccuracy 0.98が出ることから、二次元画像判別問題は難しい入力ケースを除けばだいぶ簡単な問題であったことが分かる。(自明なことを言っているだけだな)

上記で学習したランダムフォレストを試しに保留データに適用してみたところ、アニメやソシャゲのスクリーンショットは二次元画像として判定されてしまった。学習データ中にソシャゲのスクリーンショットは必要ではないという情報がない以上、これは当然の結果である。現実のデータでは二次元画像と三次元画像が明確に分かれていないことが判明した以上、必要となるのは二次元画像のうち収集したいタイプの画像を区別する何らかの方法を考えることである。人間が見ればアニメ・ソシャゲのスクリーンショットと創作イラストの区別は明確であることがほとんどであるため、機械学習さんにも区別できる可能性はある。

ポジティブとネガティブの境界をどうするかというのは当然機械学習で重要な問題であるため、先行研究が存在する。そのうち特に面白そうなのはアクティブ・ラーニングと呼ばれる分野である。アクティブラーニングでは確信が持てない訓練データを選び出して人間にラベリングさせることで少ないラベル数で効率よく学習させることを目指しているらしいので、境界が問題になる現状を解決する手がかりになる気がする。今週末のテーマとして勉強してみるのがいいだろう。

広告コーナー