[初窥目标检测]——《目标检测学习笔记(1):综述与Selective Search简介》

初窥目标检测——目标检测学习笔记(1):综述与Selective Search简介

系列前言

前两天终于结束了全天满课的状态,有空可以做自己感兴趣的事情了。定个天天写博客笔记的任务来监督自己的学习进度,也记录一下学习目标检测(object detection)的过程与心得。希望自己的技术更上一层楼,也欢迎大神前来斧正。。

本文介绍

本博客分两部分介绍,先概括一下目标检测的概念与算法,再介绍我们要了解的第一个算法——Selective Search(选择性搜索,以下简称SS),对SS我们用三个篇幅来进行浅析——简介、论文、源码。

一、什么是目标检测

先从网上找到的一张图讲起:
[初窥目标检测]——《目标检测学习笔记(1):综述与Selective Search简介》_第1张图片

上图从左到右分别是图像识别、识别+定位、目标检测、图像分割。
目标检测,大概是在给定的图片中找出物体所在的位置,标出物体的类别。目标检测的技术进化路线为:RCNN->SppNET->Fast-RCNN->Faster-RCNN.

下面开始细述:

1.图像识别(classification):

输入:图片
输出:物体类别
评估方法:准确率
[初窥目标检测]——《目标检测学习笔记(1):综述与Selective Search简介》_第2张图片

2.图像定位(localization):

输入:图片
输出:定位出方框在图片中的位置(x,y,w,h)
评估方法:检测评价函数 intersection-over-union ( IOU )
[初窥目标检测]——《目标检测学习笔记(1):综述与Selective Search简介》_第3张图片

卷积神经网络(Convolutional Neural Network )可以来解决图像识别(classification)问题,而且随着不同结构的产生,效果也越来越好。我们可以基于图像识别来去解决定位问题,只是额外的多了一些问题需要处理。定位的问题目前哟两种思路:

以回归问题解决

我们需要预测出localization输出的(x,y,w,h)四个参数的值,得出物体所在的位置。
[初窥目标检测]——《目标检测学习笔记(1):综述与Selective Search简介》_第4张图片
步骤一:

  • 先以CNN为基础,搭建识别网络
  • 在AlexNet VGG GoogleLenet上fine-tuning一下
    [初窥目标检测]——《目标检测学习笔记(1):综述与Selective Search简介》_第5张图片
    * 步骤二:*
  • 更改步骤一中搭建的CNN,调整其尾部,加上“分类头”和“回归头”。使CNN变为classification(分类) + regression(回归)模式
    [初窥目标检测]——《目标检测学习笔记(1):综述与Selective Search简介》_第6张图片
    步骤三:

  • 用欧氏距离计算Regression损失

  • 使用SGD训练

    步骤四:

  • 列预测阶段把2个头部拼上

  • 完成不同的功能

这里需要进行两次fine-tuning 第一次在ALexNet上做,第二次将头部改成regression
head,前面不变,做一次fine-tuning

Regression的部分加在哪?

有两种处理方法:   • 加在最后一个卷积层后面(如VGG)   • 加在最后一个全连接层后面(如R-CNN)
regression太难做了,应想方设法转换为classification问题。
regression的训练参数收敛的时间要长得多,所以上面的网络采取了用classification的网络来计算出网络共同部分的连接权值。

取图像窗口

• 还是刚才的classification + regression思路
• 我们取不同的大小的“框”
• 让框出现在不同的位置,得出这个框的判定得分
• 取得分最高的那个框

左上角的黑框:得分0.5
[初窥目标检测]——《目标检测学习笔记(1):综述与Selective Search简介》_第7张图片

右上角的黑框:得分0.75
[初窥目标检测]——《目标检测学习笔记(1):综述与Selective Search简介》_第8张图片

左下角的黑框:得分0.6
[初窥目标检测]——《目标检测学习笔记(1):综述与Selective Search简介》_第9张图片

右下角的黑框:得分0.8
[初窥目标检测]——《目标检测学习笔记(1):综述与Selective Search简介》_第10张图片

根据得分的高低,我们选择了右下角的黑框作为目标位置的预测。
注:有的时候也会选择得分最高的两个框,然后取两框的交集作为最终的位置预测。

那么问题来了:框要取多大?
取不同的框,依次从左上角扫到右下角,这就非常的粗暴。大牛们发明好多选定候选框的方法,比如EdgeBoxes和Selective Search。就引出了第二个要介绍的部分:Selective Search,也引出了改进和解决以上算法的众多框架:RCNN->SppNET->Fast-RCNN->Faster-RCNN.

顾名思义,和枚举搜索不同的是,选择性搜索利用大概剪枝的思想快速的选出了候选框。

作为初窥,我们先以一个简单的例子来应用一下Selective Search,下篇再做正式详细介绍。
以应用作为驱动去学习,个人感觉往往效果不错,所以我们先动手操作一下。关于selective search算法,OpenCV中有所实现,Python中也有相关的包,为了方便,我们以Python为主。

1.安装

由于selectivesearch包里依赖着skimage,所以使用pip做以下安装:

  • pip install skimage
  • pip install selectivesearch

2.任务

之前写过关于验证码识别的博客,在(1)中使用的是定量切割的方法,这样显然鲁棒性和普适性太差,直到打算后来了解到目标检测,才有所进展。这次我们用selective search做一下简单实验,来更直观的了解选择性搜索的效果。先上一张最后的效果图:
原图
[初窥目标检测]——《目标检测学习笔记(1):综述与Selective Search简介》_第11张图片
在进行简单的selective search后,我们可以看出已经圈出所有的数字来,下面我们贴出代码。

3.代码实现:

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()

结果就如图所示:
[初窥目标检测]——《目标检测学习笔记(1):综述与Selective Search简介》_第12张图片
关于selective search的具体细节,论文算法怎么实现,下篇博客再讲,今天的第一篇目标检测初窥就写到这里,希望可以对大家有所帮助,更希望大佬前来斧正。

——Nuller
——写于2018年4月21日
——小雨

你可能感兴趣的:(目标检测,目标检测)