五一的旅游照如何消除路人,急,在线等

Python
349
0
0
2022-04-11

引言

漫漫的人生长河中,总是有很多难忘的瞬间

久旱逢甘雨,他乡遇故知,洞房花烛夜,金榜题名时

现代生活,人生所有的喜都定格在照片中,沉淀在回忆里

当照片中充斥着喧宾夺主的路人,便会给我们的回忆沾染上些许瑕疵

人工智能从来不会让人失望

基于昇腾的异构并行计算架构CANN软件栈构建的AI图像修复应用,不仅可以快速去除照片中的路人,还能快速修补缺损的图片,让拍照变得简单

简介

由于内存限制,基于数据驱动的图像修复方法通常只能处理小于 1k(1920 X 1080)的低分辨率输入,而目前主流相机拍照几乎都已经超过了 4K,单纯对低分辨率修复后的结果进行上采样,只会产生较大但是模糊的结果,根本无法达到高清修复的结果。

Qiang Tang 等人提出的算法“Contextual Residual Aggregation for Ultra High-Resolution Image Inpainting”另辟蹊径,由生成器得到低分辨率的修复好的图像,然后通过残差聚合模块得到高频残差,最后合并高频残差合低分辨率修复结果得到高分辨率修复图像,最终的效果也相当惊艳。

本应用在昇腾基础硬件上基于 CANN AscendCL 实现,指定修复区域,可以对超高像素图像进行修复,特别是通过将残差聚合模块转化为大矩阵乘以后充分利用了 昇腾基础硬件的算力优势, 即使对于 4K 图像也能达到秒级修复。可在线体验

理解模型

下图为高清图像修复方法的整体框架:其中顶部图为 CRA 机制流程,底部图为生成器的架构:

生成器结构

生成器包括粗(

Coarse

)到精(

Refine

)两个自编码器网络架构:

第一阶的自编码器是一个粗糙的自编码器(

Coarse network

),用来生成待修复部分的图像的大体轮廓,自编码器在训练时记录了大量的图像信息,即使图像部分缺失,也具有重建图像的能力。但自编码器生成的图像会模糊,这是自编码器的固有缺陷。假定擦除区域的图像是 Mask 内的图像,此时自编码器修复出来的 Mask 内的图像会非常的模糊,之后再将该图像送入到第二阶的自编码器。

第二阶自编码器是一个精细的自编码器(

Refine network

),会对上阶生成的修复的 Mask 内的图像进行精细加工,使得该区域图像变得清晰。该阶自编码器的原理是将图像切成指定数量的 Patch,比如对大小为 512*512 的原始图像切成 32*32 个相同大小的 Patch,那么每个 Patch 大小是 16*16。在该阶的编码器高层将特征图也切成 32*32 个 Patch,比如在高层的特征图大小是 96*96,Channel 数为 256,此时在高层用 3*3 的卷积核对每个 Patch 内进行特征提取,这样每个 Patch 会生成一个 256 维的向量,这 256 维的向量记录了原图对应 Patch 的特征。当两个 Patch 的特征相似时它们对应的 256 维向量的余弦相似度就会较大,用这个原理可以生成 Patch 之间的相关性,这个两两之间的相关性可以用注意力矩阵来表示,反应了图片内所有 Patch 之间的相似程度,相似度越大注意力分数越高。

修复 Mask 内的图像就是要利用相似度从 Mask 外找到与 Mask 内待修复 Patch 相似性高的 Patch,在编码器的低层将 Mask 外的 Patch 与以对应的注意力分数作为权值相乘后再相加得到待修补 Patch 内的特征值。

对于生成器,希望它尽可能生成真实清晰的图像,而判别器则希望尽可能的区分真实样本与生成样本,以促使生成器尽可能生成更真实清晰的图像。

注意,生成器除了生成了一张 512x512 的修复后的图像,还输出了一个注意力矩阵(1024 x 1024),CRA 矩阵就是利用该注意力矩阵实现了进一步的精修。

接下来看 CRA 如何利用注意力矩阵进一步精修图像。

CRA 机制精修图像

1、锐化处理需要获取图片的细节,由原图和修复后的图片缩放到同样大小后相减得到细节图片;

