如何在 Keras 中使用 YOLOv3 进行对象检测

对象检测是计算机视觉中的一项任务,涉及识别给定照片中一个或多个对象的存在、位置和类型。

这是一个具有挑战性的问题,它需要建立在物体识别(例如,它们在哪里)、物体定位(例如,它们的范围是什么)和物体分类(例如,它们是什么)方法的基础上。

近年来,深度学习技术在对象检测方面取得了最先进的结果,例如在标准基准数据集和计算机视觉竞赛中。值得注意的是“You Only Look Once”或 YOLO 系列卷积神经网络,它们通过单一的端到端模型实现了接近最先进的结果,能够实时执行对象检测。

在本教程中,您将学习如何开发 YOLOv3 模型来检测新照片中的对象。

完成本教程后,您将了解:

  • 用于对象检测的 YOLO 系列卷积神经网络模型,以及称为 YOLOv3 的最新变体。
  • Keras 深度学习库 YOLOv3 的最佳开源库实现。
  • 如何使用预训练的 YOLOv3 对新照片执行对象定位和检测。

通过我新书《计算机视觉深度学习》开启您的项目,其中包含分步教程和所有示例的Python 源代码文件。

让我们开始吧。

  • 更新于 2019 年 10 月:已更新并针对 Keras 2.3.0 API 和 TensorFlow 2.0.0 进行了测试。
How to Perform Object Detection With YOLOv3 in Keras

如何在 Keras 中使用 YOLOv3 进行对象检测
照片由 David Berkowitz 提供,部分权利保留。

教程概述

本教程分为三个部分;它们是:

  1. YOLO 用于对象检测
  2. Experiencor YOLO3 项目
  3. 使用 YOLOv3 进行对象检测

想通过深度学习实现计算机视觉成果吗?

