PythonMania

普段はロボットとAIを組み合わせて色々作ってます。Python関係以外も色々投稿していくと思います。

【Python】画像認識 - 画像ファイルとラベルファイルが分かれている場合のトレーニングデータの読み込み方法【DeepLearning】


学習用のデータを読み込む際、ラベルごとにフォルダ分けしてデータを保存していることが多かったんで、

ラベルを別途csvファイルで用意されているパターンに遭遇して詰まりました笑


今回は画像ファイルとラベルファイル(csv)が分かれている場合の読み込み方法についてまとめてみます。

参考にしたのはこちらのコンペです


www.kaggle.com



for文を使って、画像のパスとcsvに表記されている画像のパスが

同じ場合cv2.imreadで読み込む、みたいな感じらしいです。



データ読み込み部分だけでなく、全体のコードを載せておきます。


#必要なライブラリの読み込み
import cv2
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import json
import os
from tqdm import tqdm, tqdm_notebook
from keras.models import Sequential
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.applications import VGG16
from keras.optimizers import Adam




#トレーニングデータ、テストデータ、ラベルデータのパス読み込み
train_dir = "../input/train/train/"
test_dir = "../input/test/test/"
train_df = pd.read_csv('../input/train.csv')
train_df.head()



#試しに1枚プロットしてみる
im = cv2.imread("../input/train/train/01e30c0ba6e91343a12d2126fcafc0dd.jpg")
plt.imshow(im)


#vgg16の読み込み
vgg16_net = VGG16(weights='imagenet', 
                  include_top=False, 
                  input_shape=(32, 32, 3))



vgg16_net.trainable = False
#モデルの概要を表示
vgg16_net.summary()

#モデル作成
model = Sequential()
model.add(vgg16_net)
model.add(Flatten())
model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer=Adam(lr=1e-5), 
              metrics=['accuracy'])


#データの読み込み
X_tr = []
Y_tr = []
images = train_df["id"].values
for img_id in tqdm_notebook(images):
    X_tr.append(cv2.imread(train_dir+img_id))
    Y_tr.append(train_df[train_df["id"]==img_id]["has_cactus"].values[0])
X_tr = np.asarray(X_tr)
X_tr = X_tr.astype('float32')
X_tr /= 255
Y_tr = np.asarray(Y_tr)


with open('history.json', 'w') as f:
    json.dump(history.history, f)

history_df = pd.DataFrame(history.history)
history_df[['loss', 'val_loss']].plot()
history_df[['acc', 'val_acc']].plot()


#学習の実行
batch_size = 32
nb_epoch = 1000

# Train model
history = model.fit(X_tr, Y_tr,
              batch_size=batch_size,
              epochs=nb_epoch,
              validation_split=0.1,
              shuffle=True,
              verbose=2)

#テストファイルの読み込み
X_tst = []
Test_imgs = []
for img_id in tqdm_notebook(os.listdir(test_dir)):
    X_tst.append(cv2.imread(test_dir + img_id))     
    Test_imgs.append(img_id)
X_tst = np.asarray(X_tst)
X_tst = X_tst.astype('float32')

#テストデータ予測
test_predictions = model.predict(X_tst)
sub_df = pd.DataFrame(test_predictions, columns=['has_cactus'])
sub_df['has_cactus'] = sub_df['has_cactus'].apply(lambda x: 1 if x > 0.75 else 0)
sub_df['id'] = ''
cols = sub_df.columns.tolist()
cols = cols[-1:] + cols[:-1]
sub_df=sub_df[cols]
for i, img in enumerate(Test_imgs):
    sub_df.set_value(i,'id',img)
X_tst /= 255


sub_df.head()