萬字長文帶你入門計算機視覺!

萬字長文帶你入門計算機視覺!

新智元報道

作者:派派星

【新智元導讀】

計算機視覺入門門檻低,再加之圖片影片更具有趣味性且易於理解,隨著越來越多的人湧入了AI這個圈子,CV方向就顯得更加的捲了。小卷怡情,大卷傷身,強卷灰飛煙滅。正所謂人在CV圈,哪有不被卷?

導讀

CV技術棧

在這個AI大爆發的時代,彷佛只要與人工智慧沾邊的工作便顯得高大上起來,與之相反的便是被大多數網友們痛批的一無是處的

生化環材

專業。雖然AI為我們的生活增添了許多便利,但是隨著越來越多的人湧入這個圈子,也導致了整個AI圈迅速膨脹。

計算機視覺

,相對比自然語言處理這個領域來說入門門檻會稍微低些,而且圖片影片相對於文字來說也更具有趣味性和易於理解。然而,這也會導致CV圈越來越卷,透過知乎相關熱門問答便能體會到:

2016年——深度學習的春天是不是要來了?

2017年——人工智慧是不是一個泡沫?

2018年——演算法崗是否值得進入?

2019年——如何看待演算法崗競爭激烈,供不應求?

2020年——如何看待演算法崗一片紅海,諸神黃昏?

2021年——如何看待演算法崗灰飛煙滅?

CVHub有云,小卷怡情,大卷傷身,強卷灰飛煙滅。正所謂人在CV圈,哪有不被卷?正因為如此,我們如何才能在這個浮躁的環境中沉下心來,選定一條合適自己的學習路線,從千軍萬馬中脫穎而出,榮登時代的C位呢?這便是本篇文章誕生的目的,本文旨在構建最完整的CV學習路線,幫助大家早日從“調參俠”的包袱中脫離出來,成為一名真正合格的演算法工程師。

本文將從以下三大維度為大家逐一展開介紹。

萬字長文帶你入門計算機視覺!

offer公式

軟基礎

軟基礎,可以理解為技能棧,它是支撐整個發展路線的核心。

數學與英語基礎

相信對於任何一個理工科的學生而言,數學的重要性是不言而喻的。因此,掌握好數學基礎,有助於我們更好地理解其它知識以及為後面的學習做鋪墊。然而,數學領域所涉及到知識可謂非常廣泛,如果漫無目的的看,可能對於90%的人來說第一關就已經

從入門到放棄了

。下面,我們將給出計算機視覺領域所涉及到的一些數學基礎,對於需要重點掌握的知識我們均會提及一下,其餘未涉及到的知識點可視個人時間精力和研究方向自行查閱相關資料:

微積分

《微積分》是現代數學的基礎,也是支撐後續幾門數學分支的重要基石。顧名思義,微積分裡面包含的兩個核心元件便是微分和積分。其中,與微分比較接近的概念便是

導數

,熟練的計算導數有助於我們後面推導整個梯度下降的過程。其次,掌握

上確界

下確界

的概念有助於我們理解諸如Wasserstein距離,它作為一種損失函式被應用於WGAN以解決訓練不穩定的問題。此外,有涉及到GAN方向的同學也可以理解下

Lipschitz連續性

的概念,它對提高GAN訓練的穩當性分析具有不可替代的作用。而對於基礎的深度學習原理來說,我們更多的需要掌握的概念是:

梯度、偏導數、鏈式求導法則、導數與函式的極值&單調性&凹凸性判斷、定積分與不定積分

。最後,我們可以著重理解下

泰勒公式

,它是理解各種最佳化演算法的核心。

線性代數與矩陣論

《線性代數》是工科生的必備基礎。由於計算機現有的運算方式大都是基於平行計算的,無論是機器學習或者深度學習模型來說,資料都是以矩陣或者向量化的形式傳入的。因此,我們首先要明白

線性空間、向量、標量、矩陣、範數、秩

的概念以及著重掌握矩陣和向量的基本運算方式,這對於我們後面理解一些網路模型結構,如自注意力機制是非常有必要的。此外,對於後面涉及到的機器學習演算法學習,我們還應該理解

特徵值、特徵向量以及矩陣的正定

概念,同時也應該掌握

特徵值分解

(主成分分析和線性判別分析等)以及

奇異值分解

(正太貝葉斯分類器及主題模型等)。矩陣論則是線性代數的進一步昇華,所要掌握的重點知識為

矩陣分解、線性變換、相似矩陣、歐式空間、正交矩陣、對稱矩陣、正定矩陣

機率論與資訊理論

《機率論與數理統計》是工科生數理基礎的三把斧之一,也是支撐整個機器學習與深度學習原理的核心理論。機率論,本質上是用於描述對不確定性的度量,深度學習本質上也是透過網路進行學習,最終對輸入影象計算出一個機率值。對於這門課,我們需要重點掌握的概念有:

隨機變數、機率分佈、條件機率、統計與假設檢驗、機率密度及質量函式、貝葉斯公式、期望、方差、協方差

。此外,我們還需要重點掌握一些常見的分佈函式,如

0-1分佈、二項分佈(伯努利分佈)、幾何分佈、高斯分佈、指數分佈、泊松分佈

。最後,我們還應該重點理解

最小二乘法、最大似然估計、指數移動平均

等。而對於《資訊理論》來說,最需要掌握的一個知識點必定是

。除了理解熵的概念以外,可以著重瞭解下幾種不同的熵理論,如

條件熵、聯合熵、相對熵、最大熵以及互資訊

最最佳化方法

首先,我們可以簡單的理解下什麼是“最最佳化”?最最佳化,直白的說便是指在完成一個目標的時候,我們總是希望能夠在

資源受限

的條件下以

最小的代價

來獲取

最大的收益

。可以毫不誇張的說,最最佳化理論是整個機器學習中相對較難且非常重要的一個理論基礎,同時也是面試機器學習演算法崗或者在該領域繼續進修所必不可少的一個門卡。在瞭解完基本概念的同時,我們也不知不覺的觸及到了最最佳化問題中基本數學描述的三個基本要素,即

決策變數

目標函式

以及

約束條件

。其次,羅列下這方面所需要掌握的概念及原理:

凸集、凸函式、凸集分離定理、超平面和半空間