2、得到细节图后需要利用 Mask 区域外的上下文信息再进一步生成细节图片的 Mask 内区域图片,具体为:把细节图片分成 32*32 个 Patch,再利用上面得到的注意力矩阵,加权求和 Mask 外的细节特征得到 Mask 内的细节,修复后的 Mask 内细节区域的图片再加到修复后图像对应的 Mask 内的区域,得到清晰的修复区域的图片,最后再将经过以上处理修复后的图片的 Mask 内区域与原图 Mask 外的区域合并组成一张完整的清晰自然的图像。

关联矩阵生成高清细节图具体实现方法

针对每个需要修复的像素,都要取 1024 个 Patch 中的对应像素值与 1024 个概率值乘加得到,计算量是非常大的。我们可以估算一下,如果是图像尺寸是(3072, 3072, 3),那么计算量:1024*3072*3072*3 = 28991029248 = 0.28T 。

就算是只计算 Mask 内的必要元素,但却需要多次判断该像素是否在 Mask 内;所以在 CPU 上计算将非常慢;大家可以试一下。

这里我们却可以将这个计算转换为矩阵乘,针对每一个像素都去计算,不用去考虑是否在 Mask 内,利用昇腾基础硬件的强大的矩阵乘能力去计算。

将关联矩阵作为左矩阵(1024x1024),将 32*32 个 Patch 中的第一个像素取出来作为一列,因为每个 Patch 是 96 行 96 列(3072/32=96)3 通道,所以总共是 96*96*3=27648 列,所以最终是 27648 列的一个矩阵作为右矩阵(1024x27648)。

右矩阵如何从 3072x3072x3 的矩阵变换成 1024 x 27648 的过程,可以用 reshape+transpose 就可以了。

应用开发

本应用采用了下图所示的模块化设计,通过各模块之间的协调配合完成一张图片的推理输出。

其中各个模块的主要功能点如下所示:

  1. 运行管理资源申请;
  2. 加载模型文件,构建模型输出内存;
  3. 数据获取,获取要进行推理的原始图像和 Mask 图像;
  4. 数据预处理,模型的输入图像进行预处理;
  5. 模型推理,将数据输入到模型进行推理;
  6. 解析模型推理结果,得到修复后的图像和注意力矩阵进行后处理,利用注意力矩阵对图像的细节的 Mask 内区域进行增强,将增强的细节叠加到修复的图像的 Mask 内区域即对修复的区域进行锐化,再把锐化 Mask 内区域的图像与原图 Mask 外区域合并得到修复后的高清图像。

其中较为复杂和关键的便是预处理和后处理阶段。

AI 图像修复预处理部分首先使用 OpenCV 读取原图和 Mask 图,将原图和 Mask 图进行大小缩放,缩放至 3072*3072 大小,之后再将原图像和 Mask 图像缩小到 512*512 用于送入模型进行推理,之所以将图片缩小后送入模型推理是为了节省算力和内存空间,加速推理时间;将读取到的图像数据拷贝至设备侧申请的内存空间中,为接下来构建模型输入数据做好准备。最后分别得到 3072*3072 和 512*512 的原图和 Mask 图。

而后处理是整个应用中最复杂的部分,主要是对模型生成器修复的图像对修复区域进行增强,增强方式是采用了图像锐化的原理,将修复图像的修复区域与原图细节抽取的图片对应的区域相加,另外本应用中利用注意力矩阵对原图细节图片也做了进一步加工,使得细节图片包含更丰富的信息,以此得到锐化后的修复区域图像更清晰。

优点

AI 图像修复存在很多优点,以下简单介绍

  1. 图片处理速度快:
  2. 基于昇腾专门针对 AI 的 NPU 进行推理,图像的修复速度可以达到毫秒级。快速修复,无需等待。
  3. 缩减工作量:
  4. 而对于动辄几千帧图像的视频,如果单纯使用人工修补,耗费的人力是不可想象的,而 AI 图像修复可以大大缩减工作量,让大量的修复工作变得简单。
  5. 可不断优化,质量高:
  6. AI 图像修复是基于 GAN 网络训练的模型,针对于不同场景,可以采集不同的数据集,进行加强训练。在数据集的扩充下,模型的精准度及处理效果越来越强,甚至可以超出人工修补的质量。

效果展示