# haier_auto **Repository Path**: ZhangGongPro/haier_auto ## Basic Information - **Project Name**: haier_auto - **Description**: 海尔项目基于docker的自动化训练脚本 - **Primary Language**: Python - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-06-25 - **Last Updated**: 2024-07-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 自动化训练工具使用说明 本工具旨在快速进行模型迭代,提供相应的检测功能。我们以海尔部分logo数据集为例子,带大家轻松上手本工具。整个流程包含如下步骤: - [自动化训练工具使用说明](#自动化训练工具使用说明) - [docker环境安装](#docker环境安装) - [数据集准备](#数据集准备) - [配置准备  ](#配置准备) - [超参搜索](#超参搜索) - [模型训练](#模型训练) - [模型打包](#模型打包) - [引擎测试](#引擎测试) ## docker环境安装 1. 首先需要进行docker镜像的环境安装,在/docker目录下进行docker镜像编译 ```shell docker build -t haier_auto:v1 . ``` ![编译成功示例图](_static/image/1.png) 2. 运行容器 `docker run -itd --shm-size="16g" -p 8088:8088 --gpus all haier_auto:v1 /bin/bash` 也可以将准备好的数据集文件夹挂载到docker里面 `docker run -itd --shm-size="16g" -v data:/mnt/data -p 8088:8088 --gpus all haier_auto:v1 /bin/bash` 3. 查看docker镜像的CONTAINER ID,进入docker镜像环境 ```shell docker ps docker exec -it CONTAINER_ID /bin/bash ``` > 温馨提示: 由于docker容器需要gpu支持,所有必须确保显卡驱动可用进入容器后使用下`nvidia-smi`命令出现 > ![显卡驱动正常示例图像](_static/image/2.png) > ## 数据集准备 1. 将标注好的数据按照以下文件夹格式分好类,组织好格式 ![文件夹分类示例图](_static/image/1720603828471.jpg) > - images 这个文件夹是放置图像的 > - json这个文件夹是放置标注文件、为.json结尾的文件 > - annotation包含数据类别文件(与标注数据一一对应)和生成训练时使用的数据文件夹 2. 将固定格式的文件夹路径连接到工作目录的data目录下 ![文件夹示例图像](_static/image/3.png) 3. 进入到/mmlab_encrypt目录,运行`sh run_data_process.sh $1 $2`划分训练集比例 > - $1:为数据集的根目录:例如/mmlab_encrypt/data > - $2:表示数据划分的比例,如0.8表示百分之八十为训练集,百分之二十为测试集 ![文件夹示例图像](_static/image/4.png) ## 配置准备     在训练之前我们需要修改一些默认训练参数来让大家愉快的跑起来,核心需要修改的参数如下 - data_root:数据根目录:/mmlab_encrypt/data/ - max_epochs:训练次数 :10 - train_num_workers:训练的进程数 - val_batch_size_per_gpu:验证集合 - img_scale:输出图像尺寸大小 - [hyperparameters]:训练超参使用train_nni.sh得到的数据 具体操作在mmlab_encrypt/configs 文件下如: ```python [data_path_ini] data_root = data/logo/trian/ #数据根目录 [trian_config_ini] max_epochs = 20 #训练迭代次数 train_num_workers = 4 #线程数 train_batch_size_per_gpu = 64 #训练batch_size val_batch_size_per_gpu = 64 #验证batch_size img_scale = 640 #网络输入尺寸 [hyperparameters] base_lr = 0.01 lr_factor = 0.001 affine_scale = 0.7 max_rotate_degree = 30 max_shear_degree = 15 prob = 0.6 ``` ## 超参搜索 在修改好配置文件后,对训练使用的超参进行搜索,在代码根目录/mmlab_encrypt下运行`sh train_nni.sh $1 $2` > $1:端口(默认8080) > $2:最大实验次数默认20次 > $3: 保存的文件夹路径(文件夹必须存在) 运行成功后会出现ip:端口,表示运行成功如下图所示 ![运行成功示例图](_static/image/1720665844263.jpg) 在浏览器中输入:`ip` :`端口`,查看超参搜索进度(时间根据数据集大小和训练epoch不同而不同)点击Overview查看最佳超参结果,同时运行完成后超参也会保存为json文件到data目录下。生成完超参后需要将配置文件中的超参替换成最新超参 > 温馨提示: 在超参搜索下epoch尽量设置小,减小超参搜索时间 ![](_static/image/6.png) ## 模型训练 在完成超参搜索的步骤后,返回/mmlab_encrypt目录,运行训练脚本`sh train.sh`进行模型训练,训练结束后会在工作目录生成最优模型权重文件,同时查看检测指标是否符合当前任务的zh ![训练示意图](_static/image/5.png) ## 模型打包 训练好的权重文件需要进行模型打包,提供引擎支持 1. 在打包前需要修改config文件下的engine_model.json配置文件 > > - 确认input[shape]字段是否是网络输入的尺寸: [1,3,640,640] > - 修改output[shape]字段是否对应网络输出[1,8400,7],其中7表示4+类别数,8400代表的是(8,16,32)下采样的像素和 > - 修改 class_name 字段:类别名字,对应的是annotations/class_with_id.txt中的类别名字 > - 修改class_num 字段:类别数目 1. 转换onnx 运行脚本`sh export_model.sh $1 $2`转换成irf文件 >- $1 为权重的路径 >- $2 为生成权重的路径 注:新生成的权重路径必须是irf结尾 ## 引擎测试 1. 从docker环境中通过`docker cp CONTAINER_ID:$1 $2`复制haier_engine_res_v2_1_640x640_auto.irf文件到本地haier_engine/icv_share_engine/resource/model目录下,其中 >- $1:文件在docker中的路径 >- $2:主机中的目标路径 2. 修改haier_engine/icv_share_engine目录下pic_lst.txt中的图片路径 3. 修改bin目录下的权重文件的路径,修改成对应自己的文件路径,运行`sh run_icv_engine_test.sh`,运行成功后,会在上级目录生成test_result文件夹,其中有检测好的展示图片和json文件如下图: ![](_static/image/1720667704794.png) ```json { "engine_info": "INDCV", "outputs": { "object": [ { "bndbox": { "xmax": 1312.0889892578125, "xmin": 793.8333740234375, "ymax": 1054.9290771484375, "ymin": 898.8114013671875 }, "name": "haier", "name_id": 1, "score": 0.97253191471099854 } ] } } ``` > > - bndbox为坐标康 格式为(xmax,xmin,ymax,ymin) > - name name_id为检测的类别和类别id > > 这样我们就完成了将训练完成的模型进行转换部署并且检查推理结果的工作。至此本教程结束。