综合整理:图像识别、目标检测、语义分割的经典算法pytorch复现

文章目录

  • 前言
  • 一、图像识别
  • 二、目标检测
  • 三、语义分割
  • 总结

前言

本文总结了计算机视觉中图像分类、目标检测、语义分割的一些经典算法,包括论文和对应的代码实现,文章放在了项目的papers目录中,而classification、yolov3、segment三个文件夹下分别存放了三种任务经典论文的pytorch复现或实现,所有的代码基本上只需要改动数据部分就可以直接使用,欢迎有兴趣的小伙伴们下载。文末将给出完整项目的下载地址。

一、图像识别

图像识别这块整理了经典的五篇论文:LeNet、AlexNet、GooLeNet、VGG和ResNet,以及最近比较火的ViT,本文给出了所有这六个模型的pytorch实现,代码存放在classification/model.py中,该目录下的train.py使用Cifar10数据集对它们进行训练和测试。
需要指明的是前五种模型pytorch都有官方实现,直接使用torchvision.models.resnet18这样的语句调用即可,这里自己实现一遍是为了更加深刻理解其实现细节和原理。此外,ViT的设计相对比较特别,建议先搞清楚原版Transformer的原理之后再实现ViT,然后就会觉得ViT相比标准Transformer简直简化了太多。ViT的难点主要是将完整图片划分为小片的过程,本项目的代码中使用了爱因斯坦操作,使得这一过程大大简化。
此外还需要再给出一点提示,ViT虽然近年来比较火,但是其真实能力最多也就是和ResNet相当,同时还具有参数量大等缺点,并且使用相似的结构和训练方式、在很多其他任务上亲测其效果并不如ResNet,ViT最大的优势就是训练起来确实快。但是如果没有特别需求,建议首选ResNet18/50作为Backbone,性价比非常高。

二、目标检测

自认为目标检测是CV所有任务中最复杂、实现起来最难、原理也最难明白的一个子任务,比较著名的方法是区域卷积R-CNN系列以及YOLO系列,本项目只实现了YOLOv3(存放在yolov3目录下),论文整合了这两个系列的全部文献以及一篇综述。
关于YOLOv3的具体原理和实现,这里不多赘述,因为解释起来确实太过复杂了,仅仅数据集预处理就非常麻烦,我是花了将近一个月的时间复现了YOLOv1和v3的,使用的数据集是VOC2007。从评价指标来看,效果并非理想,但是实际的测试效果还算不错,可以检测到图片中的一些目标。下面给出了一些实际测试结果。
综合整理:图像识别、目标检测、语义分割的经典算法pytorch复现_第1张图片综合整理:图像识别、目标检测、语义分割的经典算法pytorch复现_第2张图片
综合整理:图像识别、目标检测、语义分割的经典算法pytorch复现_第3张图片综合整理:图像识别、目标检测、语义分割的经典算法pytorch复现_第4张图片

温馨提示:目标检测真的非常复杂,想要看懂代码必须先看懂论文,尤其要关注“锚盒子”、“区域建议”等概念以及要深刻理解非极大抑制、交并比等评价指标的含义。

三、语义分割

语义分割就是给每一个像素进行分类,听起来似乎很复杂,其实要比目标检测简单得多。简而言之:我们在做图像分类时,都将深度卷积模型用作特征提取器,这个过程是首先通过一层层的卷积把特征图的分辨率不断降低,然后再用一个全连接层把二维、多通道的特征图转换为一维向量(或者也可以理解成)多通道、一维的特征图,上述过程中,由于CNN降低了图像分辨率,所以将这个特征提取的过程也叫做“下采样”(也叫“降采样”)过程。而在做语义分割时,由于是对每个像素进行分类,需要最终的特征图和输入图像的尺寸(分辨率)完全相同才行,前已述及,“下采样(降采样)”减小了特征图的分辨率,那么为得到与输入分辨率相同的特征图,在卷积之后再使用“上采样”的方式将缩小了的特征图“放大”不就行了?这样就有了著名的语义分割模型FCN(全卷积神经网络)和U-net,二者的区别主要是上采样的位置和具体机制不同。
那么怎样做上采样呢?卷积实现了下采样,与之对应,通常我们使用“反卷积”来实现上采样。反卷积,也叫转置卷积,有关其详细解读本文不做详述,pytorch中可以直接通过torch.ConvTranspose2D()函数调用,反卷积的详细实现机制大家可以参考其他文章(网上有很多这方面的解读)。
本项目给出的论文除上文提及的FCN、U-net外还有ASPP、SETR,前者使用了空洞卷积和多尺度信息,后者将ViT用于语义分割,自认为SETR的原理比较扯,复现出的结果也十分糟糕,所以代码中并没有给出。segment/models.py中实现了FCN、U-net模型,代码中前者分别以ResNet18和VGG为backbone,考虑到ASPP也是使用ResNet18为backbone,于是将ASPP作为了一种选项,在模型构建时你可以选择是否使用这种机制。实验所用数据集为VOC2012,voc_data.py给出了数据集的预处理方法。
同样,为体验更加直观,下面给出一组在FCN(backbone为ResNet18)上实际测试的结果。
综合整理:图像识别、目标检测、语义分割的经典算法pytorch复现_第5张图片


总结

由于本学期选修了“计算机视觉”课程,因此对图像识别、目标检测、语义分割的一些经典算法做了一定的了解,并且因为课程的需要,也对它们逐一进行了复现实验,过程中深知初学者缺乏代码参考的苦恼,所以将这学期的工作总结成文,希望能够帮助到更多想要入门或者深入研究CV的小伙伴们。本文所述项目代码组织结构规范、格式统一,包含了从数据处理、模型搭建、训练到评价和打印结果的完整过程,此外,为方便大家的理解,还在项目的/doc目录中附上了三次实验报告。真心希望能够帮助到大家!

完整项目地址:CV-Collection
注意:直接运行代码大概率会报错,主要原因应为数据集找不到或者数据集不匹配等问题,所以大家一定要注意修改数据集的存放地址,VOC 2007和VOC 2012的下载方式本文并未给出,资源很多,请自行下载。

你可能感兴趣的:(计算机视觉,深度学习,人工智能)