سه شنبه ها با رزبری پای: تشخیص چهره با کتابخانه ی opencv

تشخیص چهره بارزبری پای بوسیله کتابخانه ی opencv

ماژول دوربین رزبری پای را گرفته و با کمک آن چندین عکس گرفته اید؟

بیایید یک کار واقعا هوشمندانه انجام دهیم و از آنها برای تشخیص چهره استفاده کنیم.

آیا وب کم حساس به حرکت خانه شما راه اندازی شده، اما سگی مزاحم مدام آن را تحریک می کند؟ چگونه می فهمید که آیا این هشدار مربوط به شخصی است که در اطراف پرسه میزند یا سگ خانگی شما دوباره به دنبال جوراب است؟

در این آموزش چگونگی استفاده از کتابخانه ی بصری کامپیوتری open CV را برای استفاده از رزبری پای در تشخیص سگ ها از روی چهره (صورت)،  نشان خواهیم داد.

قصد داریم یک اسکریپت ساده پایتون بسازیم که از طریق فهرست تصاویر، با کپی کردن مواردی که چهره در آنها وجود دارد کار می کند. علاوه بر این کادری را نیز اطراف صورتها ترسیم می کند. در واقه قرار است تشخیص چهره را با استفاده از دوربین رزبری پای انجام دهیم.

کامپیوتر رزبری پای

 

قدم 01

به طور پیش فرض، کتابخانه ی opencv با Raspbian قابل اجرا نیست. اما نگران نباشید،‌ هرچیزی با یک apt-get ساده قابل حل است! ابتدا، باید opencv  نصب شود. در یک پایانه(ترمینال) بنویسید: sudo apt-get updateو enter  را بزنید، سپس: sudo-apt-get install python-opencv libopencv-dev را بنویسید و دستورالعمل ها را دنبال کنید. اگر این کد توسط مفسر(interpreter) تعاملی پایتون اجرا شده و ماژول opencv لود شده باشد، آن را خواهیم دید.کد Python را تایپ کنید و کلید Enter  را فشار دهید، سپس بنویسید: import cv(و دوباره کلید enter را بزنید). اگر همه چیز به درستی نصب شده باشد، باید یک پرامپت (prompt)خالی مشاهده کنید. اگر در مسیر ImportError چیزی مشاهده کردید، به عقب برگردید و ببینید آیا apt-get درست کار کرده است یا خیر.

قدم02: درک ویژگی های Haar-like

میخواهیم از الگوریتمی به نام “Haar cascade”استفاده کنیم.  در واقع باید برای کامپیوتر یک کتاب قانون تعریف کنیم، زیرا هیچ درکی از چهره ندارد. Haar cascade اثر روشنایی را توصیف میکند. یک چهره شامل دو چشم است که توسط پوست احاطه شده است. ناحیه اطراف چشم شدت نور متفاوتی با خود چشم دارد. Haar cascade این الگوها را توصیف می کند تا راهی برای شناسایی چهره ها (و سایر اشیا) در اختیار ما قرار دهد.

قدم03: شروع کردن کدنویسی!

گل گفتن و گل شنیدن کافیست! بیایید کمی کد بنویسیم. ابتدا باید کتابخانه های مختلفی را که می خواهیم استفاده کنیم وارد کنیم (import) و برخی پیش فرض های معقول را برای ردیاب) آشکارساز) Haar تنظیم کنیم. این پیش فرض ها توازن و تعادلی (trade off) بین سرعت و دقت، ایجاد می کنند. ابتدا minSize را تنظیم کردیم تا کوچکترین چهره ی قابل تشخیص را به مربعی با ابعاد 20 پیکسل محدود کنیم.  imageScale قبل از اینکه تصویر را در آشکارساز تغذیه کنیم، آنرا مقیاس بندی می کند. تصاویر کوچکتر به معنای زمان تشخیص سریعتر ولی با دقت کمتر است. minNeighrows به آشکارساز می گوید که تطبیق دادن باید از الگوی یافتن خطاهای حداقلی ساخته شود. سرانجام ، haarFlags فلگ های خاصی هستند که به آشکارساز می گویند چه بیت هایی را باید نادیده بگیرد.

قدم04: آماده کردن تصویر

برای تشخیص چهره با رزبری پای اولین تابعی که قصد ایجاد آن را داریم () DetectFace است. از آنجا که آشکارساز Haar فقط با تصاویر در مقیاس خاکستری(عکس های سیاه و سفید) کار می کند، ابتدا یک کپی در مقیاس خاکستری تهیه می کنیم. grey تغییر اندازه داده و در small_img کپی می شود. در آخر ، هیستوگرام را معادل سازی می کنیم (با استفاده از EqualizeHist). این امر کنتراست را یکنواخت کرده و باعث می شود آشکارساز Haar موثرتر باشد. متغیرهای small_img و cascade را همراه با بقیه پیش فرض هایی که در ابتدا تعریف کردیم ، به تابع cv.HaarDetectObjects منتقل می کنیم. سپس لیستی از اشیا با مختصات مشخص در متغیر face ذخیره میشود.

قدم05: علامتگذاری کردن چهره ها

