接觸深度學習3個月以來,從當初的小白零基礎學習,過程十分艱苦,看了幾章大牛 YoshuaBengio 寫的deep learning一書,粗略了解了基本常用的神經網絡以及梯度更新策略,參數優化,也了解以及簡單的使用常用的深度學習開發框架caffe,tensorflow,theano,sklearn機器學習庫,目前keras比較火,所以使用keras來簡單的進行圖片識別分類。
數據集準備:
看caffe博客的時候看到的數據集,然后就下載使用,數據集可以在最后下載。
數據集一共有5類圖片,一共500張,每類圖片100張,訓練集400張,每類80張,測試集100張,每類20張
第一步:
數據集進行處理:
使用opencv對圖片進行處理,縮放圖片大小為128×128大小,通道為單通道灰度圖像
#coding:utf8
import os
import cv2.cv as cv
import cv2
# 遍歷指定目錄,顯示目錄下的所有文件名
width_scale = 192 #縮放尺寸寬度
height_scale = 128#縮放尺寸高度
write_path = "/home/zhanghao/data/classification/test_scale/"#要寫入的圖片路徑
#遍歷每一張圖片進行處理
def eachFile(filepath):
pathDir = os.listdir(filepath)
for allDir in pathDir:
child = os.path.join('%s%s' % (filepath,allDir))
write_child = os.path.join('%s%s' % (write_path,allDir))
image = cv.LoadImage(child,0)
des_image = cv.CreateImage((width_scale,height_scale),image.depth,1)
cv.Resize(image,des_image,cv2.INTER_AREA)
# cv.ShowImage('afe',des_image)
cv.SaveImage(write_child,des_image)
# break
if __name__ == '__main__':
filePathC = "/home/zhanghao/data/classification/test/"
eachFile(filePathC)
第二步
把圖片集制作成keras識別的數據集
#制作數據集
def data_label(path,count):
data = np.empty((count,1,128,192),dtype = 'float32')#建立空的四維張量類型32位浮點
label = np.empty((count,),dtype = 'uint8')
i = 0
pathDir = os.listdir(path)
for each_image in pathDir:
all_path = os.path.join('%s%s' % (path,each_image))#路徑進行連接
image = cv2.imread(all_path,0)
mul_num = re.findall(r"d",all_path)#尋找字符串中的數字,由于圖像命名為300.jpg 標簽設置為0
num = int(mul_num[0])-3
# print num,each_image
# cv2.imshow("fad",image)
# print child
array = np.asarray(image,dtype='float32')
data[i,:,:,:] = array
label[i] = int(num)
i += 1
return data,label
第三步
構建卷積神經網絡進行訓練和測試
#構建卷積神經網絡
def cnn_model(train_data,train_label,test_data,test_label):
model = Sequential()
model.add(Convolution2D(
nb_filter = 12,
nb_row = 3,
nb_col = 3,
border_mode = 'valid',
dim_ordering = 'th',
input_shape = (1,128,192)))
model.add(Activation('relu'))#激活函數使用修正線性單元
model.add(MaxPooling2D(
pool_size = (2,2),
strides = (2,2),
border_mode = 'valid'))
model.add(Convolution2D(
24,
3,
3,
border_mode = 'valid',
dim_ordering = 'th'))
model.add(Activation('relu'))
#池化層 24×29×29
model.add(MaxPooling2D(
pool_size = (2,2),
strides = (2,2),
border_mode = 'valid'))
model.add(Convolution2D(
48,
3,
3,
border_mode = 'valid',
dim_ordering = 'th'))
model.add(Activation('relu'))
model.add(MaxPooling2D(
pool_size = (2,2),
strides =(2,2),
border_mode = 'valid'))
model.add(Flatten())
model.add(Dense(20))
model.add(Activation(LeakyReLU(0.3)))
model.add(Dropout(0.5))
model.add(Dense(20))
model.add(Activation(LeakyReLU(0.3)))
model.add(Dropout(0.4))
model.add(Dense(5,init = 'normal'))
model.add(Activation('softmax'))
adam = Adam(lr = 0.001)
model.compile(optimizer = adam,
loss = 'categorical_crossentropy',
metrics = ['accuracy'])
print '----------------training-----------------------'
model.fit(train_data,train_label,batch_size = 12,nb_epoch = 35,shuffle = True,show_accuracy = True,validation_split = 0.1)
print '----------------testing------------------------'
loss,accuracy = model.evaluate(test_data,test_label)
print ' test loss:',loss
print ' test accuracy',accuracy
第四步
調用上述函數進行訓練預測
train_path = '/home/zhanghao/data/classification/train_scale/'
test_path = '/home/zhanghao/data/classification/test_scale/'
train_count = getnum(train_path)
test_count = getnum(test_path)
train_data,train_label = data_label(train_path,train_count)
test_data,test_label = data_label(test_path,test_count)
train_label = np_utils.to_categorical(train_label,nb_classes = 5)
test_label = np_utils.to_categorical(test_label,nb_classes = 5)
cnn_model(train_data,train_label,test_data,test_label)
用到的頭文件
import re
import cv2
import os
import numpy as np
import cv2.cv as cv
from keras.models import Sequential
from keras.layers.core import Dense,Activation,Flatten
from keras.layers.convolutional import Convolution2D,MaxPooling2D
from keras.optimizers import Adam
from keras.layers.advanced_activations import LeakyReLU
from keras.utils import np_utils
cpu運行,迭代50次,預測準確率達到92%,還算可以的準確率
具體實現代碼:https://github.com/zhanghao-JNU/keras-training
路漫漫其修遠兮,吾將上下而求索
責任編輯:lq
-
神經網絡
+關注
關注
42文章
4809瀏覽量
102836 -
數據集
+關注
關注
4文章
1223瀏覽量
25284 -
深度學習
+關注
關注
73文章
5555瀏覽量
122499
原文標題:使用CNN神經網絡進行圖片識別分類
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
基于RV1126開發板實現自學習圖像分類方案

評論