用Detectron2在Python中进行物体检测和实例分割

556 阅读4分钟

简介

物体检测是计算机视觉的一个大领域,也是计算机视觉在 "野外 "的更重要的应用之一。一方面,它可以用来建立自主系统,在环境中为代理人导航--无论是执行任务的机器人还是自动驾驶汽车,但这需要与其他领域交叉。然而,异常检测(如生产线上的缺陷产品)、定位图像内的物体、面部检测和其他各种物体检测的应用都可以在不与其他领域交叉的情况下完成。

物体检测并不像图像分类那样标准化,主要是因为大多数新的发展通常是由个别研究人员、维护人员和开发人员完成的,而不是大型库和框架。在TensorFlow或PyTorch这样的框架中打包必要的实用脚本,并维护迄今为止指导开发的API指南是很困难的。

这使得物体检测在某种程度上更加复杂,通常更加冗长(但并不总是这样),而且不如图像分类那样容易接近。处于一个生态系统中的主要好处之一是,它为你提供了一种方法,让你不需要搜索关于良好做法、工具和使用方法的有用信息。对于物体检测--大多数人必须对该领域的景观做更多的研究,以获得一个好的把握。

Meta AI的Detectron2--实例分割和物体检测

Detectron2是Meta AI(前身为FAIR--Facebook AI Research)的开源物体检测、分割和姿态估计软件包--所有这些都是一体的。给定一个输入图像,它可以返回标签、边界框、置信度分数、掩码和物体的骨架。这在资源库的页面上得到了很好的体现。

它的目的是作为一个图书馆使用,你可以在上面建立研究项目。它提供了一个模型动物园,大多数的实现都依赖于Mask R-CNN和一般的R-CNN,还有RetinaNet。他们也有一个相当不错的文档。让我们运行一个典型的推理脚本!

首先,让我们安装依赖项:

$ pip install pyyaml==5.1
$ pip install 'git+https://github.com/facebookresearch/detectron2.git'

接下来,我们将导入Detectron2工具--这就是框架-领域知识发挥作用的地方。你可以使用DefaultPredictor 类构建一个检测器,通过传入一个配置对象来设置它。Visualizer 提供对结果可视化的支持。MetadataCatalogDatasetCatalog 属于Detectron2的数据API,提供内置数据集以及元数据的信息。

让我们导入我们将要使用的类和函数:

import torch, detectron2
from detectron2.utils.logger import setup_logger
setup_logger()

from detectron2 import model_zoo
from detectron2.engine import DefaultPredictor
from detectron2.config import get_cfg
from detectron2.utils.visualizer import Visualizer
from detectron2.data import MetadataCatalog, DatasetCatalog

使用requests ,我们将下载一个图像,并将其保存到我们的本地驱动器:

import matplotlib.pyplot as plt
import requests
response = requests.get('http://images.cocodataset.org/val2017/000000439715.jpg')
open("input.jpg", "wb").write(response.content)
    
im = cv2.imread("./input.jpg")
fig, ax = plt.subplots(figsize=(18, 8))
ax.imshow(cv2.cvtColor(im, cv2.COLOR_BGR2RGB))

这就导致了:

现在,我们加载配置,如果需要的话进行修改(模型默认在GPU上运行,所以如果你没有GPU,你会想在配置中把设备设置为 "cpu")。

cfg = get_cfg()

cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml")
# If you don't have a GPU and CUDA enabled, the next line is required
# cfg.MODEL.DEVICE = "cpu"

在这里,我们指定我们想从model_zoo 。 我们已经导入了一个实例分割模型,基于Mask R-CNN架构,并有一个ResNet50骨架。根据你想实现的目标(关键点检测、实例分割、全景分割或物体检测),你将加载适当的模型。

最后,我们可以用这个cfg 构建一个预测器,并在输入上运行它!Visualizer 类被用来在图像上绘制预测图(在这种情况下,分割的实例、类和边界框:

predictor = DefaultPredictor(cfg)
outputs = predictor(im)

v = Visualizer(im[:, :, ::-1], MetadataCatalog.get(cfg.DATASETS.TRAIN[0]), scale=1.2)
out = v.draw_instance_predictions(outputs["instances"].to("cpu"))
fig, ax = plt.subplots(figsize=(18, 8))
ax.imshow(out.get_image()[:, :, ::-1])

最后,这就形成了:

更进一步--计算机视觉的实用深度学习

你的好奇心使你想进一步了解?我们建议你查看我们的 课程: "用Python进行计算机视觉的实用深度学习".

总结

实例分割比语义分割更进一步,并注意到一个类别(人1、人2等......)的单个实例之间的质量差异,而不仅仅是它们是否属于一个类别。在某种程度上,它是像素级的分类。

在这个简短的指南中,我们快速浏览了Detectron2是如何通过他们的API,使用Mask R-CNN,使实例分割和物体检测变得简单和可及。