论文阅读:Face Deblurring using Dual Camera Fusion on Mobile Phones

今天介绍一篇发表在 ACM SIGGRAPH 上的文章,是用手机的双摄系统来做人脸去模糊的工作。这也是谷歌计算摄影研究组的工作。

快速运动物体的运动模糊在摄影中是一个一直以来的难题,在手机摄影中也是非常常见的问题,尤其在光照不足,需要延长曝光时间的场景。最近几年,我们也看到了图像去模糊领域的巨大进步,不过大多数的图像去模糊方法的算法开销很高,需要依赖很高的算力,同时在处理高分辨率图像时还存在局限于不足。为了实现更轻量,效果更好的图像去模糊算法,文章作者提出了一种新的人脸去模糊方法,这个算法基于手机的双摄系统。当检测到场景中有运动物体的时候,会触发其中一路的参考摄像头,比如超广角,拍摄一张短曝光的图像,同时主摄拍摄一张正常曝光的图像,这样的话,超广角拍摄的图像是清晰的,但是噪声较多(曝光时间端,信噪比低),同时主摄拍摄的图像噪声少,但是会有模糊(曝光时间长,信噪比高)。文章作者用机器学习的模型取对齐两路图像,同时进行融合,最终输出的图像清晰,没有运动模糊。文章开发的算法在谷歌 Pixel 6 上的运行时间开销在 463ms,算法效率很高。文章中的实验,也展示了该算法的优势与鲁棒性。文章作者声称,他们的工作是第一个可以在手机上稳定可靠地在不同运动及光照环境下运行的人脸运动去模糊算法。

文章提出的解决方案建立在下面两个基础之上:

  • 需要有双摄的手机系统,目前主流的手机都有双摄,文章中用到的双摄系统是主摄 W \mathbf{W} W 和超广角 U W \mathbf{UW} UW
  • 能够同步曝光,同步自动白平衡,为了便于两路图像后续的对齐与融合

实际使用的时候,系统会同时拍摄一张正常曝光的主摄图像以及短曝光的超广角图像。这两组图像反映了不同的拍摄视角,不同的噪声水平以及颜色。文章训练一个 CNN 网络,对齐,融合这两路图像的 RAW 图中的人脸区域,得到一张干净清晰的 RAW 格式的人脸区域,融合后的 RAW 图会送入一个标准的图像 ISP 系统做后续的处理。文章作者声称比起同一路的长短曝融合的方法,双摄系统的方法可以做到时间上的对齐,进而可以得到更好的融合效果。

这篇文章使用的主摄 W \mathbf{W} W FOV 是 8 0 ∘ 80^{\circ} 80,超广角 U W \mathbf{UW} UW FOV 是 10 7 ∘ 107^{\circ} 107。主摄和超广角基本是平行并排放置,超广角基本覆盖了主摄的视野。两路图像的分辨率都是 12M,一般来说,超广角 U W \mathbf{UW} UW sensor 的噪声水平会比主摄 W \mathbf{W} W sensor 的噪声水平要高。文章的融合算法,将两路图像作为输入,主摄 W \mathbf{W} W 作为源图像,超广角 U W \mathbf{UW} UW 作为需要融合的图像。当场景中物体运动被检测到,会启动双摄拍摄两路 RAW 图,主摄 W \mathbf{W} W 一路的曝光时间由手机的自动曝光算法确定,超广角一路的曝光时间被设置为主摄一路的 1 / N 1/N 1/N,文章中 N = 2 , 4 N=2, 4 N=2,4

下图展示了文章整个的算法流程:

在这里插入图片描述
首先,将每一路的多帧 RAW 图分别做融合。然后对每一路融合后的 RAW 图结果做人脸检测和物体分割,进而确定人脸区域和需要去模糊的 ROI 区域,将这个区域 crop 出来,对 crop 出来的图像区域做融合,最后将融合后的 crop 区域与原来的 RAW 图进行 blend,再做一些后处理操作,包括锐化,全局以及局部的 tone-mapping 等。

在这里插入图片描述

Pre-processing
  • Fusion ROI and face mask

文章的工作聚焦在人脸区域,文章基于人脸检测,将最大的人脸框进行了一定的扩展,使得最终的 ROI 区域包括了人脸,头发,耳朵等。基于这个扩展的人脸框,文章用一个基于 UNet 的物体分割模型生成一个人脸 mask,并且对区域边缘进行一定的模糊。

  • Color matching

