みなさんこんにちはやっしーです。
本日は、ローカルに持ってきた画像群を使ったデータセットの作り方を備忘録的にまとめようと思います。
なお、今回取り上げるデータセットは、Oxford-ⅢT Petsです。
Oxford-ⅢT Pets
オックスフォード大学が公開している動物画像のデータセットです。最大37種類。ネコ系やイヌ系です。
データセットにしたい画像群のダウンロード
上記Oxford-Pets Ⅲのリンクをクリックして、Dataset をクリックすると、圧縮された画像ファイル群が手に入るので、それを、
///
解凍法を示す
///
解凍すると、jpgファイルがたくさん出てきます。
ラベルの書き出し(手作業!圧倒的手作業!!)
プログラム上にラベル一覧を並べていきます。これに一致する文字列云々でフィルタかけますので、ここ減らしたりすればクラス分類のクラス数を調整できますね
PETS = [
"Abyssinian",
"american_bulldog",
"american_pit_bull_terrier",
"basset_hound",
"beagle",
"Bengal",
"Birman",
"Bombay",
"boxer",
"British_Shorthair",
"chihuahua",
"Egyptian_Mau",
"english_cocker_spaniel",
"english_setter",
"german_shorthaired",
"great_pyrenees",
"havanese",
"japanese_chin",
"keeshond",
"leonberger",
"Maine_Coon",
"miniature_pinscher",
"newfoundland",
"Persian",
"pomeranian",
"pug",
"Ragdoll",
"Russian_Blue",
"saint_bernard",
"samoyed",
"scottish_terrier",
"shiba_inu",
"Siamese",
"Sphynx",
"staffordshire_bull_terrier",
"wheaten_terrier",
"yorkshire_terrier"]
画像へのPATH記述
grobを使います。
file_type = 'jpg'
img_list = glob.glob(r"./images/*.jpg")
変数も定義しておきましょう
# 全データ格納用
img_array_list = []
img_label_list = []
# 教師用データ格納用
test_array_list = []
test_label_list = []
# 学習データ格納用
teach_array_list = []
teach_label_list = []
フォルダ内総なめしてファイル名の文字列を検知したら、PETS配列のインデックスをラベルとしてappendします。
for img in img_list:
for i in PETS:
if(i in img):
#print(i)
#print(img)すると、一致しているのがわかるが、長いのでオススメしない
img_label_list.append(PETS.index(i))
imgcv = plt.imread(img)
# 画像の大きさを取得
temp_img = load_img(img,grayscale=False,target_size=(imgcv.shape[0],imgcv.shape[1]))
temp_img_array = img_to_array(temp_img) /255
img_array_list.append(temp_img_array)
ちなみにコメント外すとこんなの出てきます。
Egyptian_Mau
./images/Egyptian_Mau_167.jpg
pug
./images/pug_52.jpg
basset_hound
./images/basset_hound_112.jpg
Siamese
あとは、各クラスから20枚ずつ(何枚でもできます。良い比率あったら教えてください)
教師データにぶち込みます。
# 各クラス20枚ずつ取り出して教師用データにする。
# 20*37 = 740
# 学習データ3050枚、教師データ740枚にわけたい
j=0
for j in range(37):
for i in range(len(img_label_list)):
while(teach_label_list.count(j) <=20):
teach_label_list.append(img_label_list.pop(i))
teach_array_list.append(img_array_list.pop(i))
continue
test_label_list = img_label_list
test_array_list = img_array_list
やはりデータとして数が足りない気がするので、そのまま37クラス分類とかやらない方が良さそうですね笑
ちなみにlengthチェック
print(len(teach_array_list))
print(len(teach_label_list))
print(len(test_label_list))
print(len(test_array_list))
# 1180
# 1180
# 6210
# 6210
全部で7390枚だったので、(全200枚、9枚少ないのが1クラス、1枚少ないのが1クラスありました。)OKっぽいですね。
そしたら、完成したリストをnumpy配列にして、
test_array_listnp = np.array(teach_array_list)#教師データ
test_label_listnp = np.array(teach_label_list)#教師ラベル
train_array_listnp = np.array(test_array_list)#学習データ
train_label_listnp = np.array(test_label_list)#学習ラベル
np.saveでnpyファイルが完成します!(ここ重いです)
np.save('test_array.npy',test_array_listnp)
np.save('test_label.npy',test_label_listnp)
np.save('train_array.npy',train_array_listnp)
np.save('train_label.npy',train_label_listnp)
何回かやると、アドレス空間的に確保できないのか、リストがカラになってしまうことが多々ありました!なんか解決策あったらご教授ください!
ちゃんとできているかの検証はまだしていません。結果が出なかったらまずはデータセットをうたがってください笑