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 工具进行转量化压缩。
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"
--model xxxx.onnx 要量化的模型
--data_dir 由第一步生成的 校准数据集bin文件所在的文件夹.