论文阅读--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.mzph.cn/web/32998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线程封装,互斥

文章目录 线程封装线程互斥加锁、解锁认识接口解决问题理解锁 线程封装 C/C代码混编引起的问题 此处pthread_create函数要求传入参数为void * func(void * )类型,按理来说ThreadRoutine满足,但是 这是在内类完成封装,所以ThreadRoutine函数实际是两个参数,第一个参数Thread* …

【建设方案】大数据湖一体化建设方案(ppt原件)

1、背景:大数据湖的发展背景与建设理念 2、体系:大数据湖体系规划与建设思路 3、生态圈:探索新兴业务入湖建设模式 4、共享:大数据湖统一访问共享规划 5、运营:大数据湖一体化运营管理建设 (本方案及更多方…

Kafka~基础原理与架构了解

Kafka是什么 Kafka我们了解一直认为是一个消息队列,但是其设计初,是一个:分布式流式处理平台。流平台具有三个关键功能: 消息队列:发布和订阅消息流,这个功能类似于消息队列,这也是 Kafka 也被…

Comfyui-ChatTTS-OpenVoice 为ComfyUI添加语音合成、语音克隆功能

‍‍ 生成多人播客: Comfyui-ChatTTS是一个开源的GitHub项目,致力于为ComfyUI添加语音合成功能。该项目提供了一系列功能强大的节点和模型,支持用户创建和复用音色,支持多人对话模式的生成,并提供了导出音频字幕文件的…

“Jedis与Redis整合指南:实现高效的Java应用与Redis交互“

目录 #. 概念 1. 导入jedis依赖 2. 写一个类(ping通redis) 3. String字符串使用 3.1 set,get方法使用(设值,取值) 3.2 mset,mget方法使用(设置多个值,取多个值&…

怎么在vscode里运行一个cpp文件

文章目录 1.需要下载g编译器,或clang(快,但是优化效果没有g好)2.新建文件夹和cpp文件(tasks.json)3.怎么在vscode里调试(launch.json)4.怎么设置让中断输出的字符是中文!5.飞机大战 1.需要下载g…

iis下asp.netcore后台定时任务会取消

问题 使用BackgroundService或者IHostedService做后台定时任务的时候部署到iis会出现不定时定时任务取消的问题&#xff0c;原因是iis会定时的关闭网站 解决 应用程序池修改为AlwaysRunning 修改web.config <?xml version"1.0" encoding"utf-8"?…

Android studio登录Google账号超时的解决方法

确保自己已经打开了代理&#xff08;科学上网&#xff09;在设置-外观与行为-系统设置-HTTP代理 中打开“自动检测代理设置”&#xff1a; 再次重新尝试登录Google账号&#xff0c;登陆成功&#xff01; 学术会议征稿 想要了解国内主办的覆盖学科最全最广的学术会议&#xff0c…

代码-功能-python-爬取博客网标题作者发布时间

环境&#xff1a; python 3.8 代码&#xff1a; # 爬取博客园内容 # https://www.cnblogs.com/import re from lxml import etree import requests import json import threading from queue import Queue import pymysql import timeclass HeiMa:def __init__(self):# 请…

k8s 部署 ruoyi 前后端分离项目

本文视频版 https://www.bilibili.com/video/BV17ugkePEeN 参考 https://blog.csdn.net/qq_50247813/article/details/136934090 https://gitee.com/nasaa/RuoYi-Vue-cloud https://www.itsgeekhead.com/tuts/kubernetes-129-ubuntu-22-04-3/ https://kubernetes.io/docs/se…

【漏洞复现】畅捷通T+ keyEdit.aspx SQL漏洞

0x01 产品简介 畅捷通 T 是一款灵动&#xff0c;智慧&#xff0c;时尚的基于互联网时代开发的管理软件&#xff0c;主要针对中小型工贸与商贸企业&#xff0c;尤其适合有异地多组织机构(多工厂&#xff0c;多仓库&#xff0c;多办事处&#xff0c;多经销商)的企业&#xff0c;…

用户态协议栈06-TCP三次握手

最近由于准备软件工程师职称考试&#xff0c;然后考完之后不小心生病了&#xff0c;都没写过DPDK的博客了。今天开始在上次架构优化的基础上增加TCP的协议栈流程。 什么是TCP 百度百科&#xff1a;TCP即传输控制协议&#xff08;Transmission Control Protocol&#xff09;是…

LabVIEW程序退出后线程仍在运行问题

LabVIEW程序退出后&#xff0c;线程仍在运行的问题可能源于资源管理不当、未正确终止循环、事件结构未处理、并发编程错误以及外部库调用未结束等方面。本文将从这些角度详细分析&#xff0c;探讨可能的原因和解决方案&#xff0c;并提供预防措施&#xff0c;帮助开发者避免类似…

将知乎专栏文章转换为 Markdown 文件保存到本地

一、参考内容 参考知乎文章代码 | 将知乎专栏文章转换为 Markdown 文件保存到本地&#xff0c;利用代码为GitHub&#xff1a;https://github.com/chenluda/zhihu-download。 二、步骤 1.首先安装包flask、flask-cors、markdownify 2. 运行app.py 3.在浏览器中打开链接&…

已解决javax.management.BadStringOperationException异常的正确解决方法,亲测有效!!!

已解决javax.management.BadStringOperationException异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 出现问题的场景 报错原因 解决思路 解决方法 分析错误日志 检查字符串值合法性 确认字符串格式 优化代码逻辑 增加…

Trimesh介绍及基本使用

Trimesh介绍及基本使用 Trimesh是一个纯Python 工具库&#xff08;支持3.7版本以上&#xff09;&#xff0c;用于加载和使用三角形Mesh网格&#xff0c;支持多种常见的三维数据格式&#xff0c;如二进制/文本格式的STL、Wavefront OBJ、二进制/文本格式的PLY、GLTF/GLB 2.0、3…

Leetcode 2713. 矩阵中严格递增的单元格数(DFS DP)

Leetcode 2713. 矩阵中严格递增的单元格数 DFS 容易想到&#xff0c;枚举每个点作为起点&#xff0c;向同行同列的可跳跃点dfs&#xff0c;维护全局变量记录可达的最远距离 超时&#xff0c;通过样例193 / 566 class Solution {int res 0;public void dfs(int[][] mat, in…

EtherCAT笔记(三) —— 主站与从站的硬件组成

1. EtherCAT 主站的硬件组成 EtherCAT主站使用标准以太网控制器&#xff0c;也即EtherCAT主站可以使用以太网控制器的任何设备。当我们有一台带网口的笔记本、工控机&#xff0c;甚至是树莓派也可以作为EtherCAT主站。 EtherCAT协议是对Ethernet协议在实时控制等方面的优化&am…

android关于源码编译简单的apk处理

文章目录 简述文件的添加 简述 创建AOSP源码可编译一个简单apk的过程&#xff0c;代码子目录结构图如下所示 文件的添加 1.com.custom.test目录下创建TestActivity.java文件 用于简单的界面显示类 package com.custom.test;import android.app.Activity; import android.o…

高考填报志愿不容易,压线考生怎么救?

每年的高考季 就是高考生们水深火热的一大月份&#xff0c;很多考生都会纠结要报考哪些学校&#xff0c;哪些专业好&#xff0c;并非每个学生从小就有明确的目标&#xff0c;很多人到6月份才深思这个问题&#xff0c;此时难免手慌脚乱&#xff0c;更别说一些考生的分数处于一本…