galaxy7 2026-02-27 01:01 采纳率: 0%
浏览 9
已结题

yolov6n训练结果map一直为0

img

img

img


图片和标签没有问题,训练有200多张,标签有几十个空的,划分是
├── 训练/
│ ├── magics/
│ └── labels/
└── 验证/
├── magics/
└── labels/
yaml也没毛病啊,nc1,name也瞎编了个名字,路径也都是指向图片

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-02-27 01:02
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    你提到的 YOLOv6n 训练中 mAP 始终为 0,这通常意味着模型在训练过程中未能正确学习到目标检测的特征。虽然你说图片和标签没有问题,但可能还有一些细节被忽略了。以下是一些可能导致 mAP 为 0 的原因及解决方案。


    ✅ 一、可能的原因分析

    1. 标签文件格式不正确

    • YOLO 格式要求每个标签文件(.txt)中的每一行是:class_id x_center y_center width height,且所有值都应归一化到 [0,1] 范围内。
    • 如果你的标签文件中存在非归一化的坐标或错误的格式,会导致模型无法识别目标。

    2. 类别数量配置错误

    • 你提到 nc: 1,即只有一种类别。
    • 检查 labels/ 文件夹中是否确实只有一个类别的标注(如所有标签文件中只包含一个数字 0)。
    • 如果有多个类别但 nc 配置错误,也可能导致模型无法识别。

    3. 数据划分问题

    • 你提到数据集分为 trainval,路径结构如下:
      ├── train/
      │   ├── magics/
      │   └── labels/
      └── val/
          ├── magics/
          └── labels/
      
      • 确保 train/labels/val/labels/ 中的标签文件与对应的图像文件一一对应。
      • 确认 train/images/val/images/ 中的图像文件名与 .txt 标签文件名一致(例如 image1.jpg 对应 image1.txt)。

    4. 空标签问题

    • 你提到“标签有几十个空的”,即某些 .txt 文件为空。
    • 这会导致模型在训练时遇到无效的标签,从而影响训练效果。
    • 建议:清理掉这些空标签文件,或者将它们设置为默认值(如 [0 0.5 0.5 0.5 0.5]),以避免训练失败。

    5. yaml 文件配置错误

    • 你提到 yaml 没毛病,但请再次检查以下关键字段:
      nc: 1  # 类别数
      names: ['your_class_name']  # 类别名称
      train: ./data/train/images  # 训练图像路径
      val: ./data/val/images     # 验证图像路径
      
      • 确保路径指向的是图像目录,而不是 labels/ 目录。
      • 确保 trainval 的路径是相对于当前工作目录的。

    ✅ 二、解决方案

    1. 验证标签格式

    • 使用脚本检查标签文件是否符合 YOLO 格式:
      import os
      
      def check_labels(data_dir):
          for label_file in os.listdir(os.path.join(data_dir, 'labels')):
              with open(os.path.join(data_dir, 'labels', label_file), 'r') as f:
                  lines = f.readlines()
                  for line in lines:
                      parts = line.strip().split()
                      if len(parts) != 5:
                          print(f"Invalid label format in {label_file}: {line}")
                      else:
                          class_id, x, y, w, h = map(float, parts)
                          if not (0 <= class_id < 1 or class_id == 0):  # 假设只有一种类别
                              print(f"Invalid class ID in {label_file}: {class_id}")
                          if any(not (0 <= v <= 1) for v in [x, y, w, h]):
                              print(f"Invalid coordinates in {label_file}: {line}")
      
      check_labels('./data/train')
      check_labels('./data/val')
      

    2. 清理空标签文件

    • 删除所有空的 .txt 文件:
      find ./data/train/labels -type f -empty -delete
      find ./data/val/labels -type f -empty -delete
      

    3. 确保路径正确

    • 修改你的 .yaml 文件,确保 trainval 指向的是图像目录,不是标签目录:
      train: ./data/train/magics  # 图像目录
      val: ./data/val/magics     # 图像目录
      

    4. 重新生成标签文件(可选)

    • 如果你使用的是自定义标注工具,确保导出的标签是 YOLO 格式。
    • 可以用以下代码转换 COCO 格式到 YOLO 格式:
      import json
      import os
      
      def convert_coco_to_yolo(json_path, output_dir):
          with open(json_path, 'r') as f:
              data = json.load(f)
      
          images = data['images']
          annotations = data['annotations']
      
          image_id_to_filename = {img['id']: img['file_name'] for img in images}
          category_id_to_name = {cat['id']: cat['name'] for cat in data['categories']}
      
          for ann in annotations:
              image_id = ann['image_id']
              filename = image_id_to_filename[image_id]
              x, y, w, h = ann['bbox']
              class_id = ann['category_id']
              class_name = category_id_to_name[class_id]
      
              # 归一化坐标
              x /= 1024  # 假设图像尺寸是 1024x1024
              y /= 1024
              w /= 1024
              h /= 1024
      
              label_file = os.path.join(output_dir, os.path.splitext(filename)[0] + '.txt')
              with open(label_file, 'a') as f:
                  f.write(f"{class_id} {x} {y} {w} {h}\n")
      

    ✅ 三、修改后的 YAML 示例

    # data.yaml
    train: ./data/train/magics
    val: ./data/val/magics
    nc: 1
    names: ['your_class_name']
    

    ✅ 四、其他建议

    • 增加数据量:200 张图片对于目标检测来说可能偏少,尝试增加更多样本。
    • 调整超参数:如学习率、batch size 等,可以适当调大或调小,观察是否有改善。
    • 查看日志输出:确认训练过程中是否有异常信息(如 loss 不下降、梯度消失等)。

    如果你能提供具体的 data.yaml 内容或部分标签文件内容,我可以进一步帮你排查问题。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月27日
  • 创建了问题 2月27日