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. 4种好用的python编辑器

    1.Sublime Text: 这是一个轻量级的代码编辑器,跨平台,支持几十种编程语言,包括Python,Java,C/C++等,小巧灵活,运行轻快,支持代码高亮.自动补全.语法提示,插件扩展丰富,是 ...

  2. C++中字符串换行(如何拆分为多行)

    在C/C++语言中,可能我们要书写的一个字符串太长了,放在一行上影响代码的可读性.这时我们就需要多行书写了.   字符串多行书写有两种规则:  1. 在字符串换行处加一个反斜杠’\’,下一行前不能有空 ...

  3. sql语句实现行转列练习

    create table STUDENT_SCORE( name VARCHAR2(20), subject VARCHAR2(20), score NUMBER(4,1));insert into ...

  4. PG数据库中用户权限

    每当在数据库中创建一个对象,所有者可以分配它访问权限.所有者通常是执行创建语句的用户.对于大多数类型的对象,初始状态是,只有所有者(或超级用户)可以修改或删除对象.为了让其他角色或用户使用它,特权或权 ...

  5. iframe高度宽度自适应

    iframe { width: 100%; height: 100%; border: none; position: inherit; } 网上全是js方法,而且略显臃肿,故找到了一个css方法,宽 ...

  6. Spring MVC参数封装传递

    在Spring MVC中,前端JSP页面可以传递  基本类型(int,String).实体类型.包装类型.数组类型.集合类型(List.map )等. 假如在传递的类型中有 Date类型的字段,需要在 ...

  7. OS模块学习

    import os,sys s = os.getcwd() #获取当前工作目录,即当前python脚本工作的目录路径 # print(s) # os.chdir('..') #改变当前工作目录 # s ...

  8. centos7,zabbix3.2通过zabbix_java_gateway监控jmx[java/tomcat]

    网络上很多教程也比较多和全了,但是自己做时候多多少少的坑备注下吧. 1,监控原理简单说一下,就是zabbix_server通过代理(zabbix_java_gateway)来获取agent端(tomc ...

  9. pytorch安装 caffe2 安装:git 慢 caffe2 cannot find -lopencv_dep_cudart ,undefined reference to 'pthread_create'

    最开始的问题: caffe2目前已经不维护了.怎么编译都报错,并且有third_party的代码链接已经飞了.下载不全代码了.建议 不要再折腾了,直接安装Pytorch. 首先,基本环境是ubuntu ...

  10. POI 使用颜色字符串生成XSSFColor对象

    public static int[] hexToRgb(String hex) { String colorStr = hex; if (hex.startsWith("#")) ...