论文阅读--Efficient Hybrid Zoom using Camera Fusion on Mobile Phones

这是谷歌影像团队 2023 年发表在 Siggraph Asia 上的一篇文章,主要介绍的是利用多摄融合的思路进行变焦。

单反相机因为卓越的硬件性能,可以非常方便的实现光学变焦。不过目前的智能手机,受制于物理空间的限制,还不能做到像单反一样的光学变焦。目前主流的智能手机,都是采用多摄的设计,一般来说一个主摄搭配一个长焦,为了实现主摄与长焦之间的变焦,目前都是采用数字变焦的方式,数字变焦相比于光学变焦,细节会损失很多。这篇文章提出一种混合变焦的方法,就是拍摄的时候,同时获取主摄和长焦的图像,然后利用机器学习模型将两张图像对齐,并且将长焦的细节迁移到主摄上。同时,这篇文章也设计了一种自适应的融合方法,去处理两个镜头的景深差异,遮挡,匹配误差等问题,为了尽量减少两个镜头之间的域差异,文章作者还设计了一个双目的采集系统,获取真实图像的输入和GT,用于有监督的训练。最终,这篇文章的方法,可以在手机上实现对 12M 像素的图像处理耗时在 500ms 左右,相比其它 SOTA 方法,在真实场景下的效果更好。

HYBRID ZOOM SUPER-RESOLUTION

文章将主摄的图像称为 W \mathbf{W} W,长焦的图像称为 T \mathbf{T} T

这篇文章的目标是设计一个高效的算法系统,能够运行在手机设备上。由于手机设备的限制,耗时耗内存的大模型无法使用,所以需要对整个算法流程进行精细的设计。整个算法流程如图 3 所示。当用户按下拍照按钮的时候,算法系统会同时拍摄两张图像。首先利用一个粗粒度的匹配算法,将主摄图像 W \mathbf{W} W 和长焦图像 T \mathbf{T} T 对齐,然后后面再接一个局部稠密的匹配算法,比如光流。接下来,文章作者采用 UNet 模型将从 W \mathbf{W} W 中 crop 出来的图像和长焦图像 T \mathbf{T} T 中的亮度通道进行融合。最后,利用一个自适应的融合算法,将景深差异,遮挡,匹配误差等考虑进去,将融合后的图像重新贴回主摄图像 W \mathbf{W} W。整个算法系统的算法模块都尽量轻量化,以保证整个系统的效果和效率。

在这里插入图片描述

Image Alignment

Coarse alignment:文章首先将 W \mathbf{W} W 进行裁剪,让其与 T \mathbf{T} T 的 FOV 基本一致,然后将裁剪后的图像利用 bicubic 的方法上采样,让两张图像的尺寸保持一致,然后作者估计了一个 2D 的转换矩阵,将裁剪后的上采样图像与 T \mathbf{T} T 进行对齐,这个变换后的图像称为 I s r c I_{src} Isrc,同时,文章也将 T \mathbf{T} T 的颜色,利用一个颜色对齐的方式,与 I s r c I_{src} Isrc 对齐,颜色对齐后的 T \mathbf{T} T 图像称为 I r e f I_{ref} Iref

Dense alignment:做完粗对齐之后,文章接下来要做一个精对齐,需要用到稠密的光流,文章作者利用 PWC-Net 去估计 I s r c I_{src} Isrc I r e f I_{ref} Iref 之间的稠密光流,先对 I s r c I_{src} Isrc I r e f I_{ref} Iref 做一个下采样到 384 × 512 384 \times 512 384×512,然后利用 PWC-Net 估计其光流,然后将估计得到光流图上采样回原始图像尺寸。为了加速,文章中将 PWC-Net 进行了剪枝,将一些运算复杂度高的模块去除了。

Image Fusion

