轉載自:http://bbs.chinavideo.org/forumdisplay.php?fid=29 Chinavideo,一個非常棒的學習論壇
?
從答辯結束(2008-12-13)起就想寫一篇文章給學習運動估計的朋友們,因為我知道有很多正在寫論文的朋友們,特別是正在入門的朋友們,和我當時(2008-04-01)一樣正在忍受這空前的壓力和郁悶,但是自從答辯完一直事情比較的多,辦理各種手續,喝酒送同學等等一直耽誤到今天(2009-02-01)才寫,同時還要多感謝群主firtime,在我開始學習264的時候有很多的盲點,是他給我做了解答,同時增強了我繼續學下去的信心,當我答辯結束后告訴他,我順利通過了答辯而且獲得了優秀畢業論文的時候,他也非常的高興祝賀我,同時建議我把學習運動估計的這部分經驗寫出來,和264樂園的更多朋友們一起分享成功的經驗,一起學習進步。
?? 首先大致介紹一下我的情況:本人2006年9月考入國內一所一流工科大學,就讀控制科學與工程專業,2008年12月13號答的辯,結束了兩年零三個月研究生生活,兩年的時間內就休息了一個寒假,我們學校從入學的第二個學期開始是沒有寒暑假了直到畢業,對研究生生活做了個回顧,感覺還算成功,論文答辯獲得了優秀(公開答的辯,除了我們本校兩位導師外當時有兩位澳門大學和一位西交大的教授),在<電子學報>發表了一篇文章,獲得了優秀畢業生的榮譽,簽約單位是一家特大國有企業,也算是實現了自己當時考研的目標。我的兩年多的生活大致如下:
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年4到6月這兩個月是我最艱難的時期。考慮要不要繼續在公司實習下去,因為我和公司的實習協議是到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)、Mvfast、Pmvfast、search_ARPS、search_ARPS3、search_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: bsjpln@yahoo.com.cn
2009-02-04??深圳
備注:(1)如果感覺對你有幫助,就頂頂帖子,別讓他沉下去,讓更多的朋友一起分享,謝謝.
(2)看完有任何疑問的朋友們可以在這留言,或者直接發郵件聯系我都可以,大家一起討論一起進步.