分析說明整體結果,並由訂出未來可進行的方向。
第二章 背景介紹與文獻回顧
在本章的內容之中,將以無線膠囊內視鏡中演算法的技術作為輕量化視訊壓縮的流 程基礎來進行說明,圖 2.1 為整個輕量化視訊壓縮演算法的架構圖。從 2.1 節開始,將 從影像格式 bayer pattern 開始,逐步介紹這個系統中各個部份用到的技術。在第 2.3 節 裡面,將詳細介紹兩種熵編碼演算法。在 2.4 節中將介紹碼率預估演算法的文獻回顧。
第 2.5 節將簡述系統中利用的位元率控制演算法。
4x4 Integer Transform
Rate Control
bit stream Intra Prediction
(DC mode)
Quantize Entropy Coding Image Capture
圖 2.1 輕量化視訊壓縮演算法流程圖
2.1 膠囊內視鏡取像格式
膠囊內視鏡的影像捕捉方式是透過單片色彩濾鏡的旋轉在 CMOS 感應器上的每個 像素點紀錄不同顏色的值。紀錄的排列方式如圖 2.1 中,左上角的彩圖所示。即取像畫 面上,G 平面的取樣像素資料會呈現對角線的排列,而在不同的列中,在分別對 R 平 面和 B 平面取樣。因為人類視覺系統對 G plane 的變化較為敏銳,且 G plane 的能量 在自然界中所佔的比例也比其他的兩個顏色較高,所以 RGB 三者取樣的資料量比為 1:2:1。
在我們的演算法中,對於影像感應器(image sensor)捕捉的 raw image 不先經過解馬 賽克(Demosaicking)的運算做像素三原色補色,也不將補色後的彩色像素做色彩空間轉 換(Color-Space Transform)。即不把彩色像素 R、G、B 三原色轉換成 Y、Cb、Cr,而是 直接進行壓縮,這樣可以減少執行色彩空間轉換的功率消耗。
2.2 H.264/MPEG-4 AVC 畫面內估測的壓縮演算法
接下來的幾個部份所用到的基本方法都是參考於 H.264/MPEG-4 AVC[8]中使用的技 技術。在標準中,基本的畫面估測方式有兩種:分別為畫面內估測(intra prediction),和畫 面間估測(inter prediction),為了延長電池使用時間,所以整個壓縮流程不採用會消耗功 率很大的畫面間估測而只使用畫面內估測。
2.2.1 畫面內估測 (Intra prediction)
畫面內估測的原理主要是利用當前編碼區塊周圍的資訊去建立一個預測區塊,然後 只壓縮兩者的差值。當預測區塊的值越接近編碼區塊時,兩者相減所得的殘餘資料量會 越低,而壓縮率會越高。H.264 的基本編碼單位區塊為巨方塊( macroblock : MB),在 4:2:0 取樣格式下的話,一個巨方塊由 1 個 16×16 的亮度區塊和 2 個 8×8 的彩度區塊所組成。
而亮度區塊和彩度區塊可以切割成的最小尺寸為 4×4。在膠囊內視鏡系統中,因為色彩 空間不是使用 YUV,而是使用 bayer pattern,所以我們的最小編碼區塊的尺寸就直接設 為 4×4 以方便壓縮,而這樣也省去要壓縮巨方塊檔頭的資料量。在建立預測區塊的內容 時,主要是利用已經編碼過,然後再重建完的相鄰編碼區塊的內容去猜測。這裡的相鄰 區塊是該編碼區塊上方、右上方和左方的編碼區塊,因為編碼順序的關係,所以這三個 單位的像素內容在要壓縮當前區塊時已經是重建過後的資訊,即解碼端對應的資料。猜 測的方式是利用上方、右上方和左方編碼內容去重建一個預測區塊。圖 2.2 為[1]中所提
到相鄰像素值的關係圖,圖中的 a 到 p 為要猜測的像素值位置,而 A 到 L 則是相鄰的 編碼區塊已知像素值位置。
圖 2.2 相鄰像素值的關係圖 節錄自[1]
在標準中,針對不同的編碼單位尺寸有不同的猜測方式可供選擇。對一個 16×16 巨 方塊有 4 種模式可供選擇,而 4×4 編碼單位有 9 種方式可供選擇,這 9 種方式列於表 2.1 中,而圖 2.3 為[1]中各模式對應的猜測方向。
表 2.1 畫面內估測的模式 節錄自[1]
圖 2.3 各種模式的猜測方向 節錄自[1]
2.2.2 整數轉換 (4×4 IntegerTransform)
因為傳統壓縮標準中的離散餘弦轉換(discrete cosine transform,簡稱為 DCT)會帶 來硬體上實現的麻煩,所以在 H.264 中,為了簡化複雜度,提出了整數轉換。整數轉換
近似離散餘弦轉換的整數轉換則寫成為:
2.2.3 量化 (Quantization)
在整個壓縮編碼的流程之中,經過畫面內估測後的殘餘值資料經過整數轉換之後,
會在經過量化這一個步驟,才把資料傳給熵編碼端。量化步驟在整個壓縮中所扮演的角 色是利用量化值去調整壓縮的品質。當使用較大的量化值,會讓殘餘值的資料變的較 少,可以讓壓縮率上升,但因為資料表示位數減少的關係而有較大的失真,這會導致影 格解壓縮回來之後的品質下降,反之亦然。
在 H.264 的標準中,定義了 52 個量化值,如表 2.2 中所示,每個量化值 QP 都可以 對應到一個真實的量化參數Qstep。當 QP 相差 6,則Qstep值為兩倍的增減。
QP 0 1 2 3 4 5 6 7 8 9 10 11 12
Qstep 0.625 0.6875 0.8125 0.875 1 1.125 1.25 1.375 1.625 1.75 2 2.25 2.5
QP 13 14 15 16 17 18 19 20 21 22 23 24 25
Qstep 2.75 3.25 3.5 4 4.5 5 5.5 6.5 7 8 9 10 11
QP 26 27 28 29 30 31 32 33 34 35 36 37 38
Qstep 13 14 16 18 20 22 26 28 32 36 40 44 52
QP 39 40 41 42 43 44 45 46 47 48 49 50 51
Qstep 56 64 72 80 88 104 112 128 144 160 176 208 224
表 2.2 QP和 Qstep對應表
整個量化的步驟可以如(2.5 式)所示:
(2.5) )
/ ( ij step
ij round X Q Y =
其中,Xij為經過整數轉換後在矩陣中的係數,Qstep為前頁所提到的量化參數,而
Y 為量化後經四捨五入的係數。 ij
2.3熵編碼
熵編碼的功用主要是去除編碼符號間的重複性,按照符號出現的機率,用預先設計 好的碼字去置換符號,而碼字的長度會和符號的出現機率成反比,以達成壓縮的功能。
在本節中,將詳述兩種熵編碼的演算法,而在 2.3.3 小節中將介紹關於兩種熵編碼的碼 率預估演算法。
2.3.1 內容適應性變動長度編碼法(CAVLC)
CAVLC 的設計原理和視訊壓縮標準 MPEG-2、MPEG-4 所用的熵編碼是類似的 [20]。在轉換步驟中,不論採用的是離散餘弦轉換或是整數轉換,經過量化後的 4×4 的 殘餘值區塊之中,其係數值會出現一種特別的分布,即非零整數值會分布在區塊的左上 角,而左上角在物理意義上代表低頻的部份,相對的,區塊的高頻部份,即右下角的部 份,係數值的絕對值通常是比較小的,或是值都為零。
CAVLC 的壓縮原理是將一個 4×4 的殘餘值區塊以反向的之字型(zigzag)順序掃出,
將 16 個元素排成一維向量(1×16)。而這個向量可以用一些預先設計好的統計量來描述,
因為在解碼端可以利用這些統計量的值還原成原本的殘餘值區塊。這些統計量即為 CAVLC 定義的編碼符號。對於編碼符號,CAVLC 會根據相鄰區塊的統計值分布,適應 性地去選擇編碼表格來壓縮。
在一個 4×4 的殘餘值區塊之中,CAVLC 需要的統計量和對應的編碼符號為:
編碼符號 統計量
coeff_token 非零係數的個數、連續 1 的個數 trailing_ones_sign_flag 連續 1 的正負號
level 非零係數的絕對值和正負號
total_zeros
非零係數間所夾的零的個數 (第一個非零係數和 最後一個非零係數之間) run_before 兩個非零係數間所夾的零的個數 表 2.3 CAVLC 所用的編碼符號和統計量
而它們的編碼順序則如下面圖 2.4 所示:
圖 2.4 CAVLC 編碼 4×4 殘餘係數區塊的流程圖
每一個編碼符號都有自己的編碼表格。在編碼每個符號時,除了要具備前面所列表 2.3 的統計量之外,在適應性地調整編碼表格時所用的參考統計量亦不同,如下面表 2.4 所示。也就是在編碼時,除了該編碼符號的值之外,其它同一個係數區塊內的編碼符號 值也會參考到,而也有可能要參考不同係數區塊內的編碼符號。
編碼符號 參考統計量
coeff_token MB 類型,上方和左方係數區塊的 非零係數的個數
level 同一矩陣編碼過的最大係數絕對值 total_zeros 非零係數的個數
run_before 剩下的係數間零的個數 表 2.4 編碼符號需要的參考統計量
CAVLC 編碼範例[1]:
圖 2.5 上面方格中為一個 4×4 殘餘係數區塊原始內容,經過反向之字形掃描的向量列在 下面,而 Bitstream 為壓縮結果。
圖 2.5 CAVLC範例 節錄自[1]
2.3.2 內容適應性二元算術編碼(CABAC)
下圖 2.6 是[17]中所提到的 CABAC 編碼流程圖,CABAC 在編碼的步驟上可以分為 三個步驟。這三個步驟分別為二元轉換、機率模型選擇、和最後由虛線所框起來的二元 算術編碼。CABAC 和 CAVLC 一個不同的地方是 CABAC 除了會去編碼量化過的 4×4 殘餘係數區塊之外,也會對一些檔頭資料進行編碼,像是 MB 類型,移動向量,參考影 格等等。在本節中將詳細介紹 CABAC 的三個步驟。在我們的系統中,因為檔頭資料統 一使用 Exp-Golomb Coding 編碼,所以在這裡會著重在殘餘係數區塊的編碼。
CABAC 把基本的編碼符號稱為符號元素(syntax element,在圖 2.6 中簡稱為 s.e)。符 號元素在資料結構上可能是一個位元或是一個整數。經過二元化之後,符號元素將被轉 換成一個符號位元序列(bin string),該序列由符號位元所組成,而位元值為 0 或 1。
CABAC 編碼的方式則是以符號位元(bin)為單位進行編碼,每一個符號位元會有一個預 設的機率模型可以使用,符號位元在經過編碼後,會根據實際編碼的值去更新機率模型 的值。而機率模型預測的結果越準確,CABAC 就可以得到更高的壓縮效率。
圖 2.6 CABAC編碼符號位元的流程圖 節錄自[17]
2.3.2.1 二元轉換
因為符號元素在資料結構上可能是一個位元或是一個整數。所以並不是所有的符號 元素都要經過二元轉換。要做二元轉換的原因是因為 CABAC 對壓縮連續出現的相同 0 或 1 可以較佔優勢,所以當符號元素以原本的二進位表示時,其二元出現的機率較難以 預測時,即會進行二元轉換以轉換成適當的符號位元序列以方便機率模型預測,而會進 行二元轉換的符號元素在標準中是規定好的。
二元轉換的方式是將符號元素的值以另外一種二元的編碼來表示。編碼的內容皆為 0 和 1 的序列。而編碼的方式有下列六種。
Unary code
當符號元素的值為 n 時,所對應的 unary code 為由 n 個`1'和 1 個`0'所組成。
Truncated unary code
truncated unary code 轉換的規則和 unary code 很像。但是額外加了一個門檻值 x 當符號元素的值 n 小於 x,所對應的 truncated unary code 為由 n 個`1'和 1 個`0'所 組成。而當 n 大於或等於 x 時,則所對應的 truncated unary code 為由 x 個`1'所組成。
Fixed-length code
fixed-length code 就是直接使用符號元素原本的二進位表示。