【2023 CCF 大数据与计算智能大赛】基于TPU平台实现超分辨率重建模型部署 基于Real-ESRGAN的TPU超分模型部署
2023 CCF 大数据与计算智能大赛
《基于TPU平台实现超分辨率重建模型部署》
洋洋很棒
李鹏飞
算法工程师
中国-烟台
2155477673@qq.com
团队简介
本人从事工业、互联网场景传统图像算法及深度学习算法开发、部署工作。其中端侧算法开发及部署工作5年时间。
摘要
本文是《基于TPU平台实现超分辨率重建模型部署》方案中算法方案的说明。本作品算法模型选用的是Real-ESRGAN。Real-ESRGAN是基于ESRGAN(Enhanced Super-Resolution Generative Adversarial Networks)模型的改进版本。ESRGAN是一种生成对抗网络(GAN)架构,在图像超分辨率重建工作中取得了很好的效果。Real-ESRGAN在ESRGAN的基础上主要进行了两个方面的改进:一是引入了真实图像的训练集,二是优化了网络结构。
具体来说,Real-ESRGAN[1]的网络结构分为两个部分:生成器和判别器。生成器负责将低分辨率图像转换成高分辨率图像,判别器则用于评估生成器产生的图像与真实图像之间的相似度。通过对生成器和判别器进行交替训练,Real-ESRGAN可以不断优化生成器的性能,十七生成的高分辨率图像更加逼真。
Real-ESRGAN是在 ESRGAN的基础上使用纯合成数据来进行训练的,基本上就是通过模拟高分辨率图像变低分辩率过程中的各种退化,然后再通过低清图倒推出它的高清图。
本算法的模型部署方案包括模型转换和模型推理两个部分。其中模型转换使用了官方提供的tpu-mlir工具进行FP16和INT8模型转换和量化。模型部署使用的是算能提供的C++版本的 SophonSDK中的bmcv等加速库进行图像加载、数据前处理、模型推理、数据后处理等操作。
关键词
Real-ESRGAN,超分辨率,tpu-mlir,bmcv
1 超分算法原理
作为基本的low-level视觉问题,单图像超分辨率 (SISR) 越来越受到人们的关注。SISR的目标是从其低分辨率观测中重建高分辨率图像。目前已经提出了基于深度学习的方法的多种网络架构和超分网络的训练策略来改善 SISR的性能。顾名思义,SISR任务需要两张图片,一张高分辨率的 HR图和一张低分辨率的 LR图。超分模型的目的是根据后者生成前者,而退化模型的目的是根据前者生成后者。经典超分任务 SISR认为:低分辨率的LR图是由高分辨率的 HR图经过某种退化作用得到的,这种退化核预设为一个双三次下采样的模糊核 (downsampling blur kernel)。也就是说,这个下采样的模糊核是预先定义好的。但是,在实际应用中,这种退化作用十分复杂,不但表达式未知,而且难以简单建模。 双三次下采样的训练样本和真实图像之间存在一个域差。以双三次下采样为模糊核训练得到的网络在实际应用时,这种域差距将导致比较糟糕的性能。这种退化核未知的超分任务我们称之为盲超分任务 (Blind Super Resolution)。
令x和y分别代表HR和LR图片,退化模型为:

(1)
上式中, D(·)代表退化图片,ⓧ表示卷积操作,模型主要由三部分组成:模糊核k,下采样操作↓R和附加噪声n。[·]JPEG代表JPEG压缩,这种操作一般用于真实世界场景图片。盲图超分任务就是从LR图片恢复HR图片的过程。
2 模型部署方案
SophonSDK是算能科技基于其自主研发的 AI芯片所定制的深度学习 SDK,涵盖了神经网络推理阶段所需的模型优化、高效运行支持等能力,为深度学习应用开发和部署提供易用、高效的全栈式解决方案。
SophonSDK既兼容第三代BM1684芯片,也支持第四代BM1684X芯片。
2.1 模型转换
2.1.1 MLIR模型生成
首先将原始的Pytorch模型导出为onnx格式文件。然后使用官方提供的tpu-mlir工具链,对模型进行转换和量化。

图1模型转换命令
如图1所示,使用官方提供的脚本文件对导出的onnx模型进行转换。包括指定模型输出名字、模型输入名字、模型输入图像尺寸、图片类型、通道类型等参数。详细参数可以查询官方文档[2]。
2.1.2 生成量化校准表
转INT8模型前需要跑calibration, 得到校准表; 输入数据的数量根据情况准备100~1000张左右。然后用校准表, 生成对称或非对称bmodel。如果对称符合需求, 一般不建议用非对称, 因为 非对称的性能会略差于对称模型。

