生活随笔
收集整理的這篇文章主要介紹了
人脸识别准确概率计算——超详细
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言:
雖然本段代碼的目標是準確率計算,但識別率只是提供了一個簡單的思路,單純計算了正確的概率。代碼的主要部分還是圖片的匹配識別內容,所有的代碼塊都有響應的詳盡解釋,適合初期接觸和了解的learner閱讀。
在后續準備訓練數據時繁瑣的工作令人頭大,準備了幾十個圖像就花去了我大半時間,圖像處理中往往需要大量圖片進行訓練,顯然這種情況下這種方法是不可行的,不過目前也是一種思路,接下來在接觸的過程中會繼續了解相關的計算和評測方法,爭取找到最佳,計算效果最好的方法進行準確率的計算。本人也是才接觸這部分內容,了解內容有限,大家有比較好的方法方式歡迎評論交流。
文章目錄
1 概率計算公式
實現自動計算識別準確概率:
rate=nr/(nc?nu)rate = n^r/(n^c-n^u) rate=nr/(nc?nu)
其中,上式rate為識別準確概率, nr為正確識別人臉圖片個數,nc為文件夾下圖片總數量,nu為未識別到人臉區域圖像數量。
2 實現代碼部分
該方法正確計算前提是:**將測試圖像和訓練的圖像分辨放在一個文件夾下,并將測試圖像與已有的訓練圖像使用相同的圖片文件名稱和格式。**因為我目前采取的是將圖片名稱作為圖像是否正確識別判斷的根據,根據測試圖像名稱和匹配的圖像名稱是否相同,判斷識別是否正確。也嘗試過使用面部編碼數據是否相等進行判斷,測試結果顯然,這種方式是不可行 的,因為同一個人在不同照片中由于角度或者場景等各種因素的影響,編碼方式不可能完全相同。
識別方法采用:opencv + face_recognition
識別率計算代碼如下:
"""
import os
import cv2
import face_recognition
import numpy
as np
def trainImage():train_dir
= 'rate_train_data' train_image_list
= os
.listdir
(train_dir
)print("訓練圖片數量:%s"%len(train_image_list
))train_image_names_list
= []train_image_paths_list
= []train_image_rec_list
= []train_image_encodings_list
= []'源文件讀取訓練數據'for per_image
in train_image_list
:name
= per_image
.strip
('.jpg')train_image_names_list
.append
(name
) train_per_image_path
= os
.path
.join
(train_dir
,per_image
)train_image_paths_list
.append
(train_per_image_path
) train_per_image_rec
= face_recognition
.load_image_file
(train_per_image_path
)train_image_rec_list
.append
(train_per_image_rec
)train_per_image_encoding
= face_recognition
.face_encodings
(train_per_image_rec
)[0]train_image_encodings_list
.append
(train_per_image_encoding
)return train_image_names_list
,train_image_encodings_list
def testImage():'進行測試文件的自動讀取'test_dir
= 'rate_test_data' test_image_list
= os
.listdir
(test_dir
)test_date_num
= len(test_image_list
)print('測試圖片數量為:%s 張'%test_date_num
)train_image_names_list
, train_image_encodings_list
= trainImage
()print('========================')print("源文件讀取完成。。。")reco_count
= 0 decate_count
= 0 right_reco_count
= 0 undecate_count
= 0 unsuccess_reco_count
=0 unsuccess_reco_name_count
= [] undecate_name_list
= [] false_right_reco_name_list
= [] print("圖像識別中。。。")for per_image
in test_image_list
:name
= per_image
.strip
('.jpg')test_per_image_path
= os
.path
.join
(test_dir
, per_image
)per_image_cv
= cv2
.imread
(test_per_image_path
)per_image_cvcolor
= cv2
.cvtColor
(per_image_cv
,cv2
.COLOR_BGR2RGB
)'此處圖片沒有檢測到人臉時往下執行則會報錯,需要在下一步之前增加判斷條件:是否檢測到人臉信息!'per_image_encoding
= face_recognition
.face_encodings
(per_image_cvcolor
)'判斷條件:圖片人臉編碼是否為空!'if len(per_image_encoding
)>0:decate_count
+=1per_image_encoding
= per_image_encoding
[0]"圖像人臉識別部分代碼,同時使用compare_faces和face_distance方法提高訓練結果準確度。"matchs_bool_list
= face_recognition
.compare_faces
(train_image_encodings_list
,per_image_encoding
,tolerance
=0.46)print(matchs_bool_list
)print(train_image_names_list
)face_distances_list
= face_recognition
.face_distance
(train_image_encodings_list
,per_image_encoding
)print(face_distances_list
)best_match_index
= np
.argmin
(face_distances_list
)print(best_match_index
)print("name:%s,match_name:%s" % (name
, train_image_names_list
[best_match_index
]))if matchs_bool_list
[best_match_index
]:match_name
= train_image_names_list
[best_match_index
]print('匹配人物姓名:%s'%match_name
)reco_count
+=1else:unsuccess_reco_count
+=1unsuccess_reco_name
= name
+'.jpg'unsuccess_reco_name_count
.append
(unsuccess_reco_name
)match_name
= 'unknown_person'if name
== match_name
:right_reco_count
+=1else:false_right_reco_name
= name
+'.jpg'false_right_reco_name_list
.append
(false_right_reco_name
)else:undecate_count
+=1undecate_name
= name
+'.jpg'undecate_name_list
.append
(undecate_name
)print("圖片%s.jpg未檢測到有效人臉區域,請檢測上傳圖片是否為人臉正面區域!"%name
)print("成功檢測人臉圖片數量:%s,未檢測到人臉圖片數量:%s || 成功識別成功匹配人臉數量:%s,成功識別未成功匹配到人臉圖片數量%s || 正確匹配人臉圖片數量:%s"%(decate_count
,undecate_count
,reco_count
,unsuccess_reco_count
,right_reco_count
))print("成功識別未成功匹配到人臉圖片名稱列表:%s"%(unsuccess_reco_name_count
))print("識別匹配成功,但未正確匹配人臉圖片名稱列表:%s" % (false_right_reco_name_list
))print("未成功檢測人臉圖片名稱列表:%s" % (undecate_name_list
))reco_rate
= reco_count
/ (test_date_num
- undecate_count
)right_reco_rate
= right_reco_count
/ (test_date_num
- undecate_count
)print("識別完成!識別成功率為:%s%%,識別人物姓名準確匹配率為:%s%%" % ((reco_rate
* 100),(right_reco_rate
* 100)))
總結
以上是生活随笔為你收集整理的人脸识别准确概率计算——超详细的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。