。最後,我們需要重點理解的便是

梯度下降法

,它是目前整個深度學習演算法的核心。此外,對於一些諸如

擬牛頓法、阻尼牛頓法、隨機梯度下降演算法

等可留到後半部分學習。

英語

英語,雖然不是我們的母語,但是作為一名新時代的AI從業技術人員或者即將踏入碩博之路的人來說,這是一門必不可少的技能。首先,對於選擇就業的同學來說,在日常的工作生活中,都會不可避免的會查閱大量的工具書和英文網站,這就需要我們具備一定的英語基礎,才能夠在工作中游刃有餘,幫助我們快速的定位到關鍵點。其次,對於想往科研這條路的同學來說,英語更是不可或缺的必備技能。除了平常科研寫作要經常用到之外,我們在申請海內外學校的時候還需要要求具有四六級證書(國內)或者雅思托福考試證明(境外),每年往往有許多發表不少科研成果的同學被卡在這裡,著實令人惋惜。最後,掌握良好的英語溝通能力,無論對職場發展(去海外工作或者與國外客戶合作)還是學術交流(會議)都是具有積極意義的。然而,語言這種東西不能一蹴而就,除了母語環境,我們能做的是每日學習,厚積薄發,後面方可應用自如。

計算機基礎

Git基礎

萬字長文帶你入門計算機視覺!

git各個分割槽的轉換

Git作為一個版本控制軟體,可以幫助我們更好地對我們的專案進行管理,也方便進行多人協同的工作。但是,估計大多數人最常用的還是

git clone

(誤)。因此這個技能也常常會被大家所忽略但卻又是進入工作之後說必須掌握的技能。

從邏輯上,git所管理的程式碼可以分為三個區,如上圖所示分別為工作區(你正在編寫的程式碼),本地倉庫(儲存到本地倉庫的程式碼)以及遠端倉庫(遠端程式碼庫),它們之間的轉換所需要用到的命令如上圖所示。比如 git commit(提交至本地倉庫),git push(把原生代碼推到遠端庫並進行合併),git pull(把遠端程式碼下載下來併合併到工作區),git diff(比較工作區與暫存區的不同)。

雖然平時不用的時候可能會忘掉這些命令,但是需要用的時候看看上圖,基本上都能想起每個命令的意義

Linux基礎

大多數情況下,我們的訓練環境都是執行在Linux平臺上的,因此我們還是有必要掌握一些常用的Linux基礎。下面列舉一些實際開發工程中經常會用到的指令:

基本操作:mv(移動),rm(刪除),cp(複製),mkdir(建立資料夾), touch(建立檔案), scp(用於傳送檔案),cat(列印檔案到命令列),grep(查詢符合條件的字串),ls(檢視檔案),chmod(修改許可權),ln(建立軟連結)

壓縮/解壓命令 :zip/unzip和tar命令

系統監控相關:ps(檢視程序),top(類似任務管理器),df(檢視磁碟佔用)

網路相關:ping(判斷網路是否可達),ifconfig(顯示網路裝置狀態)

顯示卡狀態:nvidia-smi(需要安裝),gpustat(需要安裝,這個顯示更美觀)

後臺執行:nohup(關掉終端也不會停止執行),ctrl+z(切換到後臺,關閉終端會結束)

為了安全起見,一般來說不建議用rm來刪除檔案,而是建立一個垃圾回收資料夾。把平日裡不想要的檔案透過mv檔案統一移動到該資料夾下,然後使用定時清理的指令碼清空資料夾裡面的內容,以避免“刪庫跑路”的尷尬。

演算法基礎

IT界有一句諺語——Talk is cheap,show me the code。雖然平時設計算法、訓練模型以及演算法部署過程中基本上都不會用到的資料結構相關的知識,奈何大部分網際網路公司筆試面試就要撕程式碼,而且難度也在逐年提升(卷卷卷)。不僅如此,據身邊許多人的反應,現在中小公司也學這一招了,所以手撕動態規劃演算法基本已經成為標配,因此,為了能夠在求職的過程中儘可能不讓Coding能力成為

減分項

,大家還是需要在這上面多花費點時間。

學習資料結構的方法除了看書,弄明白基礎資料結構的原理外,最好的學習方法便是實戰。關於這點大家可以以Leetcode為主,輔助《劍指offer》等面試寶典進行刷題。對於剛開始刷題的同學,建議按照專題來刷,這樣能夠比較好得掌握這一類題型的解決方法,更容易加深記憶。比如按照

陣列、字串、連結串列、棧、佇列、雜湊表、二叉樹、堆、遞迴、深搜廣搜、動態規劃

等專題來刷。最後每樣都要有所涉及,避免面試出現自己完全沒坐做過的型別,幾分鐘都憋不出一行程式碼就有點尷尬了,而且給面試官的印象也不好。

好玩的事情那麼多,誰又喜歡刷題呢?這裡給大家一個刷題的思路,讓大家更加高效地刷題:

看懂題目(1-2min)

設計資料結構+演算法,儘量回想一下同型別的題目(1-2min)【沒有思路直接去看題解】

嘗試動手將整份程式碼給敲出來,爭取把給定的測試用例都透過(3-5min)

最後剩下最苦逼的便是調bug了(0-∞min)

注意:儘量不要在一道題目上花過多的時間,因為有些題目並不是你想就能想出比較好的解決方法。許多題目往往有一套

固定的解題模板

,而我們需要做的是應用好這套模板去解決問題。關於大家都會關心的問題是刷題的時候要用什麼語言來刷比較合適?這裡推薦大家優先用

Python

吧!相對於其它語言,特別是C++來說,Python的開發效率會顯得非常有優勢,重點是面試管也能接受。

程式設計基礎

在計算機視覺領域中,前對於前期的模型設計、訓練與驗證,我們會基於Python語言進行快速的版本迭代,而對於後期模型的部署以及底層op的最佳化,考慮到實際的生產環境和執行效率則一般會基於C++來實現。

Why Python?

作為一門高階語言,Python具備高度的可閱讀性,這使得它能夠更容易被初學者所接受和掌握,也更易於學習。此外,Python

強大的社群和豐富的第三方庫、框架和擴充套件

也為開發人員帶來了極大的便捷,這是它最大的優勢!

How to learn Python?

