如何节省 1TB 图片带宽?解密极致图像压缩
歡迎大家前往云+社區,獲取更多騰訊海量技術實踐干貨哦~
作者:Gophery
本文由?騰訊技術工程官方號?發布在云+社區
圖像已經發展成人類溝通的視覺語言。無論傳統互聯網還是移動互聯網,圖像一直占據著很大部分的流量。如何在保證視覺體驗的情況下減少數據流量消耗,一直是圖像處理領域研究的熱點。也誕生了許多種類的圖像格式JPEG、PNG 、GIF、WEBP、HEVC,以及騰訊公司自研的WXAM和SHARPP格式。
騰訊TEG - 架構平臺部圖片存儲系統TPS 作為超大規模的圖片平臺,圖片數萬億張存儲量百P,下載帶寬數T,一直需要嚴重關注圖像壓縮技術的發展。本文就近幾年圖像壓縮技術的發展、新格式的出爐,和圖片存儲系統TPS在實際業務上的落地實踐做個簡單的介紹。以及在不斷出現的新格式被逐步應用之后,兼容性最好的傳統老格式JPEG依然地位高居不下占據大幅帶寬,如何在老格式上也繼續挖掘優化點,是本文重點介紹的內容。在開始介紹之前先大概總結下各個格式在兼容性、圖像大小以及編解碼性能上的優勢和劣勢。
Webp和HEVC的面世
JPEG、PNG、GIF在互聯網暢行了多年后,2010年Google提出了一種新的圖片壓縮格式 — webp,給圖片壓縮優化提供了一個新方向。Webp相比JPEG多了一個預測模式,在相同ssim得分下,有損WebP相比可減少25%~34%的大小,有損WebP也支持透明通道,大小通常約為對應PNG的1/3。
借助Webp的開放性和平臺兼容性,互聯網的推廣應用變得很暢順,這是webp相比JPEG2000和JPEGXR能取得成功的關鍵原因。Chrome和opera瀏覽器都支持webp,它們占據了一半的瀏覽器市場份額,另外Android系統 4.0以上版本也默認支持webp格式。
在這個背景下,TEG架構平臺部圖片存儲系統TPS,快速推出了webp解決方案,如下圖所示。并在QQ相冊、微信朋友圈、微信公眾號、QQ看點、騰訊新聞、騰訊視頻等公司絕大多數的圖片業務開啟使用。總共節省了超過500G的帶寬,每年成本節省額度大幾千萬元。
?
很快,HEVC/H265到來了,它是當前最新一代的視頻編碼技術,基于該標準壓縮出來的圖片大小可降到JPEG的46%,動圖相對gif甚至可以降低到原來的20%大小,這相比webp又有了極大的提升,這個節省量可以說是相當可觀了。但相應的,它的編解碼速度相比jpg要差非常多,處理延時大同時設備資源消耗量也非常巨大。于是騰訊微信團隊和SNG音視頻團隊經過大量研究和開發工作,分別推出了自研的性能業界領先的高效圖片壓縮內核WXAM和SHARP,不犧牲壓縮的情況下,編解碼速度數倍于知名開源工程x265,甚至超過了webp。
?
為了進一步提升處理速度,我們甚至對它們的編碼在FPGA硬件卡進行實現,進一步降延時降低到了cpu的1/4以內。
雖然WXAM/SHARP并沒有外界的瀏覽器支持,但公司內的各大手機app都推動進行了解碼庫封裝來支持解析,圖片存儲系統進行適配輸出后,又一次優化掉了將近500G的帶寬,年化收益大幾千萬。
JPEG優化之路
WEBP/WXAM/SHARP紛紛落地之后,統計公司業務的圖片帶寬,JPEG帶寬占比仍然超過1/3。原因主要有,各類不兼容這些格式的瀏覽器、不便進行改造的app、其他不可控的第三方過來的訪問。再統計騰訊云的萬象優圖產品的帶寬,外部業務的JPEG甚至超過了90%,終端兼容門檻始終是個很大的障礙。
那在JPEG帶寬上我們還能做些什么呢?
通常圖像處理服務在編碼JPEG圖像時會調整圖像量化表,以減少圖像的大小,即通過降低圖片質量值的方式。我們根據不同業務要求設置不同的質量參數,還對特定圖片做降級處理,比如二維碼為主體的圖片,降低更多質量并不影響查看體驗。但這些畢竟還是容易肉眼可見的有損調整,于是就有了基于人眼視覺特性來對JPEG做進一步壓縮的guetzli,它可以讓JPEG圖片平均減少30%的大小。壓縮效果不比webp差,卻沒有webp的解碼端兼容性問題。
采用傳統方法處理圖像調整圖像質量為85,得到處理后圖像大小為48403字節。
?
Libjpeg編碼圖像:進行心理視覺編碼得到圖像大小為32449字節
?
guetzli編碼的圖像:采用心理視覺方法編碼出的圖像,肉眼無法感知其差異,其大小是libjpeg編碼圖像的67%
基于心理視覺的方法
1.? 編碼原理
年初google發表了關于使用心理視覺來進行圖像處理的guetzli論文,在該文中描述了相關優化的主要依據:
- 人眼錐細胞敏感光譜的重疊,RGB三個通道之間是有聯系的,黃色光會降低藍色光的敏感度,因此黃色區域附近的藍色可以使用低精度編碼
- 人眼的藍色空間分辨率低于在紅色和綠色,并在高分辨率旁邊沒有藍色的受體因此藍色的高頻變化可以使用低精度編碼
- 視覺圖像中的精細結構依賴于附近視覺變化的量級,因此可以在有大量視覺噪音的地方使用低精度編碼
下圖展示了人眼對黃色區域附近的藍色不敏感(圖像引用自guetzli論文)
?
黃色背景上的hello world!文字不易被觀察,將上圖分別采用libjpeg和guetzli編碼后,將藍色通道轉換為灰度圖如下圖所示:
?
上半部分jpeg編碼針對黑色背景和黃色背景,藍色通道均采用相同的精度保存,而下半部分guetzli編碼藍色在黃色背景下存儲時采用低精度的編碼。
guetzli編碼圖像處理過程主要分為以下三個大的迭代過程:
- 第一次迭代,取得最優的全局量化表
- 第二次迭代,計算每個塊中的哪些系數可供消零(低分辨率部分),且消零后視覺評價體系上圖像無差別
- 第三次迭代,將第二次迭代的消零序列,進行消零嘗試,先進行大幅度消零計算其得分和文件大小,然后根據文件大小適當回調消零的系數
因為有了這些消零的部分,使得圖像相對于原圖在編碼時產生更多的連續的0,這樣在進行游程編碼時能夠減少數據量。
原始處理過程:
?
2.? 性能優化
Guetzli處理過程有非常多次的大小迭代,計算量極大, 加上google官方的版本未進行太多的優化,存在大量重復計算以及流程冗余。Guetzli單圖計算消耗,相比jpeg編碼高出兩個數量級,呈百倍關系。處理延時遠遠超出在線使用的可承受范圍,更關鍵的是,設備消耗過大。按分辨率500x500的圖片來看,平均處理一張延時10秒以上,單圖必須被下載1000次節省下帶寬成本才能抵消一次的處理設備成本消耗。隨著圖片分辨率增大,延時上升到分鐘級甚至小時級別,非常驚人。
?
為了能夠在現網應用,需要對算法進行移植改造提升其處理速度。圖像處理的過程中的很多計算是可以并行的,那么利用GPU來并行化加速處理,很自然的成為了我們的解決思路。和SNG增值產品部開發運維團隊組成公司圖片業務的Guetzli落地推廣的聯合項目:實現了算法優化改造,并線下進行了千萬級別的圖片測試驗證,確定了機器選型和資源調度上線。這里的主要優化和效果如下:
- Jpeg圖像采樣方式較多,而官方版本僅支持420與444采樣格式,為支持所有的采樣,我們在應用中擴展了圖像編解碼函數,采用libjpeg-turbo進行圖像數據解碼,完整支持所有jpeg采樣,同時ibjpeg-turbo相對于libjpeg在編解碼上做了一定的優化,能夠提升解碼過程的性能。
- 由于視覺評價體系中大量計算是分別針對圖像三個通道進行處理,同時也會將圖像按照不同的塊進行分割計算以及圖像卷積操作,單個塊或者通道計算量大,所有塊或通道需要重復上百萬次計算,計算過程完全相同且塊與塊之間的計算相對獨立不會有相互的影響。那么這些計算過程能夠并行,我們擴展了butteraugli視覺評價體系,將這些繁復可并行的計算全部移植到GPU上能大幅減少計算延遲。
- 在第二次迭代計算可供消零的系數過程中,當消零后的圖像誤差超過了允許的全局誤差之后,后續的可供消零序列將變得不再有意義,我們將計算過程提前終止掉,這樣去除了后續大量的無效冗余運算,從計算流程上減少了編碼延遲。
- 算法實現中大量采用雙精度進行計算,我們支持將雙精度調整為單精度加速計算過程,減少雙精度帶來的大量性能消耗,不過由于精度上的損失會使得輸出結果與官方工具有些差異,但是精度的損失反映到圖像上的影響微乎其微。
- 由于圖像大小在一定的范圍內波動,圖像數據通常在數百KB內波動,圖像需要連續的內存、顯存空間,那么優化內存、顯存使物理內存空間上連續能夠提高內存讀寫速度。利用tcmalloc替換glibc的內存管理,提升主機端內存訪問性能。應用內池化顯存能夠減少設備驅動的調用,提升圖像大數據塊的分配和釋放性能。這樣優化后能夠減少內存和顯存的碎片、由于內存連續也提高了訪問性能。
- 在計算處理過程中有許多冗余函數來生成固定的參數序列,將這些函數合并或預處理展開后減少計算流程上的函數調用冗余。
- 從主機內存到設備顯存的數據拷貝是需要經過PCIE總線,數據拷貝帶寬受到GPU物理布局方式以及PCIE總線帶寬兩方面的影響,那么針對一些較小分辨率的圖像,為了平衡傳輸延遲和計算延遲,我們按圖像分辨率將計算拆分,圖像大于某一分別率之后計算延遲遠遠超過傳輸延遲時,這部分計算轉移至GPU上進行,否則在CPU上完成計算。
- 現網實際應用中,在GPU上提供異構計算服務時同樣有一些需要注意的地方,為了避免GPU空閑時驅動程序釋放設備導致新應用啟動時長過長,我們需要將設備持久化保持在驅動程序中。
- 為了避免在GPU上部署應用時創建GPU Context的性能開銷,應用應該僅在啟動時創建GPU Context后續所有計算均在同一Context上使用不同的流來完成。合理的使用流能夠有效提升GPU吞吐。
- 圖像處理過程對GPU設備的利用是一個波動的狀態,而單個進程通常不能完全有效的利用GPU,為了提升GPU利用率,提升編碼集群的吞吐量,需要部署多個應用進程綁定到同一GPU,具體綁定數量需要考慮顯存大小與實際應用的GPU利用率。
改造后的平均處理延時下降到原來的10%以內,下圖GI1和G6代表改造的庫跑在GPU設備上的延時,M10表示改造前的官方庫的延時。
?
3.? 業務落地
經過上述改造后,已經有望上線服務業務了。我們對當前圖片平臺架構做了部分調整:采用異步壓縮,持久化存儲,控制CDN緩存時間的方式來貼合業務使用。基本架構如下圖所示:
?
guetzli下載架構
1. 源站需要根據當前圖像的格式以及緩存時間靈活的設置CDN緩存時間
2. 編碼集群要根據其處理能力和請求時間合理的處理請求
下載流程如下:
?
guetzli下載流程
1. 當緩存命中后,需要判斷緩存圖像是否已經編碼過,若在編碼周期內,則向CDN前端返回臨時緩存。否則返回持久緩存
2. 若緩存沒有命中,則從存儲系統中查詢落地的編碼圖像,若落地圖像不存在,則將原圖返回給CDN設置臨時緩存,同時異步發起圖像編碼。若已存在則直接將圖像返回給CDN且持久緩存
4.? 業務落地現狀
針對當前webp/wxam/sharpp無法覆蓋的場景,采用心理視覺的圖像處理方法,能夠在保證圖像質量的前提下,大幅減少圖像大小,節省用戶流量并提升下載體驗。上述方案已經在QQ增值業務、騰訊視頻、QQ音樂、QQ看點、LOL視頻官網中心等業務上進行了應用,騰訊視頻、微信公眾號、頭像等適合落地的圖片業務也在測試中。騰訊云的萬象優圖產品,也可以在控制臺一鍵開啟。
?
這些優化紛紛落地后,總共節省上T的帶寬,用戶下載延時減少20%以上。未來還會有更多的發展。2017下半年IPhone又新推出了HEIF格式,并對iphone7以上支持硬編解,讓IOS對hevc的兼容提供了重大便利,隨著ios11的普及,預計未來眾多圖片業務會朝著heif格式收攏。圍繞節省用戶和服務器帶寬,以及提升用戶下載體驗的目標,我們會繼續前行,讓帶寬壓到最小,讓圖片越來越清晰。
相關閱讀
android 中圖片壓縮分析(上)
服務億級圖片壓縮那些事
騰訊云開放自研tpg轉碼服務,大幅提升業界圖片壓縮率
此文已由作者授權騰訊云+社區發布,轉載請注明原文出處
?
?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的如何节省 1TB 图片带宽?解密极致图像压缩的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux系统的学习经验首篇
- 下一篇: 一个身份证号码验证接口[2]