You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在YOLOv8中使用带属性的标注数据训练模型?

YOLOv8结合目标属性训练的解决方案

核心逻辑

YOLOv8并非只能使用官方标准YOLO格式,你可以通过自定义标注格式、修改模型配置和训练逻辑,实现同时检测Bear并预测其male属性,避免多标签训练导致的重复检测问题。

步骤1:转换标注,保留属性

从CVAT导出COCO格式标注后,用脚本将其转换为带属性的YOLO风格标签:

  • 遍历COCO JSON里的每个标注,提取Bear的类别ID(设为0)、将边界框转换为YOLO的归一化坐标(x_center/y_center/width/height),再取出male属性值(用0表示false,1表示true)。
  • 每张图片对应一个.txt标签文件,每行格式为:class_id x_center y_center width height male_flag
    示例:
    0 0.45 0.52 0.78 0.65 1
    0 0.23 0.31 0.62 0.58 0
    

步骤2:修改模型配置文件

复制官方的yolov8n.yaml(或你选用的模型配置),调整以下部分:

  1. 在nc: 1(Bear的类别数)下方添加na: 1(要预测的属性数量,这里仅male一个)。
  2. 在head模块中新增属性预测分支,示例:
    head:
      - [-1, 1, Conv, [256, 1, 1]]  # 原有检测分支
      - [-1, 1, Conv, [na, 1, 1]]   # 新增属性预测分支
    
    (注意:通道数需和上游输出匹配,可根据模型大小调整)

步骤3:修改数据加载逻辑

找到ultralytics/data/datasets.py中的YOLODataset类,修改标签加载逻辑:读取每个标签行的最后一列作为属性标签,将其和检测目标(类别、边界框)一起传入模型。

步骤4:调整损失计算

在ultralytics/models/yolo/detect/train.py中,新增属性分类的损失(如交叉熵损失),将其与检测的CIoU损失、分类损失加权求和,作为总训练损失。

新手简化方案

如果不想修改源码,可将属性转为子类别:把male=true的Bear设为类别1,male=false的设为类别0,用标准YOLO格式训练。这种方式无需改代码,且不会出现重复检测,只是将属性作为子类别处理,灵活性稍弱但上手快。

内容的提问来源于stack exchange,提问作者presentKing

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:13:10