目标检测--滑动窗口算法的原理和实现
本文于 1231 天之前发表,文中内容可能已经过时。
滑动窗口算法作为最原始最简单的深度学习目标检测算法,容易上手并且原理简单,深受鄙人的喜爱。
本文将简单介绍滑动窗口算法的原理并且使用python实现它。
原理
首先选定一个特定大小的窗口,并使用以上的卷积神经网络判断这个窗口中有没有目标物体,滑动目标检测算法会从左上角向右并向下滑动输入窗口,并将截取的图像都输入到 已经训练好的卷积神经网络中 以固定步幅滑动窗口,遍历图像的每个区域
然后使用比以上使用的窗口大一些的窗口,重复进行以上操作。然后再使用比上一次更大的窗口进行图像的截取与检测。
所以无论目标在图像中的什么位置,总有一个窗口可以检测到它。
缺点:
- 但是滑动窗口目标检测算法有十分消耗计算成本的缺点,因为使用窗口会在原始图片中截取很多小方块,并且卷积神经网络需要一个个的进行处理。虽然使用较大的步长可以有效的节省计算成本,但是粗粒度的检测会影响性能,小步幅和小窗口就会大量的耗费计算成本
- 早些时候在普通的线性分类器上使用滑动窗口目标检测算法可以有很好的性能,但是对于卷积神经网络这种对于图像识别相当耗费性能的算法而言,需要对滑动窗口算法进行重新设计。
实现
1. 载入需要的库
1 | import numpy as np |
2. 神经网络的重载
首先需要提前训练神经网络,这里没有啥好讲的,可以参照我之前的两篇博文
重载
调用第一步里面训练好的神经网络,对每一个格子进行0/1判别(0为没有目标,1为有目标)
1 | time_start = time.time() |
3. 滑动窗口的实现
据吴恩达口述,可以使用卷积的操作代替图片的切割, 卷积神经网络的滑动窗口实现提高了整个算法的效率。但是鄙人没能搞明白为什么以及怎么做,因此笔者还是采用了原始的图像切割方法。
- 先读取图片
1 | def load_image(path): |
将大图片分割成30x30的小图片,这里面大图片宽高最好是30的倍数,可以载入的时候先resize一下。上图像切割代码:
1 | def fenge(image): |
原图的shape假设为(900,900,3),切割之后就变成了(900,30,30,3)
4. 小格子判别
图像切割完毕,现在需要对30x30的小格子进行识别。
- 做出预测:
1 | pred = sess.run(y_conv, {input_x: small_img,keep_prob:1.}) |
- 为存在目标的格子添加边框:
1 | def add_bound(img): |
5. 重排图像并保存
1 | #small_img重排 |
6. 效果图
参考资料:
1、[DeeplearningAI笔记]卷积神经网络3.1-3.5目标定位/特征点检测/目标检测/滑动窗口的卷积神经网络实现/YOLO算法
赏
支付宝打赏
微信打赏
赞赏是不耍流氓的鼓励