[英]Face recognition Using EigenObjectRecognizer
我對 EMGUCV 很陌生。 我想做一個人臉識別系統,我已經實現了,但結果不可接受。 這是我的識別代碼:
public List<Person> RecognizeFaces(List<Image<Bgr, byte>> faces)
{
List<Person> RecognizedPersons = new List<Person>();
MCvTermCriteria termCrit = new MCvTermCriteria(TrainDB.Count, 0.001);
EigenObjectRecognizer recognizer = new EigenObjectRecognizer(
this.ToGrayList(this.TrainDB),
labels.ToArray(),
7000, // I changed this argument many times but nothing has changed (1000, 2000, ...
ref termCrit);
string label = "";
for (int i = 0; i < faces.Count; i++)
{
label = recognizer.Recognize(faces[i].Convert<Gray, byte>());
RecognizedPersons.Add(new Person(faces[i],!label.Equals("") ? label : "unknown"));
}
return RecognizedPersons;
}
此函數從輸入圖像中獲取先前檢測到的人臉列表,並返回一個類型Person
列表,其中每個人都包含一個圖像和一個標簽給識別的 person 。 我的問題是為什么結果不好? 我的代碼有問題嗎? 或者訓練集TrainDB
,如果是這樣,創建訓練集時要遵循的最佳指南是什么?
我根據這個收集了訓練集:1-在包含一個人的圖像上應用人臉檢測(使用 EMGU) 2-然后我將檢測到的人臉大小調整為 200 : W, 200 : H
我的訓練集中的一些圖像:
一些測試圖像的例子:
我的最后一個問題 .. Emgu/OpenCv 是用於人臉識別的強大工具嗎? 或者還有其他可以更准確的結果嗎?
您的訓練集應該具有相同的大小(維度)和灰度圖像
List<Image<Gray, byte>>
您能告訴我們您嘗試檢測的人臉的捕獲方法嗎? 你只是給它位圖並要求它識別嗎? 您需要做的是首先進行面部檢測,您可以使用相同的庫,例如:
我已經將 5 張獨特的面孔放入我的訓練數據中(每個面孔和標簽之一)並且它非常擅長檢測。 所以你不需要每人 20 多張圖片,但我想這會大有幫助......
face = new HaarCascade("haarcascade_frontalface_default.xml"); //You will need an XML training file
gray = MyImage.Convert<Gray, Byte>();
MCvAvgComp[][] facesDetected = gray.DetectHaarCascade(face,1.2, 10,
Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
new Size(20, 20));
其中 MyImage 是您的實際文件(作為同一類的圖像對象)。 您可以在此處閱讀有關 Haar 級聯對象檢測的信息: https : //docs.opencv.org/3.4/d7/d8b/tutorial_py_face_detection.html
所以假設你現在在你的 facesDetected 數組中只有一張臉(當 MyImage 中有多個人臉時,第二維索引找到的人臉總數):
face = MyImage.Copy(facesDetected[0][0].rect).Convert<Gray, byte>().Resize(100, 100,
Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
現在你有一個調整大小和轉換的臉,你可以使用。 因此,一旦您捕獲了所有訓練數據的標准化人臉,請將它們保存到圖像數組中,將標簽保存在字符串數組中並使用以下命令來識別人臉:
MCvTermCriteria termCrit = new MCvTermCriteria(TrainingImages.Length, 0.001);
EigenObjectRecognizer recognizer = new EigenObjectRecognizer(
TrainingImages, //as Image<Gray, byte>[] array
TrainingImageLabels, //as string[] array
3000,
ref termCrit);
name = recognizer.Recognize(result);
// Name will contain the recognised label
這相當有效,當你有預訓練的圖像時,就我而言,我試圖檢測獨特的面孔。 這種方法的工作方式類似於統計數據,我試圖弄清楚識別器是否能夠返回一些我可以用來拒絕建議名稱的置信度。 但是,我希望這對你有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.