cv演算法工程師成長路線

嵌入式視覺發表於2022-11-25

文章同步發於 github 倉庫csdn 部落格最新版以 github 為主。如果看完文章有所收穫,一定要先點贊後收藏。畢竟,贈人玫瑰,手有餘香.

本文內容為 cv 演算法工程師成長子路上的經典學習教材彙總,對於一些新興領域則給出了較好的部落格文章連結。本文列出的知識點目錄是成系統且由淺至深的,可作為 cv 演算法工程師的常備學習路線資料

文章所涉知識點和參考資料內容很多也很廣,建議先看目錄,心中有個大概知識點結構,後面由淺入深,慢慢學習各個知識點,由淺入深,切忌浮躁

部分學習資料存在離線 PDF 電子版,其可在 github倉庫-cv_books 中下載。如果倉庫失效,可以關注我的公眾號-嵌入式視覺,後臺回覆對應關鍵字下載高畫質 PDF 電子書。

前言

課程學習方法,三句話總結:

  • 看授課影片形成概念,發現個人感興趣方向。
  • 讀課程筆記理解細節,夯實工程實現的基礎。
  • 碼課程作業實現演算法,積累實驗技巧與經驗。

再引用一下學習金字塔的圖:

way_of_learning

圖片來源 github 倉庫 DeepLearning Tutorial

關於科研和研發的思考,可參考文章-中國人民大學趙鑫:AI 科研入坑指南

一,計算機系統

1.1,計算機系統書籍

  1. 《深入理解計算機系統第三版》: 網上有電子版,PDF 電子書下載方式在文章首頁。

1.2,設計模式教程

  1. 設計模式: 內容很全,存在 C++ 示例程式碼。

二,程式語言

2.1,C++ 學習資料

  1. cpp reference: C++ 庫介面參考標準文件,官方文件,包含各個函式定義及使用 example
  2. http://www.cplusplus.com/reference/stl/
  3. Cpp Primer 學習: 《C++ Primer 中文版(第 5 版)》學習倉庫,包括筆記和課後練習答案。
  4. C++ Tips of the Week: 谷歌出品的 C++ 程式設計技巧

2.2,Python 學習資料

  1. 《廖雪峰-Python3教程》: 內容很全且通俗易懂,適合初學者,但程式碼示例不夠豐富。描述的知識點有:Python 基礎、函式、高階特性、函數語言程式設計、模組、物件導向程式設計、物件導向高階程式設計、錯誤、除錯和測試、IO 程式設計、程式和執行緒、正規表示式、常用內建模組、常用第三方模組、圖形介面、網路程式設計、非同步IO 等內容。電子書可在github倉庫-cv_books 中下載。
  2. Python 工匠系列文章: 很適合深入理解 Python 物件導向程式設計、裝飾器、模組、異常處理等內容。

三,資料結構與演算法

3.1,資料結構與演算法課程

  1. 《圖解演算法》:存在 PDF 電子版,內容較為基礎且通俗易懂,適合快速瞭解資料結構與演算法的基礎知識,但深度不夠,示例程式碼為 Python
  2. 專欄-資料結構與演算法之美: 學習資料結構與演算法的知識點課程,內容全且深度足夠。官方例子為 java 程式碼,同時 github 倉庫提供 C/C++/GO/Python 等程式碼。

3.2,演算法題解

  1. 《劍指Offer》面試題: Python實現: 題目為《劍指Offer》書籍原題,程式碼實現為 Python,倉庫簡潔,閱讀體驗不錯,無任何廣告,適合剛學完資料結構與演算法基礎知識的同學。
  2. 力扣++-演算法圖解: leetcode 高頻題圖解,題解分析很多,部分題目有動畫分析,提供 Python/Java/C++ 實現,但也存在部分題解分析廢話較多,不夠精簡的問題。
  3. 小浩演算法: 一部圖解演算法題典,講解 105 道高頻面試演算法題目,go 程式碼實現。
  4. LeetCode題解: leetcode 高頻題題解,全書程式碼預設使用 C++11 語法編寫,題解為文字性描述,題解分析較短且不夠通俗易懂。本書的目標讀者是準備去矽谷找工作的碼農,也適用於在國內找工作的碼農,以及剛接觸 ACM 演算法競賽的新手。