學習任何一門程式語言,包括Python,最好的方法便是實戰。因此,第一步我們要了解

IDE

的概念,不同的IDE有不同的適用性,選擇合適的開發工具有利於初學者更好的上手。第二步便是找到合適的教程來學習編寫Python指令碼,這裡比較推薦的紙質書籍是《Python從入門到精通》這本書或者直接上線上網站Python3 教程 | 菜鳥教程[1]。最後一步初學者只需再稍微瞭解下

直譯器

的概念即可,直譯器的作用是讓計算機能夠讀懂你的程式碼指令碼應執行相應的操作。

第三方庫:

語法基礎熟悉之後,作為進階教程,我們可以進一步地學習一些常用的第三方庫。比如用於資料分析的Numpy、Pandas;用於視覺化的Matplotlib、Seaborn;用於機器學習的Scikit-learn;用於影象處理的Opencv、Scikit-image等。再學習的過程中建議搭配本文第3部分《工具鏈》中3。4節所列出的資料科學速查表進行有針對性的學習。

環境配置:

這裡筆者強烈推薦大家將Miniconda 3作為我們的虛擬環境包管理。Anaconda是一個用於科學計算的Python發行版,其支援Linux, Mac, Windows系統,提供了包管理與環境管理的功能,可以很方便地解決多版本python並存、切換以及各種第三方包安裝問題。而Miniconda則是Anaconda的一個輕量版,足夠滿足日常的開發需求。

整合開發環境

:即Integrated Development Environment,IDE,是用於提供程式開發環境的應用程式,一般包括程式碼編輯器、編譯器、偵錯程式和圖形使用者介面等工具。關於這方面的選擇,也可參考第3部分《工具鏈》中3。2節所列出的常用開發工具首選。

再多嘮兩句:

Python功能其實遠不止上面這些,它對於編寫爬蟲,搭建個人部落格、網站,批次處理檔案等都十分方便。對於在這方面有興趣的同學也可自行探索。

Why C++?

儘管Python具有十分強大的功能,然而比較致命的缺點是執行速度慢,相較於C++語言來說是非常慢的。當我們的AI模型訓練好之後,下一步便是落地部署。與學術界更關心模型的精度不同,工業界更關心的是模型的部署效能。在實際的生產環境中,由於Python的可移植性和執行速度遠不如C++,所以對於後期模型的部署以及底層op的最佳化都會首選C++。

如何部署?

C++部署一般有兩種形式。第一種是利用C++從頭搭建模型,實現模型訓練和推理。第二種是前期先利用Python搭建網路進行訓練,後期再將模型載入C++中實現推理。前者開發難度偏大,商用價值較高。而後者開發難度適中,且能滿足大多數專案的需求。對於後者,部署C++有兩種常用方式:

Pytorch → libtorch和Pytroch→onnx → tensorrt

。後期我們會在公眾號的專欄進行專門的講解,敬請關注。

資料分析與數字影象處理基礎

資料處理與分析

深度學習專案的成功落地三要素:資料、演算法和算力,資料有效地處理與分析是非常關鍵的一步。簡單來說,資料處理與分析即是從大量的、雜亂無章的資料中抽取並分析出有價值的資訊。

在近十幾年的發展上來看,演算法本身的創新是非常有限的,大都還是停留在修修補補的階段。對於一名普通的計算機視覺演算法工程師來說,工作中有80%的時間都是在處理資料,因為模型的改動需要考慮到底層運算元的適應性,效果不一定好並且工作量會大大增加。因此,我們要學會根據實際應用場景針對性地分析業務需求,通常是基於已開源的大資料集作為pretrain,然後利用業務資料集來finetuning。所以重心還是要學會對業務資料進行

資料清洗

以及選擇合適的

資料增強

方式來擴充有限的資料集。而對於一名資料競賽者來說,更多的應該瞭解如何開始一個比賽。下面簡單的羅列出一個數據分析比賽大體的幾個步驟,具體的可以參考後面第3部分

工具鏈

>中所羅列出來的競賽網站自行尋找自己感興趣的或方向相關的比賽去參加實戰一波即可:

Exploratory Data Analysis:

匯入資料 → 資料總覽 → 變數相關性分析 → 缺失值及異常值處理 → 資料分佈變換 → 特徵分析(數值型和類別型);

Feature Engineering:

異常值處理(透過箱形圖觀察及長尾截斷處理等)→ 缺失值處理(分為隨機性缺失和非隨機性缺失,對應的處理方法分別為RF、SVD、Mean、Median、KNN、NN & Binary、GSimp、QRILC 等)→ 特徵離散化 → 資料型別轉換(one-hot編碼、哈夫曼編碼等)→ 特徵組合(將具有相關性的特徵組合起來形成新的特徵,以此來豐富特徵的多樣性,提高模型的泛化能力)→ 資料降維(PCA);

Modeing:

選擇合適的模型(LightGBM & XGBoost等)→ 交叉驗證 → 模型調整(GridSearch & Bayes & 貪心調參等);

Ensemble:

一般選定3個左右的強模型+多個相關性較小的弱模型進行Voting or Stacking or Boosting。

數字影象處理

數字影象處理(Digital Image Processing)是透過計算機對影象進行去噪、增強、復原、分割、提取特徵等處理的方法和技術。

儘管深度學習能實現很高的效能,但目前為止人們仍難以解釋其內部工作的機制原理。因此,深度學習本質上還是一個黑盒子。瞭解數字影象的一些基本概念以及掌握基礎的影象處理技能,有助於我們理解更深層次的內容。下面列舉一些需要重點了解和掌握的知識點:

影象數字化:

指的是將模擬(連續)訊號的影象轉換為數字(離散)資訊的過程,主要包含

取樣

量化

兩個步驟。二維影象在計算機中通常是以矩陣的形式表示,這裡需要了解影象的一些基本屬性,如

影象格式

(BMP & JPEG & GIF & PNG的定義和區別)、

影象解析度

通道數

(8位單通道二值影象 & 24位RGB通道彩色影象 & 32位RGBA通道 & 以及各種通道之間的互相轉換)、

影象尺寸

(畫素 & 影象寬度和高度)、

影象色彩顏色空間

(RGB & HSV & HSI & CMYK)、

影象插值方法

(最近鄰插值、雙線性插值、三線性插值)及

