華為在上月發布了P20 Pro和P20, 在當天公布的DxOMark手機攝像上排行名列前茅, 並且領先幅度並不是1分2分, P20 Pro比之前的榜首三星Galaxy S9 Plus高了10分, 可以說完全不是一個紀元, 而是領先了一到兩個時代. 當然P20 Pro的1/1.73英寸的CMOS規格難免有些欺負人, 但1/2.7英寸 CMOS的P20相比Galaxy S9 Plus, Pixel 2僅僅是規格稍高, 然而其成像畫質也有明顯優勢, 那這個優勢是由何而來的呢?
攝影畫質的提升是有兩個思路, 一個是暴力拚硬體, 如採用更大面積更大像素的CMOS, 增加機械的光學防抖, 更大光圈;而第二個思路則是軟實力: 演算法和優化.
第一個思路的典型案例是三星Galaxy S9 Plus, 之前的Galaxy S8相對Galaxy S7拍照基本只是原地踏步, 而Galaxy S9 Plus率先使用了全新帶有DRAM的三層堆棧的1.4µm CMOS, 但這個僅僅是拍照提升的次要因素, 真正大進步的主要因素是光學組件的大躍進, Galaxy S9 Plus突破性的採用了F1.5的超大光圈. 但使用這樣大的光圈是需要付出很高代價的, 首先F1.8以上的大光圈生產難度很大, 良品率很低, 導致鏡頭模組生產成本很高, 第二個是光圈過大, 在明亮場景會使得映像過曝, GS9甚至引入了物理可變光圈來解決了這個問題, 這樣大大提升了攝像組件的複雜度, 降低了可靠性.
另外一個思路就是軟體演算法上的優化, 這個典型案例就是Pixel 2, 12.2MP, 1.4µm pixels, f/1.8單攝像頭的硬體規格並不算很誇張, 但還是可以壓倒iPhone X等一票硬體怪物, 這就得益於DeepLab-v3+演算法. 這個演算法是基於AI的深度學習自然網路, 可以對景物進行即時分析, 識別目標場景內容, 進行優化. 並對場景進行HDR+處理, 在一定程度避免過曝情況的發生. DeepLab-v3+演算法最看門的絕技是單攝像頭通過演算法實現景深拍照, 這樣的功能實現需要大量的編碼和解碼操作, 進行多次取樣和轉換, 運算量十分巨大. Google Pixel 2為了實現該功能甚至還專門開發了一顆名為Pixel Visual Core的加速晶片來進行演算法處理, 這個加速晶片的FPU浮點性能是Apple A11 Bionic的五倍. Google還看上去大公無私地將DeepLab-v3+演算法進行了開源, 免費給全世界分享. 當然Google這樣做也是有自己小算盤, 一方面, 可以充分利用開源界的免費開發資源繼續完善, 另外一方面其主要競爭對手高通驍龍835/845的AI性能還不如A11, 並且跑不動這套需要極高性能的演算法, 於是自以為不用擔心, 別人單有演算法也沒有足夠性能的硬體來來實現.
P20樣片對比和分析
但在這個問題上Google卻失算了, 華為麒麟970率先內置了NPU處理器, 可以提供足夠的性能來實現與此同級別的基於深度學習的演算法, 用來提升拍攝的畫質表現. 基於深度學習的AI演算法是如何提升畫質表現的, 讓我們從DxO的對比樣張來看看. (對比圖片來源: https://www.dxomark.com/huawei-p20-pro-camera-review-innovative-technologies-outstanding-results/, 具體對比原圖可以在這個頁面查看)
低光照和防眩光
這是一個典型的夜景場景, 華為P20 Pro左下角的黑色頂棚還原真實, 而iPhone X和Pixel 2明顯過曝, 右下的街燈iPhone X和Pixel 2也有明顯眩光. P20 Pro通過深度學習對場景進行偵測, 很大程度避免了過曝情況的發生. 而右上角的樹枝華為P20 Pro細節更好, 但也沒有由於過度銳化而導致躁點上升, 這也是大面積感測器更好高感光度+後期演算法共同作用的結果.
變焦和光學防抖
我曾經天真地認為底大就是正義, 雖然這點在DSLR領域是正義, 但在手機領域並不是如此. 之前索尼/魅族曾經採用1/2.7英寸的大底感測器, 但也是由於大底, 在手機空間就無法為其加上OIS光學防抖, 結果得不償失, 我一度認為大底和光學防抖, 如魚與熊掌不可兼得.
而華為P20 Pro則創新地引入AIS功能, 使得其可以兼顧大底CMOS和光學防抖. 其大概的工作原理是通過三號攝像頭取景判斷手持的運動趨勢, 然後再通過AI後處理通過多幀穩定演算法進行防抖, 完成了我一度認為不可完成的任務.
人像場景
國外品牌手機的人像和美顏拍攝一直都是落後於國內品牌, 究其原因是不夠上心, 國內對於人像和美顏的痛點更為迫切, 迫使國內的手機廠商在這方面有更多的投入. 而華為充分利用自己的技術優勢, 通過AI深度學習演算法對人物面容進行3D面容識別, 並對皮膚和色澤進行優化增強, 上面樣張P20 Pro顯得更為紅潤動人. 由於人物是即時變動的, 需要即時將映像並通過同之前神經網路深度學習結果進行分析比對, 變成3D面容資訊, 然後再進行優化, 即時處理的運算量還是很大的.
HDR場景
這張場景是人像, 但是逆光, 窗外的場景亮度過高, iPhone X的窗外嚴重過曝, Pixel 2過曝控制較好, 而P20 Pro控制更為完美, 同時室內人物又沒有過暗. 由於深度學習的場景積累使得對於這樣明暗差異大的複雜場景進行分割判斷, 設定不同的曝光策略, 麒麟970強大的NPU性能使得這些處理更為遊刃有餘.
雙攝最開始的用途就是副攝作為景深感測器獲得場景的深度資訊, 通過多幀合成和後期處理的方式形成景深效果. 但在AI時代之前的演算法, 對於前景和背景的識別區分存在問題, 特別是比較複雜的植被, 邊緣部分就容易出現瑕疵.
景深效果和邊緣判斷
而基於AI深度學習之後的場景判斷, 由於大量場景的數據積累使得相機對前後景的判斷更為精確, 邊緣部分的分割更為精細, 但又不會出現上面不支援AI雙攝複雜邊緣處理不當的問題.
整體而言, 麒麟970的NPU對19類500多個場景進行機器學習的訓練, 如貓狗, 食物, 人群, 微距, 夜景/文本, 花卉, 藍天, 雪景, 沙灘等都有相應的優化方案. 實現這樣的功能需要大量的數據積累, 在即時拍照的時候也需要通過神經網路對大量數據進行處理, 因此對於演算法和運算能力提出了很高的要求. 華為P20的DXOMark登頂不僅僅是植根於CMOS和光學組件的優勢, 更有優秀的演算法來錦上添花. 而優秀演算法需要強大的算力來保證, 麒麟970的NPU功不可沒.
針對AI深度學習的需求, 華為頗有前瞻性地在麒麟970研發之初就加入了NPU獨立單元.
前面提及, 映像處理核心工作是場景分析識別, 這個工作有兩個階段. 第一個階段是訓練, 需要給予大量的樣本通過卷積神經網路Convolutional Neural Network進行學習分析, 這個訓練的過程可以是在移動設備本地進行, 也可以是到雲端大型伺服器去操作, 但後續的新照片, 分析判斷就基本只能在本地完成. 雖然這隻是單個全新樣本的分析, 但也需要和之前積累數據進行比對, 並將這個分析歸納到機器學習成果之中. 並且這個卷積神經網路Convolutional Neural Network過程要進行大量的分支判斷過程, 這需要強大的FP16浮點處理能力.
高通驍龍845的所謂 'NPU' 是Hexagon 685, Hexagon 685隻是之前Hexagon 682的小改. 嚴格的說, 這個只算是DSP, 而不是像麒麟970和A11那樣真正意義上的NPU, 只是簡單化的向量處理單元, 並且這個DSP計算能力還有可能被其他任務佔用. 驍龍845中更為複雜的AI機器學習任務依然需要GPU甚至是CPU來實現, 而這樣的代價是巨大的.
這個是TechInsights的麒麟970核心圖, 我們可以發現A53小核下方是NPU晶片區域, 目前移動SoC中, 僅有Apple A11和麒麟970有真正意義的NPU.
AI和深度學習不僅僅是硬體問題, 移動AI處理是一個軟硬結合的多層次系統項目. 最上層是應用層, 其下是API作為應用層和硬體層的交互應用介面. 目前Android平台中AI加速的API主要有兩個: 一個是Google官方的Android AI Runtime, 類似Windows下的Direct Compute, 軟硬體相容性好, 是行業規範;另一個是華為的HiAI, 這個是麒麟獨有的API. 類似NVIDIA的CUDA, 雖然硬體上有限制, 但效率更高. 在API層下面還有一個HiAI異構資源管理系統, 分配任務給下面的硬體層. 下面的硬體層可以是NPU, 也可以是GPU, CPU, DSP, 甚至是ISP.
這說明AI不是一定只能跑在NPU上, 其他CPU, GPU, DSP什麼也都可以, 但在性能和效率上卻有著根本性差別: GPU性能是CPU的4倍, 而NPU則是CPU的25倍. 除開絕對性能, 能耗比的差距更為明顯, NPU相比GPU和CPU有高達8倍和50倍的差距. 這對於電量捉襟見肘的移動設備而言, 這完全可以說是有本質的差距.
麒麟970用NPU對物品進行即時識別, 性能可以達到16GFlops的運算能力, 單個處理耗時僅為32ns, 而工作電流僅為300mA, 相比動輒幾瓦的CPU和GPU而言是十分的綠色.
從魯大師的AI性能測試我們可以看出麒麟970相對驍龍845的開發機性能優勢明顯. 魯大師的AI測試包含了InceptionV3, Resnet34, VGG16 3個項目, 這3個測試項目是使用三種不同演算法分別識別100張圖片, 通過耗時對性能進行評估. 這三種演算法基本是目前訓練人工智慧識圖的神經網路僅有的三種演算法, 非常有代表性, 可以說是當前AI深度學習演算法的全部. 這三種演算法中, InceptionV3更多是依賴CPU和GPU, 麒麟970和驍龍845兩個平台差距不大;而Resnet34, VGG16在演算法上更為先進, 可以充分利用NPU的性能優勢, 因此在後面兩個測試項目上帶有NPU的麒麟970性能優勢明顯.
特別是VGG16演算法, 其包含看13個卷積層和3個全鏈層結合的16層結構, 十分合適NPU. 這個演算法的計算精度是FP16, 而CPU的發射都是FP32, 有更高精度. 但用來處理FP16時, 單個發射還是只能處理單個FP16, 這樣資源就會嚴重浪費. 因此對於VGG16這種以FP16為主的計算, 對FP16優化過的NPU更為高效, 可以更充分地利用資源.
有公司甚至在吹驍龍660的AI性能, 但驍龍660的Hexagon 680 DSP根本沒有FP16計算能力, 那AI是靠什麼來算?CPU還是GPU?的確它可以跑AI, 我們也不能責難它虛假宣傳, 只不過性能和功耗不好看而已.
在AI之前的時代, 提升攝像畫質對於沒有底層研發實力的品牌並無明顯門檻, 只需要捨得多花幾美元找索尼爸爸買更好的CMOS, 再忍受更低的良品率硬上大光圈, 套用高通或者三星的公版ISP演算法折騰折騰, 也可以做出不錯的拍照手機. 然而在AI到來以後, 傳統思路就不再行得通, 單純的比拼硬體頂多使沒有底層研發實力的品牌可以攢出不錯的硬體. 但如果在基於AI深度學習的智能演算法上存在缺失, 就會使得產品理念完全落後. 兩個梯隊的差距就被拉開, 繼而出現鴻溝, 最終很難跟上頂級AI企業的水平.
而擁有演算法研發實力的公司境遇雖然略好, 可以參與進AI深度學習的遊戲. 但這些公司缺乏晶片級的研發能力, 在上遊晶片提供商不能提供足夠NPU算力產品的情況下, 也只能怨天尤人而勉強跟隨.
因此, 現在有AI機器學習開發能力的企業能算是二流, 但有晶片研發能力和平台生態構建的企業才是頂級. 華為在底層有麒麟品牌作為基礎, 中間有HiAI和開發機作為平台支援, 上層更有消費級的電子產品和軟體應用直接同終端客戶接觸, 這樣的生態體系就是一個健康可持續發展的AI生態. 對於消費者而言, 基於深度學習的AI只是個黑盒, 用戶並不需要去了解其工作原理和方式, 只需享受其美滋滋的成果即可. 而華為麒麟就是這種美滋滋的幕後英雄, 她的努力訓練將會使得以後我們的生活變得更為美好.