一、图像概念
图像是人类视觉的基础,是自然景物的客观反映,是人类认识世界和人类本身的重要源泉。
简单讲:图像是由像素点组成的,每个像素点的取值范围在[0,255]。
像素值越接近于0,颜色越暗,接近于黑色;像素值越接近255,颜色越亮,接近于白色。
在计算机中,按照颜色和灰度的多少可以将图像分为四种基本类型:
①二值图像 ②灰度图像 ③索引图像 ④真彩色RGB图像(深度学习中使用较多)。
图像类型 | 通道数 | 像素值范围 | 主要特点 | 常见用途 |
二值图像 | 1通道 | 0或1 | 每个像素只有黑白两种值 | 形态学操作、二值化、轮廓检测 |
灰度图像 | 1通道 | 0到255 | 每个像素表示灰度(亮度) | 图像预处理、物体检测、人脸识别 |
索引图像 | 1通道 | 0到255(索引) | 像素值为颜色表的索引,颜色表决定实际颜色 | 存储压缩、较少颜色的图像表示 |
RGB图像 | 3通道(R、G、B) | 0到255 | 每个像素由红绿蓝三个通道组成 | 普通色彩图像显示、图像处理与分析 |
图片的表示:
在numpy中:(H,W,C)
在pytorch中:(C,H,W)
三个关键词含义:① 通道:Channel 单位:个
② 高:Height 单位:像素
③ 宽:Width 单位:像素
图像加载:
图像是通过1个二维矩阵或3个二维矩阵表示,矩阵的值就是像素点(特征值);
三大API:
imread()--读取图片像素等信息;imshow()--根据像素等信息画图;imsave()--保存图片。
# 导包
import numpy as np
import matplotlib.pyplot as plt
# TODO 1.绘制黑色图像
# 准备数据
n1 = np.zeros(shape=[2, 2, 3])
print(n1)
# 画图
plt.imshow(n1)
plt.show()
# TODO 2.绘制白色图像
# 准备数据
n2 = np.full(shape=[2, 2, 3], fill_value=255)
print(n2)
# 画图
plt.imshow(n2)
plt.show()
# TODO 3.绘制彩色图像
# 加载数据
n3 = plt.imread('data/img.jpg')
print(n3)
plt.imshow(n3)
plt.show()
# 保存图像
plt.imsave('data/img_save.jpg', n3)
二、CNN介绍
概念:包含卷积层和池化层的神经网络计算模型。
组成:输入层、卷积层、激励层、池化层、全连接层。
其中输入层需要输入图、视频、音频;卷积层用于提取图像特征;激励层用于激活函数;池化层用于降低卷积层特征图维度;全连接层数据是二维数据集,一张图像是1个一维向量, 有多少个值就是有多少个像素点(C*H*W)。
应用于:图像分类、目标检测、面部解锁、自动驾驶等领域。
三、卷积层
1.作用
提取图像特征图,权重共享,局部连接,空间不变性
2.滤波器/卷积核
带有参数的神经元,有多少滤波器就有多少神经元
3.卷积基本计算
卷积运算本质上就是在滤波器和输入数据的局部区域间做点积,根据卷积核大小对特征图进行点乘运算,点乘运算结果=新特征图1个特征值,特征图的窗口矩阵=卷积核大小。
4.padding
在特征图周围补0。防止边缘信息丢失,新特征图和原特征图形状保持一致。
5.stride
窗口矩阵移动步长。降维,提高感受视野。
6.多通道卷积计算
RGB图像有3个通道, 卷积核也有3个通道;每个通道进行点乘运算, 然后3个点乘结果求和=新特征图1个特征值(像素点);1个二维特征图。
7.多通道多卷积核计算
多个卷积核就是多个神经元;每个神经元提取1个二维特征图;有多少个神经元就会提取多少个二维特征图。
8.特征图大小计算
公式:
参数详解:N特征图大小,W输入图像大小,F卷积核大小(奇数),P填充大小,S步长大小
9.API
conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)
参数解释:
in_channels:输入图像的通道数
out_channels:卷积核/神经元个数,有多少个神经元就会提取多少个二维特征图
kernel_size:卷积核形状,滑动窗口大小
stride:步长, 默认1
padding:填充圈数, 默认0
四、池化层
1.作用
降维,只在H和W维度上降维;
和卷积层的核心区别是:没有神经元(卷积核)参与!
2.池化计算
最大池化:提取窗口范围内的最大特征值;
平均池化:提取窗口范围内的平均特征值。
3.多通道池化计算
注意:不改变通道数,只在H和W维度上池化。
4.API
最大池化:nn.MaxPool2d(kernel_size=2,stride=2,padding=1)
平均池化:nn.AvgPool2d(kernel_size=2,stride=1,padding=0)