牛人学习h264运动估计的方法

转载自:http://bbs.chinavideo.org/forumdisplay.php?fid=29 Chinavideo,一个非常棒的学习论坛

从答辩结束(2008-12-13)起就想写一篇文章给学习运动估计的朋友们,因为我知道有很多正在写论文的朋友们,特别是正在入门的朋友们,和我当时(2008-04-01)一样正在忍受这空前的压力和郁闷,但是自从答辩完一直事情比较的多,办理各种手续,喝酒送同学等等一直耽误到今天(2009-02-01)才写,同时还要多感谢群主firtime,在我开始学习264的时候有很多的盲点,是他给我做了解答,同时增强了我继续学下去的信心,当我答辩结束后告诉他,我顺利通过了答辩而且获得了优秀毕业论文的时候,他也非常的高兴祝贺我,同时建议我把学习运动估计的这部分经验写出来,和264乐园的更多朋友们一起分享成功的经验,一起学习进步。

首先大致介绍一下我的情况:本人20069月考入国内一所一流工科大学,就读控制科学与工程专业,20081213号答的辩,结束了两年零三个月研究生生活,两年的时间内就休息了一个寒假,我们学校从入学的第二个学期开始是没有寒暑假了直到毕业,对研究生生活做了个回顾,感觉还算成功,论文答辩获得了优秀(公开答的辩,除了我们本校两位导师外当时有两位澳门大学和一位西交大的教授),在<电子学报>发表了一篇文章,获得了优秀毕业生的荣誉,签约单位是一家特大国有企业,也算是实现了自己当时考研的目标。我的两年多的生活大致如下:
2006-09-01--2007-07-01
在学校上课,平时偶尔去实验室一下,修完了所有的基础课程。
2007-07-01--2008-10-01
在深圳一家知名电器公司全日制实习,同时完成了硕士论文。
2008-10-01--2008-12-01
忙碌与校园招聘找工作,签了工作单位。
2008-12-01--2008-12-13
完善修改论文,参加了毕业答辩。
2008-12-13--2009-01-01
休息,和同学告别,办理离校手续。

首先说说论文吧。我们的论文从开题到答辩周期为15个月,2007-10-12开题答的辩;2008-03-27中期答的辩;2008-12-03进行的预答辩;2008-12-13正式毕业答辩。说实话在写论文的过程中也给我郁闷坏了,我的论文换过三个题目,而且这三个题目几乎都是我自己定的,我的导师在香港,平时接触的比较少。因为我在公司全日制实习,而且和实习公司签定了实习协议,原则上是要写与公司项目相关的课题,公司有副导师来指导我的毕业论文,由于我进公司才三个月时间,但是一直没有参与项目。那三个月时间压力巨大,而且没有任何进展,后来开题的时候就写了一个关于服务器搭建方面的课题,没有配备任何软件代码和硬件资源,也没有工程师一起弄,就我一个人,我只好每天晚上去图书馆查阅资料,然后白天在公司象上自习一样的来看,研究写代码。三个月过去了,马上开题了,我不但没有参与上项目而且连论文写什么都没有,而且我的企业导师对我的论文不问不管,我问了他好几次他让我自己写,这与我们当时协议所约定的背道而驰,我非常的失望,只好靠自己来写。在匆忙之中写了一个关于方面的开题报告,由于我的专业是控制,开题答辩的时候导师也没有过多的发表评论,算是把开题给混过去了。

接下来就到2007-12月份后,经一个在职的师兄强烈推荐我才逐步的参与了公司的项目中,论文也就被放来下来,以前公司让我预演的关于p2p的项目也没有人问了,我就跟着项目走了,那时候真是尽心尽力,直到到2008-3-15中旬马上要中期答辩的时候,我的论文还没有任何进展,那时候公司项目又非常的紧张,几乎把每个周末都奉献出去了加班。不过在这个过程中,确实学到了不少东西,特别是软件编程方面有了很大的提高和领悟。直到中期答辩的前五天,我还没有任何东西拿去答辩。由于之前也查阅了一些与我们所做项目相关的硕士毕业论文,发现有写流媒体方面的,我也就加班加点用了大约一周的时间搞了个中期答辩报告,写的内容是RTSP/RTP两个协议的应用。答辩结果可想而知,被导师全盘否定了,不是因为做的时间短,而是导师认为选题不合理,没有理论深度,单纯地在公司做应用达不到硕士论文要求,建议可以做些有深度的东西。中期答辩结束已经是四月份了,就是说开题大半年过去了,我的论文没有任何进展,那个时候就非常的郁闷了。我们的正式答辩时间是2008-12月份,就是说我在公司继续实习做公司的项目,那么论文就很难写了,毕业都成问题。这个阶段是我读研期间最郁闷和压抑的时候,在公司有项目压力,在学校有毕业答辩的压力,论文连做什么都没有定,出路在那?公司只顾我给他们做项目,没有人管我的论文,学校导师认为我在公司实习,公司会负责我的论文,我就处在了这么一个两边都靠不上的尴尬处境。

