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

任务描述:

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

解决方案架构:

这里写图片描述

具体细节:

  • 数据生成:

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

生成代码可以产⽣图⽚和label⽂件,label文件包含了对应的类别ID和bounding box信息。 如果采⽤Yolo或Faster R-CNN,label文件是必须具备的输⼊数据。
这里写图片描述

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

  • 数字图像处理

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

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

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

这里写图片描述
这里写图片描述
最后的准确率和召回率没有实际测量,应该有双95%+。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值