QAT流程：

1.首先需要下载地平线对应版本的功能包，我这里的是XJ3的2.6.4版本：horizon_xj3_open_explorer_v2.6.4-py38_20240319,下载解压后放在根目录下:与qat_project同级

2.按照官方文档配置qat环境：
https://developer.d-robotics.cc/api/v1/fileData/horizon_xj3_open_explorer_cn_doc/oe_mapper/source/env_install/env_deploy.html#qat
配置yolov8环境，优先满足qat环境，再配置yolov8环境。

3.找到官方的fx_mode的QAT脚本：  路径：horizon_xj3_open_explorer_v2.6.4-py38_20240319\ddk\samples\ai_toolchain\horizon_model_train_sample\plugin_basic\fx_mode.py
模仿这个脚本，把其中的模型换为我们自己的，我们这里为替换了XJ3算子的YOLOv8n-seg，由于官方模型封装得太好，不方便我们自己模仿官方示例脚本进行QAT时插入伪量化节点，固将官方的各个算子类剥离，拿到这里来，路径为：qat_project\code_whut\yolov8_utils，自己手搭YOLOv8n-seg模型，我们自己的QAT脚本为：qat_project\code_whut\fx_mode_yolov8.py，将code_whut中所有内容移动至官方fx_mode.py同级文件夹下，即路径horizon_xj3_open_explorer_v2.6.4-py38_20240319\ddk\samples\ai_toolchain\horizon_model_train_sample\plugin_basic下。

4.准备训练数据集，数据集由五菱提供的数据集通过脚本转换为YOLO格式，构建好数据集之后，可将其移至yolov8_qat\qat_project\data，再更新qat_project\data2.yaml中的数据集路径

5.运行fx_mode_yolov8.py脚本，通过指定超参数来控制QAT的过程，分别是：'float','calib', 'qat', 'int_infer', 'compile'，下面对这几个步骤进行解释：
    float：对自己搭建的模型进行正常的浮点训练，得到float-checkpoint.ckpt,（现在的训练逻辑会得到best与last权重，选择best重命名为float-checkpoint.ckpt，方便stage=calib时读取）这个权重应该与官方框架下训练得到的权重对齐，评估精度应该相当；得到权重后，可用val_qat_simple.py、vis_qat_simple.py这两个脚本可视化与评估。（所有阶段模型权重会保存至qat_project\yolov8_multi_task）

    calib：现在已经得到了float-checkpoint.ckpt，在这个权重的基础上，进行calib校准时，会在训练好的浮点模型上插入伪量化节点，并且用训练   集所有图片对现有权重的每一个算子具体浮点数进行初步的校准，得到calib-checkpoint.ckpt，相当于一个PTQ的操作，如果经过这一步后模型精度下降在可接受范围，可直接转定点模型上板。

    qat：在得到float-checkpoint.ckpt后，如果经过校准觉得精度不达标，就应该进行QAT训练，得到qat-checkpoint.ckpt，可用val_qat_simple.py评估(脚本中有两个run（）主函数，一个用于浮点权重评估，一个用于qat权重评估)。

    int_infer：qat-checkpoint.ckpt权重评估和浮点精度差异不大后，可进行int_infer，相当于将qat中带着伪量化节点的模型进行量化后推理，可以模拟最后板端推理的精度，当stage = int_infer后，应该会输出和前面浮点、qat权重评估相同的精度指标，可能会有些许下降，只要在可接受的下降范围内，就能进行最后一步编译上板可执行文件。

    compile：当确认qat-checkpoint.ckpt没有问题后，可转定点模型，得到可上板执行文件model.hbm（J3上板前重命名为bin文件）,文件保存路径通过fx_mode_yolov8.py中的超参数：--save_path指定。

6.将生成的可执行文件拷贝至板端，用提前写好的部署脚本进行板端推理



