當前位置:
首頁 > 知識 > 使用mobilenet訓練自己的數據

使用mobilenet訓練自己的數據

使用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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

二、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()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

三、運行文件: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")

使用mobilenet訓練自己的數據

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

Linux 常用基本命令 pwd mkdir
GPU渲染之OpenGL的GPU管線

TAG:程序員小新人學習 |