system: [SYSTEM]

user: 2. 基于ResNet50网络的布匹良品检验算法 2.1. 网络结构 ResNet的主要优点是可以利用更深层次的网络解决训练误差随网络层数的增加而增大的问题。为了解决该问题，ResNet对传统的网络结构进行了调整，其关键结构是将基本的网络单元增加了一个恒等的快捷连接。如图1所示，H(x)为理想映射，F(x)为残差映射，H(x) = F(x) + x。通过将拟合目标函数H(x)转变为拟合残差函数F(x)，把输出变为拟合和输入的叠加，使得网络对输出H(x)与输入x之间的微小波动更加敏感。 图1. 添加了快捷连接的残差网络单元 综合考虑了网络深度以及计算复杂度的问题，本文选取了ResNet50作为分类网络。ResNet50是残差网络的典型代表之一，与ResNet101和ResNet152相比，有适中的网络深度和计算量，同时能够保持较高的分类准确度。 ResNet50的网络结构图如图2所示，它有两个基本构建块，一个是Identity Block，另一个是Conv Block。Identity Block不改变输入特征图的尺寸和通道数，可以连续串联，其结构如图3所示。Conv Block中存在卷积核大小为1 × 1，步长为2的卷积层，缩小了特征图的尺寸，起到下采样的作用。此外，快捷连接上的特征图与主支路上的特征图在模块末尾进行融合，经过Conv Block的特征图通道数会翻倍，其结构如图4所示。 图2. ResNet50网络结构 图3. Identity Block结构图 图4. Conv Block结构图 ResNet50网络的默认输入为224×224像素的图像，图像经过conv1~conv5的处理后得到大小为7×7的特征图，再经过全局平均池化层和全连接层，最终通过softmax输出对应每个类别的概率。 2.2. 图片数据预处理 本文使用的布匹数据集来自天池大数据竞赛——雪浪AI制造挑战赛，该数据集的图片可分为正常布匹和含瑕疵布匹两大类，其中瑕疵类别中包含了毛边、擦洞、边扎洞、缺经、缺玮等47种缺陷数据。训练集中正常布匹数量为1316张，含瑕疵的布匹数量为706张，测试集中包含正常与瑕疵布匹图片共662张。为了方便在训练中监督模型的收敛效果，本文从训练集中随机抽取10%的图片作为验证集。图片的分辨率统一为2560 × 1920，对于包含瑕疵的图片，数据集提供了记录瑕疵位置的标注文件，如图5所示，图5(a)和图5(b)是正常的布匹，图5(c)含毛边，图5(d)含擦洞，均为瑕疵图像。 图5. 布匹图像数据集 2.2.1. 基于像素区域关系重采样的图片缩放 网络输入图片的像素大小直接影响网络的参数计算量以及特征的学习效果，本文所用的数据集的图片像素均为2560 × 1920。同VGGNet和GoogleNet等网络一样，ResNet50网络的默认图片输入尺寸为224 × 224，若将图片按原图大小直接输入网络，则会造成网络计算复杂度过大，难以训练。所以需要对原数据集的图片进行缩放再放入网络训练。 常见的图片缩放方法为双线性插值法，通过实验发现，采用该方法对原图进行缩放，生成的图片会有波纹状干扰，如图6(a)所示。为了解决此问题，本文采用了基于像素区域关系重采样的图片缩放法，其计算式如下： X s r c = X d s t ∗ ( W i d t h s r c W i d t h d s t ) Y s r c = Y d s t ∗ ( H e i g h t s r c H e i g h t d s t ) (1) 其中 X s r c ， Y s r c 是原图上的位置信息， X d s t ， Y d s t 是目标图像的位置信息。生成的图片如图6(b)所示，可见相对于双线性插值法，基于像素区域关系重采样的图片缩放法有效地减少了波纹状干扰。 图6. 不同缩放方式的对比图 2.2.2. 数据增强 数据增强的作用是扩大有效的训练样本，防止因训练数据太少导致模型学习不充分，训练所得结果无法达到预期 [ 16 ]。 本文首先采用的数据增强方法是对图像进行随机上下翻转和镜像翻转以及90˚旋转生成新的图像。布匹瑕疵不但具有不同的形状，而且瑕疵的角度具有一定随机性。通过原图的随机翻转及旋转可以一定程度上消除样本多样性不足的问题，增强效果如图7所示。其中图7(a)为原图，图7(b)~(d)分别为上下翻转，镜像翻转以及随机旋转90˚的效果图。 此外，还对图片进行了水平和竖直方向上的平移以及随机改变图片亮度并添加高斯噪声来进一步增强训练集，图8(a)是改变了图片亮度及添加了高斯噪声的效果图，图8(b)和图8(c)分别是在水平方向平移和竖直方向平移之后的效果图。 2.3. 基于滑动窗口的检测方法 除了将原图直接缩放到固定尺寸进行训练和测试外，为了更加关注图像中的细节，借鉴了滑动窗口检测 [ 17 ] 的思想构建了新的分类模型，具体做法如下： 图7. 数据增强效果图(1) 图8. 数据增强效果图(2) ① 对于训练集中的正常布匹图片，采用512 × 512的滑动窗口，步长为256进行重采样，获得小图。对于包含瑕疵的图片，若采用同样的方式进行采样，由于大多数缺陷在原图中的面积占比较小，采样得到的大部分图片都不包含瑕疵且存在部分图片仅包含瑕疵边缘。本文计算了重采样得到的小图中瑕疵部分面积与原图瑕疵面积的比值θ。在本文的实验中：当θ大于0.1时，将该小图归为含瑕疵样本，其余图片均归于正常样本。 Class = { normal θ < 0.1 defect   θ ≥ 0.1 (2) 为了保持合理的正负样本比例，本文从正常样本中随机抽取5%的样本量(与原数据集正负样本比例保持接近)作为最终训练集中的正常布匹样本，得到的数据仍使用ResNet50网络进行训练。 ② 对于①中得到的训练集，本文仍采用2.2中的数据增强方式对训练集进行数据增强。 ③ 对于测试集，采用同样的滑窗重采样方式得到小图，对小图分别预测该图为含瑕疵布匹类别的概率，再将排名前三的概率求均值作为该图为含瑕疵布匹类别的概率。 基于滑动窗口的检测方法示意图如图9所示，其中网络输入是由滑动窗口重采样得到的子图，通过网络可以预测每张子图所属的类别。 图9. 滑窗检测示意图 2.4. 损失函数的优化 交叉熵 [ 18 ] 是分类任务中常用的损失函数，对于二分类模型它的损失函数如下： L = − y log y ′ − ( 1 − y ′ ) = { − log y ′ y = 1 − log ( 1 − y ′ ) y = 0 (3) 其中 y ′ 是模型对于实例为正类的预测概率， y ′ ∈ ( 0 ， 1 ) 。使用交叉熵损失函数，对于正样本而言，输出的预测概率越大，则损失越小。对于负样本而言，输出的概率越小则损失越小。当训练样本中存在较多简单的样本，则训练过程会在这些简单样本的迭代上消耗较多时间，且对于那些较难分类的样本，很难进行优化。 本文使用的布匹数据集的瑕疵类别的样本中，存在着一些如破洞、扎洞等较为明显的瑕疵，但同样也存在着如含油脂、织稀等较难区分的样本，为了改善上述的情况，本文借鉴了Focal Loss [ 19 ] 的思想，重新定义了损失函数： L i = { − ( 1 − y ′ ) log y ′ y = 1 − y ′ γ log ( 1 − y ′ ) y = 0 (4) γ > 0 ，与标准的交叉熵损失函数相比，当预测概率较大时，新的损失函数的损失值将会减小，而当预测概率较小时，损失值将会增大，使得训练过程更加关注那些较难区分的样本。 2.5. 训练与测试 数据集的训练与测试的流程图如图10所示。 按照图10(a)的过程对训练集进行训练，每训练完一个epoch，对验证集进行测试，记录在测试集上的准确率并保存模型。训练完后，选取在验证集上表现最好的模型按照图10(b)的步骤对图片进行测试，记录每张图对应于含瑕疵布匹类别的概率，最终计算AUC以及F1分数等评价指标。