影象成像方式

(伽馬射線 & X射線等)。

影象壓縮:

目的是減少影象中的冗餘資訊,以更高效的格式進行儲存和傳輸資料。一般可分為有失真壓縮和無失真壓縮,這裡我們只需要簡單瞭解下有哪些經典的壓縮演算法即可。有興趣的可以瞭解下

JPEG壓縮演算法

的原理和步驟(涉及離散餘弦變換 & 量化 & YCbCr色彩空間)

影象增強:

指的是利用各種數學方法和變換手段來提高影象對比度與清晰度,使改善後的影象更適應於人的視覺特性或易於機器識別。簡單來說,就是要突出感興趣的特徵,抑制不感興趣的特徵,從而改善影象質量。如強化影象中的高頻分量,可使影象中物體輪廓清晰,細節更加明顯;而強化影象中的低頻分量可以減少影象中的噪聲影響。這裡我們需要重點掌握的是

灰度直方圖

的概念,瞭解什麼是

直方圖和對比度

,掌握

直方圖均衡化

限制對比度的自適應直方圖均衡化

(CLAHE)以及伽馬校正和仿射變換操作。

影象復原:

指的是利用退化過程的先驗知識,去恢復已被退化影象的本來面目。這是由於受採集裝置和光照等外部環境的影響,影象在形成的過程中不可避免的會失真或者引入背景噪聲干擾。因此,我們首先要知道

噪聲的來源

(電子元器件發熱或傳輸損失 & 成像系統的調製與缺陷 & 光照等外部環境因素的干擾)以及各種

噪聲的來源和特點

(高斯噪聲 & 脈衝噪聲[椒鹽噪聲 | 胡椒噪聲 | 鹽粒噪聲] & 泊松噪聲 & 斑點噪聲)。最後便是如何

去噪

,這裡需要重點掌握一些常見的

線性和非線性濾波

演算法(均值濾波 & 中值濾波 & 維納濾波 & 卡爾曼濾波 & 高通濾波 & 低通濾波 & 高斯濾波 & 雙邊濾波 & 拉普拉斯濾波 & 卷積核 & Gabor濾波器)。需要注意的是,我們在學習的過程中不能停留在定義上,而是應該著重理解各種濾波背後的

工作原理及應用範圍

,如低通濾波可用於消除噪聲、高通濾波常用語提取邊緣,又比如高斯濾波就是用來去除高斯噪聲、均值濾波和中值濾波有助於去除胡椒噪聲、邊濾波則能夠在濾波的同時保證一定的邊緣資訊,但是計算複雜度較高。

影象基本運算:

指的是對影象執行一些基本的數學運算。這裡涉及到的運算主要可分為

點運算

(線性 & 分段 & 非線性點運算)、

代數運算

(加法 & 減法運算)、

邏輯運算

以及最重要的

幾何運算

(影象平移 & 旋轉 & 翻轉 & 映象 & 縮放)

影象邊緣檢測:

這裡僅需瞭解下有哪些邊緣檢測運算元以及重點掌握一些常見的運算元。如

一階微分運算元

(Sobel運算元 & Roberts運算元 & Prewitt運算元)、

二階微分運算元

(Laplacian運算元 & LOG運算元)及

Canny運算元

影象形態學操作:

指的是一系列處理影象形狀特徵的影象處理技術。這裡需要著重掌握的有

腐蝕和膨脹

開運算與閉運算

形態學梯度

(用於保留邊緣輪廓)、

白色和黑色頂帽變換

;此外,也可瞭解下細化、厚化、擊中擊不中變換、邊界/孔洞/聯通分量提取。

影象變換:

指的是將影象陣列從源域轉換到目標域。瞭解幾種常見的變換方式,如

傅立葉變換、離散餘弦變換

。此外,可以重點學習下用於特徵提取的

霍夫變換

,實戰下如何利用該技術進行直線、圓和弧線等區域性特徵的提取。最後,再重點梳理下傅立葉變換與

小波變換

之間的區別和聯絡。

影象分割:

主要是基於灰度值的不連續和相似的性質將影象劃分為前景區域和背景區域。對於不連續的灰度值,常用的方法是邊緣檢測。而對於相似的灰度,我們一般常用

閾值處理

(區域性多閾值 & 全域性閾值 & Otsu自適應閾值)、

區域生長

分水嶺演算法

等。

影象質量評價:

主要是對影象的某些特性進行分析研究,評估出影象的失真程度。這裡需要重點掌握幾個評價指標:

SSIM

(結構相似度)、

PSNR

(峰值信噪比)及

MSE

(均方誤差)。

機器學習與深度學習基礎

機器學習

機器學習是一門多領域交叉學科,涉及機率論、統計學、演算法複雜度理論等多門學科。專門研究計算機怎樣模擬或實現人類的學習行為,以獲取新的知識或技能,重新組織已有的知識結構使之不斷改善自身的效能。

瞭解並區分什麼是監督學習、無監督學習、半監督學習、弱監督學習、多示例學習、遷移學習、元學習、強化學習、對比學習、少樣本學習、零樣本學習;

瞭解引數與超引數、資料擬合(欠擬合、過擬合、Under fit)、偏差與方差、訓練集/驗證集/測試集、生成模型與判別模型、奧卡姆剃刀/醜小鴨定理/沒有免費午餐、樣本統計(TP/TN/FP/FN)、交叉驗證、引數搜尋的概念;理解損失函式、梯度下降、正則化(L1 & L2)、資料降維(PCA & LDA)、資料歸一化(Min-Max 標準化 & Z-score標準化)等原理及適用場景;

掌握機器學習的十大基礎演算法,即Linear Regression、Logistic Regression、LDA、LVQ、Naive Bayes、KNN、Random Forest、Decision Tree、SVM、Bagging&Boosting&AdaBoost及K-Means演算法。梳理各種樹模型(GBDT & XGBoost & RF)之間的原理和區別;

理解掌握常用的評價指標,如Accuracy、Recall(Sensitivity)、Precision、Dice(F1-score)、Jaccard、AUC曲線、P-R曲線、MIoU等。

學有餘力的可以瞭解下期望最大化、隱馬爾科夫模型及條件隨機場等原理。

深度學習