四,機器學習

4.1,機器學習課程

  1. 《機器學習》-周志華(西瓜書):存在 PDF 電子版,內容很全,很適合打下紮實的基礎
  2. 《李宏毅-機器學習課程》: 機器學習經典影片教程啊,非常適合初學者觀看。
  3. 李宏毅機器學習筆記(LeeML-Notes): 可以線上閱讀,很方便,內容完成度高。
  4. 《南瓜書PumpkinBook》: 南瓜書,是西瓜書的補充資料,包含了西瓜書的公式的詳細推導,建議先看西瓜書,部分公式不會推導的情況下,可以檢視南瓜書的對應內容。
  5. 機器學習數學基礎: 黃海廣博士翻譯的 CS229 機器學習課程的線性代數基礎材料,英文好的建議看原版。

機器學習和深度學習的數學基礎的思維導航

五,深度學習

想要快速入門神經網路(深度學習)或者重新複習基礎的同學,推薦看這個文章合集Neural Networks From Scratch。文章內容由淺入深,既有公式推導,也有對應程式碼實現。

5.1,深度學習課程

  1. 《深度學習》(花書),存在英文和中文 PDF 電子版,內容成系統,覆蓋了深度學習的方方面面,強烈建議至少看完跟自己方向相關的章節,有利於打好紮實的基礎。
  2. 《李宏毅-深度學習課程》: 經典影片教程,例項有趣(皮卡丘),內容講解由淺至深,李宏毅老師個人官網也提供了影片連結、 PPT 課件、程式碼資料。

5.2,深度學習基礎文章

  1. CNN中引數解釋及計算
  2. 深度學習推理時融合BN,輕鬆獲得約5%的提速
  3. 動圖形象理解深度學習卷積

5.3,經典CNN分析文章

  1. 深度可分離卷積(Xception 與 MobileNet 的點滴)
  2. [DL-架構-ResNet系] 002 ResNet-v2
  3. ResNet及其變種的結構梳理、有效性分析與程式碼解讀

1,VGGNet 擁有 5 段 卷積,每一段有 2~3 個卷積層,同時每段尾部會連線一個最大池化層用來縮小圖片尺寸,每段內的卷積核數量相同,越靠後的段的卷積核數量越多:64-128-256-512-512。ResNet 網路擁有 4 段卷積, 每段卷積代表一個 殘差學習 Blocks,根據網路層數的不同, Blocks 的單元數量不同,例如 ResNet18 的 Blocks 單元數量分別為2、2、2 和 2。越靠後的段的卷積核數量越多:64-128-256-512,殘差學習 Blocks 內的卷積核通道數是相同的。

2,ResNet v2 創新點在於透過理論分析和實驗證明恆等對映對於殘差塊的重要性,根據啟用函式與相加操作的位置關係,我們稱之前的組合方式(ResNet)為“後啟用(post-activation)”,現在新的組合方式(ResNet v2)稱之為“預啟用(pre-activation)”。使用預啟用有兩個方面的優點:1)f 變為恆等對映,使得網路更易於最佳化;2)使用 BN 作為預啟用可以加強對模型的正則化。

5.4,PyTorch 框架學習文章

  1. PyTorch中文文件PyTorch官方教程中文版PyTorch 官方教程
  2. PyTorch_tutorial_0.0.5_餘霆嵩: 存在開源 PDF 電子版,且提供較為清晰的程式碼,適合快速入門,教程目錄結構清晰明瞭

5.5,PyTorch/Caffe 框架分析文章

  1. pytorch自定義層如何實現?超簡單!
  2. 【PyTorch】torch.nn.Module 原始碼分析
  3. 詳解Pytorch中的網路構造,模型save和load,.pth權重檔案解析
  4. 半小時學會 PyTorch Hook
  5. 詳解Pytorch中的網路構造
  6. 深度學習與Pytorch入門實戰(九)卷積神經網路&Batch Norm
  7. Pytorch 裡 nn.AdaptiveAvgPool2d(output_size) 原理是什麼?
  8. caffe原始碼解析-開篇
  9. 《Caffe官方教程中譯本》:存在開源 PDF 電子版。