در قدم بعدی تشخیص چهره با رزبری پای روی تمام اشیا این کار را  تکرار می کنیم و برای آنها محیط استخراج می کنیم (منطقه ای که آشکارساز اشیا فکر می کند چهره وجود دارد.) اکنون ، این جایی است که کاری مبهم و گیج کننده انجام می دهیم. به یاد دارید که در مرحله قبل ، چند نسخه کپی از تصویر اصلی تهیه کردیم؟ خوب ، نسخه اصلی را دور نریختیم، پس می توانیم جایی را که فکر می کنیم چهره وجود دارد، روی نسخه ی اصلی علامت گذاری کنیم ، بنابراین می توانیم تصاویر کامل را با رنگ کامل ذخیره کنیم! از آنجا که مختصات را مقیاس بندی کرده ایم، بنابراین میتوانیم  عینا به cv.Rectangle بگوییم که گوشه های بالای سمت چپ و پایین سمت راست کادر کجا باید باشد.

 

قدم 06: ملاحظات نهایی

readDirectory () از فهرست راهنمای ارائه شده به عنوان آرگومان خط فرمان عبور می کند و فایل هایی را که با “.jpg” پایان می یابند استخراج می کند. سپس تصویر را باز کرده و به detectFace() منتقل می کند. اگر برخی از چهره ها را پیدا کند ، با استفاده از cv.SaveImage () تصاویر مشخص شده را در یک فایل جدید ذخیره می کند. برای استفاده از برنامه جدید خود ، ابتدا باید یک فایل XML  Haar  cascade پیدا کرده و مسیر را روی cv.Load () قراردهید. آنها را می توان در /usr/share/opencv/haarcascades/ یافت. اجرای برنامه نیز به سادگی ذخیره برخی از فایل های JPG در پوشه و تایپ کردن python Facetect.py است. با هر شانسی ، چیزی شبیه به موارد زیر خواهید دید:

:samples/ has

:Analyzing 292942_10151131251926133.jpg

Detected 2 object(s) Time = 1268.761ms

 

قسمت دیسکریپشن کدها

اختصاص تصاویر موقت: allocate temporary images

grayscale تبدیل تصویر ورودی رنگی به مقیاس خاکستری(تصویر سیاه و سفید):

convert color input image to grayscale

مقیاس بندی تصویر ورودی برای پردازش سریعتر: scale input image for faster processing

تغییر سایز داده شد، مقیاس بندی جعبه ی محدود هر صورت و تبدیل آن به دو Cvpoints.:

the input to cv.HaarDetectObjects was resized, scale the bounding box of each face and convert it to two CvPoints

مرور کردن تمام فهرست ها و زیرشاخه ها برای عکس هایی با پسوند jpg:

scan all directories and subdirectories for jpg images

به ترتیب ،حلقه،بارگزاری و تشخیص(آشکارسازی): sequentially loop, load and detect

اندازه گیری کردن مدت زمانی که طول میکشد: measure how long it takes

بارگزاری در تصویر: load in the image

ذخیره کردن تصویر جدید با یک کادر دور هر صورت: save a new image with a box round each face

 

Facedetect.py

import os, sys, time

import cv2.cv as cv

minSize = (20, 20)

imageScale = 1

haarScale = 2

minNeighbors = 3

haarFlags = cv.CV_HAAR_DO_CANNY_PRUNING

:def detectFace(img, cascade)

allocate temporary images#

gray = cv.CreateImage((img.width,img.height), 8, 1)

small_img = cv.CreateImage((cv.Round(img.width /imageScale),cv.Round (img.height / imageScale)), 8, 1)

 convert color input image to grayscale#

cv.CvtColor(img, gray, cv.CV_BGR2GRAY)

 scale input image for faster processing#

cv.Resize(gray, small_img, cv.CV_INTER_LINEAR)

cv.EqualizeHist(small_img, small_img)

faces = cv.HaarDetectObjects(small_img, cascade,cv.CreateMemStorage(0),haarScale, minNeighbors, haarFlags,minSize)

:if faces

“print “\tDetected “, len(faces), ” object(s)

:for ((x, y, w, h), n) in faces

the input to cv.HaarDetectObjects was resized, scale the#

bounding box of each face and convert it to two CvPoints#

pt1 = (int(x * imageScale), int(y * imageScale))

pt2 = (int((x + w) * imageScale), int((y + h) *imageScale))

cv.Rectangle(img, pt1, pt2, cv.RGB(255, 0, 0), 3, 8, 0)

return img

:else

return False

 scan all directories and subdirectories for jpg images#

:def readDirectory(fileLocation, cascade)

:for root, dirs, files in os.walk(fileLocation)

“:print root, “has

:for name in files

:if name.find(“.jpg”) >=1

sequentially loop, load and detect#

 “:” + print “Analysing ” + name

measure how long it takes#

()t = cv.GetTickCount

load in the image#

image = cv.LoadImage(os.path.join(root,name), 1)

match = detectFace(image, cascade)

:if match

save a new image with a box round each face#

cv.SaveImage( fileLocation + “/face_” + name, match)

t = cv.GetTickCount() -t

print “\tTime = %gms” %(t/(cv.GetTickFrequency()*1000.0))

‘__if __name__ == ‘__main

“/cdir = “/usr/share/opencv/haarcascades

cascade = cv.Load(cdir + “haarcascade_frontalface_default.xml”)

:if len(sys.argv) != 2

‘print ‘please provide a directory to read

sys.exit(1)

readDirectory(sys.argv[1], cascade)

گردآوری و ترجمه: صبا علیزاده

image from zabanafza.com

کتاب راهنمای رسمی شروع کار با رزبری پای

 

آخرین مقالات

مقالات مرتبط