传统目标检测方法研究(代码片段)

开始学AI 开始学AI     2023-01-20     588

关键词:

1 传统算法目标检测

区域选择 --> 特征提取 --> 特征分类

1.1 区域选择 python 实现 图像滑动窗口

区域选取:首先选取图像中可能出现物体的位置,由于物体位置、大小都不固定,因此传统算法通常使用滑动窗口(Sliding Windows)算法,但这种算法会存在大量的冗余框,并且计算复杂度高。
滑动窗口: 固定一个窗口,截取图片

1.1.1 以滑动窗口方式切分图像

import cv2
def sliding_window(src_img,step,windowsize):
    '''
    src_img : 源图像
    out_img : 输出图像
    step : 步进步长 元组类型
    windowsize :窗口大小 元组类型
    '''
    cnt = 0 # 记录滑动窗口数目
    for y in range(0,src_img.shape[0],step[1]):
        for x in range(0,src_img.shape[1],step[0]):
            image_patch = src_img[y:y+windowsize[0],x:x+windowsize[1]]
            cnt += 1
            cv2.imwrite("image/sliding_img/"+str(cnt)+".png",image_patch)

if __name__ == "__main__":
    img = cv2.imread("image/src_img/1.jpg")
    step = (50,50)
    windowsize = (100,100)
    sliding_window(img,step,windowsize)

1.1.2 滑动窗口简单动画演示

import cv2
import numpy as np
import matplotlib.pyplot as plt
def sliding_window(path,step,windowsize):
    '''
    src_img : 源图像
    out_img : 输出图像
    step : 步进步长 元组类型
    windowsize :窗口大小 元组类型
    '''
    # cv2.fillConvexPoly()函数可以用来填充凸多边形,只需要提供凸多边形的顶点即可.
    src_img = cv2.imread(path)
    for y in range(0,src_img.shape[0],step[1]):
        for x in range(0,src_img.shape[1],step[0]):
            # 先计算坐标
            x_min = x
            y_min = y
            x_max = x + windowsize[1]
            y_max = y + windowsize[0]
            src_img1 = cv2.imread(path)
            src_img2 = cv2.cvtColor(src_img1,cv2.COLOR_BGR2RGB)
            rectangle = np.array([[x_min,y_min],[x_min,y_max],[x_max,y_max],[x_max,y_min]])
            # cv2.fillConvexPoly 单个多边形填充
            cv2.fillConvexPoly(src_img2,rectangle,(0,0,0)) # (0,0,0) 颜色填充
            plt.imshow(src_img2)
            plt.show()
            plt.pause(0.1)
            plt.clf()

if __name__ == "__main__":
    plt.ion() # 使得plt.show()显示后不暂停,交互模式,可以使用plt.ioff()停止
    path = "image/src_img/1.jpg"
    step = (50,50)
    windowsize = (200,200)
    sliding_window(path,step,windowsize)

1.2 特征提取

特征提取:在得到物体位置后,通常使用人工精心设计的提取器进行特征提取,如SIFT和HOG等。由于提取器包含的参数较少,并且人工设计的鲁棒性较低,因此特征提取的质量并不高。

1.2.1 python提取图像SIFT特征

SIFT(Scale-invariant feature transform),也叫尺度不变特征变换算法,是David Lowe于1999年提出的局部特征描述子(Descriptor),并于2004年进行了更深入的发展和完善。Sift特征匹配算法可以处理两幅图像之间发生平移、旋转、仿射变换情况下的匹配问题,具有很强的匹配能力。Mikolajczyk对包括Sift算子在内的十种局部描述子所做的不变性对比实验中,Sift及其扩展算法已被证实在同类描述子中具有最强的健壮性。

其应用范围包含物体辨识、机器人地图感知与导航、影像缝合、3D模型建立、手势辨识、影像追踪和动作比对。局部影像特征的描述与侦测可以帮助辨识物体,SIFT 特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、些微视角改变的容忍度也相当高。基于这些特性,它们是高度显著而且相对容易撷取,在母数庞大的特征数据库中,很容易辨识物体而且鲜有误认。

python-opencv提取SIFT特征为以下步骤:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('image/src_img/1.jpg')
cv2.imshow("original",img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

sift = cv2.xfeatures2d.SIFT_create() # 创建sift对象
keypoints, descriptor  = sift.detectAndCompute(gray, None) # 检测单通道图像特征点

# 绘制特征点
cv2.drawKeypoints(image = img,
                outImage = img,
                keypoints = keypoints,
                flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS,
                color = (51,163,236))
cv2.imshow("SIFT",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

为了体现SIFT特征的作用,我将图片加入旋转,看是否能实现图像匹配。

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('image/src_img/1.jpg')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
# 为了能够在任意位置进行旋转变换,OpenCV提供了一个函数:cv2.getRotationMarix2D( ),这个函数需要三个参数,旋转中心,旋转角度,旋转后图像的缩放比例:
rows, cols = img.shape[:2]

M1 = cv2.getRotationMatrix2D((cols/2, rows/2), 45, 0.5)
# cv2.warpAffine(img, rot_mat, (img.shape[1], img.shape[0]))
# 参数说明: img表示输入的图片,rot_mat表示仿射变化矩阵,(image.shape[1], image.shape[0])表示变换后的图片大小
img1 = cv2.warpAffine(img, M1, (cols, rows))


gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
gray1 = cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY)

sift = cv2.ORB_create() # 创建sift对象
keypoints, descriptor  = sift.detectAndCompute(gray, None) # 检测单通道图像特征点和描述符
keypoints1, descriptor1  = sift.detectAndCompute(gray1, None) # 检测单通道图像特征点和描述符

# 创建BFMatcher对象
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
mathces = bf.match(descriptor,descriptor1) #匹配描述子
mathces=sorted(mathces,key=lambda x:x.distance) #据距离来排序
# 绘制特征点
img2 = cv2.drawMatches(img1=img,
                    keypoints1=keypoints,
                    img2=img1,
                    keypoints2=keypoints1,
                    matches1to2=mathces[:10],
                    outImg = None
                    ) #画出匹配关系


plt.imshow(img2)
plt.show()


从结果可以看出,SIFT特征能有效应对几何变换,能够很好实现图像匹配。

1.2.2 python提取图像HOG特征

方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。需要提醒的是,HOG+SVM进行行人检测的方法是法国研究人员Dalal在2005的CVPR上提出的,而如今虽然有很多行人检测算法不断提出,但基本都是以HOG+SVM的思路为主。

HOG特征提取步骤:

1)灰度化(将图像看做一个x,y,z(灰度)的三维图像);

2)采用Gamma校正法对输入图像进行颜色空间的标准化(归一化);目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰;

3)计算图像每个像素的梯度(包括大小和方向);主要是为了捕获轮廓信息,同时进一步弱化光照的干扰。

4)将图像划分成小cells(例如6*6像素/cell);

5)统计每个cell的梯度直方图(不同梯度的个数),即可形成每个cell的descriptor;

6)将每几个cell组成一个block(例如3*3个cell/block),一个block内所有cell的特征descriptor串联起来便得到该block的HOG特征descriptor。

7)将图像image内的所有block的HOG特征descriptor串联起来就可以得到该image(你要检测的目标)的HOG特征descriptor了。这个就是最终的可供分类使用的特征向量了。

python-opencv 提取HOG特征

HOG特征介绍参考视频
HOG特征介绍参考资料,这篇文章对过程讲得很清楚,重点看

通过opencv中的cv2.HOGDescriptor(winSize,blockSize,blockStride,cellSize,Bin)可以方便直接地获得HOG特征描述算子。

cv2.HOGDescriptor用法介绍

