eriklindernoren的YOLOv3如何使用自己的数据集进行train

本文详细介绍如何使用eriklindernoren的YOLOv3项目进行自定义数据集的训练,包括数据集准备、配置文件调整、训练参数设置等步骤,并提供示例代码帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于该yolov3没有讲清楚如何训练自己的数据,所以写个博客
当然你需要提供的书image和xml文件。
参考:
1.pytorch版本的 yolov3https://github.com/eriklindernoren/PyTorch-YOLOv3
2.gaintpanda cv的电子书:从零开始学习yolov3
链接:https://pan.baidu.com/s/14y4tYW_5szm8Y_8XTvLgpg 提取码:xflx

1.data下面文件夹分布

在这里插入图片描述

2.修改参数

1.把图片放进image,xml文件放进annotation
2.classes.names修改自己的类别,本人使用的是voc2007的数据
3.修改所需的yolov3_custom.cfg文件内部的数据
主要是yolo层的classnum,和filter(以voc2007)
类别为20,通道数为3*(20+5)=75
4.修改config文件夹下的custom.data
在这里插入图片描述 这边有个小错误,valid.txt改为val.txt

3.使用下面的generate文件进行一系列txt生成(改文件放置于custom目录下)

运行后会有点慢,耐心!

from __future__ import division
import os
import random
import xml.etree.ElementTree as ET
from os import getcwd
from os.path import join

save_base_path ="Main"
xmlfilepath =r"annotation"

# 生成Main中文件,对应的为xml文件的序号
# trainval_percent表示trainval取90%的数据
# train_percent表示train取trainval得90%
trainval_percent = 0.9
train_perent = 0.9
total_xml = os.listdir(xmlfilepath)

num = len(total_xml)
list = range(num)
tv = int(num*trainval_percent)
tr = int(tv*train_perent)
trainval = random.sample(list,tv)
train = random.sample(trainval,tr)
print("train and val size",tv)
print("train size",tr)

ftrainval = open(join(save_base_path,"train.txt"),"w")
ftest = open(join(save_base_path,"test.txt"),"w")
ftrain = open(join(save_base_path,"train.txt"),"w")
fval = open(join(save_base_path,"val.txt"),"w")

for i in list:
    name=total_xml[i][:-4]+'\n'
    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftrain.write(name)
        else:
            fval.write(name)
    else:
        ftest.write(name)

ftrainval.close()
ftrain.close()
fval.close()
ftest .close()


# 生成对应的图片路径以及labels下归一化结果(index,x,y,w,h)

sets=["train","test","val"]
classes = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]

# 进行归一化
def convert(size,box):
    dw = 1.0/size[0]
    dh = 1.0/size[1]
    x = (box[0]+box[1])/2.0
    y = (box[2]+box[3])/2.0
    w = box[1]-box[0]
    h = box[3]-box[2]
    x = x*dw
    w = w*dw
    y = y*dh
    h = h*dh
    return (x,y,w,h)

def convert_annotation(image_id):
    #将数据集放于当前目录下
    in_file = open("./annotation/%s.xml"%(image_id))
    outfile = open("./labels/%s.txt"%(image_id),"w")
    tree = ET.parse(in_file)
    #获取第一标签
    root = tree.getroot()
    size = root.find("size")
    w = int(size.find("width").text)
    h = int(size.find("height").text)
    for obj in root.iter("object"):
        difficult =obj.find("difficult").text
        cls = obj.find("name").text
        if cls not in classes or int(difficult)==1:
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find("bndbox")
        b = (float(xmlbox.find('xmin').text),float(xmlbox.find("xmax").text),float(xmlbox.find('ymin').text),\
             float(xmlbox.find('ymax').text))
        bb = convert((w,h),b)
        outfile.write(str(cls_id)+" "+" ".join(str(i) for i in bb)+"\n")


wd =getcwd()
for image_set in sets:
    image_ids = open("./Main/%s.txt"%(image_set)).read().strip().split()
    list_file = open("./generate_path/%s.txt"%(image_set),"w")
    for image_id in image_ids:
        list_file.write("data/custom/images/%s.jpg\n"%(image_id))
        convert_annotation(image_id)
    list_file.close()

