【问题标题】:Yolo Darknet Detecting Only Specific Class like Person, Cat, Dog etcYolo Darknet 仅检测特定类别,如人、猫、狗等
【发布时间】:2017-11-24 06:20:45
【问题描述】:

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

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

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

谢谢

【问题讨论】:

    标签: python image-processing object-detection darknet


    【解决方案1】:

    根据我的发现,您可以这样做:

    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) .

    【讨论】:

      【解决方案2】:

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

      There's a specific section of the darkflow repo 确切地告诉你如果你希望有不同的输出该怎么做。 TLDR - 你应该重新训练你的模型。他们以 3 个类为例来说明这一点。

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

      1. 我们在cfg 目录中复制tiny-yolo-voc.cfg 文件。让我们按照他们的约定命名为tiny-yolo-voc-1c.cfg,其中后缀1c 代表类的数量。选择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 文件,其中只有一行写着 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。这是必需的,因为当我们训练时,我们提供了权重文件,并且 darkflow 尝试选择相应的配置文件作为训练新模型的参考。

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

      当 darkflow 看到您正在加载 tiny-yolo-voc.weights 时,它会在您的 cfg/ 文件夹中查找 tiny-yolo-voc.cfg,并将该配置文件与您使用 --model cfg/ 设置的新配置文件进行比较tiny-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 类型的对象。

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

      希望这会有所帮助。

      【讨论】:

      • 我认为你应该为单类检测设置filters=18。我见过的公式是filters= num/3*(classes+1+4),其中 num=3 用于小型、中型和大型对象。 github.com/pjreddie/darknet/issues/582
      【解决方案3】:

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

      在除猫、狗、人之外的每一行前添加dont_showhttps://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
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-12
        • 2021-05-05
        相关资源
        最近更新 更多