接觸深度學習3個月以來,從當初的小白零基礎(chǔ)學習,過程十分艱苦,看了幾章大牛 YoshuaBengio 寫的deep learning一書,粗略了解了基本常用的神經(jīng)網(wǎng)絡(luò)以及梯度更新策略,參數(shù)優(yōu)化,也了解以及簡單的使用常用的深度學習開發(fā)框架caffe,tensorflow,theano,sklearn機器學習庫,目前keras比較火,所以使用keras來簡單的進行圖片識別分類。
數(shù)據(jù)集準備:
看caffe博客的時候看到的數(shù)據(jù)集,然后就下載使用,數(shù)據(jù)集可以在最后下載。
數(shù)據(jù)集一共有5類圖片,一共500張,每類圖片100張,訓練集400張,每類80張,測試集100張,每類20張
第一步:
數(shù)據(jù)集進行處理:
使用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識別的數(shù)據(jù)集
#制作數(shù)據(jù)集
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)#尋找字符串中的數(shù)字,由于圖像命名為300.jpg 標簽設(shè)置為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
第三步
構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)進行訓練和測試
#構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)
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'))#激活函數(shù)使用修正線性單元
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
第四步
調(diào)用上述函數(shù)進行訓練預(yù)測
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次,預(yù)測準確率達到92%,還算可以的準確率
具體實現(xiàn)代碼:https://github.com/zhanghao-JNU/keras-training
路漫漫其修遠兮,吾將上下而求索
責任編輯:lq
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4838瀏覽量
107735 -
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1236瀏覽量
26187 -
深度學習
+關(guān)注
關(guān)注
73文章
5598瀏覽量
124391
原文標題:使用CNN神經(jīng)網(wǎng)絡(luò)進行圖片識別分類
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
渣土車識別檢測系統(tǒng) 基于YOLOv8與RNN
1688拍立淘圖片搜索API概述
淘寶圖片搜索商品API指南
【啟揚方案】基于RK3576的智能垃圾分類站應(yīng)用解決方案
發(fā)布元服務(wù)配置應(yīng)用分類、標簽和資質(zhì)信息(僅分發(fā)手表設(shè)備)
基于級聯(lián)分類器的人臉檢測基本原理
RFID在垃圾分類中的核心優(yōu)勢
如何對電能質(zhì)量在線監(jiān)測裝置的應(yīng)用場景進行分類?
基于米爾瑞芯微RK3576開發(fā)板部署運行TinyMaix:超輕量級推理框架
ocr識別時數(shù)據(jù)集上傳壓縮包,上傳成功,但不顯示圖片,圖片數(shù)量仍顯示0,為什么?
基于LockAI視覺識別模塊:手寫數(shù)字識別
在友晶LabCloud平臺上使用PipeCNN實現(xiàn)ImageNet圖像分類
基于RV1126開發(fā)板實現(xiàn)自學習圖像分類方案
使用keras來簡單的進行圖片識別分類
評論