4.train下面修改自己的默认参数


batchsize最好小一点,取1-4好了

以下是关于YOLOv3训练的相关代码以及如何在GitHub上找到相关资源的信息: ### YOLOv3 训练示例 YOLOv3 是一种高效的实时目标检测算法,其核心思想在于单阶段检测框架的设计。为了实现自定义数据集上的训练,通常需要准备以下几个部分:配置文件、权重初始化方式、数据标注格式等。 #### 准备工作 1. **数据集** 需要将数据集转换为适合YOLOv3使用的格式,通常是COCO或VOC格式。这包括图像文件及其对应的标签文件。 2. **配置文件 (`.cfg`)** 使用YOLOv3官方提供的默认配置文件 `yolov3.cfg` 或者根据需求修改后的版本[^2]。 3. **预训练权重** 如果希望加速收敛过程,可以加载预训练权重(如 `yolov3.weights`)。如果没有,则可以从头开始训练。 4. **环境搭建** 安装必要的依赖库,例如 Darknet 或 PyTorch 版本的实现工具包。 --- ### GitHub 上的 YOLOv3 实现与训练代码 以下是一些常见的 YOLOv3 开源项目链接及说明: 1. **AlexeyAB/darknet** - 地址: https://github.com/AlexeyAB/darknet - 描述: 这是一个基于 C 和 CUDA 的原始实现,支持多种硬件平台下的高性能推理和训练功能。它提供了完整的文档指导用户完成从安装到训练的过程。 ```bash ./darknet detector train cfg/coco.data cfg/yolov3.cfg yolov3.weights ``` 2. **ultralytics/yolov3** - 地址: https://github.com/ultralytics/yolov3 - 描述: 此仓库提供了一个简洁易用的 PyTorch 实现方案,并附带详细的教程帮助开发者快速入门。对于新手来说非常友好。 ```python from models import * from utils.datasets import * parser = argparse.ArgumentParser() parser.add_argument('--epochs', type=int, default=50) opt = parser.parse_args() # 加载模型结构 model = Darknet('cfg/yolov3.cfg').cuda() if torch.cuda.is_available() else Darknet('cfg/yolov3.cfg') # 初始化参数或者加载预训练权重 attempt_download('weights/yolov3.pt') # 自动下载权重文件至本地缓存目录下 ``` 3. **eriklindernoren/PyTorch-YOLOv3** - 地址: https://github.com/eriklindernoren/PyTorch-YOLOv3 - 描述: 提供了一种灵活的方式调整网络架构以适应不同应用场景的需求。同时兼容 COCO 数据集和其他定制化数据集。 ```bash python train.py --model_def config/yolov3-custom.cfg \ --pretrained_weights weights/yolov3.weights \ --data_config config/custom.data ``` --- ### 示例代码片段 下面展示一段简单的 Python 脚本来启动 YOLOv3 的训练流程: ```python import os from models import * # 导入模型模块 from utils.utils import load_classes, non_max_suppression # 工具函数集合 if __name__ == '__main__': # 设置基本参数 epochs = 50 batch_size = 8 img_size = 416 # 创建保存路径 save_dir = 'runs/train/exp' os.makedirs(save_dir, exist_ok=True) # 构建模型实例 device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = Darknet('cfg/yolov3.cfg').to(device) # 尝试恢复已有检查点继续训练;否则随机初始化权重 start_epoch = 0 best_loss = float('inf') try: checkpoint = torch.load('checkpoints/best_model.pth') model.load_state_dict(checkpoint['state_dict']) start_epoch = checkpoint['epoch'] + 1 best_loss = checkpoint.get('best_loss', best_loss) except FileNotFoundError: pass # 执行实际训练逻辑... ``` 上述脚本展示了如何加载模型、设置设备类型以及处理断点续训等功能。 --- ### 注意事项 - 确保 GPU 可用性以便充分利用计算能力提升效率; - 对于大规模数据集建议适当增加迭代次数 (`--epochs`) 并调节学习率策略; - 若采用迁移学习方法则需指定正确的基础权重地址作为输入参数之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值