【Deeplearningでポケモン図鑑計画_その2】画像のクレイジングとデータ仕分け

はじめに

こんにちは、がんがんです。今回は画像のクレイジングを行い、転移学習を行っていきます。
転移学習の方が長くなりそうだったため、今回はこちらのみまとめておきます。

図鑑の計画編はこちらです。

gangannikki.hatenadiary.jp

前回の記事はこちらからどうぞ。

gangannikki.hatenadiary.jp


画像のクレイジング

まずは学習に使える画像とそうでない画像の分類(クレイジング)を行いました。今回、転移学習のプログラムよりもこっちのほうがしんどかったです。何点か残念だった例を挙げていきます。

例えば、こちらのポケモン「サンド」

f:id:gangannikki:20181031021036p:plainf:id:gangannikki:20181031020942j:plain
サンド
欲しかったのは左の画像でしたが、実際に保存されたのは右の画像でした。「サンド」のみで検索をかけたため、非常に美味しそうなフォルダとなりました。

次に、こちらのポケモン「クラブ」

f:id:gangannikki:20181031021244p:plainf:id:gangannikki:20181031021047j:plain
クラブ
なんとなく予想はつくと思いますが、かにの「クラブ」ではなく、イベントの「クラブ」が保存されてました。

このように名前のみで検索すると欲しい画像が1枚もゲット出来ないこともあることを知りました。
改善として、数が足りない画像は「ポケモン名 ポケモン」と検索することにより改善に成功しました。

コード

画像を学習用と検証用にわけるプログラムは以下のようになっています。以前よりもだいぶPathlibにも慣れてきました。

#------------------------------------------------------------
#
#	画像を学習データと検証データに分ける
#
#------------------------------------------------------------
import random
import shutil
from pathlib import Path

img_dir = "./img"			#  原画像を格納
train_dir = "./image/train"		#  学習画像を格納
validation_dir = "./image/validation"	#  検証画像を格納

"""
	メイン
"""
def main():
	for i,p in enumerate(list(sorted(img_dir.iterdir()))):
		files = []
		#  train_dirの作成
		d1 = train_dir / p.name
		d1.mkdir(parents=True, exist_ok=True)
		#  validation_dirの作成
		d2 = validation_dir / p.name
		d2.mkdir(parents=True, exist_ok=True)

		#  画像を一旦全て取り出す
		for f in p.iterdir():
			files.append(f)
		print("No.{}:{}".format(p.name,len(files)))
		
		#  10枚をvalidation,残りを学習用にする
		random.shuffle(files)
		#  検証用
		for f in files[:10]:
			img_path = p / f.name
			shutil.copy(str(img_path), str(d2))
		#  学習用
		for f in files[10:]:
			img_path = p / f.name	
			shutil.copy(str(img_path), str(d1))
		if p.name == "train":
			pass

まとめ

転移学習がなかなか上手くいってないため、まずは仕分けのみをまとめておきました。
転移学習についても今週中には書いていこうと思います。