第一次yolov5调用VOC数据集运行中遇到的问题及解决方案

报错一:

UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xad in position 577

查询到的且确实有效的解决方法是:

在train.py中:

把几行带有with open的括号后面都加上encoding=‘utf-8’

问题解决。

报错二:

AttributeError: Can‘t get attribute ‘SPPF‘ on <module ‘models.common‘ from ‘XXX

查询到的且确实有效的解决方法是:

模型版本与运行环境不一致,在github上下载对应的模型版本

再运行问题解决。

报错三:

No labels found

第一步:数据标签格式不对,将xml转为txt即可。

代码借鉴:https://blog.csdn.net/weixin_45679938/article/details/121938179

版权声明:代码为CSDN博主「你的陈某某」的原创。

import xml.etree.ElementTree as ET
import os


# box [xmin,ymin,xmax,ymax]
def convert(size, box):
    x_center = (box[2] + box[0]) / 2.0
    y_center = (box[3] + box[1]) / 2.0
    # 归一化
    x = x_center / size[0]
    y = y_center / size[1]
    # 求宽高并归一化
    w = (box[2] - box[0]) / size[0]
    h = (box[3] - box[1]) / size[1]
    return (x, y, w, h)


def convert_annotation(xml_paths, yolo_paths, classes):
    xml_files = os.listdir(xml_paths)
    # 生成无序文件列表
    print(f'xml_files:{xml_files}')
    for file in xml_files:
        xml_file_path = os.path.join(xml_paths, file)
        yolo_txt_path = os.path.join(yolo_paths, file.split(".")[0]
                                     + ".txt")
        tree = ET.parse(xml_file_path)
        root = tree.getroot()
        size = root.find("size")
        # 获取xml的width和height的值
        w = int(size.find("width").text)
        h = int(size.find("height").text)
        # object标签可能会存在多个,所以要迭代
        with open(yolo_txt_path, 'w') as f:
            for obj in root.iter("object"):
                difficult = obj.find("difficult").text
                # 种类类别
                cls = obj.find("name").text
                if cls not in classes or difficult == 1:
                    continue
                # 转换成训练模式读取的标签
                cls_id = classes.index(cls)
                xml_box = obj.find("bndbox")
                box = (float(xml_box.find("xmin").text), float(xml_box.find("ymin").text),
                       float(xml_box.find("xmax").text), float(xml_box.find("ymax").text))
                boxex = convert((w, h), box)
                # yolo标准格式类别 x_center,y_center,width,height
                f.write(str(cls_id) + " " + " ".join([str(s) for s in boxex]) + '\n')


if __name__ == "__main__":
    # 数据的类别
    classes_train = ['pedestrian']   # 修改1,类别
    
    # xml存储地址
    xml_dir = "path_1/"  # 修改2,读取位置
    
    # yolo存储地址
    yolo_txt_dir = "path_2/"   # 修改3,保存位置
    
    # voc转yolo
    convert_annotation(xml_paths=xml_dir, yolo_paths=yolo_txt_dir,
                       classes=classes_train)

至此,问题暂时解决,且能够成功运行模型。

本文仅做为记录,不具备参考价值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLOv3是一种目标检测算法,它可以同时实现目标的检测和分类。训练YOLOv3模型需要使用特定的数据集,其包括了目标物体的图像和相应的标注信息。在这里,我将为您介绍如何训练YOLOv3模型使用VOC数据集。 1. 下载VOC数据集:首先,您需要下载Pascal VOC数据集,它是一个常用的目标检测数据集。您可以从官方网站上下载VOC2007和VOC2012两个版本的数据集。 2. 数据集准备:解压下载的数据集文件,并将图像和标注文件分别放置在不同的文件夹。确保每个图像文件都有对应的XML格式的标注文件。 3. 数据集标注:使用标注工具(如LabelImg)打开图像,并手动绘制边界框来标注目标物体的位置。保存标注信息为XML格式。 4. 配置YOLOv3模型:下载YOLOv3的源代码,并根据自己的需求进行配置。主要包括修改配置文件的类别数、训练集和测试集的路径等。 5. 数据集划分:将整个数据集划分为训练集和验证集。通常情况下,80%的数据用于训练,20%用于验证。 6. 数据集换:将数据集的图像和标注信息换为YOLOv3所需的格式。可以使用脚本或工具来完成这一步骤。 7. 模型训练:使用换后的数据集进行模型训练。运行训练脚本,指定配置文件、权重文件和数据集路径等参数。 8. 模型评估:训练完成后,可以使用测试集对模型进行评估,计算模型的精度、召回率等指标。 9. 模型优化:根据评估结果,可以对模型进行优化,如调整超参数、增加训练数据等。 10. 模型应用:训练完成的YOLOv3模型可以用于目标检测任务,可以通过调用模型的API或使用预训练权重来进行目标检测。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值