任务描述:

生成若干种形状的图形,这里数据有三种:矩形、圆形、三角形,然后进行检测。

解决方案架构:

基于Opencv和卷积网络的图形检测

具体细节:

  • 数据生成:

我封装了scikit_image中开发版的新api—random_shape,随机生成图形。利利⽤它返回 bounding box信息,再通过opencv绘制图形。每张图片都加了了基础噪声,并添加了随机浅色直线使图形断开。⽣成图形函数的参数:
基于Opencv和卷积网络的图形检测

生成代码可以产⽣图⽚和label⽂件,label文件包含了对应的类别ID和bounding box信息。 如果采⽤Yolo或Faster R-CNN,label文件是必须具备的输⼊数据。
基于Opencv和卷积网络的图形检测

label⽂件中:每⼀行对应⼀个图形,第一个数字是类别ID,其中0代表矩形、1代表三⻆形、2代表圆形。后⾯四个数字代表了X、Y、W、H,其中X和Y是图形中⼼坐标。4个数据都是相对于图⽚⻓宽的⽐例,所以都是⼩数。

  • 数字图像处理

采用直⽅图阈值分割过滤基础噪声:
基于Opencv和卷积网络的图形检测
中值滤波过滤小点,再进行腐蚀和膨胀操作,使得图形边界粘连:
基于Opencv和卷积网络的图形检测
通过opencv的api——findContours发现图中的轮廓,findContours的返回值包括contours 和hierarchy,contours是ndarray,每一个轮廓都是它的一个元素,元素中存储着轮廓的边缘坐标。hierarchy返回的是轮廓间的关系。 我这⾥里使⽤了findContours的⼀个关键参数:cv2.RETR_TREE,它建⽴一个等级树结构的轮廓。通过探索发现利用这个参数,对返回值hierarchy进行处理,可以解决框架嵌套的选择问题。
基于Opencv和卷积网络的图形检测
基于Opencv和卷积网络的图形检测
hierarchy返回值的每一列分别表示后⼀个轮廓、前一个轮廓、⽗轮廓、内嵌轮廓的索引编号, 如果没有对应项,则该值为负数。体现出了如下森林架构:
基于Opencv和卷积网络的图形检测
经过尝试发现如果图形和图像边缘接壤,会出现独立的平凡树,因此返回值是森林。我选取了独立的平凡树和⾮平凡树中的叶子结点(即重叠框的内圈),去掉找出的bounding box中⾯积较⼩的区域,并且将框适当放大。然后扣出图形依次放⼊卷积⽹络识别。
基于Opencv和卷积网络的图形检测

  • 卷积神经⽹络作为基础分类器

这里的处理是比较麻烦的,我将Opencv扣出的图形与⽣成的label 文件作IOU⽐对,匹配IOU最⼤的两个bbox框(⼀个来自label⽂件,一个是Opencv得到的),并且将label⽂件对应的标签赋给对应Opencv扣出的bbox,最后作为卷积⽹网络的训练集。这样做的原因是为了使得训练和测试数据分布相同,因为根据label⽂件扣出的图形完美相切,和测试输⼊不太⼀样。此外Opencv错扣出的bbox还可以起到防⽌过拟合的效果。训练数据如下:
基于Opencv和卷积网络的图形检测
根据前一步findContours找到的轮廓将待识别的图形扣出,放入卷积⽹络进⾏识别,最后结果:
基于Opencv和卷积网络的图形检测

基于Opencv和卷积网络的图形检测
基于Opencv和卷积网络的图形检测
最后的准确率和召回率没有实际测量,应该有双95%+。

分类:

技术点:

相关文章: