1. 课程学习
本节课主要对于大白AI课程:https://mp.weixin.qq.com/s/STbdSoI7xLeHrNyLlw9GOg
《Pytorch 模型推理及多任务通用范式》课程中的第四节课进行学习。
本课程的重点有:
- 根据 pytorch 模型推理的三板斧:数据预处理、数据进网络、数据后处理,逐行实现了 DeepLabV3 的推理代码
2. 作业题目
2.1必做题:
(1) 对 “./images/car.jpg” 做语义分割,提取出里面的车辆,模仿上课时,对“可视化推
理结果”和“BGRA 四通道图”进行保存。
回答:可视化推理结果是一个非黑即白的二值图;但是当它和原图concatenate之后,得到的BGRA四通道图是看不到背景的。BGRA四通道图只能保存为png格式。
(2) 自己找 2 张其他图,对图中某个类别进行分割,并保存“BGRA 四通道图”。
回答:紧跟时事,李云迪。模型的类别index=15。


还有一张可爱的小喵咪。模型的类别index=8。


2.2 思考题:
(1) 用 time 模块和 for 循环,对”./images/car.jpg”连续推理 100 次,统计时间开销。
有 CUDA 的同学,改下代码:self.device=torch.device(‘cuda’),统计时间开销。
回答:(基于CPU的推理)
- 单次预测:7.441269874572754
- 有预热的100次预测:658.7587072849274【CPU无需预热,这里的时间差是预测的随机性导致的】
- 无预热的100次预测:674.593109369278
(2) 以 0.5 为阈值,计算”./images/car.jpg”图中车辆的面积(单位:像素)。
102780.98823529412 # 将result上所有非零像素值加一起,再除以255
102781.0 # 统计非零像素的个数。
3.课程笔记
- 语义分割。目前主流方法都是采用全卷积网络,对图像宽高维度进行下采样、上采样,然后进行特征融合,将特征变回输入尺寸大小(保证每个像素在原图中的相对位置),最后用分类任务的损失函数对feature map上每个像素进行分类。因此,不同的语义分割算法基本围绕上、下采样方式,backbone设计来做文章。
- deeplabv3的特点
- 空洞卷积(dilations >1)取代stride=2的下采样卷积,从而在不改变feature map宽高的前提下,来扩大感受野。
- head结构中的ASPP模块,以不同的空洞采样率并行采样,同时提取不同弄感受野下的特征,功能类似于多尺度融合。
- 模型的最终输出feature map的宽高和模型输入的一致
- 引入auxiliary block(用于训练,在推理时可以忽视),为后续提供辅助loss。
- 语义分割模型的推理流程(数据预处理、数据进网络、数据后处理)
- 数据预处理
- 读取图片和标签;
- BGR—>RGB
- 数据增广(随机模糊、随机明亮、随机翻转、resize、随机crop)
- 归一化和根据数据集进行标准化
- 将numpy格式的图像,hwc——>chw,并保证数据类型是float32的。
- 在输入模型之前,还需要将其扩维(np.newaxis),再用torch.from_numpy转为tensor。
- note:
- 需要记录原图尺寸,用于数据后处理将预测结果返回原图
- 语义分割推理时的input_size。
- 关于分类(对整张图打标签)。所以神经网络对全局(global)特征的提取要大于(local)特征。因此推理时不建议特意放大输入尺寸,尽量保持和训练图像一致即可。
- 关于分割和检测,都是在(卷积后地)特征图上做逐像素的学习。因此理论上来说,对原图像素保留的越完整(模型输入inputs_size尺寸越大),模型对小物体的检测和识别能力越强。
- 假设原图15001500,将其resize为5050,那么之前原图上小于30个像素的目标直接没了。
- 要想提高小目标的识别能力,可以在推理时适当加大模型输入。
- 模型的输入需要是stride的倍数(Conv2d与MaxPool),否则很多带有FPN结构的网络下采样之后再上采样没办法 恢复到原来的宽高。
- 如deeplabv3的backbone做了3次stride=2的下采样,所以得到的特征图是原图的1/8。
- YOLO3~5、以及YOLOx做了5次stride=2的下采样,所以得到的特征图比原图小了32倍。
- 数据进网络
- 语义分割模型训练及测试时的类别需要加上背景类。
- 推理时,将aux_loss改为false。但是模型加载时也需要将load_state_dict中农stride改为false。
- 数据后处理【待补充】
- 数据预处理
