黑白照片修复亦可「如假包换」,华人学者提出实例感知着色新方法

本文转载自机器之心。

选自arXiv

作者:Jheng-Wei Su等

机器之心编译

参与:Racoon、蛋酱、小舟

为黑白照片上色不难,但难在如何实现「以假乱真」。在这篇 CVPR 2020 论文中,研究者提出了一种全新的图像着色方法,通过检测出灰度图像中的不同目标,再对图像进行着色,使预测出的彩色图片更加接近真实色彩。

给黑白图像自动上色一直是个很有趣的话题,这方面的技术可广泛应用于旧照片和旧视频的修复,使百年旧照重新焕发生机。我们也会经常看到一些黑白照片修复成品,即使是上个世纪早期的旧照片,经过着色以后效果也十分惊艳。

玛丽莲·梦露经典造型。

1936 年,伦敦滑铁卢车站,人们第一次看到电视机。

但图像着色本质上是一个不适定问题(ill-posed problem),因为它具备多模态不确定性。也就是说,灰度图像的颜色是单通道的,但着色时却有多种选择。

以往的方法虽然也能在某些图像中达到相当不错的生成效果,但还没有一种方法能够很好地解决包含多个物体的图像着色问题,主要原因是现有的模型都是在整个图像上学习然后着色,在图形和背景无法清晰分离的情况下,这些模型无法很好地学习到有用的对象语义。

最近,来自国立清华大学和弗吉尼亚理工学院的研究者提出了一种新的实例感知着色方法。这一方法通过检测灰度图像中的不同目标,从而对图像进行着色,使预测出的彩色图片更加接近真实色彩。

现有方法的缺陷在于无法预测多对象实例图像中的合理颜色,上面一组图的滑雪者和下面一组图中的车辆都属于此类。由于图形和背景的分离不够清晰,着色结果也会出现一些「混乱」,比如使用 Deoldify 方法对第二组橙子图像进行着色,生成结果就会整体偏绿色。

现有方法和本文新方法的对比。

研究者利用现有的目标检测器获取裁剪后的图像,并使用实例着色网络提取对象级特征。随后,也是使用类似的网络去提取全图特征,并使用融合模块去填充对象级特征和图像级特征,来预测最终的颜色。研究者使用了几个大规模数据集,让着色网络和融合模块从中学习相应规则,实验结果表明,这一方法在多项 baseline 方法的对比评估中均实现 SOTA。

概述

论文所提方法以灰度图像作为输入,以端到端的方式预测其丢失的在 CIE L∗a∗b∗色彩空间中的两个色彩通道

下图 3 展示了所提网络的整体框架。

首先,研究者使用现成经过预训练的目标检测器,从灰度图像中获得多个目标的边界框。使用检测到的边界框从原灰度图中裁剪出不同物体,将裁剪后的图像调整大小后产生一系列实例图像。接着,将每个实例图像 X_i 与灰度图像 X 分别输入到实例着色网络(instance colorization network)与全图着色网络(full-image colorization network)中。两个网络使用相同的结构,但网络权值各不相同。

最后,研究者使用一个融合模块来将每一层中的所有实例特征与全图特征 f^X_j 相融合。融合后的全图特征之后被输入下一层网络中。重复以上过程直到最后一层,并获得预测的彩色图像 Y。研究者首先训练了全图网络,之后训练实例网络,最后冻结以上两个网络来训练特征融合模块。

图 3:方法概述。

该研究的方法利用检测到的对象实例来改进图像着色。为此,研究者采用一个现成经过预训练的 Mask R-CNN 作为目标检测器。

图像着色骨干网络

如上图 3 所示,该研究的网络包含两个着色网络分支,一个是为实例图像着色,另一个是为全图像着色。在选择这两个网络的结构时,要求两个网络有相同的层数,以利于特征融合。研究者采用了 Zhang 等人提出的着色网络作为骨干网络。

融合模块

研究者在此讨论了如何用多个实例特征来融合全图像特征,以达到更好的着色效果。图 4 展示了该融合模块架构。由于融合发生在着色网络的多个隐含层中,简单起见,研究者只给出了在第 j 层的融合模块。将该模块用于其他层遵循类似流程。

