模糊图像变高清:TPU-MLIR引领EDSR向MDSR的智能转换!

2023-12-11

EDSR模型,全称为enhanced deep super-resolution network。该模型可以对指定图片进行超分辨率操作,提高清晰度。
而MDSR是多尺度的超分模型,可以一次输出不同scale的图片,相比EDSR,可以在相同的性能下,减少很多的参数。
EDSR模型结构如下>
模糊图像变高清:TPU-MLIR引领EDSR向MDSR的智能转换! (https://ic.work/) AI 人工智能 第1张
MDSR模型结构如下>
模糊图像变高清:TPU-MLIR引领EDSR向MDSR的智能转换! (https://ic.work/) AI 人工智能 第2张
本期内容将会带领大家学习如何利用TPU-MLIR实现EDSR模型到MDSR模型的转换。
基本流程为将原项目与模型下载后导出为onnx模型。再利用TPU-MLIR工具将onnx模型转换为bmodel模型。
目录结构安排如下,其中dataset文件夹中是量化所用的DIV2K数据集,image文件夹下是测试图片,model文件夹中是待转换的onnx模型。
.
├──dataset
│├──x2
│├──x3
│└──x4
├──image
└──model
├──EDSR_x2.onnx
├──EDSR_x3.onnx
├──EDSR_x4.onnx
├──MDSR_x2.onnx
├──MDSR_x3.onnx
└──MDSR_x4.onnx

以下命令均在TPU-MLIR的docker环境内进行。
进入EDSR-transform目录,设置参数,scale=4
size=100
echoscale=${scale}size=${size}
mkdirworkspace_x${scale}&&cdworkspace_x${scale}

#算子转换、图优化
model_transform.py
--model_nameEDSR_x${scale}
--model_def../model/EDSR_x${scale}.onnx
--input_shapes[[1,3,${size}
${size}]]
--keep_aspect_ratio
--pixel_formatrgb
--test_input../image/0901x${scale}.png
--test_resultEDSR_x${scale}_outputs.npz
--mlirEDSR_x${scale}.mlir

#建立校准表
run_calibration.pyEDSR_x${scale}.mlir
--dataset../dataset/X${scale}
--input_num50
-oEDSR_x${scale}_cali_table

#多层优化和转换bmodel
##转换INT8模型
model_deploy.py
--mlirEDSR_x${scale}.mlir
--quantizeINT8
--calibration_tableEDSR_x${scale}_cali_table
--chipbm1684x
--test_inputEDSR_x${scale}_in_f32.npz
--test_referenceEDSR_x${scale}_outputs.npz
--tolerance0.85,0.45
--modelEDSR_x${scale}_1684x_int8_sym.bmodel

##转换FP16模型
model_deploy.py
--mlirEDSR_x${scale}.mlir
--quantizeF16
--chipbm1684x
--test_inputEDSR_x${scale}_in_f32.npz
--test_referenceEDSR_x${scale}_top_outputs.npz
--modelEDSR_x${scale}_1684x_f32_sym.bmodel

##转换FP32模型
model_deploy.py
--mlirEDSR_x${scale}.mlir
--quantizeF32
--chipbm1684x
--test_inputEDSR_x${scale}_in_f32.npz
--test_referenceEDSR_x${scale}_top_outputs.npz
--modelEDSR_x${scale}_1684x_f32_sym.bmodel

#将以上所有EDSR改为MDSR即可转换MDSR模型

####predictonbm1684x
formodelin{EDSR,MDSR};do
forscalein{2,3,4};do
echo-------------------------------------dataset=Set14-------------scale=${scale}-------------------------------------
cmd="pythonrun_opencv_crop.py--input../../benchmark/Set14/LR_bicubic/X${scale}
--outputresults/${model}_Set14_x${scale}_int8
--bmodel../models/BM1684X/${model}_x${scale}/${model}_x${scale}_1684x_int8_sym.bmodel"
echo">>>Running:${cmd}"
$cmd
done
done

####安装评估模型
pipinstalllpips

评估主要代码如下,...
fori,srinenumerate:
hr=Path/[0]+sr.suffix)
ifnothr.exists:
logging.error
hr_list.append
continue
hr_list.append

sr_img=Image.open.convert
hr_img=Image.open.convert
ifhr_img.size!=sr_img.size:
logging.info
#hr_img=hr_img.resize
hr_img=hr_img.crop)
sr_img=np.array
hr_img=np.array

lpi=calculate_lpips

sr_img_y=rgb2ycbcr
hr_img_y=rgb2ycbcr
#sr_img_y=sr_img
#hr_img_y=hr_img
psnr=calculate_psnr
ssim=calculate_ssim
...

####evaluateonbm1684x
scale=
formodelin{EDSR,MDSR};do
foriin"${!scale[@]}";do
echo-------------scale=${scale[$i]}-----------------
cmd="pythoneval.py--hr_path../../benchmark/Set14/HR--sr_pathresults/${model}_Set14_x${scale[$i]}_int8--scale${scale[$i]}"
echo">>>Running:${cmd}"
$cmd
done
done

pythonrun_opencv_crop.py--input../image
--outputresults/image
--bmodel../models/BM1684X/EDSR_x2_1684x_int8_sym.bmodel

评价代码如下,pythoneval.py--sr_pathresults/image--hr_path../image--scale{sacle}

测试数据集采用Set14数据集,指标采用与原论文一致的PSNR+SSIM指标来衡量图像质量。因为我们在模型固定输入大小的情况下,对原图进行裁切,超分,拼合的形式达到动态输入的效果,所以有的精度指标在测试中不仅不会降低反而会升高。同时又由于不同放大倍数的模型输入大小和模型参数不一样,推理时间的比例也会发生变化。
模糊图像变高清:TPU-MLIR引领EDSR向MDSR的智能转换! (https://ic.work/) AI 人工智能 第3张
fp32,模糊图像变高清:TPU-MLIR引领EDSR向MDSR的智能转换! (https://ic.work/) AI 人工智能 第4张
fp16,模糊图像变高清:TPU-MLIR引领EDSR向MDSR的智能转换! (https://ic.work/) AI 人工智能 第5张
int8,模糊图像变高清:TPU-MLIR引领EDSR向MDSR的智能转换! (https://ic.work/) AI 人工智能 第6张
precise,模糊图像变高清:TPU-MLIR引领EDSR向MDSR的智能转换! (https://ic.work/) AI 人工智能 第7张
precise,本次转换了EDSR和MDSR超分辨率模型,分别实现了fp32, fp16, int8多种精度模型转换, TPU-MLIR对这两个模型支持较好,转换过程中比较顺利。从最终评估结果上看,这两个超分模型对推理的数值精度不敏感,经过量化后,相关指标损失较少,甚至有些指标还会提升。另外,在BM1684X的平台上,INT8推理时间最短,故在部署时,推荐使用量化后的INT8模型部署。

文章推荐

相关推荐