境搭建到門禁系統(tǒng))
簡介面向高校畢業(yè)設計、期末大作業(yè)及課程設計場景這份基于深度學習的人臉識別研究項目源碼包提供了完整的工程化實現(xiàn)適合具備一定Python基礎的計算機相關專業(yè)學生作為參考或二次開發(fā)。壓縮包共39個文件包含18個Python腳本、14個編譯產生的pyc緩存文件以及深度學習模型權重params/h5、配置文件json、面部關鍵點數(shù)據(jù)dat和說明文檔md整體大小約23MB結構清晰便于按模塊閱讀與部署。已有155人學習下載。項目覆蓋LFFD、DSFD等主流檢測算法的調用與識別流程并配有詳細注釋便于理解關鍵實現(xiàn)思路同時包含訓練相關腳本與預訓練參數(shù)可直接體驗完整的人臉檢測與識別效果。作為導師認可的高分項目其在系統(tǒng)功能、界面交互與代碼組織上均有較好的完成度適合作為畢業(yè)設計或課程項目的起點可縮短環(huán)境搭建與功能實現(xiàn)周期。1. 拿到“深度學習人臉識別畢設”這個標題先別急著調包先說一句得罪人的話大多數(shù)“基于深度學習的人臉識別”畢業(yè)設計最后都做成了調包大戰(zhàn)——代碼能跑但問原理就卡殼。不是學生不努力是方向選錯了。拿這個標題做畢設目標不是重新發(fā)明一個人臉識別算法而是把一個深度學習項目完整落地成“能運行、能演示、能答辯、能解釋”的工程。它要解決的實際問題很簡單給定一張臉程序能從庫里找到這個人是誰或者告訴你“庫中沒有這個人”。放在門禁、考勤、課堂簽到場景里這就叫可用。這篇文章按一線工程的做法來拆先選一條不被環(huán)境折騰死的技術路線再把采集、建模、比對、界面串成完整工程最后把精度調優(yōu)、文檔組織和答辯預演這些“畢設真正打分的地方”講透。適合兩類人一類是選了這個題目的畢業(yè)生照著步驟能把項目跑起來另一類是打算拿人臉識別做課程設計或入門深度學習的工程師看完能避開我踩過的坑。2. 人臉識別項目的技術選型為什么我放棄了自己訓CNN這條路2.1 三種主流方案的優(yōu)缺點對比做畢設的第一關不是寫代碼是選路線。人臉識別落到代碼層面有三條常見路線選錯一條后面全是血淚。第一條是OpenCV的Haar Cascade人臉檢測加LBPH特征識別。這條路線完全不走深度學習性能差、角度敏感、光線一變就翻車但代碼量極小適合演示。第二條是用深度學習模型做人臉檢測比如MTCNN或RetinaFace配合FaceNet或ArcFace做特征提取這是工業(yè)界的主流配置也是“基于深度學習”這個標題真正對應的技術棧。第三條是在第二條基礎上直接用封裝好的庫比如face_recognition庫或者DeepFace庫底層自動調用深度學習模型把特征提取的細節(jié)全部隱藏。對畢設項目來說我一般會建議選第三條理由很現(xiàn)實你把畢業(yè)設計的時間花在從零寫ResNet、把訓練調到收斂上極可能三個月過去模型還在過擬合而用封裝庫你一天就能跑通整個流程省下來的時間用來理解模型原理、做界面、寫文檔、準備答辯。面試或者答辯時你要能說清楚“我用的face_recognition庫底層是dlib的HOG人臉檢測加ResNet的128維特征提取”這已經是“基于深度學習”的合格答卷了。2.2 我最終采用的架構與目錄規(guī)劃選定封裝庫路線后整個工程按職責拆成六塊人臉錄入、特征編碼、實時識別、界面展示、數(shù)據(jù)存儲、文檔說明。架構上分層清晰答辯老師問起來你也好解釋采集層負責從攝像頭或圖片拿到人臉圖像預處理層做對齊和歸一化特征層用預訓練的深度學習模型把臉轉為128維向量比對層算歐氏距離并和閾值比較。這樣分層之后每一層都能獨立替換和測試。工程目錄我習慣這樣規(guī)劃新手也能直接抄face_recognition_project/ ├── main.py # 主入口啟動界面 ├── register_face.py # 人臉錄入模塊 ├── recognizer.py # 識別核心模塊 ├── models/ # 存放模型文件 ├── dataset/ # 原始人臉圖片 ├── encodings/ # 序列化后的特征向量 ├── requirements.txt # 依賴清單 └── docs/ # 畢業(yè)設計文檔目錄規(guī)劃的意義不只是整潔它對應了畢業(yè)設計文檔里的“系統(tǒng)模塊劃分”章節(jié)。你寫文檔的時候每個目錄就是一個模塊每個模塊有職責說明、核心函數(shù)、測試結果這比臨時拼湊一個main.py到底要扎實得多。2.3 環(huán)境安裝的完整操作步驟選好路線先把環(huán)境裝通。我用的是Python 3.8搭配Windows 11這套組合踩坑最少。Python版本別選太新的部分深度學習庫的預編譯包在3.11以上的Windows上經常找不到對應版本。安裝流程如下每一步對應一個真實的操作目的。第一步創(chuàng)建虛擬環(huán)境并激活python -m venv face_env face_env\Scripts\activate # Windows # 或 source face_env/bin/activate (Linux/Mac)虛擬環(huán)境不是裝樣子是為了隔離依賴。我見過太多項目毀在“裝了個新庫把dlib版本擠掉了”這種事上虛擬環(huán)境就是后悔藥。第二步安裝核心依賴pip install opencv-python pip install face_recognition pip install numpy pip install pillow第三步如果你需要界面展示加裝一個GUI庫。這里推薦tkinterPython自帶的零依賴做畢設夠用pip install tk裝完之后做一個快速驗證確認環(huán)境可用。用以下命令從攝像頭抓一幀當前畫面并顯示人臉位置import cv2 import face_recognition cap cv2.VideoCapture(0) ret, frame cap.read() if ret: face_locations face_recognition.face_locations(frame) print(f檢測到 {len(face_locations)} 張臉) for top, right, bottom, left in face_locations: cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2) cv2.imwrite(test_result.jpg, frame) cap.release()這段代碼的邏輯是打開默認攝像頭讀取一幀圖像用face_recognition的HOG檢測器找出畫面里的人臉位置把人臉框畫出來并保存。參數(shù)說明face_locations返回的是(top, right, bottom, left)元組列表注意順序是“上右下左”不是常見的(x, y, w, h)畫矩形框時別傳錯。如果這里能輸出一張帶人臉框的圖片你的深度學習人臉識別環(huán)境就算立住了。3. 把“識別”做出來從錄入人臉到實時比對的最小系統(tǒng)3.1 人臉錄入模塊采集、對齊與特征編碼環(huán)境通了核心邏輯從錄入模塊開始。錄入模塊的職責是拿到一張真人臉圖片檢測并截取人臉區(qū)域用深度學習模型提取128維特征向量把向量保存到本地文件。這一步是后續(xù)所有比對的基準。以下是我常用的錄入代碼注釋已經標了關鍵邏輯import cv2 import face_recognition import pickle import os def register_face(name, image_path, encodings_pathencodings.pkl): 錄入一張人臉檢測-編碼-序列化保存 name: 人員姓名 image_path: 包含清晰正臉的圖片 # 1. 加載圖片并轉為RGB img cv2.imread(image_path) rgb_img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 2. 定位人臉 face_locations face_recognition.face_locations(rgb_img) if len(face_locations) 0: raise ValueError(f未在 {image_path} 中檢測到人臉請換一張正臉照片) if len(face_locations) 1: raise ValueError(檢測到多張臉請裁剪為單人照片) # 3. 提取128維人臉特征 face_encodings face_recognition.face_encodings(rgb_img, face_locations) if len(face_encodings) 0: raise ValueError(人臉檢測成功但特征提取失敗) # 4. 保存到本地特征庫 data {} if os.path.exists(encodings_path): with open(encodings_path, rb) as f: data pickle.load(f) data[name] face_encodings[0] with open(encodings_path, wb) as f: pickle.dump(data, f) print(f已錄入 {name}, 特征維度: {len(face_encodings[0])})這段代碼的邏輯說明第1步把BGR轉RGB是因為OpenCV默認讀入的是BGR順序而face_recognition底層用的dlib和深度學習模型都是按RGB訓練的不做轉換就會導致顏色通道錯亂人臉檢測率直線下降。第2步做人臉定位返回的face_locations是坐標元組。第3步是關鍵中的關鍵——face_encodings調用的是預訓練好的ResNet模型輸入是RGB人臉圖像輸出是128維浮點向量。第4步用pickle把向量序列化到文件這樣下次啟動程序不用重新算一遍直接加載比對。參數(shù)說明encodings_path是特征庫文件路徑默認encodings.pkl。這個文件是累積的每錄入一個人就往字典里加一個鍵值對。有一個注意點不要用.jpg格式的壓縮參數(shù)保存pkl文件那會損壞二進制結構必須用“wb”模式。3.2 實時識別模塊攝像頭逐幀檢測與距離計算錄入完成之后是識別模塊。識別模塊的邏輯是每幀從攝像頭抓圖檢測人臉提取特征然后和特征庫里的所有人逐一比對找到距離最小的那個人如果距離小于閾值就判定為“這個人是誰”否則判定為“陌生人”。import cv2 import face_recognition import pickle def load_known_encodings(encodings_pathencodings.pkl): 加載特征庫返回 (名字列表, 特征矩陣) with open(encodings_path, rb) as f: data pickle.load(f) names list(data.keys()) encodings list(data.values()) return names, encodings def recognize_from_camera(encodings_pathencodings.pkl, distance_threshold0.45): 實時攝像頭識別主循環(huán) distance_threshold: 歐氏距離閾值越小判定越嚴格 known_names, known_encodings load_known_encodings(encodings_path) cap cv2.VideoCapture(0) while True: ret, frame cap.read() if not ret: break # 縮小畫面加速檢測縮到1/2精度換約2倍速度 small_frame cv2.resize(frame, (0, 0), fx0.5, fy0.5) rgb_small cv2.cvtColor(small_frame, cv2.COLOR_BGR2RGB) # 當前幀的人臉位置與特征 face_locations face_recognition.face_locations(rgb_small) face_encodings face_recognition.face_encodings(rgb_small, face_locations) for face_encoding in face_encodings: # 和庫中每個人的特征算歐氏距離 distances face_recognition.face_distance(known_encodings, face_encoding) min_index distances.argmin() min_distance distances[min_index] if min_distance distance_threshold: name known_names[min_index] confidence round(1 - min_distance, 3) else: name Unknown confidence round(1 - min_distance, 3) # 在原始幀上標注坐標需要放大回原始尺寸 top, right, bottom, left face_locations[0] top, right, bottom, left top*2, right*2, bottom*2, left*2 cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2) cv2.putText(frame, f{name} ({confidence}), (left, top-10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2) cv2.imshow(Face Recognition, frame) if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()這段代碼有兩個關鍵參數(shù)。第一個是distance_threshold默認0.45它的含義是特征向量之間的歐氏距離小于這個值就認為是同一個人。這個值不能亂調調大了會出現(xiàn)“誰都能識別成功”的假陽性調小了會出現(xiàn)“本人都不認識”的假陰性。我實測下來0.4到0.45這個區(qū)間在普通教室光線和攝像頭上表現(xiàn)比較均衡。第二個是fx0.5的縮放比它的作用是降采樣加速。face_recognition庫的人臉檢測在1080p畫面上單幀可能要0.3秒縮放到一半后基本能跑到實時代價是高分辨率下的小臉可能檢測不到。還有坐標恢復的細節(jié)因為檢測是在縮小后的圖像上做的畫框時要把坐標乘回2倍不然框會偏到左上角去這是新手最容易翻車的地方。3.3 運行順序與驗收標準整套系統(tǒng)運行順序是固定的先注冊后識別。啟動識別前確認encodings.pkl文件已經生成并且內容不為空。我一般用下面這個命令來驗收python -c import pickle; datapickle.load(open(encodings.pkl,rb)); print(庫中人臉數(shù):, len(data))如果這個命令能正確輸出數(shù)量說明錄入環(huán)節(jié)沒問題。接著運行main.py在攝像頭前分別測試三種情況庫里的人正臉靠近、陌生人靠近、庫里的人戴眼鏡或側臉靠近。第一個能識別出正確名字第二個顯示Unknown第三個有一定概率誤判——這三個表現(xiàn)會直接成為你畢業(yè)設計“實驗結果與分析”章節(jié)的素材。4. 從60分到85分的關鍵把精度調上去而不是堆代碼4.1 影響識別精度的四個因素與對應參數(shù)很多人的畢設停在“能跑就行”但答辯老師真正會問的是“你做了哪些優(yōu)化”。精度調優(yōu)不是玄學是可以系統(tǒng)化拆解的四件事。第一件是檢測端優(yōu)化。face_recognition默認使用的HOG檢測器對模糊人臉和小臉不敏感換成CNN檢測器能顯著提升側臉和遠距離小臉的檢出率。代價是速度變慢一幀可能要到1秒以上。做法是給face_locations加model參數(shù)face_locations face_recognition.face_locations( rgb_small, modelcnn, # 默認是hog換cnn后精度明顯提升 number_of_times_to_upsample1 )參數(shù)說明number_of_times_to_upsample表示對圖像做多少次上采樣再進行檢測。值越大越容易找到小臉但計算量會指數(shù)級上升。配合前面的縮放策略我一般把縮放設為0.5上采樣設為1兼顧速度和檢出率。第二件是特征比對端的閾值校準。0.45這個默認值不是拍腦袋定的它對應的是模型在百萬級人臉數(shù)據(jù)上的統(tǒng)計分布。但你的攝像頭型號、教室光線、錄入照片的素質都會讓最優(yōu)閾值偏移。正確做法是在你的數(shù)據(jù)集上做一次閾值掃描實驗準備30張“本人”照片和30張“非本人”照片從0.35到0.55步長0.01逐一測試找到錯誤接受率和錯誤拒絕率最均衡的那個點。第三件是錄入照片質量控制。錄入時務必使用正臉、平視、光線均勻的照片不要用美顏過的圖片。美顏會改特征點位置我用美顏圖錄入后識別率直接掉了兩成。錄入時檢測人臉質量分數(shù)這個功能face_recognition沒有直接暴露但你可以通過檢測人臉尺寸來間接判斷——框的寬度小于200像素的建議重拍。第四件是改進程架構從單幀識別改成“多幀確認”。攝像頭識別時每幀都做判定很容易出現(xiàn)抖動某一幀由于角度光線原因距離剛好越過閾值顯示成了Unknown。工業(yè)界常見做法是滑動窗口投票連續(xù)5幀里超過3幀認為是同一個人才打出名字。實現(xiàn)起來很簡單from collections import deque vote_buffer deque(maxlen5) # 記錄最近5幀的識別結果 # 每幀識別后 vote_buffer.append(name) if vote_buffer.count(name) 3: final_name name else: final_name Pending這個緩沖機制能把識別穩(wěn)定性提升一個檔次答辯時也是很好的“系統(tǒng)優(yōu)化”實錘。4.2 自己微調一個輕量CNN模型作為“深度學習工作量”如果你的畢設評審特別看重“基于深度學習”這幾個字或者老師明確要求看到你自己的訓練代碼那就不能用封裝庫糊弄過去了。常見做法是自己寫一個輕量CNN在公開的人臉數(shù)據(jù)集上做訓練然后在你的識別系統(tǒng)里作為特征提取模型替換掉face_recognition默認的ResNet。這里有一個務實的折中不追求訓練出一個超越FaceNet的模型而是訓練一個“能證明你理解深度學習”的替代品。比如用PyTorch搭建一個MobileNet風格的小網絡在FERET或CelebA的裁剪子集上訓練人臉分類任務把最后的全連接層之前的特征當作128維向量輸出。import torch.nn as nn class LightFaceNet(nn.Module): 輕量級人臉特征提取網絡輸出128維向量 def __init__(self, feature_dim128): super().__init__() self.conv_layers nn.Sequential( nn.Conv2d(3, 32, kernel_size3, padding1), nn.ReLU(inplaceTrue), nn.MaxPool2d(2), nn.Conv2d(32, 64, kernel_size3, padding1), nn.ReLU(inplaceTrue), nn.MaxPool2d(2), nn.Conv2d(64, 128, kernel_size3, padding1), nn.ReLU(inplaceTrue), nn.MaxPool2d(2), ) self.fc nn.Linear(128 * 16 * 16, feature_dim) def forward(self, x): x self.conv_layers(x) x x.view(x.size(0), -1) x self.fc(x) return x這個網絡本身不復雜重點是你能夠在文檔里寫清楚每一層的輸入輸出尺寸輸入3通道RGB圖像經過三層卷積加池化特征圖尺寸從128x128降到16x16展平后經過全連接層輸出128維向量。訓練時用交叉熵損失和Adam優(yōu)化器batch size設為32初始學習率0.001在GPU上訓練50個epoch。訓練完成后把fc層輸出作為特征向量和face_recognition的特征做同樣的距離比對。這塊工作放進文檔里你的“深度學習含量”瞬間就立起來了——答辯時直接展示訓練loss曲線、驗證集準確率、混淆矩陣這是純調包給不了的底氣。4.3 訓練與測試的失敗觀察方法訓練自己寫的CNN時先別急著追求結果學會看訓練過程。我通常記錄三個指標訓練loss、驗證loss、驗證準確率。如果訓練loss下降但驗證loss上升這是過擬合解決方法是加dropout或者降低模型容量。如果訓練loss和驗證loss都不下降這是學習率太大或者網絡結構有問題把學習率降到原來的十分之一再看。結合人臉識別場景有一個特殊問題叫“類別不平衡”庫里20個人每個人20張訓練圖這個數(shù)據(jù)量對深度學習來說太小了。這就是為什么我不建議你在沒有預訓練模型的情況下從零訓練人臉識別網絡——公開的人臉識別模型動輒用百萬級人臉訓練你只有幾百張圖訓練出來的特征遷移性很差換個人換個光線就崩。所以我的最終方案是你微調出來的LightFaceNet作為“學術工作量展示”生產識別還是用face_recognition的預訓練ResNet兩條腿走路哪個都能講。5. 避坑指南人臉識別畢設最容易翻車的5個細節(jié)5.1 dlib裝不上導致整個環(huán)境崩盤現(xiàn)象pip install dlib在Windows上報錯說找不到CMake或編譯失敗很多人卡在這里兩三天然后放棄整個項目。原因face_recognition庫底層依賴dlib而dlib在Windows上的安裝需要C編譯環(huán)境。某些Python版本沒有對應的預編譯wheel包pip會現(xiàn)場編譯源碼而你的機器上又沒有VS Build Tools。解決一是換Python版本到3.7或3.8這兩個版本有現(xiàn)成的預編譯wheel包二是如果實在裝不上用conda安裝conda install -c conda-forge dlibconda通常會幫你處理二進制依賴三是換DeepFace庫它的底層是TensorFlow或PyTorch加OpenCV不需要dlib安裝體驗友好很多代價是模型文件較大且首次運行要聯(lián)網下載權重。5.2 攝像頭打不開或畫面全黑現(xiàn)象cv2.VideoCapture(0)執(zhí)行了但讀取到的frame是None或者窗口彈出來是純黑畫面。原因筆記本攝像頭被其他程序占用、OpenCV讀取的攝像頭索引不對、或攝像頭分辨率設置超出了設備支持范圍。我見過最隱蔽的一個原因是虛擬機里跑OpenCV默認索引對應的是虛擬攝像頭。解決先用cap.isOpened()判斷攝像頭狀態(tài)沒打開就嘗試索引1或2。設置分辨率用cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)和cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)把畫質降到640x480能顯著減少讀取延遲。還有一個被人忽視的點如果你在OpenCV創(chuàng)建窗口之后才調用人臉識別攝像頭緩沖區(qū)里可能積壓了舊幀先讀幾幀丟棄再進入識別循環(huán)。5.3 人臉特征庫的序列化損壞現(xiàn)象錄入時一切正常第二次啟動程序加載encodings.pkl時直接報EOFError或者輸出亂碼。原因pickle文件寫入過程中程序被強退或者用文本模式打開過這個文件導致二進制結構被破壞。另一個常見原因是同時運行了兩個腳本一個在寫pkl另一個在讀文件鎖沖突。解決寫入時先寫臨時文件再重命名避免寫入中途崩潰導致文件損壞。讀取前先判斷文件是否存在并且大小大于零import os import pickle if os.path.exists(encodings_path) and os.path.getsize(encodings_path) 0: with open(encodings_path, rb) as f: data pickle.load(f) else: data {}這個防御性寫法雖然簡單但能讓你的程序在任何非正常退出之后都能自愈對拿項目去演示的場景非常重要。5.4 識別結果在名字和Unknown之間瘋狂跳動現(xiàn)象同一個同學站在攝像頭前正常光線時識別成正確名字稍微偏個頭就變Unknown再偏回來又識別成功整個人名在屏幕上閃爍。原因距離閾值設得恰好卡在本人特征的歐氏距離邊界上。通常是因為錄入照片和攝像頭實時畫面的光線差異過大或者攝像頭幀率低導致畫面模糊提取出偏移的特征向量。解決先用5.1節(jié)提到的閾值掃描方法校準距離閾值再疊加“多幀確認”機制把單幀硬判定改成連續(xù)幀投票。如果還不行就要懷疑錄入照片本身的正臉程度——重新錄入一張和攝像頭角度接近的照片很多“識別不穩(wěn)”的案例根源都在錄入環(huán)節(jié)。5.5 畢業(yè)設計文檔寫成了“代碼說明書”現(xiàn)象把main.py里每行代碼復制進文檔配上注釋就當作系統(tǒng)設計與實現(xiàn)章節(jié)了。答辯時老師一翻就問“你的設計思路是什么”學生答不上來。原因把“文檔說明”理解成了代碼注釋搬運。畢設文檔的核心是說明“為什么這么做”而不是“代碼怎么寫的”代碼只是實現(xiàn)的下游產物。解決按“需求分析-系統(tǒng)設計-模塊實現(xiàn)-測試驗證”這條線組織文檔。系統(tǒng)設計章節(jié)要畫出模塊圖描述每個模塊輸入輸出和調用關系模塊實現(xiàn)章節(jié)每個功能附核心代碼片段但必須配三段內容邏輯說明、關鍵參數(shù)解釋、該模塊的異常處理設計。答辯老師最滿意的狀態(tài)是你文檔里寫著“本模塊使用CNN檢測器替代HOG檢測器將側臉檢出率提升約15%”而你的測試數(shù)據(jù)正好證明了這個數(shù)字。這個習慣你以后做工程寫技術方案也用得上越早培養(yǎng)越好。6. 把工程升級成“門禁演示系統(tǒng)”驗證方法與進階技巧到這里基礎識別已經跑通但直接拿去做答辯演示還是偏單調。最后一節(jié)課我再教你一個加分動作把命令行識別工程升級成帶界面的“門禁模擬系統(tǒng)”這在熱詞里是高頻場景——人臉識別門禁機、人臉識別門禁系統(tǒng)設計都是同一個技術骨架。升級的核心不是重寫代碼是加兩層一層是人機界面一層是記錄邏輯。界面我用tkinter做控件就三個啟動識別按鈕、識別結果顯示標簽、出入記錄列表框。記錄邏輯是把每一次“識別成功”的姓名和時間追加到一個CSV文件里這個文件就是你文檔里的“考勤記錄表”。import tkinter as tk from datetime import datetime import csv class AccessControlApp: def __init__(self): self.root tk.Tk() self.root.title(門禁模擬系統(tǒng)) self.status_label tk.Label(self.root, text待機中, font(SimHei, 20)) self.status_label.pack(pady20) self.start_btn tk.Button( self.root, text開始識別, commandself.start_recognition, font(SimHei, 14) ) self.start_btn.pack(pady10) self.log_listbox tk.Listbox(self.root, width40, height10) self.log_listbox.pack(pady10) def write_log(self, name): now datetime.now().strftime(%Y-%m-%d %H:%M:%S) with open(access_log.csv, a, newline, encodingutf-8) as f: writer csv.writer(f) writer.writerow([now, name, 允許通行]) self.log_listbox.insert(tk.END, f{now} {name} 允許通行)界面布局可以按自己的審美調核心驗證點有三個識別成功時記錄正確寫入Unknown不寫入記錄識別過程不卡主界面。你可以把識別線程放到threading里跑這是比主線程直接while True更接近真實產品的做法。最后說一個我的習慣每次答辯演示前一定重新錄入一次自己的照片刪除舊的pkl緩存再生成新文件。我吃過一次虧演示前用一年前的舊照片錄入現(xiàn)場光線反差太大臺上直接識別失敗那段空白時間足夠讓評分掉一檔。希望這個教訓能幫到你。本文還有配套的精品資源點擊獲取