2008
46月这两个月是我最艰难的时期。考虑要不要继续在公司实习下去,因为我和公司的实习协议是到10月份才结束,要继续实习下去可能论文做不出来,不继续实习下去提前回学校,一方面要毁约影响学校形象,另一个回学校了论文怎么做?谁来指导?就在这样的痛苦抉择中,我只好每天晚上去查找论文和文献调研,自己给自己选择论文题目。白天继续在公司做公司的项目,在这个过程中,我慢慢的发现了视频编码和解码这个点。因为我们公司做的产品的解码部分都是黑盒的,买的别人的方案,我想能否把解码部分的代码给做出来,搞成白盒的,所以就了解到了视频的压缩标准-H.264。下载了n篇这个方面的论文,一看就傻眼了,因为我不是通信专业的,对这个方面没有任何基础,连一点基础都没有,很多专业术语都看不懂,很受打击,那时我实在是没有路可走了,或许搞这个编码解码是我最好的出路了。然后就硬这头皮在下班后和周末加班加点的看,看了几本基础教材,象信息论,数字电视原理等等,算是扫了下盲点,这个大约花费了一个月的时间。到五月份了,在这个同时我也加入到了h.264乐园这个群,给予了我很大的帮助,特别是firstime写的<H.264学习指南>一文,对我的整个学习有了比较好的宏观指导,还有和群中一些朋友的讨论让我增强了继续做下去的信心。接下来的一个月也就是五到六月份这个阶段,我还是在读264的标准和白皮书(H.264/MPEG-4 Part 10 White Paper)之类的东西,最重要的就是老毕的那本书,还有一本外国很经典的教材H.264 and MPEG-4 Video,还有一个264语法语义,中文和英文都有,我当时还打印出来了,看的云来雾去的,一点收获都没有,就是知道我今天我还是感觉初学者别读这个东西了,这个东西就是讲解也很乱,还不如自己去看代码呢。

这样,时间已经到了六月份了,加上白天要上班,晚上还要看264,我也是实在厌倦了这种生活,六月份的时候从公司请假一周,去西安旅游了一趟,算是给自己放个假,调节一下心情,因为再这样在深圳呆下去我感觉自己都要崩溃了。等到我再开始看264的时候已经是六月中旬了,因为十月份还要出去找工作,就是说我就剩三个半月就要把论文做出来,做不出来就死定了,那时候压力非常的很大。264这个东西太大了,虽然我看了将近两个月的理论了,但是还是老虎吃天——不知道从哪下手。我知道我们导师他们有个特点就是喜欢有数学公式的东西,特别是算法,所以我就开始琢磨从哪个点入手呢?在看了大量的论文和听取了一些网友的建议后,我决定从帧间预测着手,也就是将研究的重点定位到了运动估计这块上。虽然知道一些大的概念,但是对运动估计算法的具体意义是一点都不理解,特别是我在初期看那些算法的图都看不明白,上面都是黑色的小点,还有搜索的路径,无法理解。在这样自己一个人无法入门的情况下,我给我们学校一个微电子专业的导师打了个电话,给他描述了我现在的基础和状态,我说我想搞运动估计这块,他给了我两点建议:(1)可以继续做运动估计算法。其实当时我一点都没有做呢,连深入的研究都没有做。(2)最好在答辩之前发表一篇论文出来,级别低点也没有关系,因为我做的这个东西我们导师不懂,所以怕答辩的时候被卡。他的两点建议是很不错,给了我当时继续研究下去的信心和勇气,但是有一点让我不理解的就是因为我当时对264的基本概念有很多盲点,我很希望和一个专业的人员讨论一下,扫除一下盲点,希望他能介绍他的一个学生给我认识,我也就是问点基本的概念,并不会涉及他们的研究成果,结果让我失望的是这个导师没有同意,说他的项目都是公司的,有一定的保密性。虽然他没有给我介绍认识他的学生,但是他的两点建议还是对我帮助很大的,我也很感谢他。

