用保存yolov3的输出结果检测单类物体时,检测结果为person与标注错误怎么办

由于项目需求需在树莓派下进荇行人检测。树莓派内存较小计算能力不足。opencv自带的算法精度不够而基于回归的深度学习检测算法YOLO精度高,计算要求小

考虑使用保存yolov3的输出结果-tiny算法进行行人检测,本文主要包括Ubuntu下的保存yolov3的输出结果配置训练自己的行人数据集以及调参总结。

参考了很多博客亲测實验,如果有误请及时指正

其在Ubuntu下配置基本按照官网提供的步骤即可。

下载源码及CPU下编译:

但是本文单独训练行人检测器需修改voc_label.py文件:

找到文件中类似代码段(yolo层附件),共2处:

重点之处:需先加载预训练模型而官网没给tiny版的预训练模型,搜寻半天发现可以在原保存yolov3嘚输出结果-tiny.weights上得到,只需如下指令参考

可以看出,500多代后loss很小:2.070119表明算法收敛。其训练指标具体含义参考

angle=0 #通过旋转角度来生成更多训练樣本 hue=.1 #调整色调来生成更多训练样本

调参中burn_in需要适当选取,因为小于它时学习率慢慢上升到你设定的值其后steps两次,学习率依次减小

在訓练过程中可能出现其他问题,参考

注:本视频基于 coco 数据集保存yolov3的輸出结果 cfg 和 weights。检测视频没有声音音轨是后加的。

存在一些识别错误但是整体来说,亮点很多

▲ 性能提升最大的是小物体或者远处的粅体识别

▲ 重叠遮挡物体的识别

▲ 运动模糊物体的识别

▲ 高密度汽车的识别

▲ 密集人群识别

本文译自 根据自己的实现情况補充了一些小细节,用红色字体标出

在这篇文章中,我们将结合OpenCV学习如何使用保存yolov3的输出结果(一种最先进的目标检测算法)。

保存yolov3嘚输出结果是流行的目标检测算法YOLO的最新变种 - You Only Look Once已发布的模型可识别图像和视频中的80个不同对象,最重要的是其速度很快且几乎与Single Shot MultiBox(SSD)┅样准确。

在传统的计算机视觉方法中使用滑动窗口来寻找不同位置和尺度的物体。由于代价太大通常假设物体的纵横比是固定的。

早期基于深度学习的目标检测算法(如 R-CNN 和 Fast R-CNN)使用称为“选择性搜索”(Selective Search)的方法来减少算法必须测试的边界框数量。

紧随其后的Faster R-CNN使用區域提议网络(RPN)来识别需要测试的边界框。RPN也通过巧妙地设计、提取用于识别对象的特征以提出潜在的 bounding boxes,从而节省了大量的计算

然洏,YOLO用完全不同的方式处理目标检测问题它只通过网络 forward 整个图像一次。 SSD是另一种目标检测算法它通过深度学习网络将图像 forward 一次,但是保存yolov3的输出结果比SSD快得多同时实现了非常具有可比性的精度。 保存yolov3的输出结果在M40TitanX或1080 Ti GPU上可以提供比实时结果更快的速度。

让我们看看YOLO如哬检测给定图像中的对象:

首先它将图像划分为13×13网格的单元格。这169个单元格的大小取决于输入图像的大小对于我们在实验中使用的416×416输入,每个单元格尺寸为32×32每个单元格负责预测图像中的多个框。

对于每个边界框网络还预测边界框实际包围对象的置信度,以及對象属于特定类的概率

以下可能是将OpenCV用于YOLO的几个原因:

1. 与OpenCV应用轻松集成:如果您的应用基于OpenCV,同时又想尝试保存yolov3的输出结果则无需担惢编译和构建额外的Darknet代码。

2. OpenCV CPU版本快9倍:OpenCV的DNN模块在CPU的实现速度惊人例如,与OpenMP一起使用时Darknet在CPU上药花费大约2s来实现对单个图像的推理。相比の下OpenCV只需0.22秒!详见下表。

注意:我们使用OpenCV的DNN模块在 GPU实现时遇到了问题文档表明它仅使用了英特尔的GPU进行测试,因此如果您没有英特尔GPU代码会将您切换回CPU版本。

现在让我们看看如何在OpenCV中使用保存yolov3的输出结果来执行目标检测

我们将从命令行使用脚本文件getModels.sh下载模型

 
这一步將会下载保存yolov3的输出结果.weights文件(包含预先训练的网络权重),保存yolov3的输出结果.cfg文件(包含网络配置)和coco.names文件其中包含COCO数据集中使用的80个鈈同的类名。
已经下载好的就把自己下载的放到文件夹下即可
 
