MATLAB中图像标注工具——Image Labeler的使用方法

前言

深度学习中无论是什么任务,数据集是必不可少的,我们可以使用公开数据集,但实际情况中由于特定的任务我们可能也不得不手动制作数据集。正好本人最近在一个语义分割任务中涉及自己制作数据集,也就是标注图像,虽然有例如labelme、ITKsnap等软件可以用来标注,但MATLAB也提供了一个非常实用的图像标注工具Image Labeler,可以在APP中找到,可以用来标记矩形感兴趣区域 (ROI) 标签、折线 ROI 标签、像素 ROI 标签和场景标签。语义分割任务中用到的是像素ROI标注功能,因此在本篇博客中记录一下使用的方法,详细的示例可以参考: https://www.mathworks.com/help/vision/ug/get-started-with-the-image-labeler.html.

语义分割

基本概念

个人理解,图像分割是为图像中的每个像素点分配一个标签,表示一个类别。在语义分割中,表示某种属性的所有区域内的像素点往往具有相同的类别,比如常见的分割CT中的肝脏区域,一个街景图像中分割所有的行人。还有一种分割称为实例分割,其实结合面向对象编程从字面意思也可以想到,一个类拥有多个实例,一个街景图像中也有多个行人,实例分割中每个行人的类别都不一样。

标注结果

在图像分类任务中,每一张图像都有一个类别,例如猫、狗等,这是整幅图的标签(label)。我们前面也提到语义分割每个像素点都有一个标签,那么他的标注结果将和原图的像素数量一样多,为此我们可以用一个数字表示一个类别,比如在通常的二类分割(binary segmentation)中,往往把像素点分为前景(foreground)和背景(background),用1表示前景,0表示背景,我们就可以得到和原图尺寸一致的标注图像。比如下面一幅胸部的CT图像,(来源:https://www.chinayikao.com/forum.phpod=viewthread&tid=34849&extra=page%3D1&page=1),原图和其标注的图像如下,标注的图像像素值仅有0和1,0表示除肺部之外的区域,1表示肺部区域,当然为了清晰的显示出来,我们对标注的图像灰度值进行了拉伸:

MATLAB中图像标注工具——Image Labeler的使用方法

标注过程

其标注的过程如下:

  1. 我们首先在MATLAB APP中找到Image Labeler并打开
    MATLAB中图像标注工具——Image Labeler的使用方法
  2. 接下来点击ROI Labels下面的Label图标,就会出现这个对话框 MATLAB中图像标注工具——Image Labeler的使用方法
    设置好之后主界面的左侧就出现了一个关于lung的提示。
    MATLAB中图像标注工具——Image Labeler的使用方法
    图像选择好之后界面为:
    MATLAB中图像标注工具——Image Labeler的使用方法
    从左往右依次为多边形标注工具、Smart Polygon Editor(应该就是Grab Cut的原理)、Assisted Freehand(其实就是一个具有自动吸附功能的多边形标注工具),我们常见的笔刷(Brush)和橡皮(Erase),还有一个自动填充(Flood Fill)的工具。最常用到的应该还是多边形标注工具,当然配合其他的工具使用起来更能提升我们的标注体验,以多边形标注工具为例,我们选择了一个多边形之后
    MATLAB中图像标注工具——Image Labeler的使用方法
    这时你可以用鼠标拖动某个你不满意的多边形顶点修正,之后按回车键确定,也可以不按回车键,直接标注下一个区域这个区域就会自动确定。如果对当前标注的结果不满意,可以按Ctrl+Z撤销,注意:只能撤销上一次的结果,上上次及之前的结果就不可以了。之后我们可以点击Flood Fill图标把边缘区域添加一下,这个Flood Fill用的其实就是区域生长的原理。也可以使用笔刷和橡皮进行细节的修正,分割好的结果为:
    MATLAB中图像标注工具——Image Labeler的使用方法
    文件夹里就是我们分割的结果,gTruth.mat加载之后是 groundTruth对象,这个文件很有用,当你导出分割结果的时候,你会发现文件夹中的标注文件行为“Label_1.png”、“Label_2.png”这种,和原始图像的文件名称不一样,如何去找他们的对应关系呢实,gTruth.DataSource.Source中存储的就是原始的图像路径,这是一个N1的cell数组,每个元素表示一个图像路径,然后gTruth.LabelData.PixelLabelData中存储的就是标注好的文件,同样也是一个N1的cell数组,刚好和上面的原始图像一一对应。通常在后续的处理中,为了避免顺序错乱带来的问题,我们一般都考虑让图像和标注有着相同的文件名而位于不同的文件夹中,我在里面也没找到相应的设置,只能自己动手编程了,其实也不算难,下面我给出一个实现:

写到这里,整个标注流程算是完了,但是我在实际使用过程中遇到一个非常现实的问题,比如你得到了其他软件标注的文件,想修改部分标注的结果该怎么办呢/p>

加载其他软件标注的文件

APP中有一个明显的Import Labels图标,你可以从文件或者工作空间加载标注好的文件,但是只能从文件中加载.mat文件,无法加载整个文件夹,这就有点麻烦了,其实你从上面的内容可以想到,导出的是一个 groundTruth对象,加载的时候也必须是这样一个对象。MATLAB官方给出了一个详细的说明关于如何去创建这样一个对象:
https://www.mathworks.com/help/vision/ref/groundtruth.html.这里结合我的理解说一下,首先对于一个完整的标注流程,必须有三个要素:原始图像,标签的定义和标注的结果,MATLAB中打开上面的gTruth.mat可以发现三个属性

MATLAB中图像标注工具——Image Labeler的使用方法
刚好对应那三个要素,你要想在MATLAB中开始一个标注会话,那么你必须要指定这三个要素,你必须创建一个groundTruth对象,这里我们就不使用上面的例子了,如果我们当前路径下的Imgs、Lables分别保存的是一个数据集中的图像和标注结果,有M个文件,那么下面我给出一段代码用于创建这个groundTruth对象:

来源:脉望虫

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年11月13日
下一篇 2020年11月13日

相关推荐