窝牛号

基于transformer模型的DETR竟然也可以进行对象分割

DETR模型是Facebook发布的基于Transformer模型的端对端对象检测任务模型-- DETR(detect Transformer模型)。

DETR模型首先使用CNN卷积神经网络搜集图片的核心特征点,然后把这些特征点整合起来,通过embedding方法,把特征图片转换到特征向量空间。然后根据标准Transformer模型的编码器与解码器进行注意力机制的计算,最后把计算后的数据进行图片对象的分类,并根据检测到的位置信息,提供对象box区域,方便我们画图。

上几期图文教程,我们分享了如何使用DETR模型进行对象检测以及代码实现过程,本期我们再分享一下基于transformer模型的DETR如何来进行对象分割。

! pip install git+https://github.com/cocodataset/panopticapi.git from PIL import Image import requests import io import math import matplotlib.pyplot as plt %config InlineBackend.figure_format = &39; import torch from torch import nn from torchvision.models import resnet50 import torchvision.transforms as T import numpy torch.set_grad_enabled(False); import panopticapi from panopticapi.utils import id2rgb, rgb2id

为了进行对象分割,我们首先需要安装相关的第三方库,并基于模型导入需要使用的python包,这里主要是torch以及panopticapi。上面所有的库安装完成后, 便可以运行本期的代码了。

CLASSES = [&39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;, &39;] coco2d2 = {} count = 0 for i, c in enumerate(CLASSES): if c != &34;: coco2d2[i] = count count+=1 transform = T.Compose([T.Resize(800),T.ToTensor(),T.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])

这里依然延续我们介绍的DETR模型的规则,把模型能够识别出来的标签进行罗列出来,方便我们进行一些标签的可视化操作。

model, postprocessor = torch.hub.load(&39;, &39;, pretrained=True, return_postprocessor=True, num_classes=250) model.eval();

然后我们使用torch.hub.load来加载DETR预训练模型,并使用eval来初始化模型,这样我们就可以直接来使用搭建好的模型进行图片的对象分割任务。

image = Image.open(&39;).convert(&34;) img = transform(image).unsqueeze(0) out = model(img)

这里我们从本地加载一张需要模型识别的图片,这里需要注意的一点是使用Image open打开的图片需要把图片颜色空间转换到RGB颜色空间上,否则模型会报错。一旦加载完成图片后,我们使用transform把图片转换到模型需要图片尺寸以及转换到torch变量。以便模型能够读出来加载的图片数据。最后我们把转换好的图片数据直接传递给model模型即可,模型进行预测。预测完成后,我们就可以进行一些可视化的操作了。

scores = out[&34;].softmax(-1)[..., :-1].max(-1)[0] keep = scores > 0.85 ncols = 5 fig, axs = plt.subplots(ncols=ncols, nrows=math.ceil(keep.sum().item() / ncols), figsize=(18, 10)) for line in axs: for a in line: a.axis(&39;) for i, mask in enumerate(out[&34;][keep]): ax = axs[i // ncols, i % ncols] ax.imshow(mask, cmap=&34;) ax.axis(&39;) fig.tight_layout()

首先我们使用softmax 函数来挑选模型预测的数据,并设置置信度。当置信度大于0.85时,我们认为是一个有效的数据。并使用for循环来依次读取相关数据,这里我们可以先进行mask的可视化。

可以看到模型识别出来的对象,已经高亮显示,但是这里的可视化都是模型识别出来的单个图片的mask,我们需要把这些mask图片全部展现在一张图片上,这里我们可以使用DETR的postprocessor预处理函数来得到mask结果,并进行相关的可视化操作。

result = postprocessor(out, torch.as_tensor(img.shape[-2:]).unsqueeze(0))[0] import itertools import seaborn as sns palette = itertools.cycle(sns.color_palette()) panoptic_seg = Image.open(io.BytesIO(result[&39;])) panoptic_seg = numpy.array(panoptic_seg, dtype=numpy.uint8).copy() panoptic_seg_id = rgb2id(panoptic_seg) panoptic_seg[:, :, :] = 0 for id in range(panoptic_seg_id.max() + 1): panoptic_seg[panoptic_seg_id == id] = numpy.asarray(next(palette)) * 255 plt.figure(figsize=(15,15)) plt.imshow(panoptic_seg) plt.axis(&39;) plt.show()

从对象分割的结果来看,基于transformer模型的对象分割任务达到了基于CNN卷积神经网络的效果,其速度与精度都有了相应的改善,相信后期会有更多的模型来基于transformer模型。

扩展阅读:

基于transformer模型的对象检测算法——BETR模型

NLP领域的transformer模型竟然也可以使用到计算机视觉任务上?

Segment Anything Meta开源分割一切模型,为进军元宇宙更近一步

使用Transformer模型进行计算机视觉任务的端对端对象检测

本站所发布的文字与图片素材为非商业目的改编或整理,版权归原作者所有,如侵权或涉及违法,请联系我们删除

窝牛号 wwww.93ysy.com   沪ICP备2021036305号-1