近年來,計算機視覺取得了很大進展。這些是我將在這裏提到的主題內容:html
技術:node
應用:git
關注的人:github
重要的深度學習創始人:Andrew ng,Yann lecun,Bengio yoshua,Hinton joffrey算法
課程 :數據庫
相關領域:網絡
人臉檢測架構
面部檢測是關於在面部周圍放置盒子app
人臉檢測是檢測人臉的其中一項任務。有幾種算法能夠作到這一點。機器學習
https://github.com/nodefluxio/face-detector-benchmark提供了這些方法的速度基準,而且有易於重用的實現代碼。
Haar 分類器
Haar 特徵
它們是自2000年以來在opencv中出現的舊計算機視覺方法。
它是一種機器學習模型,具備專門用於對象檢測的功能。 Haar 分類器速度快但準確度低。
請參閱https://docs.opencv.org/3.4.3/d7/d8b/tutorial_py_face_detection.html中有關如何使用它的更長解釋和示例
HOG:方向梯度直方圖
方向梯度直方圖
HOG是一種新的生成對象檢測功能的方法:它自2005年開始使用。它基於計算圖像像素的梯度,而後將這些特徵饋送到機器學習算法中,例如SVM。它具備比haar分類器更好的精度。
它的一個實如今dlib中。這是在face_recognition(https://github.com/ageitgey/face_recognition)庫中。
MTCNN
一種使用CNN變化來檢測圖像的新方法,精度更高但速度稍慢。請參閱https://kpzhang93.github.io/MTCNN_face_detection_alignment/index.html
MobileNet
這是我這些天用於面部檢測的最好和最快的方法,基於通用移動網絡架構。請參閱https://arxiv.org/abs/1704.04861
物體檢測
對許多物體進行物體檢測
可使用與面部檢測相似的方法來實現對象檢測。
這裏有2篇文章介紹了實現它的最新方法。這些方法有時也提供了對象類(實現對象識別):
卷積神經網絡
最近深度學習的進展使新架構取得了很大成功。
使用許多卷積層的神經網絡就是其中之一。卷積層利用圖像的2D結構在神經網絡的下一層中生成有用信息。有關什麼是卷積的詳細說明,請參閱https://towardsdatascience.com/intuitively-understanding-convolutions-for-deep-learning-1f6f42faee1。
卷積層
物體識別
對象識別是將對象分類爲類別(如貓,狗,......)的通常問題
基於卷積的深度神經網絡已被用於在此任務上取得很好的效果。
ILSVR會議一直在ImageNet上舉辦競賽(http://www.image-net.org/許多圖片的數據庫,包括貓、狗等物品標籤)
更成功的神經網絡如今已經使用愈來愈多的層。
ResNet架構是迄今爲止對對象進行分類的最佳選擇。
Resnet架構
要正確地訓練它,須要使用數百萬張圖像,即便使用數十個昂貴的GPU也仍然須要花費大量時間。
這就是爲何每次都不須要在這些大數據集上進行從新訓練的方法很是有用的緣由。遷移學習和嵌入就是採用的這樣的方法。
有關resnet的預訓練模型,請訪問https://github.com/tensorflow/tensor2tensor#image-classification
人臉識別
面部識別就是要弄清楚誰是一張臉。
歷史方法
解決該任務的歷史方法是將特徵工程應用於標準機器學習(例如svm)或應用深度學習方法進行對象識別。
這些方法的問題是它們須要每一個人的大量數據。實際上,數據並不老是可用的。
Facenet
谷歌研究人員在2015年推出了Facenet( https://arxiv.org/abs/1503.03832)。它提出了一種識別面部的方法,但卻不須要爲每一個人提供大量的面部樣本。
它的工做方式是拍攝大量面孔的圖片數據集(例如http://vis-www.cs.umass.edu/lfw/)。
而後採用現有的計算機視覺架構,例如初始(或resnet),而後用計算面部嵌入的層替換對象識別NN的最後一層。
對於數據集中的每一個人,(負樣本、正樣本、第二正樣本)選擇三個面(使用啓發法)並將其饋送到神經網絡,這產生了3個嵌入。在這3次嵌入中,計算三重態損失,這使得正樣本與任何其餘正樣本之間的距離最小化,而且最大化位置樣本與任何其餘負樣本之間的距離。
三元組損失
最終結果是每一個面(即便在原始訓練集中不存在的面)如今也能夠表示爲一個嵌入,它與其餘人的面部嵌入有很大距離的嵌入(128數字的向量)。
而後,這些嵌入能夠與任何機器學習模型(甚至簡單的諸如knn)一塊兒使用來識別人。
關於facenet和face embedding很是有趣的事情就是使用它你能夠識別只有幾張照片或者只有一張照片的人。
這是它的一個tensorflow實現:https://github.com/davidsandberg/facenet
這是人臉識別管道背後的思想的一個很酷的應用,而不是識別熊臉:https://hypraptive.github.io/2017/01/21/facenet-for-bears.html
遷移學習
在自定義數據集上快速從新構建精確的神經網絡
訓練很是深的神經網絡(如resnet)是很是耗費資源的,須要大量數據。
計算機視覺是高度計算密集型的(對多個gpu進行數週的訓練)而且須要大量數據。爲了解決這個問題,咱們已經討論過爲面部計算通用嵌入。另外一種方法是採用現有網絡並僅在其餘數據集上從新訓練其幾個層。
這是一個教程:codelab教程。它建議你從新訓練一個初始模型,訓練未知的花類。
https://medium.com/@14prakash/transfer-learning-using-keras-d804b2e04ef8提供了在進行遷移學習時應該對哪一層進行再訓練的良好指導。
圖像分割
用於自動駕駛的圖像分割
近年來,圖像分割成爲了一項使人印象深入的新任務。它包括識別圖像的每一個像素。
此任務與對象檢測有關。實現它的一種算法是mask r-cnn。
GAN
大規模的GAN
由ian goodfellow引入的Generative Adversial Networks是一個神經網絡架構,分爲兩部分:鑑別器和發生器。
在學習期間調整發生器的權重,以便產生鑑別器沒法與該類的真實圖像區分的圖像。
如下是最大的GAN(https://arxiv.org/abs/1809.11096)生成的圖像示例
請參閱https://github.com/eriklindernoren/Keras-GAN在keras中的GAN實現
計算機視覺硬件
要訓練大型模型,須要大量資源。實現這一目標有兩種方法。首先是使用雲服務,例如google cloud或aws。第二種方法是本身構建一臺帶有GPU的計算機。
只需1000美圓,就能夠構建一臺體面的機器來訓練深度學習模型。
視覺界面
面對本身的照片儀表板
Ownphotos是一個使人驚歎的用戶界面,您能夠導入照片並自動計算面部嵌入,進行物體識別和識別面部。
它用 :
應用
視覺問題回答
計算機視覺有不少應用:
結論
正如咱們在這裏看到的,這裏有許多新的有趣的方法和應用程序。
我認爲人工智能在通常狀況下最有趣的是特別是在能夠重複使用的學習算法中,可以將這些方法應用於愈來愈多的任務,而不須要太多的處理能力和數據: