点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
目录
卷积神经网络简介
其组成部分
输入层
卷积层
池化层
全连接层
CNN 在数据集上的实际实现
卷积神经网络是一种专为处理图像和视频而设计的深度学习算法。它以图像为输入,提取和学习图像的特征,并根据学习到的特征进行分类。
该算法的灵感来自于人脑的一部分,即视觉皮层。视觉皮层是人脑的一部分,负责处理来自外界的视觉信息。它有不同的层,每一层都有自己的功能,即每一层从图像或任何视觉中提取一些信息,最后将从每一层接收到的所有信息组合起来,对图像/视觉进行解释或分类。
同样,CNN有各种滤波器,每个滤波器从图像中提取一些信息,例如边缘、不同种类的形状(垂直、水平、圆形),然后将所有这些组合起来识别图像。
现在,这里的问题可能是:为什么我们不能将人工神经网络用于相同的目的?这是因为ANN有一些缺点:
对于 ANN 模型来说,训练大尺寸图像和不同类型的图像通道的计算量太大。
它无法从图像中捕获所有信息,而 CNN 模型可以捕获图像的空间依赖性。
另一个原因是人工神经网络对图像中物体的位置很敏感,即如果同一物体的位置或地点发生变化,它将无法正确分类。
CNN模型分两步工作:特征提取和分类
特征提取是将各种过滤器和图层应用于图像以从中提取信息和特征的阶段,完成后将传递到下一阶段,即分类,根据问题的目标变量对它们进行分类。
典型的 CNN 模型如下所示:
输入层
卷积层+激活函数
池化层
全连接层
来源:https://learnopencv.com/image-classification-using-convolutional-neural-networks-in-keras/
让我们详细了解每一层。
顾名思义,它是我们的输入图像,可以是灰度或 RGB。每个图像由范围从 0 到 255 的像素组成。我们需要对它们进行归一化,即在将其传递给模型之前转换 0 到 1 之间的范围。
下面是大小为 4*4 的输入图像的示例,它有 3 个通道,即 RGB 和像素值。
来源:https://medium.com/@raycad.seedotech/convolutional-neural-network-cnn-8d1908c010ab
卷积层是将过滤器应用于我们的输入图像以提取或检测其特征的层。过滤器多次应用于图像并创建一个有助于对输入图像进行分类的特征图。让我们借助一个例子来理解这一点。为简单起见,我们将采用具有归一化像素的 2D 输入图像。
在上图中,我们有一个大小为 66 的输入图像,并对其应用了 33 的过滤器来检测一些特征。在这个例子中,我们只应用了一个过滤器,但在实践中,许多这样的过滤器被用于从图像中提取信息。
将过滤器应用于图像的结果是我们得到一个 4*4 的特征图,其中包含有关输入图像的一些信息。许多这样的特征图是在实际应用中生成的。
让我们深入了解获取上图中特征图的一些数学原理。
如上图所示,第一步过滤器应用于图像的绿色高亮部分,将图像的像素值与过滤器的值相乘(如图中使用线条所示),然后相加得到最终值。
在下一步中,过滤器将移动一列,如下图所示。这种跳转到下一列或行的过程称为 stride,在本例中,我们将 stride设为1,这意味着我们将移动一列。
类似地,过滤器通过整个图像,我们得到最终的特征图。一旦我们获得特征图,就会对其应用激活函数来引入非线性。
这里需要注意的一点是,我们得到的特征图小于我们图像的大小。随着我们增加 stride 的值,特征图的大小会减小。
池化层应用在卷积层之后,用于降低特征图的维度,有助于保留输入图像的重要信息或特征,并减少计算时间。
使用池化,可以创建一个较低分辨率的输入版本,该版本仍然包含输入图像的大元素或重要元素。
最常见的池化类型是最大池化和平均池化。
下图显示了最大池化的工作原理。使用我们从上面的例子中得到的特征图来应用池化。这里我们使用了一个大小为 2*2的池化层,步长为 2。
取每个突出显示区域的最大值,并获得大小为 2*2的新版本输入图像,因此在应用池化后,特征图的维数减少了。
到目前为止,我们已经执行了特征提取步骤,现在是分类部分。全连接层(如我们在 ANN 中所使用的)用于将输入图像分类为标签。该层将从前面的步骤(即卷积层和池化层)中提取的信息连接到输出层,并最终将输入分类为所需的标签。
CNN 模型的完整过程可以在下图中看到。
来源:https://developersbreach.com/convolution-neural-network-deep-learning/
我们将使用 Mnist Digit 分类数据集,我们在ANN的实际实现的上一篇博客中使用了该数据集。为了更好地理解CNN的应用,请先参考上一篇博客:https://www.analyticsvidhya.com/blog/2021/08/implementing-artificial-neural-network-on-unstructured-data/
#importing the required libraries
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D
from tensorflow.keras.layers import MaxPool2D
from tensorflow.keras.layers import Flatten
from tensorflow.keras.layers import Dropout
from tensorflow.keras.layers import Dense
#loading data
(X_train,y_train) , (X_test,y_test)=mnist.load_data()
#reshaping data
X_train = X_train.reshape((X_train.shape[0], X_train.shape[1], X_train.shape[2], 1))
X_test = X_test.reshape((X_test.shape[0],X_test.shape[1],X_test.shape[2],1))
#checking the shape after reshaping
print(X_train.shape)
print(X_test.shape)
#normalizing the pixel values
X_train=X_train/255
X_test=X_test/255
#defining model
model=Sequential()
#adding convolution layer
model.add(Conv2D(32,(3,3),activation='relu',input_shape=(28,28,1)))
#adding pooling layer
model.add(MaxPool2D(2,2))
#adding fully connected layer
model.add(Flatten())
model.add(Dense(100,activation='relu'))
#adding output layer
model.add(Dense(10,activation='softmax'))
#compiling the model
model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
#fitting the model
model.fit(X_train,y_train,epochs=10)
输出:
#evaluting the model
model.evaluate(X_test,y_test)
希望这篇文章对你有所帮助。
好消息!
小白学视觉知识星球
开始面向外开放啦
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~