1 概述
量化根据是否进行重新训练分为两种量化方法
- 训练后量化 PTQ(Post-Traing Quantization)(本项目中应用此方法)
- 量化感知训练 (昇腾暂不支持)
2 训练后量化
知名见意 所谓训练后量化 指的就是模型训练结束之后进行的量化。具体手段 就是将float32 通过某种手段映射到 低比特的int8 在通过少量的校准数据在前向推理过程中进行校准
3 具体过程
- 生成用于校准的数据集(bin文件)
opencv 读取数据集后调整通道并存储为bin文件def preprocess(dir_path, save_path, batch_size, img_size): in_files = [] output_data = [] if not os.path.exists(save_path): os.makedirs(save_path) files= os.listdir(dir_path) for i, file in enumerate(files): file =os.path.join(dir_path,file) img0 = cv2.imread(file) resized = cv2.resize(img0, (640, 640), interpolation=cv2.INTER_LINEAR) input_data = cv2.cvtColor(resized, cv2.COLOR_BGR2RGB) input_data = np.transpose(input_data, (2, 0, 1)).astype(np.float32) input_data = np.expand_dims(input_data, axis=0) input_data /= 255.0 print("shape:", input_data.shape) if i % batch_size == 0: output_data = input_data else: output_data = np.concatenate((output_data, input_data), axis=0) if (i + 1) % batch_size == 0: output_data.tofile("{}/img_bs{}_n{}.bin".format(save_path, batch_size,i))
- 利用amtc 工具进行转量化压缩。
--model xxxx.onnx 要量化的模型amct_onnx calibration --model xxxx.onnx --save_path ./output/yolov5s --input_shape "images:1,3,640,640" --data_dir "xxx_bin__data" --data_types "float32"
--data_dir 由第一步生成的 校准数据集bin文件所在的文件夹.