تشخیص چهره با متلب؛ آموزش به همراه کد
تشخیص و ردیابی اشیا در بسیاری از برنامههای بینایی کامپیوتری (computer vision) از جمله ایمنی خودکار و نظارت، تشخیص فعالیت و… نقش مهمی را ایفا میکنند. برای مثال یک فضای امنیتی را تصور کنید که فردی مشکوک وارد آن مکان میشود. در اینجا نیاز به یک سیستم تشخیص چهره که بتوان سابقه آن فرد را مشاهده کرد، احساس میشود. این دقیقاً همان کاری است که سیستمهای تشخیص چهره باید انجام دهند. به همین علت، در این مقاله قصد داریم به نحوه تشخیص چهره در متلب بپردازیم.
انجام پروژه متلب با بهترین هزینه
سیستمهای تشخیص چهره چیست؟
سیستم تشخیص چهره، یک فناوری نوین است که با استفاده از هوش مصنوعی و یادگیری عمیق، قادر به شناسایی و تأیید هویت افراد از طریق تصاویر یا ویدئوهای آنها میباشد. الگوریتمهایی مانند (الگوهای باینری محلی) (Local Binary Patterns | LBP) و روش HAAR از جمله روشهای محبوب هستند که به صورت گسترده توسط افراد زیادی در سراسر دنیا استفاده میشود. با این حال، بیشتر این سیستمهای تشخیص چهره در شرایط محیطی نامقید مناسب نیستند. در سالهای اخیر، روشهای یادگیری عمیق و یا Deep Mining به محبوبیت بیشتری رسیدهاند. این روش میتواند چهرهها را با دقت بسیار بالایی تشخیص دهد، حتی در شرایطی که نور کم باشد، چهرهها زاویهدار باشند یا از عینک و ماسک استفاده شده باشد. الگوریتمهای تشخیص چهره مبتنی بر یادگیری عمیق میتوانند به سرعت چهرهها را در تصاویر و ویدئوها پردازش کنند.
متلب رو سریع و آنلاین یاد بگیر!
تشخیص چهره با متلب امکان پذیر است؟
متلب از قدرت پردازش بالایی برخوردار است که این موضوع برای پردازش تصاویر و ویدئوها ضروری است. همچنین، متلب کتابخانههای مختلفی برای پردازش تصویر، یادگیری ماشین و بینایی کامپیوتر دارد که میتوان از آنها برای پیادهسازی سیستمهای تشخیص چهره استفاده کرد. متلب رابط کاربری گرافیکی (GUI) سادهای دارد که استفاده از آن را برای مبتدیان آسان میکند. در ادامه به بررسی مراحل تشخیص چهره میپردازیم.
مرحله اول: تشخیص چهره
برای تشخیص چهره با متلب اولین قدم این است که برای نرم افزار مشخص کنید که مکان چهره را در یک ویدئو تشخیص دهد. برای این منظور، ابتدا از vision.CascadeObjectDetector استفاده کنید. vision.CascadeObjectDetector یک ابزار در متلب است که از الگوریتم 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 الگوریتمی است که برای ردیابی ویژگیهای نقطهای در تصاویر متوالی مورد استفاده قرار میگیرد. معرفی این الگوریتم به سال 1981 برمیگردد و به یک استاندارد برای ردیابی ویژگیهای اشیا تبدیل شده است.
در متلب میتوان از حالت آبشاری (cascade) برای هر فریم استفاده کرد، اما از لحاظ پردازشی معمولا ضعیف میکند. این موضوع در مواقعی که سوزه تغییر حالت دهد و یا سر خود را بچرخاند بیشتر اتفاق میافتد. در نتیجه الگوریتم 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);
دیدگاه شما