如何确定白癜风病因 http://m.39.net/pf/a_4658777.html
通过Keras建立卷积神经网络实现简单图片识别
Keras是一个由Python编写的开源人工神经网络库,可以作为TensorFlow等高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化。Keras使用方法简单,即使是没有基础的用户也可以快速掌握。本篇文章将介绍如何使用Keras实现简单的图片识别。
学习机器学习最简单的方法是以Anaconda虚拟环境安装,这是因为在一台计算机中,我们通常需要安装很多软件,但每个模块所需要的python关联模块或版本都不同,这就可能造成兼容性冲突,因此我们使用Anaconda虚拟环境来安装。
数据集的处理
机器学习需要大量的数据做支持,kaggle是一个进行数据发掘和预测竞赛的在线平台,其上有大量的数据集可供下载。本文以两种植物叶片的识别为例,在平台上下载苹果树叶和蓝莓树叶图片各张。为了扩大图片数量,可以对图片进行翻转,调节亮度对比度等操作,通过python可以很方便的完成这些操作,将图片数量增加到各张。随后为图片添加标签并以npz的格式保存为数据集,因为只有两种叶片,因此苹果叶标签设为0,蓝莓叶标签设为1,代码如下:
importos#打开图片所在的文件夹files0=os.listdir("E:\\data\\Apple")#创建一个记事本文件,用来存储图片路径以及标签list=open("E:\\data\\list.text,w)#将所有苹果叶片的图片路径保存在记事本中,格式为路径---标签forfileinfiles0:listtext=E:\\data\\Apple\\+file+---+0+\nlist.write(listtext)#蓝莓叶片同理files1=os.listdir("E:\\data\\Blueberry")forfileinfiles1:listtext=E:\\data\\Blueberry\\+file+---+0+\nlist.write(listtext)list.close()
#打开记录图片路径和标签的记事本list=open(E:\\data\\list.text,r)#按行读取记事本中的内容data=list.readlines()#数组image用于存储图片数据#数组label用于存储图片标签image=[]label=[]foriinrange(len(data)):try:#读取第i行的内容address=data[i]#通过图片路径打开图片#split(---[0])返回行内容中---前的内容,即图片地址img=Image.open(address.split(---)[0])#resize(,)将图片压缩为x,规范图片大小的同时减少运算量#ANTIALIAS可在压缩图片大小时尽量保证图片质量img=img.convert(RGB).resize((,),Image.ANTIALIAS)#将图片转化为数组的形式image.np.array(img)#将图片存入image数组中image.append(img)#读取图片的标签#split(---[1])返回行内容中---后的内容,即图片标签lab=address.split(---)[1]#将标签存入label数组中lab=np.array(int(lab))label.append(lab)except:passdata_image=np.array(image)data_label=np.array(label)#将数据集保存为npz格式np.savez(leaves.npz,train_image=data_image,train_label=data_label))
建立训练模型
读取数据集中的内容并对数据集进行标准化处理,代码如下:
importnumpyasnpimportmatplotlib.pyplotaspltfromkeras.layersimportConv2D,MaxPooling2D,Flatten,Dense,Dropoutfromkeras.modelsimportSequentialformkeras.utilsimportnp_utilsdata=np.load(leaves.npz)train_imgae=data[train_image]train_label=data[train_label]print(data_number:,len(label))print(image.shape,label.shape)
#RGB格式的图片数据范围在0~之间,把数据转化为浮点数类型并/,使数据落在0-1之间train_image_normalize=train_image.astype(float)/#将标签转化为一个有效编码train_label_onehotencoding=np.utils.to_categorical(train_label)
建立CNN模型,CNN卷积神经网络在图片识别方面有广泛的应用,主要包括卷积层,池化层,隐藏层,输出层,通过使用Keras可以很方便的建立模型。
#建立徐关模型,是最简单的模型model=Seqiemtial()#添加卷积层,filter:卷积核的个数,kernel_size:卷积核的大小#padding=same表示不改变图片的大小,input_shape:输入图片的大小,relu为激活函数model.add(Conv2D(filters=32,kernel_size=(3,3),padding=same,input_shape=(,,3),activation=relu))#添加池化层,将x的图片缩小为64x64model.add(Maxpooling2D(pool_size=(2,2)))model.add(Conv2D(filters=16,kernel_size=(3,3),padding=same,activation=relu))model.add(Maxpooling2D(pool_size=(2,2)))model.add(Conv2D(filters=16,kernel_size=(3,3),padding=same,activation=relu))model.add(Maxpooling2D(pool_size=(2,2)))#dropout可随机删除一些隐藏神经元,加快运算速度的同时减少过拟合model.add(Dropout(0.25))#添加平坦层,把多维的数据一维化,用于过度model.add(Flatten())#添加全连接层,units表示神经元数量,kernel_initializer表示产生权重的方式#normal代表以正态分布的方式产生权重model.add(Dense(units=,kernel_initializer=normal,activation=relu))model.add(Dropout(0.25))#这一层作为输出层,softmax可将结果表示为概率的形式model.add(Dense(units=2,kernel_initializer=normal,activation=softmax))
建立模型后即可开始训练
#配置下训练模型,loss:损失函数,optimizer:优化器,通过优化让训练的结果能够更快的收敛model.coile(loss=categorical_crossentropy,optimizer=adam,metrics=[accuracy])#train_image_normalize:训练数据train_label_conhotencoding:训练标签#validation_split:去除一定比例的数据用于验证epoch:训练次数batch_size:每次训练去除多少数据用于训练#verbose:2表示训练过程train_history=model.fit(train_image_normalize,train_label_conhotencoding,validation_split=0.2,shuffle=True,epochs=50,batch_size=,verbose=2)
如图为图片识别准确率随训练次数增加的变化
导出训练模型并测试模型
img=Image.open(apple1.jpg)img=img.resize((,),Image.ANTIZLIAS)show_image(img)
number_data=image_normalize(img)prediction=my_model.predict(number_data)a={0:Itsanappleleaf,1:Itsablueberryleaf}max=(np.argmax(prediction))print(a[max])
img=Image.open(blueberry1.jpg)img=img.resize((,),Image.ANTIZLIAS)show_image(img)
number_data=image_normalize(img)prediction=my_model.predict(number_data)a={0:Itsanappleleaf,1:Itsablueberryleaf}max=(np.argmax(prediction))print(a[max])
训练完成后的模型对两种叶片分类的准确率达到了99%以上,大部分物体的识别都可以按照这个过程进行,非常方便。此外,机器学习对数据集质量的要求较高,数据集的质量极大的影响了模型的准确率,因此一个好的数据集对机器学习的结果至关重要。
预览时标签不可点收录于话题#个上一篇下一篇