0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是图像实例分割?常见的图像实例分割有哪几种?

英特尔物联网 来源:英特尔物联网 作者:英特尔物联网 2021-06-17 11:15 次阅读

实例分割概念

图像实例分割是在对象检测的基础上进一步细化,分离对象的前景与背景,实现像素级别的对象分离。所以图像实例分割是基于对象检测的基础上进一步提升。图像实例分割在目标检测、人脸检测、表情识别、医学图像处理与疾病辅助诊断、视频监控与对象跟踪、零售场景的货架空缺识别等场景下均有应用。很多人会把图像语义分割跟实例分割搞混淆,其实图像的语义分割(Semantic Segmentation)与图像的实例分割(Instance Segmentation)是两个不同的概念,看下图:

pYYBAGDKv6uAYBy_AAB9o95sMt0452.jpg

图-1(来自COCO数据集论文)

左侧是图像语义分割的结果,几个不同的类别人、羊、狗、背景分别用不同的颜色表示;右侧是图像实例分割的结果,对每只羊都用不同的颜色表示,而且把每个对象从背景中分离出来。这个就是语义分割跟实例分割的区别,直白点可以说就是语义分割是对每个类别、实例分割是针对每个对象(多个对象可能属于同一个类别)。

常见的实例分割网络

Mask-RCNN实例分割网络

图像实例分割是在对象检测的基础上再多出个基于ROI的分割分支,基于这样思想的实例分割Mask-RCNN就是其经典代表,它的网络结构如下:

poYBAGDKv6OAFLpIAAEu3WLlC-Q575.jpg

图-2(来自Mask-RCNN的论文)

Mask-RCNN可以简单地认为是Faster-RCNN的基础上加上一个实例分割分支。

RetinaMask实例分割网络

RetinaMask可以看成RetinaNet对象检测网络跟Mask-RCNN实例分割网络的两个优势组合,基于特征金字塔实现了更好的Mask预测,网络结构图示如下:

poYBAGDKv5yACaWHAAEuFuxGlNc218.jpg

图-3(来自RetinaMask论文)

PANet实例分割网络

PANet主要工作是基于Mask-RCNN网络上改进所得,作者通过改进Backbone部分提升了特征提取能力,通过自适应的池化操作得到更多融合特征,基于全链接融合产生mask,最终取得了比Mask-RCNN更好的实例分割效果,该模型的结构如下:

pYYBAGDKv5WAFU5XAAFrIFAWag0086.jpg

图-4(来自PANet论文)

其中全链接特征融合mask分支如下图:

poYBAGDKv4uAQoRpAACclvcVP18135.jpg

图-5(来自PANet论文)

YOLACT实例分割网络

该实例分割网络也是基于RetinaNet对象检测网络的基础上,添加一个Mask分支,不过在添加Mask分支的时候它的Mask分支设计跟RetinaMask有所不同,该网络的结构图示如下:

pYYBAGDKv4WAEUWxAAF74KAjj7A255.jpg

图-6(来自YOLACT作者论文)

CenterMask实例分割网络

该实例网络是基于FCOS对象检测框架的基础上,设计一个Mask分支输出,该Mask分支被称为空间注意力引导蒙板(Spatial Attention Guided Mask),该网络的结构如下:

poYBAGDKv36AKwIOAAEWGfj2k_Q871.jpg

图-7(来自CenterMask论文)

OpenVINO 支持Mask-RCNN模型

OpenVINO 中支持两种实例分割模型分别是Mask-RCNN与YOLACT模型,其中Mask-RCNN模型支持来自英特尔官方库文件、而YOLACT则来自公开的第三方提供。我们这里以官方的Mask-RCNN模型instance-segmentation-security-0050为例说明,该模型基于COCO数据集训练,支持80个类别的实例分割,加上背景为81个类别。

OpenVINO 支持部署Faster-RCNN与Mask-RCNN网络时候输入的解析都是基于两个输入层,它们分别是:

im_data : NCHW=[1x3x480x480]

im_info: 1x3 三个值分别是H、W、Scale=1.0

输出有四个,名称与输出格式及解释如下:

name: classes, shape: [100, ] 预测的100个类别可能性,值在[0~1]之间

name: scores: shape: [100, ] 预测的100个Box可能性,值在[0~1]之间

name: boxes, shape: [100, 4] 预测的100个Box坐标,左上角与右下角,基于输入的480x480

name: raw_masks, shape: [100, 81, 28, 28] Box ROI区域的实例分割输出,81表示类别(包含背景),28x28表示ROI大小,注意:此模型输出大小为14x14

模型实例分割代码演示