图2校准表生成命令
如图2所示,使用官方提供的脚本文件对转换后的mlir模型使用校准数据进行校准,生成对应的量化校准表。
2.1.3 编译为INT8量化模型
使用如下图所示的命令对模型进行INT8量化。

图3 INT8量化命令
编译完成后,会生成对应的量化模型文件。
2.2 模型部署
模型部署使用的是算能提供的C++版本的 SophonSDK中的bmcv等加速库进行图像加载、数据前处理、模型推理、数据后处理等操作[3]。
模型部署阶段参考官方的C++接口和python接口运行程序,使用的模型为量化后的INT8模型。查看统计前处理时间、推理时间、后处理时间。对应的batch size均为1。如下表所示:
| 测试平台 | 测试程序 | 前处理 | 推理 | 后处理 |
|---|---|---|---|---|
| BM1684X PCIe | Python | 16.49ms | 28.84ms | 95.35ms |
| BM1684X PCIe | C++ | 0.64ms | 26.33ms | 38.60ms |
表1 推理耗时对比
致谢
感谢DataFountain数联众创、算能提供的比赛平台给予从事AI行业的从业人员锻炼提升自己的机会。感谢大赛组委会的专业评判。感谢赛题交流群中各位老师的指导和帮助。
参考
[1] Wang X , Xie L , Dong C ,et al.Real-ESRGAN: Training Real-World Blind Super-Resolution with Pure Synthetic Data[J]. 2021.DOI:10.48550/arXiv.2107.10833.
[2] https://doc.sophgo.com/sdk-docs/v23.07.01/docs_latest_release/docs/SophonSDK_doc/zh/html/model_trans/3_mlir_fp32.html
[3] https://doc.sophgo.com/sdk-docs/v23.07.01/docs_latest_release/docs/bmcv/reference/html/bm_image/bm_image.html
相关文章:
【2023 CCF 大数据与计算智能大赛】基于TPU平台实现超分辨率重建模型部署 基于Real-ESRGAN的TPU超分模型部署
2023 CCF 大数据与计算智能大赛 《基于TPU平台实现超分辨率重建模型部署》 洋洋很棒 李鹏飞 算法工程师 中国-烟台 2155477673qq.com 团队简介 本人从事工业、互联网场景传统图像算法及深度学习算法开发、部署工作。其中端侧算法开发及部署工作5年时间。 摘要 本文是…...
Vue中的组件通信方式及应用场景
在Vue中,组件通信有以下几种方式: Props / $emit:父组件通过给子组件传递props属性,子组件通过$emit事件将数据传递给父组件。适用于父组件向子组件传递数据。 自定义事件:父组件通过$on监听子组件触发的事件…...
RA8900CE汽车用c总线接口实时时钟模块
汽车用c总线接口实时时钟模块内置调频32.768 kHz晶体单元和DTCXO,高稳定性和电源切换。 接口类型我 2C-Bus接口(400kHz)界面电压范围2.5V ~ 5.5V温度补偿电压范围2.0V至5.5V计时电压范围1.6V ~ 5.5V可选时钟输出(32.768 kHz, 1024 Hz, 1 Hz)各种功能齐全的日历、报…...
屏幕截图--Snagit
Snagit是一款优秀的屏幕、文本和视频捕获、编辑与转换软件。它不仅可以捕获静止的图像,还能获得动态的图像和声音。软件界面干净清爽,功能板块一目了然,为用户提供专业的屏幕录制方案。可以根据自己的需求调整录制视频的分辨率、帧数、输出格…...
PHP运行环境之宝塔Web站点部署
目录 Web站点部署流程(部署聚合支付后台) 项目文件 将上传的文件解压文件至根目录 修改站点关键信息 设置伪静态,选择:thinkphp,并保存 设置PHP,选择:70+版本即可。 安装网站 1设置运行目录...
使用高版本JDK编译低版本代码
背景 SonarQube运行于Java17,使用Sonar的Maven插件编译时,如果编译使用的JDK版本低于SonarQube使用的Java17,则会提示Java文件不匹配问题。 Error during SonarScanner execution java.lang.UnsupportedClassVersionError: org/sonar/batch/…...
Zuul相关问题及到案(2024)
1、什么是Zuul?它在微服务架构中有什么作用? Zuul是Netflix开源的一种提供API网关服务的应用程序,它在微服务架构中扮演着流量的前门角色。主要功能包括以下几点: 路由转发:Zuul网关将外部请求转发到具体的微服务实例…...
【CSS】讲一讲BFC、IFC、GFC、FFC
1. 前言 FC(Formatting Contexts),是CSS2.1的一个概念,是页面中的一块渲染区域,具有一套渲染规则,决定FC中子元素如何定位,以及和其他元素的关系和相互作用。在说FC之前说一下文档流。 1.1. 普…...
阶段十-分布式-任务调度
第一章 定时任务概述 在项目中开发定时任务应该一种比较常见的需求,在 Java 中开发定时任务主要有三种解决方案:一是使用JDK 自带的 Timer,二是使用 Spring Task,三是使用第三方组件 Quartz Timer 是 JDK 自带的定时任务工具,其…...
Godot4.2——爬虫小游戏简单制作
目录 一、项目 二、项目功能 怪物 人物 快捷键 分数 游戏说明 提示信息 三、学习视频 UI制作 游戏教程 四、总结 一、项目 视频演示:Godot4爬虫小游戏简单制作_哔哩哔哩bilibili 游戏教程:【小猫godot4入门教程 C#版 已完结】官方入门案例 第…...
对象的前世今生与和事佬(static)的故事
目录 1.对象村的秘密(对象在内存的实现) 1.1 内存的好兄弟“堆”与“栈” 1.1.1方法喜欢玩泰山压顶 1.1.2 stack的实现 1.2栈上的对象引用 1.2.1有关对象局部变量 1.2.2 如果局部变量生存在栈上,那么实例变量呢? 1.2.3创建…...
报错curl: (6) Could not resolve host: raw.githubusercontent...的解决办法
我起初想要在macOS系统安装pip包,首先在终端安装homebrew,敲了命令:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent...)" 之后触发的报错,报错内容:curl: (6) Could not resolve host: raw.…...
【基础篇】十二、引用计数法 可达性分析算法
文章目录 1、Garbage Collection2、方法区的回收3、堆对象回收4、引用计数法5、可达性分析算法6、查看GC Root对象 1、Garbage Collection C/C,无自动回收机制,对象不用时需要手动释放,否则积累导致内存泄漏: Java、C#、Python、…...
C语言算法(二分查找、文件读写)
二分查找 前提条件:数据有序,随机访问 #include <stdio.h>int binary_search(int arr[],int n,int key);int main(void) {}int search(int arr[],int left,int right,int key) {//边界条件if(left > right) return -1;//int mid (left righ…...
流媒体学习之路(WebRTC)——Pacer与GCC(5)
流媒体学习之路(WebRTC)——Pacer与GCC(5) —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标:可以让大家熟悉各类Qos能力、带宽估计能力,提供每个环节关键参数调节接口并实现一个json全…...
2023版本QT学习记录 -11- 多线程的使用(QT的方式)
———————多线程的使用(QT方式)——————— 🎄效果演示 两个线程都输出一些调试信息 🎄创建多线程的流程 🎄头文件 #include "qthread.h"🎄利用多态重写任务函数 class rlthread1 : public QThread {Q_OBJE…...
iOS苹果和Android安卓测试APP应用程序的差异
Hello大家好呀,我是咕噜铁蛋!我们经常需要关注移动应用程序的测试和优化,以提供更好的用户体验。在移动应用开发领域,iOS和Android是两个主要的操作系统平台。本文铁蛋讲给各位小伙伴们详细介绍在App测试中iOS和Android的差异&…...
每日算法打卡:数的三次方根 day 7
文章目录 原题链接题目描述输入格式输出格式数据范围输入样例:输出样例: 题目分析示例代码 原题链接 790. 数的三次方根 题目难度:简单 题目描述 给定一个浮点数 n,求它的三次方根。 输入格式 共一行,包含一个浮…...
人机交互主板定制_基于MT8735安卓核心板的自助查询机方案
人机交互主板是一种商显智能终端主板,广泛应用于广告机、工控一体机、教学一体机、智能自助终端、考勤机、智能零售终端、O2O智能设备、取号机、计算机视觉、医疗健康设备、机器人设备等领域。 人机交互主板采用联发科MTK8735芯片平台,四核Cortex-A53架构…...
全志F1C100s Linux 系统编译出错:不能连接 github
环境 Ubuntu 20.04 LTS 64 位虚拟机 开发板:Lichee Pi Nano 源代码:GitHub - florpor/licheepi-nano 问题描述 该源码库使用了 git 子模块的概念,一个库中包含了 u-boot、Linux等代码库。不需要分别编译,一个 make 全搞定 编译时提示错误: >>> linux-hea…...
如何通过BewlyBewly实现B站界面的个性化焕新体验?
如何通过BewlyBewly实现B站界面的个性化焕新体验? 【免费下载链接】BewlyBewly Improve your Bilibili homepage by redesigning it, adding more features, and personalizing it to match your preferences. 项目地址: https://gitcode.com/gh_mirrors/be/Bewly…...
告别手动编码烦恼:用CANopenEditor高效定制CANopenNode对象字典
告别手动编码烦恼:用CANopenEditor高效定制CANopenNode对象字典 【免费下载链接】CANopenNode CANopen protocol stack 项目地址: https://gitcode.com/gh_mirrors/ca/CANopenNode 你是否曾为CANopenNode项目中繁琐的对象字典配置而头疼?手动编写…...
Qwen3.5-4B-Claude-Opus垂直场景:工业IoT设备告警根因的多条件推演
Qwen3.5-4B-Claude-Opus垂直场景:工业IoT设备告警根因的多条件推演 1. 工业IoT告警分析的挑战与机遇 在现代工业物联网环境中,设备告警分析面临着前所未有的复杂性。一个典型的制造工厂可能同时运行着数千台联网设备,每天产生数以万计的告警…...
绿色低碳+高效交付:中集模块化数据中心用实力印证中国方案全球竞争力
随着人工智能与绿色转型成为全球经济增长核心引擎,高算力需求正推动数据中心建设向预制化、高效能方向加速演进。中集集团(000039.SZ/2039.HK)凭借工业化制造与全球交付优势,2025年在模块化数据中心(AIDC)领…...
Cadence原理图网表导入Allegro PCB的5个关键步骤与避坑指南(2024最新版)
Cadence原理图网表导入Allegro PCB的5个关键步骤与避坑指南(2024最新版) 在电子设计自动化(EDA)领域,Cadence和Allegro的协同工作流程是硬件工程师日常开发的核心环节。网表作为连接原理图设计与PCB布局的桥梁…...
手把手教你用J-Link Commander设置仿真器序列号(2023最新版)
2023年J-Link仿真器序列号配置全指南:从入门到精通 第一次拿到J-Link仿真器时,很多开发者都会遇到一个看似简单却容易踩坑的问题——如何正确设置设备序列号。作为嵌入式开发中不可或缺的调试工具,J-Link仿真器的序列号不仅是设备身份标识&am…...
WuliArt Qwen-Image Turbo新手必看:Web界面操作,一键保存高清图片
WuliArt Qwen-Image Turbo新手必看:Web界面操作,一键保存高清图片 1. 快速认识这个AI绘图神器 如果你正在寻找一个能在自己电脑上快速生成高质量图片的AI工具,WuliArt Qwen-Image Turbo绝对值得一试。这个工具最大的特点就是"快"…...
在构建高并发、海量数据的分布式系统时,数据存储与治理是核心挑战。单机数据库的性能瓶颈、ID 冲突、历史数据膨胀等问题,都需要通过架构层面的设计来解决
在构建高并发、海量数据的分布式系统时,数据存储与治理是核心挑战。单机数据库的性能瓶颈、ID 冲突、历史数据膨胀等问题,都需要通过架构层面的设计来解决。 以下结合具体业务场景,深度解析分布式 ID、分库分表、数据迁移与冷热分离的内部机制…...
Windows HEIC缩略图终极指南:3分钟让iPhone照片在Windows完美预览
Windows HEIC缩略图终极指南:3分钟让iPhone照片在Windows完美预览 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails 你是不是…...
OpenClaw+GLM-4.7-Flash成本对比:自建模型比API调用节省30%token消耗
OpenClawGLM-4.7-Flash成本对比:自建模型比API调用节省30%token消耗 1. 为什么需要关注token消耗 上周五凌晨两点,我的OpenClaw突然停止了周报自动化任务。查看日志发现是API额度耗尽——当月累计消耗已超过商用GLM-4.7-Flash的套餐限额。这次意外让我…...
