پیادهسازی سیستم تشخیص چهره در متلب – راهنمای کاربردی


در این مطلب، با نحوه پیادهسازی سیستم تشخیص چهره در محیط و «زبان برنامهنویسی متلب» (MATLAB Programming Language) آشنا خواهید شد. سیستمهای «تشخیص چهره» (Face Detection | Face Recognition) (به ویژه سیستمهای تشخیص چهره سهبُعدی)، دستهای از سیستمهای پیشرفته در حوزه «بینایی کامپیوتر» (Computer Vision) محسوب میشوند که کاربردهای متنوعی از جمله «نظارت» (Surveillance) و «امنیت» (Security) دارند.
یک سیستم تشخیص چهره، یک فناوری توسعه داده شده در حوزه «هوش مصنوعی» (Artificial Intelligence)، «یادگیری ماشین» (Machine Learning) و بینایی کامپیوتر محسوب میشود که قادر به شناسایی یا «صحتسنجی» (Verification) تشخیص یک شخص از روی یک تصویر یا فریم ویدئویی (Video Frame) است. به عبارت دیگر، از سیستمهای تشخیص چهره میتوان برای شناسایی اشخاص در تصاویر، ویدئوها به صورت «بلادرنگ» (Real-Time) استفاده کرد. آژانسها و سازمانهای امنیتی و اجرای قانون (Security and Law Enforcement Agencies) از سیستمهای تشخیص چهره برای تشخیص مجرمان و افراد خلافکار در «فیدهای» (Feeds) ویدئویی و تصاویر دیجیتالی استفاده میکنند.
تاکنون روشهای مختلفی برای پیادهسازی سیستمهای تشخیص چهره ارائه شده است. به طور کلی، نحوه کار سیستمهای تشخیص چهره بدین صورت است که ابتدا «ویژگیهای خاص مرتبط با چهره» (Facial Features) از تصاویر چهره افراد استخراج میشود. سپس سیستمهای تشخیص چهره، ویژگیهای استخراج شده و تصاویر مرتبط با آنها را با تصاویر چهرههای موجود در یک «پایگاه داده» (Database) و ویژگیهای آنها مقایسه میکنند. از آنجایی که سیستمهای تشخیص چهره قادر هستند بر اساس ویژگیهای «شکل» (Shape) و «بافت» (Texture) چهره افراد، یک شخص را تشخیص دهند، به آنها سیستمهای «بیومتریک مبتنی بر هوش مصنوعی» (Artificial Intelligence-based Biometrics) نیز گفته میشود.
اگرچه سیستمهای تشخیص چهره در ابتدا به عنوان یکی از کاربردهای سیستمهای کامپیوتری معرف شدند، ولی هم اکنون در بسیاری از «پلتفرمهای موبایل» (Mobile Platforms) و دیگر فناوریها نظیر «روباتیک» (Robotics) نیز مورد استفاده قرار میگیرند. معمولا از سیستمهای تشخیص چهره به عنوان واسطهای «کنترل دسترسی» (Access Control) در «سیستمهای امنیتی» (Security Systems) استفاده میشود. همچنین، سیستمهای تشخیص چهره را میتوان با دیگر سیستمهای «بیومتریک» (Biometric) نظیر سیستمهای «تشخیص یا بازشناسی اثر انگشت» (Fingerprint Recognition | Fingerprint Detection) و سیستمهای «تشخیص یا بازشناسی عنبیه» (Iris Recognition | Iris Detection) مقایسه کرد.
با اینکه «دقت» (Accuracy) سیستمهای تشخیص چهره از دیگر سیستمهای بیومتریک کمتر است، ولی به دلیل ویژگیهای مهمی نظیر عدم نیاز به وجود تماس فیزیکی با سیستم (Contactless) و طبیعت «غیر تهاجمی» (Non-Invasive) آن، به صورت گسترده توسط شرکتهای امنیتی و آزانسهای اجرای قانون مورد استفاده قرار میگیرند. در سالهای اخیر، سیستمهای تشخیص چهره در حوزه «بازاریابی» (Marketing) نیز به کار گرفته شدهاند؛ سیستمهای تشخیص چهره، به عنوان ابزارهای محبوبی در حوزه «شناسایی و بازاریابی تجاری» (Commercial Identification and Marketing) محسوب میشوند.
از دیگر کاربردهای مهم سیستمهای تشخیص چهره میتوان به مواردی نظیر «تعامل پیشرفته انسان-کامپیوتر» (Advanced Human-Computer Interaction)، «نظارت ویدئویی» (Video Surveillance)، «نمایهگذاری خودکار تصاویر» (Automatic Indexing of Images) و «نمایهگذاری خودکار پایگاههای داده ویدئویی» (Automatic Indexing of Video Databases) و سایر موارد اشاره کرد.
سیستمهای تشخیص چهره
در یک دهه اخیر، الگوریتمهای یادگیری ماشین مختلفی برای کاربردهای «پردازش تصویر» (Image Processing) و بینایی کامپیوتر ارائه شده است. الگوریتمهایی نظیر «الگوهای باینری محلی» (Local Binary Patterns | LBP) و روش HAAR از جمله روشهای محبوب و پرکاربرد هستند که به صورت گسترده برای تشخیص چهره مورد استفاده قرار میگیرند. از همه مهمتر، نتایج حاصل از ارزیابی عملکرد آنها در شرایط آزمایشگاهی، از کارآمدی بالای این دسته از الگوریتمها جهت تشخیص چهره حکایت دارند.
با این حال، بیشتر الگوریتمهای نام برده شده، برای تشخیص بلادرنگ (Real-Time) چهره و در «شرایط محیطی نامقید» (Unconstrained Environments) مناسب نیستند. در سالهای اخیر، روشهای «یادگیری عمیق» (Deep Learning) به محبوبیت فوقالعادهای در زمینههای مختلف هوش مصنوعی دست یافتهاند؛ به گونهای که محبوبیت آنها از محبوبیت روشهای یادگیری ماشین مرسوم بیشتر شده است.
روشهای تشخیص چهره با تصاویر و استخراج اطلاعات از آنها سر و کار دارند؛ تصاویر دیجیتال چیزی جز ترکیبی از «مقادیر پیکسلی» (Pixel Values) در بازه [0، 255] نیستند. الگوریتمهای تشخیص چهره، مقادیر «سطح خاکستری پیکسلها» (Grey level Pixels) را برای پیدا کردن یک «الگوی متمایز کننده» (Discriminating Pattern) در تصویر جستجو میکنند. این الگوی متمایز کننده، به عنوان یک «ویژگی» (Feature) در نظر گرفته میشود. علاوه بر این، ویژگی الگوی متمایزگر شناسایی شده به ازاء هر تصویر، یک ویژگی «منحصر به فرد» (Unique) برای هر کدام از آنها شناخته میشود.
با این حال در تصاویر سهبُعدی، اطلاعات پیکسلی در دسترس نیستند و تنها اطلاعات مکانی (Y ،X و Z) «نقاط» (Points) که متناظر با پیکسلهای تصویر هستند، در اختیار سیستم قرار داده شده است. چنین توصیفی از نقاط موجود در تصاویر (سهبُعدی)، کار سیستم تشخیص چهره، در پیدا کردن الگو در تصاویر سهبُعدی را مشکل میکند.
در این مطلب، گامهای «پیشپردازشی» (Pre-Processing) لازم برای توسعه سیستمهای تشخیص چهره سهبُعدی نمایش داده خواهد شد. چنین کاری به کاربر یا برنامهنویس اجازه میدهد تا بتواند به راحتی مدل یادگیری ماشین (یا یادگیری عمیق) لازم برای تشخیص چهره را پیادهسازی و اجرا کند.
خواندن دادههای تصاویر سه بُعدی عمق در متلب
تصویر سهبُعدی یک «شیء» (Object) حاوی مقادیر «ارتفاع» (Height)، «عرض» (Width) و «عمق» (Depth) هر نقطه در شیء مورد نظر خواهد بود (منظور از شیء، تصاویر دیجیتال سهبُعدی است). به طور کلی، در مجموعههای داده خام سهبُعدی نظیر مجموعه داده چهره FRGC یا (FRGC 2.0 Face Database)، مجموعه داده Collection F و مجموعه داده Collection G 3D ear و سایر موارد، فایلهای تصاویر سهبُعدی با «پسوند» (Extension) خاص abs. ذخیره شدهاند.
شکل زیر، نمایی از تصاویر سهبُعدی موجود در مجموعه داده FRGC 2.0 Face Database را نشان میدهد.
تصاویر موجود در این مجموعه داده، در اصل فایلهای متنی فشرده شده در کدبندی ASCII هستند. هر فایل تصویری موجود در این مجموعه داده، یک «هدر یا سرآمد» (Header) سه خطی دارد که تعداد سطرها و ستونهای موجود در تصویر را مشخص میکند. بلافاصله پس از آن، چهار تصویر در فایل قرار داده شده است. تصویر اول که به آن تصویر «نشانه» (Flag) نیز گفته میشود، تصویری است که در آن پیکسلها مقادیر 0 یا 1 به خود میگیرند. مقادیر پیکسلی 1 بدین معنی است که مقادیر (Y ،X و Z) متناظر در آن پیکسل «معتبر» (Valid) هستند. در صورتی که مقدار نشانه (Flag) صفر باشد، از مؤلفههای (Y ،X و Z) آن پیکسل چشم پوشی میشود.
پس از تصویر نشانه، به ترتیب تصویر مختصات X یا X-coordinates، تصویر مختصات Y یا Y-coordinates و تصویر مختصات Z یا Z-coordinates قرار داده شدهاند. برنامهنویس از دو طریق قادر به مدلسازی تصاویر و استفاده از آنها در سیستم تشخیص چهره خواهد بود:
- استفاده از مختصات سهبُعدی (مختصات Y ،X و Z) هر کدام از نقاط موجود در تصاویر جهت مدلسازی و تشخیص چهره.
- دور انداختن مختصات X یا X-coordinates و مختصات Y یا Y-coordinates و استفاده از مختصات Z یا Z-coordinates نقاط موجود در تصاویر، به تنهایی، جهت مدلسازی و تشخیص چهره.
از قطعه کد زیر برای خواندن مختصات Y ،X و Z و همچنین مقادیر نشانه (Flag) استفاده میشود.
1%ABSLOAD Read a UND database range image from file.
2% [X,Y,Z,FL] = ABSLOAD(FILENAME) reads the range image in FILENAME
3% into the variables X,Y,Z,FL.
4% FILENAME is a string that specifies the name of the file
5% to be openned
6% X,Y,Z are matrices representing the 3D co-ords of each point
7% FL is the flags vector specifying if a point is valid
8function [x, y, z, fl] = absload(fname)
9
10% open the file
11fid = fopen(fname);
12% read number of rows
13r = fgetl(fid);
14r = sscanf(r, '%d');
15% read number of columns
16c = fgetl(fid);
17c = sscanf(c, '%d');
18% read junk line
19t = fgetl(fid); clear t;
20% get flags
21fl = fscanf(fid,'%d',[c r])';
22% get x
23x = fscanf(fid,'%f',[c r])';
24% get y
25y = fscanf(fid,'%f',[c r])';
26% get z
27z = fscanf(fid,'%f',[c r])';
کاربران میتوانند با استفاده از تابع imshow()، تصویر مختصات X یا X-coordinates، تصویر مختصات Y یا Y-coordinates و تصویر مختصات Z یا Z-coordinates را در خروجی نمایش دهند؛ نمایش هر کدام از موارد فوق در خروجی، «تصویر ضبط شده» (Captured Image) را زمانی که دوربین ضبط کننده به ترتیب به سمت محور X، محور Y و محور Z قرار داده شده است، نشان میدهد. از «الحاق» (Concatenate) نقاط (منظور، مقادیر این نقاط) موجود در تصویر مختصات X یا X-coordinates، تصویر مختصات Y یا Y-coordinates و تصویر مختصات Z یا Z-coordinates، تصویر زیر حاصل خواهد شد.
در مرحله بعد، «نقاط ابری» (Cloud Points) استخراج، نقاط استخراج شده به فایل ply. تبدیل و فایل تولید شده نمایش داده میشود تا شکل سهبُعدی تصویر بالا «مصورسازی» (Visualize) شود. شکلهای زیر، نمای سهبُعدی متناظر با تصویر بالا را نشان میدهند. نکتهای که باید در مورد تصویر حاصل در شکل زیر به آن توجه شود این است که «تصویر خام» (Raw Image) حاصل شده، حاوی ویژگیهای چهره یک شخص از جمله گردن و شانه است؛ وجود ویژگیهای مرتبط با گردن و شانه یک شخص، برای تشخیص چهره ضروری نیست. بنابراین، در مرحله بعد نیاز است تا تصویر خام سهبُعدی حاصل «برش» (Crop) داده شود تا تنها نواحی مرتبط با صورت شخص، در تصویر سهبُعدی خام مشخص شود.


