文章目录

一、前言

  1. 目标检测是图像处理和计算机视觉学科的重要分支,对人脸识别、步态识别、人群计数、实例分割等任务起着至关重要的作用。
    计算机视觉对于目标运动的分析可以大致分为三个层次:
    运动分割,目标检测 --> 目标跟踪 --> 动作识别,行为描述
  2. 传统目标检测的方法一般分为三个阶段:
    (1)区域选择:这一步是为了对目标的位置进行定位。由于目标可能出现在图像的任何位置,而且目标的大小、长宽比例也不确定,所以最初采用滑动窗口的策略对整幅图像进行遍历:时间复杂度太高,产生冗余窗口太多,这也严重影响后续特征提取和分类的速度和性能。
    (2)特征提取:由于目标的形态多样性,光照变化多样性,背景多样性等因素使得设计一个鲁棒的特征并不是那么容易。然而提取特征的好坏直接影响到分类的准确性。其中,这个阶段常用的特征有 SIFT[3]、HOG[4]等。
    (3)分类:根据第二步提取到的特征对目标进行分类,分类器主要有 SVM,AdaBoost /GBDT等。

二、基于深度学习的目标检测算法

目标检测的两大任务

  • 目标分类和目标定位
    目标分类任务负责判断输入图像,输出一系列带分数的标签表明感兴趣类别的物体出现在输入图像或所选择图像区域(Proposal)中的可能性。
    目标定位任务负责确定输入图像或所选择图像区域(Proposal)中感兴趣类别的物体的位置和范围,输出物体的包围盒、或物体中心、或物体的闭合边界等,通常使用方形包围盒,即Bounding Box用来表示物体的位置信息。

由于深度学习的广泛运用,目标检测算法得到了较为快速的发展,本文广泛调研国内外目标检测方法,主要介绍基于深度学习的两种目标检测算法思路:

  • One-Stage目标检测算法:
    不需要Region Proposal阶段,可以通过一个Stage直接产生物体的类别概率和位置坐标值,比较典型的算法有YOLO、SSD和CornerNet;
  • Two-Stage目标检测算法。
    第一个阶段首先产生候选区域(Region Proposals),包含目标大概的位置信息,
    第二个阶段对候选区域进行分类和位置精修,这类算法的典型代表有R-CNN,Fast R-CNN,Faster R-CNN等。
2.1 One-Stage目标检测算法(SSD—DSSD—FSSD)结构

在一个stage直接产生物体的类别概率和位置坐标值。

  • CNN网络结构主要有两个方向:分别为追求精度和追求速度。
    最简单的一种实现方式就是替换Backbone(VGG)网络结构,即使用不同的基础网络结构对图像提取特征。
    举例来说,ResNet101的表征能力(精度)要强于MobileNet,然而MobileNet的计算量(计算速度)要远远低于ResNet101,两者相互替换各有取舍。
  • SSD检测算法的网络结构,其中Backbone为VGG网络,使用不同阶段不同分辨率的(下采样过程中的)feature map进行预测。
  • DSSD也是使用不同阶段不同分辨率的feature maps进行预测,在不考虑Backbone网络结构差别的情况下,可以发现DSSD相比于SSD多了一系列的后续上采样操作,DSSD是使用上采样过程中的feature maps进行预测。
    SSD用于检测的feature maps位于网络的较低层,表征能力较弱,而DSSD用于检测的feature maps位于网络的较高层,表征能力较强,同时DSSD在反卷积的过程中通过Skip-Connection引入了较低层的feature maps,实现了一定程度的特征融合。所以DSSD的效果要优于SSD检测算法。
  • 基于深度学习的目标检测_ide

  • FSSD也是使用不同阶段不同分辨率的feature maps进行预测,相比于SSD,FSSD多了一个特征融合处理,将网络较低层的特征引入到网络的较高层,在检测的时候能够同时考虑不同尺度的信息,使得检测更加准确。
  • 基于深度学习的目标检测_基于深度学习的目标检测_02

2.2 回归目标

构建网络回归目标:区分正负样本使其与卷积神经网络的输出相对应。
最简单直接的方法是直接回归物体的相关信息(类别和坐标),稍微复杂一些,在回归坐标时可以回归物体坐标相对于anchor的偏移量等等。
对于One-Stage检测方法主要有如下三种典型的回归目标构建方式,其中代表方法分别为YOLO系列算法、SSD系列算法以及CornerNet目标检测算法。

三 Mobilenet-ssd caffe实现

详情请参考

采用COCO数据集(上下文中的公共对象)训练,然后在PASCAL VOC上进行微调,达到72.7%mAP(平均平均精度)。

可以检测图像中的20个对象(背景类为+1),包括飞机,自行车,鸟,船,瓶子,公共汽车,汽车,猫,椅子,牛,餐桌,狗,马,摩托车,人,盆栽植物,绵羊,沙发,火车和电视监视器。

​https://github.com/chuanqi305/MobileNet-SSD文件及​​​​权重下载​

import numpy as np
import argparse
import cv2


ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,
help="path to input image")
ap.add_argument("-p", "--prototxt", required=True,
help="path to Caffe 'deploy' prototxt file")
ap.add_argument("-m", "--model", required=True,
help="path to Caffe pre-trained model")
ap.add_argument("-c", "--confidence", type=float, default=0.2,
help="minimum probability to filter weak detections")
args = vars(ap.parse_args())


# 初始化类标签和边框颜色
CLASSES = ["background", "aeroplane", "bicycle", "bird", "boat",
"bottle", "bus", "car", "cat", "chair", "cow", "diningtable",
"dog", "horse", "motorbike", "person", "pottedplant", "sheep",
"sofa", "train", "tvmonitor"]
COLORS = np.random.uniform(0, 255, size=(len(CLASSES), 3))

# 加载模型
print("[INFO] loading model...")
net = cv2.dnn.readNetFromCaffe(args["prototxt"], args["model"])


# 加载查询图像并准备 blob
image = cv2.imread(args["image"])
(h, w) = image.shape[:2]
blob = cv2.dnn.blobFromImage(cv2.resize(image, (300, 300)), 0.007843,(300, 300), 127.5)


# 通过神经网络传递该blob
print("[INFO] computing object detections...")
net.setInput(blob)
detections = net.forward()

# 循环检测图像中的目标。遍历每个目标,并展示高于阈值的置信度(即概率)
for i in np.arange(0, detections.shape[2]):
confidence = detections[0, 0, i, 2]

if confidence > args["confidence"]:
idx = int(detections[0, 0, i, 1])
box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
(startX, startY, endX, endY) = box.astype("int")

# display the prediction
label = "{}: {:.2f}%".format(CLASSES[idx], confidence * 100)
print("[INFO] {}".format(label))
cv2.rectangle(image, (startX, startY), (endX, endY),
COLORS[idx], 2)
y = startY - 15 if startY - 15 > 15 else startY + 15
cv2.putText(image, label, (startX, y),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, COLORS[idx], 2)
cv2.imshow("Output", image)
cv2.waitKey(0)

# Usage
'''
python deep_learning_object_detection.py \
--prototxt MobileNetSSD_deploy.prototxt.txt \
--model MobileNetSSD_deploy.caffemodel --image example_01.jpg
'''

测试了几张图片,效果不怎么好

基于深度学习的目标检测_ide_03