تشخیص چهره بارزبری پای بوسیله کتابخانه ی 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