# 环境准备

## 第一步 准备mqbench

```shell
git clone https://github.com/ModelTC/MQBench.git
cd MQBench
git checkout mqb-torch1.10
创建软连接到vnne_dev_tools/3rdparty
ln -s mqbench vnne_dev_tools/3rdparty
```

## 第二步 准备torch环境

```shell
cd vnne_dev_tools
conda create -n vnne_tools python=3.9
conda activate vnne_tools
pip install -r requirement.txt
```

## 第三步 准备yolox训练代码

```shell
conda activate vnne_tools
cd vnne_dev_tools/3rdparty
git clone https://github.com//Megvii-BaseDetection/YOLOX.git
cd YOLOX
pip install -v -e .
```

# 模型训练

## 参考[模型训练文档](docs/training_readme.md)
## 参考[模型优化建议](docs/trainning_tech.md)

## 示例配置训练结果

|Model| Params |size |Mean AP<sup>0.5 |AP<sup>0.5<br>person | AP<sup>0.5<br>car | AP<sup>0.5<br>dog |training log| weights |
| ------ | ------       |:---: | :---:    | :---:       |:---:     |:---:  | :---: | :----: |
|[voc_3classes_float_185k](configs/sa6920_npu_3classes_voc_float_600e_185k_trainset_rgb.py) | 185k    |416  |53.85 |63.31      |56.98      |41.27 | [float_log](docs/training_sample_data/sa6920_npu_3classes_voc_float_600e_185k_train_log.txt) | [float_ckpt](docs/training_sample_data/sa6920_npu_3classes_voc_float_600e_185k_rgb_best_ckpt.pth) |
|[voc_3classes_185k_a8w4_fusebn_ranger](configs/sa6920_npu_3classes_voc_quant_a8w8_120e_185k_trainset_fusebn_ranger_simple_rgb.py) | 185k    |416  |56.21 |65.42      |58.75    |44.46 |[qat_log](docs/training_sample_data/sa6920_npu_3classes_voc_quant_a8w8_185k_fusebn_ranger_simple_rgb_train_log.txt)| [qat_ckpt](docs/training_sample_data/sa6920_npu_3classes_voc_quant_a8w8_185k_fusebn_ranger_simple_rgb_best_ckpt.pth) |


# 模型参数导出

## 导出模型参数，此处提供已训练好的权重进行比对

### 1. SA6920npu模型onnx+json文件导出.


        ```
        python scripts/model_exportor.py --config=configs.sa6920_npu_3classes_voc_quant_a8w8_120e_185k_trainset_fusebn_ranger_simple_rgb \
                        --ckpt=docs/training_sample_data/sa6920_npu_3classes_voc_quant_a8w8_185k_fusebn_ranger_simple_rgb_best_ckpt.pth \
                        --hardware=SA6920NPU \
                        --save_path=./debug_6920_onnx_json_sym_rgb \
                        --input_shape=1,3,416,416
        # 参数含义:
        # config: 模型配置文件，定义模型结构、量化参数、后处理等
        # ckpt：模型权重文件
        # hardware：硬件平台，指模型需要部署的硬件平台，支持[SA6920vnne, SA6921vnne, SA6921npu]中选择，需注意
        #         SA6920vnne平台支持最高激活值8bit，权重6bit量化
        #         SA6921vnne平台支持最高激活值8bit，权重4bit量化
        #         SA6920npu平台支持最高激活值8bit，权重8bit量化
        # save_path：导出模型保存路径
        # input_shape：模型导出输入分辨率，格式为“1,c,h,w”
        ```


执行模型导出脚本会在看到以下三个文件（可按照链接文件进行比对）：

[debug_6920_onnx_json_sym_rgb.onnx](docs/training_sample_data/debug_6920_onnx_json_sym_rgb.onnx)：包含量化节点的onnx模型

[debug_6920_onnx_json_sym_rgb_deploy_model.onnx](docs/training_sample_data/debug_6920_onnx_json_sym_rgb_deploy_model.onnx)： 去除量化节点的onnx模型

[debug_6920_onnx_json_sym_rgb_clip_ranges.json](docs/training_sample_data/debug_6920_onnx_json_sym_rgb_clip_ranges.json)：量化参数dump得到的json文件

### 2. onnx+json模型转hir模型

（1）修改“qat_compile_sample/config.json”中quant_param_file的路径与dataset_config的配置

（2）修改“qat_compile_sample/run.sh”中model_path的路径

（3）运行“sh qat_compile_sample/run.sh” 需注意确保先export工具链地址（如：export QUANTIZETOOL_PATH="/**/HeronRT_v0.10.2_2025.02.20/tool/quantizeTool/）
        

