CNN图像识别_算法篇

article/2025/10/18 10:59:36

CNN图像识别_算法篇

  • 前言
  • Keras
    • 1外层循环
    • 2中部循环
    • 3内部循环
  • Matlab CNN ToolBox
  • 总结

前言

CNN算法方面主要参考的的zh_JNU同学的工作和Deep-Learning-ToolBox-CNN-master的Matlab源码,然后也做了些修改和解读。

Keras

数据库是5钟分类的400张训练数据和100张测试数据,数据库网盘(提取码:f5ze)可能跟环境版本有关,我这边的预处理不能使用cv的方法,所以统一使用cv2里的方法,值得强调的是,Keras版本亦有差异,我这边的版本大致如图
在这里插入图片描述
首先是预处理,利用opencv对图片进行缩放和灰化,将RGB3通道降维到单通道,python果然是“玩弄”字符串的语言

#coding:utf8
import os
import cv2# 遍历指定目录,显示目录下的所有文件名
#width_scale = 192 #缩放尺寸宽度
#height_scale = 128#缩放尺寸高度
write_path = "/data_base/all_data/test_scale/"#要写入的图片路径"/data_base/all_data/train_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 = cv2.imread(child,cv2.IMREAD_GRAYSCALE)#image = cv.LoadImage(child,0)shrink = cv2.resize(image,(126,126),interpolation=cv2.INTER_AREA) #(192,128)cv2.imwrite(write_child,shrink)
#    break
if __name__ == '__main__':filePathC = "/data_base/all_data/test/"##"/data_base/all_data/train/" 训练测试数据集分别处理eachFile(filePathC)

这里的预处理后的维度调整为126*126,主要考虑的是每层池化层的输入都为偶数,卷积核kernel size 为3,那么,输入层126*126 --> 1卷积层124*124–>1池化层62*62–>2卷积层60*60–>2池化层30*30–>3卷积层28*28–>3池化层14*14,接下来就是全连接,预处理后
在这里插入图片描述

然后是测试,包括网络的训练和测试,我这里除了版本兼容上的调整,也做了些改动,
首先是修改后的源码,这里有一些术语,我将它们梳理一下

1外层循环

epoch:完整样本训练的次数;
batch:1个样本空间中样本的个数;
有时1个完整的样本空间可能包含大量的样本,这时需要对样本进行分割,分成minibatch,那么完成 一次样本训练就需要迭代iteration = batch/minibatch;minibatch的一种极限情形就是等于1,理论上不是不可以,但是容易过拟合。

2中部循环

filters:某一个卷积层中卷积核的个数,之后再经过池化层后,每一个filter都会对应一个feature map(特征图)

3内部循环

kernel_size:卷积核的维数,在滑动过程中也会有stride、padding等参数的选取
label:标签的维数,其实我觉得标签的选取还是挺自由的,可以认为每个分类就是一个实数,也可以是种类维度的独热码向量,如果是1*1的实数R,在BP过程可能会简单点,因为均方误差也是一个实数,独热码向量的形式,其实已经被赋予了一定的意义,即每一位代表了样本为该类的可能性(probability)

