使用mobilenet训练自己的数据
实现背景:keras+ tensorflow
一、数据预处理文件:car2626data.py
import os
import numpy as np
import cv2
import pdb
def load_data():
x_train = np.empty((263171,3,224,224),dtype="float32")
y_train = np.empty((263171,),dtype="uint8")
x_test = np.empty((9940,3,224,224),dtype="float32")
y_test = np.empty((9940,),dtype="uint8")
i = 0
j = 0
for line in open('/home/zhanghh/train_label_year.txt'):
ss = line.split(' ')
ori_img = "/home/zhanghh/data/" + ss[0]
img1 = cv2.imread(ori_img)
img2 = cv2.resize(img1,(224,224),interpolation=cv2.INTER_CUBIC)
arr = np.asarray(img2,dtype="float32")
x_train[i,:,:,:] = [arr[:,:,0],arr[:,:,1],arr[:,:,2]]
y_train[i] = int(ss[-1])
i+=1
y_train = np.reshape(y_train,(len(y_train),1))
for line in open('/home/zhanghh/test_label_year.txt'):
nn = line.split(' ')
or_img = "/home/zhanghh/data/" + nn[0]
img3 = cv2.imread(or_img)
img4 = cv2.resize(img3,(224,224),interpolation=cv2.INTER_CUBIC)
arr = np.asarray(img4,dtype="float32")
x_test[j,:,:,:] = [arr[:,:,0],arr[:,:,1],arr[:,:,2]]
y_test[j] = int(nn[-1])
j+=1
y_test = np.reshape(y_test,(len(y_test),1))
x_train = x_train.transpose(0,2,3,1)
x_test = x_test.transpose(0,2,3,1)
return (x_train,y_train),(x_test,y_test)
二、mobilenet模型架构文件:mobilenet.py
from keras.models import Sequential, Model
from keras.layers import Dense, Activation, Flatten, Input, BatchNormalization, AveragePooling2D
from keras.layers import Conv2D, SeparableConv2D
class MobileNet():
def mobile_block(self, filter_1, filter_2):
model = self.model
model.add(SeparableConv2D(filter_1,kernel_size=(3,3), strides=(1,1),padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv2D(filter_1,kernel_size=(1,1),strides=(1,1), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(SeparableConv2D(filter_2, kernel_size=(3,3), strides=(2,2),padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv2D(filter_2 * 2,kernel_size=(1,1),strides=(1,1), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
def final_conv_block(self):
model = self.model
model.add(SeparableConv2D(512,kernel_size=(3,3), strides=(2,2),padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv2D(1024,kernel_size=(1,1),strides=(1,1), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(SeparableConv2D(1024,kernel_size=(3,3), strides=(1,1),padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv2D(1024,kernel_size=(1,1),strides=(1,1), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
def separable_filters(self):
model = self.model
for i in range(5):
model.add(SeparableConv2D(512,kernel_size=(3,3), strides=(1,1),padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv2D(512,kernel_size=(1,1),strides=(1,1), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
def pool_and_classify(self):
model = self.model
model.add(AveragePooling2D(pool_size=(7,7),strides=(1,1)))
model.add(Flatten())
model.add(Dense(2626))
model.add(Activation('softmax'))
def __init__(self, size=(224,224,3)):
self.create(size)
def create(self, size):
self.model = Sequential()
self.model.add(Conv2D(32,kernel_size=(3,3),strides=(2,2), padding='same', input_shape=size))
self.mobile_block(32,64)
self.mobile_block(128,128)
self.mobile_block(256,256)
self.separable_filters()
self.final_conv_block()
self.pool_and_classify()
三、运行文件:mobile_cnn.py
from __future__ import print_function
import keras
import car2626data
import mobilenet
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D
from mobilenet import MobileNet
batch_size = 128
num_classes = 2626
epochs = 95
(x_train, y_train), (x_test, y_test) = car2626data.load_data()
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
MODEL = MobileNet()
opt = keras.optimizers.rmsprop(lr=0.0004, decay=1e-6)
MODEL.model.compile(loss='categorical_crossentropy',
optimizer=opt,
metrics=['accuracy'])
x_train /= 255
x_test /= 255
MODEL.model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test))
score = MODEL.model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
MODEL.model.save_weights('mobilenet_car2626_model.h5')