تشخیص اشخاص به کمک OpenCV
فرض کنید قصد دارید یک سیستم حضور غیاب مبتنی بر تشخیص چهره را طراحی کنید. قسمت استخراج چهره، از تصویر کلی رسیده را بررسی کردیم. اما در ادامه چگونه تشخیص دهیم که این چهره متعلق به چه شخصی است؟ با توجه به اینکه تصویر چهرهی یک شخص میتواند از زوایای مختلفی تهیه شود و یا حتی حالات روحی منعکس شدهی در صورت نیز در تغییر بیت و بایتهای تصویر چهره مؤثر هستند.
بانک اطلاعاتی تصاویر چهرههای اشخاص
در اینجا از تصاویر «The Database of Faces» استفاده خواهیم کرد. این مجموعه شامل تصاویر 40 شخص، در 10 حالت مختلف است.
برای بارگذاری این تصاویر و استفادهی از آنها در الگوریتم FisherFaceRecognizer نیاز به ساختار ذیل است:
در اینجا Image، محتوای تصویر انتخابی است. مقدار ImageGroupId مساوی مقدار عددی نام پوشهی تصاویر منهای یک، تنظیم میشود. برای مثال پوشهی s1 به گروه صفر تنظیم میشود. ImageId نیز به یک مقدار خود افزایش یابنده معادل شمارهی جاری تصویر، تنظیم میگردد؛ به این صورت:
ابتدا پوشههای دیتابیس تصاویر یافت شده و سپس از نام هر پوشه یک شمارهی گروه (یا شمارهی شخص) استخراج میشود. سپس تصاویر این پوشه به لیست تصاویر اصلی اضافه خواهند شد.
تشخیص یک چهرهی اتفاقی
پس از تشکیل لیست تصاویر، اکنون کار با الگوریتم FisherFaceRecognizer به نحو ذیل خواهد بود:
پارامتر اول متد Train، لیست تصاویر است و پارامتر دوم، لیست شماره گروههای متناظر با هر تصویر است که در اینجا به عنوان برچسب نیز نامگذاری شدهاست.
سپس با استفاده از کلاس Random، یک تصویر اتفاقی انتخاب میشود.
اکنون این تصویر اتفاقی به متد Predict ارسال شده و نتیجهی آن، شماره گروه چهرهی تشخیص داده شدهاست. به این ترتیب میتوان تشخیص داد که یک تصویر مفروض ورودی، متعلق به چه شخصی (یا در اینجا گروه یا برچسب) است.
کدهای کامل این مثال را از اینجا میتوانید دریافت کنید.
فرض کنید قصد دارید یک سیستم حضور غیاب مبتنی بر تشخیص چهره را طراحی کنید. قسمت استخراج چهره، از تصویر کلی رسیده را بررسی کردیم. اما در ادامه چگونه تشخیص دهیم که این چهره متعلق به چه شخصی است؟ با توجه به اینکه تصویر چهرهی یک شخص میتواند از زوایای مختلفی تهیه شود و یا حتی حالات روحی منعکس شدهی در صورت نیز در تغییر بیت و بایتهای تصویر چهره مؤثر هستند.
بانک اطلاعاتی تصاویر چهرههای اشخاص
در اینجا از تصاویر «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 ارسال شده و نتیجهی آن، شماره گروه چهرهی تشخیص داده شدهاست. به این ترتیب میتوان تشخیص داد که یک تصویر مفروض ورودی، متعلق به چه شخصی (یا در اینجا گروه یا برچسب) است.
کدهای کامل این مثال را از اینجا میتوانید دریافت کنید.