随着AlphaGo等智能系统的大获成功,人工智能成为了全社会关注的热词。以深度学习为代表的人工智能技术,在许多领域都取得了超过人类的能力。图像处理,是深度学习应用的主战场之一。以图像处理技术为基础,刷脸进站、智慧门禁、美颜等眼花缭乱的应用走入了大众的生活。今天,易学智能不讨论深度学习算法,而是谈谈深度学习的支撑技术,给大家介绍深度学习最常用的几类OpenCV操作。俗话说,一个好汉三个帮。深度学习的强项是对图像特征的理解,犹如人的大脑。然而,人不能只有大脑,还得有四肢。在图像处理上,深度学习最重要的帮手之一就是OpenCV。OpenCV是应用极其广泛的开源图像处理包,提供了方方面面的图像处理能力。 目标检测是深度学习取得突破性进展的领域之一。目标检测的基本含义是,对一张图片,找出所有感兴趣的目标。目标检测是应用非常广泛的计算机视觉技术。比如,对火车站、机场等的管理,我们很关心它的人流量。这时,就需要统计这些地方每个时刻有多少人。为此,就需要进行以人为对象的目标检测。 目标检测的研究已有几十年的历史,但发展一直缓慢,直到深度学习出现,它的性能才取得跃升。目前,常见图中的人物检测,准确度已达到99%以上,基本具备了实用性。 在目标检测完成后,如何给用户展示结果?图X是最常见的两种形式。要实现这两种效果,我们需要:(1) 将目标对应的子图,切割出来单独提供;或 (2)给每个目标绘制边界框,并且标明每个对象的类别。这些功能,借助OpenCV,可以很轻松地完成。在进入具体函数的讲解之前,我们补充一点图像表示的知识。
1.图像表示
图像的表示方法有很多,但是一般常用的就是三原色叠加的方式,也就是常说的RGB,每个图像文件的存储格式有很多,比如PNG,JPG,GIF等,但是实质上存储的是图像每一个像素点RGB的值,如图0-1所示,图中十字形标识位置对应的RGB值分别为63,127和111。 图像读入OpenCV中后,表示成一个高度×长度×3的一个numpy的数组,如图1-1所示。 图1-1 Tips: (1)数据顺序。图像是按照高度、宽度和通道数的顺序进行存储,即HWC的顺序,在Tensorflow中要求数据按照CHW的顺序输入,因此需要进行一个变换。 (2)坐标变换。与平面坐标系进行对应,每一个通道是按照y,x的顺序进行存储,在进行目标检测等任务中得到的往往是x和y的坐标,在进行图像分割时,需要注意顺序。具体的原因可能是与数据存储往往习惯逐行存储有关。 2. 图像切割
图像切割就是从原始图像中获得感兴趣的子图。除了用于展示,切割还有很多的用处。比如人脸识别,第一步是人脸检测,然后根据检测将脸从原始图像中切分出来进行识别,从而减少无关信息对主要目标的影响。切分操作的代码,及效果如图2-1所示:
Tips: (1)一般人脸检测的结果表示为det所示的形式,由于一张图像中可能有多张人脸,因此,往往使用list来进行存储,每个元素表示一个可能人脸的位置,一般按照x_min,y_min,x_max,y_max的顺序进行排列,同时加上一个置信度,表示该结果的可能性。 (2)检测的结果中可能有一定的错误,因此需要进行位置的限定,保证结果在一个合理的范围。如果不进行限定,可能出现如图2-2所示的结果,切分出来的图像变成了一个长条,原因是由于在python中负值表示从后往前索引。而且这种错误往往导致程序能够真正运行,但是最终的结果出现错误。 (3)最后进行图像切分时,切记按照先y索引值,后x索引值的方式进行,否则可能产生越界错误,更严重的是程序能够正常运行,但是结果与预期不一致。 3. 图像加标注
图像加标注分为两个主要任务:加框与加文字标注。它们可用以下两个函数来完成: (1)画边界框:cv2.rectangle(img,(x_min,y_min), (x_max,y_max), (B,G,R), Thickness) ,参数的意义分别如下: img:目标图像 (x_min, y_min):框的左上角坐标 (x_max, y_max):框的右下角坐标 (B, G, R):框的颜色 Thickness:框线的宽度 (2)标注标签:cv2.putText(img,text, (x,y), Font, Size, (B,G,R), Thickness),参数的意义分别如下: img:目标图像 text:待标注的文本 (x, y):文本的起始位置 Font:文本的字体 Size:文本的大小 (B, G, R):文字的颜色 Thickness:文字线条的精细 标注的示例代码与效果,如图3-1所示 :
Tips: 1、框的越界问题。目前的检测方法,一般计算出来的是边界框的中心点位置以及高度和宽度,但是这些数据是有一定误差的,在转化为框的坐标时,需要判断结果是否在图像范围内,最小值是(0,0),而最大值是(宽度-1, 高度-1)!!! 2、原始图像变化的问题。对于这两个函数,不管是参数还是返回值,实际上都是同一个数据的引用,因此,对于数据的操作会"破坏"原始数据,如果该结果是最终展示结果,可以不考虑该问题,如果仅仅是中间结果,则可以借助copy模块来产生原始数据的副本进行处理,效果如图3-2所示。
4. 写在最后
人工智能在各行各业的应用大放异彩,从业者的薪资也不断高涨。越来越多的人,有意学习人工智能技术并从事人工智能的工作。无论你从事哪个行业、做什么工作,你都要了解一些人工智能技术。说不定,哪天人工智能的滚滚浪潮,就将你现在的行业颠覆了。 今天,我们给大家介绍的是深度学习最常用的OpenCV操作。这些操作,并不涉及深度学习算法。但是,对一个系统而言,算法只是一个部件。我们要用好深度学习技术,就不能只做算法,也要熟练掌握这些支撑技术,方能达到事半功倍的效果。
|