如何從0學習opencv,完成類似人臉檢測的畢設?

有以下問題請求幫助:

1.新手入門,用什麼版本的opencv和vs好些?

2.需要先複習c++,然後看一本圖像處理基礎 一類的書嗎?還是直接找opencv的書看?沒學過計算機圖像一類的課程。各位推薦下學習的書目順序。

3.我打算現在就開始弄畢設,各位分析下進度趕得上不?需要如何安排下?

4.這方面有沒有視頻教程?

Thanks :D


邪派速成學習法(1周內搞定畢設):

git clone https://github.com/Itseez/opencv
cd opencv/samples/cpp

按如下次序研究幾個範例源文件:
1. facedetect.cpp #怎麼用Cascade特徵識別
2. facial_features.cpp #臉-&>五官
如果設計到追蹤和多目標識別,繼續往下
3. detect_blob.cpp #圖像處理、keypoint
4. kalman.cpp #穩定濾波、路徑預測
擴展閱讀
5. saebyn/munkres-cpp · GitHub
6. Munkres-opencv

PS: 記得一邊看範例一遍查閱API Reference,慢慢往外延伸,儘早嘗試動手寫自己的程序和試錯。


上學期計概實驗班期末大作業寫了兩個東西,第一個類似於這個。

其實就是用OpenCV完成的配件相機,大概做了這麼一些事情:

效果大概是這樣的:(貼到底下)

在這之前沒有用過OpenCV,學習過程放在最後。

確實,直接調用OpenCV的人臉檢測模塊並不很難,但是了解背後的原理的人並不很多。作為一個經典的二十年來一直表現優異的訓練-識別演算法,AdaBoost背後還是有很多可以學習的思想;其中的一些思想方法,在今天的深度學習人臉檢測中仍然得到應用。

1 首先要明確「人臉檢測」和「人臉識別」

人臉檢測實現的是「這張圖裡有沒有人臉」以及「如果有的話哪裡是臉」,而人臉識別做的是「這個人是誰?」。

我的大作業只涉及人臉檢測,不涉及人臉識別;從題主的提問來看,應該是要做人臉檢測;@jasonleaster 的代碼做的是人臉檢測,不是人臉識別。

2 人臉檢測的幾種方法

1.1實在是太過Naive,1.2無法應對千變萬化的人臉,解決方法是設置各器官尺寸、位置、角度可變的「彈性模板」,但「彈性」導致計算時間增加,無法實現實時性。

皮膚顏色只是我們為了解決問題方便利用的一個模型,不是人臉的本質特徵。易受人種/年齡/光照影響。更矬的是當背景顏色和皮膚顏色很相近時的誤判。但這已經是一個比較成熟、得到實際應用的方法。

喜聞樂見,這是一條靠譜的路。其中很有代表性的是Boosting方法。在深度學習一統天下之前的很多年裡,他都是表現最好的演算法,也是OpenCV採用的人臉檢測方法。

3 AdaBoost

AdaBoost是一種演算法(解決問題的架構),應用於人臉檢測時就需要用到Haar特徵(對問題的刻畫)。

我們都知道,眼睛跟眼窩相比,眼睛更黑。我們定義一個閾值K,當一張使用(上黑下白)的矩形特徵模板進行運算(白色區域的像素和 – 黑色區域的像素和),如果運算的結果&>=K時,我們就認為找到了眼睛。

有的人就反對了,憑什麼你用一個矩形特徵模板運算得到一個結果&>=K就算找到眼睛了,萬一我這個圖像就是一個區域上面是黑的,下面是白的呢?

不要著急,我們再使用第二個矩形特徵模板對這塊區域進行驗證,是不是能增加可靠度呢?如果再用其他的矩形特徵模板驗證,是不是還可以增加可靠度呢?如果再換個區域,再換個矩形特徵模板再驗證,是不是還可以增加可靠度呢?

通過改變特徵模板的大小和位置,可在圖像子窗口中窮舉出大量的特徵。對於一個給定的24*24像素的人臉圖像,根據不同的位置,以及不同的縮放,可以產生160,000個特徵。

有這麼多的特徵,我想這個時候的精確度應該已經很高了,但是同時其他問題也出現了——運算速度。

一維的情況下通過預處理前綴和我們可以O(1)查詢連續區間和,二維同樣,即為積分圖(如右下圖公式所示)

積分圖用於快速求矩形和,在一遍預處理後可以做到O(1)計算,極大的加速了計算過程,是HaarLikeFeature成功應用的關鍵,可以達到實時的要求(比如自拍相機)