六,計算機視覺

6.1,數字影像處理教程

  1. 《數字影像處理第四版》:存在開源 PDF 電子版。成系統的介紹了數字影像的原理及應用,內容多且全、深度也足夠,非常適合深入理解數學影像原理,可挑重點看。
  2. 桔子code-OpenCV-Python教程

6.2,計算機視覺基礎課程

  1. 《CS231 課程》-李飛飛。b 站影片教程CS231n官方筆記授權翻譯總集課程非常經典,內容深入淺出,每節課都有課後作業和對應學習筆記。
  2. 《動手學深度學習》-李沐,存在開源 PDF 電子書,官方程式碼為 MXNet 框架實現,github 上有開源的《動⼿手學深度學習 PYTORCH 版》
  3. 《解析卷積神經網路-深度學習實踐手冊》-魏秀參:對 CNN 對基礎部件做了深入描述,本書內容全且成系統,適合想深入學習 CNN 的同學,唯一的缺點沒有專案案例以供實踐。本書提供開源 PDF 電子版。

6.3,深度學習模型和資源庫

  1. Papers With Code
  2. Jetson Zoo
  3. ModelZOO
  4. MediaPipe 框架
  5. Deci's Hardware Aware Model
  1. Papers with code 是由 Meta AI Research 團隊主導的一個開放資源的社群,彙集了深度學習論文、資料集、演算法程式碼、模型以及評估表。
  2. Jetson Zoo,是一個開源目錄,其中包含在 NVIDIA Jetson 硬體平臺上開發指南以及參考案例分享彙總。模型庫資源裡包括影像分類、目標檢測、語義分割和姿勢估計等方向的實踐分享,提供開原始碼和開發指南文章的連結。
  3. Model Zoo 包含了機器學習各領域的演算法框架及預訓練模型資源彙總,其中包括 TensorFlowPyTorchKerasCaffe等框架,作者是 Google 的機器學習研究員的Jing Yu Koh構建。
  4. MediaPipe 是一個為直播和流媒體提供跨平臺、可定製的機器學習解決方案的框架。MediaPipe 提供了包括人臉檢測、人臉網格、虹膜識別、手部關鍵點檢測、人體姿態估計、人體+人臉+手部組合整體、頭髮分割、目標檢測、Box 跟蹤、即時運動追蹤、3D 目標檢測等解決方案。
  5. Deci 旨在使用 AI 構建更好的 AI,使深度學習能夠發揮其真正的潛力。藉助該公司的端到端深度學習加速平臺,人工智慧開發人員可以為任何環境(包括雲、邊緣或移動)構建、最佳化和部署更快、更準確的模型。藉助 Deci 的平臺,開發人員可以在任何硬體上將深度學習模型推理效能提高 315 倍,同時仍然保持準確性。平臺除了能夠顯示每個模型的準確性之外,還可以輕鬆選擇目標推理硬體並檢視模型的執行時效能結果,例如各種硬體的吞吐量、延遲、模型大小和記憶體佔用。但是模型加速模組的 demo 是需要註冊賬戶和購買的。

deci_modelzoo

6.4,目標檢測網路文章

  1. 一文讀懂Faster RCNN
  2. 從程式設計實現角度學習Faster R-CNN(附極簡實現)
  3. Mask RCNN學習筆記
  4. Mask RCNN 原始碼解析 (1) - 整體思路
  5. 物體檢測之Focal Loss及RetinaNet
  6. CVPR18 Detection文章選介(下)
  7. 2020首屆海洋目標智慧感知國際挑戰賽 冠軍方案分享
  8. 目標檢測中的樣本不平衡處理方法——OHEM, Focal Loss, GHM, PISA

6.5,語義分割文章

  1. 2019年最新基於深度學習的語義分割技術講解
  2. U-Net 論文筆記

6.6,3D 視覺技術文章

  1. 3D成像方法 彙總(原理解析)--- 雙目視覺、鐳射三角、結構光、ToF、光場、全息
  2. 關於雙目立體視覺的三大基本演算法及發展現狀的總結
  3. 3D視覺CV界的終極體現形式,計算機如何「看」這個三維世界

6.7,深度學習的評價指標文章

  1. ROC和AUC介紹以及如何計算AUC
  2. COCO目標檢測測評指標
  3. 如何評測AI系統?
  4. PLASTER:一個與深度學習效能有關的框架
  5. The Correct Way to Measure Inference Time of Deep Neural Networks

七,模型壓縮與量化

7.1,輕量級網路設計

  1. 輕量卷積神經網路的設計

網路結構碎片化更多是指網路中的多路徑連線,類似於 short-cutbottle neck 等不同層特徵融合,還有如 FPN 等結構。拖慢並行的一個很主要因素是,運算快的模組總是要等待運算慢的模組執行完畢

  1. ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
  2. ShufflenetV2_高效網路的4條實用準則
  3. 輕量級神經網路:ShuffleNetV2解讀

7.2,模型壓縮文章

  1. 解讀模型壓縮3:高效模型設計的自動機器學習流水線
  2. Deep compression: Compressing deep neural networks with pruning, trained quantization and huffman coding
  3. 韓松Deep compression論文講解——PPT加說明文字
  4. 論文總結 - 模型剪枝 Model Pruning
  5. 編譯器與IR的思考: LLVM IR,SPIR-V到MLIR

7.3,神經網路量化文章

  1. 神經網路量化簡介
  2. 線性量化
  3. Int8量化-介紹(一)
  4. Int8量化-ncnn社群Int8重構之路(三)
  5. ncnn原始碼學習(六):模型量化原理筆記
  6. 神經網路推理加速之模型量化
  7. NNIE 量化感知訓練

1,量化是指用於執行計算並以低於浮點精度的位寬儲存張量的技術,或者說量化就是將神經網路的浮點演算法轉換為定點。 量化模型對張量使用整數而不是浮點值執行部分或全部運算。

2,量化簡單來說就是將浮點儲存(運算)轉換為整型儲存(運算)的一種模型壓縮技術。

3,雖然精心設計的 MobileNet 能在保持較小的體積時仍然具有與 GoogleNet 相當的準確度,不同大小的 MobileNet 本身就表明——也許一個好的模型設計可以改進準確度,但同類模型中仍然是更大的網路,更好的效果!

4,權重值域調整是另一個機器學習過程,學習的目標是一對能在量化後更準確地執行網路的超引數 min/max

7.4,推理框架剖析文章

  1. 最佳化 TensorFlow Lite 推理執行環境記憶體佔用
  2. ncnn原始碼解析(五):執行器Extractor

八,高效能運算

8.1,CPU/GPU/AI 晶片科普

  1. 一文讀懂 GPU 的發展歷程
  2. CPU、GPU、NPU等晶片架構、特點研究
  3. 什麼是異構平行計算?CPU與GPU的區別是什麼?
  4. 看懂晶片原來這麼簡單(二):AI為什麼聰明?什麼是華為自研架構NPU?
  5. 【專利解密】如何提高AI資源利用率? 華為卷積運算晶片
  6. 嵌入式系統 記憶體模組設計

8.2,指令集(ISA)學習資料

  1. Intel® Intrinsics Guide
  2. Neon Intrinsics Reference
  3. ARM Neon Intrinsics 學習指北:從入門、進階到學個通透

NeonARM 平臺的向量化計算指令集,透過一條指令完成多個資料的運算達到加速的目的,或者說 Neon 是 ARM 平臺的 SIMD(Single Instruction Multiple Data,單指令多資料流)指令集實現。常用於AI、多媒體等計算密集型任務。

8.3,矩陣乘最佳化文章

  1. 移動端arm cpu最佳化學習筆記----一步步最佳化盒子濾波(Box Filter)
  2. OpenBLAS gemm從零入門
  3. 通用矩陣乘(GEMM)最佳化演算法
  4. 卷積神經網路中的Winograd快速卷積演算法
  5. 知乎專欄-深入淺出GPU最佳化
  6. CUDA GEMM 理論效能分析與 kernel 最佳化
  7. OpenPPL 中的卷積最佳化技巧:概述總結類文章,無程式碼,非專注時刻也能閱讀。
  8. 【張先軼】BLISlab學習最佳化矩陣乘。第一課
  9. 矩陣乘法與 SIMD

Winograd 是一種快速卷積演算法,適用於小卷積核,可以減少浮點乘法的次數。

九,模型部署(演算法SDK開發)

9.1,模型部署文章

  1. 海思AI晶片(Hi3519A/3559A)方案學習(二十五)初識 mapper_quant 和mapper_param
  2. 部署PyTorch模型到終端
  3. 多場景適配,TNN如何最佳化模型部署的儲存與計算
  4. 模型轉換、模型壓縮、模型加速工具彙總
  5. 深度學習模型轉換與部署那些事(含ONNX格式詳細分析)
  6. ONNX初探

效率工具

markdown/latex 寫作

  1. markdown語法大全: 這篇文章對 markdown 語法整理得很好,文章排版也做的好,讀完很容易就掌握 markdown 語法。
  2. 通用 LaTeX 數學公式語法手冊: 文章排版很好,目錄結構清晰明瞭,閱讀起來很舒服,推薦用來學習 latex 語法內容。
  3. https://latex.codecogs.com/eqneditor/editor.php: 線上 latex 語法。

部落格閱讀後的知識點總結

1,為了儘可能地提高 MAC陣列 的利用率以及卷積運算效率,陣列控制模組會根據第一卷積引數矩陣的行數和第一卷積資料陣列的行數來確定第一乘法累加視窗的列數。

2,SNPE 開發流程:

SNPE開發流程.png

3,目標檢測模型效果提升方法:

  • Cascade RCNN 作為 baseline,以 Res2Net101 作為 Backbone
  • Albumentation 庫做資料集增強-用在模型訓練中;
  • 多尺度訓練(MST Multi-scale training/testing)的升級版-SNIP方法(Scale Normalization for Image Pyramids),用在 baseline 模型訓練和測試中:解決模板大小尺度不一的問題;
  • DCN 可變性卷積網路-用在 baseline 模型的 backone 中;
  • soft-NMS:解決目標互相重疊的問題;
  • HTC 模型預訓練, Adam 最佳化演算法可以較好的適應陌生資料集,學習率熱身(warm-up)來穩定訓練過程。

4,SNIP 論文解讀:

SNIP 非常 solid 地證明了就算是資料相對充足的情況下,CNN 仍然很難使用所有 scale 的物體。個人猜測是由於 CNN 中沒有對於 scale invariant 的結構,CNN 能檢測不同 scale 的“假象”,更多是透過CNN 來透過 capacity 來強行 memorize 不同 scale 的物體來達到的,這其實浪費了大量的 capacity,而 SNIP 這樣只學習同樣的 scale 可以保障有限的 capacity 用於學習語義資訊。論文的關鍵貢獻:發現現在的 CNN 網路無法很好的解決 scale invariance 的問題,提出了一個治標不治本的方法。

5,高效模型設計(模型壓縮)方法:

一般而言,高效模型的設計有 6 大基本思路:1)輕量級架構、2)模型裁剪、3)AutoMLNAS 模型搜尋、4)低精度量化、5)知識蒸餾、6)高效實現。

來源曠世學術分享-張祥雨:高效輕量級深度模型的研究和實踐

6,網路深度與寬度的理解及意義

更多理解參考知乎網路寬度對深度學習模型效能有什麼影響?

在一定的程度上,網路越深越寬,效能越好。寬度,即通道(channel)的數量,網路深度,及 layer 的層數,如 resnet1818 層網路。注意我們這裡說的和寬度學習一類的模型沒有關係,而是特指深度卷積神經網路的(通道)寬度。

  • 網路深度的意義:CNN 的網路層能夠對輸入影像資料進行逐層抽象,比如第一層學習到了影像邊緣特徵,第二層學習到了簡單形狀特徵,第三層學習到了目標形狀的特徵,網路深度增加也提高了模型的抽象能力。
  • 網路寬度的意義:網路的寬度(通道數)代表了濾波器(3 維)的數量,濾波器越多,對目標特徵的提取能力越強,即讓每一層網路學習到更加豐富的特徵,比如不同方向、不同頻率的紋理特徵等。

7,所有 Inception 模型都具有一個重要的性質——都是遵循 拆分-變換-合併(split-transform-merge) 的設計策略。

8,對於某種指令,延遲 latency 主要關注單條該指令的最小執行時間,吞吐量 throughout 主要關注單位時間內系統(一個CPU核)最多執行多少條該指令。因為 AI 計算的資料量比較大,所以更關注吞吐量。

9,CPU 高效能通用最佳化方法包括:

  • 編譯選項最佳化
  • 記憶體效能和耗電最佳化:記憶體複用原則,小塊快跑是記憶體設計的重要原則。
  • 迴圈展開:迴圈的每次迭代都有一定的效能損失(分支指令)。但是現代 ARM 處理器具有分支預測的能力,它可以在執行條件之前預測是否將進入分支,從而降低效能損耗,這種情況下全部迴圈展開的的優勢就減弱了。
  • 並行最佳化和流水線重排:並行最佳化分為多執行緒核與核之間資料處理,以及單核心內部並行處理。從本質上講,流水線重排也是一種並行最佳化。

10,卷積效能最佳化方式:卷積的計算方式有很多種,通用矩陣運算(GEMM)方式有良好的通用性,但是僅使用 GEMM 無法實現效能最優。除 GEMM 外,常用的最佳化方法還包括滑窗(Sliding Window)、快速傅立葉變換(Fast Fourier Transform, FFT)、Winograd 等。不同的方法適合不同的輸入輸出場景,最佳的辦法就是對運算元加入邏輯判斷,將不同大小的輸入分別導向不同的計算方法,以最合適的方法進行卷積計算。

  • 大多數情況下,使用滑窗方法的計算效能還是無法和 GEMM 方法比較,但是一般當輸入小於 \(32\times 32\) 時,可以考慮採用滑窗的最佳化方式。
  • Winograd 是存在已久的效能最佳化演算法,在大多數場景中,Winograd 演算法都顯示了較大的優勢,其用更多的加法運算代替部分乘法運算,因為乘法運算耗時遠高於加法運算。Winograd 適用於乘法計算消耗的時鐘週期數大於加法運算消耗的時鐘週期數的場景,且常用於 \(3\times 3\) 卷積計算中。對於 CPU,一般來說,一次乘法計算消耗的時間是一次加法計算消耗時間的 6 倍。
  • FFT 方法不適合卷積核較小的 CNN 模型。

11,下圖展示瞭如何在英偉達 GPU 架構發展史以及單塊 GPU 上縱向擴充套件以滿足深度學習的需求(截止2020年)。

英偉達 GPU 架構發展史

12,Deep compression 論文閱讀總結

  • deep compression 是解決儲存問題,對於速度問題幾乎沒獲得改善;
  • 權值剪枝還得看另外一篇論文:learning both weights and connection for efficient neural network
  • CNN 模型的儲存空間問題,主要還是在全連線層,若要改善 inference 速度,需要在卷積層下功夫。

13,Deep Compression 論文介紹的神經網路壓縮方法,可分為三步:

  • 剪枝:捨棄權重絕對值較小的權重,並將剩餘權重以稀疏矩陣表示。
  • 量化:將剪枝結果進行進一步量化,具體的是構建一組權值碼本,使模型中的權值共享碼本中的其中一個權重值,以減少每個權重儲存所需的位元數。
  • 霍夫曼編碼(可選):透過霍夫曼編碼,進一步地壓縮索引值以及權重數值地儲存空間。

參考資料

  1. DeepLearning Tutorial

相關文章