Bootstrap

从零开始使用YOLO和Paddle——Paddle模型训练

目录

一、PaddleDetection库克隆安装与修改

二、Paddle模型训练数据构建

三、Paddle模型训练

        1.参数配置

        2.命令行指令训练

        3.模型参数保存

        4.模型的使用——预测


一、PaddleDetection库克隆安装与修改

        克隆使用 paddledetection 源码库前需安装好相应包环境,具体可以参考之前博文中关于“Paddle模型所需包安装”部分https://blog.csdn.net/qq_58718853/article/details/137856367

        访问以下地址将源码包下载并解压。

        Github地址:https://github.com/PaddlePaddle/PaddleDetection.git

        Gitee地址:https://gitee.com/paddlepaddle/PaddleDetection        

        下载好的源码库有几处源码需要修改添加,具体参考之前博文“paddle模型部署”部分的代码。https://blog.csdn.net/qq_58718853/article/details/137856367

二、Paddle模型训练数据构建

        Paddle支持VOC和COCO数据集格式的训练数据集,具体转换方式及代码参考博文:《从零开始使用YOLO和Paddle——目标检测模型数据预处理:从json到txt、voc和coco数据格式》https://blog.csdn.net/qq_58718853/article/details/137225306

        下面给出生成COCO数据集的代码,运行结果是生成 annotations.json 文件到指定的文件夹——包含框信息、文件名信息、类别信息。

import json
import os
import cv2

# coco保存地址
savefiles = 'cocofile'
# jpg文件保存地址
jpgfiles = 'jpgfile'
# json文件保存地址
jsonfiles = 'jsonfile'

## coco数据集构建(.json)
# 根据数据集生产相应annotation文件.json格式
def create_anno(jpgfiles, jsonfiles, savefiles):
    jpgfile = os.path.join(jpgfiles)
    images = []
    annotation = []
    j = 0          # 框id计数
    for i, jpg in enumerate(os.listdir(jpgfile)):
        basename = jpg.split('.')[0]
        # 获取图片信息:图片名;高宽;id
        jpgdir = os.path.join(jpgfile, jpg)
        image = cv2.imread(jpgdir)
        h, w, _ = image.shape  # 图片大小
        jpg_dict = {"file_name": str(jpg),
                    "height": h,
                    "width": w,
                    "id": i}
        images.append(jpg_dict)

        # 获取边缘框信息:area; bbox;类别;图片id;框id
        jsondir = os.path.join(jsonfiles, basename+'.json')
        with open(jsondir, 'r') as f:
            box_list = json.load(f)
        for box in box_list:
            # 框定义为左上坐标(x,y)和框的宽高
            x,y,w,h = box["box"][0], box["box"][1], box["box"][2]-box["box"][0], box["box"][3]-box["box"][1]
            area = w*h
            box_dict ={"area": area,  "iscrowd": 0,
                       "bbox": list((x,y,w,h)),
                       "category_id": 1,
                       "ignore": 0,
                       "image_id": i,
                       "id": j  }
            j += 1    # 框id计数
            annotation.append(box_dict)
            print(basename+' success')
    # 类别信息字典
    categories = [{"supercategory": "none", "id": 1, "name": "ZW"}]
    result = {"images":images, "annotations":annotation, "categories":categories}
    save = os.path.join(savefiles,'annotations.json')
    with open(save, 'w') as f:
        json.dump(result, f)
        print('save success')

if __name__ == '__main__':
    # 保存coco格式的annotations
    create_anno(jpgfiles, jsonfiles, savefiles)

三、Paddle模型训练

        1.参数配置

        开始训练模型前需要对训练配置文件 .yml 的内容进行修改。具体来说,本人使用的模型配置文件具体地址如下:

# 配置文件.yml 地址
\PaddleDetection\configs\picodet\legacy_model\application\layout_analysis\picodet_lcnet_x1_0_layout.yml

        打开配置文件后,需要修改的地方如下所示,根据实际环境和需求进行修改。

        修改预训练模型的地址和训练轮次:       

        可以根据下面地址下载预训练模型,然后在项目文件夹下新建一个 /pretrain/ 文件夹,将下载好的预训练模型放在该文件下,并修改红框内地址为当前存放预训练模型地址。

http:// https://paddledet.bj.bcebos.com/models/pretrained/LCNet_x1_0_pretrained.pdparams

        修改模型训练数据地址(训练自己数据的模型):

        将红色框内地址改为你图片数据集保存的文件夹地址。

        一种可能的自己训练数据集的修改完成状况:

        修改模型训练超参数——学习率:

        访问以下文件地址,打开关于学习率的超参数配置文件

# 学习率配置文件地址
/PaddleDetection/configs/picodet/legacy_model/_base_/optimizer_100e.yml

        2.命令行指令训练

        修改完成后相应的配置文件后,即可使用指令进行模型的训练了,具体代码如下。

        (如果有报错,将指令中的地址改为本地实际的绝对完整地址)

# 模型训练命令行指令
python -u tools/train.py -c /PaddleDetection/configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml -o pretrain_weights=./pretrain/LCNet_x1_0_pretrained.pdparams finetune_exclude_pretrained_params=['cls_score','bbox_pred'] --eval

        3.模型参数保存

        训练完成后,会自动创建一个 output 文件夹保存训练过程的所有模型参数,以及最好的模型参数。(如果你想在此基础上继续训练,只需将此处的参数复制到 /pretrain/ 文件夹下,并修改之前的预训练模型地址)

        4.模型的使用——预测

        模型的预测使用,检测模型的部署效果,也是使用命令行指令,具体参见博文部署paddle模型内容:从零开始使用YOLO和Paddle——模型CPU部署_paddle serving 部署cpu yolov8-CSDN博客

;