问题描述
我们正在使用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’。
我们在
cfg
目录中创建tiny-yolo-voc.cfg
文件的副本。让我们遵循他们的惯例,将其命名为tiny-yolo-voc-1c.cfg
,其中后缀1c
表示类的数量。之所以选择tiny-yolo-voc
而不是其他配置作为我们的基本模型,是因为它是一个更小的网络,可以在更小的GPU上进行训练。根据我所观察到的,其他配置需要10 GB以上的图形内存,它们过去常常使我的机器内存不足。我们将在
tiny-yolo-voc-1c.cfg
文件中进行必要的更改:- 将
classes
变量编辑为classes=1
- 在
region
之前的最后convolutional
部分中,我们将filter
变量更改为5 * (num_class + 5) = 5 * (1+5) = 30
。因此,设置filters=30
- 将
我们将编辑Dark Flow源目录中的
labels.txt
文件,其中只有一行表示person
,因为我们只需要一种类型的标签。现在,我们需要训练我们的模型。然而,对于培训,我们首先需要数据集在那里。
现在,如果您的标签是VOC数据集或COCO数据集的现有标签之一,则只需下载其中一个VOC/COCO数据集。在我们的示例中,
person
是我们需要跟踪的对象类型,而这已经是VOC数据集中的一种对象类型。因此,我们将使用VOC数据集。但是,如果您希望使用YOLO对新类型的对象进行分类和跟踪,则需要准备您自己的数据集和注释。对于此自定义对象,您可以遵循this youtube video series的第5-8部分。这些视频展示了如何使用YOLO进行跟踪和分类的示例
fidget_spinner
。
下载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
我们不会从头开始训练。因此,我们实际上将为
tiny-yolo-voc
模型加载权重,并从那里开始针对我们的特定用例(仅为person
类)重新训练。为此,我们必须为tiny-yolo-voc
下载权重。您可以找到权重here for YOLO v2。我们将下载Tiny YOLO for VOC dataset的权重。下载后将文件移动到/darkflow/bin/
目录。下载后,必须使基本模型配置文件和权重文件具有相同的名称。由于重命名配置不是一个好主意,我们将从
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--进行比较。在这种情况下,除最后两个层外,每个层的权重数量都相同,因此它会将权重加载到直到最后两个层的所有层中,因为它们现在包含不同数量的权重。
现在,我们可以训练模型了。如果您没有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
当您认为损失不再减少时,按Ctrl+C结束训练。通常,良好的损失/平均损失为1或低于1。
ckpt/
目录中保存检查点。一旦您停止培训,您就可以使用这些检查点中的任何一个来测试您的模型。
我们将在人的视频上运行它,并让它保存一个带有边界框预测的新视频。在本例中,我们使用第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等的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!