基于卷积神经网络(二维)(视觉)对水果分类

基于卷积神经网络(二维)(视觉)对水果分类

今年的春天和去年格外相似,但要好于去年,研究生两年活生生过成了一年。
使用卷积神经网络对图片进行分类不仅可以用于广大领域的图像识别,更可以用于对机械的故障之诊断研究。首先要将数据集经过一些列变换转化成图像。
将数据转化成图像再进行分类训练的方法有诸多好处,例如采取高斯降噪的方法对图片进行降噪处理从而提高卷积神经网络的训练精度。此外,经过卷积后的图正图像更具有观赏性。
二维卷积神经网络的原理和一维类似,只是将卷积核,卷积步长,池化核以及步长由一维增加到二维,卷积方向由单一的向右,变成了向右向下。数据集的读取也发生了变化。
去年冬天师弟和师妹买的水果被本人用手机照了几张相用于图像识别(哈哈哈,纯属闲的无聊)
在这里插入图片描述
火龙果在这里插入图片描述
金橘在这里插入图片描述
香蕉
杨梅
数据集的制作原理如下图所示:
在这里插入图片描述
每个方框代表一个文件夹
所采取的数据增强原理为,通过对图片进行旋转拉伸压缩等从而达到增加图片数量的目的。
所用代码如下:

from keras.models import Sequential,Model
from keras.layers import Input,Conv2D,MaxPooling2D, BatchNormalization,Activation,Dropout,Flatten,Dense,concatenate,AveragePooling2D,SeparableConv2D
from keras.preprocessing.image import ImageDataGenerator,img_to_array,load_img
import numpy as np
import keras
import tensorboard
from keras.optimizers import SGD
#数据增强
train_datagen = ImageDataGenerator(
    rotation_range = 40,     
    width_shift_range = 0.2, 
    height_shift_range = 0.2,
    rescale = 1/255,         
    shear_range = 20,       
    zoom_range = 0.2,        
    horizontal_flip = True,  
    fill_mode = 'nearest',   
) 

test_datagen = ImageDataGenerator(
    rescale = 1/255,         # 数据归一化
) 
batch_size =16

# 生成训练数据
train_generator = train_datagen.flow_from_directory(
   'C:/Users/1/Desktop/水果/train',
    target_size=(224,224),
    batch_size=batch_size,
    )

# 测试数据
test_generator = test_datagen.flow_from_directory(
    'C:/Users/1/Desktop/水果/test',
    target_size=(224,224),
    batch_size=batch_size,
    )
train_generator.class_indices

#seed = 7
#np.random.seed(seed)
 
def Conv2d_BN(x, nb_filter,kernel_size, padding='same',strides=(1,1),name=None):
    if name is not None:
        bn_name = name + '_bn'
        conv_name = name + '_conv'
    else:
        bn_name = None
        conv_name = None
 
    x = SeparableConv2D(nb_filter,kernel_size,padding=padding,strides=strides,activation='relu',name=conv_name)(x)
    x = BatchNormalization(axis=3,name=bn_name)(x)
    return x
 
def Inception(x,nb_filter):
    branch1x1 = Conv2d_BN(x,nb_filter,(1,1), padding='same',strides=(1,1),name=None)
 
    branch3x3 = Conv2d_BN(x,nb_filter,(1,1), padding='same',strides=(1,1),name=None)
    branch3x3 = Conv2d_BN(branch3x3,nb_filter,(3,3), padding='same',strides=(1,1),name=None)
 
    branch5x5 = Conv2d_BN(x,nb_filter,(1,1), padding='same',strides=(1,1),name=None)
    branch5x5 = Conv2d_BN(branch5x5,nb_filter,(5,5), padding='same',strides=(1,1),name=None)
 
    branchpool = MaxPooling2D(pool_size=(3,3),strides=(1,1),padding='same')(x)
    branchpool = Conv2d_BN(branchpool,nb_filter,(1,1),padding='same',strides=(1,1),name=None)
 
    x = concatenate([branch1x1,branch3x3,branch5x5,branchpool],axis=3)
 
    return x
 

#创建卷积层
inpt = Input(shape=(224,224,3))
x = Conv2d_BN(inpt,64,(7,7),strides=(2,2),padding='same')
x = MaxPooling2D(pool_size=(3,3),strides=(2,2),padding='same')(x)
x = Conv2d_BN(x,192,(3,3),strides=(1,1),padding='same')
x = MaxPooling2D(pool_size=(3,3),strides=(2,2),padding='same')(x)
x = Inception(x,64)#256
x = Inception(x,120)#480
x = MaxPooling2D(pool_size=(3,3),strides=(2,2),padding='same')(x)
x = Inception(x,128)#512
x = Inception(x,128)
x = Inception(x,128)
x = Inception(x,132)
x = Inception(x,208)
x = MaxPooling2D(pool_size=(3,3),strides=(2,2),padding='same')(x)
x = Inception(x,208)
x = Inception(x,256)
x= Flatten()(x)
x = Dropout(0.5)(x)
x = Dense(100,activation='relu')(x)
x = Dense(4,activation='softmax')(x)

import keras
from keras.callbacks import TensorBoard
import time
model_name = "模型名-{}".format(int(time.time()))
tensorboard = TensorBoard(log_dir='logs'.format(model_name),write_images='Ture')
tensorboard=keras.callbacks.TensorBoard(histogram_freq=1)
model = Model(inpt,x,name='inception')
model.compile(optimizer=SGD(lr=1e-3,momentum=0.9),loss='categorical_crossentropy',metrics=['accuracy'])
#model.compile(loss='categorical_crossentropy',optimizer='adam', metrics=['accuracy'])
history=model.fit_generator(train_generator,steps_per_epoch=len(train_generator),epochs=20,validation_data=test_generator,validation_steps=len(test_generator),callbacks=[tensorboard])
#history.history


#画出训练曲线
import matplotlib.pyplot as plt
plt.plot(history.history['accuracy'],color='red')
plt.plot(history.history['loss'],color='red')
plt.plot(history.history['val_accuracy'],color='blue')
plt.plot(history.history['val_loss'],color='blue')
plt.legend(labels=['train-A','train-L','test-A','test-L'],loc='best')
plt.show()

代码中的这一行

test_datagen = ImageDataGenerator(
    rescale = 1/255,         # 数据归一化

意味将不同像素的照片统一压缩成224*224后再进行归一化,这样可以有效降低训练神经网络对计算机配置的要求。不过训练起来依旧非常慢,而且正确率上升速度极慢。毕竟视觉神经网络是富人的游戏。
在这里插入图片描述
训练速度极慢,而且风扇的声音犹如一架快要起飞的飞机。

  • 7
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

让我顺利毕业吧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值