因为模型的加载与推理部分的代码跟前面系列文章的非常相似,这里就不再给出。代码演示部分重点在输出的解析,为了简化,我用了两个for循环设置了输入与输出数据精度,然后直接通过hardcode的输出层名称来获取推理之后各个输出层对应的数据部分,首先获取类别,根据类别ID与Box的索引,直接获取实例分割mask,然后随机生成颜色,基于mask实现与原图BOX ROI的叠加,产生了实例分割之后的效果输出。解析部分的代码首先需要获取推理以后的数据,获取数据的代码如下:

float w_rate = static_cast(im_w) / 480.0;

float h_rate = static_cast(im_h) / 480.0;

auto scores = infer_request.GetBlob("scores");

auto boxes = infer_request.GetBlob("boxes");

auto clazzes = infer_request.GetBlob("classes");

auto raw_masks = infer_request.GetBlob("raw_masks");

const float* score_data = static_cast::value_type*>(scores->buffer());

const float* boxes_data = static_cast::value_type*>(boxes->buffer());

const float* clazzes_data = static_cast::value_type*>(clazzes->buffer());

const auto raw_masks_data = static_cast::value_type*>(raw_masks->buffer());

const SizeVector scores_outputDims = scores->getTensorDesc().getDims();

const SizeVector boxes_outputDims = boxes->getTensorDesc().getDims();

const SizeVector mask_outputDims = raw_masks->getTensorDesc().getDims();

const int max_count = scores_outputDims[0];

const int object_size = boxes_outputDims[1];

printf("mask NCHW=[%d, %d, %d, %d] ", mask_outputDims[0], mask_outputDims[1], mask_outputDims[2], mask_outputDims[3]);

int mask_h = mask_outputDims[2];

int mask_w = mask_outputDims[3];

size_t box_stride = mask_h * mask_w * mask_outputDims[1];

然后根据输出数据格式开始解析Box框与Mask,这部分的代码如下:

for (int n = 0; n < max_count; n++) {

float confidence = score_data[n];

float xmin = boxes_data[n*object_size] * w_rate;

float ymin = boxes_data[n*object_size + 1] * h_rate;

float xmax = boxes_data[n*object_size + 2] * w_rate;

float ymax = boxes_data[n*object_size + 3] * h_rate;

if (confidence > 0.5) {

cv::Scalar color(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));

cv::Rect box;

float x1 = std::max(0.0f, xmin), static_cast(im_w));

float y1 = std::max(0.0f, ymin), static_cast(im_h));

float x2 = std::max(0.0f, xmax), static_cast(im_w));

float y2 = std::max(0.0f, ymax), static_cast(im_h));

box.x = static_cast(x1);

box.y = static_cast(y1);

box.width = static_cast(x2 - x1);

box.height = static_cast(y2 - y1);

int label = static_cast(clazzes_data[n]);

std::cout << "confidence: " << confidence << " class name: " << coco_labels[label] << std::endl;

// 解析mask

float* mask_arr = raw_masks_data + box_stride * n + mask_h * mask_w * label;

cv::Mat mask_mat(mask_h, mask_w, CV_32FC1, mask_arr);

cv::Mat roi_img = src(box);

cv::Mat resized_mask_mat(box.height, box.width, CV_32FC1);

cv::resize(mask_mat, resized_mask_mat, cv::Size(box.width, box.height));

cv::Mat uchar_resized_mask(box.height, box.width, CV_8UC3, color);

roi_img.copyTo(uchar_resized_mask, resized_mask_mat <= 0.5);

cv::addWeighted(uchar_resized_mask, 0.7, roi_img, 0.3, 0.0f, roi_img);

cv::putText(src, coco_labels[label].c_str(), box.tl() + (box.br() - box.tl()) / 2, cv::FONT_HERSHEY_PLAIN, 1.0, cv::Scalar(0, 0, 255), 1, 8);

}

}

其中Mask部分的时候有个技巧的地方,首先获取类别,然后根据类别,直接获取Mask中对应的通道数据生成二值Mask图像,添加上颜色,加权混合到ROI区域即可得到输出结果。

责任编辑:lq6

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 图像
    +关注

    关注

    2

    文章

    1065

    浏览量

    40049

原文标题:OpenVINO™ 实现图像实例分割

