آموزش تشخیص چهره با متلب
در این مطلب از مجله مکتوب قصد داریم به آموزش تشخیص چهره با متلب بپردازیم. در این نمونه بررسی خواهیم کرد که تشخیص چهره به صورت خودکار توسط نرمافزار متلب و با الگوریتم klt چگونه انجام میشود. هدف ما در این آموزش این است که حتی اگر فرد سرش را تکان داد یا نسبت به دوربین عقب یا جلو رفت، همچنان تشخیص چهره فرد به صورت خودکار انجام شود.
پیش گفتاری برای آموزش تشخیص چهره با متلب
قبل از شروع به آموزش تشخیص چهره با متلب، باید بگوییم که تشخیص و ردیابی اشیا در بسیاری از برنامههای بینایی کامپیوتری (computer vision) از جمله تشخیص فعالیت، ایمنی خودکار و نظارت، نقش مهمی را بازی میکند. بهعنوان مثال، دوربینهای نصب شده در یک بانک را تصور کنید، زمانی که فردی مشکوک وارد محیط بانک میشود، به وسیله الگوریتم های تشخیص چهره میتوان نسبت به تشخیص آن فرد اقدام کرد و سابقه او را به دست آورد. یا در مثالی سطحیتر میتوان به تشخیص چهره لپتاپ یا تلفنهای همراه اشاره کنیم.
در این پروژه از تشخیص چهره، قصد داریم سیستم ردیابی چهره را در سه بخش آموزش دهیم:
- تشخیص چهره
- شناسایی ویژگیهای صورت
- ردیابیِ چهره
مرحله اول: تشخیص چهره
در این نمونه پروژه تشخیص چهره، اولین قدم از آموزش تشخیص چهره با متلب، آن است که برای نرمافزار تعریف کنیم که باید مکان چهره را در یک ویدئو تشخیص دهد. در این صورت ابتدا از شیء vision.CascadeObjectDetector استفاده کنید. vision.CascadeObjectDetector یک شی در برنامه متلب است که از الگوریتم Viola-Jones (ویلا جونز) برای تشخیص اشیا در تصاویر استفاده میکند. الگوریتم Viola-Jones یک الگوریتم یادگیری ماشین است که میتواند برای آموزش طبقهبندیکننده (classifier) برای تشخیص اشیا خاص در تصاویر استفاده شود. ردیاب (detector) برای شناسایی چهرهها پیکربندی و طراحی شده، اما میتوان از آن برای تشخیص دیگر اشیا نیز استفاده کرد.
% Create a cascade detector object. faceDetector = vision.CascadeObjectDetector(); % Read a video frame and run the face detector. videoReader = VideoReader("tilted_face.avi"); videoFrame = readFrame(videoReader); bbox = step(faceDetector, videoFrame); % Draw the returned bounding box around the detected face. videoFrame = insertShape(videoFrame, "rectangle", bbox); figure; imshow(videoFrame); title("Detected face");
در ادامه این کدهای جالب متلب، لازم است کادر اول را به صورت ماتریس و سپس به لیستی از ۴ نقطه اصلی تبدیل کرد. این کار برای تشخیص چرخش و حرکت جسم ضروری خواهد بود در نتیجه در ادامه کد بالا یک خط کد دیگر را اضافه خواهیم کرد.
% Convert the first box into a list of 4 points % This is needed to be able to visualize the rotation of the object. bboxPoints = bbox2points(bbox(1, :));
در این مقاله تشخیص چهره برای آنکه ردیابی چهره در طول ویدئو به صورت فریم به فریم انجام شود و ادامه پیدا کند، از الگوریتم Kanade-Lucas-Tomasi (KLT) استفاده خواهیم کرد. KLT یک الگوریتم ردیابیِ ویژگی است که برای ردیابی ویژگیهای نقطهای در تصاویر متوالی استفاده میشود. جالب است بدانید که معرفی این الگوریتم به سال ۱۹۸۱ برمیگردد و بهسرعت به یک استاندارد برای ردیابی ویژگیهای اشیا تبدیل شد.
با اینکه میتوان از حالت آبشاری (cascade) شی ردیاب برای هر فریم استفاده کرد، اما از نظر محاسباتی و پردازشی خیلی سخت عمل میکند. بهعلاوه وقتی سوژه سر خود را بچرخاند یا کج کند، دیگر تشخیص چهره را انجام نمیدهد. این محدودیتها به خاطر این است که مدل تعریف شده در نرمافزار به اندازه کافی با نمونههای مختلف تمرین داده نشده است. در نتیجه الگوریتم KLT به کمک ما میآید تا فریمهای ویدئو را راحتتر ردیابی کنیم.
پیشنهاد مطالعه: آموزش انتگرال گیری با متلب
مرحله دوم: شناسایی ویژگیهای صورت برای ردیابی
در این بخش از آموزش تشخیص چهره با متلب، الگوریتم KLT نقاط مهم را در فریمهای ویدئویی ردیابی خواهد کرد. بعد از تشخیص چهره، نوبت به شناسایی ویژگیهای همان چهره است. در نتیجه ردیابی قابل اعتماد خواهد بود. با اضافه کردن کدهای زیر، ردیاب نقاط برجسته و ویژه را در بخش صورت دنبال میکند.
points = detectMinEigenFeatures(im2gray(videoFrame), "ROI", bbox); % Display the detected points. figure, imshow(videoFrame), hold on, title("Detected features"); plot(points);
مقداردهی به ردیاب
حال که نقاط برجسته و ویژه تشخیص داده شدهاند، میتوانیم از شی vision.PointTracker System استفاده کنیم تا هر نقطه ردیابی شود. به این ترتیب، هر نقطه در یک فریم تشخیص داده میشود و در فریم بعدی ردیاب سعی میکند همان نقطه را پیدا کند.
لازم است از تابع estimateGeometricTransform2D استفاده کنیم تا بتوانیم به طور تخمینی میزان چرخش، تغییر مقیاس و فاصله بین نقاط قدیمی و جدیدی را به دست آوریم. این تغییرات روی کادری که چهره را مشخص کرده نیز اعمال میشود.
pointTracker = vision.PointTracker("MaxBidirectionalError", 2); % Initialize the tracker with the initial point locations and the initial % video frame. points = points.Location; initialize(pointTracker, points, videoFrame);
ایجاد پخش کننده ویدئو برای نمایش نتایج
برای مشاهده نتیجه کار، یک شی پخشکننده ویدئو برای نمایش فریمها ایجاد کنید. برای این کار باید از کدهای زیر استفاده کنید.
videoPlayer = vision.VideoPlayer("Position",... [100 100 [size(videoFrame, 2), size(videoFrame, 1)]+30]);
مرحله سوم: ردیابی چهره
در این بخش از آموزش تشخیص چهره با متلب، به کمک توابع تعریف شده، ردیاب را فعال میکنیم تا نقاط ویژه چهره را از فریم به فریم دیگری، ردیابی کند. از تابع estimateGeometricTransform2D استفاده میکنیم تا میزان حرکت صورت را تخمین بزنیم.
oldPoints = points; while hasFrame(videoReader) % get the next frame videoFrame = readFrame(videoReader); % Track the points. Note that some points may be lost. [points, isFound] = step(pointTracker, videoFrame); visiblePoints = points(isFound, :); oldInliers = oldPoints(isFound, :); if size(visiblePoints, 1) >= 2 % need at least 2 points % Estimate the geometric transformation between the old points % and the new points and eliminate outliers [xform, inlierIdx] = estimateGeometricTransform2D(... oldInliers, visiblePoints, "similarity", "MaxDistance", 4); oldInliers = oldInliers(inlierIdx, :); visiblePoints = visiblePoints(inlierIdx, :); % Apply the transformation to the bounding box points bboxPoints = transformPointsForward(xform, bboxPoints); % Insert a bounding box around the object being tracked bboxPolygon = reshape(bboxPoints', 1, []); videoFrame = insertShape(videoFrame, "polygon", bboxPolygon, ... "LineWidth", 2); % Display tracked points videoFrame = insertMarker(videoFrame, visiblePoints, "+", ... "MarkerColor", "white"); % Reset the points oldPoints = visiblePoints; setPoints(pointTracker, oldPoints); end % Display the annotated video frame using the video player object step(videoPlayer, videoFrame); end % Clean up release(videoPlayer);
خروجی کد بالا به صورت زیر خواهد بود:
سخن پایانی
نمونه برنامه های نوشته با متلب جذاب و کاربردی هستند. در این مثال از آموزش تشخیص چهره با متلب، در چند بخش کوتاه توانستیم در نرمافزار متلب یک سیستم ردیابی چهره ساده را ایجاد کنیم که به طور خودکار یک چهره را شناسایی و ردیابی میکند. شما میتوانید این نمونه را با چهرههای مختلف تمرین دهید و از دوستان و آشنایان بخواهید تا آن را امتحان کنند.
آموزش کامل نرمافزار متلب در مکتب خونه
این تنها یک نمونه از توانمندی و کاراییهای نرمافزار متلب بود. شما میتوانید در دوره های آموزش متلب در مکتب خونه، پروژههای متنوع دیگری را یاد بگیرید.
برخی از آموزشها در مجموعه مکتب خونه به صورت رایگان قرار داده شدهاند و برخی از آنها نیاز به خریداری دارند. مکتب خونه همواره با ارائه تخفیفهای مختلف این امکان را فراهم میکند تا دسترسی به آموزشها آسانتر و راحتتر شود. برای دسترسی به تمامی آموزش های متلب همین امروز در مجموعه مکتب خونه ثبتنام کنید.
منبع مورد استفاده برای این مطلب: mathworks