正在我非常迷茫的时候,一个关键性的人物给了我很大的帮助,他就是我所请教的那个导师的一个学生,经我一个师弟介绍我们认识了。认识他真是件很愉快的事情,第一天晚上就和他讨论了很多问题,更可贵的是他把jm10.1版本的代码怎么来调试,怎么来配置参数给我讲解明白了。这可帮大忙了,不但我基本知道了运动估计算法理论怎么来看,而且还和代码对应了起来,此后的一段时间内,我和他经常讨论,进步是神速的。我首先研究的算法是最经典的非对称十字型多层次六边形各点运动估计搜索算法(简称为UMHexagons)。这个算法是由清华大学几个牛人提出的,已经被H.264标准正式采纳。首先研究这个算法是因为JM代码中有这个算法的标准实现。这个算法看理论不怎么难,但是用算法真实的实现起来感觉还是有点难,代码量不小,而且很多参数的意义根本搞不明白。我就盯这代码的理论描述和代码的语言具体实现死抠,通过调试打印看参数值来推测他们所代表的意思,终于有了一点的收获。因为这个算法是整合了以前好几个简单的算法,要想把这个算法研究透彻,必须去深入地研究以前的小算法,结合在群的共享中下载的代码<各种运动估计算法代码>学习,其中包括全搜索算法(FS)、三步搜索算法(TSS)、梯度下降搜索算法(BBGDS)、四步法(FSS)、菱形搜索算法(DS)、六边形搜索(HEXBS)MvfastPmvfastsearch_ARPSsearch_ARPS3search_CDHS等。只有把这些算法仔细的搞清楚了,才能在这些算法的基础上有所创新和突破,通过设置JM10.1 配置encoder_baseline.cfg中的参数UseFME的值来决定选用那种算法。
1)当UseFME = 0时表示不用快速搜索算法,而是用最原始的全搜索(FS)算法。提供这个算法的主要目的是为了方便大家做研究用,可以将自己优化的快速搜索算法的图象质量和全搜索算法的图象质量进行比较,从而知道自己优化后的算法对图象质量大小的影响;
2)当UseFME = 1时表示用UMHexagonS搜索算法。这个算法的代码写得很规范,也是我们做运动估计应该重点研究的算法,因为这个算法是在前人研究的基础上进行了深度的整合,把六边形搜索、菱形搜索算法都揉和了进来,同加加入了很多实验经验终止条件,大大提高了搜索的效率而且保持了图象质量, 把这个算法的来龙去脉搞清楚非常有助于我们后面的研究;
3)当UseFME = 2时表示用Simplified UMHexagonS算法。这个算法是对UMHexagonS算法的一个简化,大致研究下就可以了;
4)当UMHexagonS = 3时表示用EPZS搜索算法。EPZS(Enhanced Predictive Zonal Search)是一种预测搜索算法,该算法选择更多的预测矢量和多模式搜索路径,企图从几个非常可能的矢量中预测最佳运动矢量。EPZS是一个比较新的搜索算法,建议现在做运动估计的同学可以好好对这个算法研究下,研究下这个算法能写篇高质量的论文出来没有问题。

在看理论的时候结合代码把我上面说的一些基本的算法要搞清楚。我说的这个搞清楚,不是你拿个笔能把算法的流程画出来,而是你需要能把这个算法用语言实现出来,屏蔽JM代码中所提供的搜索算法在JM10.1跑起来,就是说用你编写出来的代码替换掉人家原运动估计部分的代码,然后测试比较,同时用解码器解下看你编出来的码流是否正确。到这个程度之后就表明你已经基本具备了进一步研究的能力,可以开始正式的写你的论文算法了。

在此补充说明一下,JM代码是很大的,如果你想把整个代码看一遍再做自己想研究的是可以的,但是我估计你会看得很艰难,看完后可能也是晕晕的。但是这也有好处,最起码你对基本的编码流程能有一定的了解。而且有些同学和我当时的想法估计是一样的,就是想先把代码看通了再去仔细地研究自己想弄的那部分。这个想法是好的,但是实施起来非常的难,因为JM就一个编码部分就非常的大,而且整个编码过程是由很多个模块组成的,全看明白不太可能,一方面时间有限,另一方面也必要,我们要有侧重点的看。所以笔者建议搞运动估计这部分的同学,下面几个文件你是一定要看,而且要看明白,因为运动估计代码都要涉及这几个文件:mv_search.h, mv_search.c, fast_me.h, fast_me.h, epzs.h, epzs.c, mode_decision.h, mode_decision.c。因为整个编码流程是比较复杂的,我们就只关心我们研究的这个点,把码流在此拦截了,然后做个详细研究。所以请研究运动估计的同学一定仔细的把我所说的这几个文件看一下,对你会很有帮助的。还要提醒大家的一个问题就是:刚开始弄这个东西或者是已经研究了一段时间而没有耐心研究下去的朋友们,总是希望从别人那要一份优化后的代码来看看别人是怎么优化的,然后自己再下手。其实这个想法在一般情况下是可行的,但是在这是不可行的,为什么这么说呢?其实我开始也是这么想的,在网上找了很久也没有找到。从我做完论文,我的体会就是即使给了你代码,你也看不明白他到底哪里修改了,哪里没有修改,除非是你对我上面说的几个文件已经看的很熟练了,你才可能会看出来哪里被修改了,但是你也不知道他为什么这么修改,理论支撑点在那,所以我建议有这样想法的朋友如果时间还够,就别这么想投机取巧了还是老老实实自己研究,一方面为了答辩另一方面也为了培养自己的科研能力,这个过程非常重要。