为了保持 W \mathbf{W} W 的颜色,文章在亮度空间进行融合,文章作者构建了一个 5 层的 UNet,将两路图像的亮度通道输入网络,此外还有前面光流估计输出的遮挡图也输入网络,最终输出得到一个灰度图像。然后这个输出的灰度图像 Y 与 UV 通道一起,做一个颜色转换,得到最终的 RGB 图像。

Adaptive Blending

前面基于 AI 的配准对齐和融合模型对大部分场景都能取得不错的效果,但是依然会有一些场景可能会在输出结果上看到明显的 artifacts。由于景深差异,遮挡,以及误匹配。因此,文章作者设计了一个策略来自适应地对 Y s r c Y_{src} Ysrc 以及 Y f u s i o n Y_{fusion} Yfusion 进行融合,这个策略就是将 defocus map,occlusion map,flow uncertainty map 以及 alignment rejection map 最终统一成一个 alpha mask,然后基于这个 alpha mask 做融合。具体框架如图 4 所示:

在这里插入图片描述

Narrow DoF on T \mathbf{T} T 一般来说,长焦的景深比主摄要小,因为一般来说景深和焦距成反比,焦距越长,景深会越浅,从论文中的图 2 可以看到,长焦的离焦区域比主摄要模糊,如果将离焦区域直接融合,会使最终的图像反而变得模糊,所以文章设计了一种方法,将 defocus map 计算出来,作为融合的引导信息。

  • Defocus map:为了估计出 defocus map,首先需要知道对焦的中心区域,同时需要知道图像中的像素相对对焦中心区域的距离,也就是深度信息,因为主摄和长焦镜头基本是平行的,根据双目视觉的测距原理,两路图像中的光流大小与视差及空间深度是成正比的。基于这个假设,文章作者提出了一种估计 defocus map 的算法,如图 5 所示。首先,根据相机的自动对焦模块,获得图像中的对焦区域 ROI,一般是一个矩形区域。然后,基于双目匹配的原理,可以认为光流反映了深度信息,进而可以假设对于静态场景来说,像素在同样的深度面上,有近似的光流。为了找到这个对焦中心,文章作者用 K-means 聚类算法对光流信息进行聚类,然后选择这个聚焦中心 x f x_f xf 作为最大聚类的中心。再利用如下的表达式,计算不同像素的光流与这个聚类中心的相对深度:

M d e f o c u s ( x ) = sigmoid ( ∥ F f w d ( x ) − F f w d ( x f ) ∥ 2 2 − γ σ f ) (1) \mathbf{M}_{defocus}(\mathbf{x}) = \text{sigmoid}(\frac{ \left \| F_{fwd}(\mathbf{x}) - F_{fwd}(\mathbf{x}_f) \right \|_{2}^{2} - \gamma}{\sigma_f}) \tag{1} Mdefocus(x)=sigmoid(σfFfwd(x)Ffwd(xf)22γ)(1)

F f w d F_{fwd} Ffwd 是前面计算的光流信息, γ \gamma γ 控制光流位移的阈值,让对焦区域容许一定的位移变化, σ f \sigma_{f} σf 控制 defocus map 的平滑程度。

  • Occlusion map:对于某些场景, W \mathbf{W} W T \mathbf{T} T 之间可能因为遮挡,存在有些区域不能在两路图像中都存在的情况,如果将这些区域进行融合,可能会产生 artifacts,所以文章作者计算了一个 Occulusion map 作为引导:

M o c c ( x ) = min ⁡ ( s ∥ W ( W ( x ; F f w d ) ; F b w d ) − x ∥ 2 , 1 ) (2) \mathbf{M}_{occ}(\mathbf{x}) = \min (s \left \| \mathbb{W}(\mathbb{W}(\mathbf{x}; F_{fwd});F_{bwd}) - \mathbf{x} \right \|_{2}, 1) \tag{2} Mocc(x)=min(sW(W(x;Ffwd);Fbwd)x2,1)(2)