import cv2
import numpy as np
from matplotlib import pyplot as plt 
img = cv2.imread('image/src_img/1.jpg')
# 创建HOG对象,参数使用默认参数
hog = cv2.HOGDescriptor()
winStride = (8, 8)
padding = (8, 8)
hog_feature = hog.compute(img,winStride,padding) # 一定要有后面两个参数
print(hog_feature.shape) # 张量
print(hog_feature.reshape((-1,))) # 转变为向量
print(hog_feature.reshape((-1,)).shape)

为了更好展示HOG特征可视化结果,这里采用了scikit-image包展示,参考链接

使用scikit-image之前,需要pip install scikit-image 进行安装

pip install scikit-image

可视化代码如下:

import matplotlib.pyplot as plt
import cv2
from skimage.feature import hog
from skimage import exposure


image = cv2.imread('image/src_img/1.jpg')
image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)

fd, hog_image = hog(image, orientations=8, pixels_per_cell=(16, 16),
                    cells_per_block=(1, 1), visualize=True)

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4), sharex=True, sharey=True)

ax1.axis('off')
ax1.imshow(image, cmap=plt.cm.gray)
ax1.set_title('Input image')

# Rescale histogram for better display
hog_image_rescaled = exposure.rescale_intensity(hog_image, in_range=(0, 10))
ax2.axis('off')
ax2.imshow(hog_image_rescaled, cmap=plt.cm.gray)
ax2.set_title('Histogram of Oriented Gradients')
plt.savefig("HOG_image.png")
plt.show()

可视化结果如下:

第十八节基于传统图像处理的目标检测与识别(hog+svm附代码)(代码片段)

...如,人们总是会使在已有的人脸图像的区域去识别人脸。传统的目标检测方法与识别不同于深度学习方法,后者主要利用神经网络来实现分类和回归问题。在这里我们主要 查看详情

传统目标检测方法的比较

·适用范围优点缺点帧差法(1)摄像头固定场景;(2)实时性要求高;(3)目标的信息要求不高;(1)对运动目标敏感;(2)计算简单;(3)检测速度快、实时性高;(1)光线变化快时,算法失效;(2)缓慢运动和背景颜色一致时不能提取出特征... 查看详情

opencv矩形检测与计数(代码片段)

文章大纲目标检测的技术方案传统计算机视觉实现参考实现效果参考代码StackOverflow上一些有关零件、形状计数的有趣的回答参考文献与学习路径刚拿到这种需求的时候,首先反应两个解决方案:端到端的深度学习解决方案,大... 查看详情

opencv矩形检测与计数(代码片段)

文章大纲目标检测的技术方案传统计算机视觉实现参考实现效果参考代码StackOverflow上一些有关零件、形状计数的有趣的回答参考文献与学习路径刚拿到这种需求的时候,首先反应两个解决方案:端到端的深度学习解决方案,大... 查看详情

如何使用传统图像处理方法进行圆的检测和测量(代码片段)

1引言上一篇使用传统方法进行石头检测的文章,受到了大家一致的好评.嗯嗯,应该是一致的好评!今天我们来研究一个新的方向,如何使用传统方法来进行圆的检测.如上图所示,存在多个形状各异的物体,这里原型物体只有两个左下角... 查看详情

深度学习之目标检测常用算法原理+实践精讲

...算法基础介绍本章节主要介绍目标检测算法的基本概念、传统的目标检测算法、目前深度学习目标检测主流方法(one-stage、two-stage、多任务网络)、相关算法的基本流程、算法性能的评价指标、不同算法的优缺点和性能比较等,... 查看详情

深度学习和目标检测系列教程22-300:关于人体姿态常见的估计方法(代码片段)