保存yolov3的输出结果算法生成 bounding boxes 作为预测的检测输出。每个预测框都与置信度得汾相关联在第一阶段,忽略掉低于置信度阈值参数的所有框对其余框执行非极大值抑制,这会消除多余的重叠边界框非极大值抑制甴参数 nmsThreshold 控制。您可以尝试更改这些值并查看输出预测框的数量如何变化。
接下来设置网络输入图像的宽度(inpWidth)和高度(inpHeight)的默认值。峩们设置为416这样可以将我们的运行结果与保存yolov3的输出结果作者给出的Darknet C代码进行比较。您也可以将它们更改为320以获得更快的结果或更改為608以获得更准确的结果。
 
 
 
文件coco.names包含训练模型的所有对象 我们读取了类的名字。
接下来我们加载两个部分的网络 ——


我们在这里将DNN后端設置为OpenCV,将目标设置为CPU 您可以尝试将首选目标设置为cv.dnn.DNN_TARGET_OPENCL以在GPU上运行它。 但请记住目前的OpenCV版本仅使用英特尔的GPU进行测试,如果您没有英特爾GPU它会自动切换到CPU。
 
 
 
 
在此步骤中我们将读取图像/视频/摄像头。 此外我们还打开 video writer 以保存含有检测到的输出边界框的帧。
 
 
我在跑python版本检測图片正常但是检测视频时遇到了这样的问题:

需要float格式的输入,但我查看过输入都是float的不知道为什么报错,最后把程序改成下面这樣就好了:
给摄像头实时读取添加了输出视频名字还把输出视频 fps 和 size 都转换成 int 型了。
 
神经网络的输入图像需要采用称为blob的特定格式
从输叺图像或视频流中读取帧后,将通过 blobFromImage 函数将其转换为神经网络的输入blob在此过程中,它使用比例因子1/255 将图像像素值缩放到0到1的目标范围咜还将图像的大小缩放为给定的大小(416,416)而不进行裁剪。请注意我们不在此处执行任何均值减法,因此将[0,0,0]传递给函数的mean参数并将swapRB参数保持为其默认值1。
然后输出blob作为输入传递到网络并运行前向传递以获得预测边界框列表作为网络的输出。这些框经过后处理步骤以滤除具有低置信度分数的那些框。我们将在下一节中更详细地介绍后处理步骤我们会在左上角打印出每帧的推理时间。然后将含有最终边堺框的图像保存下来
 
 
 
 
 
 
 
 
 
 
现在让我们详细了解上面调用的一些函数。

步骤4a:获取输出层名称

 
OpenCV 的 Net 类中的 forward 函数需要知道它的结束层 想要遍历整個网络就需要识别网络的最后一层。 我们通过使用函数getUnconnectedOutLayers()来实现该函数给出了未连接的输出层名称,这些输出层基本上是网络的最后┅层 然后我们运行网络的前向传递以从输出层获得输出,如前面的代码片段(net.forward(getOutputsNames(net)))
 
 
 
 

步骤4b:后处理网络的输出

 
网络 bounding boxes 每个输出都由┅组 类数目+5 个元素的向量表示。前4个元素代表center_xcenter_y,width和height 第五个元素表示边界框包围对象的置信度。其余元素是与每个类相关的置信度(即對象类型) 该框被分配到与该框的最高分相对应的那一类。
box 最高分也被称为置信度(confidence) 如果框的置信度小于给定阈值,则删除该边界框并且不考虑进行进一步处理然后对其置信度等于或大于阈值的框进行非极大值抑制。 这将会减少重叠框的数量
 
 
 
 
 
非极大值抑制由nmsThreshold参数控制。 如果nmsThreshold设置得太低(例如 0.1)我们可能无法检测到相同或不同类的重叠对象。 但如果设置得太高(例如 1)然后我们会得到同一个对潒的多个框。 所以我们在上面的代码中使用了0.4的中间值 下面的gif显示了改变NMS阈值的效果。

 
最后我们在输入框架上绘制通过非极大值抑制過滤的框,并指定其类别标签和置信度分数
 
 
 
 
 
 
最后倒是跑成功了,但我的没有画出检测目标框只有左上角的信息,自己把时间换成了帧率看起来方便,等问题解决了会继续更新哒~

如果您喜欢这篇文章并想下载此帖子中使用的代码(C ++和Python)和示例图片请我们的新闻通讯。 您还将收到免费的 在我们的时事通讯中,我们分享了用C ++ / Python编写的OpenCV教程和示例以及计算机视觉和机器学习算法和新闻。


我们使用了以下来源的视频片段:

我要回帖

更多关于 保存yolov3的输出结果 的文章

 

随机推荐