首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Yolo Darknet仅检测特定类别,如Person、Cat、Dog等

Yolo Darknet仅检测特定类别,如Person、Cat、Dog等
EN

Stack Overflow用户
提问于 2017-06-21 19:13:34
回答 3查看 26.9K关注 0票数 14

我们正在使用YOLO Darknet进行目标检测。我们使用Python3,tensorflow 1.0,numpy,opencv 3。使用yolo.weight进行检测。根据以下链接提供的
:
https://github.com/thtrieu/darkflow#cameravideo-file-demo

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

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

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-20 03:57:57

如果你只是遵循@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上进行训练。根据我所观察到的,其他配置需要10GB+图形内存,它们过去常常使我的机器耗尽内存。
  2. 我们将在tiny-yolo-voc-1c.cfg文件中进行必要的更改:

代码语言:javascript
复制
- edit `classes` variable to `classes=1`
- In the last `convolutional` section just before `region`, we will change `filter` variable to `5 * (num_class + 5) = 5 * (1+5) = 30`. So, set `filters=30`

  1. 我们将编辑darkflow源目录中的labels.txt文件,其中只有一行显示为person,因为我们只需要一种类型的标签。
  2. 现在,我们需要训练我们的模型。然而,为了训练,我们首先需要数据集在那里。

代码语言:javascript
复制
- Now, if your label is one of the existing label of VOC datset or CoCo dataset, then you could just download one of VOC / Coco datsets. In our case `person` is the type of object we need to track, and that is already a type of object in VOC dataset. So, we'll use VOC dataset. 
- However, if you wish to use YOLO to classify and track a new type of object, then you need to prepare your own dataset and annotations. For this custom object purpose, you could follow the part 5-8 of [this youtube video series](https://www.youtube.com/watch?v=Lg4T9iJkwhE). These videos showcase an example of how to use YOLO to track and classify `fidget_spinner`.

  1. 下载VOC数据集,因为它包含了足够的数据和注释用于我们的对象类型person下载Pascal VOC数据集: curl -O https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar tar xf VOCtest_06-Nov-2007.tar
  2. We're not to train scratch。因此,我们实际上要为tiny-yolo-voc模型加载权重,并从那里开始重新训练,用于我们的特定用例(只有person类)。为此,我们必须为tiny-yolo-voc下载权重。您可以找到权重here for YOLO v2。我们将下载Tiny YOLO for VOC dataset的权重。将文件移到downloading.
  3. Once之后的/darkflow/bin/目录我们已经下载了这个文件,有必要使基本模型配置文件和权重文件具有相同的名称。由于重命名配置不是一个好主意,我们将从yolov2-tiny-voc.weights下载的权重重命名为tiny-yolo-voc.weights。这是必需的,因为当我们训练时,我们提供了权重文件,并且darkflow尝试选取相应的配置文件作为训练新模型的参考。

这也在darkflow repo页面中提到:

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

  1. 现在,我们可以训练我们的模型了。如果您没有GPU在Pascal数据集上训练注解网络,则可以删除--gpu 0.9部分: flow --model cfg/tiny yolo-voc-1c.cfg --load bin/tiny yolo-voc.weight-- this.Train --dataset "~/VOCdevkit/VOC2007/JPEGImages“--annotation”~/VOCdevkit/VOC2007/annotation“--当您认为损失不再减少时,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类型的对象。

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

希望这能有所帮助。

票数 20
EN

Stack Overflow用户

发布于 2017-07-18 13:55:22

从我发现的情况来看,你可以这样做:

  1. 将原始yolo cfg文件复制到新文件中,并将区域中类的值编辑为要检测的类数。
  2. 创建标签文本文件,并将要检测的类名(原始类的子集)放入

然后,

代码语言:javascript
复制
flow --model cfg/your_new_copied_file.cfg --load path/to/weight_file --demo your_video.mp4 --labels your_labels.txt --saveVideo

就这样。

但问题是,总体检测准确率明显下降。通常它会检测到与标签中的对象完全不同的对象。(也许darkflow只是在标签中选择最有信心的猜测,如果它高于阈值?)

因此,如果你想在跳过其他对象的同时只检测其他类中的一些对象(即识别它们但跳过),我认为最好编辑暗流源以接受额外的参数(如--mark marklabels.txt)。

票数 6
EN

Stack Overflow用户

发布于 2021-09-17 08:16:19

如果你想要一些快速的结果而不需要重新训练darknet,官方的建议可以在https://github.com/AlexeyAB/darknet/issues/2920#issuecomment-482810023上找到,AlexeyAB回答了这一点,我总结如下:

只需在除猫、狗、人之外的每一行前添加dont_show即可:https://github.com/AlexeyAB/darknet/blob/master/data/coco.names

然后运行(类似以下命令):

./darknet检测器测试cfg/coco.data cfg/yolov3.cfg yolov3.weight -thresh 0.25

因此,对于您不希望输出的每个类,例如person,在第一行的"coco.names“文件中这样做:

代码语言:javascript
复制
dont_show person

如果你不想展示,其他的也是相似的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44674517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档