摘要:先把AI人臉識別跑起來,然後研究它是如何實現的,整個過程中確實收穫不少。所謂先跟著做,再跟著學,實踐與理論結合,自己感覺有理解了一些基礎概念入個門,在此分享一下自己的搗鼓經驗。
1、買臺小“電腦”既然要做人臉識別,那得找臺帶攝像頭的小電腦啊。首先得價格便宜,簡單搜了下,基本有以下幾個選擇:
樹莓派4: ARM系統,生態好。價格合適,55刀。CPU在3箇中最好,算力0.1TFLOPSK210:RISC-V的(非ARM),價格是最實惠的,299元。算力有0.8TOPSJetson Nano:ARM系統,比樹莓派4還貴,但是多一個英偉達的GPU(當然是丐版的GPU),價格99刀。算力0.47TFLOPS這3個裡面,考慮到人臉識別應該有更多的AI屬性,那麼帶GPU能做AI推理不是更香麼,於是就選擇了英偉達的Jetson Nano開發板(主要也是想先入門英偉達的GPU派系,誰叫現在NVIDIA比較香呢)。
參考連結:
https://www.zhihu.com/question/384561694
https://zhuanlan.zhihu.com/p/81969854
2、啟動系統這裡需要先把“系統image”刷到 tf 卡里面,然後把tf卡插到開發板上,然後開機啟動。啟動有2個點需要注意:
跳線帽,需要插上(不然電源點不亮)。第一次開機會卡住,需要重啟一次。啟動後,發現是個帶介面的 Ubuntu系統,接上滑鼠+鍵盤,就是最熟悉的小電腦嘛。
連線網路,設定國內Ubuntu源,安裝 jtop 命令(因為nano不能敲 nvidia-smi 命令)。
設定系統參考:https://zhuanlan.zhihu.com/p/336429888
3、原來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.0export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64:$LD_LIBRARY_PATHexport 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程式,幫助理解挺好的。
4、檢測攝像頭功能OK這裡需要使用 nvgstcapture-1.0 命令,經查,字母gst原來是Gstreamer的縮寫。
直接敲:
nvgstcapture-1.0
發現可以把攝像頭打開了。
4.1 Gstreamer
搜了下,發現是一個音影片流處理的pipeline框架。
比如Shell命令的管道符為:|
為避免衝突,Gstreamer的管道符,用了個比較像的:! 符號。
參考:https://thebigdoc.readthedocs.io/en/latest/gstreamer/gst-concept.html
5、人臉可以正常識別按照教程: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 來實現的。
6、Opencv才是隱藏的Boss?透過上面的章節,發現總共程式碼沒幾行,怎麼就能識別人臉了呢?雖然python不熟,但好在程式碼少,仔細看了下:發現主要是呼叫了opencv的函式就可以識別人臉了,那說明opencv還是得了解一下。
你看識別人臉的程式碼,總共也就10行,簡單過一下:
找了這篇文章,還不錯:https://www.jianshu.com/p/0514c03e6727
6.1 Haar分類器
再搜尋,發現這裡的人臉識別用的是 “Haar分類器”這種方法實現的。學習了下,屬於機器學習的範疇,沒有用卷積神經網路。可參考:https://zhuanlan.zhihu.com/p/51431663
完整的Opencv的介紹:http://woshicver.com/
7、Windows上面復現人臉識別既然透過opencv就能識別人臉,那我不需要攝像頭,直接拿圖片是不是也可以跑了?於是Windows上面安裝個opencv試試。
7.1 安裝Python
去 https://www.python.org/ 下載最新的Python,安裝後就有Python了。當然執行命令是 py。
7.2 pip命令
發現pip命令,還是不行。 找到原來在:
C:\Users\tsjsdbd\AppData\Local\Programs\Python\Python39\Scripts
這個目錄下。
於是把這個路徑,加入到了本機的環境變數裡面:
所以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 modeldetector=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);# detectgray=cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)faces=detector.detectMultiScale(gray,1.2,5)# boxfor x,y,w,h in faces: cv2.rectangle(src,(x,y),(x+w,y+h),(255,0,0),2) # showcv2.imshow("image", src);cv2.waitKey(0);cv2.destroyAllWindows();
執行就行了。
py detect.py
得到結果:
發現確實可以,槓槓滴。
8、透過神經網路的人臉識別現在影片影象的識別,一般走CNN,所以咱也得玩一遍。Jetson 開發板,自己配套了一套 jetson-inference 的推理專案,就是用來跑GPU推理的。
參考:https://blog.csdn.net/weixin_45319326/article/details/107956896