Yolo 暗网仅检测特定 Class,如人、猫、狗等

Yolo Darknet Detecting Only Specific Class like Person, Cat, Dog etc

我们正在使用 YOLO Darknet 进行对象检测。我们正在使用 Python3、tensorflow 1.0、numpy、opencv 3。使用 yolo.weight 进行检测。根据下面 link 给出的: https://github.com/thtrieu/darkflow#cameravideo-file-demo

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

请指导我们如何只检测要搜索的特定 class 名称。

谢谢

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

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

然后,

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

就是这样。

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

因此,如果您只想检测其他 classes 中的某些对象,同时跳过其他对象(即识别它们但跳过),我认为最好编辑 darkflow 源以接受其他参数(例如--mark marklabels.txt).

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

There's a specific section of the darkflow repo 如果您希望获得不同的输出,它会准确告诉您该怎么做。 TLDR - 你应该重新训练你的模型。他们以 3 classes 为例来说明这一点。

但是,无论如何,让我引导您完成整个过程。假设您有一个视频,您只需要跟踪其中的所有人。因此,我们只需要跟踪一种类型的对象 - 'person'.

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

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

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

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

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

    • 但是,如果你希望使用YOLO来class验证和跟踪一种新类型的对象,那么你需要准备自己的数据集和注释。对于此自定义对象,您可以按照 this youtube video series 的第 5-8 部分进行操作。这些视频展示了如何使用 YOLO 跟踪和 classify 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 class)。为此,我们必须为 tiny-yolo-voc 下载权重。您可以找到权重 here for YOLO v2. We will download the weights for Tiny YOLO for VOC dataset。下载后移动文件到/darkflow/bin/目录

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

暗流回购页面上也提到了这一点:

When darkflow sees you are loading tiny-yolo-voc.weights it will look for tiny-yolo-voc.cfg in your cfg/ folder and compare that configuration file to the new one you have set with --model cfg/tiny-yolo-voc-1c.cfg. In this case, every layer will have the same exact number of weights except for the last two, so it will load the weights into all layers up to the last two because they now contain different number of weights.

  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 类型的对象。

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

希望对您有所帮助。

如果你想在不重新训练 darknet 的情况下获得一些快速结果,可以在 https://github.com/AlexeyAB/darknet/issues/2920#issuecomment-482810023 找到官方建议,正如 AlexeyAB 所回答的,我总结如下:

Just add dont_show before each line except cat, dog, person here: https://github.com/AlexeyAB/darknet/blob/master/data/coco.names

and run (something like the following command):

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

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

dont_show person

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