OpenVINO 2021r1 超分辨率重建 INT8量化 - Waifu2x
接下來試試超分的INT8量化, 還是拿waifu2x模型來試驗
?
首先毫無意外的掉進坑里了... ...
本來系統里已經裝好了OpenVINO 2021r2, 想直接從這個版本開始,先安裝accuracy_checker和pot的最新版本
到openvino_2021\deployment_tools\open_model_zoo\tools\accuracy_checker目錄下運行
python setup.py install
安裝成功,
再到openvino_2021\deployment_tools\tools\post_training_optimization_toolkit的目錄下運行相同的安裝命令,結果安裝失敗了,報有個ideep4py的庫找不到,看了下openvino_2021\deployment_tools\tools\post_training_optimization_toolkit\setup.py, 看到這么一段
INSTALL_REQUIRES = ['scipy==1.2.1',
? ? ? ? ? ? ? ? ? ? 'jstyleson==0.0.2',
? ? ? ? ? ? ? ? ? ? 'numpy==1.16.3',
? ? ? ? ? ? ? ? ? ? 'pandas==0.24.2',
? ? ? ? ? ? ? ? ? ? 'hyperopt==0.1.2',
? ? ? ? ? ? ? ? ? ? 'addict==2.2.1',
? ? ? ? ? ? ? ? ? ? 'chainer==7.7.0',
? ? ? ? ? ? ? ? ? ? 'ideep4py==2.0.0.post3']
再上這個庫的源上看了一眼https://pypi.org/simple/ideep4py/,發現這貨根本就沒有windows包。難道要我再裝個linux版?
萬般無奈之際發現我的2020r3是好的,只好一個版本一個版本的回滾,發現OV2021r1的pot安裝是不依賴這個ideep4py的
出坑的方法就是: 目前做8bit量化要用OV2021r1,不用OV2021r2!!! 開源項目就這樣,等OV2021r3出來以后再看看這個bug有沒有解決吧
開始正式轉INT8模型
1. accuracy_checker
先搞定精度檢測,因為pot轉換的時候也需要這個工具來對比原始模型和轉換后的int8模型的推理精度。
主要的思路來源于這篇文章 OpenVINO 2020的INT8轉換工具POT的初體驗 因為OpenVINO在open model zoo里帶的超分模型single-image-super-resolution-1032是有int8模型的,所以可以參考openvino_2021\deployment_tools\open_model_zoo\tools\accuracy_checker\configs\single-image-super-resolution-1032.yml的寫法,自己編一個出來
先寫配置文件waifu_FP32_ac_ov2021.yml
models:
? - name: waifu2x
?
? ? launchers:
? ? ? - framework: dlsdk
? ? ? ? model: noise0_scale2x_model_FP32.xml
? ? ? ? weights: noise0_scale2x_model_FP32.bin
?
? ? ? ? adapter:
? ? ? ? ? type: super_resolution
? ? ? ? ? reverse_channels: True
?
? ? datasets:
? ? ? - name: super_resolution_x2
? ? ? ? data_source: dataset
? ? ? ? annotation_conversion:
? ? ? ? ? converter: super_resolution
? ? ? ? ? data_dir: dataset
? ? ? ? ? lr_suffix: lr_
? ? ? ? ? hr_suffix: hr_
? ? ? ? annotation: super_resolution_x2.pickle
?
? ? ? ? preprocessing:
? ? ? ? ? - type: auto_resize
?
? ? ? ? postprocessing:
? ? ? ? ? - type: resize
? ? ? ? ? ? apply_to: prediction
? ??
? ? ? ? metrics:
? ? ? ? ? - type: psnr
? ? ? ? ? ? scale_border: 4
? ? ? ? ? ? presenter: print_vector
? ? ? ? ? #- type: ssim
? ? ? ? ? # ?presenter: print_vector
這里各個數據段的含義就不解釋了,可以參考官方文檔 https://docs.openvinotoolkit.org/latest/omz_tools_accuracy_checker_accuracy_checker_adapters_README.html
接下來做個數據集
在放waifu_FP32_ac.yml的目錄下新建個目錄dataset 這個名字對應yml文件里的datasets段里面的定義
?
? ? datasets:
? ? ? - name: super_resolution_x2
#data_source填存放數據集的目錄
? ? ? ? data_source: dataset
? ? ? ? annotation_conversion:
? ? ? ? ? converter: super_resolution
#data_dir填存放數據集的目錄
? ? ? ? ? data_dir: dataset
#lr_suffix, hr_suffix放圖片的前綴,這里是告訴accuracy_checker, 低分辨率的圖片是按照lr_1.png, lr_2.png... 高分辨率圖片是按照hr_1.png hr_2.png... 來命名的
? ? ? ? ? lr_suffix: lr_
? ? ? ? ? hr_suffix: hr_
? ? ? ? annotation: super_resolution_x2.pickle
制作測試圖片集,我的waifu2x模型通過MO轉IR的時候定義了input_shape為[640x480], 所以轉換的低分辨率圖片分辨率為[640x480], 高分辨率圖片分辨率為2x,即[1280x960],因為沒有原始訓練的數據集,只是隨便測測,所以只隨便找了20張圖片轉換出了20組
?運行
accuracy_check -c waifu_FP32_ac_ov2021.yml -s ./ -td GPU
輸出
PSNR很差,有很多可能,也許是我的數據集不是原始訓練集,也可能是我做數據集的時候的縮放順序不對,或者HR圖像的分辨率不對,再或者是yml的某個字段填錯了。不過無所謂,至少說明accuracy checker能正常工作了 :)
?
2. POT
AC工作正常了,POT的json配置文件也可以照著相同的思路來一遍,這里我用了最簡單的默認量化算法
?
{
? ? /* Model parameters */
?
? ? "model": {
? ? ? ? "model_name": "noise0_scale2x_model_FP32", // Model name
? ? ? ? "model": "noise0_scale2x_model_FP32.xml", // Path to model (.xml format)
? ? ? ? "weights": "noise0_scale2x_model_FP32.bin" // Path to weights (.bin format)
? ? },
?
? ? /* Parameters of the engine used for model inference */
?
? ? "engine": {
? ? ? ? "config": "waifu_FP32_ac_ov2021.yml"
? ? },
?
? ? /* Optimization hyperparameters */
?
? ? "compression": {
? ? ? ? "target_device": "GPU", // Target device, the specificity of which will be taken
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // into account during optimization
? ? ? ? "algorithms": [
? ? ? ? ? ? {
? ? ? ? ? ? ? ? "name": "DefaultQuantization", // Optimization algorithm name
? ? ? ? ? ? ? ? "params": {
? ? ? ? ? ? ? ? ? ? "preset": "performance", // Preset [performance, mixed, accuracy] which control the quantization
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// mode (symmetric, mixed (weights symmetric and activations asymmetric)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// and fully asymmetric respectively)
?
? ? ? ? ? ? ? ? ? ? "stat_subset_size": 20 ?// Size of subset to calculate activations statistics that can be used
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// for quantization parameters calculation
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ]
? ? }
}
?運行命令
pot -c waifu_simplified_mode_ov2021.json
一通CPU風扇狂轉之后終于有了結果 (這里手工改了文件名,原來轉出來的文件和原模型文件名一樣)
用ac檢查一下INT8模型的精度
processed in 24.956 seconds
psnr@mean: 13.60Db
psnr@std: 2.99Db
PSNR有下降,不過PSNR并不能表示圖像畫質,還是要用人眼的主觀畫質評測來打分,這個是玄學 :P
3. Bicubic, FP16 SR, INT8 SR 2X畫質對比
祭出OpenVINO 2021r2 C++ 超分辨率重建 Waifu2x里面用到的SR轉換程序,改一下模型的名字,得到3種模式的輸出
原始圖片(測試圖片來自網絡)
Bicubic的2x放大效果
?Waifu2x 2X FP16 精度放大的效果
?Waifu2x 2X INT8 精度放大的效果?
和FP16的模型輸出做比對,第一眼沒有什么特別明顯的差別
?
4. 性能分析
最后看一下性能
前一篇文章, Waifu2X FP16的模型
調用inferRequest_regular.Infer()推理的時間, 在8665U 4核8線程的CPU和 Gen9 24EU的核顯上
CPU: 1341ms (0.746FPS)
GPU: 685ms (1.46FPS)
這次在相同的配置下, Waifu2X INT8模型
CPU: 957ms (1.04FPS)
GPU: 1228ms (0.81FPS)
?基本符合預期,CPU方面可以通過INT8模型來提升性能, GPU方面因為Gen9不支持INT8計算,所以加載的int8模型會轉換成FP32模型來計算,自然性能不如FP16的模型
?
再借來臺其他同學的老虎湖(Tiger Lake 1165G7)來試試Gen12 96EU的顯卡 :)
INT8模型 GPU: 154ms (6.49FPS)
FP16模型 GPU: 175.38ms (5.7FPS)
?
Gen12集顯的性能提升還是很明顯的,
Gen12 FP16 VS. Gen9 FP16模型
????5.7/1.46=3.9X
Gen12 INT8 VS. Gen12 FP16 模型
????6..49/5.7=1.14X
?
最后代碼奉上,僅供參考
https://gitee.com/tisandman/pot_waifu2x_ov2021
————————————————
版權聲明:本文為CSDN博主「sandmangu」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/sandmangu/article/details/114632220
總結
以上是生活随笔為你收集整理的OpenVINO 2021r1 超分辨率重建 INT8量化 - Waifu2x的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DTX-1800还需要校准吗?
- 下一篇: Linux下Linpack测试GPU和C