其中, W \mathbb{W} W 表示双线性 warp 操作, x \mathbf{x} x 表示原始图像的二维坐标,尺度因子 s 控制 occlusion map 的强度。上面这个式子的原理,就是如果一个点在两张图像中都有,那么经过两次 warp 之后,这个点的坐标应该是保持不变的。

  • Flow uncertainty map:因为稠密的光流匹配是一个非常病态的问题,文章中将 PWC-Net 的输出做了扩展,输出了一个光流的置信度 map,这个置信度输出的是每个像素的光流向量的拉普拉斯分布,如下所示:

S ( x ) = exp ⁡ ( log ⁡ ( V a r x ( x ) ) ) + exp ⁡ ( log ⁡ ( V a r y ( x ) ) ) (3) \mathbf{S}(\mathbf{x}) = \sqrt{\exp(\log(Var_x(\mathbf{x}))) + \exp(\log(Var_y(\mathbf{x})))} \tag{3} S(x)=exp(log(Varx(x)))+exp(log(Vary(x))) (3)

M f l o w ( x ) = min ⁡ ( S ( x ) , s m a x ) / s m a x (4) \mathbf{M}_{flow}(\mathbf{x}) = \min(\mathbf{S(\mathbf{x}), s_{max}}) / s_{max} \tag{4} Mflow(x)=min(S(x),smax)/smax(4)

  • Alignment rejection map:对于配准异常区域的引导信息,文章作者也构建了一个 map,简单来说,就是将配准后的两张图的分成若干个 local patch,对每个 local patch,分别计算均值,然后对每个 local patch 里的像素,减去对应 patch 的均值之后,比较两个像素之间的差异: P δ = ( P s r c − μ s r c ) − ( P ~ r e f − μ r e f ) P_{\delta} = (P_{src} - \mu_{src}) - (\tilde{P}_{ref} - \mu_{ref}) Pδ=(Psrcμsrc)(P~refμref)

M r e j e c t ( x ) = 1 − exp ⁡ ( − ∥ P δ ( x ) ∥ 2 2 / ( σ s r c 2 ( x ) + ϵ 0 ) ) (5) \mathbf{M}_{reject}(\mathbf{x}) = 1 - \exp \left( -\left \| P_{\delta }(\mathbf{x}) \right \|_{2}^{2} / (\sigma_{src}^{2}(\mathbf{x}) + \epsilon_{0}) \right) \tag{5} Mreject(x)=1exp(Pδ(x)22/(σsrc2(x)+ϵ0))(5)

其中, σ s r c 2 ( x ) \sigma_{src}^{2}(\mathbf{x}) σsrc2(x) 表示 P s r c P_{src} Psrc 的方差, ϵ 0 \epsilon_{0} ϵ0 用来控制容许的误差。

最后的融合 map 由如下的式子求得:

M b l e n d = max ⁡ ( 1 − M o c c − M d e f o c u s − M f l o w − M r e j e c t , 0 ) (6) \mathbf{M}_{blend} = \max(1 - \mathbf{M}_{occ} - \mathbf{M}_{defocus} - \mathbf{M}_{flow} - \mathbf{M}_{reject}, 0) \tag{6} Mblend=max(1MoccMdefocusMflowMreject,0)(6)

I f i n a l = u n c r o p ( M b l e n d ⊙ I f u s i o n + ( 1 − M b l e n d ) ⊙ I f u s i o n ) (7) I_{final} = uncrop(\mathbf{M}_{blend} \odot I_{fusion} + (1 - \mathbf{M}_{blend}) \odot I_{fusion}) \tag{7} Ifinal=uncrop(MblendIfusion+(1Mblend)Ifusion)(7)

LEARNING FROM DUAL CAMERA RIG CAPTURES

最后,介绍一下文章的训练数据是怎么构建的,对于 low-lelve 的 CV 任务来说,训练数据的构建一直是个问题,如果用仿真退化的方式构造数据,可能存在域差异的问题。所以文章作者设计了一个采集数据的方式,用实际采集的数据作为训练数据。具体装置如下图所示:

