深度學習與CV教程(1) | 引言與知識基礎
- 作者:韓信子@ShowMeAI
- 教程地址:http://www.showmeai.tech/tutorials/37
- 本文地址:http://www.showmeai.tech/article-detail/260
- 宣告:版權所有,轉載請聯絡平臺與作者並註明出處
- 收藏ShowMeAI檢視更多精彩內容
本系列為 斯坦福CS231n《深度學習與計算機視覺(Deep Learning for Computer Vision)》的全套學習筆記,對應的課程視訊可以在 這裡 檢視。更多資料獲取方式見文末。
1.課程簡介
CS231n 是頂級院校斯坦福出品的深度學習與計算機視覺方向專業課程,核心內容覆蓋神經網路、CNN、影象識別、RNN、神經網路訓練、注意力機制、生成模型、目標檢測、影象分割等內容。
- 課程最後一版公開課視訊為2017版,需要最新進階技術內容的同學可以關注ShowMeAI釋出的 cs231n進階課程
- 希望對於深度學習進行一個全面學習瞭解的同學,可以閱讀學習ShowMeAI的 深度學習教程 | 吳恩達專項課程 · 全套筆記解讀
2.課程內容介紹
2.1 第1部分 Lecture1-3 深度學習背景知識簡單介紹
- 課程引入與介紹
- KNN 和線性分類器
- Softmax 和 SVM 兩種損失函式
- 優化演算法(SGD等)
2.2 第2部分 Lecture4-9 卷積神經網路
- CNN及各種層次結構(卷積、池化、全連線)
- 反向傳播及計算方法
- 優化的訓練方法(Adam、Momentum、Dropout、Batch-Normalization)
- 訓練 CNN 的注意事項(引數初始化與調優)
- 深度學習框架(TensorFlow、Caffe、Pytorch)
- 線性CNN結構(AlexNet、VGGNet、GoogLeNet、ResNet)
2.3 第3部分 Lecture10-16 計算機視覺應用
- RNN(語言模型,image captioning等)
- 目標檢測(R-CNN、Fast / Faster R-CNN、YOLO、SSD等)
- 語義分割(FCN、Unet、SegNet、deeplab等)
- 神經網路視覺化與可解釋性
- 生成模型與 GAN
- 深度強化學習
3.課程學習目標
3.1 實用技能
理解如何從頭開始編寫、除錯和訓練卷積神經網路。
3.2 工具技術
集中於大規模訓練這些網路的實用技術,以及 GPU(例如,將涉及分散式優化、CPU 與 GPU 之間的差異等),還可以檢視諸如 Caffe、TensorFlow 和 (Py)Torch 等最先進的軟體工具的現狀。
3.3 應用創作
一些有趣的主題,如「看圖說話」(結合 CNN + RNN),再如下圖左邊的 DeepDream,右邊的神經風格遷移 NeuralStyle 等。
4.課程先修條件
1)熟悉 Python(並瞭解 numpy 的使用),本課都用 Python 編寫,如果要閱讀理解軟體包的原始碼 C++ 會有幫助。
2)大學微積分(如求導),線性代數(瞭解矩陣)。
3)有機器學習的背景,大概 CS229 水平,非常重要核心的機器學習概念會再介紹的,如果事先熟悉這些會對課程有幫助的,我們將制定成本函式,利用導數和梯度下降進行優化。可前往文末獲取 ShowMeAI 原創的CS229課程速查表。
4)有計算機影象基礎會更好,但不是非常嚴格。
5.計算機視覺簡介
5.1 計算視覺歷史
16世紀最早的相機:暗箱
1963年第一篇計算機視覺博士論文「Block world-Larry Roberts」,視覺世界簡化為簡單的幾何形狀,識別它們,重建這些形狀。
1996年MIT暑期專案「The Summer Vision Project」目的是構建視覺系統的重要組成部分。
1970s 的 MIT 視覺科學家 David Marr 編寫了《VISION》,內容有計算機視覺的理解、處理開發、識別演算法,他提出了視覺表現的階段,如原始草圖的零交叉點,圓點,邊緣,條形,末端,虛擬線,組,曲線邊界等概念:
1973年後對於如何識別和表示物件,斯坦福科學家提出「廣義圓柱體」和「圓形結構」,每個物件都是由簡單的幾何圖形單位組成。
1987年 David Lowe 嘗試用 線 和 邊緣 來構建識別。
1997年 Shi & Malik 提出,若識別太難了,就先做目標分割,就是把一張圖片的畫素點歸類到有意義的區域。
2001年此時的機器學習也快速發展了(尤其是統計學習方法),出現了SVM(支援向量機模型)、boosting、圖模型等方法。Viola & Jones 發表了使用 AdaBoost 演算法進行實時面部檢測的論文 「Face Detection」,而後2006年富士推出可以實時面部檢測的數碼相機。
1999 年 David Lowe 發表 "SIFT" & Object Recognition,提出 SIFT 特徵匹配,思路是先在目標上確認關鍵特徵,再把這些特徵與相似的目標進行匹配,來完成目標識別。從90年代到2000年的思想就是基於特徵的目標識別。
2006年 Lazebnik, Schmid & Ponce 發表「Spatial Pyramid Matching」,圖片裡的各種特徵描述了不同場景,空間金字塔匹配演算法的思想就是從圖片的各部分各畫素抽取特徵,並把他們放在一起作為一個特徵描述符,然後在特徵描述符上做一個支援向量機。
2005年後來的研究 方向梯度直方圖 和 可變形部件模型,目的是將特徵放在一起後,如何辨認人體姿態。
21世紀早期,數碼相機快速發展,圖片質量提高,也真正有了標註的資料集,它能夠衡量目標識別的成果。資料集 PASCAL Visual Object Challenge 有 20 個類別,每個種類有成千上萬張圖片,供團隊開發演算法來和資料測試集做對抗訓練,來看檢測效果有沒有優化。
而後普林斯頓和斯坦福提出怎麼識別大部分物體,這個問題也是由機器學習中的一個現象驅動的,機器學習演算法在訓練過程中很可能會過擬合(只對現有的這些資料完美擬合,但對未知資料不一定完美)。部分原因是視覺化的資料非常複雜(像是記住了每道題),從而模型維數比較高,輸入是高維的模型,並且還有一堆引數要調優,當我們的訓練資料量不夠時很快就會產生過擬合現象,這樣就無法很好的泛化。
因此有了兩方面動力:① 識別萬物;② 克服機器學習的瓶頸-過擬合問題。
針對上述問題開展了ImageNet(http://www.image-net.org/)專案,在網路上收集了上億張圖片,用 WordNet 字典來排序,這個字典有上萬個物體類別,不得不用 Amazon Mechanical Turk 平臺來排序、清洗資料、給每張圖片打上標籤,最終得到的 ImageNet 有 1500萬甚至4000萬圖片分成了 22000 多類的物體或場景。它將目標檢測演算法的發展推到了新高度。
2009年為了推動基準測試的進展,ImageNet 開始組織了 ImageNet 大規模視覺識別競賽,篩選了更嚴格的測試集,140萬目標影象,有1000種目標類別,分類識別來測試計算機視覺演算法。
下圖為影象分類結果,縱軸為比賽結果的錯誤率,2012年的錯誤率下降的非常顯著,這一年獲頭獎的演算法是一種卷積神經網路模型。
5.2 計算機視覺近代技術發展
卷積神經網路(Convolutional Neural Networks,CNN)已成為影象識別中最重要的模型之一。
2010年的 NEC-UIUC 仍然用到了層次結構、檢測邊緣、不變特徵。在2012年才有重大突破,多倫多的博士生和導師創造了7層的 CNN,稱為 SuperVision 現在叫做 AlexNet。
2014年穀歌的 GoogLeNet 和牛津大學的VGG有19層網路。
2015年微軟亞洲研究院發表了殘差網路,有152層。
CNN早在1998年由 Yann LeCun 團隊在貝爾實驗室發明的,他們使用 CNN 進行數字識別,用於識別手寫支票和郵件地址,當時的 CNN 和後續的很多典型 CNN 模型結構是相似的,輸入是原始畫素,有很多卷積層和下采樣以及全連線層。
隨著計算機算力的提升,像 GPU 這種影象處理單元超高的平行計算能力引入,人們開發出了更大的CNN模型和架構。
在算力的支撐下,只擴大模型的規模,沿用經典的方法和演算法就能有很好的結果,這種增加計算的思想有著很重要的地位。還有資料的創新,現在有了很多標記的資料,我們可以實現更強大的模型。
後來也有很多創新的 CNN 結構引入,幫助模型可以在更大更深的情況下,也可以很好地訓練和對抗過擬合。
對視覺智慧的探索遠遠超出了影象識別的範圍,如影象語義分割、知覺分組他們沒有給整張圖片打上標籤,我們要理解的是每個畫素。這些任務是3D重構、動作識別、增強現實、虛擬現實等重要的支撐。
如老師 Johnson 在2015CVPR發表的「Image Retrieval using Scene Graphs」,視覺基因組這個資料集,不僅框出物體還要描述影象,作為整個大圖形語義相關的概念,不僅包括物件的身份,還包括物件關係、物件屬性、動作等,視覺系統可以做很多事情。
當看到上方的圖片時人們可以豐富的描述這個場景,藉助於他們的儲備知識和過往經驗又可以詳細描述每個人的身份歷程等。
這是典型的計算機視覺任務「看圖說話 / image captioning」,它以一種非常豐富而深刻的方式去理解一張圖片的故事,也是目前依舊在不斷推進的研究領域之一。
6.拓展學習
可以點選 B站 檢視視訊的【雙語字幕】版本
- 【課程學習指南】斯坦福CS231n | 深度學習與計算機視覺
- 【字幕+資料下載】斯坦福CS231n | 深度學習與計算機視覺 (2017·全16講)
- 【CS231n進階課】密歇根EECS498 | 深度學習與計算機視覺
- 【深度學習教程】吳恩達專項課程 · 全套筆記解讀
- 【Stanford官網】CS231n: Deep Learning for Computer Vision
- 【CS229知識技能速查】機器學習-監督學習
- 【CS229知識技能速查】機器學習-無監督學習
- 【CS229知識技能速查】機器學習-神經網路
- 【CS229知識技能速查】機器學習-經驗與技巧
斯坦福 CS231n 全套解讀
- 深度學習與CV教程(1) | CV引言與基礎
- 深度學習與CV教程(2) | 影象分類與機器學習基礎
- 深度學習與CV教程(3) | 損失函式與最優化
- 深度學習與CV教程(4) | 神經網路與反向傳播
- 深度學習與CV教程(5) | 卷積神經網路
- 深度學習與CV教程(6) | 神經網路訓練技巧 (上)
- 深度學習與CV教程(7) | 神經網路訓練技巧 (下)
- 深度學習與CV教程(8) | 常見深度學習框架介紹
- 深度學習與CV教程(9) | 典型CNN架構 (Alexnet, VGG, Googlenet, Restnet等)
- 深度學習與CV教程(10) | 輕量化CNN架構 (SqueezeNet, ShuffleNet, MobileNet等)
- 深度學習與CV教程(11) | 迴圈神經網路及視覺應用
- 深度學習與CV教程(12) | 目標檢測 (兩階段, R-CNN系列)
- 深度學習與CV教程(13) | 目標檢測 (SSD, YOLO系列)
- 深度學習與CV教程(14) | 影象分割 (FCN, SegNet, U-Net, PSPNet, DeepLab, RefineNet)
- 深度學習與CV教程(15) | 視覺模型視覺化與可解釋性
- 深度學習與CV教程(16) | 生成模型 (PixelRNN, PixelCNN, VAE, GAN)
- 深度學習與CV教程(17) | 深度強化學習 (馬爾可夫決策過程, Q-Learning, DQN)
- 深度學習與CV教程(18) | 深度強化學習 (梯度策略, Actor-Critic, DDPG, A3C)