Matting任务里的Gradient与Connectivity指标

主要背景

Matting任务就是把α(不透明度, 也就是像素属于前景的概率)、F(前景色)和B(背景色)三个变量给解出来.

C为图像当前可观察到的颜色, 这是已知的. 问题是一个等式解不出三个变量, 因此就必须引入额外的约束使这个方程可解, 这个额外的约束就是由用户指定的trimap(有人译为三元图)图, 或者是仅仅在前景和背景画几笔的草图(scribbles).

主要的手段

  • 传统方法: Poisson Matting/Bayes Matting/Closed Form Matting/KNN Matting

    • Color sampling方法, 以Bayesian Matting为代表, 通过对前景和背景的颜色采样构建高斯混合模型, 但是这种方法需
      要高质量的trimap, 不易获取
    • Propagation的方法, 根据像素亲和度将用户绘制的信息传播到不确定像素, 以Poisson Matting和KNN matting为代
      表, 但是也不是自动抠图
  • CNN方法:
    • Natural Image Matting Using Deep CNN(ECCV 2016)
    • Deep Automatic Portrait Matting(ECCV 2016)
    • Automatic Portrait Segmentation for Image Stylization(2016)
    • Deep Image Matting(CVPR 2017)
    • Semantic Human Matting(2018)等

主要评价指标

来自于论文: Christoph Rhemann, Carsten Rother, Jue Wang, Margrit Gelautz, Pushmeet Kohli, Pamela Rott. A Perceptually Motivated Online Benchmark for Image Matting. Conference on Computer Vision and Pattern Recognition (CVPR), June 2009.

  • Gradient
  • Connectivity
  • SAD
  • MSE

一些相关的术语, 来自参考链接[1]
SAD(Sum of Absolute Difference)= SAE(Sum of Absolute Error)即绝对误差和
SATD(Sum of Absolute Transformed Difference)即hadamard变换后再绝对值求和
SSD(Sum of Squared Difference)= SSE(Sum of Squared Error)即差值的平方和
MAD(Mean Absolute Difference)= MAE(Mean Absolute Error)即平均绝对差值
MSD(Mean Squared Difference)= MSE(Mean Squared Error)即平均平方误差

大致内容

因为若是仅仅考虑SAD和MSE指标, 在和人类判断的对比中, 发现, 并不能很好地反映人类的实际判断标准. 为此文章引入了两个新的指标, 梯度和连通性. 先来说下连通性.

Connectivity

这个图基于matting任务中获得的alpha matte, 这是一个灰度图, 表示的就是前面的公式里的\(\alpha\).

由于这里的图上出现了几个参数, $\alpha_i , \Omega, d_i, l_i, i$, 下面结合具体的公式来理解.

\[
\sum_{i}\left(\varphi\left(\alpha_{i}, \Omega\right)-\varphi\left(\alpha_{i}^{*}, \Omega\right)\right)^{p}
\]

这里的p是自定义参数. 具体见后.

该公式给出了连通性误差的计算方法, 这里是对整个预测出来的alpha matte图和对应的真值的图的对应的差异的累和. 这里的关键是里面的\(\varphi\left(\alpha_{i}, \Omega\right)\)函数.

首先要解释这里的\(\Omega\), 它表示的是对于预测结果图和真值共有的最大的值为1的连通区域, 被称为"源域(source region)", 也就是在上图中红线区域大致表示的范围. 这里的\(\varphi\)计算的是有着透明度\(\alpha_i\)的像素i, 与源域的连通度(degree of connectivity), 当其为1则认为该像素与源域全连通, 等于0表示完全不连通. 另一个加星号的表示真值图上的对应像素的连通度的计算. 二者计算差异, 来累计误差. 好的结果应该有着更低的误差, 更相似的连通情况.