#coding:utf8
import re
import cv2
import os
import numpy as npfrom keras.models import Sequential
from keras.layers.advanced_activations import LeakyReLU
from keras.layers.core import Dense,Dropout,Activation,Flatten
from keras.layers.convolutional import Conv2D,MaxPooling2D
from keras.optimizers import Adam
from keras.utils import np_utils#得到一共多少个样本
def getnum(file_path):pathDir = os.listdir(file_path)i = 0for allDir in pathDir:i +=1return i
#制作数据集
def data_label(path,count):data = np.empty((count,1,126,126),dtype = 'float32')#建立空的四维张量类型32位浮点label = np.empty((count,),dtype = 'uint8')i = 0pathDir = 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 标签设置为0num = int(mul_num[0])-3
#        print num,each_image
#        cv2.imshow("fad",image)
#        print childarray = np.asarray(image,dtype='float32')array -= np.min(array)array /= np.max(array)data[i,:,:,:] = arraylabel[i] = int(num)i += 1return data,label
#构建卷积神经网络
def cnn_model(train_data,train_label,test_data,test_label):model = Sequential()
#卷积层 12 × 124 × 124 大小model.add(Conv2D(filters = 12,kernel_size = (3,3),padding = "valid",data_format = "channels_first",input_shape = (1,126,126)))model.add(Activation('relu'))#激活函数使用修正线性单元
#池化层12 × 62 × 62model.add(MaxPooling2D(pool_size = (2,2),strides = (2,2),padding = "valid"))
#卷积层 24 * 60 * 60model.add(Conv2D(24,(3,3),padding = "valid",data_format = "channels_first"))model.add(Activation('relu'))
#池化层 24×30×30model.add(MaxPooling2D(pool_size = (2,2),strides = (2,2),padding = "valid"))
#卷积层	48×28×28model.add(Conv2D(48,(3,3),padding = "valid",data_format = "channels_first"))model.add(Activation('relu'))
#池化层	48×14×14model.add(MaxPooling2D(pool_size = (2,2),strides =(2,2),padding = "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,kernel_initializer="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 = 20,epochs = 50,shuffle = "True",validation_split = 0.1)print ('----------------testing------------------------')loss,accuracy = model.evaluate(test_data,test_label)print ('\n test loss:',loss)print ('\n test accuracy',accuracy)
train_path = "/data_base/all_data/train_scale/"
test_path = "/data_base/all_data/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,num_classes = 5)
test_label = np_utils.to_categorical(test_label,num_classes = 5)
cnn_model(train_data,train_label,test_data,test_label)#print getnum('/home/zhanghao/data/classification/test_scale/')
#data_label('/home/zhanghao/data/classification/test_scale/',1)
#cv.WaitKey(0)

在这里插入图片描述
代码是3层卷积+池化再进行全连接,因为kernel_size是33,并且没有对输入样本扩展,所以卷积层后的维数就是Nin-kernel_size+1,池化层是22,所以池化后宽高减半。

查看中间变量的方法,插入观察层,首先要给每一层都取个名字,目前,它的这个打印结果有点令人挠头

#coding:utf8
import re
import cv2
import os
import numpy as npfrom keras.models import Sequential
from keras.layers.advanced_activations import LeakyReLU
from keras.layers.core import Dense,Dropout,Activation,Flatten
from keras.layers.convolutional import Conv2D,MaxPooling2D
from keras.optimizers import Adam
from keras.utils import np_utils
from keras.layers import Densefrom keras.models import Model #得到一共多少个样本
def getnum(file_path):pathDir = os.listdir(file_path)i = 0for allDir in pathDir:i +=1return i
#制作数据集
def data_label(path,count):data = np.empty((count,1,126,126),dtype = 'float32')#建立空的四维张量类型32位浮点label = np.empty((count,),dtype = 'uint8')i = 0pathDir = 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 标签设置为0num = int(mul_num[0])-3
#        print num,each_image
#        cv2.imshow("fad",image)
#        print childarray = np.asarray(image,dtype='float32')array -= np.min(array)array /= np.max(array)data[i,:,:,:] = arraylabel[i] = int(num)i += 1return data,label
#构建卷积神经网络
def cnn_model(train_data,train_label,test_data,test_label):model = Sequential()
#卷积层 12 × 120 × 120 大小model.add(Conv2D(filters = 12,kernel_size = (3,3),padding = "valid",data_format = "channels_first",input_shape = (1,126,126),name="cnn1"))model.add(Activation('relu'))#激活函数使用修正线性单元
#池化层12 × 60 × 60model.add(MaxPooling2D(pool_size = (2,2),strides = (2,2),padding = "valid",name="mxp1"))
#卷积层 24 * 58 * 58model.add(Conv2D(24,(3,3),padding = "valid",data_format = "channels_first",name="cnn2"))model.add(Activation('relu'))
#池化层 24×29×29model.add(MaxPooling2D(pool_size = (2,2),strides = (2,2),padding = "valid",name="mxp2"))
#卷积层		model.add(Conv2D(48,(3,3),padding = "valid",data_format = "channels_first",name="cnn3"))model.add(Activation('relu'))
#池化层	model.add(MaxPooling2D(pool_size = (2,2),strides =(2,2),padding = "valid",name="mxp3"))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,kernel_initializer="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 = 20,epochs = 1,shuffle = "True",validation_split = 0.1)print ('----------------testing------------------------')loss,accuracy = model.evaluate(test_data,test_label)print ('\n test loss:',loss)print ('\n test accuracy',accuracy)##注意缩进 观察层应为模型之中dense1_layer_model = Model(inputs=model.input,outputs=model.get_layer("cnn2").output)dense1_output = dense1_layer_model.predict(train_data)print (dense1_output.shape)weight_Dense_1,bias_Dense_1 = model.get_layer("cnn2").get_weights()	print(weight_Dense_1.shape)print(bias_Dense_1.shape)print(weight_Dense_1)print(bias_Dense_1)train_path = "/data_base/all_data/train_scale/"
test_path = "/data_base/all_data/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,num_classes = 5)
test_label = np_utils.to_categorical(test_label,num_classes = 5)
cnn_model(train_data,train_label,test_data,test_label)##错误
#取某一层的输出为输出新建为model,采用函数模型
#dense1_layer_model = Model(inputs=model.input,
#									outputs=model.get_layer('cnn1').output)
#以这个model的预测值作为输出
#dense1_output = dense1_layer_model.predict(data)#print getnum('/home/zhanghao/data/classification/test_scale/')
#data_label('/home/zhanghao/data/classification/test_scale/',1)
#cv.WaitKey(0)train_path = "/data_base/all_data/train_scale/"
test_path = "/data_base/all_data/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,num_classes = 5)
test_label = np_utils.to_categorical(test_label,num_classes = 5)
cnn_model(train_data,train_label,test_data,test_label)

在这里插入图片描述

Matlab CNN ToolBox

这个工具箱最早是在Github上开源的,论坛上也有很多同学对源码进行解读,我觉得都挺好的,不过,我觉得最好的辅助理解是Sunshine同学写的两层CNN的Matlab实现,他把前一个卷积+池化和后一个卷积+池化之间的前馈和反馈连接关系讲得很清楚,并且,和这个CNN ToolBox的处理方式一致,读者能够很直观地看到各个子层的维数变化

总结

看了挺多资料的,觉得把这两个例子读通,会很有帮助,尤其是Matlab的这个,你可以看到很多细节的处理方式


http://chatgpt.dhexx.cn/article/UHpcvLmQ.shtml

相关文章

人工智能图像识别四大算子

文章目录 背景引入图像识别发展简介边缘检测算法*Prewitt算子**Sobel算子**Laplace算子**Conny算子* * 文末寄语* 背景引入 图像识别是当今计算机科学最热门的研究方向之一。随着科学技术的发展和人类社会的不断进步,图像识别技术在很多行业得到了广泛的应用。本章…

图像识别算法(一)

目录 一、图像识别 二、最近邻分类器(Nearest Neighbor Classifier) 三、k-最近邻分类器(k - Nearest Neighbor Classifier) 四、超参数的设置(Hyperparameter) 五、分析 一、图像识别 对于人脑来说&a…

遗传算法(Genetic Algorithm)解析

