前两天终于结束了全天满课的状态,有空可以做自己感兴趣的事情了。定个天天写博客笔记的任务来监督自己的学习进度,也记录一下学习目标检测(object detection)的过程与心得。希望自己的技术更上一层楼,也欢迎大神前来斧正。。
本博客分两部分介绍,先概括一下目标检测的概念与算法,再介绍我们要了解的第一个算法——Selective Search(选择性搜索,以下简称SS),对SS我们用三个篇幅来进行浅析——简介、论文、源码。
上图从左到右分别是图像识别、识别+定位、目标检测、图像分割。
目标检测,大概是在给定的图片中找出物体所在的位置,标出物体的类别。目标检测的技术进化路线为:RCNN->SppNET->Fast-RCNN->Faster-RCNN.
下面开始细述:
输入:图片
输出:定位出方框在图片中的位置(x,y,w,h)
评估方法:检测评价函数 intersection-over-union ( IOU )
卷积神经网络(Convolutional Neural Network )可以来解决图像识别(classification)问题,而且随着不同结构的产生,效果也越来越好。我们可以基于图像识别来去解决定位问题,只是额外的多了一些问题需要处理。定位的问题目前哟两种思路:
我们需要预测出localization输出的(x,y,w,h)四个参数的值,得出物体所在的位置。
步骤一:
更改步骤一中搭建的CNN,调整其尾部,加上“分类头”和“回归头”。使CNN变为classification(分类) + regression(回归)模式
步骤三:
用欧氏距离计算Regression损失
使用SGD训练
步骤四:
列预测阶段把2个头部拼上
这里需要进行两次fine-tuning 第一次在ALexNet上做,第二次将头部改成regression
head,前面不变,做一次fine-tuningRegression的部分加在哪?
有两种处理方法: • 加在最后一个卷积层后面(如VGG) • 加在最后一个全连接层后面(如R-CNN)
regression太难做了,应想方设法转换为classification问题。
regression的训练参数收敛的时间要长得多,所以上面的网络采取了用classification的网络来计算出网络共同部分的连接权值。
• 还是刚才的classification + regression思路
• 我们取不同的大小的“框”
• 让框出现在不同的位置,得出这个框的判定得分
• 取得分最高的那个框
根据得分的高低,我们选择了右下角的黑框作为目标位置的预测。
注:有的时候也会选择得分最高的两个框,然后取两框的交集作为最终的位置预测。
那么问题来了:框要取多大?
取不同的框,依次从左上角扫到右下角,这就非常的粗暴。大牛们发明好多选定候选框的方法,比如EdgeBoxes和Selective Search。就引出了第二个要介绍的部分:Selective Search,也引出了改进和解决以上算法的众多框架:RCNN->SppNET->Fast-RCNN->Faster-RCNN.
顾名思义,和枚举搜索不同的是,选择性搜索利用大概剪枝的思想快速的选出了候选框。
作为初窥,我们先以一个简单的例子来应用一下Selective Search,下篇再做正式详细介绍。
以应用作为驱动去学习,个人感觉往往效果不错,所以我们先动手操作一下。关于selective search算法,OpenCV中有所实现,Python中也有相关的包,为了方便,我们以Python为主。
由于selectivesearch包里依赖着skimage,所以使用pip做以下安装:
之前写过关于验证码识别的博客,在(1)中使用的是定量切割的方法,这样显然鲁棒性和普适性太差,直到打算后来了解到目标检测,才有所进展。这次我们用selective search做一下简单实验,来更直观的了解选择性搜索的效果。先上一张最后的效果图:
在进行简单的selective search后,我们可以看出已经圈出所有的数字来,下面我们贴出代码。
import selectivesearch #导入selectivesearch包,来做选择性搜索实验
import cv2 #导入opencv进行图片读取
import matplotlib.pyplot as plt #显示图片
import matplotlib.patches as mpatches
'''
author:nuller
date:2018.4.20
script:use the selectivesearch packget to find object
'''
img = cv2.imread("..\\img\\cpca.jpg") #读取图片
img_lbl, regions = selectivesearch.selective_search(img, scale=500, sigma=0.9, min_size=20)
#使用selectivesearch中的selective search方法
#参数介绍
#im_orig:输入图片
#scale:表示felzenszwalb分割时,值越大,表示保留的下来的集合就越大
#sigma:表示felzenszwalb分割时,用的高斯核宽度
#min_size:表示分割后最小组尺寸
#筛选一定的候选框
candidates = []
for r in regions:
# 重复的不要
if r['rect'] in candidates:
continue
# 太小和太大的不要
if r['size'] < 20 or r['size'] > 500:
continue
x, y, w, h = r['rect']
candidates.append((x, y, w, h))
#输出图片
fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(6, 6))
ax.imshow(img)
for x, y, w, h in candidates:
rect = mpatches.Rectangle((x, y), w, h, fill=False, edgecolor='red', linewidth=1)
ax.add_patch(rect)
plt.show()
结果就如图所示:
关于selective search的具体细节,论文算法怎么实现,下篇博客再讲,今天的第一篇目标检测初窥就写到这里,希望可以对大家有所帮助,更希望大佬前来斧正。
——Nuller
——写于2018年4月21日
——小雨