公式里的\(l_i\)表示像素i四连通到源域所需要的最大阈值, 也就是上图中的虚线, 用它对alpha matte进行二值化, 正好处于使像素i与源域连通(实际需要四连通)/不连通的临界. 若是对于一个像素而言, 它的\(l=\alpha\), 那么就可以认为它与源域是全连通的.

而公式里的\(d_i\)如图所示, 表示的就是像素i处的\(\alpha\)值和对应的临界阈值\(l_i\)的差距.

\[
\varphi\left(\alpha_{i}, \Omega\right)=1-\left(\lambda_{i} \cdot \delta\left(d_{i} \geq \theta\right) \cdot d_{i}\right)
\]

这里的\(\theta\)是自定义参数, 具体见后. 它用在指示函数\(\delta\)里作为一个阈值, 来忽略小于它的\(d_i\)的情况, 认为小于它就已经是全连通了, 使得误差计算更为灵活.

其中的\(\lambda_{i}=\frac{1}{|K|} \sum_{k \in K} dist_{k}(i)\)用来对\(d_i\)进行加权, 这里的K表示\(l_i\)到\(\alpha_i\)之间的离散\(\alpha\)值的集合, \(dist_k\)计算了设置为阈值\(k\)时, 对于像素i距离最近的连通到源域的像素, 与像素i之间的标准化欧式距离. 实际情况中, 远离连通区域的像素, 获得的权重\(\lambda\)也应该相应会更大些, 这样导致得到的\(\varphi\)会更小些, 也就是认为连通度更小.

Gradient

主要计算的是预测的alpha matte \(\alpha\)和ground truth \(\alpha^{*}\)的之间的梯度差异, 定义如下:

\[
\sum_{i}\left(\nabla \alpha_{i}-\nabla \alpha_{i}^{*}\right)^{q}
\]

这里的q是自定义参数. 具体见后

这里的\(\nabla \alpha_{i}\)和\(\nabla \alpha_{i}^{*}\)表示的是对应的alpha matte的归一化梯度, 这是通过将matte与具有方差\(σ\)的一阶Gaussian导数滤波器进行卷积计算得到的. 二者计算差异, 进而累计损失. 总体越相似, 指标值越小.

这里的方差\(σ\)也是自定义参数, 具体见后

关于参数的选择

对于这里存在四个需要人工设置的参数: \(\theta, p, q\), 在参考文章3中, 有进一步的测试与设定, 文章最终选择了这样的设定: \(\sigma=1.4, q=2, \theta=0.15, p=1\).

参考文章

  1. https://zhidao.baidu.com/question/1701594942558730300.html
  2. http://alphamatting.com/index.html
  3. Christoph Rhemann, Carsten Rother, Jue Wang, Margrit Gelautz, Pushmeet Kohli, Pamela Rott. A Perceptually Motivated Online Benchmark for Image Matting. Conference on Computer Vision and Pattern Recognition (CVPR), June 2009.`

Matting任务里的Gradient与Connectivity指标的更多相关文章

  1. .Net内存泄露原因及解决办法

    .Net内存泄露原因及解决办法 1.    什么是.Net内存泄露 (1).NET 应用程序中的内存 您大概已经知道,.NET 应用程序中要使用多种类型的内存,包括:堆栈.非托管堆和托管堆.这里我们需 ...

  2. Elasticsearch 聚合统计与SQL聚合统计语法对比(一)

    Es相比关系型数据库在数据检索方面有着极大的优势,在处理亿级数据时,可谓是毫秒级响应,我们在使用Es时不仅仅进行简单的查询,有时候会做一些数据统计与分析,如果你以前是使用的关系型数据库,那么Es的数据 ...

  3. 转:.Net内存泄露原因及解决办法

    1.    什么是.Net内存泄露 (1).NET 应用程序中的内存 您大概已经知道,.NET 应用程序中要使用多种类型的内存,包括:堆栈.非托管堆和托管堆.这里我们需要简单回顾一下. 以运行库为目标 ...

  4. 解决连锁零售行业IT运维管理四大困境

    解决连锁零售行业IT运维管理四大困境   中国近年来,连锁零售行业进入了行业的发展高潮,迅速崛起一批大型连锁业态.而随着IT技术的不断进步,连锁零售企业已经步入IT信息化快速发展的重要阶段:在面对激烈 ...

  5. TOP100summit:【分享实录】链家网大数据平台体系构建历程

    本篇文章内容来自2016年TOP100summit 链家网大数据部资深研发架构师李小龙的案例分享. 编辑:Cynthia 李小龙:链家网大数据部资深研发架构师,负责大数据工具平台化相关的工作.专注于数 ...

  6. Android 计算器

    首先在activity_main.xml加入一个EditText 通过xml的方式来沈成一个图像在drawable中新建一个white_bg.xml文件,同时选择一个shape标签corners设置圆 ...

  7. CloudStack 4.3功能前瞻

    今天CloudStack 4.3已经Feature Freeze了,不会再有新功能加入到这个版本里.我们也可以坐下来看看哪些功能是值得期待的.首先,4.3的UI也秉承扁平化设计,看着更加简洁清爽.见下 ...

  8. 解决Net内存泄露原因

    Net内存泄露原因及解决办法 https://blog.csdn.net/changtianshuiyue/article/details/52443821 什么是.Net内存泄露 (1).NET 应 ...

  9. (转)Linux 系统性能分析工具图解读(一、二)

    Linux 系统性能分析工具图解读(一.二) 原文:http://oilbeater.com/linux/2014/09/08/linux-performance-tools.html 最近看了 Br ...

随机推荐

  1. Python全栈开发记录_第五篇(装饰器)

    单独记录装饰器这个知识点是因为这个知识点是非常重要的,必须掌握的(代码大约150行). 了解装饰器之前要知道三个知识点 作用域,上一篇讲到过顺序是L->E->G->B 高阶函数: 满 ...

  2. linux 怎么与网络对时

    首先来了解下面几个知识点:1. date命令:#date显示系统时间2.hwclock命令 (即hardwareclock系统硬件时间)#hwclock显示硬件时间#hwclock -w将系统时间写入 ...

  3. JAVA REENTRANTLOCK、SEMAPHORE 的实现与 AQS 框架

    引言 ReentrantLock是JDK提供的一个可重入互斥锁,所谓可重入就是同一个锁允许被已经获得该锁的线程重新获得.可重入锁的好处可以在递归算法中使用锁,不可重入锁则导致无法在递归算法中使用锁.因 ...

  4. IIS 字符串过长

    jquery.datatable.js---弹窗要用极速模式 <?xml version="1.0" encoding="utf-8"?><c ...

  5. LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal 由前序和中序遍历建立二叉树 C++

    Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that ...

  6. (6.2)vim文本编辑器

    vi / vim是Unix / Linux上最常用的文本编辑器而且功能非常强大. vim文本编辑器只有命令,没有菜单.

  7. python module -- sys

    sys模块主要是用于提供对python解释器相关的操作 http://www.cnblogs.com/pycode/p/sysos.html http://blog.csdn.net/pipisorr ...

  8. Matplotlib-画图种类

    Scatter 散点图 本节我们将讲述各种不同的plot的方式.之前我们讲到了如何plot线,今天我们讲述如何plot散点图. # 首先,先引入matplotlib.pyplot简写作plt,再引入模 ...

  9. mysql查询正在执行的sql

    mysql> SHOW VARIABLES LIKE "general_log%"; +------------------+------------------------ ...

  10. Mongodb到mysql数据库的数据迁移(Java,Windows)

    运行环境为windows 测试过260万的数据表,迁移大概要10分钟左右,当然肯定和网络,字段大小什么的有关系. 遇到的坑和注意点都用紫色标记了(对,就是我大乃团的高冷紫--Nogizaka 46) ...