下面展示了我們怎樣通過決策樹完成決策(有沒有人臉?):

下面就是問題的關鍵:怎樣設置Haar特徵的排布方式和閾值,使得每一層都有一些非人臉被篩掉?AdaBoost:用一個標註過的樣本集訓練。

最初的弱分類器可能只是一個最基本的Haar-like特徵,計算輸入圖像的Haar-like特徵值,和最初的弱分類器的特徵值比較,以此來判斷輸入圖像是不是人臉,然而這個弱分類器太簡陋了,可能並不比隨機判斷的效果好,對弱分類器的孵化就是訓練弱分類器成為優化弱分類器,注意這裡的優化不是指強分類器,只是一個誤差相對稍低的弱分類器,訓練弱分類器實際上是為分類器進行設置閾值的過程。

r可以看成是對有序性的衡量(有序才能通過閾值判斷)。

在表中尋找r值最小的元素,則該元素作為閾值。有了該閾值,我們就完成了設置,得到了一個優化弱分類器。下面看整個過程中怎麼把優化若分類器進行組合

每一輪都把上一輪不能正確判斷的樣本權重提高,加強薄弱環節。

最後再綜合評價每個優化分類器在整個過程中的表現,考察它是不是有保留的價值。

通過「三個臭皮匠頂個諸葛亮」的團結合作精神和民主科學的投票表決我們得到了一個優越的強分類器。

然而在現實的人臉檢測中,只靠一個強分類器還是難以保證檢測的正確率,這個時候,需要一個豪華的陣容,訓練出多個強分類器將它們強強聯手,最終形成正確率很高的級聯分類器這就是我們最終的目標Haar分類器。

配置的強分類器還是相當局部化的。訓練的時候用的照片一般都是20*20左右的小圖片,所以對於大的人臉,還需要進行多尺度的檢測。多尺度檢測機制一般有兩種策略,一種是不改變搜索窗口的大小,而不斷縮放圖片,這種方法顯然需要對每個縮放後的圖片進行區域特徵值的運算,完全沒有體現出積分圖的作用,而另一種方法,是不斷初始化搜索窗口size為訓練時的圖片大小,不斷擴大搜索窗口,進行搜索,解決了第一種方法的弱勢。

AdaBoost最難處理的兩個平衡

演算法當年可是壓倒性的各種牛逼

4 清楚原理之後再看OpenCV的級聯檢測

每個XML文件里都是訓練好的分類器參數,可以直接調用。

5 代碼

加配件:

濾鏡水印(濾鏡都用OpenCV手寫):

6 學習過程

C++是本來就會的,入門OpenCV花了半天,理解AdaBoost演算法+寫講稿用了半天。寫這個例子用了一天(AdaBoost非手寫實現),覺得這是一個很有趣的過程。

OpenCV0基礎入門不建議看官方文檔。可以先看於老師的教程,兼有可靠性、趣味性。跟著實現幾個自己的idea之後,可以跟著官方文檔探索性學習~

《OpenCV入門教程》 - OpenCV新兵 - OpenCV中文網站 - Powered by Discuz!

謝謝於老師!

這個例子之後,又花一天用OpenCV寫了大作業的第二塊:授課視頻的關鍵幀識別(PPT切頁檢測),感覺在實戰中進步是最快的。

7 效果

和室友(拍這張的時候皇冠忘了處理一下)

和媽咪,素描濾鏡

和女票,自動補強光

╮( ̄▽ ̄"")╭

八 後來


調用API簡單得shi,如果自己完全實現還挺有意思。調用人家OpenCV寫好的API,永遠不知道什麼是人臉識別。

import cv2
import numpy

face_cascade = cv2.CascadeClassifier("/home/jasonleaster/opencv-3.0.0/data/haarcascades/haarcascade_frontalface_default.xml")

#image = cv2.imread("/home/jasonleaster/IMG_20150817_184743.jpg")
image = cv2.imread("/home/jasonleaster/positive8.jpg")

dst = cv2.resize(image, (300, 300), interpolation = cv2.INTER_CUBIC)

gray = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(gray, 1.2, 5)

for (x, y, w, h) in faces:
cv2.rectangle(dst, (x, y), (x+w, y+h), (0, 255, 0), 2)