由于两路镜头对应的 sensor 的性质不同,各自融合的图像会有一定的颜色差异,所以文章对两路图像做了一个颜色对齐,首先利用线性空间的颜色转换矩阵,计算一个归一化下的图:

I r e f n = C C M s r c − 1 ⋅ C C M r e f ⋅ I r e f (1) I_{ref}^{n} = CCM_{src}^{-1} \cdot CCM_{ref} \cdot I_{ref} \tag{1} Irefn=CCMsrc1CCMrefIref(1)

C C M CCM CCM 是一个 3 × 3 3 \times 3 3×3 的颜色转换矩阵。

然后再将两路图像的均值进行对齐:

I ^ r e f = I r e f n μ r e f ⋅ μ s r c (2) \hat{I}_{ref} = \frac{I_{ref}^{n}}{\mu_{ref}} \cdot \mu_{src} \tag{2} I^ref=μrefIrefnμsrc(2)

Image Alignment

接下来是图像对齐,文章还是用到了经典的 PWC-Net 训练了一个配准网络,为了适应手机图像的高分辨率,文章对 PWC-Net 做了一定程度改进,主要是通过下采样来提升网络可以 cover 的偏移程度。

F f w d = PWCNet ( ( I s r c ) ↓ , ( I ^ r e f ) ↓ ) ↑ (3) F_{fwd} = \text{PWCNet}((I_{src})_{\downarrow}, (\hat{I}_{ref})_{\downarrow})_{\uparrow} \tag{3} Ffwd=PWCNet((Isrc),(I^ref))(3)

获得位移向量场之后,再通过 warp 就可以得到配准后的图像:

I r e f ′ = W ( I ^ r e f ; F f w d ) (4) I_{ref}' = \mathbb{W}(\hat{I}_{ref}; F_{fwd}) \tag{4} Iref=W(I^ref;Ffwd)(4)

文章中也介绍了对于 PWCNet 的一些轻量化的改进,包括剪枝,量化等操作。

对于遮挡区域的处理,文章也是沿用了一般的配准方法,利用 PWCNet 生成了前向的位移场 F f w d F_{fwd} Ffwd 以及反向的位移场 F b w d F_{bwd} Fbwd。然后通过前向 warp 与反向 warp 之间的误差来确定遮挡区域:

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

Image Fusion

接下来是图像融合,文章中也是构建了一个网络模型来实现融合:

