mad的问题汇总

Q:我想将I帧的预测图像和原始图像的平均绝对误差给输出来,请问这个在JM86中需要在哪一点改动呢?谢谢 A: 差值保存在diffy中: diffy[j][i] = imgY_org[img->opix_y+j][img->opix_x+i] - pred[j][i]; 分析MAD不知道程序中在哪求可以直接搜索"MAD“ 结果中有一个函数: img->MADofMB[img->current_mb_nr] = calc_MAD(); 就是这个了,进去看一下: //calculate MAD for the current macroblock double calc_MAD() { int k,l; int s = 0; double MAD; for (k = 0; k < 16; k++) for (l = 0; l < 16; l++) s+= abs(diffy[k][l]); MAD=s*1.0/256; return MAD; } 刚好是根据diffy求MAD Q:看了很多的文献,不论是经典的二次R-Q模型,还是其它什么模型,其中总有一个用于表示编码复杂度的变量,如二次R-Q模型中是MAD,有的模型中是SATD等,根据二次R-Q模型的源出文献《Scalable Rate Control for MPEG-4 Video》,MAD的引入是为了使模型scalable with video content,但是为什么有这种效果却没有讲。请教各位,MAD的引入的原因是为了什么,有什么数据来证明或文献支持?谢谢高手赐教! A:就是为了根据前一帧的复杂度来预测当前帧的复杂度啊。 我说的是R-Q模型中,引入了MAD,不是使用MAD的线性预测模型 A:《Scalable Rate Control for MPEG-4 Video》中最初得到的二次模型是一个码率和QP之间的关系,但是实际中并不是QP越高,码率就越小,不同的图像复杂度不同,对得到的码率也会有影响,因此,需要对原先的二次模型做一个修正,加入图像复杂度这个因素。而对于为什么MAD可以近似代表图像复杂度,我想不用我解释了吧,自己好好想下就知道了。 Q:道理确实是如此,从二次模型的公式来看,对某个图像,给定QP时,BIts/MAD就是一个常数,这意味着Bits和MAD就是线性关系,但从《Scalable Rate Control for MPEG-4 Video》中,并没有看到相关的证明! A:率失真模型中,一方面关心的是比特率与QP值(或量化步长)的关系,另外一方面关心的是比特率与图像编码复杂度之间的关系。 假定QP值如果和编码复杂度相互独立的话,那么率失真模型应当相当优雅。但是实际的情况并非如此,特别是在H.264中。 在MPEG-4及以前版本中,计算MAD的方法是用运动估值后的残差信息。这样MAD值与比特之间确实存在一种线性关系(注意是线性,而不是正比),虽然在楼主提到的文献Scalable Rate Control for MPEG-4 Video 中并没有给出图。为了方便,或者为了避免一些无法解决的问题,该文献将MAD直接写入了二次率失真模型中,作为正比项存在,并一直主导着视频图像编码的码率控制算法。 在下通过大量的实验数据,绘制出了H.264中比特率与MAD的关系,甚至是预测MAD(JVT-G012线性预测方法)的关系图。从图中可以看到,在H.264中比特率与MAD的线性关系存在,但不明显,而且线性截距很大,不可忽略。比特率与预测MAD的关系可以用不相关三个字来形容。个中特点,各自揣摩。 谈一点我个人的看法: MAD如果统计的是运动估值后的残差信息,确实可以直接理解为图像的编码复杂度。因为这个时候的MAD已经带有双重特性:其一运动估值,其二残差。这个时候的MAD的表征对象就是马上用于变换编码和量化的基础。很多早期的文献对此都有评论,推导或改进。但是如果MAD不能直接取到的话,再用MAD的任何预测形式来做图像复杂度都是自欺欺人的做法。 “从二次模型的公式来看,对某个图像,给定QP时,BIts/MAD就是一个常数” 从在下的若干实验看来,BIts/MAD不会是个常数。原因很简单,BIts/(MAD+b)才是常数,b表示截距。我想 Scalable Rate Control for MPEG-4 Video 的作者是知道的,但是他不愿这样做,所以没有给出图。 另外特别注意,MAD和QP不独立,在H.264中。 十年放羊 写的“BIts/(MAD+b)才是常数”才是常数,这个很早就有文献,就是在二次模型中那个常数项是不能省掉的,我也做了这方面的实验,MAD确实与QP有关系,而且关系应该能用模型表示出来,应该可以进行理论推导 Q:JM86中关了RDO后 原始图像和运动预测补偿后的MAD怎么突然变的很大?是什么原因,我觉得应该变的小一点才是正确的 为什么差别那么大,RDO开着的时候是1点多 关掉的时候是 6点多, 不一定RDO最准确,RDO只是选择使代价最小的点作为匹配点,不一定是最匹配的位置,应该是开着RDO好一点,因为可以进行模式选择,对宏块进行细分 A:你说的对。RDO 最小并不是 MAD 最小。所以 RDO 跟 MAD 之间没有规律性。 Q:在编码中,P帧中也有使用帧内预测模式来进行预测编码的,那么在计算该P帧的MAD时,是否计算帧内预测模式下编码宏块的MAD值?在JM配置文件中有没有选项使编码P帧时只使用帧间编码模式,将帧内编码模式关掉,如果有是哪个参数呢?谢谢~~~~~ A:配置文件中没有,JM86 可以强制修改 encode_one_macroblock 函数中的 valid 变量 Q:JSVM9.17中,jsvmCalcMAD好像不是计算的MAD,是SAD啊,程序如下 unsigned int MbEncoder::jsvmCalcMAD( IntMbTempData*& rpcMbBestData, MbDataAccess& rcMbDataAccess ) { UInt uiDist = 0; UInt uiDelta = 1; Int n, m; IntMbTempData *rpcMbTempData = new IntMbTempData; rpcMbTempData->init( rcMbDataAccess ); rpcMbTempData->loadLuma ( *m_pcIntOrgMbPelData ); rpcMbTempData->loadChroma ( *m_pcIntOrgMbPelData ); XPel* pucDst = rpcMbBestData->getMbLumAddr(); XPel* pucSrc = rpcMbTempData->getMbLumAddr(); Int iStride = rpcMbTempData->getLStride(); Int iDeltaXStride = uiDelta * iStride; AOF( iStride == rpcMbBestData->getLStride() ); for( n = 0; n < 16; n += uiDelta ) { for( m = 0; m < 16; m += uiDelta ) { uiDist += abs( pucSrc[m] - pucDst[m] ); } pucSrc += iDeltaXStride; pucDst += iDeltaXStride; } delete rpcMbTempData; return uiDist; } 最后的uiDist应该再除以16*16才对吧 A:MAD,SAD都是衡量失真的准则,其作用就是用来做比较 如果每个块的sad都要除以16x16以后再互相比大小,不觉得这很多余么 SAD足矣,这里的确是计算的SAD而不是MAD Q:在264的码率控制中要用到MAD值,请问对于帧间和帧内编码的宏块其MAD值分别是怎么计算的?我在JM代码中看不太明白,有知道的朋友能给说说?谢谢了! A: I帧和第一个P帧用固定的Qp,不进行MAD值的预测,从第二个P帧开始,利用前一帧相同位置basic unit的MAD值线性预测当前basic unit的MAD值 Q: 我的意思是实际MAD值是怎样计算的? 对于帧间编码宏块 MAD=(原宏块像素值-运动补偿后的预测宏块像素值)/256; 对于帧内编码宏块 MAD=(原宏块像素值-帧内预测宏块像素值)/256; 我这样理解对吗? A: 对,在JM86代码的calc_MAD() 函数中 Q:都知道在二次模型中有MAD。但是为什么这里要用MAD。有没有文献或者数据的支持呢。为什么可以引入。无论是MAD还是SSD,有具体推导的过程吗 A:为某帧编码后大小也即Rate可以用MAD与QP的函数表达, 即 RATE=function(MAD,QP)q Q:在计算QP的时候,有RD的二次关系。但是RD二次模型的基础是图像复杂度相似的情况。D可以由QP表达。引入MAD是为了让图像scalable。 我想知道MAD引入有没有严格的理论证明。 A:是针对 R=X1*Q^(-1)+X2*Q^(-2)这个式子对吧. X1,X2表征和图像复杂度有关的变量, 实际操作中通过MAD计算, 我没有记错吧? 嗯....那个X1X2的部分我是有点记错了, 不过幸好不是错得很离谱, 式子应该是R/MAD_predicted=X1*Q^(-1)+X2*Q^(-2) MAD是用来近似描述图像复杂度的一个参数 (scalable这个词在这里怪怪的, 我不是很确定你用这个词在这里的意思), 实际编码不可能存在输入任何源固定一个Q的情况下编出来的比特数都一样嘛. 当然是和源的复杂度有关的. 至于描述复杂度也可以用其他参数, 如上面说的SSD. Q:Q:在JM的码率控制中,函数calc_mad()是用来计算一个宏块的MAD,而且这个函数encode_one_macroblock()中调用。我想使用前面已经计算过的相邻宏块的MAD,那怎么得到它的值呢?可有数组储存已经计算出来的MAD的值?还有,在JVT-G012中,MAD线性模型是用来预测基本单元的MAD的,那它能和一个宏块的MAD相加吗? A:当然有存储mad的数组了,自己跟踪代码,就能找到了。mad的和,本来就是为了计算每个bu的mad以及每帧的mad,当然要把每个mad加起来了。不过单纯的一个bu的mad加上一个不属于该bu的宏块的mad没有什么意义。 Q:请教各位大侠,在码率控制中有一部分要预测当前基本单元的MAD。一开始我以为是整个BasicUnit 总的MAD,但我看了代码后觉得好像是BasicUnit 中宏块的MAD。 请问到底怎么理解基本单元的MAD呢? A:是整个 BasicUnit 的平均 MAD。也就是 BasicUnit 中所有 MB 的 MAD 求和再平均。提案里就是这么提的,就这么做就可以了。 (第二人解释)最终得到的值,表示的是当前恢复图像的basic unit 与原始图像中对应的部分,平均每个像素值的差别. Q:在jvt-o12,jvt-h017提到的码率控制算法中,帧层码率控制和basic unit的码率控制时都要由前一帧的mad来预测 当前的mad,提案中采用的是线性预测,即: pred_mad = C0xprev_mad + C1 pred_mad:预测的当前帧mad; prev_mad:为前一帧的实际mad C0,C1为预测系数; 每次帧编码完成后,得到当前帧的实际mad,更新C0,C1; 我的问题是更新C0,C1具体是如何进行的. A:经过研究,还是不知道具体采用的了理论是什么,不过看明白了代码的做法.代码做法是对于每个线性预测关系 pred_mad = C0xprev_mad + C1; 两端乘以prev_mad ,得到 pred_madxpred_mad = C0xprev_madxpred_mad + C1xpred_mad; 以上两式连立,写成矩阵形式: B = AC; 其中 B为1x2,B0 = pred_mad,B1 = pred_madxpred_mad; A为2x2,A00 = 1,A01 = A10 = prev_mad,A11 = prev_madxprev_mad; C就是由待更新的C0,C1组成的1x2矩阵. 假设有n个A - B 的对应关系,则可以得到n个Bi = AiC(i = 1,2,,,n),将这些等式相加,得到总的SUM(B) = SUM(A)C; 再由克来母公式计算出C. Q&A说过无数次了,跟代码最接近的是 JVT-H017r3

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

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