在这里插入图片描述

文章中,将两部手机平行放置,这样可以同时采集到两部手机的主摄和长焦图像,这两部手机,一部可以称为主机,一部称为副机,训练的时候,主机的主摄和副机的长焦图像作为输入,而主机的长焦图像作为GT,这样既模拟了实际的两路图像,又有了实采的 GT 图像,而在实际推理的时候,可以直接将其中一部手机的主摄和长焦作为输入即可。

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

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

相关文章

long long ago

一、long 众所周知,英文单词 long,表示长,长的。 但是,还有很多你不知道到的东西,根据英文单词首字母象形原则,我们可以做一下单词long结构分析: long l长 ong长 什么意思?就是说首字线 l…

Maven的依赖传递、依赖管理、依赖作用域

在Maven项目中通常会引入大量依赖,但依赖管理不当,会造成版本混乱冲突或者目标包臃肿。因此,我们以SpringBoot为例,从三方面探索依赖的使用规则。 1、 依赖传递 依赖是会传递的,依赖的依赖也会连带引入。例如在项目中…

AI大模型企业应用实战(14)-langchain的Embedding

1 安装依赖 ! pip install --upgrade langchain ! pip install --upgrade openai0.27.8 ! pip install -U langchain-openai ! pip show openai ! pip show langchain ! pip show langchain-openai 2 Embed_documents # 1. 导入所需的库 from langchain_openai import Open…

poi生成的excel,输入数字后变成1.11111111111111E+23

poi版本4.1.2 生成excel后,单元格输入数字,过长的话变成这样 解决:生成的时候设置单元格格式为文本格式 import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileOutputStream; imp…

解析PDF文件中的图片为文本

解析PDF文件中的图片为文本 1 介绍 解析PDF文件中的图片,由两种思路,一种是自己读取PDF文件中的图片,然后用OCR解析,例如:使用PyMuPDF读取pdf文件,再用PaddleOCR或者Tesseract-OCR识别文字。另一种使用第…

使用matlab的大坑,复数向量转置!!!!!变量区“转置变量“功能(共轭转置)、矩阵转置(默认也是共轭转置)、点转置

近期用verilog去做FFT相关的项目,需要用到matlab进行仿真然后和verilog出来的结果来做对比,然后计算误差。近期使用matlab犯了一个错误,极大的拖慢了项目进展,给我人都整emo了,因为怎么做仿真结果都不对,还…

clean code-代码整洁之道 阅读笔记(第十一章)

第十一章 系统 “复杂要人命,它消磨开发者的生命,让产品难以规划、构建和测试。” --RayOzzie,微软公司首席技术官 11.1 如何建造一个城市 每个城市都有一组组人管理不同的部分,有些人负责全局,其他人负责细节。 城市能运转&#…

【git】gitee仓库本地克隆失败可能的一种解决办法

出错点: 在 gitee 克隆远程仓库到 本地时,可能会出现以下报错情况,无法成功克隆 正常流程:(熟悉正常克隆流程的可以直接跳到下面的【解决办法】) 我们一般复制仓库地址是在下面红线框框的位置&#xff0c…

虚拟现实环境下的远程教育和智能评估系统(十二)

接下来,把实时注视点位置、语音文本知识点、帧知识点区域进行匹配; 首先,第一步是匹配语音文本知识点和帧知识点区域,我们知道教师所说的每句话对应的知识点,然后寻找当前时间段内,知识点对应的ppt中的区域…

线程C++

#include <thread> #include <chrono> #include <cmath> #include <mutex> #include <iostream> using namespace std;mutex mtx; void threadCommunicat() {int ans 0;while (ans<3){mtx.lock();//上锁cout << "ans" <…

C++初学者指南第一步---14.函数调用机制