I f u s e d = FusionNet ( I s r c , I r e f ′ , M f a c e , M o c c ) + I s r c I_{fused} = \text{FusionNet}(I_{src}, I_{ref}', M_{face}, M_{occ}) + I_{src} Ifused=FusionNet(Isrc,Iref,Mface,Mocc)+Isrc

网络输入的是源图像,配准后的参考图像,分割出来的人脸区域,以及遮挡区域,输出的是融合后的图像。

  • Training data

这种去模糊的图像处理问题,比较困难的一个环节就是训练数据的构建,对于真实场景来说,输入的有模糊图像和参考图像很好获取,但是最终无模糊的 GT 图像很难获得,所以文章中也是用了模拟仿真的方式来构建训练数据集。首先针对静态场景,用主摄和超广角分别拍摄一张清晰图像,作为 GT,然后利用模拟的运动模糊核对 GT 做卷积,得到一张人脸区域是模糊的,背景区域是相对清楚的仿真退化图像。

I s r c = M b l u r ⋅ ( I G T ⊗ k ) + ( 1 − M b l u r ) ⋅ I G T + n (7) I_{src} = M_{blur} \cdot (I_{GT} \otimes k) + (1 - M_{blur}) \cdot I_{GT} + n \tag{7} Isrc=Mblur(IGTk)+(1Mblur)IGT+n(7)

  • Training loss

图像融合网络的训练损失函数是常用的 L1 loss 和 VGG loss

L c o n t e n t = ∥ I f u s e d − I G T ∥ 1 (8) \mathcal{L}_{content} = \left \| I_{fused} - I_{GT} \right \|_{1} \tag{8} Lcontent=IfusedIGT1(8)

L v g g = ∑ j w j ∥ V G G j ( I f u s e d ) − V G G j ( I G T ) ∥ 1 (9) \mathcal{L}_{vgg} = \sum_{j} w_j \left \| VGG_j(I_{fused}) - VGG_j(I_{GT}) \right \|_{1} \tag{9} Lvgg=jwjVGGj(Ifused)VGGj(IGT)1(9)

文章中还增加了一个颜色一致性的损失函数

L c o l o r = ∥ G σ ( I f u s e d ) − G σ ( I G T ) ∥ 1 (10) \mathcal{L}_{color} = \left \| \mathcal{G}_{\sigma}(I_{fused}) - \mathcal{G}_{\sigma}(I_{GT}) \right \|_{1} \tag{10} Lcolor=Gσ(Ifused)Gσ(IGT)1(10)

G σ \mathcal{G}_{\sigma} Gσ 就是一个高斯函数核。

最终的 loss 就是上面几种 loss 的加权和

w content L c o n t e n t + w vgg L v g g + w color L c o l o r (11) w_{\text{content}} \mathcal{L}_{content} + w_{\text{vgg}} \mathcal{L}_{vgg} + w_{\text{color}} \mathcal{L}_{color} \tag{11} wcontentLcontent+wvggLvgg+wcolorLcolor(11)

Image Blending

得到 ROI 区域的融合图像之后,接下来就是将去模糊后的图像与源图像的背景区域融合到一起:

I f i n a l = M b l e n d ⋅ I f u s e d + ( 1 − M b l e n d ) ⋅ I s r c (12) I_{final} = M_{blend} \cdot I_{fused} + (1 - M_{blend}) \cdot I_{src} \tag{12} Ifinal=MblendIfused+(1Mblend)Isrc(12)

M b l e n d M_{blend} Mblend 就是最开始人脸区域,去掉遮挡区域,以及置信度低的配准区域

M b l e n d = min ⁡ ( M f a c e − α M o c c − β M r e p r o j , 0 ) (13) M_{blend} = \min(M_{face} - \alpha M_{occ} - \beta M_{reproj}, 0) \tag{13} Mblend=min(MfaceαMoccβMreproj,0)(13)

M r e p r o j = max ⁡ R , G , B ( ∣ I s r c − I r e f ′ ∣ ) (14) M_{reproj} = \max_{R, G, B} (\left | I_src - I_{ref}' \right | ) \tag{14} Mreproj=R,G,Bmax( IsrcIref )(14)

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

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

相关文章

jasypt加解密

项目中经常遇到jasypt加解密的配置文件,尤其是项目不是自己创建的时候,压根不知道加密的内容是什么,而配置文件中一般加密的也都是数据库或其他非结构型数据库的账号或密码,这时候想要看一下db的内容就非常的头疼,除了…

【爬虫】– 抓取原创力文档数据

使用RPA工具,实现针对于原创力中不可下载文档的抓取,可延用于其他类似文库 1 使用工具、环境 影刀RPA、WPS Office、谷歌浏览器(非指定) 2 代码流程 3 关键点 此方案只适合抓取非VIP即可预览全文的文档,抓取下来的数…

B007-springcloud alibaba 消息驱动 Rocketmq

目录 MQ简介什么是MQMQ的应用场景异步解耦流量削峰 常见的MQ产品 RocketMQ入门RocketMQ环境搭建环境准备安装RocketMQ启动RocketMQ测试RocketMQ关闭RocketMQ RocketMQ的架构及概念RocketMQ控制台安装 消息发送和接收演示发送消息接收消息 案例订单微服务发送消息用户微服务订阅…

(done) 解释 python3 torch.utils.data DataLoader

特别注意:DataLoader 返回的迭代器是无尽的,依据如下 (CHATGPT3.5) DataLoader 返回的迭代器默认情况下是无尽的,因为它会无限地循环遍历数据集,以提供批量的数据。在训练神经网络时,通常会使用无尽的迭代器来循环遍历…

LEETCODE 100255. 成为 K 特殊字符串需要删除的最少字符数

整体思路: 1.可以看到这道题是要求是最小的,那么可以想到遍历所有情况 2.把题干已知条件转换为一个数组,那么只需要以数组每个元素为开头遍历所有情况即可。 3.对于一个数考虑其后面的情况,其后每个数等于这个数k和数本身的最小值(遍历累计求…

参数高效微调(PEFT)技术概览

参数高效微调(PEFT)技术概览 在大型语言模型(LLMs)的世界里,参数量庞大,通常在70亿至700亿之间。这些模型的自监着训练成本高昂,对公司可能意味着高达1亿美元的支出。而对于资源相对有限的研究…

Codeforces Round 934 (Div. 2) --- C. MEX Game 1 --- 题解

C. MEX Game 1: 题目大意: 思路解析: 重要的是那种只有一个的数字,因为如果这个数字有两个及以上,那么我可以再鲍勃删除之后,再拿,也一定能拿得到,所以瓶颈是只有一个的数字&#x…

爬虫3_爬取翻页URL不变的网站

之前实现了对大学排数据爬取:爬虫2_2019年549所中国大学排名. 近期复现代码,发现原网站升级,在翻页时,发现URL不改变,修改代码,使用网页自动化工具selenium实现对该类网站数据获取。 #-*- coding: UTF-8 -…

活动图高阶讲解-06

31 00:01:52,300 --> 00:02:04,300 刚才讲了,活动里面是动作 32 00:02:04,300 --> 00:02:06,300 这个动作 33 00:02:06,300 --> 00:02:09,300 就可以看作活动的一个 34 00:02:09,300 --> 00:02:13,300 里面的实现的一个行为了 35 00:02:16,300 --&g…

vue项目跳转html页面

1. 把html页面以及相关文件放到public文件夹下(目的和index.html同级) 2.在vue项目中正常写跳转事件,只是路径写法需要注意

【理解指针(三)】

文章目录 一、数组名的理解(1)数组的地址与数组首元素地址的区别 二、使用指针访问数组(1)一维数组传参的本质 三、冒泡排序(1)什么是冒泡排序(2)写冒泡排序 四、结束语 一、数组名的…

堆排序(向下调整法,向上调整法详解)

目录 一、 二叉树的顺序结构 二、 堆的概念及结构 三、数组存储、顺序存储的规律 此处可能会有疑问,左右孩子的父节点计算为什么可以归纳为一个结论了? 四、大小堆解释 五、大小堆的实现(向上和向下调整法) 5.11向上调整法…

Unity Timeline学习笔记(1) - 创建TL和添加动画片段

Timeline在刚出的时候学习了一下,但是因为一些原因一直都没用在工作中使用。 版本也迭代了很久不用都不会用了,抽时间回顾和复习一下,做一个笔记后面可以翻出来看。 创建Timeline 首先我们创建一个场景,放入一个Plane地板&#…

Linux操作系统-08-常用的网络相关命令

1、ping命令 在linux下ping的话会一直ping下去,在windows下的话它会只ping四次就结束, [rootbastion ~]# ping 192.168.0.102 PING 192.168.0.102 (192.168.0.102) 56(84) bytes of data. 64 bytes from 192.168.0.102: icmp_seq1 ttl64 time0.571 ms…

Linux - 线程互斥和互斥锁

文章目录 前言一、为什么要线程互斥原子性 二、互斥锁互斥锁的创建与销毁互斥锁进行互斥 前言 前几节课,我们学习了多线程的基础概念,这节课,我们来对线程互斥和互斥锁的内容进行学习。 一、为什么要线程互斥 首先我们要明白,对…

悲观锁(Pessimistic Locking)是一种数据库锁定机制

悲观锁(Pessimistic Locking)是一种数据库锁定机制,用于防止多个事务同时修改同一数据记录。以下是关于悲观锁的一些详细信息: 锁定数据:当事务对一条记录进行操作时,悲观锁会阻止其他事务对这条记录进行修…

Matplotlib数据可视化实战-1数据可视化Matplotlib基础

1.1绘图的一般过程: 1.导入相关库 2.生成、读入或计算得到数据; 3.根据需要绘制折线图、散点图、柱状图、饼状图、雷达图、箱线图、三维曲线/曲面以及极坐标系图形; 4.根据需要设置图形属性; 5.显示或保存绘图结果。 例如&…

c语言大小写字母的转换

通过ascll码表我们可以知道大写字母与小写字母相差32个数&#xff08;小写字母比大写字母大&#xff09;。因此&#xff0c;通过相加减32即可转换大小写字母。 #include <stdio.h>int main() {char ch c;char CH A;printf("%c\n", ch - 32);printf("%c…

计算机网络实验——学习记录

1. tun/tap模块&#xff1a;为Linux系统提供网络虚拟功能&#xff0c;tun位于网络OSI模型的三层&#xff08;网络层&#xff09;&#xff0c;tap位于网络的二层&#xff08;数据链路层&#xff09;。 1.1 验证是否包含tun/tap模块&#xff1a;modinfo tun&#xff1b; 1.2 验…

Python进程与线程开发

目录 multiprocessing模块 线程的开发 threading模块 setDaemon 死锁 线程间的通信 multiprocessing模块 运行python的时候&#xff0c;我们都是在创建并运行一个进程&#xff0c;(linux中一个进程可以fork一个子进程&#xff0c;并让这个子进程exec另外一个程序)。在pyt…