相关文章

迷之骚缩写

搜集一些 GitHub 常见骚缩写&#xff0c;以备查询使用。 原文链接&#xff1a;LGTM? 那些迷之缩写 PR: Pull Request. 拉取请求&#xff0c;给其他项目提交代码LGTM: Looks Good To Me. 朕知道了 代码已经过 review&#xff0c;可以合并SGTM: Sounds Good To Me. 和上面那句意…

github设置中文_静态博客托管图片至 GitHub

从 MWeb 切换到静态博客 Jekyll 之后&#xff0c;我就面临一个问题&#xff0c;这在很久之前使用 Hexo 同样遇过的&#xff1a;图片托管在何处。MWeb 的解决方式很棒&#xff0c;直接插入图片&#xff0c;推送到 Github 后亦能正常引用并显示&#xff0c;无需图床或者借助第三方…

JavaScript中的正则

js正则 正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串, 正则表达式通常被用来检索、替换那些符合某个模式的文本 声明方式 普通字符 new RegExp();/hehe/转义字符 \w \W \d \D \s \S var reg /\w/;//单个的字母数字下划线 var reg /\W/;…

SQL注入【sqli靶场第23-28关】(七)

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 0、总体思路 先确认是否可以SQL注入&#xff0c;使用单…

Linq中string转int的方法

