連Python都不熟也能跑通AI人臉識別?「隱藏Boss」竟是它!

摘要:先把AI人臉識別跑起來,而後研究它是如何實現的,整個過程當中確實收穫很多。所謂先跟着作,再跟着學,實踐與理論結合,本身感受有理解了一些基礎概念入個門,在此分享一下本身的搗鼓經驗。

一、買臺小「電腦」

既然要作人臉識別,那得找臺帶攝像頭的小電腦啊。首先得價格便宜,簡單搜了下,基本有如下幾個選擇:html

  • 樹莓派4: ARM系統,生態好。價格合適,55刀。CPU在3箇中最好,算力0.1TFLOPS
  • K210:RISC-V的(非ARM),價格是最實惠的,299元。算力有0.8TOPS
  • Jetson Nano:ARM系統,比樹莓派4還貴,可是多一個英偉達的GPU(固然是丐版的GPU),價格99刀。算力0.47TFLOPS

這3個裏面,考慮到人臉識別應該有更多的AI屬性,那麼帶GPU能作AI推理不是更香麼,因而就選擇了英偉達的Jetson Nano開發板(主要也是想先入門英偉達的GPU派系,誰叫如今NVIDIA比較香呢)。python

參考連接:git

https://www.zhihu.com/questio...github

https://zhuanlan.zhihu.com/p/...segmentfault

二、啓動系統

這裏須要先把「系統image」刷到 tf 卡里面,而後把tf卡插到開發板上,而後開機啓動。啓動有2個點須要注意:網絡

  1. 跳線帽,須要插上(否則電源點不亮)。
  2. 第一次開機會卡住,須要重啓一次。

啓動後,發現是個帶界面的 Ubuntu系統,接上鼠標+鍵盤,就是最熟悉的小電腦嘛。框架

鏈接網絡,設置國內Ubuntu源,安裝 jtop 命令(由於nano不能敲 nvidia-smi 命令)。機器學習

設置系統參考:https://zhuanlan.zhihu.com/p/...函數

三、原來CUDA是個編譯器

既然選了英偉達的GPU開發板,恰好了解一下CUDA是什麼。學習

3.1 寫個CUDA程序

固然,程序是抄課本的,以下。

https://blog.csdn.net/fb_help/article/details/79283032

能夠看到是C語言的,一共就2個函數。一個main函數,一個useCUDA函數。

要跑起來,須要先進行編譯。發現不使用gcc,而是使用 nvcc 編譯器,有意思。

Jetson Nano的image已經安裝了nvcc,因此能夠直接用,只是使用前須要設置一下path。

export CUDA_HOME=/usr/local/cuda-10.0
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda-10.0/bin:$PATH

設置後,才能夠敲 nvcc 命令。參考:https://www.huaweicloud.com/articles/0ba49cd30493adbb37c82250408d8be4.html

因而開始編譯:

nvcc -o main.out main.cu foo.cu  (跟gcc編譯同樣)

運行:./main.out 便可。呵,原來CUDA是個編譯器啊(編譯出給GPU跑的程序)。

3.2 CUDA在幹嗎

普通的程序編譯出來都是給CPU跑的;寫個程序,想給GPU跑,就得使用cuda編譯器了。畢竟我們的這個GPU弱是弱了一點,也有128核呢,跑這種簡單的cuda程序仍是OK的。

另外,CUDA還提供了一些現成的操做GPU的函數,好比:矩陣乘法,矩陣轉置 之類的。CUDA只能用於英偉達的GPU,用於利用GPU進行復雜的並行計算。而後不少AI框架都是基於CUDA搞的,因此跑個cuda程序,幫助理解挺好的。

四、檢測攝像頭功能OK

這裏須要使用 nvgstcapture-1.0 命令,經查,字母gst原來是Gstreamer的縮寫。

直接敲:

nvgstcapture-1.0

發現能夠把攝像頭打開了。

4.1 Gstreamer

搜了下,發現是一個音視頻流處理的pipeline框架。

好比Shell命令的管道符爲:|

爲避免衝突,Gstreamer的管道符,用了個比較像的:! 符號。

參考:https://thebigdoc.readthedocs...

五、人臉能夠正常識別

按照教程:https://github.com/JetsonHacksNano/CSI-Camera/blob/master/face_detect.py

Copy了一個 face_detect.py 文件。

直接運行了:

python ./face_detect.py

發現就能夠識別出人臉了,厲害了。。。(額,只是圖像是倒過來的)

因而簡單看了下代碼(不會Python,可是也大概能看懂),發現有一個圖像模式的參數 「flip_method=0」,我改爲了6,發現圖像就轉過來正常了。

再看了下,發現獲取攝像頭拍攝的圖片,仍是經過 Gstreamer 來實現的。

六、Opencv纔是隱藏的Boss?

經過上面的章節,發現總共代碼沒幾行,怎麼就能識別人臉了呢?雖然python不熟,但好在代碼少,仔細看了下:發現主要是調用了opencv的函數就能夠識別人臉了,那說明opencv仍是得了解一下。

你看識別人臉的代碼,總共也就10行,簡單過一下:

找了這篇文章,還不錯:https://www.jianshu.com/p/051...

6.1 Haar分類器

再搜索,發現這裏的人臉識別用的是 「Haar分類器」這種方法實現的。學習了下,屬於機器學習的範疇,沒有用卷積神經網絡。可參考:https://zhuanlan.zhihu.com/p/...

完整的Opencv的介紹:http://woshicver.com/

七、Windows上面復現人臉識別

既然經過opencv就能識別人臉,那我不須要攝像頭,直接拿圖片是否是也能夠跑了?因而Windows上面安裝個opencv試試。

7.1 安裝Python

https://www.python.org/ 下載最新的Python,安裝後就有Python了。固然執行命令是 py。

7.2 pip命令

發現pip命令,仍是不行。 找到原來在:

C:UserstsjsdbdAppDataLocalProgramsPythonPython39Scripts

這個目錄下。

因而把這個路徑,加入到了本機的環境變量裏面:

因此pip命令ok了

7.3 設置pip國內源

vi ~/pip/pip.ini

而後設置內容:

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

7.4 安裝 opencv 包

pip install opencv-python

這條命令會同時安裝 numpy 包。

Ps:若是須要代理。設置一下

export http_proxy=http://代理:端口
export https_proxy=http://代理:端口

7.5 重現Haar人臉識別

下載一個帶人臉的jpg照片,這裏假設名爲 face.jpg

detect.py代碼以下:

import cv2

# load model
detector=cv2.CascadeClassifier('C:/Users/t00402375/AppData/Local/Programs/Python/Python39/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml')

src = cv2.imread("./face.jpg")
cv2.namedWindow("image", cv2.WINDOW_AUTOSIZE);

# detect
gray=cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
faces=detector.detectMultiScale(gray,1.2,5)

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

# show
cv2.imshow("image", src);
cv2.waitKey(0);
cv2.destroyAllWindows();

運行就好了。

py detect.py

獲得結果:

發現確實能夠,槓槓滴。

八、經過神經網絡的人臉識別

如今視頻圖像的識別,通常走CNN,因此咱也得玩一遍。Jetson 開發板,本身配套了一套 jetson-inference 的推理項目,就是用來跑GPU推理的。

參考:https://blog.csdn.net/weixin_45319326/article/details/107956896

點擊關注,第一時間瞭解華爲雲新鮮技術~

相關文章
相關標籤/搜索