00 目录 遗传算法定义生物学术语问题导入大体实现具体细节代码实现 01 什么是遗传算法? 1.1 遗传算法的科学定义 遗传算法(Genetic Algorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一…

遗传算法的手工模拟计算示例(通俗易懂)(包含遗传算法原理、遗传算法代码)

下面是关于“遗传算法”的几个不错的学习资源 遗传算法介绍及手工模拟计算示例(文字版) 遗传算法介绍及手工模拟计算示例(视频讲解版) 遗传算法原理介绍(包含二进制编码、解码原理,算法实现,视…

神经网络中的遗传算法

简 介: 人工神经网络是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。遗传算法是一种引入自然选择和进化思想的优化算法,具有优良的全局寻优性能。在神经网络中借助遗传算法进行网络优化,可以充分利用两者…

遗传算法(Genetic Algorithm)

1、遗传算法的基本思想 遗传算法(Genetic Algorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。 遗传算法(Genetic Algorithm, GA)起…

遗传算法基本原理

遗传算法基本原理 1.遗传算法 GA是基于“物竞天择、适者生存”原理的一种高度并行、随机和自适应优化算法,它将问题的求解表示成“染色体"(chromosome)适者生存的进化过程,通过种群(population)的一代代不断进化,通过选择(selection)、交叉(cross…

多目标遗传算法NSGA-II原理详解及算法实现

在接触学习多目标优化的问题上,经常会被提及到多目标遗传算法NSGA-II,网上也看到了很多人对该算法的总结,但真正讲解明白的以及配套用算法实现的文章很少,这里也对该算法进行一次详解与总结。会有侧重点的阐述,不会针对…

一文搞懂什么是遗传算法Genetic Algorithm【附应用举例】

代码链接放文末。 本文参考了很多张军老师《计算智能》的第四章内容。 本文来源:https://blog.csdn.net/qq_44186838/article/details/109181453 遗传算法 1.1 遗传算法简介 1.1.1 基本原理 重温高中生物哈哈! 遗传算法(Genetic Algor…

遗传算法的基本原理和matlab实现

2016年9月7日星期三 T.s.road 总结笔记 遗传算法解决全局优化(即为最值点如图中C,D),而局部最优解决的是极值点问题(如图中A,B) 1. 遗传算法流程; %遗传算法的伪代码描述&…

遗传算法(三)——基本遗传算法

目录 2.基本遗传算法 2.1基本遗传算法描述 2.1.1基本遗传算法的构成要素 2.1.2基本遗传算法描述 2.1.3基本遗传算法的形式化定义 2.2基本遗传算法的实现 2.2.1个体适应度评价 2.2.2比例选择算子 2.2.3单点交叉算子 2.2.4基本位变异算子 2.3基本遗传算法应用举例 2.3…

遗传算法原理以及matlab代码

目录 1,算法原理以及形象解释 2,参数编码 3,算法框架 4,代码 MATLAB 1,算法原理以及形象解释 遗传算法(Genetic Algorithm, GA)是仿生物智能优化算法,是模拟达尔文生物进化论中…

遗传算法的基本原理

1、简介 遗传算法是一种基于自然选择和群体遗传机理的搜索算法,它模拟了自然选择和自然遗传过程中的繁殖、杂交和突变现象.再利用遗传算法求解问题时,问题的每一个可能解都被编码成一个“染色体”,即个体,若干个个体构成了群体(所有可能解).在遗传算法开始时,总是随机的产生一些…

遗传算法原理介绍

前言 遗传算法( genetic algorithm,GA)是模拟自然界生物进化机制的一种算法,即遵循适者生存、优胜劣汰的法则,也就是寻优过程中有用的保留无用的则去除。在科学和生产实践中表现为在所有可能的解决方法中找出最符合该问题所要求的条件的解决方法,即找出一个最优解。…

遗传算法原理及其matlab程序实现

遗传算法原理及其matlab实现 一、遗传算法背景二、遗传算法原理及其数学模型2.1 编码方式2.1.1 二进制编码2.1.2 浮点数编码 2.2 种群初始化2.3 计算初始种群的适应度函数值2.4 对初始种群个体进行筛选—天泽(以轮盘赌方式进行选择)2.5 个体染色体交叉及…

遗传算法原理及其python实现

遗传算法原理 基本思想: 遗传算法(Genetic Algorithm,GA)是一种进化算法,其基本原理是仿效生物界中的“物竞天择、适者生存”的演化法则,它最初由美国Michigan大学的J. Holland教授于1967年提出。遗传算法…

智能算法——遗传算法原理、应用汇总

一、遗传算法原理 遗传算法(GA)是一种基于生物界规律和自然遗传机制的并行搜索算法。1975 年,J. Holland 教授首次在书中提出“自然组合人工智能系统的适应性”。它是一种多参数,多组合同时优化方法,模拟自然进化过程中…

遗传算法原理

一、遗传算法简介 遗传算法是进化算法的一个分支. 它将达尔文的进化理论搬进了计算机. 科学定义如下: **遗传算法(Genetic Algorithm, GA)**起源于对生物系统所进行的计算机模拟研究。它是模仿自然界生物进化机制发展起来的随机全局搜索和优…

遗传算法

目录 一、算法原理 二、代码实现 三、结果分析 优化目标函数为Rastrigin(x) 目标函数为Schaffer(x) 目标函数为Griewank(x) 总结 一、算法原理 1、基本原理 遗传算法是一种典型的启发式算法,属于非数值算法范畴。其目的是抽象和严谨地解释自然界的适应过程以…

遗传算法(GA)详解

遗传算法(GA)详解 遗传算法主要作用是求解最优解,例如求函数极值,或是飞机巡航问题中的最短巡航路线的求解等,其作用与模拟退火算法的作用较为相似。本文将从GA算法的原理,结构与两个实践应用进行比较详细…