YOLO Darknet仅检测特定类别,如Person、Cat、Dog等 [英] Yolo Darknet Detecting Only Specific Class like Person, Cat, Dog etc

查看:33
本文介绍了YOLO Darknet仅检测特定类别,如Person、Cat、Dog等的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们正在使用YOLO Darknet进行目标检测。我们使用的是Python3、TensorFlow 1.0、NumPy、OpenCV 3。使用yolo.weight进行检测。以下链接中给出的
: 
https://github.com/thtrieu/darkflow#cameravideo-file-demo

当我们在视频上运行它时,它同时检测到所有不需要的对象?

请指导我们如何仅检测要搜索的特定类名。

谢谢

推荐答案

如果您只是按照@JP Kim提到的步骤操作--您将得到一个仅带有您的标签的视频,但它也会将其他对象输出为您的标签之一。

There's a specific section of the darkflow repo,它准确地告诉了如果您想要不同的输出该怎么做。TLDR-你应该重新训练你的模型。他们以3节课为例说明了这一点。

但是,不管怎样,让我向您介绍这个过程。假设您有一段视频,您只需要跟踪其中的所有人。因此,我们只需要跟踪一种类型的对象-‘Person’。

  1. 我们在cfg目录中创建tiny-yolo-voc.cfg文件的副本。让我们遵循他们的惯例,将其命名为tiny-yolo-voc-1c.cfg,其中后缀1c表示类的数量。之所以选择tiny-yolo-voc而不是其他配置作为我们的基本模型,是因为它是一个更小的网络,可以在更小的GPU上进行训练。根据我所观察到的,其他配置需要10 GB以上的图形内存,它们过去常常使我的机器内存不足。

  2. 我们将在tiny-yolo-voc-1c.cfg文件中进行必要的更改:

    • classes变量编辑为classes=1
    • region之前的最后convolutional部分中,我们将filter变量更改为5 * (num_class + 5) = 5 * (1+5) = 30。因此,设置filters=30
  3. 我们将编辑Dark Flow源目录中的labels.txt文件,其中只有一行表示person,因为我们只需要一种类型的标签。

  4. 现在,我们需要训练我们的模型。然而,对于培训,我们首先需要数据集在那里。

    • 现在,如果您的标签是VOC数据集或COCO数据集的现有标签之一,则只需下载其中一个VOC/COCO数据集。在我们的示例中,person是我们需要跟踪的对象类型,而这已经是VOC数据集中的一种对象类型。因此,我们将使用VOC数据集。

    • 但是,如果您希望使用YOLO对新类型的对象进行分类和跟踪,则需要准备您自己的数据集和注释。对于此自定义对象,您可以遵循this youtube video series的第5-8部分。这些视频展示了如何使用YOLO进行跟踪和分类的示例fidget_spinner

  5. 下载VOC数据集,因为它包含我们这类对象的足够数据和批注person

    # Download the Pascal VOC dataset:
    curl -O https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar
    tar xf VOCtest_06-Nov-2007.tar
    
  6. 我们不会从头开始训练。因此,我们实际上将为tiny-yolo-voc模型加载权重,并从那里开始针对我们的特定用例(仅为person类)重新训练。为此,我们必须为tiny-yolo-voc下载权重。您可以找到权重here for YOLO v2。我们将下载Tiny YOLO for VOC dataset的权重。下载后将文件移动到/darkflow/bin/目录。

  7. 下载后,必须使基本模型配置文件和权重文件具有相同的名称。由于重命名配置不是一个好主意,我们将从yolov2-tiny-voc.weights下载的权重重命名为tiny-yolo-voc.weights。这是必需的,因为当我们训练时,我们提供了权重文件,并且Dark Flow尝试选取相应的配置文件作为训练新模型的参考。

Dark Flow回购页面上也提到了这一点:

当DarkFlow看到您正在加载mini-yolo-voc.weights时,它将在您的cfg/文件夹中查找mini-yolo-voc.cfg,并将该配置文件与您设置的新配置文件--Model cfg/iny-yolo-voc-1c.cfg--进行比较。在这种情况下,除最后两个层外,每个层的权重数量都相同,因此它会将权重加载到直到最后两个层的所有层中,因为它们现在包含不同数量的权重。

  1. 现在,我们可以训练模型了。如果您没有GPU来训练--gpu 0.9部分,则可以将其删除。

    # Train the net on the Pascal dataset:
    flow --model cfg/tiny-yolo-voc-1c.cfg --load bin/tiny-yolo-voc.weights --train --dataset "~/VOCdevkit/VOC2007/JPEGImages" --annotation "~/VOCdevkit/VOC2007/Annotations" --gpu 0.9
    
  2. 当您认为损失不再减少时,按Ctrl+C结束训练。通常,良好的损失/平均损失为1或低于1。

您可能已经注意到,在每250步之后,DarkFlow将继续在ckpt/目录中保存检查点。一旦您停止培训,您就可以使用这些检查点中的任何一个来测试您的模型。

  1. 我们将在人的视频上运行它,并让它保存一个带有边界框预测的新视频。在本例中,我们使用第1500步检查点。

    flow --model cfg/tiny-yolo-voc-1c.cfg --load 1500 --demo video-input.mp4 --gpu 0.9 --saveVideo
    

当您运行此程序时,它将显示模型能够处理您的视频的FPS。这可能会因您的计算机而异。根据FPS和视频的长度,这可能需要一些时间才能完成。该过程完成后,您将在darkflow/目录中创建一个video.avi

这应该只有person在视频中检测到的对象类型。

如果输出不是很好,您可以进一步训练您的模型,和/或改变阈值或其他参数以获得更好的输出。

希望这能有所帮助。

这篇关于YOLO Darknet仅检测特定类别,如Person、Cat、Dog等的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