تشخیص چهره
برای استخراج نواحی مرتبط با صورت شخص (برش دادن تصویر و جدا کردن نواحی مرتبط با گردن و شانه) از تصویر سهبُعدی، از اطلاعات مرتبط با «عمق» (Depth) استفاده میشود. اگر به تصویر زیر دقت کنید، کاملا مشخص است زمانی که چهره شخص (Subject) در جهت محور Z قرار دارد، نمای جلوی چهره او توسط «سنسور» (Sensor) در یافت شده است.
در نتیجه، نقطه متناظر با بینی شخص (Nose Tip) کمترین عمق ممکن را در تصویر (دریافت شده از سنسور) خواهد داشت.

اگر به شکل زیر دقت کنید، هر چقدر که از سمت نوک بینی (Nose Point) به سمت گوش (ear) حرکت کنیم، مقدار عمق از 1500 به 1700 افزایش پیدا میکند.

همانطور که در شکل بالا مشهود است، مقدار Z (همان مقدار عمق یا Depth) نوک بینی که در شکل با نقطه سیاه مشخص شده است، بین 1450 تا 1480 است. با فرض این که مقدار عمق نوک بینی (در تصویر بالا) برابر با 1460 باشد، میتوان مرکز تصویر سهبُعدی را تغییر داد و نواحی مرتبط با چهره شخص را جداسازی کرد. برای این کار فرض میشود که نقطه P (نوک بینی)، نقطه مرکز تصویر سهبُعدی باشد. سپس، یک مربع به ابعاد 140x140 واحد (نظیر شکل زیر)، به مرکزیت نقطه P رسم میشود.
تحقیقات محققان نشان داده است که اندازه انتخاب شده برای مربع رسم شده در شکل بالا (140x140)، جهت پوشاندن ناحیه مرتبط با چهره شخص مناسب است. در مرحله بعد، تنها نقاطی که درون مربع قرار میگیرند به عنوان ناحیه مرتبط با چهره شخص در نظر گرفته میشود. در نهایت، با برش دادن ناحیه مرتبط با چهره از تصویر سهبُعدی کامل، به ناحیهای که در آن چهره شخص مدل شده است، دست پیدا میشود.


