实例分割和目标检测,目标检测和图像分类有何区别?
实例分割和目标检测,目标检测和图像分类有何区别?详细介绍
本文目录一览: 图像识别中的识别、检测、分割、跟踪之间的区别和联系
参考资料: 干货 | 目标检测入门,看这篇就够了(已更完)
目标识别 :对整张图片中的多个目标进行分类,将图片信息结构化为类别信息。例如在动物识别中,如果一张图片中有多只猫和多只鸟,则会被分类为猫和鸟的多类别。
目标检测 :在目标识别的基础上,不但要知道每个目标是属于哪一类,还要知道在图像中的位置,即边框的坐标。而且图中的目标通常也比目标识别中的多
目标分割 :目标分割是对目标进行像素级的目标检测,即不是用边框将目标框起来,而是需要知道哪个像素是不是属于目标的一部分。目标分割又分为语义分割和实例分割。
语义分割 是指只需要知道分割出来的目标属于哪一类。例如在动物目标分割中,如果一张图片中有多只猫,则在进行目标分割后,只需要将它们分类为鸟即可。
实例分割 是指需要知道分割出来的目标属于哪一个实例。例如在动物目标分割中,如果一张图片中有多只猫,则在进行目标分割后,需要将它们分别识别为猫1,猫2,猫3等等
目标跟踪:在视频流中,通过利用时序信息,不但要检测出目标,还要在后续的视频帧里连续检测出目标,而且还要适应目标的尺度变化
2、 目标识别、目标检测、目标分割、目标跟踪 之间的联系
① 目标识别是目标检测的基础
② 目标分割是像素级的目标检测
③ 目标检测是目标跟踪的基础
3、 目标识别、目标检测、目标分割、目标跟踪 之间的区别
① 目标识别关注的是整张图片的整体信息,而目标检测则是只关注图片中特定的目标。例如行人检测中,只关注行人,不关注其他的物体
② 目标分割是像素级的,而目标检测则不是
③ 目标跟踪应用的场景是视频流,而其他的不是
数据标注分为哪几类
数据标注分为:分类标注、目标检测标注、实例分割标注、关键点标注、关系标注等。
1、分类标注
分类标注是最常见的数据标注类型之一,它根据数据的特征将数据分成不同的类别。例如,在图像识别中,分类标注可以将图像分为猫、狗、人等不同的类别。在自然语言处理中,分类标注可以将文本分为正面、负面或中性的情感类别。
2、目标检测标注
目标检测标注是指在图像或视频中标注出特定的目标物体,并给出其位置和形状等信息。这种标注方法常用于自动驾驶、监控系统等应用中。
3、实例分割标注
实例分割标注是指在图像中分割出不同的实例,并给出每个实例的边界框和标签。这种标注方法常用于自动驾驶、机器人视觉等领域中的人或物体检测。
4、关键点标注
关键点标注是指在图像或视频中标注出特定的关键点,例如人脸、身体部位等。这种标注方法常用于人脸识别、行为分析等领域中。
5、关系标注
关系标注是指标注出不同实体之间的关系,例如人与物体的关系、物体与物体的关系等。这种标注方法常用于知识图谱、自然语言处理等领域中。
计算机视觉的研究方向
计算机视觉(Computer Vision)是一门研究如何使计算机能够理解和分析数字图像或视频的学科。计算机视觉的目标是让计算机能够像人类一样对视觉信息进行处理和理解。计算机视觉包括许多不同的子领域和方向,以下是一些主要的方向:
图像识别与分类:这个方向关注如何识别图像中的物体、场景或概念,将图像分为不同的类别。
物体检测:物体检测的任务是在图像中定位特定物体的位置,并用边界框标识出来。
人脸识别:人脸识别专注于检测和识别图像中的人脸,应用于安防监控、社交媒体等领域。
语义分割:语义分割任务是将图像中的每个像素分配给一个类别,从而实现对图像中的各个区域的语义理解。
实例分割:实例分割任务不仅要对图像中的物体进行分类,还需要区分同一类别的不同实例。
姿态估计:姿态估计关注于从图像中检测和识别人体关键点,用于动作识别、运动分析等。
三维重建:三维重建的目标是从二维图像或视频中重建三维场景或物体的几何结构。
光流估计:光流估计是研究如何从图像序列中估计物体运动的方向和速度。
视觉跟踪:视觉跟踪任务是在视频序列中跟踪指定物体的运动轨迹。
图像合成与风格迁移:这个方向关注如何将一种风格应用到另一幅图像上,或者根据给定的条件生成新的图像。
图像修复与增强:图像修复与增强研究如何去除图像中的噪声、模糊等缺陷,以提高图像质量。
目标跟踪与识别:目标跟踪与识别关注在复杂动态场景中实时跟踪和识别感兴趣的物体,例如在运动视频中跟踪运动员、车辆等。
视觉问答(Visual Question Answering, VQA):视觉问答是一种结合计算机视觉和自然语言处理技术的任务,要求系统根据输入的图像回答与图像相关的问题。
视觉搜索:视觉搜索任务是根据用户提供的图像查询相关的信息,例如找到相似的图像、查询图像中物体的价格等。
图像和视频检索:图像和视频检索是在大规模多媒体数据库中找到与查询条件相似或相关的图像和视频的过程。
图像生成:图像生成关注于如何利用深度学习模型生成新的、逼真的图像。
这些方向在很多领域都有广泛的应用,如自动驾驶、医疗影像分析、无人机、智能监控、虚拟现实(VR)和增强现实(AR)等。计算机视觉技术随着深度学习和神经网络的发展不断取得突破性进展,对于许多实际应用场景具有重要价值。
计算机视觉研究的方向如下:
1、图像分类:
图像分类,顾名思义,就是一个模式分类问题,它的目标是将不同的图像,划分到不同的类别,实现最小的分类误差。
2、目标检测:
分类任务给出的是整张图片的内容描述,而目标检测任务则关注图片中特定的目标。检测任务包含两个子任务,其一是这一目标的类别信息和概率,它是一个分类任务。其二是目标的具体位置信息,这是一个定位任务。
3、 图像分割:
图像分割属于图像处理领域最高层次的图像理解范畴。所谓图像分割就是把图像分割成具有相似的颜色或纹理特性的若干子区域,并使它们对应不同的物体或物体的不同部分的技术。这些子区域,组成图像的完备子集,又相互之间不重叠。
4、目标跟踪:
目标跟踪,指的其实就是视频中运动目标的跟踪,跟踪的结果通常就是一个框。目标跟踪是视频监控系统中不可缺少的环节。 根据目标跟踪方法建模方式的不同,可以分为生成式模型方法与判别式模型方法。
5、 图像滤波与降噪:
现实中的数字图像在数字化和传输过程中常受到成像设备与外部环境噪声干扰等影响,称为含噪图像或噪声图像。减少数字图像中噪声的过程称为图像降噪,有时候又称为图像去噪。 降噪可以应用于图像增强和美颜等领域。
计算机视觉包括哪些方向
计算机视觉(Computer Vision)是一门研究如何使计算机能够理解和分析数字图像或视频的学科。计算机视觉的目标是让计算机能够像人类一样对视觉信息进行处理和理解。计算机视觉包括许多不同的子领域和方向,以下是一些主要的方向:
图像识别与分类:这个方向关注如何识别图像中的物体、场景或概念,将图像分为不同的类别。
物体检测:物体检测的任务是在图像中定位特定物体的位置,并用边界框标识出来。
人脸识别:人脸识别专注于检测和识别图像中的人脸,应用于安防监控、社交媒体等领域。
语义分割:语义分割任务是将图像中的每个像素分配给一个类别,从而实现对图像中的各个区域的语义理解。
实例分割:实例分割任务不仅要对图像中的物体进行分类,还需要区分同一类别的不同实例。
姿态估计:姿态估计关注于从图像中检测和识别人体关键点,用于动作识别、运动分析等。
三维重建:三维重建的目标是从二维图像或视频中重建三维场景或物体的几何结构。
光流估计:光流估计是研究如何从图像序列中估计物体运动的方向和速度。
视觉跟踪:视觉跟踪任务是在视频序列中跟踪指定物体的运动轨迹。
图像合成与风格迁移:这个方向关注如何将一种风格应用到另一幅图像上,或者根据给定的条件生成新的图像。
图像修复与增强:图像修复与增强研究如何去除图像中的噪声、模糊等缺陷,以提高图像质量。
目标跟踪与识别:目标跟踪与识别关注在复杂动态场景中实时跟踪和识别感兴趣的物体,例如在运动视频中跟踪运动员、车辆等。
视觉问答(Visual Question Answering, VQA):视觉问答是一种结合计算机视觉和自然语言处理技术的任务,要求系统根据输入的图像回答与图像相关的问题。
视觉搜索:视觉搜索任务是根据用户提供的图像查询相关的信息,例如找到相似的图像、查询图像中物体的价格等。
图像和视频检索:图像和视频检索是在大规模多媒体数据库中找到与查询条件相似或相关的图像和视频的过程。
图像生成:图像生成关注于如何利用深度学习模型生成新的、逼真的图像。
这些方向在很多领域都有广泛的应用,如自动驾驶、医疗影像分析、无人机、智能监控、虚拟现实(VR)和增强现实(AR)等。计算机视觉技术随着深度学习和神经网络的发展不断取得突破性进展,对于许多实际应用场景具有重要价值。
计算机视觉方向有:1、图像分类 2、目标检测 3、 图像分割 4、目标跟踪 5 图像滤波与降噪 6、图像增强 7、 三维重建 8、 图像检索。
计算机视觉的定义:计算机视觉既是工程领域,也是科学领域中的一个富有挑战性重要研究领域。计算机视觉是一门综合性的学科,它已经吸引了来自各个学科的研究者参加到对它的研究之中。其中包括计算机科学和工程、信号处理、物理学、应用数学和统计学,神经生理学和认知科学等。
原理:计算机视觉就是用各种成像系统代替视觉器官作为输入敏感手段,由计算机来代替大脑完成处理和解释。计算机视觉的最终研究目标就是使计算机能象人那样通过视觉观察和理解世界,具有自主适应环境的能力。要经过长期的努力才能达到的目标。因此,人们努力的中期目标是建立一种视觉系统,这个系统能依据视觉敏感和反馈的某种程度的智能完成一定的任务。
医疗计算机视觉
应用:最突出的应用领域是医疗计算机视觉和医学图像处理。这个区域的特征的信息从图像数据中提取用于使患者的医疗诊断的目的。计算机视觉在医疗领域的应用还包括增强人类的感知能力,例如超声图像或X射线图像,以降低受噪声影响的图像。
目标检测和图像分类有何区别?
图像分类:根据图像的主要内容进行分类。
数据集:MNIST, CIFAR, ImageNet
##目标检测(object detection)
给定一幅图像,只需要找到一类目标所在的矩形框
人脸检测:人脸为目标,框出一幅图片中所有人脸所在的位置,背景为非目标
汽车检测:汽车为目标、框出一幅图片中所有汽车所在的位置,背景为非目标
数据集:PASCAL, COCO
##目标识别(object recognition)
将需要识别的目标,和数据库中的某个样例对应起来,完成识别功能
人脸识别:人脸检测,得到的人脸,再和数据库中的某个样例对应起来,进行识别,得到人脸的具体信息
数据集:PASCAL, COCO
##语义分割(semantic segmentation)
对图像中的每个像素都划分出对应的类别,即对一幅图像实现像素级别的分类
数据集:PASCAL, COCO
##实例分割(instance segmentation)
对图像中的每个像素都划分出对应的类别,即实现像素级别的分类,类的具体对象,即为实例,那么实例分割不但要进行像素级别的分类,还需在具体的类别基础上区别开不同的实例。
比如说图像有多个人甲、乙、丙,那边他们的语义分割结果都是人,而实例分割结果却是不同的对象,具体如下图(依次为:原图 ,语义分割 ,实例分割):
数据集:PASCAL, COCO
Python如何图像识别?
首先,先定位好问题是属于图像识别任务中的哪一类,最好上传一张植物叶子的图片。因为目前基于深度学习的卷积神经网络(CNN)确实在图像识别任务中取得很好的效果,深度学习属于机器学习,其研究的范式,或者说处理图像的步骤大体上是一致的。
1、第一步,准备好数据集,这里是指,需要知道输入、输出(视任务而定,针对你这个问题,建议使用有监督模型)是什么。你可以准备一个文件夹,里面存放好植物叶子的图像,而每张图像对应一个标签(有病/没病,或者是多类别标签,可能具体到哪一种病)。
具体实现中,会将数据集分为三个:训练集(计算模型参数)、验证集(调参,这个经常可以不需要实现划分,在python中可以用scikit-learn中的函数解决。测试集用于验证模型的效果,与前面两个的区别是,模型使用训练集和验证集时,是同时使用了输入数据和标签,而在测试阶段,模型是用输入+模型参数,得到的预测与真实标签进行对比,进而评估效果。
2、确定图像识别的任务是什么?
图像识别的任务可以分为四个:图像分类、目标检测、语义分割、实例分割,有时候是几个任务的结合。
图像分类是指以图像为输入,输出对该图像内容分类的描述,可以是多分类问题,比如猫狗识别。通过足够的训练数据(猫和狗的照片-标签,当然现在也有一系列的方法可以做小样本训练,这是细节了,这里并不敞开讲),让计算机/模型输出这张图片是猫或者狗,及其概率。当然,如果你的训练数据还有其它动物,也是可以的,那就是图像多分类问题。
目标检测指将图像或者视频中的目标与不感兴趣的部分区分开,判断是否存在目标,并确定目标的具体位置。比如,想要确定这只狗所佩戴的眼睛的位置,输入一张图片,输出眼睛的位置(可视化后可以讲目标区域框出来)。
看到这里,应该想想植物叶子诊断疾病的问题,只需要输入一整张植物叶子的图片,输出是哪种疾病,还是需要先提取叶子上某些感兴趣区域(可能是病变区域),在用病变区域的特征,对应到具体的疾病?
语义分割是当今计算机视觉领域的关键问题之一,宏观上看,语义分割是一项高层次的任务。其目的是以一些原始图像作为输入,输出具有突出显示的感兴趣的掩膜,其实质上是实现了像素级分类。对于输入图片,输出其舌头区域(注意可以是不规则的,甚至不连续的)。
而实例分割,可以说是在语义分割的基础上,在像素层面给出属于每个实例的像素。
看到这里,可以具体思考下自己的问题是对应其中的哪一类问题,或者是需要几种任务的结合。
3、实际操作
可以先通过一个简单的例子入手,先了解构建这一个框架需要准备什么。手写数字识别可以说是深度学习的入门数据集,其任务也经常作为该领域入门的案例,也可以自己在网上寻找。
1. 简介。
图像处理是一门应用非常广的技术,而拥有非常丰富第三方扩展库的 Python 当然不会错过这一门盛宴。PIL (Python Imaging Library)是 Python 中最常用的图像处理库,目前版本为 1.1.7,我们可以 在这里 下载学习和查找资料。
Image 类是 PIL 库中一个非常重要的类,通过这个类来创建实例可以有直接载入图像文件,读取处理过的图像和通过抓取的方法得到的图像这三种方法。
2. 使用。
导入 Image 模块。然后通过 Image 类中的 open 方法即可载入一个图像文件。如果载入文件失败,则会引起一个 IOError ;若无返回错误,则 open 函数返回一个 Image 对象。现在,我们可以通过一些对象属性来检查文件内容,即:
1 >>> import Image2 >>> im = Image.open("j.jpg")3 >>> print im.format, im.size, im.mode4 JPEG (440, 330) RGB
这里有三个属性,我们逐一了解。
format : 识别图像的源格式,如果该文件不是从文件中读取的,则被置为 None 值。
size : 返回的一个元组,有两个元素,其值为象素意义上的宽和高。
mode : RGB(true color image),此外还有,L(luminance),CMTK(pre-press image)。
现在,我们可以使用一些在 Image 类中定义的方法来操作已读取的图像实例。比如,显示最新载入的图像:
1 >>>im.show()2 >>>
输出原图:
3. 函数概貌。
3.1 Reading and Writing Images : open( infilename ) , save( outfilename )
3.2 Cutting and Pasting and Merging Images :
crop() : 从图像中提取出某个矩形大小的图像。它接收一个四元素的元组作为参数,各元素为(left, upper, right, lower),坐标系统的原点(0, 0)是左上角。
paste() :
merge() :
1 >>> box = (100, 100, 200, 200)2 >>> region = im.crop(box)3 >>> region.show()4 >>> region = region.transpose(Image.ROTATE_180)5 >>> region.show()6 >>> im.paste(region, box)7 >>> im.show()
其效果图为:
旋转一幅图片:
1 def roll(image, delta):2 "Roll an image sideways"34 xsize, ysize = image.size56 delta = delta % xsize7 if delta == 0: return image89 part1 = image.crop((0, 0, delta, ysize))10 part2 = image.crop((delta, 0, xsize, ysize))11 image.paste(part2, (0, 0, xsize-delta, ysize))12 image.paste(part1, (xsize-delta, 0, xsize, ysize))1314 return image
3.3 几何变换。
3.3.1 简单的几何变换。
1 >>>out = im.resize((128, 128)) #2 >>>out = im.rotate(45) #逆时针旋转 45 度角。3 >>>out = im.transpose(Image.FLIP_LEFT_RIGHT) #左右对换。4 >>>out = im.transpose(Image.FLIP_TOP_BOTTOM) #上下对换。5 >>>out = im.transpose(Image.ROTATE_90) #旋转 90 度角。6 >>>out = im.transpose(Image.ROTATE_180) #旋转 180 度角。7 >>>out = im.transpose(Image.ROTATE_270) #旋转 270 度角。
各个调整之后的图像为:
图片1:
图片2:
图片3:
图片4:
3.3.2 色彩空间变换。
convert() : 该函数可以用来将图像转换为不同色彩模式。
3.3.3 图像增强。
Filters : 在 ImageFilter 模块中可以使用 filter 函数来使用模块中一系列预定义的增强滤镜。
1 >>> import ImageFilter2 >>> imfilter = im.filter(ImageFilter.DETAIL)3 >>> imfilter.show()
3.4 序列图像。
即我们常见到的动态图,最常见的后缀为 .gif ,另外还有 FLI / FLC 。PIL 库对这种动画格式图也提供了一些基本的支持。当我们打开这类图像文件时,PIL 自动载入图像的第一帧。我们可以使用 seek 和 tell 方法在各帧之间移动。
1 import Image2 im.seek(1) # skip to the second frame34 try:5 while 1:6 im.seek( im.tell() + 1)7 # do something to im8 except EOFError:9 pass
3.5 更多关于图像文件的读取。
最基本的方式:im = Image.open("filename")
类文件读取:fp = open("filename", "rb"); im = Image.open(fp)
字符串数据读取:import StringIO; im = Image.open(StringIO.StringIO(buffer))
从归档文件读取:import TarIO; fp = TarIo.TarIO("Image.tar", "Image/test/lena.ppm"); im = Image.open(fp)
基本的 PIL 目前就练习到这里。其他函数的功能可点击 这里 进一步阅读。
计算机视觉基本任务研究目标
计算机视觉(Computer Vision)是研究如何使机器“看”的科学,即用摄像机和计算机代替人眼对目标进行识别、跟踪、测量等任务。其与机器视觉的区别在于:计算机视觉侧重对质的分析,如分类识别,这是猫还是狗;或进行身份确认,如车牌识别、人脸识别;或进行行为分析,如人群聚集等;而机器视觉侧重对量的分析,如通过视觉去测量零件的直径。计算机视觉的基本任务包括:图像分类、目标定位、目标检测、图像分割等。
图像分类(Image Classification):图像分类任务的目标是输出给定的图像是什么类别的问题,如回答这是一张猫的图像的问题;
目标定位(Object Localization):目标定位任务的目标是找到图像中某一类别的物体在图像中的位置,输出bounding box;即不仅要识别出是什么类别的物体(类标签),还要给出物体的位置,位置用bounding box标记。 目标定位通常是针对单个物体的。
目标检测(Object Detection):目标检测任务包含分类和目标定位,目标是用多个bounding box分别把多个物体的位置标记出来,并分别给出物体对应的类别。目标检测通常是多个物体的定位任务。即不仅要识别图像中的阿猫阿狗,还要给出阿猫阿狗的位置。
图像分割(Image Segmentation):图像分割任务的目标是将图像细分为多个具有相似性质且不相交的区域,是对图像中的每一个像素加标签的过程,即像素级的分割。图像分割任务主要有语义分割(Semantic Segmentation)和实例分割(Instance Segmentation)两种。语义分割的目标是将输入图像分为不同语义可解释的类别(语义的可解释性即分类类别在真是世界中是有意义的),每一个像素点都要判断其类别,是像素级别的分割。注意语义分割值判断类别不区分个体,例如语义分割将图像中属于汽车的所有像素标记为蓝色,对于图像中有两个蓝色的像素,无法区分他们是属于同一个还是不同的汽车。实例分割的目的是确定图像中存在的兴趣目标位置和类别,机器自动从图像中用目标检测方法框出不同实例,再用语义分割方法在不同实例区域内进行逐像素标记。实例分割是目标检测和语义分割的结合,但又不同于目标检测和语义分割。相对物体检测的边界框,实例分割可精确到物体的边缘;相对语义分割,实例分割可以标注出图上同一物体的不同个体,即哪些像素属于第一辆汽车,哪些像素属于第二辆汽车。最后,还有一个全景分割,它是语义分割和实例分割的结合。即每个像素都被分为一类,如果一种类别里有多个实例,会用不同的颜色进行区分,就知道哪个像素属于哪个类中的哪个实例。
注:上述任务中,最基本的是分类任务,其他任务都可在分类任务的基础上,通过一些技术手段解决,例如在图片中加入很多窗口,提取每一个窗口的特征,然后预测分类,并将分类一样并相邻的窗口合并,就成了目标定位和目标检测。
本文内容参考资料:
https://www.jianshu.com/p/45acc16c6a94
https://blog.csdn.net/qq_39295044/article/details/79796663
https://zhuanlan.zhihu.com/p/50996404
https://blog.csdn.net/niaolianjiulin/article/details/52948274
https://zhuanlan.zhihu.com/p/39272659
分割原理体现出了为解决物理矛盾而进行的什么分离
空间和条件分离。
我们知道一个图像只不过是许多像素的集合。图像分割分类是对图像中属于特定类别的像素进行分类的过程,因此图像分割可以认为是按像素进行分类的问题。
传统的图像分割算法均是基于灰度值的不连续和相似的性质。而基于深度学习的图像分割技术则是利用卷积神经网络,来理解图像中的每个像素所代表的真实世界物体,这在以前是难以想象的。
基于深度学习的图像分割技术主要分为两类:语义分割及实例分割。
语义分割会为图像中的每个像素分配一个类别,但是同一类别之间的对象不会区分。而实例分割,只对特定的物体进行分类。这看起来与目标检测相似,不同的是目标检测输出目标的边界框和类别,实例分割输出的是目标的Mask和类别。
“分割原理”是TRIZ中40条发明原理的NO.1。意指:将一个有形或无形的物体分成若干部分,或独立存在、或可合并和装拆。具体方法如下:
(1)把一个物体分成相互独立的部分;
(2)将物体分成容易组装和拆卸的部分;
(3)进一步分割,加以改造。
TRIZ——分割原理·利弊:
由上述例子可知,分割原理有至少三点优势:
(1)分割后,我们可以更好分析其特性;
(2)分割的物体能更灵活的进行操作和处理;
(3)便于生产,能够产生新的事物。
当然我们也需要注意到分割原理可能产生如下的一些副作用:
(1)可能增加事物的复杂性;
(2)可能失去事物原本的能力和作用;
(3)分割的可行性需要更多的考虑和验证。
数据标注的方式描述标注
可以使用分类、边界框、语义分割、实例分割的标注方式来对数据进行标注描述。
基于分类的标注是将数据按照预定义的类别或标签进行分类,这种标注方式适用于需要将数据分成互不重叠的类别或进行有限选项的分类任务。例如,在图像识别任务中,可以使用二分类标签将图像分类为是否包含某种特定物体,或者使用多分类标签将图像分类为不同的物体类别。
而基于边界框的标注是在图像或视频中绘制出包围目标区域的矩形框,用于确定目标的位置和大小。这种标注方式适用于目标检测、目标跟踪等任务。通过标注目标的边界框,可以让计算机识别和定位目标。基于语义分割的标注是将图像中的每个像素分配给不同的语义类别,这种标注方式适用于图像分割任务,可以精确地标注图像中不同区域的语义信息。
其他的标注方式
基于实例分割的标注是在图像中为每个对象单独标注一个独立的分割区域。这种标注方式适用于需要区分和识别多个对象的场景,如多目标检测和实例分割任务。通过为每个对象绘制独立的分割区域,可以让计算机对每个对象进行独立的识别和分析。对于文本数据,可以使用一些标注方式来描述。
比如命名实体识别,根据预定义的实体类别将文本中的实体进行标注。情感分析,根据情感极性将文本进行标注为正面、负面或中性等。需要根据具体任务和数据类型选择适当的标注方式,并确保标注准确和一致性。标注的质量对于后续的数据分析和机器学习模型的训练具有重要影响,因此在标注过程中需要仔细考虑和遵循标注规范和标准。
Lecture 11 检测与分割
我们之前都是图像分类的任务,最后一个全连接层得到所有分类的得分。现在我们来研究计算机视觉的其他任务,比如语义分割、图像分类与定位、目标检测、实例分割等。
在 语义分割 任务中,输入一张图片,希望输出能对图像的每个像素做出分类,判断这个像素是属于物体或者背景,不再像之前那样整张图片都是一个类。语义分割不会区分实例,只关心像素,所以如果图中有两头牛,会把两块像素都归为牛,不会分开每一头,以后会讲到 实例分割 (Instance Segmentation)可以区分实例。
实现语义分割的一个想法是 滑动窗口 ,即将图像分成一个个的小块,然后使用CNN网络计算小块的中心元素属于哪个分类。这样做的一个问题是,需要为每个像素计算一次,很多运算都是重复的,实际上没人会这么做。
另一个想法是 全卷积 ( Fully Convolutional),将网络的所有层都设计成卷积层,这样就能实现一次对图像的所有像素进行预测。比如使用3x3的卷积层然后使用零填充保持输入输出的空间尺寸,最终得到一个CxHxW的特征图,其中C是像素分类的数量,这样的一个特征图就一次计算了所有像素的分类得分。然后使用交叉熵损失、取平均、反向传播等操作进行训练。由于要为每个像素设置标签,这样的数据集花费是非常昂贵的。这里的数据集需要先确定图像属于哪个类别,比如猫,然后对图像的像素点设置类别。实际应用中,如果一直保持空间尺寸的话计算量会很庞大,所以不能设置这种结构。
使用全卷积网络的一种好的形式是在网络内部使用 降采样 (downsampling)然后使用 升采样 (upsampling),只在最初的几个卷积层保持尺寸,然后降采样比如池化或跨进卷积(strided convolution)来降低尺寸,进行一系列卷积后升采样到原来的尺寸。之所以需要去池化是因为池化减少了像素值,降低了图像的清晰度,丢失了图像空间结构,不知道这些像素原来在哪里,所以也就不明确边界应该在什么位置,所以需要进行去池化得到这些空间信息。
然后问题是如何进行升采样呢?
在一维中可能会表现的更清晰:滤波器被输入加权后直接放到输出中,输出的步长为2,下一个位置要平移两个像素,重叠的部分直接相加。最后为了使输出是输入的两倍,需要裁掉一个像素。
之所以称作转置卷积,可以通过矩阵乘法来解释,以一个一维的输入为例 a = [a, b, c, d],现在做 3x1 的卷积,卷积核为 [x, y, z],步长1填充1,此时的卷积可以看作是卷积核组成的一个大的矩阵 X 与输入 a 做乘法,如下图左边所示。(图上应为xyz,书写错误。)卷积核在输入 a 上滑动对应元素相乘后相加得到输出的过程,完全等价于卷积核组成的大矩阵与输入 a 的乘法。然后将 X 转置与 a 相乘,即转置卷积,结果就是一个正常的卷积,改变的只是填充规则。
现在如果步长为2,情况就不一样了。左边的卷积仍然可以看作是乘法,而右侧的转置卷积就变成用输入加权后的卷积核在输出上的叠加。
综上,语义分割任务的实现方法如下图所示:
此外, 多视角3D重建 ( Multi-view 3D Reconstruction)也使用了降采样和升采样的方法。
定位 ( Localization)往往是与 分类 (Classificatio)结合在一起的,如果图片分类是一只猫,同时我们也想知道猫在这张图片的什么位置,要用一个框给框起来。这与 目标检测 (Object Detection)是不同的,定位是一旦图像已经归为哪一类,比如猫,这样我们就会有一个明确的目标去寻找,找出它的边界即可。而目标检测是要检测出图像上存在的物体。
定位可以复用分类的方法,比如AlexNet。如下图所示,最后一个全连接层,除了得到1000个类别的得分,还会得到一个长为4的向量,表示目标的位置。这样最后就有两个损失,一个是正确分类的Softmax损失,另一个是正确位置的L2损失,L1、L2等损失也称作 回归损失 (Regression Loss)。最后将两个损失通过某些超参数加权得到总损失,和之前的超参数不同的是,以前的超参数改变是为了减小损失,而这里的加权超参数直接会改变损失值的表达式,损失变大变小都有可能。使用总损失求梯度。这里使用的网络是使用ImageNet 预训练过的模型,进行迁移学习。
目标检测任务是这样的:我们有几个感兴趣的类别,比如猫狗鱼等等,现在输入一张图像,图像上有几个物体事先是不知道的,当我们我们感兴趣的物体在图像上出现时,我们希望模型能自动标记出目标物体的位置,并判断出具体的分类。这实际上是很有挑战的任务,也是计算机视觉中很核心的任务,对此的研究已经经历了很多年,也有非常多的方法。
与定位最大的区别是,我们不知道图上会有多少对象。比如图像上只有一只猫,我们最终的输出只有一个位置四个数字;有两只狗一只猫,会输出3个位置12个数字;那么有一群鸭子呢?数量就很多了。所以目标检测问题不能看作定位中的回归问题。
另一个想法是把目标检测问题看作分类问题。类似语义分割的想法,将图像分成一个个的小块,让每一个小块通过卷积网络判断这块是背景?是猫?是狗?可以这么想,但是这个小块该怎么获得呢?不同的物体可能会有不同的大小、位置以及长宽比,这将是无数的情况,如果都要进行卷积,那么计算量是非常大的。
实际上,更实用的方法是 候选区域 (Region Proposals )方法。 选择性搜索 (Selective Search )方法就是在目标对象周围设定2000个形状大小位置不一的候选区域,目标物体在候选区域的可能性还是比较大的。然后对这些区域卷积,找到目标物体,虽然大多数区域都是无用的。与寻找几乎个区域比起来,这种方法要高效的多。此外,这不是深度学习的方法,是机器学习算法。 R-CNN 就是基于这种观点提出的。首先对输入图片使用区域备选算法,获取2000个感兴趣的区域(Regions of interest, roi),由于这些区域大小不一,所以需要处理成同样的尺寸才能通过CNN,之后使用SVM对区域进行分类。可以使用线性回归损失来校正包围框,比如虽然这个框选中的物体是一个缺少头部的狗,就需要对包围框进行校正。总之,这是一个多损失网络。
R-CNN的问题是计算消耗大、磁盘占用多、运行速度慢,即使测试时也要30秒测试一张图片,因为有2000个区域。解决方法时使用 快速R-CNN (Fast R-CNN ),不在原始图像生成备选区域,而是先整张图片通过卷积网络得到特征图,然后在特征图上使用备选区域算法得到感兴趣的区域在特征图的映射,之后使用 Rol Pool将所有区域变成同样尺寸。然后一方面使用softmax损失进行分类,一方面使用回归损失比如L1平滑损失校正包围框,总损失是两部分的和,然后反向传播进行训练。
如下图所示,效果还是很明显的。但是快速R-CNN也有一个问题是运行时间被区域备选方案限制。
解决方案是 更快的R-CNN (Faster R-CNN)。这种方法的改进是与其使用固定的算法得到备选区域,不如让网络自己学习自己的备选区域应该是什么。如下图所示,前面仍然是通过卷积网络获得特征图,然后通过一个 备选区域网络 (Region Proposal Network,RPN),该网络会做两件事,一是计算分类损失,选择的区域是目标还是不是目标;二是校正包围框。得到备选区域后接下来的步骤就和快速R-CNN一致了,也是得到最后的分类得分和校正包围框。训练的过程会综合这四个损失,最终效果很好。
Mask R-CNN是在Faster R-CNN基础上改进而来,是2017年发布的方法。首先将整张图像通过卷积网络和候选框生成网络,得到候选特征在特征图上的映射再调整尺寸,到这里和Faster R-CNN都是相同的;现在不仅是得到分类得分和校正包围框,还要增加一个分支通过卷积网络对每一个候选框预测一个分割区域模板。这个新增的分支就是一个在候选框中进行的微型语义分割任务。这样上下两个分支的任务就很明确了——上面的分支需要计算分类得分确定候选框中的目标属于哪个分类以及通过对候选框坐标的回归来预测边界框的坐标;下面的分支基本类似一个微型语义分割网络,会对候选框中的每个像素进行分类,判断每个像素是否属于候选框的中目标。
Mask R-CNN综合了上面讲的很多方法,最终的效果也是非常好的。比如下图最左边,不仅框出了每个物体还分割了像素,即使很远地方的人也被清晰的分割出来了。
此外,Mask R-CNN也可以识别动作,方法是在上面分支中增加一个关节坐标损失,这样就能同时进行分类、检测、动作识别、语义分割。此外,基于Faster R-CNN,运行速度也是非常快的。下图展示的效果是很令人惊讶的,可以同时识别出图上有多少人,分割出他们的像素区域,并且会标示他们的动作姿势。
使用前馈模型。
YOLO 即 “You Only Look Once” 和 SSD 即 “Single-Shot MultiBox Detector”,这两个模型是在同一时期提出的(2016),它们不会使用候选框分别进行处理,而是尝试将其作为回归问题,通过一个大的卷积网络,一次完成所有预测。给定输入图像,分成网格状比如7x7,然后在每个小单元中心处使用 B 个基本的边界框,比如高的、宽的、正方形的,这样总共有 7x7xB个基本框。现在想对每个网格单元的所有基本边界框预测目标物体,首先要预测每个基本边界框偏移来确定边界框和真实物体的位置差值,使用5个值(dx, dy, dh, dw, confidence)来表示偏差;然后预测每个网格单元里目标的 C 个分类(包括背景)得分,这样每个网格单元都会得到一个分类得分,即目标所属类别。最终的输出就是一个三维的张量:7x7x(5*B+C)。
TensorFlow Detection API(Faster RCNN, SSD, RFCN, Mask R-CNN): 点击这里
二维平面的目标检测只需确定 [x, y, w, h],3D的定位框需要确定的坐标为 [x, y, z, roll, pitch, yaw],简化后可以不需要 roll 和 pitch。比2D目标检测要复杂的多。