文章出处:【微信号:英特尔物联网,微信公众号:英特尔物联网】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于深度学习的3D点云实例分割方法

    3D实例分割(3DIS)是3D领域深度学习的核心问题。给定由点云表示的 3D 场景,我们寻求为每个点分配语义类和唯一的实例标签。 3DIS 是一项重要的 3D 感知任务,在自动驾驶、增强现实和机器人导航等领域有着广泛的应用,其中
    发表于 11-13 10:34 629次阅读
    基于深度学习的3D点云<b class='flag-5'>实例</b><b class='flag-5'>分割</b>方法

    机器视觉图像分割的方法有哪些?

    现有的图像分割方法主要分以下几类:基于阈值(threshold)的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的
    发表于 11-02 10:26 387次阅读
    机器视觉<b class='flag-5'>图像</b><b class='flag-5'>分割</b>的方法有哪些?

    机器视觉(六):图像分割

    基于阈值的分割方法是一种应用十分广泛的图像分割技术,其实质是利用图像的灰度直方图信息获取用于分割的阈值,一个或几个阈值将
    的头像 发表于 10-22 11:34 545次阅读
    机器视觉(六):<b class='flag-5'>图像</b><b class='flag-5'>分割</b>

    基于K-means聚类算法的图像分割

    图像分割:利用图像的灰度、颜色、纹理、形状等特征,把图像分成若干个互不重叠的区域,并使这些特征在同一区域内呈现相似性,在不同的区域之间存在明显的差异性。然后就可以将
    的头像 发表于 09-07 16:59 649次阅读
    基于K-means聚类算法的<b class='flag-5'>图像</b><b class='flag-5'>分割</b>

    深度学习在医学图像分割与病变识别中的应用实战

    等方面具有重要意义。本文将介绍这一领域的背景、挑战,以及通过一个代码实例展示如何利用深度学习方法进行医学图像分割与病变识别。 背景与挑战医学图像
    发表于 09-04 11:11

    使用PyTorch加速图像分割

    使用PyTorch加速图像分割
    的头像 发表于 08-31 14:27 506次阅读
    使用PyTorch加速<b class='flag-5'>图像</b><b class='flag-5'>分割</b>

    图像分割算法原理及工作流程

    基于深度学习的图像分割算法属于图像处理领域最高层次的图像理解范畴。所谓图像分割就是把
    的头像 发表于 08-18 15:48 996次阅读
    <b class='flag-5'>图像</b><b class='flag-5'>分割</b>算法原理及工作流程

    印刷电路板的图像分割

     阈值分割图像预处理中关键的步骤,实质是对每一个象素点确定一个阈值,根据阈值决定当前象素是前景还是背景点,目前,已有大量的阈值处理方法,比如全局阈值和局域阈值,是简单的分割方法,而后者则是把整幅图分成许多子
    发表于 08-18 14:27 425次阅读

    什么是图像分割图像分割的体系结构和方法

    图像分割(Image Segmentation)是计算机视觉领域中的一项重要基础技术,是图像理解中的重要一环。前端时间,数据科学家Derrick Mwiti在一篇文章中,就什么是图像
    的头像 发表于 08-18 10:34 2637次阅读
    什么是<b class='flag-5'>图像</b><b class='flag-5'>分割</b>?<b class='flag-5'>图像</b><b class='flag-5'>分割</b>的体系结构和方法

    遗传算法的基本原理 基于遗传算法的图像分割

      摘要:遗传算法是对生物进化论中自然选择和遗传学机理中生物进化过程的模拟来计算最优解的方法。遗传算法具有众多的优点,如鲁棒性、并行性、自适应性和快速收敛,可以应用在图像处理技术领域中图像分割技术
    发表于 07-18 16:04 1次下载

    基于SAM实现自动分割遥感图像实例

    本篇文章为大家介绍RSPrompter: Learning to Prompt for Remote Sensing Instance Segmentation based on Visual Foundation Model (基于视觉基础模型的遥感实例分割提示学习),
    的头像 发表于 07-06 09:08 1050次阅读
    基于SAM实现自动<b class='flag-5'>分割</b>遥感<b class='flag-5'>图像</b><b class='flag-5'>实例</b>

    基于SAM设计的自动化遥感图像实例分割方法

    RSPrompter的目标是学习如何为SAM生成prompt输入,使其能够自动获取语义实例级掩码。相比之下,原始的SAM需要额外手动制作prompt,并且是一种类别无关的分割方法。
    发表于 07-04 10:45 541次阅读
    基于SAM设计的自动化遥感<b class='flag-5'>图像</b><b class='flag-5'>实例</b><b class='flag-5'>分割</b>方法

    人体分割识别图像技术的原理及应用

    人体分割识别图像技术是一种将人体从图像分割出来,并对人体进行识别和特征提取的技术。该技术主要利用计算机视觉和图像处理算法对人体
    的头像 发表于 06-15 17:44 698次阅读

    AI算法说-图像分割

    语义分割是区分同类物体的分割任务,实例分割是区分不同实例分割任务,而全景
    的头像 发表于 05-17 14:44 892次阅读
    AI算法说-<b class='flag-5'>图像</b><b class='flag-5'>分割</b>

    没你想的那么难 | 一文读懂图像分割

    来源:图灵Topia(ID:turingtopia)图像分割(ImageSegmentation)是计算机视觉领域中的一项重要基础技术,是图像理解中的重要一环。近日,数据科学家
    的头像 发表于 05-16 09:21 624次阅读
    没你想的那么难 | 一文读懂<b class='flag-5'>图像</b><b class='flag-5'>分割</b>