深度學習嚴格意義上是屬於機器學習的一個分支,旨在構建更深層的網路來進行表徵學習。本文主要介紹與計算機視覺相關的一些概念及技術。

瞭解相關的一些

高頻名詞

和計算機視覺有哪些應用方向;

卷積結構:

Plain Conv, DW Conv, Ghost Conv, Deformer Conv, Octave Conv, Gropu Conv, 1×1 Conv, HetConv, Dilated Conv, SCCov, Pyramid Conv, Tined Conv, Dynamic Conv, Decoupled Dynamic Conv,  Involution, etc。

啟用函式:

Sigmoid, Softmax, ReLU, Tanh, PReLU, ELU, GELU, SELU, LeakeReLU, Soft Plus, ACON, etc。

損失函式:

Binary/Weighted/Balanced Cross-Entropy, Mixed Focal/Focal Loss/GFocal Loss, Dice Loss, IoU/CIoU/GIoU/DIoU/CDIoU/EIoU Loss/Focal-EIOU Loss, Tversky Loss, Triplet loss, etc。

池化相關

:Max pooing, Average pooling, GAP, Stochastic pooling,  etc。

最佳化方法:

Adam、SGD、Adentum、Nesterov、AdaDelta、RMSprop, etc。

正則化技術:

Dropout, DropBlock, Label Smoothing, SelfNorm & CrossNorm, etc。

後處理技術:

Watershed algorithm、CRF、TTA、Overlap Prediction、NMS, etc。

歸一化技術:

BN, LN, GN, IN, BGN, SwitchableN, SBN, SSN, FRN, EBN, KalmanN, DualN, etc。

學習率衰減:

ReduceLROnPlatea, MultiStepLR, ExponentialLR, CosineAnnealingLR, StepLR, etc。

注意力機制:

SE, SK, Shuffle Attention, Non-local, CBAM, GC, OCR, CBM, CBAM, BA2M, FCANet, Coordinate Attention, etc。

多尺度機制:

ASPP, SPP, Big-Little, Inception, SFA, ASC, DCFAN, etc。

特徵視覺化技術:

CAM, Grad-CAM, Grad-CAM++, Smooth Grad-CAM++, score-CAM, ss-CAM, Ablation CAM, etc。

資料增強

幾何增強:

Horizontal/Vertical flip, Rotation, Affine transformation, Translation, Cropping, Perspective transformation, Zoom, etc。

色彩增強:

Contrast, Brightness, Saturation, Color space conversion, Color jitter, Channel shuffling, Filling, Superimposed noise, etc。

其它增強:

Mixup, RandAugment, mosaic, dropout, cutout, cutmix, augmix, MoEx, RandErase, ObjectAug, InAugment, KeepAugment, Co-Mixup, ISDA, etc。、

距離度量公式:

Manhattan Distance, Euclidean Distance, Chebyshev Distance, Minkowski Distance, Cosine Distance, Mahalanobis Distance, Hamming Distance, Edit Distance, Earth Mover‘s distance,etc。

Backbone:

LeNet-5, AlexNet, VGGNet, GoogleNet, ResNet, DenseNet, VoVNet, MoblieNet, ShuffleNet, Xception, queezeNet, RexNeXt, Res2Net, SENet, SKNet, DCNet, CSPNet, FBNet, EfficientNet, RegNet, ResNeSt, ReXNet, HaloNets, etc。

語義分割:

FCN, UNet, ENet, ThunderNet, RefineNet, SegNet, PSPNet, DeepLab, DenseASPP, OCRNet, HRNet,BiSeNet, etc。

目標檢測:

Two-stage:

R-CNN & SPP & FastR-CNN & Faster R-CNN & Cascade-RCNN & Sparse R-CNN, etc。

One-stage:

YOLO v1-v5 & PPYOLO & SSD & RetinaNet & RefineDet & YOLOR & YOLOF & YOLObite & NanoDet & OneNet, etc。

Anchor-free:

CornetNet & Objects as Points & CenterNet v1-v2 & FCOS, etc。

例項分割:

MaskRCNN, PolarMask, PolarMask++, PointRend, BlendMask, ISTR, SOLO v1-v2, Sparse RCNN, A2Net, etc。

自監督學習:

SimCLR, SimSiam, BYOL, SwAV, MoCo v1-v3, OBoW, DINO, etc。

生成對抗網路:

GAN, DCGAN, Conditional GAN, InfoGAN, BigGAN, WGAN, StyleGAN, CycleGAN, Pix2Pix2, StackGAN, LSGAN, CGGAN, PD-GAN, etc。

重特徵引數化

:ACNet v1-v2, DBBNet, RepVGG, ResRep, etc。

Transformer相關

ViT, DETR, METR, SETR, DeiT, TNT, CrossViT, Swin Transformer, LeViT, RVT, PVT, BoTNet, TrTr, MOTR, ISTR, TransGAN, Local-ViT, IPT, DeepViT, CoTr, CaiT, CeiT, PiT, ViViT, CvT, T2T-ViT, TransT, SiT, LV-ViT, MViT, PRTR, CoaT, Segmenter, etc。

多層感知機相關:

MLP, MLP-Mixer, ExternalAttention, RepMLP, ResMLP, gMLP, etc。

上面只列舉了一小部分方向,對於CV其它領域的總結大盤點和一些訓練技巧、常見踩坑點、模型部署等知識點,以及上面所涉及到的每一個知識點,我們均會以圖文講解的形式從原理、演算法到具體的應用進行一一講解和總結。

硬基礎

硬基礎,可以理解為求職申學的加分項,優秀的履歷是一張去往金字塔頂端的入場卷。

學校 & 學歷 & 年齡 & 性別

學校:

