ごちうさで始める線画の自動着色(1)~データセットのEDA~
KaggleにあったGochiUsa_Facesデータセットを使って、ごちうさキャラの線画の自動着色で遊んでみました。この投稿では下準備として、データセットのEDAをします。
目次
GochiUsa_Facesデータセット
これなに?:ごちうさのキャラの顔画像を集めたもの。
https://www.kaggle.com/rignak/gochiusa-faces
全部で4万枚、サイズは16.12GB。Kaggleの画像データセットにしては比較的お手軽サイズ。
このデータセットのいいところは、もちろんキャラが可愛くて癒やしなこともあるのですが、画像解像度が高めの画像を多く集めているところ。小さい解像度のアニメ画像を集めたデータセットはあるが、そこそこ大きいサイズは見当たらない。ごちうさで完結しているのでキャラ数が限定的で、かつどのキャラの顔かアノテーションがついているところ。
今回から何個かの記事に分けて「GochiUsa Facesデータセット」で遊んでみます。
データセットの構造
ダウンロードすると3つのフォルダーと1つのPDFが出てきます。
- additional_dataset
- main_dataset
- test_dataset
- GochiUsa_Dataset.pdf
PDFではいろいろ面白い分析しています。
「main_dataset」と「test_dataset」が主要キャラ(9人)で、「additional_dataset」がサンプル数の少ないサブキャラクターの画像です。
今回は主要キャラのみ扱います。主要キャラのみ考えると「main_dataset」が訓練データ、「test_dataset」がテストデータとなります。
ただし、main_datasetとtest_datasetでデータソースが異なるようです。main_datasetはアニメのキャプチャ中心、test_datasetは(おそらく)ファンアートが中心です。ただし、PDFによると、主要キャラを画像分類すると、9割以上の精度が出たとのことです(後述)。今回はこのデータソースの差は無視しますが、ソースの差が問題になるケースで有効かもしれません。実践的ですね。
(a)がmain_dataset、(b)がtest_dataset、(c)がadditional_datasetです(画像はPDFより)。(a), (b)のキャラクターは、左から
- ブルーマウンテン
- チノ
- 千夜
- ココア
- マヤ
- メグ
- モカ
- リゼ
- シャロ
(c)のキャラクターは左から、
- あんこ(甘兎庵のオスうさぎ)
- 千夜の祖母
- ココアの母
- 凛(青山ブルーマウンテンの編集者)
- リゼの父
- サキ(チノの母親)
- タカヒロ(チノの父)
- ティッピー
- ユラ
データ数と解像度の関係
PDFより。画像の幅の分布です。
中央値が362ピクセル付近で、高解像度のサンプルが多め。
キャラごと、データセットごとに特定サイズ以上のサンプルが何枚あるか数えてみましょう。ここでの特定サイズとは「画像の幅の高さのうち小さい方の値が一定値以上か」で判定します。
from PIL import Image
import glob
import pandas as pd
def count_images(root_dir):
dirs = sorted(glob.glob(root_dir + "/*"))
characters = [d.replace("\\", "/").split("/")[-1] for d in dirs]
min_sizes = [0, 64, 128, 256, 320, 512]
df = pd.DataFrame(0, columns=min_sizes, index=characters)
for i, d in enumerate(dirs):
files = sorted(glob.glob(d + "/*"))
for f in files:
with Image.open(f) as img:
for j, min_image_size in enumerate(min_sizes):
if min(img.size) >= min_image_size:
df.iloc[i, j] += 1
return df
print(count_images("archive/main_dataset/main_dataset"))
main_dataset
キャラ/サイズ | 0 | 64 | 128 | 256 | 320 | 512 |
---|---|---|---|---|---|---|
Blue Mountain | 1607 | 1553 | 1399 | 1133 | 939 | 623 |
Chino | 12941 | 12707 | 11836 | 8900 | 7601 | 4098 |
Chiya | 7283 | 7150 | 6793 | 5304 | 4500 | 2340 |
Cocoa | 12223 | 12023 | 11334 | 8839 | 7479 | 3888 |
Maya | 4747 | 4695 | 4440 | 3144 | 2574 | 1090 |
Megumi | 4040 | 4005 | 3825 | 2732 | 2189 | 832 |
Mocha | 1241 | 1220 | 1154 | 980 | 835 | 493 |
Rize | 9052 | 8884 | 8307 | 6428 | 5425 | 2623 |
Sharo | 6445 | 6344 | 5933 | 4509 | 3792 | 1888 |
小計 | 59579 | 58581 | 55021 | 41969 | 35334 | 17875 |
test_dataset
キャラ/サイズ | 0 | 64 | 128 | 256 | 320 | 512 |
---|---|---|---|---|---|---|
Blue Mountain | 47 | 47 | 47 | 38 | 28 | 8 |
Chino | 1525 | 1525 | 1522 | 1289 | 1026 | 401 |
Chiya | 513 | 513 | 512 | 453 | 374 | 132 |
Cocoa | 489 | 489 | 488 | 414 | 315 | 119 |
Maya | 131 | 131 | 130 | 118 | 85 | 30 |
Megumi | 93 | 93 | 92 | 83 | 73 | 26 |
Mocha | 57 | 57 | 57 | 55 | 42 | 14 |
Rize | 507 | 507 | 506 | 421 | 336 | 117 |
Sharo | 534 | 534 | 534 | 419 | 299 | 111 |
小計 | 3896 | 3896 | 3888 | 3290 | 2578 | 958 |
mainとtestでそこまで大きくは解像度の分布は変わらないようです。
additional_dataset
キャラ/サイズ | 0 | 64 | 128 | 256 | 320 | 512 |
---|---|---|---|---|---|---|
Anko | 13 | 11 | 10 | 9 | 8 | 2 |
Anzu | 140 | 140 | 138 | 46 | 20 | 13 |
Chiya’s Grandmother | 41 | 41 | 41 | 25 | 10 | 1 |
Cocoa’s Mother | 266 | 266 | 263 | 200 | 180 | 103 |
Kano | 170 | 170 | 165 | 88 | 64 | 10 |
Karin | 84 | 84 | 82 | 38 | 15 | 0 |
Mai | 196 | 196 | 191 | 116 | 108 | 60 |
Miki | 78 | 78 | 75 | 21 | 15 | 10 |
Nacchan | 133 | 133 | 122 | 67 | 29 | 17 |
Rei | 147 | 146 | 139 | 66 | 42 | 17 |
Rin | 439 | 433 | 422 | 323 | 271 | 123 |
Rize’s Father | 88 | 85 | 84 | 41 | 33 | 22 |
Saki | 156 | 146 | 113 | 77 | 66 | 32 |
Takahiro | 682 | 679 | 629 | 274 | 110 | 28 |
Tippy | 78 | 75 | 56 | 36 | 16 | 2 |
Yura | 83 | 83 | 81 | 74 | 74 | 42 |
小計 | 2794 | 2766 | 2611 | 1501 | 1061 | 482 |
additionalが9人以上いました。小数サンプルなのでここは無視してもいいでしょう。Few-shot Learningをやりたいときには使えそうですね。
アスペクト比の分布
主要キャラクターについてアスペクト比の分布を見てみます。
指標として「縦÷横を、底が2のlogを取ったもの」と比較します。この値が0なら正方形、1なら縦が横の2倍、-1なら横が縦の2倍を表します。
import matplotlib.pyplot as plt
import numpy as np
def plot_aspect_ratios(root_dir):
dirs = sorted(glob.glob(root_dir + "/*"))
characters = [d.replace("\\", "/").split("/")[-1] for d in dirs]
root_dir_base = root_dir.replace("\\", "/").split("/")[-1]
fig = plt.figure(figsize=(10, 10))
for i, d in enumerate(dirs):
files = sorted(glob.glob(d + "/*"))
ar = []
for f in files:
with Image.open(f) as img:
width, height = img.size
ar.append(np.log2(height/width))
n = int(np.ceil(np.sqrt(len(dirs))))
ax = fig.add_subplot(n, n, i+1)
ax.hist(ar, bins=50)
ax.set_yscale('log')
ax.set_title(characters[i])
fig.suptitle(root_dir_base)
fig.savefig(f"{root_dir_base}.png")
ほとんどヒストグラムが一本線になったので、縦軸を対数にしてみました。それでも一本線なので、データセットはほぼ正方形ということがわかります。綺麗なデータセットで扱いやすいでしょう。
単純に画像分類してみると
今回画像分類が趣旨ではないのですが、「画像分類したときにどのぐらいの精度が出るの?」というのは疑問としてあります。
データセット付属のPDFでは、128×128の解像度でInception V3で訓練したときの混同行列がありました。これはtest_datasetに対する精度です。
大半のキャラは概ね9割以上出ています。チノちゃんは母数が多いだけあって99%の精度があります。混同しやすいのがモカとココアで、これは両者が姉妹なので仕方がないでしょう。
青山ブルーマウンテンも精度が若干低いですが、データセットに不均衡があるのでこれは仕方ないでしょう。不均衡データとしては結構実践的かもしれませんね。
予告
次の投稿では、線画の自動着色のための下準備、TFRecordの作成していきます。
次回はこちら:https:blog.shikoan.com/gochiusa-02
Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内
技術書コーナー
「本当の実装力を身につける」ための221本ノック――
機械学習(ML)で避けて通れない数値計算ライブラリ・NumPyを、自在に活用できるようになろう。「できる」ための体系的な理解を目指します。基礎から丁寧に解説し、ディープラーニング(DL)の難しいモデルで遭遇する、NumPyの黒魔術もカバー。初心者から経験者・上級者まで楽しめる一冊です。問題を解き終わったとき、MLやDLなどの発展分野にスムーズに入っていけるでしょう。
本書の大きな特徴として、Pythonの本でありがちな「NumPyとML・DLの結合を外した」点があります。NumPyを理解するのに、MLまで理解するのは負担が大きいです。本書ではあえてこれらの内容を書いていません。行列やテンソルの理解に役立つ「従来の画像処理」をNumPyベースで深く解説・実装していきます。
しかし、問題の多くは、DLの実装で頻出の関数・処理を重点的に取り上げています。経験者なら思わず「あー」となるでしょう。関数丸暗記では自分で実装できません。「覚える関数は最小限、できる内容は無限大」の世界をぜひ体験してみてください。画像編集ソフトの処理をNumPyベースで実装する楽しさがわかるでしょう。※紙の本は電子版の特典つき
- まとめURL:https://github.com/koshian2/numpy_book
- みんなの感想:https://togetter.com/li/1641475
- A4 全176ページモノクロ / 2020年12月発行
「誰もが夢見るモザイク除去」を起点として、機械学習・ディープラーニングの基本をはじめ、GAN(敵対的生成ネットワーク)の基本や発展型、ICCV, CVPR, ECCVといった国際学会の最新論文をカバーしていく本です。
ディープラーニングの研究は発展が目覚ましく、特にGANの発展型は市販の本でほとんどカバーされていない内容です。英語の原著論文を著者がコードに落とし込み、実装を踏まえながら丁寧に解説していきます。
また、本コードは全てTensorFlow2.0(Keras)に対応し、Googleの開発した新しい機械学習向け計算デバイス・TPU(Tensor Processing Unit)をフル活用しています。Google Colaboratoryを用いた環境構築不要の演習問題もあるため、読者自ら手を動かしながら理解を深めていくことができます。
AI、機械学習、ディープラーニングの最新事情、奥深いGANの世界を知りたい方にとってぜひ手にとっていただきたい一冊となっています。持ち運びに便利な電子書籍のDLコードが付属しています。
「おもしろ同人誌バザールオンライン」で紹介されました!(14:03~) https://youtu.be/gaXkTj7T79Y?t=843
まとめURL:https://github.com/koshian2/MosaicDeeplearningBook
A4 全195ページ、カラー12ページ / 2020年3月発行
累計100万PV超の人気ブログが待望の電子化! このブログが電子書籍になって読みやすくなりました!
・1章完結のオムニバス形式
・機械学習の基本からマニアックなネタまで
・どこから読んでもOK
・何巻から読んでもOK
・短いものは2ページ、長いものは20ページ超のものも…
・通勤・通学の短い時間でもすぐ読める!
・読むのに便利な「しおり」機能つき
・全巻はA5サイズでたっぷりの「200ページオーバー」
・1冊にたっぷり30本収録。1本あたり18.3円の圧倒的コストパフォーマンス!
・文庫本感覚でお楽しみください
北海道の駅巡りコーナー
ローカル線や秘境駅、マニアックな駅に興味のある方におすすめ! 2021年に大半区間が廃線になる、北海道の日高本線の全区間・全29駅(苫小牧~様似)を記録した本です。マイカーを使わずに、公共交通機関(バス)と徒歩のみで全駅訪問を行いました。日高本線が延伸する計画のあった、襟裳岬まで様似から足を伸ばしています。代行バスと路線バスの織り成す極限の時刻表ゲームと、絶海の太平洋と馬に囲まれた日高路、日高の隠れたグルメを是非たっぷり堪能してください。A4・フルカラー・192ページのたっぷりのボリュームで、あなたも旅行気分を漫喫できること待ったなし!
見どころ:日高本線被災区間(大狩部、慶能舞川橋梁、清畠~豊郷) / 牧場に囲まれた絵笛駅 / 窓口のあっただるま駅・荻伏駅 / 汐見の戦争遺跡のトーチカ / 新冠温泉、三石温泉 / 襟裳岬
A4 全192ページフルカラー / 2020年11月発行