您的位置:首页 > 其它

使用mobilenet训练自己的数据

2017-05-08 22:01 85 查看

使用mobilenet训练自己的数据

实现背景:keras+ tensorflow

一、数据预处理文件:car2626data.py

#coding:utf-8
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]
#        pdb.set_trace()
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]]
#        pdb.set_trace()
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]
##把图像resize到224*224大小
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))
#change channels last = 'tf'
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

# coding: utf-8
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)) #按照自己的分类数目进行修改Dense()
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

# The data, shuffled and split between train and test sets:
(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')

# Convert class vectors to binary class matrices.
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

MODEL = MobileNet()

# initiate RMSprop optimizer
opt = keras.optimizers.rmsprop(lr=0.0004, decay=1e-6)

# Let's train the model using RMSprop
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')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  keras tensorflow mobilenet