一个maskrcnn的目标检测和实例分割的小例子

时间:2022-07-24
本文章向大家介绍一个maskrcnn的目标检测和实例分割的小例子,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
最近做目标检测,然后记录一下 Faster RCNN、Mask RCNN来做目标检测踩得那些坑。

首先,本文并不是利用Pytorch从头去实现Faster RCNN、Mask RCNN这两个结构的文章。如果有意向去从头实现并了解每一步细节可以看看下面这些视频和博客:

来自B站的两位大佬讲解

  1. 大佬一:视频 博客 GitHub
  2. 大佬二:视频 博客 GitHub

上面都是利用pytorch从原理到具体实现的步骤。

不过本文主要还是利用Pytorch中的Torchvision.model中的Faster RCNN、Mask RCNN来实现迁移学习。

关于如何利用迁移学习来训练自己的数据集,这里也给出两个超赞的教程:

  1. 教程一:TORCHVISION 目标检测网络微调
  2. 教程二:手把手教你训练自己的Mask R-CNN图像实例分割模型(PyTorch官方教程)
  3. 教程三:TorchVision之MaskRCNN训练(推荐)

看完以上三个教程,基本上利用Pytorch中的Torchvision.model中的Faster RCNN、Mask RCNN来实现迁移学习也基本上没问题了。

代码 以及运行教程 获取:

关注微信公众号 datayx 然后回复 mask 即可获取。

AI项目体验地址 https://loveai.tech

下面介绍采坑:

1. 训练自己的数据集

这里讲一下如何制作自己的数据集训练这两个网络:

1.1 准备图片

首先你得准备图片数据,这个数据可能是别人给你提供的,也可能是你自己下载的,反正你得先准备好你的图片并放在一个指定的文件夹里。这里推荐一个批量下载网上图片的工具:IMAGE CYBORG

1.2 数据标注工具(labelme)

现在一般用于目标检测、实力分割的数据集制作的有两个工具:labelme和labeling。至于这两个有什么区别和联系呢,有如下解释:labelimg用于做目标检测,占内存小,labelme用于图像语义/实例分割,占内存大。

安装 pycocotools

在整个过程中你要安装 pycocotools,主要用到其中的IOU计算的库来评价模型的性能。但是这个安装并不简单,看了很多文章相对来说只有这篇文章最符合。(Windows下安装 pycocotools)

2. 定义 Faster RCNN、Mask RCNN 模型

前言

为什么要说这个呢?因为如果你不是很有钱,或者公司有点抠买不起一张8G以上的显卡,不改动就训练这两个网络你基本上不可能成功。懂?财大气粗可以忽略……

因为本人就用的普通显卡(GTX1660,6G内存),训练Faster RCNN、Mask RCNN 这两个网络不要想着使用多GPU运行,我看了GitHub说了在windows上Faster RCNN、Mask RCNN暂时不支持多GPU运行。

幸运的是,在改动一些参数之后就可以完美运行。

Mask R-CNN是基于Faster R-CNN改造而来的。Faster R-CNN用于预测图像中潜在的目标框和分类得分.

而Mask R-CNN在此基础上加了一个额外的分支,用于预测每个实例的分割mask。

有两种方式来修改torchvision modelzoo中的模型,以达到预期的目的。第一种,采用预训练的模型,在修改网络最后一层后finetune。第二种,根据需要替换掉模型中的骨干网络,如将ResNet替换成MobileNet等。

2.1 微调一个预训练好的Faster RCNN模型

假设你想从一个在COCO上预先训练过的模型开始,并想针对你的特定类对它进行微调。下面有一种可行的方法:

2.2 替换 Faster RCNN 模型的骨干网络

场景:替换掉模型的骨干网络。举例来说,默认的骨干网络(ResNet-50)对于某些应用来说可能参数过多不易部署,可以考虑将其替换成更轻量的网络(如MobileNet)。

2.3 微调一个预训练好的Mask RCNN模型(本文使用)

2.4 替换 Mask RCNN 模型的骨干网络

3. 训练过程

具体代码看我GitHub

训练过程总的来说没什么,平平无奇,但还是总结一下几个我遇到的坑。

  1. batch_size不宜过大,过大GPU吃不消
  2. num_workers设置为0,我也不知道我设置成其他数会报错
  3. 学习率lr不宜设置太小,可以循序渐进
  4. 不一定要使用lr_scheduler,可以一直保持一个固定的学习率(我的0.01)由于我内存不够我给他禁了,不过相应engine.py的地方也得修改
  5. Mask RCNN 好像暂时不支持多GPU运行,(会的小伙伴下方请留言)

此外补充一个我在训练时发生的一个BUG: