【问题标题】:Yolo Darknet Detecting Only Specific Class like Person, Cat, Dog etcYolo Darknet 仅检测特定类别,如人、猫、狗等
【发布时间】:2017-11-24 06:20:45
【问题描述】:
【问题讨论】:
标签:
python
image-processing
object-detection
darknet
【解决方案1】:
根据我的发现,您可以这样做:
- 将原始 yolo cfg 文件复制到新文件并编辑
[region] 部分中的类到您想要的类数
检测。
- 创建标签文本文件并输入您要检测的类名
(原始类的子集)
那么,
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'。
我们在cfg 目录中复制tiny-yolo-voc.cfg 文件。让我们按照他们的约定命名为tiny-yolo-voc-1c.cfg,其中后缀1c 代表类的数量。选择tiny-yolo-voc 而不是其他配置作为我们的基本模型的原因是它是一个较小的网络,可以在较小的 GPU 上进行训练。从我观察到的其他配置需要 10GB+ 图形内存,它们曾经使我的机器内存不足。
-
我们将在tiny-yolo-voc-1c.cfg 文件中进行必要的更改:
- 将
classes 变量编辑为classes=1
- 在
region 之前的最后一个convolutional 部分,我们将filter 变量更改为5 * (num_class + 5) = 5 * (1+5) = 30。所以,设置filters=30
我们将编辑 darkflow 源目录中的 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。这是必需的,因为当我们训练时,我们提供了权重文件,并且 darkflow 尝试选择相应的配置文件作为训练新模型的参考。
暗流回购页面上也提到了这一点:
当 darkflow 看到您正在加载 tiny-yolo-voc.weights 时,它会在您的 cfg/ 文件夹中查找 tiny-yolo-voc.cfg,并将该配置文件与您使用 --model cfg/ 设置的新配置文件进行比较tiny-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。
您会注意到,每 250 步后,darkflow 将继续将检查点保存在 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 类型的对象。
如果输出不是很好,您可以进一步训练模型,和/或改变阈值或其他参数以获得更好的输出。
希望这会有所帮助。