图 4. 特征融合模块

损失函数

研究采用如下δ = 1 的平滑 l_1 损失函数:

实验

研究者给出了多个实验结果来验证所提出的实例感知着色方法。研究者在三个大规模数据集上对所提方法进行了定量评估,并结果与 SOTA 着色方法做了比较。之后还给出了对一些有挑战性图像的着色样例。

定量比较

在 ImageNet ctest10k、COCO-Stuff、Places205 这三个数据集上的定量比较结果如表 1 所示:

表 1. 在全图像层面上的定量比较。

表 2 总结了在 COCO-Stuff 数据集上所有实例的平均性能对比。

表 2. 在实例层面上的定量比较

上色视觉效果比较结果

下图展示了论文中提出的方法与其他基线方法在上色效果上的比较结果。研究者观察到,他们提出的方法在视觉质量上有着稳定的提升,尤其是对于那些包含多个实例的场景。

图 5:本文提出的方法与 SOTA 方法效果的比较。

图 6 显示了融合实例级别与完整图像级别特征的,在多个阶段上所学到的蒙版。实验表明,本文提出的实例感知流程可以改善复杂场景的视觉质量。

图 6:融合网络可视化。

  • 论文地址:https://arxiv.org/abs/2005.10825

  • GitHub 地址:https://github.com/ericsujw/InstColorization

  • Colab 地址:https://colab.research.google.com/github/ericsujw/InstColorization/blob/master/InstColorization.ipynb

END

备注:着色

图像增强与质量评价交流群

关注图像着色、增强、去雾、去雨、图像修补、图像恢复等技术,

若已为CV君其他账号好友请直接私信。

我爱计算机视觉

微信号:aicvml

QQ群:805388940

微博知乎:@我爱计算机视觉

投稿:amos@52cv.net

网站:www.52cv.net

在看,让更多人看到  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您想在Android应用程序中封装一个POST请求的类,并包含个POST方法,可以创建一个独立的类,用于处理网络请求。以下是一个示例: ```java import android.os.AsyncTask; import android.util.Log; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public class PostRequest { private static final String TAG = "PostRequest"; public interface OnPostCompleteListener { void onPostComplete(String response); } public void postMethod1(String url, String param1, String param2, final OnPostCompleteListener listener) { new AsyncTask<String, Void, String>() { @Override protected String doInBackground(String... params) { String url = params[0]; String param1 = params[1]; String param2 = params[2]; // 其他参数... // 执行POST请求,并返回响应结果 return performPostRequest(url, param1, param2); } @Override protected void onPostExecute(String result) { // 处理响应结果 listener.onPostComplete(result); } }.execute(url, param1, param2); } public void postMethod2(String url, String param1, String param2, final OnPostCompleteListener listener) { // 实现第二个POST方法,类似于postMethod1() } private String performPostRequest(String url, String param1, String param2) { HttpURLConnection connection = null; StringBuilder response = new StringBuilder(); try { URL urlObject = new URL(url); connection = (HttpURLConnection) urlObject.openConnection(); connection.setRequestMethod("POST"); connection.setDoOutput(true); // 设置POST请求的参数 String postData = "param1=" + param1 + "&param2=" + param2; // ... OutputStream outputStream = connection.getOutputStream(); outputStream.write(postData.getBytes()); outputStream.flush(); outputStream.close(); int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; while ((line = reader.readLine()) != null) { response.append(line); } reader.close(); } else { Log.e(TAG, "POST request failed with response code: " + responseCode); } } catch (Exception e) { Log.e(TAG, "Error performing POST request: " + e.getMessage()); } finally { if (connection != null) { connection.disconnect(); } } return response.toString(); } } ``` 在上面的示例中,`PostRequest`类封装了两个POST方法:`postMethod1()`和`postMethod2()`。每个方法都接受URL和参数,并使用异步任务执行POST请求。在请求完成后,通过回调接口`OnPostCompleteListener`将响应结果传递给调用方。 您可以根据需要添加更多的POST方法,并根据具体的业务逻辑来实现它们。 希望这个示例对您有所帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值