近年來,計算機視覺取得了很大進展。這些是我將在這里提到的主題內容:
技術:
- 人臉檢測:Haar,HOG,MTCNN,Mobilenet
- 面部識別:CNN,Facenet
- 對象識別:alexnet,inceptionnet,resnet
- 遷移學習:在一個新主題上用很少的資源重新訓練大型神經網絡
- 圖像分割:rcnn
- GAN
- 計算機視覺硬件:選擇什么,GPU很重要
- 集成視覺的UI應用程序:ownphotos
應用:
- 個人照片組織
- 自動駕駛汽車
- 自主無人機
- 解決驗證碼/ OCR
- 過濾基於圖片的網站/應用程序的圖片
- 自動標記應用的圖片
- 從視頻中提取信息(電視節目、電影)
- 視覺問題回答
- 藝術
關注的人:
重要的深度學習創始人:Andrew ng,Yann lecun,Bengio yoshua,Hinton joffrey
課程 :
- deep learning@ coursera
- machine learning@ coursera
相關領域:
- 深度強化學習:使用cnn作為輸入層,查看ppo和dqn
- 與nlp的交互:lstm 2 cnn
人臉檢測
面部檢測是關於在面部周圍放置盒子
人臉檢測是檢測人臉的其中一項任務。有幾種算法可以做到這一點。
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篇文章介紹了實現它的最新方法。這些方法有時也提供了對象類(實現對象識別):
- (https://towardsdatascience.com/review-r-fcn-positive-sensitive-score-maps-object-detection-91cd2389345c r-fcn
- https://towardsdatascience.com/r-cnn-fast-r-cnn-faster-r-cnn-yolo-object-detection-algorithms-36d53571365e a comparison of r-cnn, fast r-cnn, faster r-cnn and yolo)
卷積神經網絡
最近深度學習的進展使新架構取得了很大成功。
使用許多卷積層的神經網絡就是其中之一。卷積層利用圖像的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是一個令人驚嘆的用戶界面,您可以導入照片並自動計算面部嵌入,進行物體識別和識別面部。
它用 :
- 面部識別:face_recognition
- 物體檢測:densecap,places365
應用
視覺問題回答
計算機視覺有很多應用:
- 個人照片組織
- 自動駕駛汽車
- 自動無人機
- 解決驗證碼/ OCR
- 過濾基於圖片的網站/應用程序的圖片
- 自動標記應用的圖片
- 從視頻中提取信息(電視節目,電影)
- 視覺問題解答:結合NLP和計算機視覺
- 藝術:GAN
結論
正如我們在這里看到的,這里有許多新的有趣的方法和應用程序。
我認為人工智能在一般情況下最有趣的是特別是在可以重復使用的學習算法中,能夠將這些方法應用於越來越多的任務,而不需要太多的處理能力和數據:
- 遷移學習:它可以使得重新利用預訓練的大型神經網絡成為可能
- 嵌入(例如facenet):可以識別許多類而無需對這些類中的任何類進行訓練