C初学者指南第一步—14.函数调用机制 文章目录 C初学者指南第一步---14.函数调用机制1.记住&#xff1a;内存的结构2.函数调用是如何工作的3. 不要引用局部变量4. 常见编译器优化5. Inlining内联 1.记住&#xff1a;内存的结构 堆&#xff08;自由存储&#xff09; 用于动态存…

Cesium如何高性能的实现上万条道路的流光穿梭效果

大家好&#xff0c;我是日拱一卒的攻城师不浪&#xff0c;专注可视化、数字孪生、前端、nodejs、AI学习、GIS等学习沉淀&#xff0c;这是2024年输出的第20/100篇文章&#xff1b; 前言 在智慧城市的项目中&#xff0c;经常会碰到这样一个需求&#xff1a;领导要求将全市的道路…

PADS学习笔记

1.PADS设计PCB流程 封装库&#xff08;layout&#xff09;&#xff0c;原理图库&#xff08;logic&#xff09;的准备原件封装的匹配&#xff08;logic&#xff09;原理图的绘制&#xff08;logic&#xff09;导网表操作&#xff08;logic&#xff09;导入结构&#xff08;lay…

SpringBoot + 虚拟线程,鸟枪换大炮!

“虚拟”线程&#xff0c;望文生义&#xff0c;它是“假”的&#xff0c;它不直接调度操作系统的线程&#xff0c;而是由JVM再提供一层线程的接口抽象&#xff0c;由普通线程调度&#xff0c;即一个普通的操作系统线程可以调度成千上万个虚拟线程。 虚拟线程比普通线程的消耗要…

Centos7安装自动化运维Ansible

自动化运维Devops-Ansible Ansible是新出现的自动化运维工具&#xff0c;基于Python 开发&#xff0c;集合了众多运维工具&#xff08;puppet 、cfengine、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置 、批量程序部署、批量运行命令 等功能。Ansible…

Java8 --- Gradle7.4整合IDEA

目录 一、Gradle整合IDEA 1.1、Groovy安装 1.1.1、配置环境变量 ​编辑 1.2、创建项目 ​编辑 1.3、Groovy基本语法 1.3.1、基本语法 1.3.2、引号 1.3.3、语句结构 1.3.4、数据类型 1.3.5、集合操作 1.4、使用Gradle创建普通Java工程 1.5、使用Gradle创建Java ss…

JavaScript之类(1)

class基础语法结构&#xff1a; 代码&#xff1a; class MyClass {constructor() { ... }method1() { ... }method2() { ... }method3() { ... }... } 解释&#xff1a; 属性解释class是我们定义的类型(类)MyClass是我们定义的类的名称 constructor()我们可以在其中初始化对象m…

基于YOLOv5的PCB板缺陷检测系统的设计与实现(PyQT页面+YOLOv5模型+数据集)

简介 随着电子设备的广泛应用,PCB(印刷电路板)作为其核心部件,其质量和可靠性至关重要。然而,PCB生产过程中常常会出现各种缺陷,如鼠咬伤、开路、短路、杂散、伪铜等。这些缺陷可能导致设备故障,甚至引发严重的安全问题。为了提高PCB检测的效率和准确性,我们基于YOLOv…

2-14 基于matlab的GA优化算法优化车间调度问题

基于matlab的GA优化算法优化车间调度问题。n个工作在m个台机器上加工。已知每个工作中工序加工顺序、各工序的加工时间以及每个工件所包含的工序&#xff0c;在满足约束条件的前提下&#xff0c;目的是确定机器上各工件顺序&#xff0c;以保证某项性能指标最优。程序功能说明&a…

华为数通——单臂路由

单臂路由&#xff1a;指在三层设备路由器的一个接口上通过配置子接口&#xff08;或“逻辑接口”&#xff0c;并不存在真正物理接口&#xff09;的方式&#xff0c;实现原来相互隔离的不同VLAN&#xff08;虚拟局域网&#xff09;之间的互联互通。但是仅仅允许单播通信。 单臂路…