整个训练的代码如下:
import os
import numpy as np
from PIL import Image
from keras.models import Sequential
from keras.layers import Convolution2D, Flatten, MaxPooling2D, Dense, Activation
from keras.optimizers import Adam
from keras.utils import np_utils
#Pre process images
class PreFile(object):
def __init__(self, FilePath, DogType):
self.FilePath = FilePath
self.DogType = DogType
def FileReName(self):
count = 0
for type in self.DogType:
subfolder = os.listdir(self.FilePath + type)
for subclass in subfolder:
print('count_classese:-->',count)
print(subclass)
print(self.FilePath + type + subclass)
os.rename(self.FilePath + type + '/' + subclass, self.FilePath +
type + '/' + str(count) + '_' + subclass.split('.')[0])
count += 1
def FileResize(self, Width, Hight, Output_folder):
for type in self.DogType:
print(type)
file = os.listdir(self.FilePath + type)
for i in file:
img_open = Image.open(self.FilePath + type + '/' + i)
conv_RGB = img_open.convert('RGB')
new_img = conv_RGB.resize((Width, Hight), Image.BILINEAR)
new_img.save(os.path.join(Output_folder, os.path.basename(i)))
#main training program
class Training(object):
def __init__(self, batch_size, number_batch, categories, train_floder):
self.batch_size = batch_size
self.number_batch = number_batch
self.categories = categories
self.train_floder = train_floder
#Read image and return Numpy array
def read_train_images(self, filename):
img = Image.open(self.train_floder + filename)
return np.array(img)
def train(self):
train_img_list = [] #x_train
train_label_list = [] #y_train
for file in os.listdir(self.train_floder):
file_img_in_array = self.read_train_images(filename = file)
train_img_list.append(file_img_in_array)
train_label_list.append(int(file.split('_')[0]))
train_img_list = np.array(train_img_list)
train_label_list = np.array(train_label_list)
train_label_list = np_utils.to_categorical(train_label_list,
self.categories)
train_img_list = train_img_list.astype('float32')
train_img_list /= 255.0
#-- step Neural Network CNN
model = Sequential()
#CNN Layer - 1 #input shape (40,100,100,3)
model.add(Convolution2D(
input_shape=(100,100,3),
filters=32, #next layer output (100,100,32)
kernel_size=(5,5), #pixel filtered
padding='same', #外边距处理
))
model.add(Activation('relu'))
model.add(MaxPooling2D(
pool_size=(2,2), # Output next layer (50,50,32)
strides=(2,2),
padding='same'
))
#CNN Layer - 2
model.add(Convolution2D(
filters=64, # next layer output (50,50,64)
kernel_size=(2, 2), # pixel filtered
padding='same', # 外边距处理
))
model.add(Activation('relu'))
model.add(MaxPooling2D(
pool_size=(2, 2), # Output next layer (25,25,64)
strides=(2, 2),
padding='same'
))
#Fully connected Layer - 1
model.add(Flatten()) #降维打击
model.add(Dense(1024))
model.add(Activation('relu'))
#Fully connected Layer - 2
model.add(Dense(512))
model.add(Activation('relu'))
#Fully connected Layer - 3
model.add(Dense(256))
model.add(Activation('relu'))
#Fully connected Layer - 4
model.add(Dense(self.categories))
model.add(Activation('softmax'))
#Define Optimizer
adam = Adam(lr=0.0001)
model.compile(optimizer=adam,
loss='categorical_crossentropy',
metrics=['accuracy']
)
# Fire up the network
model.fit(
x=train_img_list,
y=train_label_list,
epochs=self.number_batch,
batch_size=self.batch_size,
verbose=1
)
# Save your model
model.save('./dogfinder.h5')
def main():
DogType = ['哈士奇','德国牧羊犬']
Train = Training(batch_size=1024,
number_batch=30,
categories=2,
train_floder='train_img/')
Train.train()
main()