有了上面的基础,证明你已经入门了,接下来的工作就简单了,可以把你看见的理论算法用程序语言在代码中实现出来了,可以在前人的基础上做点你自己的工作了,那么此时你可以自己设计一个算法出来,也可以在前人的基础上来优化改进算法。此时对你最有帮助的文献就是查找一些近一两年发表的这个方面的高质量文章,笔者建议你去IEEE下载,有不少好文章,不建议你看中文的,中文的比如你下的优秀硕士论文,可以作为你将来写论文时候的参考,看下大致的格式,章节安排什么的,千万别去看那上面的算法,很多都没有太大的价值。在IEEE上下二十篇左右的文章就够了,那么怎么利用这些文章来帮助你完成你的算法实现呢?笔者建议你仔细阅读这些文章,这些文章一般分为两大类:一类是原创的,一类是在本文前面介绍的经典算法基础上做的优化,前者一般是作者提出了一个全新的算法,给出了整个算法的流程和测试结果,和其他现有算法的比较,这种原创性的一般比较难。后者就比较简单点了,因为你已经掌握了我所说的把理论转化为代码的方法和能力,那么现在读起文章来就比较简单了,一篇一篇地研究,最好把你认为容易实现的先在代码中跑起来。笔者发现下载到的文章基本都能在JM代码中跑起来,这样你把你下载的文章研究一遍大约需要一个半月的时间,在这个过程中你的收获会非常大的。等你把这些研究完了,你的论文也基本就做出来了,为什么这么说呢?因为在这个过程中,你对前面经典的算法都理解了,而且你又在看这个领域国际上最新的研究成果,那么你会结合你所研究过的所有的东西整合出来一个算法或者对前面的算法做一个更好的优化,这样任何一种方法都可以作为你的论文了。或者你也可以写篇文章来发表一下,能走到这一步就恭喜你,你的论文做出来了,可以让你的导师去看,基本可以顺利通过答辩了,笔者回顾了以下自己写作论文过程:
2008-04-06
调研论文到底做什么,最后定位到了视频编解码方面,补充了一些基础知识。
2008-06-07
通过对整个编码流程的了解,选择了最容易突破和出成果的运动估计部分作为研究的切入点。
2008-07-09
完成了对以前经典算法的研究和对当前这个领域所发表的最新论文的学习,把握了当前的研究进展,完成了算法的优化工作。
2008-09-15
在导师的鼓励下把自己的研究成果写成了文章,投递到了<电子学报>,前几天得到了被录用的消息。
2008-09-30
完成了硕士毕业论文书写,这个过程其实就纯属整理了,不需要什么思考,按学校要求的格式来弄就行了。

笔者最后需要补充几点:
1)就是你要想做264编码方面的研究,首先需要需要对编程(C语言)比较熟悉,有良好的编程功底。如果没有这个,那么你很难把算法用语言实现出来,因为在这个实现过程中很多的时候需要你自己添加一些变量(全局或者局部)或者独立地写一些函数出来,所以C功底不好的朋友,可以再加强一下。
2)在这个过程中有两个关键的概念:一个是空间预测,一个是时间预测,也就是中值矢量和时间矢量如何获取,他们两个之间的关系,需要朋友们不但从理论上理解他们而且在代码中要灵活应用。
3)由于我发表的文章暂时还没有正式的刊登出来,所以我的毕业论文和优化后的代码暂时不能公开,希望朋友们多谅解。

论文的整个完成过程肯定是不容易的,或许你正在承受很大的压力,前进的途中怀疑自己。我可以肯定的告诉你,这都是正常的,你正在向成功一步一步靠近,当你完成你的论文的时候,你不仅仅是硕士毕业了,而且你学来了一套独立研究问题、思考问题、分析问题、解决问题的能力,这个是最重要的,也是你读硕士最宝贵的收获,它会让你一生受益的,不管你将来是继续读博士还是参加工作搞工程,这套思想和方法会让你在成功的路上走的更快更好,朋友们,努力吧。


作者联系方式:qq:94083698 (灌蓝高手流川,请注明是h.264学习者,谢谢)
E-mail:
[email protected]
2009-02-04
深圳


备注:(1)如果感觉对你有帮助,就顶顶帖子,别让他沉下去,让更多的朋友一起分享,谢谢.
   (2)看完有任何疑问的朋友们可以在这留言,或者直接发邮件联系我都可以,大家一起讨论一起进步.

你可能感兴趣的:(学习)