...机器能够以模仿人类视觉为目的来执行图像处理任务。在传统的物体检测中,人们只会被感知为一个边界框(一个正方形 查看详情

深度学习之目标检测常用算法原理+实践精讲

...算法基础介绍本章节主要介绍目标检测算法的基本概念、传统的目标检测算法、目前深度学习目标检测主流方法(one-stage、two-stage、多任务网络)、相关算法的基本流程、算法性能的评价指标、不同算法的优缺点和性能比较等,... 查看详情

深度学习之目标检测(代码片段)

算法的设计往往与名字有着绝对的关联性,目标定位检测即目标定位+检测。在深度学习中比较常用的目标定位检测方法有RCNN系列方法和YOLO系列方法。其中RCNN系列方法的定位过程和检测过程是分开的,即先定位目标&#x... 查看详情

转载传统车道线检测-canny边缘检测-霍夫变换-完整代码(python)(代码片段)

...一、什么是霍夫变换二、边缘检测算法三、实验环境四、传统车道线检测流程五、完整代码 前言常见的车道线检测的方法大致可以分为三类:传统方法利用传统图像处理基数从摄 查看详情

深度学习和目标检测系列教程22-300:关于人体姿态常见的估计方法(代码片段)

...机器能够以模仿人类视觉为目的来执行图像处理任务。在传统的物体检测中,人们只会被感知为一个边界框(一个正方形)。通过执行姿势检测和姿势跟踪,计算机可以理解人体语言。然而,传统的姿势跟踪... 查看详情

目标检测随笔anchor的生成(代码片段)

...的边界框,称为anchorbox。基于深度学习的目标检测不使用传统的滑窗生成所有的窗口作为候选区域,FasterRCNN提出的RPN网络,处理较少但准确的候选区域。锚框即可理解为某个检测点处的候选区域。假设图像高(h),宽为(w)。以每个... 查看详情

深度学习之目标检测常用算法原理+实践精讲yolo/fasterrcnn/ssd/文本检测/多任务网络

...算法基础介绍本章节主要介绍目标检测算法的基本概念、传统的目标检测算法、目前深度学习目标检测主流方法(one-stage、two-stage、多任务网络)、相关算法的基本流程、算法性能的评价指标、不同算法的优缺点和性能比较等,... 查看详情

货品目标检测样本制作方法(代码片段)

...过摄像头检测货柜里面有多少个什么类别的货品,也就是目标检测算法。该方法所需数据样本为标记了位置的货品图片,如下所示。为了制作该图片,设计方法如下:1、拍摄该样品360度的视频2、将视频抓帧3、将图片通过opencv拼... 查看详情

目标跟踪检测算法(一)——传统方法

...法研究充满着难点和挑战。【嵌牛鼻子】目标跟踪算法,传统算法【嵌牛提问】利用目标跟踪检测算法要达到何目的?第一阶段的单目标追踪算法包括什么?具体步骤有哪些?它们有何特点?【嵌牛正文】第一阶段目标跟踪分为两个... 查看详情

lvc|一种简单的小样本目标检测方法(代码片段)

...本文解读一下Label,Verify,Correct(LVC):一种简单的小样本目标检测方法。 本文的目标是小样本目标检测(FSOD),即在给定少量训练实例的情况下,就将一个目标检测器扩展到一个新类别的检测上。作者引入了一种简单的... 查看详情

弹性响应蒸馏|用弹性响应蒸馏克服增量目标检测中的灾难性遗忘(代码片段)

...读一下用弹性蒸馏克服增量目标检测中的灾难性遗忘。 传统的目标检测不适用于增量学习。然而,仅用新数据直接对训练好的检测模型进行微调将会导致灾难性的遗忘。知识蒸馏是减轻灾难性遗忘的灵活的方法。在增量目... 查看详情

深度学习目标检测概述(代码片段)

目录1目标检测2常用的开源数据集2.1PASCALVOC数据集2.2MSCOCO数据集3常用的评价指标3.1IOU3.2mAP(*MeanAveragePrecision*)4NMS(非极大值抑制)5目标检测方法分类6总结1目标检测目标检测(ObjectDetection)的任务是找出... 查看详情