1. 课程学习

本节课主要对于大白AI课程:https://mp.weixin.qq.com/s/STbdSoI7xLeHrNyLlw9GOg
《Pytorch 模型推理及多任务通用范式》课程中的第四节课进行学习。
本课程的重点有:

  • 根据 pytorch 模型推理的三板斧:数据预处理、数据进网络、数据后处理,逐行实现了 DeepLabV3 的推理代码

    2. 作业题目

    2.1必做题:

    (1) 对 “./images/car.jpg” 做语义分割,提取出里面的车辆,模仿上课时,对“可视化推

    理结果”和“BGRA 四通道图”进行保存。

    回答:可视化推理结果是一个非黑即白的二值图;但是当它和原图concatenate之后,得到的BGRA四通道图是看不到背景的。BGRA四通道图只能保存为png格式
    car.jpgcar.png

    (2) 自己找 2 张其他图,对图中某个类别进行分割,并保存“BGRA 四通道图”。

    回答:紧跟时事,李云迪。模型的类别index=15。
    ren.pngren.pngren.jpg
    还有一张可爱的小喵咪。模型的类别index=8。
    cat.pngcat.pngcat.jpg

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。
    • 数据后处理【待补充】