【问题标题】:YOLO & Darknet - Training on a custom dataset to detect a specific class and ignore other classesYOLO & Darknet - 在自定义数据集上进行训练以检测特定类并忽略其他类
【发布时间】:2019-08-04 19:08:04
【问题描述】:

使用 YOLO 和暗网训练自定义数据集时,假设可用数据用 3 个类进行注释, voc.names

cat
dog
bird

因此,.txt 文件的格式为

1 0.587 0.576 0.361 0.415
0 0.205 0.803 0.166 0.206
0 0.181 0.597 0.166 0.206
2 0.417 0.857 0.166 0.206

这意味着猫是 0 类,狗 - 1 类,鸟 - 2 类

如果我想训练模型只检测狗(第 1 类)并忽略剩余的类,该怎么做?我可以按以下方式更改 voc.names 文件,即第一行和第三行留空

<assume empty line>
dog
<assume empty line>

如果上述过程出错,有没有其他解决办法?

【问题讨论】:

    标签: yolo darknet darkflow


    【解决方案1】:

    如果您希望模型检测所有类,但只绘制 dog 框,您可以在绘制函数之前添加一个 if 条件。但是如果你想将类的数量从 3 个减少到 1 个,你应该采取一些其他的步骤:

    • 您应该将代码中提到的所有类的数量从 3 更改为 1。例如,在三个 yolo 层中的每一层中。同时更改最大批次数 number_of_classes*2000(除以 3)。
    • 在 yolo 层之前更改每个 conv 层中的过滤器数量。默认为number_of_filters=(classes + 5)x3
    • voc.names 更改为包含 1 行(dog)且没有空行的文件。
    • 更改voc.data中的类数

    如果您可以发布代码的相关部分或链接会有所帮助。

    【讨论】:

    • "更改 voc.data 中的类数" - 但问题是带注释的文件 (.txt) 将 'dog' 作为类 1。如果我们在 voc.names 中仅提及 dog 类,它引发错误。在darkflow中,如果我们在'labels.txt'中提到一个特定的类,它会自动忽略带注释的xml文件中的剩余类,我们可以如上所述在.cfg中进行必要的更改。我认为暗网中没有这样的功能,我们可能必须编辑 .txt 文件以仅包含必要的类。感谢您的建议!
    【解决方案2】:

    最安全的方法是只用狗类训练你的网络,详情可以参考this question

    【讨论】:

      【解决方案3】:

      我认为您必须删除其他类。这可能是一个解决方案:

      import numpy as np
      import os
      
      # Specific class
      class_remaining = 1
      # Dataset's folder name
      folder = "Dataset"
      
      # Browse the dataset
      for file in os.listdir(folder):
          # Get the data from txt file as numpy array
          data = np.genfromtxt(file, delimiter=" ")
          # Filter the array
          filter = data[:, 0] == class_remaining
          # Save the filter array in txt file
          np.savetxt(file, data[filter], newline='\n', fmt='%1.3f')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-24
        • 1970-01-01
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-23
        • 2020-12-12
        相关资源
        最近更新 更多