import os
from collections import defaultdict
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from PIL import Image
from tqdm import tqdm_notebook as tqdm
root = '../input/vehicle/train/train/'
data = []
for category in sorted(os.listdir(root)):
for file in sorted(os.listdir(os.path.join(root, category))):
data.append((category, os.path.join(root, category, file)))
df = pd.DataFrame(data, columns=['class', 'file_path'])
from sklearn.preprocessing import LabelEncoder
df['class'] = LabelEncoder().fit_transform(df['class'].values)
# list(le.inverse_transform(df['class']))
display(df.head())
len_df = len(df)
print(f"\nThere are {len_df} images\n")
df['class'].value_counts().plot(kind='bar');
plt.title('Class counts');
fig = plt.figure(figsize=(25, 16))
for num, category in enumerate(sorted(df['class'].unique())):
for i, (idx, row) in enumerate(df.loc[df['class'] == category].sample(4).iterrows()):
ax = fig.add_subplot(17, 4, num * 4 + i + 1, xticks=[], yticks=[])
im = Image.open(row['file_path'])
plt.imshow(im)
ax.set_title(f'Class: {category}')
fig.tight_layout()
plt.show()
df1=df.sample(1000)
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
photos, labels = list(), list()
for index,row in df1.iterrows():
photo = load_img(row['file_path'], target_size=(200, 200))
photo = img_to_array(photo)
photos.append(photo)
labels.append(row['class'])
X = np.asarray(photos)
y = np.asarray(labels)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
##
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D
from tensorflow.keras.layers import MaxPooling2D
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Flatten
from tensorflow.keras.layers import Dropout
from tensorflow.keras.optimizers import SGD
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same', input_shape=(200, 200, 3)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu', kernel_initializer='he_uniform'))
model.add(Dense(1, activation='sigmoid'))
opt = SGD(lr=0.001, momentum=0.9)
model.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, batch_size=100, epochs=10, verbose=1)
model.evaluate(X_test,y_test)
model.save('model1.h5')