【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 PCIePython16.49ms28.84ms95.35ms
BM1684X PCIeC++0.64ms26.33ms38.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/297805.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IPv6有状态地址自动配置(DHCPv6)

IPv6有状态地址自动配置 IPv6实现了对无状态地址自动配置的支持。这种不需要特殊服务器的地址自动配置方式有着极大的好处。使用起来也很方便,而在IPv4时代曾经是地址自动分配的首选方式的DHCP好像显得有些没落了。但是,DHCP作为有状态地址自动配置的方式之一,依旧有着无状…

【STM32】RTC实时时钟

1 unix时间戳 Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒 时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量 世界上所有时区的秒计数器相同,不同时区…

虚幻UE 材质-边界混合之PDO像素深度偏移量

2024年的第一天!!!大家新年快乐!!! 可能是长大了才知道 当你过得一般 你的亲朋好友对你真正态度只可能是没有表露出来的冷嘲热讽了 希望大家新的一年平安、幸福、 永远活力满满地追求自己所想做的、爱做的&…

Unix操作系统的前世今生

Unix是一种多用户、多任务操作系统,最初由AT&T贝尔实验室的肯汤普逊(Ken Thompson)和丹尼斯里奇(Dennis Ritchie)等人开发于上世纪70年代初。它被设计成一种通用的操作系统,支持跨多种硬件平台&#xf…

开发经验:代码编译、打包正常,运行提示包不存在

天天提交代码,合并代码。经常会发生,代码提交过后,本地的代码跑不起来的情况出现。遇到脾气好点的同事会仔细检查检查下,是否是自己的环境出现的问题,遇到脾气不好的同事,直接就开喷了。怎么每次你一提交代…

C++: 求1+2+3+...+n

int i 1; int sum 0; class Sum { public:Sum(){sum i;i;} };class Solution { public:int Sum_Solution(int n) {Sum a[n]; //调用n次sum的构造函数return sum;} };

Docker 镜像以及镜像分层

Docker 镜像以及镜像分层 1 什么是镜像2 Docker镜像加载原理2.1 UnionFs:联合文件系统2.2 Docker镜像加载原理2.3 Docker镜像的特点 3 镜像的分层结构4 可写的容器层 1 什么是镜像 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行…

1_开闭原则(Open Closed Principle)

开闭原则(Open Closed Principle) 1.概念 开闭原则(Open-Closed Principle)是指一个软件实体如类、模块和函数应该对扩展开放, 对修改关闭。所谓的开闭,也正是对扩展和修改两个行为的一个原则。强调的是用抽象构建框架&#xff…

python总结高阶-异常处理机制

文章目录 异常是什么?try和except结构try...一个except结构try...多个except结构try...except...else结构try...except...finally结构return语句和异常处理问题 常见异常常见异常的解决SyntaxError :语法错误NameError :尝试访问一个没有申明…

算法第十二天-矩形区域不超过K的最大数值和

矩形区域不超过K的最大数值和 题目要求 解题思路 来自[宫水三叶] 从题面来看显然是一道[二维前缀和]的题目。本题预处理前缀和的复杂度为O(m* n) 搜索所有子矩阵需要枚举[矩形左上角]和[矩形右下角],复杂度是 O ( m 2 ∗ n 2 ) O(m^2 * n^2) O(m2∗n2)&#xff0c…

如何安装 Python

1.打开浏览器 输入网址 :www.python.org ​ 2.根据电脑系统配置进行下载 ​ 3.确定电脑系统属性,此处我们以win10的64位操作系统为例 ​ 4.安装python 3.6.3 双击下载的安装包 python-3.6.3.exe 注意要勾选:Add Python 3.6 to PATH 点击 Customize…

听GPT 讲Rust源代码--compiler(27)

File: rust/compiler/rustc_mir_build/src/build/expr/as_place.rs 在Rust编译器的源代码中,文件rust/compiler/rustc_mir_build/src/build/expr/as_place.rs的作用是用于处理表达式的转换为L-value的过程。L-value是指那些可接受赋值操作的表达式,如变量…

企业Aspera替代方案有哪些推荐

随着企业数据量的不断增加,数据传输和共享成为了一个重要的问题。Aspera是一款高性能、低延迟的数据传输工具,但是它并不是万能的,随着数据量的不断增大,也有一些企业需要寻找Aspera的替代方案。本文将介绍三种常用的企业Aspera替…

复旦MBA科创青干营(二期):探索合肥科创企业的创新之路

11月18日-19日,复旦MBA科创青干营二期学生开启了整合实践活动的第三次企业参访,前往位于合肥的蔚来第二先进制造基地、安徽万邦医药科技股份有限公司和合肥国轩高科动力能源有限公司,在学术导师和科创企业家“双导师”的指导下,深…

近屿智能OJAC带您从0到1全方位深度学习AI大模型,星辰大海和你开创!

Look!👀我们的大模型商业化落地产品📖更多AI资讯请👉🏾关注Free三天集训营助教在线为您火热答疑👩🏼‍🏫 在这个信息爆炸的数字时代,你是否也想掌握那种像魔法一样的AI技…

Git - 强制替换覆盖 master 分支解决方案

问题描述 在版本迭代中,通常会保持一个主分支 master,及多个 dev 分支,但是因为 dev 分支的开发周期过长,迭代太多而没有及时维护 master ,导致后来发版上线的大部分代码都在 dev 分支上,如果将代码在 mas…

【Python学习】Python学习4-运算符

目录 【Python学习】Python学习4-运算符 前言算术运算符比较(关系)运算符赋值运算符逻辑运算符位运算符成员运算符身份运算符运算符优先级参考 文章所属专区 Python学习 前言 本章节主要说明Python的运算符。主要有 算术运算符 比较(关系&…

MYSQL - SQL优化

插入数据优化 小批量数据 批量插入 最好插入500-1000条比较好 手动提交事务 主键顺序插入 大批量插入数据 主键优化 页分裂 页合并 主键优化设计原则 order by优化 group by优化 limit优化 count优化 count(1)里面不一定必须1,数字都可以 update优化 更新字…

Ubuntu同步两个剪切板

众所周知,ubuntu系统中有两套剪切板。第一个剪切板是用鼠标操作,鼠标选中则复制,点击鼠标中键则粘贴(这个剪切板通常叫做——选择缓冲区)。第二个剪切板则是真正的剪切板,使用ctrlc(在终端中默认…

响应式开发

响应式开发的原理Bootstrap前端开发框架Bootstrap栅格系统阿里百秀首页案例 响应式开发原理 1 响应式需要一个父级做为布局容器,来配合子级元素来实现变化效果。 2 在不同屏幕下,通过媒体查询来改变这个布局容器的大小,再改变里面子元素的排…