دو تصویر بالا، تصویر سهبُعدی برش داده شده و متناظر با چهره شخص را از زوایای مختلف نمایش میدهند. پس از مشخص شدن ناحیه مرتبط با چهره شخص (در تصویر سهبُعدی)، لازم است تعدادی فرایند «پیشپردازشی» (Pre-Processing) نظیر de-spiking، «پر کردن حفره» (Hole Filling) و «از بین بردن نویز» (De-Noising) روی تصویر اعمال شود.
فرایندهای پیشپردازشی در تشخیص چهره
پس از مشخص شدن ناحیه مرتبط با چهره شخص در تصویر سهبُعدی، برای اینکه یک مدل سهبُعدی کامل و مناسب جهت استفاده در سیستمهای تشخیص چهره به دست آید، نیاز است تا مجموعهای از فرایندهای پیشپردازشی روی تصویر اعمال شود.
مهمترین فرایندهای پیشپردازشی قابل اعمال روی تصاویر سهبُعدی حاصل عبارتند از:
- فرایند de-spiking: فرایندی است که در آن دادهها به نحوی دستخوش تغییر میشوند که «اسپیکهای یا جهشهای» (Spikes) موجود در آنها، کاهش یافته و یا از بین بروند؛ با این که در طول این دسته از فرایندهای پیشپردازشی، دادهها دچار تغییر میشوند ولی اطلاعات موجود در تصویر حفظ میشود. از آنجایی که تصاویر سهبُعدی چهره، حاوی نویز و اسپیک (جهش) هستند، بنابراین نیاز است تا از تکنیکهای de-spiking برای رفع این نقیصه استفاده شود. در این مطلب، با گسترش مفهوم «فیلتر میانه وزندار دوبُعدی» (2D Weighted Median Filter) و تعمیم آن به تصاویر سهبُعدی چهره، تکنیک de-spiking روی تصاویر سهبُعدی اجرا میشود. در این تکنیک، با استفاده از «فیلتر میانه وزندار مِش» (Mesh Weighted Median Filter)، تصاویر سهبُعدی فیلتر میشوند تا نویزها و اسپیکهای (جهشهای) موجود در تصاویر کاهش پیدا کنند یا از بین بروند.
- فرایند «پر کردن حفره» (Hole Filling): از بین بردن نویزها و اسپیکهای (جهشهای) موجود در تصاویر، سبب ایجاد حفره در تصاویر سهبُعدی میشود. بنابراین پیش از استفاده از مدل سهبُعدی تصاویر در کاربردهای تشخیص چهره لازم است تا با استفاده از فرایندهای پیشپردازشی، حفرههای ایجاد شده در تصاویر ترمیم شوند. برای چنین کاری از یک روش «درونیابی سهبُعدی» (3D Interpolation) به نام «درونیابی مکعبی» (Cubic Interpolation) استفاده شده است. در روش دورنیابی مکعبی، مقدار درونیابی شده در یک نقطه مورد نظر (نقاطی که در آنها حفره ایجاد شده است)، بر اساس درونیابی مکعبی مقادیری که در نقاط همسایگی آن نقطه، در هر بُعد (Dimension) تصویر قرار دارند، مشخص میشود.
- «حذف نویز» (Noise Removal): تصاویر دیجیتال به انواع مختلف «نویز» (Noise) حساس هستند. نویز در نتیجه اشتباهات رخ داده شده هنگام «اکتساب تصاویر» (Image Acquisition) به وجود میآید. رخ دادن نویز در تصاویر دیجیتالی سبب میشود تا مقادیری در پیکسلها یا نقاط تصویر ایجاد شوند که مقادیر آنها، مقادیر واقعی «شدت» (Intensity) پیکسلها یا نقاط تصویر را نمایش ندهند. روشهای زیادی برای از بین بردن نویز در تصویر وجود دارد. در این مطلب، از روش «فیلتر سهبُعدی گاوسی» (3D Gaussian Filter) برای حذف نویز استفاده شده است.
پس از پایان فرایند پیشپردازش تصاویر، مدل سهبُعدی تولید شده از چهره، که برای استفاده در سیستمهای تشخیص چهره مناسب است، به شکل زیر خواهد بود:
در ادامه، کدهای منبع برای پیادهسازی سیستم تشخیص چهره، برش چهره، فرایند de-spiking، پر کردن حفره و حذف نویز از تصاویر سهبُعدی نمایش داده شده است:
1 %Modify workspace_add and imgFolder path
2 workspace_add = '\your\workspace\folder';
3 %For example 'F:\3d_images\project_3d_feature\'
4 imgFolder = strcat(workspace_add,'data\folder');
5 %For example mat3_face\data_selected
6
7 %gunzip image data using matlab inbuilt function if you don't have data in
8 %.abs format
9 filePattern = fullfile(imgFolder, '*.abs');
10 jpegFiles = dir(filePattern);
11 a=dir([imgFolder, '/*.abs']);
12 numberofFiles = size(a,1);
13
14 for k = 1:length(jpegFiles)
15 baseFileName = jpegFiles(k).name;
16 fullFileName = fullfile(imgFolder, baseFileName);
17 [X,Y,Z,FL] = absload(fullFileName);
18
19 Z= abs(Z);
20
21 X= X(:);
22 Y = Y(:);
23 Z = Z(:);
24
25 X1 = X(X~=-999999);
26 Y1 = Y(Y~=-999999);
27 Z1 = Z(Z~=999999);
28
29 ptCloud = pointCloud2rawMesh([X1 Y1 Z1],0.6,1);
30
31 [nose_z, nose_ind] = min(ptCloud.vertices(:,3));
32 nose_pt = ptCloud.vertices(nose_ind,:);
33
34 cropped_points = zeros(1,3);
35 for ind = 1:length(ptCloud.vertices)
36 if inxrange(ptCloud.vertices(ind,1),nose_pt) && inyrange(ptCloud.vertices(ind,2), nose_pt)
37 cropped_points = [cropped_points; ptCloud.vertices(ind,:)];
38 end
39 end
40 cropped_points = cropped_points((2:end),:);
41
42 xx = double(cropped_points(:,1));
43 yy = double(cropped_points(:,2));
44 zz = double(cropped_points(:,3));
45 zz = -zz;
46
47 %uncomment if you want to see cropped image
48 %mm = pointCloud2rawMesh([xx yy zz],0.6,1);
49 %makePly(mm, 'my_cropped.ply');
50 %ptCloud_cropped = pcread('my_cropped.ply');
51 %pcshow(ptCloud_cropped);
52
53 %remove spike and save despiked image following removing noise
54 %m_test = pointCloud2mesh([xx,yy,zz]);
55 %zz_despiked_test = medfilt3(m_test);
56 %ZI_test = interpn(zz_despiked_test,.9,'cubic');
57 %zz_denoised_test = imgaussfilt3(ZI_test);
58 %makePly(zz_denoised_test, 'zz_denoised_test.ply');
59 %zz_denoised_test = pcread('zz_denoised_test.ply');
60 %pcshow(zz_denoised_test);
61 try
62 %Despiking process
63 zz_despiked = medfilt3(zz);
64
65 %Multidimensional data interpolation for filling holes
66 ZI = interpn([xx,yy,zz_despiked],.9,'cubic');
67
68 %denoising process
69 zz_denoised = imgaussfilt3(ZI(:,3));
70 mesh = pointCloud2mesh([xx,yy,zz_denoised]);
71 catch MExc
72 end
73 end
74 fclose(fid);
75% end
76function inRng = inxrange(val, nose_pt)
77 x_llmt = -70 + nose_pt(:,1);
78 x_ulmt = 70 - nose_pt(:,1);
79 if val >= x_llmt && val <= x_ulmt
80 inRng = 1;
81 else
82 inRng = 0;
83 end
84end
85
86function inRng = inyrange(val, nose_pt)
87 y_llmt = -70 + nose_pt(:,2);
88 y_ulmt = 70 - nose_pt(:,2);
89 if val >= y_llmt && val <= y_ulmt
90 inRng = 1;
91 else
92 inRng = 0;
93 end
94end
پس از انجام تمامی این مراحل، خروجی نهایی یک تصویر مِش (Mesh) خواهد بود. تصویر Mesh حاصل را میتوان برای استخراج ویژگیهای متناسب با کاربردهای تشخیص چهره مورد استفاده قرار داد.
به عنوان نمونه، به راحتی میتوان از تصویر Mesh حاصل شده برای استخراج ویژگیهای «تحلیل مؤلفه اساسی» (Principal Component Analysis | PCA)، ویژگیهای خط، نقطه و «ناحیه» (Region) و سایر موارد استفاده کرد.
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای داده کاوی و یادگیری ماشین
- آموزش اصول و روشهای داده کاوی (Data Mining)
- مجموعه آموزشهای هوش مصنوعی
- نقشه دانش فناوریهای هوش مصنوعی و دستهبندی آنها — راهنمای جامع
- تفسیر مدلهای یادگیری عمیق در بینایی کامپیوتر — راهنمای جامع
- بینایی کامپیوتر چیست؟ — به زبان ساده
- پیادهسازی سیستم تشخیص و ردیابی خودرو در پایتون — راهنمای جامع
^^
با سلام من به یک برنامه کامل تعیین و تایید هویت با متلب نیاز دارم . آیا شما کمکی در این زمینه می توانید به من بکنید؟
سلام، وقت شما بخیر؛
در مجله فرادرس مطالب متنوعی در زمینه برنامهنویسی پایتون منتشر شده است که میتوانید از آنها برای پروژههای مختلف خود استفاده کنید. این مقالات از طریق این لینک در دسترس هستند.
از اینکه با مجله فرادرس همراه هستید از شما بسیار سپاسگزاریم.