第6讲 深度学习(三)
一、目标检测
1.1 基础知识
目标检测是基础的计算机视觉任务,文字检测、人脸检测、行人检测和车辆检测都属于这一范畴。输入是一幅图像 \(I\),输出是图中每个物体的外接框及类别号;前景类别记为 \(1,\ldots,C\),背景类别为 0。边界框可以写成 (left, top, right, bottom),也可以写成 (left, top, width, height)。
这项任务的困难来自两个方面:前景物体的位置、大小、视角、姿态和表观变化很多,背景中又有光照、遮挡与噪声等复杂因素。基本研究思路是:面对过多的可能检测框,在有限候选集合中优选;把尚未定义的判别问题与分类任务联合训练;把冗余输出整理为按物体实例输出;面对前景、背景样本数目不平衡,则采用合理采样、目标函数设计和多尺度处理。
锚框方法先在特征图上给定锚点,再围绕每个锚点生成具有不同尺度和宽高比的锚框。网络先判断锚框中是否有物体;若有,再预测锚框到真实边界框的偏移量,锚框加偏移量得到预测框。训练时用预测偏移量与由真值计算出的真实偏移量之间的误差监督检测分支。
交并比(intersection-over-union, IoU)用来衡量两个框的相似程度。给定区域 \(A,B\),其 Jaccard 系数为
IoU 为 0 表示不相交,为 1 表示完全相同。
COCO(Common Objects in Context)数据集的目标检测标注包含 id、image_id、category_id、segmentation(RLE 或 polygon)、area、bbox: [x,y,width,height] 和 iscrowd: 0 or 1。COCO 的主要检测指标是平均精确率 AP,并在 IoU 从 0.50 到 0.95、步长为 0.05 的多个阈值上统计。
评价多类别检测算法时,要先给定预测框与真值框的 IoU 阈值,例如 0.5。若预测框与真值框的 IoU 大于阈值且类别一致,该预测为真阳性 TP;每个真值框只允许一个预测框成为 TP,其余不满足条件的预测框均为假阳性 FP。漏检是真实为正而预测为负的假阴性 FN,真阴性为 TN。召回率和精确率分别为
改变类别判定阈值、预测框与真值框的 IoU 阈值等设置,可以得到不同的召回率和精确率。单个类别在不同召回率或 IoU 下对应精确率的平均是 AP,多个类别 AP 的均值是 mAP。除准确性外,还要用每秒处理帧数 FPS 衡量运行速度。
目标检测是多任务学习。定位损失衡量预测框与真实框的差异,均方误差可写为
平滑 \(L_1\) 损失为
IoU 类损失直接利用框间几何关系。例如完整 IoU(CIoU)损失写为
其中 \(b\)、\(\hat b\) 分别为预测框和真实框,\(\rho\) 是两框中心的距离,\(c\) 是包住两框的最小边界框对角线长度,\(\alpha v\) 衡量两框宽、高的相对差异。分类分支采用交叉熵损失。
同一物体通常会得到多个重叠预测框。非极大值抑制(non-maximum suppression, NMS)先选得分最高的框,再删除所有与它的 IoU 超过阈值的其他框,重复这一过程得到最终输出。
基于深度学习的检测方法分成两类。单阶段法让图像经过网络一次便预测所有边界框,速度较快,适合移动平台,代表方法有 SSD 和 YOLO。两阶段法先生成可能包含物体的候选区域,再逐一分类并修正位置,代表方法是 Faster R-CNN。
1.2 单阶段法:SSD 与 YOLO
SSD(Single Shot MultiBox Detector)在多尺度特征图上预测每个锚框的类别和边界框。对每个均匀指定的位置,以它为中心组合 \(n\) 个尺度 \(s_1,\ldots,s_n\) 与 \(m\) 个宽高比 \(r_1,\ldots,r_m\),生成多个锚框。
YOLO(You Only Look Once)把归一化输入图像均匀分成 \(S\times S\) 个网格,例如 \(7\times7\);每个网格预测 \(B\) 个边界框,例如 \(B=2\)。每个框输出中心坐标 \(x,y\),它们是框中心相对网格边界的位置;输出宽、高 \(w,h\),它们是框宽、高相对整幅图像宽、高的比例;还输出置信度,即预测框与真值框的 IoU 和分类置信度的乘积。
1.3 两阶段法:R-CNN 系列
R-CNN 把 CNN 引入传统检测流程。传统流程先用不同大小、不同长宽比的滑动窗口遍历图像选区,再用 HOG 等方法提取特征,最后用 SVM 等分类器判别。R-CNN 改为先用候选区域方法产生约 2000 个 RoI,把每个区域变形到 \(224\times224\),分别送入经 ImageNet 预训练的卷积网络提取特征;随后用类别 SVM 分类,并回归四个边界框修正量 \((d_x,d_y,d_w,d_h)\)。它的主要代价是每个候选区域都要单独经过 CNN。
Fast R-CNN 先让整幅图像经过 AlexNet、VGG、ResNet 等主干网络得到特征图,再在特征图上提取候选区域,裁剪并调整为固定大小,最后由区域网络同时输出经 softmax 得到的物体类别和线性层得到的边界框偏移。这样整幅图只需进行一次卷积特征提取。
Faster R-CNN 进一步用基于 CNN 的区域生成网络 RPN 代替传统候选区域方法。其流程为:
conv + ReLU + pooling得到共享特征图,供 RPN 和后续全连接层使用;- RPN 遍历特征图像素作为锚点,每点生成 \(K\) 个不同大小、宽高比的锚框,用 softmax 判断锚框属于物体还是背景,并回归候选框位置;例如输入为 \(3\times640\times480\)、特征图为 \(512\times20\times15\) 时,输出 \(K\times20\times15\) 个 objectness 分数和 \(4K\times20\times15\) 个框变换量,排序后取约 300 个候选框;
- RoI Pooling 根据共享特征图和候选框截取固定尺寸的 RoI 特征;
- 分类分支判别类别并再次精细回归框的位置,最后经 NMS 得到检测结果。
Mask R-CNN 在 Faster R-CNN 的类别预测和边界框回归之外,增加目标前景掩膜分支,把目标检测与实例分割结合起来。它等价于在每个 RoI 上增加一个全卷积网络 FCN,预测 \(28\times28\) 的二值掩膜,目标函数中也增加图像分割的二分类交叉熵。
Fast R-CNN 的 RoI Pooling 会把投影到特征图上的候选区域坐标对齐到离散网格,再近似均分成若干子区域并分别最大池化;例如可以得到 \(512\times2\times2\),实际常用 \(512\times7\times7\) 的固定尺寸特征。坐标取整会造成偏差。Mask R-CNN 改用 RoI Align,通过双线性插值计算 RoI 内规则采样点的特征,再在各子区域中池化,避免粗糙的网格对齐。
检测器的主干网络可以采用 ResNet,并在其上增加特征金字塔网络 FPN。FPN 提取多尺度特征图,以适应目标大小变化。Mask R-CNN 在 COCO 上给出了物体检测与实例掩膜结果,也能处理彼此断开的同一物体区域。
二、图像生成
图像生成可用于视频、图像风格转换。课件依次介绍自编码器、变分自编码器、生成对抗网络以及未配对图像到图像转换的 CycleGAN。
2.1 自编码器
自编码器(AutoEncoder)由编码器和解码器组成,可用于特征提取和去噪。输入 \(x\) 经编码函数 \(f\) 得到内部表示 \(h\),再经解码函数 \(g\) 得到重建值 \(r\):
以带激活函数 \(\sigma\) 的两层映射为例,
课件展示的示例 Autoencoder 由三个全连接层组成,用中间层作为 code,再由后续全连接层重建输入。
稀疏自编码器在重构误差之外增加隐藏表示的稀疏约束:
它让输入图像块经过滤波器得到特征,再形成稀疏编码。多个稀疏自编码器可以逐层堆叠为 Stack AutoEncoder。
课件接着提出问题:若随机生成一个向量作为 code,只经训练好的解码器会得到什么图像?普通自编码器没有显式规定 code 的整体分布,随机向量未必落在训练数据形成的编码区域,所以输出未必可控。变分自编码器(VAE)不直接给出一个确定编码,而是由编码器预测分布参数 \(\mu\) 与 \(\sigma\),从该分布采样 \(z\) 后再解码;这样模型学习的是数据概率分布,可以从分布中采样来生成图像。
从概率生成角度看,生成网络 \(G\) 把较低维先验分布中的随机变量 \(z\) 映射到较高维样本空间,使模型分布 \(P_G(x;\theta)\) 逼近真实数据分布 \(P_{\mathrm{data}}(x)\)。
2.2 生成对抗网络
生成对抗网络(Generative Adversarial Network, GAN)由 Ian Goodfellow 于 2014 年提出,由相互博弈的生成器和鉴别器组成。生成器 \(G\) 把高斯随机噪声 \(z\) 变成合成图像 \(G(z)\),目标是让它看起来像训练集中的真实图像;鉴别器 \(D\) 接收真实图像或合成图像,输出其为真实样本(1)还是伪造样本(0)的判断。训练中二者交替改进。
课件给出的 DCGAN 式生成器以转置卷积逐级上采样:\(z\) 先经 ConvTranspose2d(nz, 8ngf, 4, 1, 0) 得到 \(8ngf\times4\times4\),再依次得到 \(4ngf\times8\times8\)、\(2ngf\times16\times16\)、\(ngf\times32\times32\),最后输出 \(nc\times64\times64\)。中间各层使用 BatchNorm 和 ReLU,末层用 Tanh。
鉴别器按相反方向下采样:输入为 \(nc\times64\times64\),经核大小 4、步长 2、填充 1 的卷积依次变成 \(ndf\times32\times32\)、\(2ndf\times16\times16\)、\(4ndf\times8\times8\)、\(8ndf\times4\times4\),最后用 Conv2d(8ndf, 1, 4, 1, 0) 输出一个判断。中间层用 BatchNorm 和斜率为 0.2 的 LeakyReLU,原始实现末层用 Sigmoid。课件展示了训练过程中生成器输出由模糊逐渐变得清晰的合成图像。
原始 GAN 使用交叉熵,并以 Jensen-Shannon 散度衡量真实与合成样本分布的差异。KL 散度为
令 \(m=(p+q)/2\),Jensen-Shannon 散度为
LSGAN 用最小二乘损失取代原始 GAN 的交叉熵。WGAN 则用 Wasserstein 距离,也称推土机距离或 Earth Mover's Distance,衡量真实与合成分布:
WGAN 的实现改动包括:鉴别器末层去掉 Sigmoid;生成器和鉴别器的损失不再使用对数;每次梯度更新后把权重强制截断到 \([-0.01,0.01]\);优化器采用 RMSprop。
古籍汉字样本生成案例在 GAN 中加入基于字符边缘、骨架的像素级加权图像重构损失,生成器采用 U-Net。合成样本随后与真实样本按不同组合训练 GoogLeNet、ResNet34 和 DenseNet169,识别率如下:
| 训练样本 | GoogLeNet | ResNet34 | DenseNet169 |
|---|---|---|---|
| 真实样本 | 72.68% | 76.92% | 77.34% |
| 合成样本 | 18.54% | 7.88% | 23.58% |
| 合成样本(像素级加权损失) | 22.29% | 6.16% | 22.13% |
| 真实样本与合成样本 | 79.73% | 84.95% | 84.29% |
| 真实样本与合成样本(像素级加权损失) | 78.01% | 83.84% | 84.91% |
结果说明,单独使用合成样本效果较差,而把真实与合成样本结合能明显提高识别率。课件还以 CycleGAN 作为未配对图像到图像转换方法的代表。
本讲要求与思考
本讲应掌握基于多任务学习的目标检测、目标检测所用目标函数和图像生成方法,并完成网络学堂“课程文件→编程实践”中的第 6 讲编程教程。
- 画出 IoU 为 0.5 的两个检测框,分析它们的重叠方式。
- NMS 是贪心算法:先保留得分最高的框 \(M\),再把与 \(M\) 重叠超过阈值的框分数置 0。思考哪些情况下被抑制的框其实应当保留,并查阅 Soft-NMS 如何改进这一处理。
- 深层网络通常随层数增加学到更高层次的抽象表示。思考 FPN 的不同尺度特征是否对应不同抽象层次,以及原因。