Linq中string转int的方法 在做批量删除时&#xff0c;需把一串id值所对应的数据删除&#xff0c;调试出现问题&#xff1a; Linq语句中如果使用ToString()进行类型转换,编译时不会报错,但执行时会出现如下错误&#xff1a; “LINQ to Entities 不识别方法"System.String T…

名称缩写第二波

1 公司内部 缩写 全称 中文 说明 PMproduct manager产品经理RDResearch and Development研发工程师FEFrontend Engineer前端工程师UEUser Experience用户体验设计师QAquality assurance质量保证&#xff0c;测试OP operator 运维工程师EEEngeering Excellence工程效率部ETEn…

php动态获取函数参数

PHP 在用户自定义函数中支持可变数量的参数列表。其实很简单&#xff0c;只需使用func_num_args() &#xff0c; func_get_arg() &#xff0c;和 func_get_args() 函数即可。可变参数并不需要特别的语法&#xff0c;参数列表仍按函数定义的方式传递给函数&#xff0c;并按通常…

漏桶算法与令牌桶算法

漏桶算法(Leaky Bucket)是网络世界中流量整形&#xff08;Traffic Shaping&#xff09;或速率限制&#xff08;Rate Limiting&#xff09;时经常使用的一种算法&#xff0c;它的主要目的是控制数据注入到网络的速率&#xff0c;平滑网络上的突发流量。漏桶算法提供了一种机制&a…

