opencv 训练人脸对比_【项目案例python与人脸识别】基于OpenCV开源计算机视觉库的人脸识别之python实现...
“?本項目是一個基于OpenCV開源庫使用python語言程序實現人臉檢測的項目,該項目將從【項目基礎知識】(即人臉識別的基本原理)、【項目實踐】(人臉識別所需要的具體步驟及其python程序的代碼實現,包括人臉的檢測,數據的采集、存儲、訓練、識別)兩個部分進行講解,在講解過程中同時還提供了很多擴展知識。
作者丨徐恩偉01
—
【項目簡介】
????????本項目是一個基于OpenCV開源庫使用python語言程序實現人臉檢測的項目,該項目將從【項目基礎知識】(即人臉識別的基本原理)、【項目實踐擦歐總】(人臉識別所需要的具體步驟及其python程序的代碼實現,包括人臉的檢測,數據的采集、存儲、訓練、識別)兩個部分進行講解,在講解過程中同時還提供了很多擴展知識。
本項目使用python+ OpenCV 完成,OpenCV是一個神奇的「開源計算機視覺庫」,具備很強的計算效率,且專門用于實時應用,因此,它非常適合使用攝像頭的實時人臉識別。
02
—
【項目基礎知識】
(一)項目所需環境
(1)python 3 ?(python主程序)
(2)OpenCV庫(開源的計算機視覺庫)
(二)基本原理:OpenCV中的Haar-cascade檢測
(1)何為Haar
Haar是哈爾特征(Haar-like features)的簡稱,是一種用于物體識別的一種數字圖像特征。它們因為與哈爾小波轉換極為相似而得名,是第一種即時的人臉檢測運算。歷史上,直接使用圖像的強度(就是圖像每一個像素點的RGB值)使得特征的計算強度很大。帕帕喬治奧等人提出可以使用基于哈爾小波的特征而不是圖像強度,維奧拉和瓊斯進而提出了哈爾特征。哈爾特征使用檢測窗口中指定位置的相鄰矩形,計算每一個矩形的像素和并取其差值,然后用這些差值來對圖像的子區域進行分類。
Haar特征包含三種:邊緣特征、線性特征、中心特征和對角線特征。每種分類器都從圖片中提取出對應的特征。
比如上圖中,橫的黑道將人臉中較暗的雙眼提取了出來,而豎的白道將人臉中較亮的鼻梁提取了出來。
(2)何為Cascade
如果能找到一個簡單的方法能夠檢測某個窗口是不是人臉區域,如果該窗口不是人臉區域,那么就只看一眼便直接跳過,也就不用進行后續處理了,這樣就能集中精力判別那些可能是人臉的區域。為此,有人引入了Cascade 分類器。它不是將6000個特征都用在一個窗口,而是將特征分為不同的階段,然后一個階段一個階段的應用這些特征(通常情況下,前幾個階段只有很少量的特征)。如果窗口在第一個階段就檢測失敗了,那么就直接舍棄它,無需考慮剩下的特征。如果檢測通過,則考慮第二階段的特征并繼續處理。如果所有階段的都通過了,那么這個窗口就是人臉區域。作者的檢測器將6000+的特征分為了38個階段,前五個階段分別有1,10,25,25,50個特征(前文圖中提到的識別眼睛和鼻梁的兩個特征實際上是Adaboost中得到的最好的兩個特征)。根據作者所述,平均每個子窗口只需要使用6000+個特征中的10個左右。
基于Haar特征的cascade級聯分類器是Paul Viola和 Michael Jone在2001年的論文”Rapid Object Detection using a Boosted Cascade of Simple Features”中提出的一種有效的物體檢測方法。這種機器學習方法基于大量正面、負面圖像訓練級聯函數,然后用于檢測其他圖像中的對象。這里,我們將用它進行人臉識別。
詳情參見:Cascade Classifier Training
在OpenCV 中包含很多預訓練分類器,即提供了可以直接用于檢測人臉、眼睛、笑容等的相關算法,以供開發者調用,相關的 XML 文件可從該目錄下載:haarcascades
(3)Cascade級聯分類器的訓練方法:Adaboost
級聯分類器的函數是通過大量帶人臉和不帶人臉的圖片通過機器學習得到的。對于人臉識別來說,需要幾萬個特征,通過機器學習找出人臉分類效果最好、錯誤率最小的特征。訓練開始時,所有訓練集中的圖片具有相同的權重,對于被分類錯誤的圖片,提升權重,重新計算出新的錯誤率和新的權重。直到錯誤率或迭代次數達到要求。這種方法叫做Adaboost。
在Opencv中可以直接調用級聯分類器函數。
(4)Haar-cascade級聯檢測的基本原理:CascadeClassifier
在opencv中通過CascadeClassifier檢測模塊(算法模塊)能夠實現基于Haar特征的人臉或人眼等其他部位Cascade級聯分類器,這些算法被封裝成xml文件進行存放,其中包含相應的檢測特征值,特征size大小根據訓練時的參數而定,檢測的時候可以簡單理解為就是將每個固定size特征(檢測窗口)與輸入圖像的同樣大小區域比較,如果匹配那么就記錄這個矩形區域的位置,然后滑動窗口,檢測圖像的另一個區域,重復操作。由于輸入的圖像中特征大小不定,比如在輸入圖像中眼睛是50x50的區域,而訓練時的是25x25,那么只有當輸入圖像縮小到一半的時候,才能匹配上,所以這里還有一個逐步縮小圖像,也就是制作圖像金字塔的流程.
由于人臉可能出現在圖像的任何位置,在檢測時用固定大小的窗口對圖像從上到下、從左到右掃描,判斷窗口里的子圖像是否為人臉,這稱為滑動窗口技術(sliding window)。為了檢測不同大小的人臉,還需要對圖像進行放大或者縮小構造圖像金字塔,對每張縮放后的圖像都用上面的方法進行掃描。
????????以512x512大小的圖像為例,假設分類器窗口為24x24,滑動窗口的步長為1,則總共需要掃描的窗口數為:
即要檢測一張圖片需要掃描大于120萬個窗口,這里我們不得不借助計算機編程的程序來實現。
CascadeClassifier.detectMultiScale的調用方法為如下,只需要我們掌握一些調用的參數意義即可。
class CascadeClassifier: ? ?detectMultiScale( const Mat& image, vector<Rect>& objects,double scaleFactor, int minNeighbors,int flags, Size minObjectSize, Size maxObjectSize) ? { ? ? ? ?vector<int> fakeLevels; ? ? ? ?vector<double> fakeWeights; ? ? ? ?detectMultiScale( image, objects, fakeLevels, fakeWeights, scaleFactor, ? ? ? ? ? ?minNeighbors, flags, minObjectSize, maxObjectSize, false ); ? }參數意思:\1. const Mat& image:輸入圖像\2. vector& objects:輸出的矩形向量組\3. double scaleFactor=1.1:這個是每次縮小圖像的比例,默認是1.1\4. minNeighbors=3:匹配成功所需要的周圍矩形框的數目,每一個特征匹配到的區域都是一個矩形框,只有多個矩形框同時存在的時候,才認為是匹配成功,比如人臉,這個默認值是3。\5. flags=0:可以取如下這些值: CASCADE_DO_CANNY_PRUNING=1, 利用canny邊緣檢測來排除一些邊緣很少或者很多的圖像區域 CASCADE_SCALE_IMAGE=2, 正常比例檢測 CASCADE_FIND_BIGGEST_OBJECT=4, 只檢測最大的物體 CASCADE_DO_ROUGH_SEARCH=8 初略的檢測\6. minObjectSize maxObjectSize:匹配物體的大小范圍
(5)人臉如何識別
如果我們已經檢測出了圖片中的人臉,那么如何鑒別人臉呢?
為了實現對人臉的識別我們將使用一種面部特征點估計(face landmark estimation)的算法。其實還有很多算法都可以做到,但我們這次使用的是由瓦希德·卡奇米(Vahid Kazemi)和約瑟菲娜·沙利文(Josephine Sullivan)在 2014 年發明的方法。這一算法的基本思路是找到68個人臉上普遍存在的點(稱為特征點, landmark)。
下巴輪廓17個點 [0-16]
左眉毛5個點 [17-21]
右眉毛5個點 [22-26]
鼻梁4個點 [27-30]
鼻尖5個點 [31-35]
左眼6個點 [36-41]
右眼6個點 [42-47]
外嘴唇12個點 [48-59]
內嘴唇8個點 [60-67]
有了這68個點,我們就可以輕松的將人臉進行準確的識別,但是如何確定不同人的臉之間有什么不同呢?
????????最簡單的方法就是把我們第二步中檢測的未知人臉與我們已知的人臉作對比,當我們發現未知的面孔與一個以前標注過的面孔看起來相似的時候,就可以認定他們是同一個人。
????????我們人類能通過眼睛大小,頭發顏色等等信息輕松的分辨不同的兩張人臉,可是電腦怎么分辨呢?我們得量化它們,讓計算機通過不同的人臉特征數值進行自動識別。實際上最準確的方法是讓計算機自己找出他要收集的測量值,深度學習比人類更懂得哪些面部測量值比較重要。所以,解決方案是訓練一個深度卷積神經網絡,訓練讓它為臉部生成128個測量值。
每次訓練要觀察三個不同的臉部圖像:
加載一張已知的人的面部訓練圖像
加載同一個人的另一張照片
加載另外一個人的照片
????????然后,算法查看它自己為這三個圖片生成的測量值。再然后,稍微調整神經網絡,以確保第一張和第二張生成的測量值接近,而第二張和第三張生成的測量值略有不同。我們要不斷的調整樣本,重復以上步驟百萬次,這確實是個巨大的挑戰,但是一旦訓練完成,它能攻輕松的找出人臉。
????????慶幸的是 OpenFace 上面的大神已經做完了這些,并且他們發布了幾個訓練過可以直接使用的網絡,我們可以不用部署復雜的機器學習,開箱即用,直接在python中調用即可,感謝開源精神。
這128個測量值是什么鬼?其實我們不用關心,這對我們也不重要。我們關心的是,當看到同一個人的兩張不同照片時,我們的網絡需要能得到幾乎相同的數值。
如果對上述的原理看不懂也沒有關系,因為基于上述原理實現的操作代碼別人已經寫好了,我們在python中直接調用即可而不必過于關注其實現過程,所以可以直接進行下述的編程操作,在編寫代碼的過程中進行理解人臉識別的邏輯關系。
03
—
【項目實踐】
以下所有步驟我均在Windows 電腦上進行了測試、運行很好。要創建完整的人臉識別項目,在安裝好必要的環境與擴展庫后,人臉的識別主要包括人臉的檢測、人臉數據的收集并存儲、對人臉數據的訓練模型、人臉識別對比四個階段。
一、安裝擴展庫
本文采用pip進行安裝,因此需要成功配置好python的安裝環境。
(1)opencv-python 的安裝,輸入:pip install opencv-python。
注:安裝openCV,不是pip install OpenCv,而是 pip install OpenCv-python
numpy與OpenCV綁定安裝,無需自己輸入命令。
(2) pillow的安裝,輸入:pip install pillow
注:pillow為圖像處理包。
(3) contrib的安裝,輸入:pip instal opencv-contrib-python
? ? ? ?注:contrib是用于訓練自己的人臉模型的一個OpenCV擴展包
????????下圖為三個包的安裝過程截圖,由于我之前已經安裝過,會顯示包已存在。首次安裝會有進度條,成功后會有Successfully字樣。
二、人臉檢測
????????人臉識別的最基礎任務是人臉檢測,你必須首先判斷是否有人臉才能在未來與捕捉到的新人臉對比時進而識別它。
????????下面,我們就開始用 OpenCV 創建人臉檢測器吧!
"""功能:主要用于檢測是否是人臉,注意是檢測人臉而不是識別人臉版本:1.0"""import cv2def main(): ? ?# 導入人臉級聯分類器引擎,'.xml'文件里包含訓練出來的人臉特征 ? ?faceCascade = cv2.CascadeClassifier("enginer\haarcascade_frontalface_default.xml") ? ?# 開啟攝像頭,獲取圖像 ? ?cap = cv2.VideoCapture(0) ? ?#增加循環,使得攝像頭獲取的畫面為實時畫面而非靜態的圖像 ? ?while True: ? ? ? ?# 讀取攝像頭中的圖像,ok為是否讀取成功的判斷參數,True為成功讀取,否則為False ? ? ? ?sucess, img = cap.read() ? ? ? ?if sucess is True: ? ? ? ? ? ?# 如果攝像頭成功讀取圖像,則將圖像轉換成灰度圖像 ? ? ? ? ? ?gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ? ? ? ?else: ? ? ? ? ? ?print("攝像頭沒有讀取到任何圖像") ? ? ? ? ? ?break ? ? ? ?# 用人臉級聯分類器引擎進行人臉識別,返回的faces為人臉坐標列表(x,y,w,h) ? ? ? ?faces = faceCascade.detectMultiScale( ? ? ? ?gray, ? ? ? ?scaleFactor=1.2, ? ? ? ?minNeighbors=5, ? ? ? ?minSize=(32, 32) ? ? ? ) ? ? ? ?# 對每一張人臉都做畫矩形標出 ? ? ? ?for (x, y, w, h) in faces: ? ? ? ? ? ?# 畫出人臉框,藍色(BGR色彩體系),畫筆寬度為2 ? ? ? ? ? ?cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) ? ? ? ?cv2.imshow("Video", img) ? ? ? ?k = cv2.waitKey(30) ?# cv2.waitKey(delay) delay 毫秒是屏幕刷新的時間 ? ? ? ?if k == 27: ? ?# press 'ESC' to quit 在ASCII碼中esc按鍵為27,因此27對應的就是ESC退出鍵 ? ? ? ? ? ?break ? ?cap.release() ? ?cv2.destroyAllWindows()if __name__ == '__main__': ? ?main()這行代碼可以加載「分類器」(在C盤的python安裝目錄下,也可以將其拷貝到項目中直接調用)。然后,我們在在循環內部調用攝像頭,并以 grayscale 模式加載我們的輸入視頻。現在,我們必須調用分類器函數,向其輸入一些非常重要的參數,如比例因子、鄰近數和人臉檢測的最小尺寸。
faces = faceCascade.detectMultiScale( ? ?gray, ? ?scaleFactor=1.2, ? ?minNeighbors=5, ? ?minSize=(32, 32) ? )其中:
gray 表示輸入 grayscale 圖像。
scaleFactor 表示每個圖像縮減的比例大小。
minNeighbors 表示每個備選矩形框具備的鄰近數量。數字越大,假正類越少。
minSize 表示人臉識別的最小矩形大小。
該函數將檢測圖像中的人臉。接下來,我們必須「標記」圖像中的人臉,比如,用藍色矩形。使用下列代碼完成這一步:
for (x, y, w, h) in faces: ? ? ? ?cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)如果已經標記好人臉,則函數將檢測到的人臉的位置返回為一個矩形,左上角 (x,y),w 表示寬度,h 表示高度 ==> (x,y,w,h)。詳見下圖。
得到這些位置信息后,我們可以為人臉創建一個「感興趣區域」(繪制矩形),用 imshow() 函數呈現結果。
三、人臉數據的收集
現在,我們需要創建一個簡單的數據集,該數據集將儲存每張人臉的 ID 和一組用于人臉檢測的灰度圖。
開始之前,需要做以下準備:
1.在運行該程序前,請先創建一個Facedata文件夾并和你的程序放在同一個根目錄下。
2.程序運行時間可能會比較長,可能會有幾分鐘,如果嫌長,可以將 ?#得到100個樣本后退出攝像 ? 這個注釋前的100,改為10。
3.如果覺得收集的實踐比較長,實在等不及,可按esc退出,但可能會導致數據不夠模型精度下降。
4.可以嘗試變換不同的人臉姿勢,如側臉、笑臉等等,增強輸入人臉信息的準確性
"""功能:收集人臉的數據信息,存儲知道文件夾中版本1.0"""import cv2import json#定義函數,存儲用戶的信息,并將其以json的格式寫入user_info.txtdef store_user_info(user_info): ? ?js = json.dumps(user_info) ? ?with open("user_info.txt", 'w',) as f: ? ? ? ?f.write(js)def main(): ? ?# 導入人臉級聯分類器引擎,'.xml'文件里包含訓練出來的人臉特征 ? ?face_detector = cv2.CascadeClassifier("enginer\haarcascade_frontalface_default.xml") ? ?# 調用筆記本內置攝像頭,所以參數為0,如果有其他的攝像頭可以調整參數為1,2 ? ?cap = cv2.VideoCapture(0) ? ?# 獲取當前人臉的學號、姓名信息,并將其保存在user_info的字典中 ? ?user_info =dict() ? ?face_id = input("請輸入你的學號(ID):") ? ?face_name= input("請輸入你的姓名:") ? ?user_info[face_id]=face_name ? ?store_user_info(user_info) ? ?print("初始化攝像機,請注意看攝像頭,開始獲取頭像信息,請耐心等待... ...") ? ?count = 0 ? ?while True: ? ? ? ?# 從攝像頭讀取圖片 ? ? ? ?sucess, img = cap.read() ? ? ? ?if sucess is True: ? ? ? ? ? ?# 如果攝像頭成功讀取圖像,則將圖像轉換成灰度圖像 ? ? ? ? ? ?gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ? ? ? ?else: ? ? ? ? ? ?break ? ? ? ?# 用人臉級聯分類器引擎進行人臉識別,返回的faces為人臉坐標列表(x,y,w,h) ? ? ? ?faces = face_detector.detectMultiScale(gray, 1.3, 5) ? ? ? ?# 如果檢測出人臉,則對每一張人臉都做畫矩形,并將其保存到同目錄的Facedata文件夾中 ? ? ? ?for (x, y, w, h) in faces: ? ? ? ? ? ?cv2.rectangle(img, (x, y), (x+w, y+w), (255, 0, 0)) ? ? ? ? ? ?count += 1 ? ? ? ? ? ?# 保存圖像 ? ? ? ? ? ?cv2.imwrite("Facedata/User." + str(face_id) + '.'+ str(face_name) + '.'+ str(count) +'.jpg', gray[y: y + h, x: x + w]) ? ? ? ?cv2.imshow('image', img) ? ? ? ?# 保持畫面的持續 ? ? ? ?k = cv2.waitKey(30) ? ? ? ?if k == 27: ? # 通過esc鍵退出攝像 ? ? ? ? ? ?break ? ? ? ?elif count >= 100: ?# 得到100個樣本后退出攝像 ? ? ? ? ? ?break ? ?# 關閉攝像頭 ? ?cap.release() ? ?cv2.destroyAllWindows()if __name__ == '__main__': ? ?main()四、收集人臉信息的訓練模型
在訓練模型階段,我們需要從存儲的數據集中抽取所有的用戶數據,并訓練 OpenCV 識別器對其繼續識別,這一過程可由特定的 OpenCV 函數直接完成,將識別結果保存在程序根目錄下的face_trainer目錄中,格式為.yml 文件。
import numpy as npfrom PIL import Imageimport osimport cv2# 根據圖像存儲的文件路徑,獲取當前圖像,然后對其進行一一的訓練def getImagesAndLabels(path): ? ?detector = cv2.CascadeClassifier("enginer\haarcascade_frontalface_default.xml") ? ?imagePaths = [os.path.join(path, f) for f in os.listdir(path)] ? ?faceSamples = [] ? ?ids = [] ? ?for imagePath in imagePaths: ? ? ? ?PIL_img = Image.open(imagePath).convert('L') ? ? ? ?img_numpy = np.array(PIL_img, 'uint8') ? ? ? ?id = int(os.path.split(imagePath)[-1].split(".")[1]) ? #獲取學號 ? ? ? ?id_num = int(os.path.split(imagePath)[-1].split(".")[3]) ?#獲取當前學號的第幾張圖像 ? ? ? ?print("正在訓練ID為{}號的第{}張人臉信息....".format(id,id_num)) ? ? ? ?faces = detector.detectMultiScale(img_numpy) ? ? ? ?for (x, y, w, h) in faces: ? ? ? ? ? ?faceSamples.append(img_numpy[y:y + h, x: x + w]) ? ? ? ? ? ?ids.append(id) ? ?return faceSamples,idsdef main(): ? ?# 獲取人臉數據路徑 ? ?path = 'Facedata' ? ?recognizer = cv2.face.LBPHFaceRecognizer_create() ? ?print("開始訓練數據模型,這可能需要一些時間,請耐心等待......") ? ?faces, ids = getImagesAndLabels(path) ? ?recognizer.train(faces, np.array(ids)) ? ?recognizer.write(r'face_trainer\trainer.yml') ? ?print("總共存在{0}個人. 已完成識別".format(len(np.unique(ids))))if __name__ == '__main__': ? ?main()五、人臉識別
我們將通過攝像頭捕捉一個新人臉,如果這個人的面孔之前被捕捉和訓練過,我們的識別器將會返回其預測的 id 和索引,并展示識別器對于該判斷有多大的信心。
import cv2import json#定義函數獲取用戶的信息def get_user_info(): ? ?user_info = dict() ? ?with open("user_info.txt", 'r', ) as f: ? ? ? ?n = len(f.readlines()) ? ?with open("user_info.txt", 'r', ) as f: ? ? ? ?for i in range(n): ? ? ? ? ? ?line = f.readline() ? ? ? ? ? ?dic = json.loads(line) ? ? ? ? ? ?user_info.update(dic) ? ?return user_infodef main(): ? ?recognizer = cv2.face.LBPHFaceRecognizer_create() ? ?recognizer.read('face_trainer/trainer.yml') ? ?faceCascade = cv2.CascadeClassifier("enginer\haarcascade_frontalface_default.xml") ? ?font = cv2.FONT_HERSHEY_SIMPLEX ? ?# 名字是一個列表,與訓練集中人的ID相對應,如"xuenwei":id=1,等等 ? ?#names = ['None','1xuenwei', '2Bob','3'] ? ?user_info=get_user_info() ? ?#初始化并開始使用攝像頭獲取圖像 ? ?cam = cv2.VideoCapture(0) ? ?while True: ? ? ? ?ret, img = cam.read() ? ? ? ?gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ? ? ? ?faces = faceCascade.detectMultiScale( ? ? ? ?gray, ? ? ? ?scaleFactor=1.2, ? ? ? ?minNeighbors=5, ? ? ? ?minSize=(32, 32) ? ? ? ) ? ? ? ?for (x, y, w, h) in faces: ? ? ? ? ? ?cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) ? ? ? ? ? ?idnum, confidence = recognizer.predict(gray[y:y+h, x:x+w]) ? ? ? ? ? ?user_id=str(idnum) ? ? ? ? ? ?if user_id in list(user_info.keys()): ? ? ? ? ? ? ? ?if confidence < 100: ? ? ? ? ? ? ? ? ? ?idname = user_info[user_id] ? ? ? ? ? ? ? ? ? ?confidence = "{0}%".format(round(100 - confidence)) ? ? ? ? ? ? ? ?else: ? ? ? ? ? ? ? ? ? ?idname = "unknown" ? ? ? ? ? ? ? ? ? ?confidence = "{0}%".format(round(100 - confidence)) ? ? ? ? ? ?else: ? ? ? ? ? ? ? ?idname = "Not exist this people!" ? ? ? ? ? ? ? ?confidence=0 ? ? ? ? ? ?cv2.putText(img, str(idname), (x+5, y-5), font, 1, (0, 0, 255), 1) ? ? ? ? ? ?cv2.putText(img, str(confidence), (x+5, y+h-5), font, 1, (0, 0, 0), 1) ? ? ? ?cv2.imshow('camera', img) ? ? ? ?k = cv2.waitKey(10) ? ? ? ?if k == 27: ? ? ? ? ? ?break ? ?cam.release() ? ?cv2.destroyAllWindows()if __name__ == '__main__': ? ?main()六、結語
人臉識別是人工智能應用的一個方面,現今已經被應用在很多方面,比如:手機面部解鎖、火車站進站檢票、超市掃臉付款等。本項目希望有助于各位讀者實現自己的人臉識別應用。
(本教程參考‘’用樹莓派實現實時的人臉檢測‘’以及網頁資料。)
文章來源:筆記整理微信編輯:徐恩偉
【實用軟件推薦---混合式學習環境下實用教育技術與工具】
【教學】作為教師,我們最應該教給學生什么?
【13】項目案例—Python爬取鏈家網租房信息
【00】Python編程語言機房教學環境 ?安裝指南
【12】Python與MySQL數據庫的交互 筆記
【人工智能教學】人工智能將使中國教育僅存的優勢蕩然無存
???需要您的轉發和閱讀哦
總結
以上是生活随笔為你收集整理的opencv 训练人脸对比_【项目案例python与人脸识别】基于OpenCV开源计算机视觉库的人脸识别之python实现...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bat启动脚本 springboot_奇
- 下一篇: cmd imp导入dmp文件_PLSQL