用yolo v3v3检测单类物体时,检测结果为person与标注错误怎么办

对象检测是计算机视觉的一项任務涉及对给定图像识别一个或多个对象的存在性、位置、类型等属性。

然而如何找到合适的方法来解决对象识别(它们在哪)、对象萣位(其程度如何)、对象分类(它们是什么)的问题,是一项具有挑战性的任务

多年来,在诸如标准基准数据集和计算机视觉竞赛领域等对象识别方法等方面深度学习技术取得了先进成果。其中值得关注的是 yolo v3(You Only Look Once)这是一种卷积神经网络系列算法,通过单一端到端模型实时进行对象检测取得了几乎是最先进的结果。

本教程教你如何建立 yolo v3v3 模型并在新图像上进行对象检测。

学完本教程你会知道:

  • 用於对象检测的、基于卷积神经网络系列模型的 yolo v3 算法,和其最新变种 yolo v3v3
  • 使用 Keras 深度学习库的 yolo v3v3 开源库的最佳实现。
  • 如何使用预处理过的 yolo v3v3来对新圖像进行对象定位和检测。

如何在 Keras 中用 yolo v3v3 进行对象检测 图部分权利保留。

本教程分为三个部分分别是:

  1. 用于对象检测的 yolo v3

对象检测是计算機视觉的任务,不仅涉及在单图像中对一个或多个对象定位还涉及在该图像中对每个对象进行分类。

对象检测这项富有挑战性的计算机視觉任务不仅需要在图像中成功定位对象、找到每个对象并对其绘制边框,还需要对定位好的对象进行正确的分类

yolo v3(You Only Look Once)是一系列端到端的深度学习系列模型,用于快速对象检测由 等人于 2015 年的论文中首次阐述。

该方法涉及单个深度卷积神经网络(最初是 GoogLeNet 的一个版本后來更新了,称为基于 VGG 的 DarkNet)将输入分成单元网格,每个格直接预测边框和对象分类得到的结果是,大量的候选边界框通过后处理步骤合並到最终预测中

在写本文时有三种主要变体:yolo v3v1、yolo v3v2、yolo v3v3。第一个版本提出了通用架构而第二个版本则改进了设计,并使用了预定义的锚定框来改进边界框方案第三个版本进一步完善模型架构和训练过程。

虽然模型的准确性略逊于基于区域的卷积神经网络(R-CNN)但由于 yolo v3 模型嘚检测速度快,因此在对象检测中很受欢迎通常可以在视频或摄像机的输入上实时显示检测结果。

在一次评估中单个神经网络直接从唍整图像预测边界框和类别概率。由于整个检测管道是一个单一的网络因此可以直接对检测性能进行端到端优化。

本教程专注于使用 yolo v3v3

烸个版本的 yolo v3 源代码以及预先训练过的模型都可以下载得到。

官方仓库 中包含了论文中提到的 yolo v3 版本的源代码,是用 C 语言编写的该仓库还提供了分步使用教程,来教授如何用代码进行对象检测

从头开始实现这个模型确实很有挑战性,特别是对新手来说因为需要开发很多洎定义的模型元素,来进行训练和预测例如,即使是直接使用预先训练过的模型也需要复杂的代码来提取和解释模型输出的预测边界框。

我们可以使用第三方实现过的代码而不是从头开始写代码。有许多第三方实现是为了在 Keras 中使用 yolo v3 而设计的但没有一个实现是标准化叻并设计为库来使用的。

是事实意义上的 yolo v3v2 标准它提供了将预先训练的权重转换为 Keras 格式的脚本,使用预先训练的模型进行预测并提供提取解释预测边界框所需的代码。许多其他第三方开发人员已将此代码用作起点并对其进行了更新以支持 yolo v3v3。

使用预训练的 yolo v3 模型最广泛使用嘚项目可能就是 “”了该项目由 开发,也可称他为 Experiencor该项目中的代码已在 MIT 开源许可下提供。与 YAD2K 一样该项目提供了可用于加载和使用预訓练的 yolo v3 模型的脚本,也可在新数据集上开发基于 yolo v3v3 的迁移学习模型

很像,也有详细教程教你如何使用这个仓库的代码 似乎是这个项目的哽新版。

有意思的是Experiencor 以这个模型为基础做了些实验,在诸如袋鼠数据集、racoon 数据集、红细胞检测等等标准对象检测问题上训练了 YOOLOv3 的多种蝂本。他列出了模型表现结果还给出了模型权重以供下载,甚至还发布了展示模型表现结果的 YouTube 视频比如:

这里是 ,以防仓库发生变化戓被删除(这在第三方开源项目中可能会发生)

keras-yolo v33 项目提供了很多使用 yolo v3v3 的模型,包括对象检测、迁移学习、从头开始训练模型等

本节使鼡预训练模型对未见图像进行对象检测。用一个该仓库的 Python 文件就能实现这个功能文件名是 ,有 435 行该脚本其实是用预训练权重准备模型,再用此模型进行对象检测最后输出一个模型。此外该脚本依赖 OpenCV。

我们不直接使用该程序而是用该程序中的元素构建自己的脚本,先准备并保存 Keras yolo v3v3 模型然后加载并对新图像进行预测。

第一步是下载预训练的模型权重

下面是基于 MSCOCO 数据集、使用 DarNet 代码训练好的模型。下载模型权重并置之于当前工作路径,重命名为 yolo v3v3.weights文件很大,下载下来可能需要一会速度跟你的网络有关。

下一步是定义一个 Keras 模型确保模型中层的数量和类型与下载的模型权重相匹配。模型构架称为 DarkNet 最初基本上是基于 VGG-16 模型的。

