فرض کنید قصد دارید یک سیستم حضور غیاب مبتنی بر تشخیص چهره را طراحی کنید. قسمت استخراج چهره، از تصویر کلی رسیده را بررسی کردیم. اما در ادامه چگونه تشخیص دهیم که این چهره متعلق به چه شخصی است؟ با توجه به اینکه تصویر چهرهی یک شخص میتواند از زوایای مختلفی تهیه شود و یا حتی حالات روحی منعکس شدهی در صورت نیز در تغییر بیت و بایتهای تصویر چهره مؤثر هستند.
بانک اطلاعاتی تصاویر چهرههای اشخاص
در اینجا از تصاویر «The Database of Faces» استفاده خواهیم کرد. این مجموعه شامل تصاویر 40 شخص، در 10 حالت مختلف است.
برای بارگذاری این تصاویر و استفادهی از آنها در الگوریتم FisherFaceRecognizer نیاز به ساختار ذیل است:
public class ImageInfo { public Mat Image { set; get; } public int ImageGroupId { set; get; } public int ImageId { set; get; } }
var images = new List<ImageInfo>(); var imageId = 0; foreach (var dir in new DirectoryInfo(@"..\..\Images").GetDirectories()) { var groupId = int.Parse(dir.Name.Replace("s", string.Empty)) - 1; foreach (var imageFile in dir.GetFiles("*.pgm")) { images.Add(new ImageInfo { Image = new Mat(imageFile.FullName, LoadMode.GrayScale), ImageId = imageId++, ImageGroupId = groupId }); } }
تشخیص یک چهرهی اتفاقی
پس از تشکیل لیست تصاویر، اکنون کار با الگوریتم FisherFaceRecognizer به نحو ذیل خواهد بود:
var model = FaceRecognizer.CreateFisherFaceRecognizer(); model.Train(images.Select(x => x.Image), images.Select(x => x.ImageGroupId)); var rnd = new Random(); var randomImageId = rnd.Next(0, images.Count - 1); var testSample = images[randomImageId]; Console.WriteLine("Actual group: {0}", testSample.ImageGroupId); Cv2.ImShow("actual", testSample.Image); var predictedGroupId = model.Predict(testSample.Image); Console.WriteLine("Predicted group: {0}", predictedGroupId);
سپس با استفاده از کلاس Random، یک تصویر اتفاقی انتخاب میشود.
اکنون این تصویر اتفاقی به متد Predict ارسال شده و نتیجهی آن، شماره گروه چهرهی تشخیص داده شدهاست. به این ترتیب میتوان تشخیص داد که یک تصویر مفروض ورودی، متعلق به چه شخصی (یا در اینجا گروه یا برچسب) است.
کدهای کامل این مثال را از اینجا میتوانید دریافت کنید.