cv2.imshow("YCM", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

問題來了,你會發現,這裡調用了一個"神秘文件" xml結尾的。這裡面是一堆數據。如果題主閱讀過相關論文,不難猜到這裡是cascade 針對正人臉的訓練好的模型數據。
用了一個API detectMultiScale,接著後面的for循環就開始畫綠色的框框了。畢設的深度就在於,你能追究到這個API的實現到什麼程度,能不能自己寫一個?

(目測沒有學校教OpenCV,難道我們學習的東東都要學校教才會么?大大的疑問)


(題主,加油)


OPENCV基本強大到人臉識別已經有些內置演算法了。。
OPENCV感覺並不需要專門的書。。官方就有一些簡易教程。。跟著寫一寫。。OPENCV自己定義的基本數據結構大概了解了就可以開始做了。。比如什麼Mat啊這些。。
計算機視覺入門並不需要《數字圖像處理》這本書。那本書是做Image Processing的。。有好些圖像變換的東西跟你這個畢設沒關係的。。
看看美帝大學計算機視覺課的PPT基本就可以入門了。。比如CS4670/5670: Introduction to Computer Vision, Spring 2015。。像你這個課題。。搞清楚圖像怎麼存的。。什麼是圖像特徵點。。怎麼表達描述圖像特徵點(就是特徵)這些。。
再進一步等你基礎概念都弄清楚了。。就是看看論文有沒有相關的。。別人是怎麼做的。。參考一下(複製一下)。。一些地方做一些改進(換一種方法)基本就差不多了


我也是剛接觸opencv,儘力把目前的體會經驗答出來吧。


1、IDE跟OpenCV用什麼版本其實都關係不大,既然題主已經把vs2015+opencv3環境配置好了,不妨就在此環境下弄好了,時間不值得浪費在糾結在這些地方上,早點安心下手幹活的好。

2、
(A)題主說到需不需要「複習」C++,看來題主有C++基礎了,那就不用專門拿時間複習C++了,本身OpenCV中保留了大量C語言介面,看起來還挺方便的,實在遇到C++不記得的地方可以找本熟悉的書把相關的地方溫習一下好了。
(B)如果只是為了搞定畢設的話,那直接找本像《Learning OpenCV》或者相關cookbook之類的書開擼就好了,找到另一個答案中提到的「那個或那幾個」函數並弄明白用法那完全可以搞定你的畢設了。但如果像借著畢設的機會多了解下圖像處理跟計算機視覺的東西,不妨就擼一下很多人推薦的岡薩雷斯那本《數字圖像處理》吧,不過也不用細看,裡面那幾章圖像增強、圖像分割、目標識別的好好看看就行了,其他的地方不用強求。

3、只要馬上沉下心來安心搬磚,啥時候開始都來得及。這會開始綽綽有餘了,完全夠搞定畢設外加好好學學相關的各方面知識。大概的時間安排可以自己看著弄一個,安排出來了就一定要執行,到快畢業那會,酒局就多了,論文就寫不動了,還是早點弄完安心的好。

4、視頻我沒看過,就不作推薦了,不管雜學,早點開始坐下來看代碼寫代碼總不會錯的,有了目的驅動碰到問題就會有動力找辦法解決問題了。


題主加油,共勉!


呵呵,又是opencv和畢設的「黃金組合」,搞定你的畢設不用這麼麻煩,找到「那個或那幾個」函數,call一下就好了。
不要問是「哪個或哪幾個」,我只能幫你到這了。


看兩小時官方文檔即可


http://m.blog.csdn.net/article/details?id=26143845


專欄:【OpenCV】入門教程 - 博客頻道 - http://CSDN.NET 專欄:【OpenCV】入門教程
可以跟著淺墨大神的博客學習,從原理到實踐,很全面,一天一課也不到20天就學完了


我也是研究了opencv,要做畢業設計。正好研究到了人臉識別。人臉識別是有一個例子程序的。研究發現它識別時要用到一個xml的文件。而且還有可以識別眼睛的。搜索發現。xml裡面的是特徵碼。識別演算法就是通過這些特徵值來識別的。也就是說理論上只要改變xml裡面的值是可以用這個演算法識別所有物體的,不僅僅是人臉。所以問題就變成了怎麼得到演算法能識別的,我們控制的xml。我搜索到了。得到opencv的源碼後,用cmake生成一個vs的解決方案,打開後在app的文件夾里有三個項目,其中一個就是用來生成xml的,專業的說法是訓練器訓練機器,怎麼訓練自己搜吧,反正挺麻煩的。~我那會兒自己搞的時候沒人教。花了差不多一個月才搞清楚整個流程。斗出來就這麼幾個字。


建議你去看看毛星宇的《opencv3編程入門》,講解的通俗易懂,而且裡面還有大量的樣常式序和它的部分注釋。我看了這本書以後,感覺對opencv有一個整體上的認識,很適合初學者,而且該可以當做opencv使用手冊,特別方便。還涉及到opencv裡面一些函數處理圖像的演算法分析,諒解推薦。對了,裡面還有關於安裝opencv庫的詳細步驟。


用python去做opencv 很容易 我讀研期間做圖像這塊的 有很快用opencv 的工具做一個停車場車位檢測和車牌識別 僅僅是一些內置工具的使用 就可以完成 另外推薦python是因為opencv 在python的借口也很強大 而且上手比較容易


瀉藥。
上面幾位知友回答的可能已經比較詳細了,下面說點我的看法。私以為opencv是用起來的,而不是學起來的。所以既然題主已經把環境搭好了,那麼找幾個博客看看,熟悉下環境。
1:新手入門看看博客,就會有很大的收穫了,書本的話,之前看的也是經典的《Learning OpenCV》,不過你的版本是opencv3,毛星雲的那本《opencv3編程入門》可能更合適一點(兩本都可以),這本書說的還是比較淺(bei)顯(ren)易(hei)懂的,雖然對你畢設人臉沒有太直接的幫助,但是能幫你更好的理解opencv。vs的話,實驗室的夥伴們一直在堅持2008,,挺好。
2:複習c++可能就沒必要了,建議直接上手吧,邊看邊學,這樣比較有針對性,可能更容易掌握一點。書的話,剛剛上面說了,如果需要其他相關資料的電子版的, 可以私信我發你郵箱一點(其實也沒多少,自己網上找大把的)
3:現在搞畢設還是來得及的,看你想做成什麼樣的了,建議越早越好,下學期開學除了論文還有各種事情,那時候可能就沒心情寫論文了,畢業季還是比較傷感的啊哈哈哈,具體的安排還是得你自己根據自身情況制定計劃吧
4:opencv的視頻教程倒是不多,網搜也是有的,不過視頻裡面說的內容也是很基礎, 不如直接找相關的博客看看,看視頻個人覺得進度會比較慢。
不知道你的畢設具體想怎麼實現,看你的描述,你可能還是需要了解一點點演算法的知識,比如haar、boosting等等,是否還需要訓練樣本來構造分類器等等,上面你說的都只是關於了解opencv這個工具,但是如何用這個工具來實現你的畢設可能還要在花點心思學點其他知識。
以上,也許對你有點幫助。
cv小白,如有不妥,各位輕噴。


兄弟別用現成的了,好歹用深度學習框架自己搭一個網路試試吧。

比如pytorch或者Tensorflow。

網路模型的話,畢設來個CNN就足夠了吧。


講道理 我們畢業設計有個小夥伴做這個 被老師吐槽了 「這麼完善的東西了 為什麼還要做 調用opencv的函數並沒有什麼意義」 something like this
-------------------------好了認真回答問題--------------------

看樣子題主應該已經做完畢業設計了 大四狗一枚 接觸人臉識別不到一個月 說說我的感受
1.線性代數要學好,這個學好不是說會做題,而是真的理解。目前正在認真補數學中(我才不會告訴你們我在看POI呢)
2.多看官方文檔,比如說這個Face Recognition with OpenCV,這就表明英語要好,目前也在認真補英語中(我才不會告訴你們我在看POI呢)
3.多看論文,別看國內的論文,別看國內的論文,別看國內的論文,重要的事情說三遍。


《學習OpenCv》


Opencv本身已經有訓練跟預測的函數了,人臉檢測也有。所以你要做的只是call而已。當然,基本的什麼二值化,歸一化,Mat,IplImage等數據結構的轉換搞懂,差不多可以做了。我也就大二……基本是做完了


如何21天學會c++


實現直接調函數就好了,論文上把用的函數演算法講清楚


本人也是畢設現學opencv,只有可憐的C基礎,導師給我表情識別的題目。當時就懵逼了,感覺根本做不出來。後來就從C複習起,看了《學習opencv》和各種博客論文,現在已經基本實現預期功能,就差界面搭建了。用心去做,比你想的簡單。
對了,想完成畢設參考碩博論文是不錯的主意,他們思路清晰,很簡單。對於某一點理論不懂就搜論文就可以了。


推薦閱讀:

TAG:圖像處理 | 人臉識別 | 畢業論文 | C | OpenCV |