使用 YOLO 进行目标检测
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
自从世界了解人工智能以来,有一个特别的用例已经被讨论了很多。它们是自动驾驶汽车。我们经常在科幻电影中听到、读到甚至看到这些。有人说,我们将在2010年拥有自动驾驶汽车,有人说到2020年,但我们在2021年就实现了,我们刚刚能够解决自动驾驶汽车给世界带来的变化的一角。自动驾驶汽车的一个基本特性,对象检测。
物体检测——顾名思义就是通过深度学习算法检测图像或视频中的物体。目标检测的目的是识别和定位场景中所有已知的目标。有了这种识别和定位,目标检测可以用来计数场景中的目标,确定和跟踪它们的精确位置,同时精确地标记它们。
目标检测通常与图像识别相混淆,所以在我们继续之前,澄清它们之间的区别是重要的。
图像识别为图像分配一个标签。狗的图片会被贴上“狗”的标签。两只狗的照片仍然会被贴上“狗”的标签。另一方面,对象检测在每只狗周围画一个盒子,并给这个盒子贴上“狗”的标签。模型预测每个对象在哪里以及应该应用什么标签。通过这种方式,目标检测比识别提供了更多关于图像的信息。
物体检测与图像识别和图像分割等其他类似的计算机视觉技术密不可分,因为它有助于我们理解和分析图像或视频中的场景。
鉴于这些关键的区别和物体检测的独特能力,我们可以看到为什么它可以在日常使用优势的多种方式中应用,一些常见的例子是自动驾驶汽车,人脸检测,交通调节,视频监控,人群计数,异常检测等。
在这个项目中,我们使用了VOC2012数据集。VOC代表2012年视觉物体分类挑战赛。这个数据集包含了来自PASCAL视觉对象分类挑战的数据,对应于分类和检测比赛。所提供的训练数据由一组图像组成;每个图像都有一个注释文件,为图像中20个类中的每个对象提供一个边界框和对象类标签。有17125幅图像可供训练。数据的大小大约为2GB。
我们使用YOLO(你只看一次)算法进行对象检测。YOLO是一个聪明的卷积神经网络(CNN),用于实时进行目标检测。该算法将单个神经网络应用于完整的图像,然后将图像划分为多个区域,并预测每个区域的边界框和概率。这些边界框是由预测的概率加权的。要理解YOLO,我们首先要分别理解这两个模型。
YOLO算法- YOLO算法是一种基于回归的算法,它不是选择图像中有趣的部分,而是预测整个图像中的类和包围框运行一次算法。要理解YOLO算法,我们首先需要了解实际预测的是什么。最终,我们的目标是预测一类对象和指定对象位置的边界框。每个包围框可以用四个描述符来描述:
●矩形x中央(bx, by)
●宽度(bw)
●高度(bh)
●对象的类
YOLO不会在输入图像中搜索可能包含对象的感兴趣区域,而是将图像分割成单元格,通常是19×19网格。每个细胞负责预测K个包围框。具有最大概率的类被选择并分配给特定的网格单元。类似的过程发生在图像中的所有网格单元格上。
在预测类概率后,下一步进行非最大抑制,这有助于算法消除不必要的锚点。
一旦完成,算法就会找到具有下一个最高类别概率的包围框,并进行相同的过程,直到我们剩下所有不同的包围框为止。
在此之后,我们几乎完成了所有的工作,算法最终输出所需的向量,显示各个类的包围框的细节。
微小Yolo算法——为了让Yolo运行得更快,Redmon等人(Yolo的创建者)定义了Yolo架构的一个变体,称为微小Yolo。
YOLOv3(和v3)根据一组预定的盒(具有特定的高宽比)预测偏移量——这些预定的包围框就是锚盒。我们设置了一个条件如果这些包围框的长度是6而不是YOLO算法我们就会实现Tiny YOLO模型
1.它从文件的注释开始,这基本上意味着在文本文件中有图像的所有路径并使用它读取数据。
2.我们从网上下载Yolov3权重。然后我们将Darknet YOLO模型转换为Keras模型。然后实现目标检测。
3.从头开始实现它是一个具有挑战性的模型,特别是对于初学者,因为它需要开发许多定制的模型元素来进行训练和预测。例如,即使直接使用预先训练好的模型,也需要复杂的代码来提取和解释模型输出的预测边界框。
4.我们训练这个模型并添加模型检查点、降低学习率、提前停止和张量板。然后我们训练我们的模型与冻结层首先得到一个稳定的损失和Adam Optimizer编译,并节省权重。
5.冻结一层也是一种通过逐步冻结隐藏层来加速神经网络训练的技术。在神经网络的背景下冻结一层是关于控制权值更新的方式。当一个层被冻结时,这意味着权重不能被进一步修改。
6.完成以上动作后,继续训练模型。这基本上是对模型进行微调。为了应用这个更改,我们使用Adam Optimizer重新编译模型。然后再装一次,然后节省重量。模型训练在这里完成。
7.要将这个模型应用于视频/图像,我们将输入和输出视频路径的路径作为参数,然后加载模型并传递配置的路径和权重。然后,我们使用Cv2视频捕获指向输出视频文件,并确定视频中的帧数。从输入帧构造一个blob,然后执行YOLO对象检测器的前向传递,最后给出边界框
8.执行这一切我们最后遍历输出层和每个检测在每个输出后我们添加边框,定义其动态形状,根据对象的大小,过滤掉弱概率,应用non-maxima抑制抑制弱,重叠边界框,并确保至少一个检测存在。最后绘制一个边界框矩形并在框架上进行标记,并将输出框架写入磁盘。
最后,是我们的测试,可以看出进行了有效检测。
输入视频截图
输出视频截图
我们在这个项目中探索的下一步是将其作为一个web应用程序部署。我们目前面临的主要限制是没有足够的RAM和空间来在云上托管它。但是,也许使用更轻的模型,我们会尝试,同时也有这个实时应用。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~