模型介紹
EDSR模型,全稱為enhanced deep super-resolution network(增強(qiáng)的深度學(xué)習(xí)超分辨率重建網(wǎng)絡(luò))。該模型可以對(duì)指定圖片進(jìn)行超分辨率操作,提高清晰度。
而MDSR是多尺度的超分模型,可以一次輸出不同scale的圖片,相比EDSR,可以在相同的性能下,減少很多的參數(shù)。
EDSR模型結(jié)構(gòu)如下:
MDSR模型結(jié)構(gòu)如下:
本期內(nèi)容將會(huì)帶領(lǐng)大家學(xué)習(xí)如何利用TPU-MLIR實(shí)現(xiàn)EDSR模型到MDSR模型的轉(zhuǎn)換。
模型導(dǎo)出與轉(zhuǎn)換
基本流程為將原項(xiàng)目與模型下載后導(dǎo)出為onnx模型。再利用TPU-MLIR工具將onnx模型轉(zhuǎn)換為bmodel模型。
目錄結(jié)構(gòu)安排如下,其中dataset文件夾中是量化所用的DIV2K數(shù)據(jù)集,image文件夾下是測(cè)試圖片,model文件夾中是待轉(zhuǎn)換的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環(huán)境內(nèi)進(jìn)行。
進(jìn)入EDSR-transform目錄
設(shè)置參數(shù)
scale=4
size=100
echoscale=${scale}size=${size}
mkdirworkspace_x${scale}&&cdworkspace_x${scale}
- 模型轉(zhuǎn)換和量化
#算子轉(zhuǎn)換、圖優(yōu)化
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
#建立校準(zhǔn)表
run_calibration.pyEDSR_x${scale}.mlir\
--dataset../dataset/X${scale}\
--input_num50\
-oEDSR_x${scale}_cali_table
#多層優(yōu)化和轉(zhuǎn)換bmodel
##轉(zhuǎn)換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
##轉(zhuǎn)換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
##轉(zhuǎn)換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即可轉(zhuǎn)換MDSR模型
轉(zhuǎn)換結(jié)果評(píng)估
評(píng)估過(guò)程說(shuō)明
- 配置好BM1684X平臺(tái),上傳并解壓本項(xiàng)目EDSR-BM1684x.zip,同時(shí)下載benchmark數(shù)據(jù)集,確保benchmark與EDSR文件夾在同一目錄內(nèi)。進(jìn)入EDSR/python目錄下,運(yùn)行以下命令:
####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
- 推理結(jié)果保存在EDSR/python/results中,更改不同bmodel參數(shù)以使用不同bmodel
- 評(píng)估結(jié)果方法
####安裝評(píng)估模型
pipinstalllpips
評(píng)估主要代碼(eval.py)如下
...
fori,srinenumerate(sr_list):
hr=Path(args.hr_path)/(sr.stem.split('x')[0]+sr.suffix)
ifnothr.exists():
logging.error(f'{sr}:{hr}doesnotexist')
hr_list.append(None)
continue
hr_list.append(hr)
sr_img=Image.open(sr).convert('RGB')
hr_img=Image.open(hr).convert('RGB')
ifhr_img.size!=sr_img.size:
logging.info(f'croppinghr_imgfrom{hr_img.size}to{sr_img.size}')
#hr_img=hr_img.resize(sr_img.size,resample=Image.Resampling.BICUBIC)
hr_img=hr_img.crop((0,0,sr_img.size[0],sr_img.size[1]))
sr_img=np.array(sr_img)
hr_img=np.array(hr_img)
lpi=calculate_lpips(sr_img,hr_img,border=args.scale)
sr_img_y=rgb2ycbcr(sr_img,only_y=True)
hr_img_y=rgb2ycbcr(hr_img,only_y=True)
#sr_img_y=sr_img
#hr_img_y=hr_img
psnr=calculate_psnr(sr_img_y,hr_img_y,border=args.scale)
ssim=calculate_ssim(sr_img_y,hr_img_y,border=args.scale)
...
####evaluateonbm1684x
scale=(234)
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
- 評(píng)價(jià)結(jié)果保存在results/*/result.log里
- 若是想測(cè)試自己的圖片,請(qǐng)將圖片放入image目錄下然后運(yùn)行以下命令,結(jié)果保存在results/image里。更改bmodel模型來(lái)更換模型與超分倍率
pythonrun_opencv_crop.py--input../image\
--outputresults/image\
--bmodel../models/BM1684X/EDSR_x2_1684x_int8_sym.bmodel
評(píng)價(jià)代碼如下
pythoneval.py--sr_pathresults/image--hr_path../image--scale{sacle}
評(píng)估結(jié)果
精度測(cè)試方法
測(cè)試數(shù)據(jù)集采用Set14數(shù)據(jù)集,指標(biāo)采用與原論文一致的PSNR+SSIM指標(biāo)來(lái)衡量圖像質(zhì)量。因?yàn)槲覀冊(cè)谀P凸潭ㄝ斎氪笮〉那闆r下,對(duì)原圖進(jìn)行裁切,超分,拼合的形式達(dá)到動(dòng)態(tài)輸入的效果,所以有的精度指標(biāo)在測(cè)試中不僅不會(huì)降低反而會(huì)升高。同時(shí)又由于不同放大倍數(shù)的模型輸入大小和模型參數(shù)不一樣,推理時(shí)間的比例也會(huì)發(fā)生變化。
fp32結(jié)果
fp32
fp16結(jié)果
fp16
int8結(jié)果
int8
精度對(duì)比
precise
性能對(duì)比
precise
結(jié)論
本次轉(zhuǎn)換了EDSR和MDSR超分辨率模型,分別實(shí)現(xiàn)了fp32, fp16, int8多種精度模型轉(zhuǎn)換, TPU-MLIR對(duì)這兩個(gè)模型支持較好,轉(zhuǎn)換過(guò)程中比較順利。從最終評(píng)估結(jié)果上看,這兩個(gè)超分模型對(duì)推理的數(shù)值精度不敏感,經(jīng)過(guò)量化后,相關(guān)指標(biāo)損失較少,甚至有些指標(biāo)還會(huì)提升。另外,在BM1684X的平臺(tái)上,INT8推理時(shí)間最短,故在部署時(shí),推薦使用量化后的INT8模型部署。
-
模型
+關(guān)注
關(guān)注
1文章
3248瀏覽量
48860 -
TPU
+關(guān)注
關(guān)注
0文章
141瀏覽量
20735 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5503瀏覽量
121200
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論