立即参加我为期7天的免费电子邮件速成课程(附示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

YOLO 用于对象检测

对象检测是一项计算机视觉任务,它涉及在图像中定位一个或多个对象,并对图像中的每个对象进行分类。

这是一项具有挑战性的计算机视觉任务,它需要成功的对象定位(以定位并围绕图像中的每个对象绘制边界框)和对象分类(以预测被定位对象的正确类别)。

You Only Look Once”(简称 YOLO)系列模型是由 Joseph Redmon 等人设计的、用于快速对象检测的端到端深度学习模型系列,首次在 2015 年的论文“You Only Look Once: Unified, Real-Time Object Detection”中进行了描述。

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

截至撰写本文时,该方法有三个主要变体:YOLOv1、YOLOv2 和 YOLOv3。第一个版本提出了通用架构,而第二个版本优化了设计并使用了预定义的锚框来改进边界框提议,第三个版本进一步优化了模型架构和训练过程。

虽然这些模型的准确性接近但不如基于区域的卷积神经网络(R-CNNs),但它们因其检测速度而成为对象检测的热门选择,通常在视频或摄像头输入上实现实时检测。

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

You Only Look Once: Unified, Real-Time Object Detection,2015。

在本教程中,我们将重点关注 YOLOv3 的使用。

Experiencor Keras-YOLO3 项目

YOLO 每个版本的源代码以及预训练模型均可用。

官方 DarkNet GitHub 存储库包含论文中提到的 YOLO 版本用 C 语言编写的源代码。该存储库提供了如何使用该代码进行对象检测的分步教程。

从头开始实现这个模型是一项挑战,尤其是对于初学者,因为它需要开发许多定制的模型元素来进行训练和预测。例如,即使直接使用预训练模型,也需要复杂的代码来提炼和解释模型预测的边界框。

与其从头开始开发此代码,不如使用第三方实现。有许多第三方实现旨在将 YOLO 与 Keras 结合使用,但没有一个是标准化并设计为用作库的。

The YAD2K project was a de facto standard for YOLOv2 and provided scripts to convert the pre-trained weights into Keras format, use the pre-trained model to make predictions, and provided the code required to distill interpret the predicted bounding boxes. Many other third-party developers have used this code as a starting point and updated it to support YOLOv3.

也许使用预训练 YOLO 模型最广泛使用的项目是名为“keras-yolo3: Training and Detecting Objects with YOLO3”(作者:Huynh Ngoc Anh 或 experiencor)。该项目的代码已根据宽松的 MIT 开源许可证提供。与 YAD2K 一样,它提供了用于加载和使用预训练 YOLO 模型以及用于在新数据集上开发 YOLOv3 模型的迁移学习的脚本。

他还有一个 keras-yolo2 项目,为 YOLOv2 提供了类似的 कोड 以及有关如何使用存储库中代码的详细教程。keras-yolo3 项目似乎是该项目的更新版本。

有趣的是,experiencor 使用该模型作为一些实验的基础,并在标准对象检测问题(如袋鼠数据集、浣熊数据集、红细胞检测等)上训练了 YOLOv3 的版本。他列出了模型性能,提供了模型权重供下载,并提供了模型行为的 YouTube 视频。例如

在本教程中,我们将以 experiencor 的 keras-yolo3 项目为基础,在 Keras 中使用 YOLOv3 模型执行对象检测。

如果存储库发生更改或被移除(第三方开源项目可能会发生这种情况),我们提供了截至撰写本文时的代码分支

使用 YOLOv3 进行对象检测

The keras-yolo3 project provides a lot of capability for using YOLOv3 models, including object detection, transfer learning, and training new models from scratch.

在本节中,我们将使用预训练模型对未见过的照片执行对象检测。此功能包含在存储库中的一个 Python 文件“yolo3_one_file_to_detect_them_all.py”中,该文件大约有 435 行。该脚本实际上是一个程序,它将使用预训练权重来准备模型,并使用该模型执行对象检测并输出一个模型。它还依赖于 OpenCV。

我们不直接使用这个程序,而是重用这个程序中的元素,并开发我们自己的脚本来首先准备和保存 Keras YOLOv3 模型,然后加载模型以对新照片进行预测。

创建和保存模型

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

这些权重是在 MSCOCO 数据集上使用 DarkNet 代码库训练的。下载模型权重并将它们放在当前工作目录中,文件名设置为“yolov3.weights”。这是一个大文件,下载时间可能需要一段时间,具体取决于您的互联网连接速度。

接下来,我们需要定义一个 Keras 模型,该模型具有与下载的模型权重相匹配的正确数量和类型的层。模型架构称为“DarkNet”,最初松散地基于 VGG-16 模型。

The “yolo3_one_file_to_detect_them_all.py” script provides the make_yolov3_model() function to create the model for us, and the helper function _conv_block() that is used to create blocks of layers. These two functions can be copied directly from the script.

现在我们可以定义 YOLOv3 的 Keras 模型。

接下来,我们需要加载模型权重。模型权重以 DarkNet 使用的任何格式存储。我们不是手动解码文件,而是可以使用脚本中提供的 WeightReader 类。

要使用 WeightReader,需要使用权重文件的路径(例如,‘yolov3.weights’)对其进行实例化。这将解析文件并将模型权重加载到内存中,然后我们可以将其设置到我们的 Keras 模型中。

然后,我们可以调用 WeightReader 实例的 load_weights() 函数,传入我们定义的 Keras 模型以将权重设置到层中。

就是这样,我们现在有了一个可用的 YOLOv3 模型。

我们可以将此模型保存到 Keras 兼容的 .h5 模型文件中,以便将来使用。

我们可以将所有这些内容整合在一起;完整的代码示例,包括直接从“yolo3_one_file_to_detect_them_all.py”脚本复制的函数,如下所示:

运行此示例在现代硬件上执行可能需要不到一分钟的时间。

在加载权重时,您将看到有关加载内容的调试信息,由WeightReader类输出。

在运行结束时,model.h5文件将保存在您的当前工作目录中,其大小与原始权重文件(237MB)大致相同,但已准备好直接加载和使用为Keras模型。

进行预测

我们需要一张新的照片来进行对象检测,最好是模型已知的来自MSCOCO数据集的对象。

我们将使用一张由Boegh在一次狩猎中拍摄的三个斑马的照片,并以宽松的许可发布。

Photograph of Three Zebras

三个斑马的照片
由Boegh拍摄,部分权利保留。

下载照片并将其命名为‘zebra.jpg‘,然后将其放在您的当前工作目录中。

进行预测很简单,但解释预测需要一些工作。

第一步是加载Keras模型。这可能是进行预测中最慢的部分。

接下来,我们需要加载我们的新照片并将其准备成适合模型的输入。模型期望输入是彩色图像,分辨率为416×416像素。

我们可以使用Keras函数load_img()来加载图像,并使用target_size参数在加载后调整图像大小。我们还可以使用img_to_array()函数将加载的PIL图像对象转换为NumPy数组,然后将像素值从0-255缩放到0-1的32位浮点值。

稍后我们还需要再次显示原始照片,这意味着我们需要将所有检测到的对象的边界框从正方形形状缩放到原始形状。因此,我们可以加载图像并获取原始形状。

我们可以将所有这些内容整合到一个名为load_image_pixels()的便利函数中,该函数接受文件名和目标大小,并返回已缩放的像素数据,以便作为Keras模型的输入,以及图像的原始宽度和高度。

然后,我们可以调用此函数来加载我们的斑马照片。

现在,我们可以将照片输入Keras模型并进行预测。

好了,至少在进行预测方面是这样。完整的示例将在下面列出。

运行此示例将返回一个包含三个NumPy数组的列表,其形状将显示为输出。

这些数组预测边界框和类别标签,但它们是经过编码的。必须对其进行解释。

进行预测并解释结果

模型的输出实际上是来自三种不同网格尺寸的编码候选边界框,边界框是根据对MSCOCO数据集对象大小的分析仔细选择的锚框的上下文定义的。

experiencor提供的脚本提供了一个名为decode_netout()的函数,该函数将逐个接收NumPy数组,并解码候选边界框和类别预测。此外,任何不能确信地描述对象的边界框(例如,所有类别概率都低于阈值)都会被忽略。我们将使用60%或0.6的概率。该函数返回一个BoundBox实例列表,这些实例定义了每个边界框在输入图像形状和类别概率的上下文中的角点。

接下来,可以将边界框拉伸回原始图像的形状。这很有帮助,因为它意味着我们之后可以绘制原始图像并绘制边界框,希望能检测到真实的对象。

experiencor脚本提供了correct_yolo_boxes()函数来执行边界框坐标的这种转换,该函数将边界框列表、加载照片的原始形状以及网络的输入形状作为参数。边界框的坐标会直接更新。

模型预测了很多候选边界框,其中大部分框将指向相同的对象。边界框列表可以进行过滤,那些重叠并指向同一对象的框可以合并。我们可以将重叠量定义为一个配置参数,在这种情况下是50%或0.5。这种边界框区域的过滤通常称为非极大值抑制,是一个必需的后处理步骤。

experiencor脚本通过do_nms()函数提供此功能,该函数接受边界框列表和阈值参数。它不是清除重叠框,而是清除它们对重叠类别的预测概率。这允许框保留并用于它们也检测到其他对象类型的情况。

这将使我们拥有的框数量不变,但只有很少的框是我们感兴趣的。我们可以检索那些强烈预测对象存在的框:即置信度超过60%的框。这可以通过枚举所有框并检查类别预测值来实现。然后,我们可以查找框对应的类别标签,并将其添加到列表中。每个框都必须针对每个类别标签进行考虑,以防同一个框强烈预测多个对象。

我们可以开发一个get_boxes()函数来实现这一点,该函数将框列表、已知标签和我们的分类阈值作为参数,并返回框、标签和分数的并行列表。

我们可以调用此函数来处理我们的框列表。

我们还需要一个字符串列表,其中包含模型已知的类别标签,以及训练期间使用的正确顺序,特别是来自MSCOCO数据集的那些类别标签。幸运的是,这在experiencor脚本中提供了。

现在我们有了使用YOLOv3模型进行预测、解释结果并绘制它们以供审查所需的所有元素。

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

我们还可以绘制带有类别标签和置信度的字符串。

下面的draw_boxes()函数实现了这一点,它接受原始照片的文件名以及边界框、标签和分数的并行列表,并创建一个显示所有检测到的对象的图。

然后,我们可以调用此函数来绘制我们的最终结果。

现在我们拥有了使用YOLOv3模型进行预测、解释结果并绘制它们以供审查所需的所有元素。

完整的代码列表,包括从experiencor脚本中获取的原始和修改后的函数,为求完整性列在下面。

运行示例,再次打印模型输出的原始形状。

接下来是模型检测到的对象及其置信度的摘要。我们可以看到模型检测到了三只斑马,置信度都高于 90%。

创建了照片的图,并绘制了三个边界框。我们可以看到模型确实成功地检测到了照片中的三只斑马。

Photograph of Three Zebra Each Detected with the YOLOv3 Model and Localized with Bounding Boxes

使用 YOLOv3 模型检测斑马并用边界框定位的照片

进一步阅读

如果您想深入了解,本节提供了更多关于该主题的资源。

论文

API

资源

其他 Keras YOLO 项目

总结

在本教程中,您将学习如何为新照片上的对象检测开发 YOLOv3 模型。

具体来说,你学到了:

  • 用于对象检测的 YOLO 系列卷积神经网络模型,以及称为 YOLOv3 的最新变体。
  • Keras 深度学习库 YOLOv3 的最佳开源库实现。
  • 如何使用预训练的 YOLOv3 对新照片执行对象定位和检测。

你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。

立即开发用于视觉的深度学习模型!

Deep Learning for Computer Vision

在几分钟内开发您自己的视觉模型

...只需几行python代码

在我的新电子书中探索如何实现
用于计算机视觉的深度学习

它提供关于以下主题的自学教程
分类物体检测(YOLO和R-CNN)人脸识别(VGGFace和FaceNet)数据准备等等……

最终将深度学习引入您的视觉项目

跳过学术理论。只看结果。

查看内容

405 条回复关于 “如何在 Keras 中进行 YOLOv3 对象检测”

  1. dong zhan 2019 年 5 月 28 日上午 7:48 #

    非常感谢,机器学习用于对象检测!你开阔了我的视野,但我是一名游戏开发者,所以通常边界框是已知的。我对围棋游戏感兴趣,希望能理解围棋中的机器学习,你能给我指个方向吗?

    • Jason Brownlee 2019 年 5 月 28 日上午 8:23 #

      谢谢。

      抱歉,我没有关于游戏的教程,我无法给你好的建议。

      • usman 2021 年 1 月 28 日晚上 9:57 #

        皮肤伤口护理使用哪种模型?

        • Jason Brownlee 2021 年 1 月 29 日上午 6:04 #

          也许可以在你的问题上测试一系列模型,然后选择表现最好的模型。

    • shgele 2019 年 10 月 2 日上午 5:35 #

      太棒了 @Jason Brownlee,我遇到了像 ValueError: If your data is in the form of symbolic tensors, you should specify the steps argument (instead of the batch_size argument, because symbolic tensors are expected to produce batches of input data) 这样的问题,当我调用 Model.predict(image) 时。

      • HEEGLS 2019年10月2日 上午6:29 #

        @Jasin Brownlee, It was very interesting and very well narrated. Could you please include , how would we add additional training set and labels ?
        Let say, I want this model to train on additional data, to classify Faces, or Hand Scribbled Digits and alphabets ? Suppose I have an additional training & test data set.

      • Masoud 2020年3月29日 下午12:48 #

        choose steps=2

    • andika 2020年2月25日 上午12:43 #

      Nice article,
      I found also an interesting beginner’s guide of YOLOv3 here
      https://machinelearningspace.com/the-beginners-guide-to-implementing-yolov3-in-tensorflow-2-0-part-1/

  2. Anna 2019年5月28日 下午6:42 #

    Amazing post, thanks for sharing

    • Jason Brownlee 2019年5月29日 上午8:37 #

      谢谢,很高兴它有帮助。

      • Grinzou 2020年2月23日 下午8:48 #

        Hi sur, I just want to use the Darknet 53 as a features extractor to my dataset
        How can I get these features using Darknet 53 only?

        • Jason Brownlee 2020年2月24日 上午7:41 #

          Sorry, I don’t have a tutorial on darknet, I cannot give you good off the cuff advice.

    • Hamed 2019年12月22日 下午9:54 #

      嗨,Jason,

      Thanks for this great lesson. Have you tried to run any custom object using experiencor’s codes namely gen_anchor.py and train.py? If so, have you faced any error? gen_anchor.py threw me some errors even with his own config file for raccoon dataset and unfortunately he’s not being responsive. Thank you!

  3. Salman Sajid 2019年5月28日 下午11:19 #

    Kindly also make a blog on How we train a custom object detection with YOLO3

  4. Katia Z 2019年5月29日 上午1:57 #

    Jason, thank you very much for introducing computer vision so clearly! Could you specify in what part we saved our trained model to the disk?

    • Jason Brownlee 2019年5月29日 上午8:50 #

      The model was pre-trained, we simply loaded it.

      • Katia Z 2019年5月31日 下午1:51 #

        Thank you so much for clean working code!) Could you advise some working and understandable GitHub repository for YOLOv3 for detecting objects on video, experiencer case is not clear in steps(

        • Jason Brownlee 2019年5月31日 下午2:48 #

          I hope to cover this in the future, thanks for the suggestion.

  5. Noman Khan 2019年5月29日 上午5:50 #

    Thank you so much Sir! Very amazing and informative tutorial . I am beginner and following your tutorials for learning deep learning.
    kindly Sir!
    1) use YOLOv3 for camera video or simple video
    2) use LSTM for video sequence
    It will be great helpful for me

  6. Lina Xu 2019年6月1日 上午1:13 #

    Thanks so much for posting such a good tutorial, thanks!!!

  7. Jorge a 2019年6月1日 下午4:31 #

    Thank you so much sir for your helpful tutorial.
    Could you tell me how can i change the number and titles of labels in this model ? or labels are unchangeable ?

  8. Lai Junhao 2019年6月4日 上午12:54 #

    Amazing guide Jason.

    At the start I experienced some difficulty with the library, since the latest version of Tensorflow did not work. I downgraded it to v1.12 and it worked.

    Thanks for the introduction to CV and YOLOv3. It was fun trying it out with my own images.

    • Jason Brownlee 2019年6月4日 上午7:53 #

      Thanks, and well done.

      I tested it with TensorFlow 1.13 on Ubuntu Linux and MacOS without incident.

      What OS/platform are you on?

      • Lai Junhao 2019年6月4日 下午11:14 #

        i was using pycharm on windows using anaconda as the python interpreter.

        Irregardless, I will be moving on to the kangaroo tutorial since I managed to run the process successfully.

        Thanks again for creating these tutorials

      • Vikas Verma 2019年7月2日 上午1:44 #

        I am getting “AbortedError: Operation received an exception:Status: 3, message: could not create a dilated convolution forward descriptor, in file tensorflow/core/kernels/mkl_conv_ops.cc:1111
        [[{{node conv_1/convolution}}]]” error in predictin step.

        Using tensorflow 1.13.1

  9. Niall O'Hara 2019年6月6日 上午1:18 #

    Great tutorial Jason. Very well laid out and easy to follow. I’m hoping to extend the tutorial to consider training on a custom data set. Would love to see a follow up blog on this 🙂
    Keep up the great work!

  10. Hans Pfeufer 2019年6月14日 下午7:47 #

    你好,
    Great tutorial, thank you so much. How can I access the location of an object in an image? I would like to know, for instance, where the zebras are in the image (coordinates of the center of the bounding boxes) and save this data to a file.

    • Jason Brownlee 2019年6月15日 上午6:31 #

      The model will output bounding boxes (pixel coordinates) that you can use any way that you wish.

      In this tutorial, we simply draw the box.

    • Atheer Abdullah 2021年11月16日 上午12:19 #

      你好,

      I keep getting the following coordinates

      [(1, 13, 13, 255), (1, 26, 26, 255), (1, 52, 52, 255)]

      No matter how many different images I’m experimenting with, could you please tell me why?

      • Adrian Tam
        Adrian Tam 2021年11月16日 上午2:35 #

        It doesn’t look like a bounding box to me. Can you check?

        • Atheer Abdullah 2021年11月16日 上午3:22 #

          I didn’t change anything in the code, only the image files, what should I check?

  11. Ivan 2019年6月16日 下午12:41 #

    Thanks for an ELI5 guide Jason!

    In interpreting the prediction array with decode_netout(), one of the argument was the anchors that you defined

    anchors = [[116,90, 156,198, 373,326], [30,61, 62,45, 59,119], [10,13, 16,30, 33,23]]

    Is this suppose to be an initial guess for a bounding box of where the object may be?

    • Jason Brownlee 2019年6月17日 上午8:13 #

      好问题。

      It is the shape of the anchor boxes used during training. From the post

      …and the boxes are defined the context of anchor boxes, carefully chosen based on an analysis of the size of objects in the MSCOCO dataset.

      • Paulo 2019年6月19日 上午6:33 #

        But what those anchors are? What are they used for? I’m guessing I my question is the same as Ivan’s.

        • Jason Brownlee 2019年6月19日 上午8:19 #

          They are chosen to best capture objects in the image net dataset, chosen based on that dataset.

          They are used when making a prediction to help quickly find objects in your new photos – e.g. bounding boxes in the image data.

          • Navin 2019年6月23日 下午10:14 #

            嗨,Jason,
            Question regarding anchors as they are hard coded, is it possible to derive them programmatically from yhat or the three NumPy array values or some other mechanism ?
            Also each array of ‘anchors’ having 6 elements is also puzzling, would be nice to know the process/documentation for defining these values.

            Good tutorial and helpful in getting started.
            A suggestion if you could cover on the the steps to generalize this code e.g. if I pass file path of a photo of a cat or a car etc. code should able to detect that just like it did for zebra ?

            非常感谢。

          • Jason Brownlee 2019年6月24日 上午6:31 #

            They are derived based on the average size of objects in a training dataset.

            You could derive them based on the expected object size in your dataset if you like.

    • Robert Franklin 2020年1月18日 上午3:15 #

      This article helped me understand this.

      https://medium.com/analytics-vidhya/yolo-v3-theory-explained-33100f6d193

      From what i can gather the algorithm has set bounding box sizes it uses. Each “cell” (IE small division of the larger image) the probability that this cell contains a specific object is computed for each anchor box size.

      So if you have an image made up of 10 x 10 cells, and 5 anchor sizes, AND 100 objects to detect you will get an output of size

      10 x 10 x 5 x 100
      10 x 10 for each cell
      x 5 for each anchor size
      x 100 for each object

      each of these will be a probability and we take probabilities which meet a certain threshold.

      I’m just learning this so PLEASE correct me if i’m mistaken.

  12. sumitra 2019年6月17日 下午2:35 #

    嗨,Jason,

    I have followed through the Experiencor YOLO3 for Keras Project to train with my own data set. If i would like to crop the bounding box from the newly predicted images, how do i go about it?

    谢谢你

    • Jason Brownlee 2019年6月18日 上午6:32 #

      The model will output bounding boxes, you can use them directly on the image pixels.

      • sumitra 2019年6月18日 下午2:58 #

        Thanks a lot for the response Jason. I managed to get good outputs with new images. However, the mAP performance of the model indicates 0.000 which is very strange. Could there be any reasons for it?

        • Jason Brownlee 2019年6月19日 上午7:48 #

          干得好。

          Perhaps test a suite of images to see if that uncovers more information?

  13. Chinmay 2019年6月25日 下午3:51 #

    awesome tutorial sir !! Please answer this question https://datascience.stackexchange.com/questions/54306/transfer-learning-on-yolo-using-keras
    many thanks

  14. Ashish Roopan 2019年6月27日 上午2:20 #

    Great work Jason.
    Can you also tell me how to train in with a new dataset?
    Mainly the format of annotation of the dataset to train with.(The YOLOv2 of this repository used .xml format like that of pascalVOC).

    Is it the same or something different?

    • Ashish Roopan 2019年6月27日 上午3:40 #

      Also I need train the model with transfer learning.
      So which all layers should I train?
      If possible can you please give an idea about the code to use?

      谢谢你

    • Jason Brownlee 2019年6月27日 上午7:58 #

      I hope to cover that in the future.

      • xavier 2019年7月9日 下午10:58 #

        Hi Jason, thx for this example !

        note that I found that there is some vertical down shift of the output boxes (it can be seen on your “zebra” image output above, the 3 boxes are sligthly too low. The shift can be really bigger on some other images I tested. Even on 416×416 input images)

        Any chance you fix this soon ?
        Many thanks anyway!

  15. Jorgetheman 2019年7月11日 下午3:31 #

    你好,

    This is an awesome tutorial. I went through it but at the end did not get a picture with bounding boxes as shown. I only got the array values and predictions for zebra and percentages.
    A figure with the bounding boxes wasn’t created.

    有什么想法吗?
    谢谢你

  16. Karol Borkowski 2019年7月16日 上午4:34 #

    Is there in the book any additional content in addition to what is in this article?

  17. Karol Borkowski 2019年7月21日 下午10:09 #

    模型的编译是不是缺失了?

  18. Gunners 2019年7月22日 下午5:17 #

    我想运行这段代码。但它太慢了。我认为它没有在 GPU 上运行。如何通过 GPU 测试它?我想在 Jupyter Notebook 中运行它。

  19. Mostafa 2019年7月24日 上午6:18 #

    非常感谢您发布如此好的教程。我的问题是如何使用 YoloV3 检测自定义类别(标签)?换句话说,如何重用(重新训练)它来检测自定义对象?

  20. shreekanth 2019年7月24日 下午8:15 #

    如何用我的数据训练模型

  21. markos 2019年7月25日 上午5:17 #

    一如既往的出色帖子。一个问题。我有一些 .pt(pytorch)格式的 yolo 权重。是否有可能以某种方式加载此 .pt 文件或对其进行转换,以便将其加载到 Keras 实现的 yolo 中?非常感谢!!!

    • Jason Brownlee 2019年7月25日 上午8:00 #

      可能可以转换它们。

      抱歉,我没有这方面的例子。

  22. markos 2019年7月27日 下午7:09 #

    感谢您的回复,Jason。我会去查一下。

  23. Karol Borkowski 2019年7月28日 上午5:21 #

    我有一个关于模型的技术问题。最后一层是如何知道哪些单元对应于哪个单元格的,因为它与前一层密集连接?

    • Jason Brownlee 2019年7月28日 上午6:50 #

      抱歉,您确切地指什么?

      • Karol Borkowski 2019年7月28日 上午8:33 #

        YOLO 网络输出是 S x S x N 个值,其中 S 是两个图像方向上的单元数。因此,网络为图像的每个单元预测 N 个值。
        如果我理解得没错,每一组 N 个值都为相应的图像单元提供了预测。
        我的问题是,当所有东西都密集地连接在一起时,给定的图像单元如何对应于特定的 N 值集?换句话说,网络是如何“知道”预测值的哪一组是图像的哪个部分的?

        我知道这个问题可能有点令人费解,但我希望我现在已经说清楚了。

  24. Karol Borkowski 2019年7月29日 上午6:17 #

    再问一个问题 😉 输出是一个大小为 n x S x S x (B*5 + C) 的张量,其中 n 是锚点大小的数量,S x S 是单元格的数量,B 是每个大小的锚点数量,C 是类别的数量。在我们的模型中,我们有 3 个不同大小的锚点,MSCOCO 数据集有 80 个类别,所以输出张量的大小应该是:(3,S,S,3*5+80),即 (3,S,S,95)。但是,我们的输出是 (3,S,S,255)。这是为什么?

    • Jason Brownlee 2019年7月29日 上午6:27 #

      不完全是,输出是编码的。

      您可以查看帖子中的解码函数,了解如何解释 3D 输出。

      • Karol Borkowski 2019年7月29日 上午6:37 #

        哦,我明白了。再次感谢!😉

  25. Kumar 2019年7月31日 上午2:45 #

    我是机器学习新手。如果我们使用预训练权重来训练自定义(新)对象,它会检测旧对象吗?例如,预训练权重检测 80 个对象(类别),我使用此权重来训练我的新对象(类别)。它会检测 81 个对象还是只有一个(新对象)?
    如果它只检测一个(新对象),如何使其检测 81 个对象?

    提前感谢

    • Jason Brownlee 2019年7月31日 上午6:56 #

      您必须在包含原始训练数据集和新类别的数据集上进行训练。

      从预训练权重开始会大大加快速度!

  26. FT 2019年8月2日 下午5:12 #

    非常感谢您这篇出色的帖子。我有一个问题。在 correct_yolo_boxes() 函数中,计算偏移量和缩放比例的目的是什么?我认为偏移量和缩放比例总是 0 和 1,它们没有影响。

    • Jason Brownlee 2019年8月3日 上午7:48 #

      我认为我们正在将框缩放到图像的大小。

      • Madalin 2019年8月22日 下午11:33 #

        你好,correct_yolo_boxes() 实现中是否有错别字?函数中的第一行:new_w, new_h = net_w, net_h 会使偏移量和缩放比例始终为 0 和 1。

        感谢您的帖子,它给了我很大的帮助。

        • Jason Brownlee 2019年8月23日 上午6:28 #

          谢谢。

          • Aleksey 2020年8月15日 上午5:41 #

            那么,这段代码怎么样?
            偏移量和缩放比例始终为 0 和 1。
            这是错误吗?
            正确的代码是什么?

  27. Yashash Gaurav 2019年8月6日 下午3:52 #

    anyone trying to understand how the Yolov3 outputs are in the shapes they are, this(https://towardsdatascience.com/yolo-v3-object-detection-53fb7d3bfe6b) is an amazing resource.

    感谢您的代码演练 Jason!

  28. Prashanth 2019年8月7日 下午4:44 #

    出色的文章,谢谢。

    我使用 Darknet 训练了我自己的 YOLOv3 模型,带有自定义类别(少于默认的 80 个)。因此,我也有一个新的 .cfg 文件和权重文件。
    我想使用 Keras 在 TensorFlow 中进行推理,而不是 Darknet。

    有没有办法使用您的程序做到这一点?我没有看到可以指定我自己的 .cfg 文件的位置。它似乎只接受权重文件。

    谢谢。

    • Jason Brownlee 2019年8月8日 上午6:29 #

      可能有一种方法,我暂时不确定,抱歉。可能需要做一些实验。

      • Prashanth 2019年8月8日 下午2:31 #

        我尝试将每个 YOLO 层中的过滤器数量从 255 更改为 (num_classes + 5)*3。我能够获得推理结果,但它们与我在原始 Darknet 中获得的结果不匹配。

  29. Karthika 2019年8月20日 下午1:27 #

    非常感谢您如此简单而详尽的解释。
    代码运行正常,但我有一个问题,无法保存模型。
    当我保存任何模型时,都会收到以下错误:

    错误!F:\NITD\Project\Code\model.h5 not UTF-8 encoded.
    已禁用保存。

    • Jason Brownlee 2019年8月20日 下午2:13 #

      这太奇怪了。

      也许是您的 h5py 库出了问题?

      也许可以尝试在 stackoverflow 上发布/搜索相关问题?

  30. Sachin 2019年8月25日 下午4:15 #

    你好,我正在尝试在视频上执行此对象检测,但收到错误。请查看此。

    ERROR: rectangle() missing required argument ‘rec’ (pos 2)

    这是示例代码。您知道如何修复它吗?我尝试了很多方法。

    def cv(frame, x, y, w, h, v_lables, v_scores)
    cv2.rectangle(img = frame,
    pt1 = (x, y),
    pt2 = (x + w, y + h),
    color = (0, 0, 255),
    thickness = 2,
    lineType = cv2.LINE_AA)
    cv2.putText(frame, “{}-{}”.format(v_labels,v_scores), (x + w, y),
    cv2.FONT_HERSHEY_SIMPLEX,
    fontScale = 1, color = (255, 255, 255), thickness = 1, lineType = cv2.LINE_AA)
    return frame

    reader = imageio.get_reader(‘video.mp4’)
    fps = reader.get_meta_data()[‘fps’]
    writer = imageio.get_writer(‘output1.mp4’, fps = fps)

    for i,frame in enumerate(reader)
    image, image_w, image_h = load_image_pixels(frame, (input_w, input_h))
    yhat = model.predict(image)
    for j in range(len(yhat))
    boxes += decode_netout(yhat[j][0], anchors[j], class_threshold, input_h, input_w)
    correct_yolo_boxes(boxes, image_h, image_w, input_h, input_w)
    do_nms(boxes, 0.5)
    v_boxes, v_labels, v_scores = get_boxes(boxes, labels, class_threshold)
    for z in range(len(v_boxes))
    box = v_boxes[z]
    y1, x1, y2, x2 = box.ymin, box.xmin, box.ymax, box.xmax
    width = x2 – x1
    height = y2 – y1
    frame = cv(frame, x1, y1, width, height, v_labels[z], v_scores[z])
    writer.append_data(frame)
    print(i)

  31. Sachin 2019年8月26日 下午3:22 #

    没关系,我已经解决了。谢谢!

    • Jason Brownlee 2019年8月27日 上午6:24 #

      很高兴听到这个消息。

    • Karthika 2019年8月28日 下午3:57 #

      可以分享代码吗?

  32. Tedi 2019年8月27日 上午1:02 #

    你好 Jason,

    感谢您提供全面的教程。

    2 个问题

    1)我尝试删除标签中的一些对象,图像打开时没有应用算法,上面没有任何标记。我们如何添加像(罐子、扬声器等)这样的对象,或者修改当前的列表?

    2)当算法工作时,它的表现确实很好。我们能否从代码中更改边界框锚点,还是必须从训练源代码中完成?如果我们想增加框的高度怎么办?

    我知道这些是深入的问题,如果您能提供任何简短的步骤或来自您的书籍/帖子的研究提示,我将不胜感激。

    谢谢!

  33. Tedi 2019年8月28日 上午7:36 #

    谢谢!

    我会去看看的。

  34. Pasin 2019年9月2日 下午4:58 #

    所以,我尝试用上面的代码预测一张图片,但得到了这个错误:

    ValueError: If your data is in the form of symbolic tensors, you should specify the steps argument (instead of the batch_size argument, because symbolic tensors are expected to produce batches of input data).

    有没有人知道是什么错了?提前感谢!

    • Jason Brownlee 2019年9月3日 上午6:13 #

      也许确认您的库是最新的,并且您将图像加载为 NumPy 数组?

  35. Hongbo Ai 2019年9月3日 下午8:29 #

    代码适用于 zebra.jpg,但对于从互联网下载的大象和胡萝卜图片则失败了。

    • Jason Brownlee 2019年9月4日 上午5:57 #

      也许仔细检查图像是否已正确加载?

      • Hongbo Ai 2019年9月4日 上午11:47 #

        阈值过滤掉了正确的结果。不过现在可以了。

        • Jason Brownlee 2019年9月4日 下午1:43 #

          很高兴听到这个消息。

        • Fetulhak 2019年9月14日 下午9:55 #

          你到底是什么意思,它是过滤正确结果的阈值?当我尝试使用大象图片时,也发生了同样的问题,它没有给出 BB?我是否必须在每次输入不同类别的图片时更改阈值?

          • Hongbo Ai 2019年9月23日 下午7:42 #

            图片的类别值为 0.7,而我的阈值为 0.8,因此绘图图片没有输出。当我将阈值更改为 0.6 时,绘图图片显示了正确的结果。

  36. Salman Sajd 2019年9月5日 上午3:06 #

    感谢您出色的博客,我有一个请求。
    就像“MaskR-CNN 的自定义训练”博客一样,也为 YOLO 写一篇博客。

  37. Sridharan 2019年9月6日 下午2:30 #

    先生,如何将检测到的对象存储在边界框中作为单独的图像?

  38. Fetulhak 2019年9月14日 下午9:33 #

    感谢您不懈地教导我们这些通过互联网学习的人。互联网是我的大学。我目前正在做一个项目,使用 yolov3 算法从厚血涂片图像中检测疟疾寄生虫。我担心的是,yolov3 可能无法在寄生虫级别检测到对象,因为它们很小。您有什么建议?我有这些显微图像。

    • Jason Brownlee 2019年9月15日 上午6:21 #

      这听起来是一个很棒的项目。

      我鼓励您测试一套不同的模型,并找出最适合您特定数据集的模型。

  39. Bhaskar Chandra Trivedi 2019年9月18日 上午4:54 #

    我们可以为判别式相关滤波器进行对象跟踪教程吗?https://arxiv.org/pdf/1611.08461.pdf

  40. Arelis 2019年9月30日 上午10:53 #

    谢谢。您的解释非常好。
    只有一个问题。我怎样才能将带有检测对象的图像保存在磁盘上?

    愿主保佑你。

  41. Florin Andrei 2019年10月2日 下午2:56 #

    很棒的示例,但 decode_netout() 非常慢。有什么建议可以加快速度吗?例如,积极地修剪不需要的物品?

    例如,如果我只对一种标签感兴趣怎么办?

    • Jason Brownlee 2019年10月3日 上午6:36 #

      好问题。您可能需要进行一些实验。

      • Florin Andrei 2019年10月3日 上午7:19 #

        在这里找到了一个很好的提示。

        https://github.com/experiencor/keras-yolo3/issues/177

        或者替换

        if(objectness.all() <= obj_thresh): continue

        if (objectness <= obj_thresh).all(): continue

        它使该函数的速度提高了几个数量级。

        • Jason Brownlee 2019年10月3日 下午1:24 #

          感谢分享。

        • Hyunho Kim 2020年11月10日 下午6:34 #

          我认为该行应如下更改:

          if netout[int(row)][int(col)][b][5:].max() <= obj_thresh: continue

          更正后的行运行良好。
          我认为原始代码有错误。它使所有框都有效。

  42. Sandeco 2019年10月7日 下午11:28 #

    你好 Jason,感谢你提供的所有代码。我的朋友,我将 tensorflow 更新到 2.0 版本,这段代码不起作用。我将导入更改为 tensorflow.keras,但“Add”类在此行“return add([skip_connection, x]) if skip else x”中存在问题。您有什么建议吗?

    • Jason Brownlee 2019年10月8日 上午8:02 #

      如果您使用独立的 Keras v2.3.0 并在 TensorFlow 2.0 之上运行,代码可以正常工作。

  43. Dang Tien Dat 2019年10月8日 下午6:34 #

    非常感谢您的分享,我认为我对 YOLOv3 的理解更深了。
    但我仍然不明白数字的含义
    [(1, 13, 13, 255), (1, 26, 26, 255), (1, 52, 52, 255)]
    我认为 13*13 或 26*26 和 52*52 是三种不同大小的锚框。
    但数字“1”和“255”是什么意思?
    再次感谢您的帮助。

    • Jason Brownlee 2019年10月9日 上午8:07 #

      好问题。

      是的,第一个维度(1)可以忽略,中间的是大小(13 或 26),最后的是框的数量,需要进行缩减或解释。

    • Olexii 2022年2月18日 上午4:34 #

      (1, 13, 13, 255) 转换成 (13, 13, 3, 85),其中 3 是 anch_boxes 的数量,3*85=255,这只是一个重塑操作

  44. tyt 2019年10月16日 下午8:31 #

    model.fit_generator(
    train_generator,
    samples_per_epoch=nb_train_samples,
    nb_epoch=nb_epoch,
    validation_data=validation_generator,
    nb_val_samples=nb_validation_samples)

    我该如何用这段代码进行检测?

  45. Peter Mankowski 2019年10月28日 上午8:42 #

    Jason,
    您有才华将这些教程汇编起来。我的学生使用其中一些进行初步培训。

    问题:您是否有关于流式视频内容/对象识别的教程,可以在新一批实习生到来时使用?
    谢谢,Peter

    • Jason Brownlee 2019年10月28日 下午1:17 #

      谢谢。

      抱歉,我没有关于处理视频数据的教程,希望将来能涵盖。

  46. Andrei Tarnakin 2019年11月8日 下午10:30 #

    你好,

    我认为下面这行代码有误

    44 netout[…, 4:] = _sigmoid(netout[…, 4:])

    应该是

    44 netout[…, 4] = _sigmoid(netout[…, 4])

    您可以通过比较 experiencor/keras-yolo3 中的 utils.py 源代码和 yolo3_one_file_to_detect_them_all.py 来查看。

  47. Sandra Mateska 2019年11月13日 下午4:00 #

    我创建了一个用于锚框的文本文件,看起来像这样:
    C:\path\00000002.jpg 0.33999999999999997,0.6900000000000001,0.7225,0.26,1 0.7775,0.40249999999999997,0.91,0.265,1 0.68,0.97,0.84,0.8025,1
    ..
    (path x1,y1,x2,y2,class)
    我是通过将 txt 文件的格式从如下格式转换而来的:
    (class x y width height)
    *使用不同的标注器

    现在,当我尝试运行 train.py 并将我的锚框、类别、图片文件夹和输出文件夹的路径输入时,会收到错误消息。
    使用 TensorFlow 后端。
    2019-11-13 08:17:06.054804: I C:\tf_jenkins\workspace\rel-win\M\windows\PY\36\tensorflow\core\platform\cpu_feature_guard.cc:140] 您的 CPU 支持此 TensorFlow 二进制文件未编译使用的指令:AVX2
    ……………………………
    回溯(最近一次调用)
    File “train.py”, line 190, in
    _main()
    File “train.py”, line 42, in _main
    with open(annotation_path) as f
    FileNotFoundError: [Errno 2] No such file or directory: ‘train.txt’

    我该怎么办?

  48. Denis Candido 2019年12月14日 上午8:33 #

    你好,Jason!

    您有没有可能写一篇关于如何用新类别重新训练这个 yolo 模型?使用标注数据?使用 labelImg (https://github.com/tzutalin/labelImg) 标注的数据?

    是否仍然可以使用 Keras 完成此任务?

    提前感谢,
    Denis

  49. Ankit 2019年12月17日 上午11:48 #

    感谢与我们分享此教程。

    我无法理解锚框大小如何与 decode_netout 中的 yhat 相关联。较小的输出尺寸 (13,13,255) 正与最大的维度锚框 [116,90, 156,198, 373,326] 进行比较。

    当我们说锚框的尺寸是 116,90 时,它如何映射到原始图像?这些尺寸的单位是什么?

  50. mohammed 2019年12月21日 下午11:26 #

    非常感谢,您能给我一些关于我如何使用此代码处理多视角数据集(任何一张图像有三个视角)的详细信息吗?

    • Jason Brownlee 2019年12月22日 上午6:14 #

      抱歉,我没有处理过多视角数据集的经验。我无法给您提供好的建议。

  51. Hamed 2019年12月24日 下午4:05 #

    嗨,Jason,

    Thanks for this great lesson. Have you tried to run any custom object using experiencor’s codes namely gen_anchor.py and train.py? If so, have you faced any error? gen_anchor.py threw me some errors even with his own config file for raccoon dataset and unfortunately he’s not being responsive. Thank you!

  52. Vikalp Ravi Jain 2019年12月29日 下午10:20 #

    Jason,感谢您的教程。您能解释一下 decode_netout 函数中第 42 行到第 46 行的代码吗?那部分操作对我来说很模糊。

    boxes = []
    netout[…, :2] = _sigmoid(netout[…, :2])
    netout[…, 4:] = _sigmoid(netout[…, 4:])
    netout[…, 5:] = netout[…, 4][…, np.newaxis] * netout[…, 5:]
    netout[…, 5:] *= netout[…, 5:] > obj_thresh

    • Vikalp Ravi Jain 2019年12月29日 下午10:39 #

      特别是第 24 行。
      netout[…, 5:] = netout[…, 4][…, np.newaxis] * netout[…, 5:]

    • Mina 2020年5月21日 上午2:06 #

      您解决这个问题了吗?

  53. Nadav 2019年12月30日 下午8:21 #

    嗨,Jason,
    感谢您对 YOLO 的清晰演示。但是,我该如何使用此方法/模型来训练我自己的新数据集,而不是预加载的数据集?
    非常感谢
    Nadav

  54. Khushit Shah 2020年1月2日 下午4:40 #

    你好,感谢您的教程,这对我帮助很大。我正在将 yolov3-tiny 实现到 Android 中,我得到了一个 [1,2535,85] 的输出数组。我仍然不清楚该如何处理它?

    例如,哪些是类别的概率,哪些是 x、y 位置,哪些是宽度、高度?您能帮我吗?

    谢谢。

    • Jason Brownlee 2020年1月3日 上午7:15 #

      抱歉,我对该模型不熟悉。

    • Rahul 2020年11月16日 上午1:11 #

      您解决这个问题了吗?

  55. Sonder 2020年1月7日 上午4:35 #

    你好,

    非常感谢您提供如此详细的教程。我可以在训练和测试时使用二值图像吗?

  56. Ali 2020年1月10日 下午1:25 #

    感谢与我们分享此教程。

    我是深度学习的初学者,正在尝试为测试数据集找到 YOLOv3 的准确率。我可以通过代码对单个图像进行预测,但无法对整个数据集进行预测。此外,我需要打印精确度和其他有用的参数来将 YOLOv3 与 MASK R-CNN 等其他方法进行比较。您能指导我如何做吗?

    谢谢

  57. Hansy 2020年1月13日 下午3:19 #

    你好,

    非常感谢您提供如此详细的教程,我是深度学习的初学者。我是否可以将此 YOLOv3 用于 CT 扫描图像中的癌症检测?

  58. Saurabh 2020年1月14日 上午2:52 #

    嗨,Jason,

    感谢分享有趣的博客!

    我使用 ssd (mobilenet-v1) 在自定义数据集上训练了目标检测。数据集包含 uno 扑克牌图像(跳过、反转、画四张)。在这所有卡牌上,模型表现都很好,因为我只在这 3 种卡牌上训练了模型(大约 278 张图像,829 个边界框,使用手机收集)。然而,我没有训练模型识别任何其他卡牌,但它仍然在推理(使用网络摄像头)时检测到其他卡牌。

    我该如何解决这个问题?

    请分享您的看法!

    感谢您!

    • Jason Brownlee 2020年1月14日 上午7:26 #

      不客气!

      可以创建一个“其他”类别,并在训练期间提供属于该类别的各种随机示例,然后编写代码在运行时忽略该类别。

  59. Saurabh 2020年1月14日 下午6:28 #

    Jason,感谢您的快速回复。

    这是否也适用于真实场景?因为,比如说,目前我只寻找三张卡牌(跳过、反转和画四张),而忽略其余的卡牌(近 10 张)。

    根据我的兴趣领域(跳过、反转和画四张卡牌),我收集了大约 278 张图像,带有 829 个边界框。正如您建议包含“其他”类别一样,我需要收集更多其他卡牌的图像。但在现实世界中,很难获得其他类别的图像。

    您能否分享您的看法?

    请随时纠正我。

    感谢您!

    • Jason Brownlee 2020年1月15日 上午8:22 #

      “其他”只是指非主要关注的对象。您是在教模型忽略项目的主要焦点之外的内容。

      或者,您可以在管道的上游设置一个限制模型“看到”的内容——例如,部署模型的环境。

  60. Saurabh 2020年1月15日 下午6:35 #

    太棒了!

    感谢您的解释。我理解了您的第一点。关于您的第二点

    [Jason]:您可以设置一个限制模型“看到”的内容

    [Saurabh]:这意味着我不应该将其他类别的图像呈现给模型?这是真的吗?

    您能否更详细地阐述第二点?

    感谢您!

    • Jason Brownlee 2020年1月16日 上午6:12 #

      我的意思是,您可以控制模型的使用方式以及提供给它的数据。您控制环境,进而可以利用这一点来限制模型训练的范围/复杂性。

  61. Saurabh 2020年1月16日 下午6:33 #

    太棒了!

    感谢您的解释。我感谢您的辛勤付出!

    感谢您!

  62. Brijesh Rawat 2020年1月17日 上午5:01 #

    解释得很棒。
    如果我们有不同类别的集合,该怎么办?我可以在同一个 yolo 模型上训练我的新数据集吗?
    另外,如果我有 10 个不同的目标类别,训练需要多长时间?

  63. nusrat 2020年1月25日 上午4:20 #

    是否可以在网络摄像头上进行实时检测并显示分数(百分比)?请提供实时检测的教程。

  64. nusrat 2020年1月26日 上午3:36 #

    嗨 Jason,请提供网络摄像头检测的教程。

  65. Mehrdad Jannesar 2020年1月26日 下午7:03 #

    你好
    我该如何将数据集适配到这个代码的模型中?
    我想将 json 文件或 cifar 10 数据集适配到此代码。

  66. vikash 2020年1月31日 下午11:55 #

    make_yolov3_model()
    {‘filter’: 64, ‘kernel’: 3, ‘stride’: 2, ‘bnorm’: True, ‘leaky’: True, ‘layer_idx’: 1},
    {‘filter’: 32, ‘kernel’: 1, ‘stride’: 1, ‘bnorm’: True, ‘leaky’: True, ‘layer_idx’: 2},
    —-> {‘filter’: 64, ‘kernel’: 3, ‘stride’: 1, ‘bnorm’: True, ‘leaky’: True, ‘layer_idx’: 3}])

    ValueError: Variable bnorm_0/moving_mean/biased 不存在,或者不是使用 tf.get_variable() 创建的。您是否打算在 VarScope 中设置 reuse=tf.AUTO_REUSE?

    我无法解决这个错误,每次我尝试创建 model = make_yolov3_model() 时
    它都会从 make_yolov3_model() 的定义中给出相同的 value error。

  67. Rahul 2020年2月22日 上午5:45 #

    你好 Jason,

    我尝试实现了上面的代码。但是,我没有看到我的图像被框检测出来。

    我得到了斑马的数组和绘图版本作为输出,但没有检测到。

    附注:我没有使用命令提示符。

    谢谢,
    Rahul

  68. KK 2020年2月22日 下午10:57 #

    您能否解释一下为什么在

    def make_yolov3_model()
    input_image = Input(shape=(None, None, 3))

    输入形状被设置为 None,None 而不是 416×416,我认为这是 yolo v3 的默认输入。

    其次,如果我生成并训练一个具有此类 None,None,3 输入的模型,模型摘要将显示输入为 None,None,3。当我尝试将此模型转换为 tflite 时,它会引发错误,提示无法获取输入层的权重——这已在此处讨论过:

    https://github.com/qqwweee/keras-yolo3/issues/48#issuecomment-486978323

    我通过删除损失层创建了一个新模型,如下所示:
    inferenceModel = Model(trainingmodel.input,outputs=[trainingmodel.layers[-7].output]

    但是,我不知道如何使用正确的 Keras 语法来删除 None,None,3 输入层并将其替换为推理模型的 416,416,3 输入。

    您能帮我吗?

    • Jason Brownlee 2020年2月23日 上午7:28 #

      为了保持列/行无边界。

      我不知道 tflite,抱歉。

      • KK 2020年2月23日 下午2:24 #

        第一个问题,为什么模型创建为 None x None 而不是 416×416,您知道原因吗?

        • Jason Brownlee 2020年2月24日 上午7:36 #

          是的,我相信 None,None 的输入是为了让模型通用——让输入尺寸由提供的图像定义。

  69. KK 2020年2月24日 上午3:48 #

    我明白了,谢谢。如果我的训练图像将具有固定的纵横比(即 416×416),我可以直接将其替换为固定大小——这也将解决 tflite 转换问题。

  70. Runist 2020年2月27日 下午7:07 #

    很棒的课程!!!您能写一篇更详细介绍 YOLO 的博客吗?我想一步一步学习如何构建一个像 YOLO 这样的模型并进行训练和预测。

  71. Joy Kumar Chakraborty 2020年3月3日 上午5:18 #

    你好,我下载了预训练的权重 yolov3.weights,并将这段代码复制到同一个文件夹中,但却出现了文件未找到的错误。

    ipython-input-2-3060e4e6db8a> in __init__(self, weight_file)
    1 class WeightReader
    2 def __init__(self, weight_file)
    —-> 3 with open(weight_file, ‘rb’) as w_f
    4 major, = struct.unpack(‘i’, w_f.read(4))
    5 minor, = struct.unpack(‘i’, w_f.read(4))

    FileNotFoundError: [Errno 2] No such file or directory: ‘C:\\Users\\Joych\\Downloads\\y1\\YOLOV3-master\\yolov3.weights’

    • Jason Brownlee 2020年3月3日 上午6:04 #

      尽管如此,错误表明您的代码和权重不在同一个文件夹中。

  72. pouria 2020年3月5日 下午1:24 #

    我在这段代码上遇到了问题。
    yhat = model.predict(image)
    Jupiter 错误。
    AbortedError: Operation received an exception:Status: 3, message: could not create a dilated convolution forward descriptor, in file tensorflow/core/kernels/mkl_conv_ops.cc:1111
    [[{{node conv_1_2/convolution}}]]
    我的 Keras 版本:2.3.1
    请帮助我 🙂

  73. grini 2020年3月9日 上午4:50 #

    想获取 darknet 53 提取的特征。
    这是否可能!

    • Jason Brownlee 2020年3月9日 上午7:18 #

      很可能。我没有使用该库的示例,抱歉。

  74. pouria 2020年3月9日 下午1:59 #

    嗨...
    这真的很棒,对我帮助很大……
    我只是问如何配置这个 Yolo 网络来处理新数据,比如车辆检测(微调)。
    例如,针对 ua_detrac 数据?
    谢谢

  75. thanhhien 2020年3月9日 下午3:27 #


    我需要执行时间大约为每秒 0.05 秒,但这段代码从读取图像到绘制边界框需要 12 秒。有没有什么方法可以缩短这个时间?

    • Jason Brownlee 2020年3月10日 上午5:37 #

      也许

      更快的机器?
      不同的实现?
      更小的数据集?

    • shubham 2020年7月23日 下午6:31 #

      我也遇到了这个问题,如果您知道如何解决,请告诉我。

  76. akbar 2020年3月18日 上午12:43 #


    非常感谢您提供的分步代码……
    我想问一下,如果我想对我的数据进行“迁移学习”,该怎么办?例如,针对车辆……

  77. Hamed Suliman 2020年3月21日 上午7:08 #

    嗨,Jason,
    我想在 coco 数据集中不存在的新对象上训练 yolov3。方法是什么?

  78. Thomas 2020年3月25日 上午4:02 #

    很棒的文章,谢谢。
    我想知道 yolo 的输出数组是什么?有没有人能发送整个数组并解释数组的解码?

  79. Ali 2020年3月30日 下午5:56 #

    非常感谢您如此简单而详尽的解释。

    我想在 GPU 上运行训练好的 YOLOv3 模型进行目标检测。我现在可以在 CPU 上运行您的代码(上面您解释过的代码),但我不知道如何为单个图像进行 GPU 目标检测。您能帮我解决这个问题吗?我强调,我只想进行单张图像的目标检测,而不是训练模型。

    谢谢你

    • Jason Brownlee 2020 年 3 月 31 日上午 7:58 #

      如果您配置了支持 GPU 的 TensorFlow 安装,那么 YOLO 就会在 GPU 上运行。

  80. Jimmy 2020 年 4 月 1 日下午 6:20 #

    感谢如此出色的文章。

    我想使用 predict_signature_def() 函数将此 yoloV3 模型导出到 tensorflow-serving。但我遇到了输出项
    ‘list’ 对象没有属性 ‘dtype’。

    您有解决此问题的建议吗?非常感谢您的时间!

    • Jason Brownlee 2020 年 4 月 2 日上午 5:45 #

      抱歉,我不知道。也许可以尝试将您的问题发布到 Stack Overflow 上。

  81. phil 2020 年 4 月 12 日下午 1:47 #

    Jason,精彩的文章。很喜欢阅读。

    关于 netout 函数的代码有个问题。Experiencor 在输出数组的处理中添加了一个 _softmax 函数。这似乎会影响输出中的置信度。只是想听听您的看法。

    netout[…, 5:] = netout[…, 4][…, np.newaxis] * _softmax(netout[…, 5:])

    谢谢。

    • Jason Brownlee 2020 年 4 月 13 日上午 6:09 #

      谢谢。

      抱歉,我对此了解不多。或许可以直接联系他?

  82. Ali 2020 年 4 月 14 日下午 5:19 #

    嗨,Jason,

    我正在使用带有 Tesla-K80 GPU 的 AWS 实例。我首先配置了 TensorFlow 以使用 GPU。然后,我执行了 YOLOv3_model.py 来预测图像中的对象。但它花了大约 20 秒才预测出图像中的对象。我想知道是不是我哪里出错了,因为我期望执行时间是毫秒而不是 20 秒。您认为这个执行时间对于 GPU 上的 YOLO 预测来说正常吗??

    谢谢

    • Jason Brownlee 2020 年 4 月 15 日上午 7:53 #

      也许第一次启动会比较慢,后续的调用会更快。

  83. Ankit 2020 年 4 月 20 日上午 3:32 #

    boxes[i].xmin = int((boxes[i].xmin – x_offset) / x_scale * image_w)
    ValueError: 无法将浮点数 NaN 转换为整数

    我遇到了这个错误,因为很多值都是 nan。

    顺便说一句,很棒的文章,谢谢。

    • Jason Brownlee 2020 年 4 月 20 日上午 5:31 #

      看起来您的数据中不知何故出现了 nan?

      • Ankit 2020 年 4 月 21 日上午 4:24 #

        我使用 AlexeyAB 训练的 yolov3 仓库处理了相同的图像,输出是正确的。
        https://github.com/AlexeyAB/darknet#how-to-train-tiny-yolo-to-detect-your-custom-objects
        我在您的代码中使用相同的训练权重,但在预测时,有非 nan 数组值,也有很多 nan 数组!

        • Jason Brownlee 2020 年 4 月 21 日上午 6:06 #

          有趣,谢谢分享。

          • Vivek Gupta 2020 年 5 月 23 日上午 1:35 #

            我也在 kaggle notebook 中收到此错误。我已正确复制您的代码。
            这是错误
            —————————————————————————
            ValueError 回溯 (最近一次调用)
            in
            190 boxes += decode_netout(yhat[i][0], anchors[i], class_threshold, input_h, input_w)
            191 # 校正边界框的大小以适应图像的形状
            --> 192 correct_yolo_boxes(boxes, image_h, image_w, input_h, input_w)
            193 # 抑制非极大值框
            194 do_nms(boxes, 0.5)

            在 correct_yolo_boxes(boxes, image_h, image_w, net_h, net_w) 中
            70 x_offset, x_scale = (net_w – new_w)/2./net_w, float(new_w)/net_w
            71 y_offset, y_scale = (net_h – new_h)/2./net_h, float(new_h)/net_h
            --> 72 boxes[i].xmin = int((boxes[i].xmin – x_offset) / x_scale * image_w)
            73 boxes[i].xmax = int((boxes[i].xmax – x_offset) / x_scale * image_w)
            74 boxes[i].ymin = int((boxes[i].ymin – y_offset) / y_scale * image_h)

            ValueError: 无法将浮点数 NaN 转换为整数

          • Jason Brownlee 2020 年 5 月 23 日上午 6:25 #

            很抱歉听到这个消息,请尝试在命令行上从您的工作站运行。

  84. Jayamani S 2020 年 4 月 20 日晚上 9:50 #

    嗨,Jason,

    很棒的教程。解释和执行代码的过程都很好。如果我更改
    输入图像 zebra 为其他图像,结果保持不变。我是否做错了什么?

    我的工作是关于印度道路场景的道路检测。YOLO3 是否用于检测车道?如果是,请告诉我需要进行哪些修改才能实现车道检测。

    • Jason Brownlee 2020 年 4 月 21 日上午 5:55 #

      谢谢。

      不,我认为您需要针对您的数据集训练模型,或者使用预训练模型来解决此问题。

  85. Tabby 2020 年 4 月 23 日下午 7:27 #

    你好,我按照你的教程实现了 yolov3 模型,现在我想将我的 monodepth 深度估计模型与 yolov3 合并,我该怎么做?

  86. Haresh 2020 年 5 月 17 日下午 8:30 #

    我了解到,为了确定锚框的形状,YoloV3 在其中使用 K-means 聚类。
    那么为什么我们应该指定这些大小,

    anchors = [[116,90, 156,198, 373,326], [30,61, 62,45, 59,119], [10,13, 16,30, 33,23]]

    在从上述模型获取预测时。

    谢谢你。

    • Jason Brownlee 2020 年 5 月 18 日上午 6:12 #

      它们是表现良好的框,可以作为起点。

  87. Sritharan A 2020 年 5 月 31 日晚上 10:08 #

    你好 jason,

    关于 YOLO 的绝佳文章。非常感谢

    我就是不理解锚框的概念。正如您所提到的,您仔细检查了数据集并创建了这些锚框。如果您能进一步解释,我们可以获得更多知识来为我们的数据集创建自己的锚框。

    • Jason Brownlee 2020 年 6 月 1 日上午 6:22 #

      我没有创建锚框,是 yolo 模型的开发者创建的。

      一般来说,您需要一些框来匹配您照片中对象的平均大小。这些就是锚框。

      • Sritharan A 2020 年 6 月 7 日晚上 9:53 #

        是的,我读了一些关于锚框的更有趣的文章。正如您所提到的,我们最初会给出一些平均大小,这些大小可能覆盖我们的对象,但随着模型的训练,锚框会根据损失进行调整以适应对象。

  88. Alex Melbourne 2020 年 6 月 3 日下午 2:48 #

    非常感谢您,Jason,这篇文章非常清晰地解释了一个高度复杂的模型。您是否了解任何尝试对 3D 数据进行目标检测的案例?在没有超级计算机的情况下训练这样的模型是否可行?

    • Jason Brownlee 2020 年 6 月 4 日上午 6:10 #

      不客气。

      抱歉,我对 3D 目标检测不太了解。

  89. Leila Dabiran 2020 年 6 月 4 日下午 1:59 #

    感谢这篇很棒的教程。
    有没有办法使用相同的实现,但使用 yolo9000 权重和类?我想让 yolov3 检测超过 80 个类,但我没有自定义标记的数据集。我想让它使用 yolo9000 权重和类。这可能吗?

  90. Sritharan A 2020 年 6 月 8 日上午 3:15 #

    嗨,Jason,

    您能告诉我们如何展平层,然后在之后添加一个 FC 层吗?

    我试过了

    flat1 = Flatten()(model.outputs)
    class1 = Dense(1024, activation=’relu’)(flat1)
    output = Dense(2, activation=’softmax’)(class1)
    # 定义新模型
    model = Model(inputs=model.inputs, outputs=output)
    # 总结
    model.summary()

    并且遇到了错误“Layer flatten_1 expects 1 inputs, but it received 3 input tensors. Input received: [, , ]”。

  91. Sritharan A 2020 年 6 月 8 日晚上 11:47 #

    我理解,Jason。

    model = Model(input_image, [yolo_82, yolo_94, yolo_106])。这是我们模型的最后一层。

    我尝试展平这一层。这就是我遇到错误的原因。

    我想我应该获取这三个层的输出,将它们堆叠起来,然后展平。我的想法对吗?

    • Jason Brownlee 2020 年 6 月 9 日上午 6:02 #

      抱歉,我不明白您在做什么,无法给您好的建议。

  92. Toshit Varshney 2020 年 6 月 10 日晚上 9:11 #

    请告诉我如何在我的数据上自定义 yolo 进行训练?

  93. Jalal Khan 2020 年 6 月 25 日晚上 8:43 #

    先生,我有一个关于激活函数的问题。先生,请告诉我为什么我们在 yolov3 中使用激活函数?

    • Jason Brownlee 2020 年 6 月 26 日上午 5:33 #

      为什么我们在任何神经网络模型中使用激活函数?

      激活函数为模型增加了非线性,使其能够学习复杂的表示和关系。

  94. Ouarda 2020 年 6 月 26 日上午 4:33 #

    首先,感谢您提供的精彩且清晰的教程。
    我想问您关于 yolo 检测器的主要思想(非极大值抑制)?您在代码的哪个地方应用了它?

    • Jason Brownlee 2020 年 6 月 26 日上午 5:41 #

      它是在预测之后应用的,通过 do_nms() 函数。

  95. Ihsan 2020 年 6 月 29 日晚上 9:04 #

    Jason,感谢您提供此教程。
    我正在尝试使用我的数据集训练模型,但在 Y_train 上遇到了问题,我不太明白在训练时应该在三个 NumPy 数组中放入什么。

  96. Alaoui 2020 年 7 月 16 日上午 5:20 #

    嗨,Jason,
    感谢这篇很棒的教程。
    我想知道 YOLO 系列是否是手机相机应用程序中用于检测人脸的模型,以及像这样的大模型(237MB)是如何集成到小型相机应用程序中的?

    • Jason Brownlee 2020 年 7 月 16 日上午 6:48 #

      抱歉,我不知道模型的大小或移动应用程序。

  97. Cong 2020 年 7 月 29 日上午 1:54 #

    我想问:如何定义锚框?
    anchors = [[116,90, 156,198, 373,326], [30,61, 62,45, 59,119], [10,13, 16,30, 33,23]]

    • Jason Brownlee 2020 年 7 月 29 日上午 5:54 #

      我认为这些来自论文或原始实现,基于数据集中对象的尺寸。

  98. akbar 2020 年 8 月 13 日上午 7:09 #

    非常感谢,如何为自定义数据集实现 yolo v3?

  99. sana 2020 年 8 月 14 日晚上 11:21 #

    如何在我自己的数据集上做到这一点?

  100. Deepti Joshi 2020 年 8 月 20 日晚上 9:49 #

    Jason,当我运行此代码时,我只得到打印的图像,没有框或概率值。只是普通的原始图像。您能帮忙吗?

  101. Rohit Gupta 2020 年 9 月 5 日凌晨 12:22 #

    你好 Jason,我下载了权重文件并保存在我的电脑上,但当我使用 WeightReader 读取它们时,它给了我一个文件未找到的错误??

  102. Nicolas 2020 年 9 月 17 日上午 5:34 #

    你好 Jason,我有一个问题。您知道有一个经过训练的网络可以识别图像中的背景或场景吗?例如;这张图片中的背景是森林,这张图片中的背景是高速公路。

  103. Peter 2020 年 9 月 18 日上午 4:30 #

    Jason,很棒的教程,非常感谢!我有兴趣重新训练 YOLO 框架以检测其他事物,您在您的书中或别处是否有涵盖这一点?

    谢谢

  104. Gledson 2020 年 10 月 23 日上午 2:39 #

    下午好 Jason。抱歉打扰。再次祝贺您的解释。Yolo v3 的解释非常好/有趣。但是,我有一个疑问。计算出的 v_boxes 除了边界框外,还提供了每个感兴趣类别的分数。例如,如果我只有一辆汽车,我只能得到一个分数,即仅针对汽车类别的相应分数。如何获得其他类别的相应分数?也就是说,针对同一对象,获得汽车类别的分数,获得人分类别的分数,以及获得自行车类别的分数。

    • Jason Brownlee 2020 年 10 月 23 日上午 6:15 #

      预测将返回一个检测到的对象列表供您枚举。

      • Gledson 2020 年 10 月 23 日晚上 9:49 #

        好的,我会检查。非常感谢。
        致以最诚挚的问候。

  105. Gledson 2020 年 10 月 23 日上午 2:56 #

    下午好 Jason。抱歉打扰。BoundBox (v_box) 中的“objness”变量是否与置信度分数相同?如果是,objness 是否与 IOU 相同?

    此致。

    • Jason Brownlee 2020 年 10 月 23 日上午 6:16 #

      我没有写那个函数,也许可以直接问作者。

      • Gledson 2020 年 10 月 23 日晚上 9:50 #

        好的,我会问的。非常感谢。

  106. Amin 2020 年 10 月 29 日晚上 9:58 #

    Jason 先生您好
    您的文章太棒了,内容详尽、令人兴奋且信息丰富。
    您在这里使用了 yolov3 训练的权重,这些权重被设置为检测斑马。
    我需要能够通过 Yolov3 算法识别汽车的类型及其颜色。
    感谢您的帮助。
    WhatsApp: 09174286232

    • Jason Brownlee 2020 年 10 月 30 日上午 6:51 #

      谢谢!

      也许您可以将示例应用于您的应用程序。

  107. Geleta 2020 年 11 月 8 日下午 1:36 #

    您解释得很清楚,Jason。您的博客是我看到的第一个让我对机器学习有清晰的认识的博客。我将这个博客推荐给了所有问我从哪里学习机器学习的人。在很长一段时间后,我阅读了这篇关于 yolov3 的特殊博客。感谢您的辛勤工作。愿上帝保佑您。

  108. SY Chun 2020 年 11 月 11 日下午 4:01 #

    我是机器学习新手。这篇文章是地球上最好的。通过一次复制粘贴,我就得到了我自己的结果图像!非常感谢您,Jason!

    有一点,您能否帮助我创建一个 joblib dump 文件,以便我可以在 flask 服务器上运行它?再次感谢。

  109. Nishan 2020 年 11 月 13 日凌晨 1:36 #

    有人计算过以上教程的处理时间吗?
    处理单张图像几乎需要 6-7 秒。
    当我用它来处理视频时,视频变得非常慢。
    有人能提供解决该问题的方法吗?

    • Jason Brownlee 2020 年 11 月 13 日上午 6:34 #

      也许可以处理更少的帧?
      或许在更快的机器上运行?
      或许尝试一个替代实现?

  110. 新手学习者 2020年11月14日上午7:19 #

    先生,我有一个包含 21 个类别的图像数据集。类别高度不平衡,例如 5000 辆汽车,另一方面,20 辆警车,3 辆货车,90 辆 SUV……那么如何处理这个问题呢?我在 ultralytics 的 yolov3 中尝试了 focal loss 和 label smoothing,但结果更糟……他们在代码库中更改了很多东西,例如将 crossentropy loss 改为 bcewithlogistic loss 函数……我不知道该怎么办……我应该改用 two-stage detector,如 retina net 吗?或者手动扩充数据来增加类别实例?

  111. Muhammad Danish 2020年12月14日下午4:52 #

    这个教程是为 Windows 还是 Linux 准备的。

    • Jason Brownlee 2020年12月15日上午6:16 #

      在 macOS、Windows 和 Linux 上都进行了测试。

  112. mina 2021年1月1日晚上9:48 #

    Hi Jason, thanks for this very nice tutorial.

    模型的输出图像尺寸比输入图像的实际尺寸小得多
    如何才能看到与输入图像尺寸相同的输出图像?

    • Jason Brownlee 2021年1月2日上午6:25 #

      模型不输出图像,你可以以任何你喜欢的方式解释模型的预测。

  113. Mahin 2021年1月4日晚上11:47 #

    嗨,我正在对手写段落文档图像进行单词定位(检测)。我正在考虑使用 YOLO,这个模型可以用于此吗?每页平均包含约 40 个单词。

    • Jason Brownlee 2021年1月5日上午6:23 #

      我认为有更专业的文本定位技术,我建议您查阅相关文献。

  114. Mina 2021年1月5日晚上8:38 #

    嗨,Jason,
    我有一个问题
    如何使用 Yolo 网络输出?
    例如,如何访问 b-box 的坐标,以便当它们在图像中的某个位置时,可以执行一些特殊操作?

    • Mina 2021年1月5日晚上8:47 #

      我该如何以任何我喜欢的方式解释模型的预测?

    • Jason Brownlee 2021年1月6日上午6:27 #

      模型输出一个矩形,你可以以任何你喜欢的方式解释它,例如,绘制它或用它来裁剪你的图像。

      • mina 2021年1月8日下午5:42 #

        如何访问这个矩形?
        代码的哪个部分允许我访问网络输出?
        感谢您的指导

        • Jason Brownlee 2021年1月9日上午6:40 #

          调用 model.predict() 的结果

          • mina 2021年1月10日下午6:43 #

            非常感谢 Jason

          • Jason Brownlee 2021年1月11日上午6:18 #

            不客气。

  115. Ahan H 2021年1月7日上午3:37 #

    有史以来最好的对象检测帖子!!

  116. Reon 2021年1月8日下午7:52 #

    那些锚是什么?

    • Jason Brownlee 2021年1月9日上午6:41 #

      正如教程中所述,它们是训练数据图像中标准的物体尺寸。

  117. Simin 2021年1月9日下午1:50 #

    感谢您的帖子。我们可以将输入更改为 1 来处理灰度图像吗?

    • Jason Brownlee 2021年1月10日上午5:36 #

      不客气。

      或许可以尝试将单个灰度通道复制到 RGB 通道,然后像平常一样提供给模型。

  118. Jeremy 2021年1月29日上午1:22 #

    非常感谢这个很棒的教程,对我帮助很大!

  119. sultana 2021年2月2日下午12:36 #

    您的工作易于理解。感谢您的辛勤工作。您能否分享一下用于自定义对象检测的 faster RCNN?

  120. nkm 2021年2月3日上午3:37 #

    Jason 先生,您好!

    感谢您发布的精彩博文。

    我正在为网络摄像头实时馈送实现 yolov4。有一些观察结果需要您的支持

    1. 当我在离线 CPU 上对视频运行 yolov4 时,它仅提供 0.2 的速度。

    2. 对于图像预测,它每张图像需要 600 毫秒。

    3. 请澄清:我们是否可以在 CPU 处理器上对网络摄像头实时馈送运行 yolov4 离线?

    4. 如何在 CPU 上实现 yolov4 的硬件部署以进行实时网络摄像头馈送。

    5. 我无法将网络摄像头与 yolov4 集成。请提供任何合适的材料或链接。

    请指引。非常感谢。

    • Jason Brownlee 2021年2月3日上午6:25 #

      不客气!

      抱歉,我没有用网络摄像头使用过 yolo,我认为我不能为您提供好的建议。

  121. nkm 2021年2月3日上午3:40 #

    它的帧率(每秒帧数)只有 0.2。这太慢了,因此无法在实时视频上运行

    • Jason Brownlee 2021年2月3日上午6:26 #

      或许使用不同的模型?
      或许使用更快的机器?
      或许使用更少的帧?
      或许使用更小的图像?

      • nkm 2021年2月4日下午4:54 #

        Jason 先生,感谢您的宝贵建议。

        我尝试了一些建议,其观察结果如下:

        (1) 我尝试了更小的尺寸,这提高了处理时间但降低了准确性。YOLO 的最小图像尺寸是多少才能获得最佳结果?或者这是一个超参数?

        (2) 我尝试了 YOLO-tiny 版本。它的速度提高了近四倍,但准确性却急剧下降。例如,白色的狗被预测为绵羊,而且它也错过了许多物体。

        (3) 减少类别/数量可以提高处理时间吗?

        (3) 我们可以在 CPU 上部署 YOLO(在 GPU 上训练后)吗?……是/否??

        请进一步指导。谢谢!

        此致

        NKM

        • Jason Brownlee 2021年2月5日上午5:34 #

          干得好!

          不确定最小尺寸,但使用非常小的图像可能还需要新的锚框尺寸。

          是的,减少类别将降低问题的复杂性,从而需要一个更小的模型,该模型将更快。

          YOLO 可以在 CPU 上正常运行,但可能较慢。

  122. Shubham Agrawal 2021年2月4日上午6:13 #

    您有 YouTube 频道吗,或者您打算创建一个频道吗?

  123. Nabin Sharma 2021年2月12日下午4:47 #

    一切都很好,但当我运行时
    yhat = model.predict(image)。
    我收到此错误

    UnknownError: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
    [[node conv_0_4/convolution (defined at C:\Users\CIEDEV\miniconda3\envs\nabin\lib\site-packages\keras\backend\tensorflow_backend.py:3009) ]] [Op:__inference_keras_scratch_graph_62618]

    Function call stack
    keras_scratch_graph

    • Jason Brownlee 2021年2月13日上午5:59 #

      看起来您的 keras 安装/配置可能存在问题。

  124. nkm 2021年3月5日晚上11:10 #

    Jason 先生,您好。

    感谢您的指导。

    现在,我已经使用 YOLO 在 CPU 上实现了自定义对象检测器(离线)。

    当我在 CPU 上运行此命令时

    !./darknet detector demo data/obj.data cfg/yolov4-obj.cfg yolov4-obj_final.weights -dont_show MVI_1615_VIS.avi -i 0 -out_filename results.avi

    我收到以下错误:

    GPU 未使用
    OpenCV 版本:3.2.0
    names: 使用默认的 'data/names.list'
    无法打开文件:data/names.list

    请帮助。

    • Jason Brownlee 2021年3月6日上午5:17 #

      我很抱歉听到这个消息。

      或许检查一下您的库是否已更新?

  125. Kevin Lin 2021年3月6日下午2:12 #

    你好。我复制了所有代码,并且运行成功了,但没有找到任何框。

    它仍然输出 [(1, 13, 13, 255), (1, 26, 26, 255), (1, 52, 52, 255)]
    但没有找到任何框,所以这是一张未改变的斑马图片。

    您知道可能是什么出了问题吗?

    decode_netout 现在也需要 nms_thresh,所以我尝试了一下。

  126. Reozil 2021年3月8日上午6:47 #

    嗨,我遇到了和 Kevin Lin 同样的问题,
    我注意到
    loading weights of convolution #99
    no convolution #99
    loading weights of convolution #100
    no convolution #100
    loading weights of convolution #101
    no convolution #101
    loading weights of convolution #102
    no convolution #102
    loading weights of convolution #103
    no convolution #103
    loading weights of convolution #104
    no convolution #104
    loading weights of convolution #105
    no convolution #105

    所以它没有加载所有的权重,尤其是最后的那些。我认为是权重/架构之间存在不匹配?

  127. Reozil 2021年3月12日上午4:02 #

    我成功地在本地的 jupyter 中运行了它。似乎由于某种原因,它在 google colab 上无法正常工作。

  128. Jeremy Springston 2021年3月15日上午8:45 #

    Brownlee 博士,

    下午好,先生!这个教程,以及您总体上的《深度学习计算机视觉》书籍,都非常出色。我度过了过去的几个周末,仔细地阅读了您的书(接下来是 LSTMs,然后是 GANs),学到了很多东西。非常感谢您的所有工作!

    敬礼,
    Jeremy

  129. nkm 2021年3月23日上午6:15 #

    Jason 先生,您好。

    我正在尝试在网络摄像头上运行 YOLO,其中实时馈送来自摄像头以检测对象。

    如何衡量模型的性能?如何计算准确率、精确率、召回率?现在,我只能根据执行每一帧所花费的时间来衡量速度。

    恳请指导。

    • Jason Brownlee 2021年3月24日上午5:45 #

      您可以定义一个测试数据集并选择一个指标,然后计算模型在该数据集上的预测指标。

  130. Subhadeep Roy 2021年4月10日上午1:02 #

    运行时我发现了这个错误

    ValueError: Dimension 1 in both shapes must be equal, but are 24 and 25. Shapes are [?,24,24] and [?,25,25]. for ‘{{node functional_1/concatenate/concat}} = ConcatV2[N=2, T=DT_FLOAT, Tidx=DT_INT32](functional_1/up_sampling2d/resize/ResizeNearestNeighbor, functional_1/add_18/add, functional_1/concatenate/concat/axis)’ with input shapes: [?,24,24,256], [?,25,25,512], [] and with computed input tensors: input[2] = .

    有人能帮帮我吗?

  131. Neelkant Newra 2021年4月24日上午12:00 #

    谢谢您,您的帖子真的帮了我很多!

  132. Albert 2021年4月24日上午3:18 #

    我没有在任何地方找到如何使用和链接已识别对象的边界框数据(yolo/keras 输出)作为机器学习算法的输入。您能给些建议吗?

    此致

    • Jason Brownlee 2021年4月24日上午5:22 #

      这称为数据标注,抱歉我没有关于此主题的教程。

  133. Albert 2021年4月24日上午6:53 #

    好的,我会搜索这个主题,感谢您的澄清!

  134. Juan Monte 2021年5月13日下午5:52 #

    嗨,Jason!

    一如既往的精彩教程。它极大地帮助了我完成我自己的项目。

    尽管如此,我有一个关于 YOLO 和将其与其他深度学习模型使用的问题。

    你看,我想使用 GAN 进行分类(具有共享权重的独立判别器模型),我正在考虑使用 YOLO 的对象检测属性来提高准确率。

    问题是我不知道如何组合这两个输出。

    我曾考虑过

    1. 获取 GAN 模型的输出
    2. 获取 YOLO 模型的边界框和提取的类别

    并以某种方式连接两个输出(也许使用 Keras API 和 concatenate 函数),但我不知道这是否有意义。

    希望您能理解这一点并提供帮助。

    附注:下个月我计划购买您的 CV 和 GAN 书籍。您是否还有其他与计算机视觉及相关主题相关的书籍?

    • Jason Brownlee 2021年5月14日上午6:24 #

      我现在不知道,您需要编写自定义代码并进行一些实验,才能发现适合您的情况的方法。

      我没有关于此主题的确切书籍或教程。

  135. coder 2021年6月3日上午4:37 #

    查看 yolov3 的默认推理,对我帮助很大

    https://github.com/trainOwn/yolov3-Inference

  136. novice 2021年6月8日上午6:18 #

    嗨,Jason,

    我很高兴我购买了您的《深度学习计算机视觉》书籍,它对我的学习非常有帮助。

    我有一个关于使用附加数据(如照片元数据)进行训练的问题。

    例如,假设我想检测汽车,我有一堆汽车照片,有些是真实的,有些是模型汽车。我认为 DL 模型将能够检测到汽车,但在区分模型和真实汽车方面存在困难。

    如果照片有额外的元数据,例如 35mm 焦距,是否可以添加一个层到模型中,以便考虑这些元数据以区分模型汽车和真实汽车?

  137. Jack 2021年6月23日上午10:58 #

    嗨,Jason,

    您能给我一个关于构建自定义训练 YOLOv3 对象检测器的例子吗?
    因为图像背景不同

  138. FD 2021年6月25日上午10:10 #

    嗨,Jason,

    很棒的教程,谢谢。
    我遇到一个问题。模型可以预测我的对象,当我运行这个
    for i in range(len(v_boxes))
    print(v_labels[i], v_scores[i])
    我得到分数和标签,但在图中没有边界框。

    • Jason Brownlee 2021年6月26日上午4:49 #

      不客气。

      也许您可以检查模型提供的边界框,并确认它们具有正确的图像坐标。

  139. Takuya 2021年8月13日下午3:48 #

    嗨,Jason,

    很棒的教程,谢谢。
    我想问一个问题,我记得yolov3有53层,但是代码有106层。为什么是双倍?也许这不是一个好问题……但我想知道……
    谢谢!!

    • Adrian Tam
      Adrian Tam 2021年8月14日上午2:46 #

      你在哪里看到它有53层?这是YOLOv3原始作者的网页,其中一张图上写着106层:https://pjreddie.com/darknet/yolo/

      有时人们的计数方式不同。可能是只计算卷积层?

      • Takuya 2021年8月14日晚上11:20 #

        我明白了。是我的问题……抱歉……
        我以为从19层改为53层就是整个架构了……

        所以有53层用于ImageNet训练,另外53层用于检测任务。
        如果还是错了,请告诉我!

        感谢您回复我的问题!!

        • Adrian Tam
          Adrian Tam 2021年8月17日上午7:06 #

          很高兴你找到了。

  140. sachin 2021年8月28日下午1:44 #

    你好,您能否发布一个使用Kears的yolo进行自定义数据集训练的文章?有一些文章,但不如您发表的清晰。

  141. Prajyot 2021年9月16日上午5:52 #

    嘿,很棒的教程。我是一个新手,我有一个请求,您能否提供一个函数,它执行“decode_netout()”的逆操作,也就是说,它将普通图像注释(bbox x-y坐标,图像中的人脸数量)转换为netout。我想为人脸检测训练您的实现,并且“experiencor/keras-yolo3”repo中的train.py脚本对我来说有点难理解。任何帮助都将不胜感激。

    • Adrian Tam
      Adrian Tam 2021年9月16日晚上11:55 #

      看起来你需要写那个函数。

  142. Sid 2021年9月25日上午2:16 #

    我如何使用fit或train_on_batch训练这个模型?
    这个模型的输入和目标是什么样的?

    • Adrian Tam
      Adrian Tam 2021年9月25日上午4:46 #

      如果你是指从头开始训练,你需要获取COCO数据集并像其他模型一样从头开始训练。这并不推荐,因为在家庭电脑上收敛需要很长时间(几天甚至几个月!)。

  143. Sid 2021年9月26日上午6:01 #

    我将使用预训练的权重,只训练输出层。
    我只是不确定如何调用train_on_batch来使用这个创建的模型。
    train_on_batch的x和y参数应该是什么样的?

  144. anonymous 2021年10月7日下午1:19 #

    你好,
    我正在使用这行代码
    draw_boxes(image, v_boxes, v_labels, .6) 在jupyter notebooks中,但没有显示图像或框。我对opencv不太熟悉,任何建议都将不胜感激。

    • Adrian Tam
      Adrian Tam 2021年10月12日凌晨12:17 #

      Jupyter可能需要一些额外的函数或“魔术命令”来显示它。不同之处在于,在命令行控制台中,您可以创建一个新窗口并显示图片。在Jupyter中,一切都必须先变成HTML才能在浏览器中显示。

  145. Harri 2021年10月15日下午4:32 #

    Jason你好,感谢这个很棒的教程。我只是好奇将这个YOLOv3模型开发成YOLOv4模型需要多少努力,以及这样做是否有意义?

    • Adrian Tam
      Adrian Tam 2021年10月20日晚上8:06 #

      名称相似但完全是不同的东西。你最好采用YOLOv4代码并从头开始。

  146. Besma Guesmi 2021年12月12日凌晨1:23 #

    嗨,
    我如何获得模型的准确性?
    此致。

    • Adrian Tam
      Adrian Tam 2021年12月15日晚上5:53 #

      我们通常使用平均精度均值 (mAP)。

  147. Ale 2021年12月17日下午1:18 #

    你好,
    如果我想只检测一个类(人),有可能吗?如果可以,我需要对代码进行哪些更改才能实现?

    • Adrian Tam
      Adrian Tam 2021年12月19日下午1:33 #

      是的,这是可能的。最简单的更改是选择结果中的一个类别,然后丢弃其余的。

  148. ScanBopAI 2021年12月28日上午11:44 #

    管用,伙计!我的方法就像你说的,让引擎盖下的马达完成所有的繁重工作,而我们只做调整和微调。别忘了在开始之前加载所有必需的支持文件。准确地预测了斑马图像,然后加载了一张包含10种已灭绝鸟类的图像,再次,程序准确地预测了所有10种。

    继续努力。

    • James Carmichael 2021年12月29日上午11:47 #

      ScanBopAI你好!非常感谢您的反馈和好评。

  149. Ved Paranjape 2022年1月14日上午11:38 #

    Jason你好,很棒的教程!
    YOLO v3团队还发布了一个在Google Open Images数据集(约500个类别)上训练的目标检测模型的权重文件。为了运行这些模型的权重进行推理,上述模型需要进行哪些更改?

  150. Jack 2022年3月30日晚上7:59 #

    Jason博士您好
    我能问一下如何输出对象的X、Y坐标吗?

    非常感谢

  151. Navnath Ghavte 2022年4月6日下午4:37 #

    用于作物和病虫害检测的模型是什么?

    • James Carmichael 2022年4月7日上午9:46 #

      Navnath你好……请澄清或重述您的问题,以便我们能更好地帮助您。

  152. Jack 2022年5月25日凌晨1:27 #

    Jason你好,很棒的教程!
    我想问如何连接3个层的输出。

    谢谢你

  153. nkm 2022年6月6日晚上7:43 #

    Jason博士,您好,

    感谢您提供宝贵的解释。

    目前,我正在处理一个目标检测问题,该问题要求在两个级别上检测目标。在第一级,它有类别,在第二级,它有子类别。例如,类别是军舰、商船或私船。军事舰艇的子类别是例如驱逐舰、护卫舰或巡防舰。对于子类别级别的检测,需要为子类别级别的检测添加额外的CNN和Dense层。

    在当前的YOLOv4代码中,我无法更新神经网络的层架构。

    请就实施提出建议/指导。

    先谢谢您。

Leave a Reply

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。