脚本文件 提供了 make_yolo v3v3_model() 函数用来创建模型,还有輔助函数 _conv_block()用来创建层块。两个函数都能从该脚本中复制


 
接下来载入模型权重。DarkNet 用的权重存储形式不重要我们也无需手动解码,用脚夲中的 WeightReader 类就可以


要想用 WeightReader,先得把权重文件(比如 yolo v3v3.weights)的路径实例化下面的代码将解析文件并将模型权重加载到内存中,这样其格式可以茬 Keras 模型中使用了


 



 
代码如上。现在就有 yolo v3v3 模型可以用了


将此模型保存为 Keras 兼容的 .h5 模型文件,以备待用


 



 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
在现代的硬件设备中运行此示例代码,可能只需要不到一分钟的时间


当权重文件加载后,你可以看到由 WeightReader 类输出的调试信息报告


运行结束时,当前工作路径下保存了 model.h5 文件夶小接近原始权重文件(237MB),但是可以像 Keras 模型一样可以加载该文件并直接使用


我们需要一张用于对象检测的新照片,理想情况下图片中嘚对象是我们知道的模型从 可识别的对象


这里使用一张三匹斑马的图片,是 在旅行时拍摄的且带有发布许可。

 
三匹斑马图片
Boegh 摄部分權利保留。
 
下载这张图片放在当前工作路径,命名为 zebra.jpg
尽管解释预测结果需要一些工作,但做出预测是直截了当的
第一步是 ,这可能昰做预测过程中最慢的一步了

 
接下来要加载新的图像,并将其整理成适合作为模型输入的形式模型想要的输入形式是 416×416 正方形的彩色圖片。





 
我们希望稍后再次显示原始照片这意味着我们需要将所有检测到的对象的边界框从方形形状缩放回原始形状。 这样我们就可以加载图片并恢复原始形状了。


以上步骤可以都连在一起写成 load_image_pixels() 函数,方便使用该函数的输入是文件名、目标尺寸,返回的是缩放过的像素数据这些数据可作为 Keras 模型的输入,还返回原始图像的宽度和高度


 
 
 
 
 
 
然后调用该函数,加载斑马图


 
将该图片给 Keras 模型做输入,进行预测


 
以上就是做预测本身的过程。完整示例如下


 
 
 
 
 
 
示例代码返回有三个 Numpy 数组的列表,其形状作为输出展现出来


这些数据既预测了边框,又預测了标签的种类但是是编码过的。这些结果需要解释一下才行


实际上模型的输出是编码过的候选边框,这些候选边框来源于三种不哃大小的网格框本身是由锚框的情境定义的,由基于在 MSCOCO 数据集中对对象尺寸的分析仔细选择得来的。


由 experincor 提供的脚本中有一个 decode_netout() 函数可鉯一次一个取每个 Numpy 数组,将候选边框和预测的分类解码此外,所有不能有足够把握(比如概率低于某个阈值)描述对象的边框都将被忽畧掉此处使用 60% 或 0.6 的概率阈值。该函数返回 BoundBox 的实例列表这个实例定义了每个边界框的角。这些边界框代表了输入图像的形状和类别概率


 
 
接下来要将边框拉伸至原来图像的形状。这一步很有用因为这意味着稍后我们可以绘制原始图像并绘制边界框,希望能够检测到真实對象


由 Experiencor 提供的脚本中有 correct_yolo v3_boxes() 函数,可以转换边框坐标把边界框列表、一开始加载的图片的原始形状以及网络中输入的形状作为参数。边界框的坐标直接更新:


 
模型预测了许多边框大多数框是同一对象。可筛选边框列表将那些重叠的、指向统一对象的框都合并。可将重叠數量定义为配置参数此处是50%或0.5 。这一筛选步骤的条件并不是最严格的而且需要更多后处理步骤。


该脚本通过 do_nms() 实现这一点该函数的参數是边框列表和阈值。该函数整理的不是重叠的边框而是重叠类的预测概率。这样如果检测到另外的对象类型边框仍还可用。


 
这样留丅的边框数量就一样了但只有少数有用。 我们只能检索那些强烈预测对象存在的边框:超过 60% 的置信率 这可以通过遍历所有框并检查类預测值来实现。 然后我们可以查找该框的相应类标签并将其添加到列表中。 每个边框需要跟每个类标签一一核对以防同一个框强烈预測多个对象。


创建一个 get_boxes() 函数实现这一步将边框列表、已知标签、分类阈值作为参数,将对应的边框列表、标签、和评分当做返回值


 
 
 
 
 
用邊框列表当做参数调用该函数。


我们还需要一个字符串列表其中包含模型中已知的类标签,顺序要和训练模型时候的顺序保持一致特別是 MSCOCO 数据集中的类标签。 值得庆幸的是这些在 Experiencor 的脚本中也提供。


 
现在有了预测对象较强的少数边框可以对它们做个总结。


 
我们还可以繪制原始照片并在每个检测到的物体周围绘制边界框 这可以通过从每个边界框检索坐标并创建 Rectangle 对象来实现。


也可以用类标签和置信度以芓符串形式绘制出来


 
下面的 draw_boxes() 函数实现了这一点,获取原始照片的文件名、对应边框列表、标签、评分绘制出检测到的所有对象。


 
 
 
 
 
 
 
 
 
 
 
然后調用该函数绘制最终结果。


 
使用 yolo v3v3 模型做预测所要的所有元素现在都有了。解释结果并绘制出来以供审查。


下面列出了完整代码清单包括原始和修改过的 xperiencor 脚本。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

我要回帖

更多关于 yolo v3 的文章

 

随机推荐