如果您只是按照@JP Kim 提到的步骤进行操作 - 您将获得仅带有标签的视频,但它也会输出其他对象作为您的标签之一。
darkflow repo 有一个特定的部分,它准确地告诉你如果你希望有不同的输出该怎么做。TLDR - 你应该重新训练你的模型。他们以 3 个类为例来说明这一点。
但是,无论如何,让我带您完成整个过程。假设您有一个视频,您只需要跟踪其中的所有人。所以,我们只需要跟踪一种类型的对象——“人”。
我们在目录中制作tiny-yolo-voc.cfg
文件的副本。cfg
让我们按照他们的约定命名tiny-yolo-voc-1c.cfg
,其中后缀1c
代表类的数量。选择tiny-yolo-voc
而不是其他配置作为我们的基础模型的原因是它是一个较小的网络,可以在较小的 GPU 上进行训练。从我观察到的其他配置需要 10GB+ 图形内存,它们曾经使我的机器内存不足。
我们将在tiny-yolo-voc-1c.cfg
文件中进行必要的更改:
classes
将变量编辑为classes=1
- 在之前的最后一
convolutional
节中region
,我们将filter
变量更改为5 * (num_class + 5) = 5 * (1+5) = 30
. 所以,设置filters=30
我们将labels.txt
在 darkflow 源目录中编辑该文件,其中只有 1 行表示person
,因为我们只需要一种类型的标签。
现在,我们需要训练我们的模型。但是,对于训练,我们首先需要有数据集。
现在,如果您的标签是 VOC 数据集或 CoCo 数据集的现有标签之一,那么您只需下载 VOC / Coco 数据集之一。在我们的例子person
中是我们需要跟踪的对象类型,这已经是 VOC 数据集中的一种对象。因此,我们将使用 VOC 数据集。
但是,如果您希望使用 YOLO 对一种新型对象进行分类和跟踪,那么您需要准备自己的数据集和注释。对于这个自定义对象的目的,您可以关注这个 youtube 视频系列的第 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
。你可以在这里找到 YOLO v2的权重。我们将为 VOC 数据集下载Tiny YOLO的权重。下载后将文件移动到/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 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
当您认为损失不再减少时,按 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 和视频的长度,这可能需要一些时间才能完成。该过程完成后,您将video.avi
在darkflow/
目录中创建一个。
这应该只有person
在视频中检测到的对象类型。
如果输出不是很好,您可以进一步训练您的模型,和/或改变阈值或其他参数以获得更好的输出。
希望这可以帮助。