可以分为两个阶段:传统检测算法和基于深度学习的检测算法。
由于深度学习的崛起,推动了目标检测的快速发展和应用,如今目标检测已经广泛的应用于我们的日常生活中,如自动驾驶、安保监控、医疗影像、机器视觉等领域。
虽然目标检测在发展过程中取得了很多成果,但同时也面临很多挑战,例如目标检测在实时性、抗干扰性、工业的大规模应用等方面还存在很多阻碍。
OpenCV
:
NumPy
TensorFlow
scikit-learn
scikit-image
只需要在使用的时候直接调用就行了
传统的目标检测方法:
滑动窗口(Sliding Windows)在目标检测过程中的作用
首先在脚本中我们导入需要用到的模块
pyplot
和从 IPython 中导入 display
模块用于显示图片。%matplotlib inline
魔法函数让图片在页面中显示。import cv2
from matplotlib import pyplot as plt
from IPython import display
%matplotlib inline
定义一个函数 sliding_window
用于获取滑动窗口。
image
、window
和 step
。image
是输入函数的图片,我们将用矩形框在这个图片上滑动。window
是一个元组,表示滑动的矩形框的高和宽。step
表示矩形框间隔多少个像素移动一次,这里我们可以称之为步长。def sliding_window(image, window, step):
for y in range(0, image.shape[0] - window[1], step):
for x in range(0, image.shape[1] - window[0], step):
yield (x, y, image[y:y + window[1], x:x + window[0]])
n
就表示矩形框每次移动 n
个像素的距离step
设置的太小或太大都会对目标检测造成负面的影响,一般这个值会设置在 4 到 8 之间。
我们使用两个 for
循环获取矩形框的所有坐标位置。
for
循环控制矩形框以 step
的步长在图片中上下移动for
循环控制矩形框以 step
的步长在图中左右移动。yield
生成器返回一个元组x
和第二个元素 y
表示矩形框左上角的坐标image[y:y + window[1], x:x + window[0]]
就是处在图片中不同位置的矩形框。cv2.imread
函数读取图片pets.jpg 是要读取的图片名。
window_w
为 400 个像素,滑动窗口的高 window_h
为 400 个像素。n
来表示滑动窗口的数量。image = cv2.imread("pets.jpg")
(window_w, window_h) = (400, 400)
接下来使用一个 for
循环来遍历每一个滑动窗口
我们需要传递三个参数给 sliding_window
。
第一个参数 image
是我们读取的图片。
第二个参数 (window_w, window_h)
表示滑动窗口的宽和高。
第三个参数 200
表示滑动窗口将每次滑动的步长为 200
个像素
(注意这里为了演示方便将滑动窗口和步长的值设置得都很大,在实际使用中不建议将其设置过大或过小)。
for (x, y, window) in sliding_window(image, (window_w, window_h), 200):
if window.shape[0] != window_w or window.shape[1] != window_h:
continue
clone = image.copy()
cv2.rectangle(clone, (x, y), (x + window_w, y + window_h), (0, 255, 0), 2)
clone = clone[:,:,::-1]
plt.imshow(clone)
plt.pause(0.1)
display.clear_output(wait=True)
if
语句来判断获得的滑动窗口和我们设定的滑动窗口大小是否一致(window_w, window_h)
中任意一个元素不同,则执行 continue
跳过该滑动窗口。在循环内我们绘制出图片中每一个滑动窗口了:
copy
函数复制输入函数的图片,因为接下来的画图操作将会修改源图片cv2.rectangle
在 clone
上绘制出每个滑动窗口。clone[:,:,::-1]
切片方法来跳转图片通道的顺序plt.imshow
在页面中呈现绘图后的结果。
因为我们在 for 循环内要绘制多张图片
plt.pause(0.1)
让每张图片显示暂停一段时间,函数的参数 0.1 表示暂停 0.1 秒。clear_output(wait=True)
方法清除已经显示的图片为下一张图片显示做准备。执行代码后绘制的滑动窗口的结果如下所示:
从图中我们可以看到滑动窗口按照从左向右、从上向下在图片上滑动。