Mask RCNN

Mask R-CNN 是He Kaiming等人于2017年提出的目标检测和实例分割算法,它在Faster R-CNN基础上增加了一个mask分支,实现像素级别的目标识别。通过Region Proposal Network生成候选区域,再利用Fast R-CNN提取特征并预测类别和边界框,最后通过FCN进行像素级分割。该框架简单灵活,取得优于当时state-of-the-art的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mask RCNN这是He Kaiming和Ross Girshick等人在2017新出的一篇文章。
一、文章思想
文章的主要思路就是把原有的Faster-RCNN进行扩展,添加一个分支,在现有的目标检测的基础上,实现对目标像素级别的识别。同时,这个网络结构比较容易实现和训练,速度5fps也算比较快点,可以很方便的应用到其他的领域,像目标检测,分割,和人物关键点检测等。并且比着现有的算法效果都要好,在后面的实验结果部分有展示出来。
二、简介
实例分割(instance segmentation)的难度在于要先对一张图片所有的目标进行正确的检测同时还要对每个示例进行分割。实际上,实例分割是目标识别(object detection)与语义分割(semantic segmentation)的一个结合。目标识别是检测出一幅图像中有什么目标,同时使用标定框(一般为一个矩形框)将目标的位置标定出来。而语义分割是将一张图像中每个像素划定到固定的类别,也就是对每个像素进行分类,在这个过程中不需要关注目标。下面这张图片能更好的理解检测和分割的区别。在同一个检测框中的目标并不属于同一个类别,可能会有不同的像素被区分出来。

这里写图片描述

Mask RCNN 是基于Kaiming 之前的工作 FPN (Feature Pyramid Network) 很形象地说就是用FPN产生的检测结果, 后面加了一个分割的网络. 文章中用到了 Top-Down + Bottom-Up 最近很流行的多层网络, 因为最开始Faster-RCNN只是在最后一层上面检测, 很容易丢掉小目标物体, 并且对细节遮挡也很不敏感. 最近的趋势就是结合多层 特征, 答主孔涛就很早发现了这个insight, 做出了HyperNet 并中了CVPR roal!!!作者:Oh233 链接:https://www.zhihu.com/question/57403701/answer/153060743 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 Mask R-CNN 这个结果确实很强,但要同时注意它主要是加上了许多(都是很有用的)engineering techniques 。 比如说 anchor 从 12 增加到了15个,图像 size 从600变成了800,还有ROI batch size变到了512,从FPN那篇paper来看,这些 better practice 会有对性能十分明显的提升 (table 3 baseline: AP=26.3 -> 31.6)。而我们组16的coco分割竞赛冠军 ,Fully Convolutional Instance-aware Semantic Segmentation (FCIS)的代码昨晚终于开源了。限于计算资源,我们并没有加上这些改进。这些改进应该是比较 general 的,也会适用于 FCIS。欢迎大家试用一波。FCIS 提供了一种简单高效的框架去解决 instance segmentation 的问题。跟之前 COCO 2015 的冠军 MNC 相比,它的主要不同在于 mask estimation 和 detection 是共同做的,而不是先估计 mask 再做 detection。在 FCIS 中 detection/mask estimation 之间通过 inside/outside score map 互相影响,利用了这两个紧密相连 task 之间的共性。现在 release 版本基于支持多卡训练的MXNet,msracver/FCIS。实际上大概今一月份我们就已经写出了外面可以使用的Caffe版本,但是当时官方 Caffe 只支持单卡做复杂任务的训练,对于COCO这种大规模数据集来说用单卡训练的话一下子几周的时间就过去了。考虑到大家用起来会非常蛋疼,最后还是决定没有release这个版本。
### Mask R-CNN 的安装、配置与教程 #### 安装依赖项 为了运行 Mask R-CNN,通常需要先设置环境并安装必要的库。以下是基于 PyTorch 和 Detectron2 的常见方法: 1. **创建虚拟环境** 推荐使用 `conda` 创建独立的 Python 虚拟环境来管理依赖关系。 ```bash conda create -n maskrcnn_env python=3.8 conda activate maskrcnn_env ``` 2. **安装 PyTorch 及其他依赖项** 根据硬件条件(CPU 或 GPU),选择合适的命令安装 PyTorch: ```bash pip install torch torchvision torchaudio ``` 如果需要 CUDA 支持,请访问 [PyTorch官网](https://pytorch.org/get-started/locally/) 获取具体版本。 3. **安装 Detectron2** Detectron2 是 Facebook 提供的一个开源框架,支持多种视觉任务,包括实例分割目标检测。 ```bash git clone https://github.com/facebookresearch/detectron2.git cd detectron2 pip install -e . ``` --- #### 配置自定义数据集 如果计划使用自己的数据集,则需按照以下方式定义它[^3]: 1. **继承 `torch.utils.data.Dataset` 类** 自定义的数据集应实现两个核心函数:`__len__()` 返回数据集中样本的数量;`__getitem__(idx)` 返回指定索引处的图像及其标注信息。 下面是一个简单的例子: ```python import os from PIL import Image import torch from torch.utils.data import Dataset class CustomDataset(Dataset): def __init__(self, root_dir, annotation_file, transform=None): self.root_dir = root_dir self.annotations = json.load(open(annotation_file)) self.transform = transform def __len__(self): return len(self.annotations) def __getitem__(self, idx): img_info = self.annotations[idx] image_path = os.path.join(self.root_dir, img_info['file_name']) image = Image.open(image_path).convert('RGB') targets = { 'boxes': torch.tensor(img_info['bboxes'], dtype=torch.float32), 'labels': torch.tensor(img_info['categories'], dtype=torch.int64), 'masks': torch.tensor(img_info['segmentations'], dtype=torch.uint8) } if self.transform is not None: image, targets = self.transform(image, targets) return image, targets ``` 2. **准备 COCO 格式的标注文件** 大多数现代目标检测工具都接受 COCO 数据格式作为输入。可以参考官方文档将现有标签转换为此格式。 --- #### 使用预训练模型进行推理 Detectron2 已经提供了许多经过充分验证的预训练权重,可以直接加载这些权重来进行测试或微调。 ```python from detectron2.engine import DefaultPredictor from detectron2.config import get_cfg from detectron2.utils.visualizer import Visualizer import cv2 cfg = get_cfg() cfg.merge_from_file("configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml") # 加载配置文件 cfg.MODEL.WEIGHTS = "detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl" cfg.MODEL.DEVICE = "cuda" if torch.cuda.is_available() else "cpu" predictor = DefaultPredictor(cfg) image = cv2.imread("input_image.jpg") outputs = predictor(image) # 执行预测 v = Visualizer(image[:, :, ::-1], scale=1.2) out = v.draw_instance_predictions(outputs["instances"].to("cpu")) cv2.imshow(out.get_image()[:, :, ::-1]) ``` 上述代码片段展示了如何利用 Detectron2 中的默认预测器完成单张图片的目标检测实例分割操作[^1]。 --- #### 微调模型以适应特定场景 当面对全新的应用场景时,可以通过迁移学习调整现有的 Mask R-CNN 模型参数。主要步骤如下: 1. 修改配置文件中的超参设定; 2. 替换原始 COCO 数据路径为本地自定义数据位置; 3. 启动训练过程。 更多细节可查阅相关 GitHub 项目页面或者深入阅读技术博文[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值