實際上,大多數的在校生或多或少都具有名校情結。一個名牌學校的畢業生,除了學校品牌的價值,更多的體現在教學資源、硬體資源以及優質的校友資源等。當然,名校畢業的學生在享受以上資源的同時,也常常會倍感壓力,這是由於社會對於此類群體的期許度過高。在我國,名校按大類來分,大致可分為985 | 211 | 雙一流;如果想繼續分,可分為C9 + 中下流985 + 211 + 其它;再細分還可以是清北+ 華五 + 國防七子 + 兩電一郵 + 兩外一法 + 。。。。當然,這更多的只是歷史彌留的痕跡,相信隨著時代的發展,會有越來越多好學校崛起,比如計算機專業較強的雙非院校中發展勢頭最猛的深圳大學、南方科技大學、杭電南郵等以及蘇州大學和上海大學等強勁的211高校。對於大陸境外來說,常年排名靠前的有美國常春藤聯盟+Stanford+CMU+MIT+UIUC,英國劍橋+牛津,瑞士蘇聯邦理工,新加波國立大學+南洋理工大學,香港大學+香港中文大學+香港科技大學等。雖然,在我們求職或升學的面試過程中,好的學校通常會更容易獲得HR的青睞,但這並不意味著其它學校名氣不夠好的同學就沒有任何機會,對於學校出身不好的人也不用妄自菲薄,更多的應該把時間和精力花在提升自己的軟技能上,而對於學校出身好的同學來說也更應該珍惜這份機會,否則會適得其反。

學歷:

對於網際網路這個行業而言,對學歷的要求可謂越來越高。特別是針對網際網路大廠來說,每年大部分招的應屆生有大部分都是研究生學歷起步。特別是對於大廠AI LAb部門來說,現在基本都是海內外名校博士起步。當然,對於做開發的同學來說,只要把計算機基礎打好以及Leetcode等演算法題刷得快準狠,基本不會有太大的問題。而對於想從事CV演算法的同學來說,更多的還是建議去修一個研究生學位。而對於想繼續進修的同學的來說,一定要在申請之前瞭解相關院校的要求,比如雅思託福成績和就讀學校門檻,並在截至日期到來之前將相關材料都準備好,一般來說,對於大多數人更多的還是建議國內讀研國外讀博。

年齡:

年齡這塊其實是個很敏感的話題。可以發現在我國隨著年齡越大,限制越多。最典型的莫過於某菊廠帶頭的“

35歲最佳化

”以及某福報廠所提倡的“

為社會輸送優質人才

”等。對於高校老師而言,其實也會面臨著嚴峻的考核要求,而且很多國家青年基金專案基本都要求35歲以下申請。對於想考公務員的同學同樣也有本科35碩士40的年齡限制。因此,對於想進一步做出抉擇的同學來說也需要考慮到未來的一個發展趨勢和自身的競爭力,未雨綢繆。

性別:

俗話說男女有別,舊社會更有男尊女卑的說法。隨著我國改革開放進入到新時代,人們對於這種觀念已大大改善。儘管現如今職場上或多或少還存在著少部分的歧視女性,但對於大多數的公司而言,特別是對於網際網路演算法和開發部分而言,女生在團隊裡往往是最受照顧的,更多時候福利傾向原則反而是女士優先,所以這點大可放心。

業務理解 & 邏輯溝通能力

業務理解能力:

也可以理解為解決問題的能力。這個在工業界其實是比較注重的,特別是社招。對於大廠的大部分演算法開發崗位來說,面試過程也經常會遇到這種問題,即給定一個場景,問候選人有什麼相應解決方案,這類問題大都是開放題,沒有標準答案。然而,這對於候選人來說其實是一個更大的挑戰。遇到這種情況,我們首先要理解問題,清楚問題的定義是什麼,這其實就是在工作中我們需要明確我們的客戶需求是什麼?只有明確了任務本身,下一步才是對問題進行分析,根據自身掌握的知識體系結合實際的應用場景給定一個最優的解決方案,最好是要能夠落實到每一步應該做什麼,儘可能地思考開發過程或應用過程中會出現哪些問題,應該如何解決。最後,才是根據最終所敲定的任務路線,應用已有的技術逐步地攻關解決。

邏輯溝通能力:

在我們的日常學習或者工作生活中,溝通是必不可少的。良好的溝通能力有助於團隊之間更有效率的協作開發,強大的邏輯能力則更有助於個人解決問題。除了在找工作的過程中我們經常會遇到跟面試管交流或者跟HR談薪外,在進行學術彙報和同行交流的時候也經常需要我們有良好的邏輯溝通能力。這不僅能夠提高一個人的自信,也能為我們的職場生涯增添籌碼。

實習 & 工作經驗

實習經驗:

對於許多的在校大學生而言,接觸實際的工程專案開發,熟悉公司的專案開發流程,掌握常用的開發工具,可能一個最好的辦法就是去大廠實習。現如今大家都知道秋招,特別是春招的時候,競爭大廠CV演算法工程師崗位往往是千軍萬馬過獨木橋。有一個很重要的原因是因為僧多粥少,這是由於每年大部分正式崗位的指標都留給實習生轉正了。所以在這裡奉勸大家一句,能去大廠實習的一定要去,不能出去實習的也要創造機實習,比如遠端實習。實在不行的只能留在學校自己上github等相關網站上找一些開源專案學習。

工作經驗:

正所謂學歷只是一個敲門磚,它決定的是你能否進入面試。而工作經驗,或者說專案經驗,則是決定你在整個行業的天花板。一般來說,專案經驗所豐富,職業生涯就能走的更遠。同時,隨著你工作年限的增長,業界有一個不成文的規則,即跳槽的時候一般薪水是會增長x%,有甚至直接翻n倍。除非你本來已經到達天花板,工資也足夠高了。當然,如果能加上優質的學歷和學校加持,你的升職加薪之旅也會加速。

物質資源 & 人脈資源化

物質資源:

這裡可以暫且理解為硬體資源。眾所周知,深度學習模型成功的三大要素便是資料、演算法和算力。其中,算力是從根本上決定了我們是否能進行某個任務或課題的研發或研究。對於在校生來說,首要關鍵的還是實驗室的硬體基礎設施,伺服器資源是否能滿足課題的需求,因為這同時也會關乎到你實驗的進展。而對於進入工業界的朋友來說,如果遇到買不起足量伺服器的公司千萬不要去應聘該公司的演算法工程師崗位。說一個身邊真實的例子,有個別同學的導師要求該名同學用自己的破筆記本跑3D任務相關的實驗以及某某公司為該公司旗下的演算法部分分配每人一張卡。可想而知,這種開發和研究週期得有多長。大家也可以觀察下,現在頭部大廠如谷歌的最新研究基本都是基於多張V100甚至直接上TPU叢集上訓練。

人脈資源:

無論你今後是想從事工業界或者學術界,可以說人脈資源是你必不可少的東西。首先,簡單地聊一下學術圈。學術圈這個圈子其實挺小的,包括大家平日裡投的期刊,其實絕大多數都是不盲審的,這就意味著可操作性空間大。特別是對於某些期刊來說,很多時候就是一群自己人在圈子內“自嗨”,外人根本進不去(投稿基本是被拒的)。所以,這裡更建議大家多去參加一些高階的學術會議,結識多點人脈,建立自己的小圈子,眾人拾柴火焰,唯有抱團取暖才是真諦。同樣地,對於跟著大牛導師的同學也可以多利用導師手裡邊的資源為自己爭取更好的機會。其次,對於工業界的朋友來說,平常也可以多參加點創投圈,結交多點大佬,不僅以後跳槽挖坑的機會更多,對於有志於創業的夥伴來說未嘗不是一種積累。

工具鏈

工具鏈,主要是向大家介紹一下日常工作學習生活中可以幫助自身提升工作效率的一些線上網站、實用工具、資訊媒介以及乾貨資料分享。

線上網站

資料競賽

Kaggle[2]:全球最大的機器學習/深度學習競賽平臺

DataCastle資料競賽[3]:全國專業的大資料培訓和競賽平臺

天池[4]:由阿里巴巴舉辦,面向全球科研工作者的高階演算法競賽平臺

KDD CUP[5]:國際知識發現和資料探勘競賽

Grand Challenge[6]:比較全面地收集了醫學影象相關的競賽、資料集

Biendata[7]:國內很大的資料競賽網站和社群

演算法刷題

Leetcode[8]:題型多題目多且經典,在國內絕對是頭部的刷題網站了

牛客網[9]:求職找工作神站,筆試\面試\實習\求職等各類資源集大成者

求職就業

Boss直聘[10]:找工作/實習,打工是不可能打工的,這輩子都不可能打工的

牛客網[11]:求職找工作神站,筆試\面試\實習\求職等各類資源集大成者

超級簡歷[12]:線上製作屬於你的個人簡歷

學術相關

Google學術[13]:論文搜尋神器,活用高階搜尋功能

arXiv[14]:新鮮出爐的論文,當然質量也是參差不齊了

SCI-Hub[15]:找論文必備

dblp[16]:是計算機領域內對研究的成果以作者為核心的一個計算機類英文文獻的整合資料庫系統,往往可以比谷歌學術更快的搜到文獻的引用

Letpub[17]:檢視期刊的IF,中科院分割槽等資訊

Connectedpapers[18]:根據一篇論文找出其最相關的論文的圖譜,幫你快速發掘出論文創新點背後的其他論文!

Papers With Code[19]:幫助機器學習愛好者跟蹤最新發布的論文及原始碼,快速瞭解最前沿的技術進展

Overleaf[20]:線上的論文latex編輯器,IEEE都推薦的編輯器~

aideadlin。es[21]:AI會議deadline

新聞資訊

知乎[22]:蟹邀,人在美國,剛下飛機,CV水很深,利益相關,匿了。

Quora[23]:國外版知乎,也有很多圈內大佬在這裡談笑風生

Medium[24]:優質的外文部落格網站

CSRankings: Computer Science Rankings[25]:計算機各領域的高校/研究所排名

其它

RGB配色表[26]:線上RGB配色表,可用於快速獲取目標顏色的RGB值

Bilibili[27]:這裡面個個都是人才,說話又好聽,我敲喜歡這裡的

Github[28]:全球最大的同性交友網站,世界上資源最豐富的程式碼倉庫

Graviti[29]:專注於解決AI開發中的資料痛點,從海量公開資料集社群(Open Datasets)到專業資料管理SaaS(TensorBay)

Learn Git Branching[30]:用玩遊戲的形式學會Git,帶領初學者快速的入門

jsoneditoronline[31]:是一個簡單、靈活、視覺化線上的JSON編輯器,支援差異化對比,可檢視、編輯和格式化JSON資料

實用工具

常用開發工具

Pycharm:

Python專案開發神器,整合除錯、語法高亮、Project管理、程式碼跳轉、智慧提示、自動完成、單元測試、版本控制等強大功能;

VSCode:

行動式程式碼編輯器,優點是短小精悍,除了可以作為一款輕量級的編輯器,也可作為中小型專案開發的首選工具,除此之外還可以當作Latex編譯器;

MobaXterm:

是一款可以在Windows系統下遠端SSH連線到Linux伺服器的神器;

Jupyter Notebook:

是一個開源的Web應用程式,允許使用者建立和共享包含程式碼、方程式、視覺化和文字的文件。它的用途包括:資料清理和轉換、數值模擬、統計建模、資料視覺化、機器學習等等。

論文寫作工具

Mendeley:

科研文獻管理軟體,可以給文獻加註釋和分類,同時也可以把參考文獻按照指定格式進行匯出;

EndNote:

主要是用於Word寫期刊論文時可以很方便的管理參考文獻的自動引用;

Mathpix Snipping Tool:

Latex公式離線截圖工具,只需透過軟體進行截圖複製Latex程式碼即可編譯執行;

Typora:

輕量級的markdown編輯器,同時附帶許多有用的外掛可供使用;

日常辦公工具

Snipaste:

是一款免費,完全沒有廣告的截圖工具,具有強大的桌面貼圖功能;

火柴:

桌面搜尋引擎,可以快速幫你找到需要的檔案,同時附帶許多實用的小工具;

V2ray,clashX,ssr

:fq必備軟體,領略世界文化;

向日葵 & Teamviewer:

遠端連線工具;

Adobe acrobat:

功能全面的pdf閱讀器;

IrfanView:

輕量級影象瀏覽器,可以實現圖片編輯、壓縮等功能

石墨文件:

穩定、免費的線上文件,記筆記、團隊協作都很方便;

OneNote:

Windows官方記事本軟體,功能強大,介面清新,非常適合個人。不過由於伺服器在國外,所以多終端同步問題目前來說體驗不是很好;

Picasa 3:

谷歌開發的照片檢視器,可用於快速的瀏覽照片,無廣告,然而很早前已停止開發,不過不影響我們的日常使用;

堅果雲/藍奏雲:

不限速的雲盤,免費版一個月的流量用來不同裝置之間同步檔案足夠了

谷歌瀏覽器外掛:

沙拉查詞:

線上劃詞實時翻譯;

Grammarly:

線上語法自動糾正外掛;

Tempermonkey:

俗稱油猴,有豐富的js指令碼,讓你的瀏覽器更加強大;

Octree:

可以讓github網頁端的檔案以樹形結構顯示;

Adblock:

廣告攔截神器,拒絕牛皮癬,還你一個乾爽的頁面;

論文資訊

各大CV相關的頂會頂刊

CCF A

CVPR(CV最高頂會), ICCV, AAAI, ICML, NIPS, ACMM

CCF B

ECCV, WACV, ICME

CCF C

BMVC, ACCV, ICPR

JCR Ⅰ區

TPAMI(CV頂級期刊), TIP, IJCV

JCR Ⅱ區

Pattern Recognition, IEEE Access(保畢業神器)

JCR Ⅲ區

CVIU, IVC, PRL

JCR Ⅳ區

IET-CVI, IJRAI, Machine Vision and Applications

AI+醫療交叉領域頂級會議和期刊

會議:MICCAI, IPMI,ISBI,EMBC

期刊:TMI, MIA, TBME

AI自媒體微信公眾號平臺:

機器之心:專業的人工智慧媒體和產業服務平臺;

新智元:重點關注人工智慧、機器人等前沿領域發展;

量子位:追蹤人工智慧新趨勢,報道科技行業新突破;

CVHub

:專注於發展成為計算機視覺領域的全棧平臺,涵蓋與CV相關的技術交流分享、學術論文寫作指導、求職升學經驗分享、實用乾貨教程分享以及最新的CV資訊速遞;

AI科技大本營:CSDN旗下的官方公眾號,提供人工智慧領域熱點報道;

OpenCV團隊:致力於OpenCV開發、維護和推廣工作;

AMiner:AI賦能科技情報挖掘;

乾貨資料

線上教程

Fast AI[32]:重程式碼而非數學,不少初學者憑藉Fast。ai課程所學技能稱霸Kaggle比賽!

吳恩達機器學習[33]、深度學習[34]實戰課程:最受歡迎的入門級課程,吳恩達老師課程最大的特點是通俗易懂;

李宏毅機器學習[35]、深度學習[36]實戰課程:成為像寶可夢訓練師那樣的AI工程師,李宏毅老師課程最大的特點是詼諧幽默為主;

李飛飛CS231[37]計算機視覺公開課:是計算機視覺領域入門的必看經典課程之一;

斯坦福CS224n[38]深度學習自然語言處理課程:CV的同學可以稍微瞭解一下;

Pytorch官網[39]:這是學習Pytorch深度學習框架最好的課程資料,包括熟悉Pytorch的各類API的定義和功能以及一些快速入門的教程均可在官網上找到,質量也是槓槓的!

參考書籍

《python從入門到實戰》:掌握Python語言的入門級必備書籍;

《統計機器學習》第2版:李航博士的力作,涵蓋機器學習必備入門知識點;

《西瓜書》:由周志華教授主寫,適合本科生看的中文機器學習書籍,關於書中所涉及到的公式推導,建議搭配《南瓜書》進行輔助;

《動手學深度學習》:這本書是由李沐大神寫的,先前之有MXNet版本,後面也逐漸加入了Pytorch和Tensorflow版本;

《百面機器學習》&《百面深度學習》:由葫蘆團隊編寫, 機器學習、計算機視覺演算法工程師等相關崗位的面試寶典;

《數字影象處理》:作者是日本的學者岡薩雷斯,是傳統數字影象處理入門的必看書籍,這部分內容建議根據上面第1部分總結的重點有針對性的去了解即可;

《OpenCV 輕鬆入門:面向 Python》:這本書主要是用於輔助你學習opencv的API介面和驗證理論實戰用的,如果不是剛需也可以去github找一些實戰專案亦可;

《深度學習》:也稱為花書,被評為深度學習領域的聖經,可以幫助我們快速構建知識體系。當然,不少讀者反映書中內容大都晦澀難懂,建議學有餘力的同學可以去看看;

《劍指offer》:總共有 80 道典型的程式設計面試題,系統整理基礎知識、程式碼質量、解題思路、最佳化效率和綜合能力這 5 個面試要點,是非常適合新手面試刷的第一本題庫;

《神經網路與深度學習》:邱錫鵬深度學習經典教材,免費pdf下載可關注微信公眾號CVHub,後臺傳送關鍵字“0607”獲取;

《計算機視覺:演算法與應用第二版》:計算機視覺經典教材;

《C++ Primer》:C++入門必備教材。

References[1]

https://www。runoob。com/python3/python3-tutorial。html

[2]

https://www。kaggle。com/

[3]

https://js。dclab。run/v2/index。html

[4]

https://tianchi。aliyun。com

[6]

https://grand-challenge。org

[7]

https://www。biendata。xyz

[8]

https://leetcode-cn。com

[9]

https://www。nowcoder。com/

[10]

https://www。zhipin。com

[11]

https://www。nowcoder。com

[12]

https://www。wondercv。com

[13]

https://scholar。google。com。hk

[14]

https://arxiv。org

[15]

http://ww25。sci-hub。tw

[16]

https://dblp。uni-trier。de

[17]

https://www。letpub。com。cn

[18]

https://www。connectedpapers。com

[19]

https://paperswithcode。com

[20]

https://www。overleaf。com

[21]

https://aideadlin。es

[22]

https://www。zhihu。com

[23]

https://www。quora。com

[24]

https://medium。com

[25]

http://csrankings。org

[27]

https://www。bilibili。com

[28]

https://github。com

[29]

https://www。graviti。cn

[30]

https://learngitbranching。js。org

[31]

https://jsoneditoronline。org

[32]

https://course。fast。ai

[33]

https://study。163。com/course/courseLearn。htm?courseId=1004570029

[34]

https://mooc。study。163。com/university/deeplearning_ai

[35]

https://www。bilibili。com/video/BV1JE411g7XF

[36]

https://www。bilibili。com/video/av94519857

[37]

https://www。bilibili。com/video/av77752864/

[38]

http://web。stanford。edu/class/cs224n/index。html

[39]

https://pytorch。org

TAG: 學習httpsetc演算法影象