14

We are using YOLO Darknet for object detection. We are using Python3, tensorflow 1.0, numpy, opencv 3. Using yolo.weight for detection. 
As per given in below link : 
<a href="https://github.com/thtrieu/darkflow#cameravideo-file-demo" rel="noreferrer">https://github.com/thtrieu/darkflow#cameravideo-file-demo
</p>

When we run it on a video, it is simultaneously detecting all the objects, which are not required?

Please guide us on how we can only detect specific class name to be searched.

Thanks

4

3 回答 3

20

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

darkflow repo 有一个特定的部分,它准确地告诉你如果你希望有不同的输出该怎么做。TLDR - 你应该重新训练你的模型。他们以 3 个类为例来说明这一点。

但是,无论如何,让我带您完成整个过程。假设您有一个视频,您只需要跟踪其中的所有人。所以,我们只需要跟踪一种类型的对象——“人”。

  1. 我们在目录中制作tiny-yolo-voc.cfg文件的副本。cfg让我们按照他们的约定命名tiny-yolo-voc-1c.cfg,其中后缀1c代表类的数量。选择tiny-yolo-voc而不是其他配置作为我们的基础模型的原因是它是一个较小的网络,可以在较小的 GPU 上进行训练。从我观察到的其他配置需要 10GB+ 图形内存,它们曾经使我的机器内存不足。

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

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

  4. 现在,我们需要训练我们的模型。但是,对于训练,我们首先需要有数据集。

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

    • 但是,如果您希望使用 YOLO 对一种新型对象进行分类和跟踪,那么您需要准备自己的数据集和注释。对于这个自定义对象的目的,您可以关注这个 youtube 视频系列的第 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。你可以在这里找到 YOLO v2的权重。我们将为 VOC 数据集下载Tiny YOLO的权重。下载后将文件移动到/darkflow/bin/目录。

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

这也在暗流回购页面上提到:

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

  1. 现在,我们可以训练我们的模型了。--gpu 0.9如果您没有 GPU 来训练它,您可以移除该部分。

    # 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 和视频的长度,这可能需要一些时间才能完成。该过程完成后,您将video.avidarkflow/目录中创建一个。

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

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

希望这可以帮助。

于 2018-05-19T19:57:57.270 回答
6

根据我的发现,您可以按以下方式执行此操作:

  1. 将您的原始 yolo cfg 文件复制到新文件,并将 [region] 部分中的类的值编辑为您要检测的类数。
  2. 创建标签文本文件并输入要检测的类名(原始类的子集)

然后,

flow --model cfg/your_new_copied_file.cfg --load path/to/weight_file --demo your_video.mp4 --labels your_labels.txt --saveVideo

而已。

但问题是,整体检测精度显着下降。通常,它会将完全不同的对象检测为标签中的对象。(如果它高于阈值,也许暗流只是选择标签中最自信的猜测?)

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

于 2017-07-18T05:55:21.783 回答
1

如果您想在不重新训练的情况下快速获得结果darknet,可以在https://github.com/AlexeyAB/darknet/issues/2920#issuecomment-482810023找到官方建议,由 AlexeyAB 回答,我将其概括如下:

只需dont_show在除 cat、dog、person 之外的每一行之前添加:https ://github.com/AlexeyAB/darknet/blob/master/data/coco.names

并运行(类似于以下命令):

./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights -thresh 0.25

因此,对于您不希望输出的每个类,例如人员,请在第一行的“coco.names”文件中执行:

dont_show person

如果您也不想显示,其他类似。

于 2021-09-17T08:16:18.770 回答