yolo训练自己的数据实践总结

本文总结了使用yolo进行深度学习目标检测的实践经验,包括数据准备、网络配置、训练与检测命令,以及yolo-darknet的入口函数应用。

1.yolo训练数据准备

darknet训练数据比较繁琐,数据准备参考 [yolo训练数据制作](http://blog.youkuaiyun.com/burning_keyboard/article/details/71055557)

2.网络准备

1.修改 cfg/voc.data:
  classes= 10                                     //类别数量
  train  = ../your_save_path/trainImagePath.txt   //相对路径设置为
  validate = ../zifu1/validateImagePath.txt
  names = data/voc.names                          // voc.names 类别的名称,这个文件去改一下
  backup = backup                                 // 记录每迭代100次得到的模型 .weights文件

 2.修改网络结构 cfg/yolo-voc.cfg:
 (1)最后一个卷积层
     [convolutional]
     size=1
     stride=1
     pad=1
     filters=125 // 125 = 5(anchor box) * (20(class) + 4(coor) + 1(confidence))
     ...         // 根据class数算好filters个数
 (2)[region]
      anchors = 1.08,1.19,  3.42,4.41,  6.63,11.38,  9.42,5.11,  16.62,10.52
      bias_match=1
      classes=10       // 改成目标分类数量
      coords=4
      num=5            // anchor box 数量
      ...
 (3)预训练文件cfg/darknet19_448.conv.23:在其他数据集上pretrain的模型做为初值

3.训练命令

 cd darknet
 ./darknet detector train cfg/voc.data cfg/yolo-voc.cfg cfg/darknet19_448.conv.23
 每train一个batch会用validate检测数据检测一次,显示迭代次数,学习率,recall值,已训练图片数等,
 每100次会在backup里存一次 weights

4.检测命令

 ./darknet detector test cfg/voc.data cfg/yolo-voc.cfg backup/yolo-voc_400.weights testImage/738780.jpg

5.yolo-darknet主函数入口

 1.所有脚本在src文件夹。主函数入口在darknet.c中。其中有run_yolo和run_detector都能用于训练检测。

 2.进入detector.c文件可以找到解析训练和检测命令的函数:
    void run_detector(int argc, char **argv)//dark.c中如果命令如果第二个参数是detector,则调用这个
{
    //寻找是否有参数prefix
    char *prefix = find_char_arg(argc, argv, "-prefix", 0);//prefix默认参数是0,argv为二维数组,存储了参数字符串
    //寻找是否有参数thresh参数,thresh为输出的阈值
    float thresh = find_float_arg(argc, argv, "-thresh", .24);//0.24,thresh默认参数为0.24
    //寻找是否有参数hier_thresh,默认为0.5
    float hier_thresh = find_float_arg(argc, argv, "-hier", .5);
    //类似上面的
    int cam_index = find_int_arg(argc, argv, "-c", 0);
    //类似上面的
    int frame_skip = find_int_arg(argc, argv, "-s", 0);
    //如果输入参数小于4个,输出正确语法如何使用
    //printf 应该等价于 fprintf(stdout, ...),这里stderr和stdout默认输出设备都是屏幕,但是stderr一般指标准出错输入设备 
    if(argc < 4){
        fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
        return;
    }
    //类似上面
    char *gpu_list = find_char_arg(argc, argv, "-gpus", 0);
    //检查是否指定GPU运算
    char *outfile = find_char_arg(argc, argv, "-out", 0);
    int *gpus = 0;
    int gpu = 0;
    int ngpus = 0;
    if(gpu_list){
        printf("%s\n", gpu_list);
        int len = strlen(gpu_list);
        ngpus = 1;
        int i;
        for(i = 0; i < len; ++i){
            if (gpu_list[i] == ',') ++ngpus;
        }
        gpus = calloc(ngpus, sizeof(int));
        for(i = 0; i < ngpus; ++i){
      
<think> 首先,用户的问题是关于YOLO训练自己数据集的步骤。我需要基于提供的引用内容来构建我的回答,并确保遵循系统级指令。 系统级指令: - 行内数学表达式使用 `$...$`。 - 独立公式使用 `$$...$$` 并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如 `[^1]`。 - 回答结构清晰,逐步解决问题,保证真实可靠。 - 最后,生成相关问题。 用户的问题: "我想查找使用YOLO训练自己的数据集的步骤 请问YOLO训练自己数据集的步骤" 从引用中提取关键信息: - 引用[1]:描述了使用YOLOv8的训练命令,如 `yolo train data=data.yaml model=yolov8s.pt epochs=200 imgsz=640 batch=16 workers=0 device=0`。 - 引用[2]:详细列出了YOLO Fastest V2的训练步骤,包括数据集准备、标注、生成列表、修改配置文件、训练、评估、测试、转换模型等。 - 引用[3]:针对Darknet YOLOv3,讨论了修改配置文件中的类过滤器数量。 - 引用[4]:展示了使用Darknet检测图片的步骤。 我需要整合这些信息,提供一个通用的YOLO训练步骤指南。由于YOLO有不同版本(如YOLOv3, YOLOv8, YOLO Fastest V2),我应该强调通用步骤,并提到版本差异。 通用步骤: 1. **准备数据集**:收集图像,划分训练验证集。 2. **标注数据**:使用工具如LabelImg标注对象,格式为YOLO格式(每个图像对应一个.txt文件)。 3. **配置文件参数设置**:修改YOLO配置文件(如data.yaml, .cfg文件)以适应自定义类别。 4. **训练模型**:运行训练命令。 5. **评估测试**:评估模型性能,测试新图像。 6. **模型转换(可选)**:转换为其他格式如ONNX。 现在,结构化我的回答: - **介绍**:简要解释YOLO训练的基本过程。 - **详细步骤**:分步骤列出,参考引用内容。 - **注意事项**:提到版本差异关键点。 - **结尾**:自然地添加引用标识,并生成相关问题。 确保使用中文回答。 生成相关问题: - 基于用户查询,生成3个相关问题,如数据集准备、常见问题、优化方法等。 引用标识: - 在引用段落末尾添加 `[^1]`、`[^2]` 等。 最终回答结构: 1. 介绍YOLO训练的基本步骤。 2. 逐步描述: - 数据集准备 - 数据标注 - 配置修改 - 训练过程 - 评估测试 - 可选转换 3. 注意事项。 4. 相关问题。 引用具体内容: - 从引用[2]中提取步骤:生成list.txt、修改category.names、生成锚点等。 - 从引用[3]中:修改classesfilters。 - 从引用[1]中:训练命令。 - 从引用[4]中:测试命令。 整合: - 步骤1:数据集收集标注。 - 步骤2:准备配置文件(如data.yaml或voc.data)。 - 步骤3:调整模型参数(如类别数)。 - 步骤4:训练模型。 - 步骤5:评估测试。 - 步骤6:模型转换(可选)。 在回答中,引用时添加标识,例如:对于标注步骤,参考引用[2],添加 `[^2]`。 </think> ### YOLO训练自己数据集的步骤 使用YOLO(You Only Look Once)训练自己的数据集涉及多个步骤,包括数据准备、标注、配置调整、训练评估。不同YOLO版本(如YOLOv3、YOLOv8或YOLO Fastest V2)细节略有差异,但核心流程相似。以下是通用步骤,基于最佳实践引用内容整理而成: #### 1. **数据集准备** - **收集图像**:获取与目标检测任务相关的图像,建议至少数百张以提高泛化性。 - **划分数据集**:将图像分为训练集(train)验证集(val),比例通常为70%-80%训练、20%-30%验证。例如,创建`train``val`文件夹存放对应图像[^2]。 - **数据增强**:可选步骤,通过旋转、缩放等操作增加数据多样性。 #### 2. **数据标注** - **标注工具**:使用工具如LabelImg标注图像,格式为YOLO标准格式(每个图像对应一个.txt文件,包含对象中心坐标、宽度、高度类别ID)。 - **生成文件列表**:运行脚本(如`jpg2listtxt.bat`)为训练验证集生成文件列表(如`train/list.txt`),列出所有图像路径[^2]。 #### 3. **配置文件参数调整** - **类别文件**:创建或修改`category.names`文件(或类似),每行一个类别名称[^2]。 - **锚点生成**:运行锚点生成脚本(如`python genanchors.py --traintxt train/list.txt`)计算自定义数据集的锚点值[^2]。 - **修改配置文件**: - 调整YOLO模型配置文件(如`yolov3.cfg`或`data.yaml`): - 修改`classes`参数为您的类别数量(例如`classes = 2`)。 - 计算并修改`filters`参数,公式为:$filters = (classes + 5) \times 3$。例如,2个类别时$filters = 21$[^3]。 - 更新数据路径、锚点值等。 - **数据配置文件**:设置`data.yaml`(YOLOv8)或`voc.data`(Darknet),指定训练/验证路径、类别数等[^1][^4]。 #### 4. **训练模型** - **训练命令**: - **YOLOv8示例**:运行终端命令,指定模型、数据、迭代次数等: ```bash yolo train data=data.yaml model=yolov8s.pt epochs=200 imgsz=640 batch=16 workers=0 device=0 ``` 其中`data.yaml`包含数据集配置,`epochs`控制迭代次数[^1]。 - **Darknet YOLOv3示例**: ```bash ./darknet detector train cfg/voc.data cfg/yolov3.cfg weights/yolov3.weights ``` 使用预训练权重加速收敛[^4]。 - **YOLO Fastest V2示例**: ```bash python train.py --data ./training.data ``` 其中`training.data`为配置文件[^2]。 - **关键参数**: - `imgsz`:输入图像尺寸(如640)。 - `batch`:批次大小。 - `device`:指定GPU加速(如`device=0`)。 - **监控训练**:跟踪损失值(如损失函数$L = \lambda_{\text{coord}} \sum_{i} (x_i - \hat{x}_i)^2 + \cdots$)mAP(mean Average Precision)。 #### 5. **评估测试** - **评估模型**:运行评估脚本计算精度指标: ```bash python evaluation.py --data training.data --weights weights/coco.pth ``` 输出mAP等指标[^2]。 - **测试单张图像**:使用训练好的权重检测新图像: ```bash ./darknet detector test cfg/voc.data cfg/yolov3.cfg weights/yolov3.weights data/dog.jpg ``` 或YOLOv8命令[^4]。 - **分析结果**:检查预测边界框置信度,优化阈值。 #### 6. **模型转换(可选)** - **转换为ONNX**:运行转换脚本优化部署: ```bash python pytorch2onnx.py --data training.data --weights weights/xxx.pth --output onnx/model.onnx ``` - **模型优化**:使用`onnxsim`库裁剪冗余: ```bash python -m onnxsim onnx/model.onnx onnx/model-opt.onnx ``` 减小模型大小[^2]。 #### 注意事项 - **版本差异**:YOLOv8使用PyTorch实现,命令更简洁;Darknet版本需编译环境。 - **常见问题**: - 类别数不匹配会导致训练错误。 - 锚点值需匹配数据集对象大小。 - 训练时损失震荡可能需调整学习率或批次大小。 - **性能优化**:增加数据量、使用预训练权重或调整超参数(如学习率衰减)[^1][^3]。 通过以上步骤,您能高效训练自定义YOLO模型。实践中建议参考官方文档社区资源[^1][^2][^3][^4]。
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值