java linux 调用32位so_Linux上TCP的几个内核参数调优

Linux作为一个强大的操作系统&#xff0c;提供了一系列内核参数供我们进行调优。光TCP的调优参数就有50多个。在和线上问题斗智斗勇的过程中&#xff0c;笔者积累了一些在内网环境应该进行调优的参数。在此分享出来&#xff0c;希望对大家有所帮助。调优清单好了&#xff0c;在…

jquery中的选择器

jquery选择器 jquery用法思想 选择某个网页元素&#xff0c;然后对它进行某种操作 jquery选择器 jquery选择器可以快速地选择元素&#xff0c;选择规则和css样式相同 基础选择器 //通过id来获取元素 document.getElementById(); // $(#logo).css(border,solid 2px red); //…

【好文收藏】【持续更新】今天你机器学习了吗

✔数学建模常用模型23&#xff1a;马尔可夫预测方法_HaLosec_Wei-CSDN博客_马尔可夫模型预测法 ✔simhash算法及原理简介_lengye7的博客-CSDN博客_simhash ✔&#x1f44d;使用机器学习构建简单金融风控反欺诈模型&#xff08;一&#xff09;EDAXGBOOST - 知乎 Python机器学…

H.264码率控制机制

H&#xff0e;264标准码率控制算法步骤如下&#xff1a;1&#xff0e;计算当前帧的目标码字&#xff0c;并将其限定到HRD的边界中。2&#xff0e;通过线性模型(式4&#xff0e;5)预测当前帧中基本单元的MAD。 3&#xff0e;为未编码基本单元分配码字。4&#xff0e;通过二次R&a…

[dp]最长单调递增子序列LIS

https://www.51nod.com/tutorial/course.html#!courseId12 解题关键&#xff1a; 如果将子序列按照长度由短到长排列&#xff0c;将他们的最大元素放在一起&#xff0c;形成新序列$B\left\{ {{b_1},{b_2}, \ldots \ldots ,{b_j}} \right\}$&#xff0c;则序列$B$满足${b_1} &l…

jQuery中的元素操作

jQuery元素操作 通过jQuery可以操作控制元素的样式,文本,属性等 jquery样式操作 css操作行内样式 // 获取div的样式 $("div").css("width"); $("div").css("color");//设置div的样式 $("div").css("width",&q…

指针结构体函数-事实上能够这样具体理解

今天一大早登了下QQ空间&#xff0c;看到本科的一个学弟发表一篇日志。写关于西电微软俱乐部面试题的解答&#xff0c;写的非常不 错。我也一下子起兴了&#xff0c;由于我以前也是被指针困惑非常久。搞不清头绪&#xff0c;本科到研究生。我也笔试面试不下二十次 了。每次面试…

【python毕业设计】Django框架实现学生信息管理系统

Django框架实现学生信息管理系统 演示视频&#xff1a;Django学生信息管理系统_腾讯视频 演示界面内容如下 总体概括 注册流程 首先进行输入用户名&#xff08;邮箱&#xff09;、密码以及验证码&#xff0c;输入完之后点击注册按钮。如果输入的不正确&#xff0c;提示错误信…

python中continue只结束本次循环_循环(while,break,continue),转义字符

Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待 4999元包邮 去购买 >01. 程序的三大流程 在程序开发中&#xff0c;一共有三种流程方式&#xff1a; 顺序 —— 从上向下&#xff0c;顺序执行代码 分支 —— 根据条件判断&#xff0c;决定执行代码的 分支 …

码率控制技术原理

引起编码器的输出比特码率波动的原因主要有两个。首先&#xff0c;数字视频信号中包含了大量的时域和空域冗余&#xff0c;编码器的主要任务就是去除这些冗余。由于时间冗余和空间冗余是随机的&#xff0c;从而造成编码器输出比特率波动。另一个原因是变长编码&#xff0c;变长…

python如何安装pip

pip的安装操作 pip简介 pip 是一个现代的&#xff0c;通用的 Python 包管理工具。提供了对Python 包的查找、下载、安装、卸载的功能。 环境搭建 安装pip首先要安装python,可以参考python安装教程 安装完python后,可以在cmd中输入pip list 测试一下pip是否默认附带着安装,若…

【排序算法】python 十大经典排序算法(全网最详)

排序算法可以分为内部排序和外部排序&#xff0c;内部排序是数据记录在内存中进行排序&#xff0c;而外部排序是因排序的数据很大&#xff0c;一次不能容纳全部的排序记录&#xff0c;在排序过程中需要访问外存。常见的内部排序算法有&#xff1a;插入排序、希尔排序、选择排序…