به نام خدایی که حسین ع را کشتی نجات قرار داد : تشخیص خواب آلودگی-پروژه رزبری پای با dlib library
پروژه رزبری پای تشخیص خواب آلودگی با dlib library
فرق کتابخانه dlib با کتابخانه opencv
کتابخانه dlib یه چیزی تو مایه های opencv هست؛ که برای بحث پردازش تصویر و شبکه های عصبی و… ازش استفاده میشه؛ حالا چرا یه کتابخونه جدید؟!!! با همون opencv کارمون نمیشد؟!!! همونطور که در مطلب بازشناسی چهره دیدیم، از تشخیص چهره opencv استفاده کردیم ولی کتابخانه dlib، کمی سریعتر و دقیق تره و یه مزیت دیگه که نسبت به opencv داره، اینه که محل دقیق اجزای صورت رو میشه به دست آورد ( مثل عکس زیر ) :
خب وقتی محل دقیق اجزای صورت رو داشته باشیم،خیلی کارا میشه باهاش کرد؛ مثلا تشخیص باز و بسته بودن چشم ها، خمیازه، انحراف صورت به پایین و…
آموزش نصب کتابخانه dlib
اول باید روی رزبری پای، کتابخونه dlib رو نصب کنیم؛ آموزش نصبش تو لینک زیر هست : Install dlib on the Raspberry Pi
از لینک بالا، کلیه نکات #step1 رو انجام بدید؛ #step1 شامل موارد زیره : ( اعداد و ارقامی که تغییر می دید رو به یاد داشته باشید تا بعد از اتمام کار،دوباره به حالت اولیه اش برگردونید_به خصوص swap size )
Increase swap file size
Change your boot options
Update your memory split
خب حالا باید کتابخونه رو از dlib.net دانلود کنید ( پایین نوار سمت چپ سایت،درحال حاضر، نسخه 19.7 جدیدترینه )
بعد از دانلود، از حالت فشرده خارجش کنید و در ترمینال رزبری،به پوشه dlib-19.7 برید ( با دستور cd dlib-19.7 )
بعدش به ترتیب کدهای زیر رو در ترمینال وارد کنید :
1 2 3 4 5 6 |
mkdir build cd build cmake .. cmake –build . –config Release make sudo make install |
بعدش یه فایل با دستور زیر باز کنید :
1 |
sudo nano /etc/ld.so.conf.d/dlib-1.conf |
و درش وارد می کنیم :
1 |
/usr/local/lib |
فایل رو ذخیره می کنیم و می بندیم ( با Ctrl + x بعدش کلید y و در آخر هم اینتر )
بعد در ترمینال وارد می کنیم :
1 |
sudo ldconfig |
بعدش دستور زیر :
1 |
sudo nano /etc/bash.bashrc |
و در خط آخر فایل، دو خط کد زیر رو اضافه می کنیم :
1 2 |
PKG_CONFIG_PATH:/usr/local/lib/pkgconfig export PKG_CONFIG_PATH |
باز هم فایل رو ذخیره می کنیم و می بندیم ( با Ctrl + x بعدش کلید y و در آخر هم اینتر )؛ در انتها، تنظیمات swapsize رو به حالت اول برمیگردونیم ( همون #step1، بخش اولش )؛ و ریبوت کردن رزبری پای!
اگر قصد دارید از دوربین و یا فایل ویدئو برای پردازش استفاده کنید، باید کتابخونه opencv و raspicam رو نصب کنید ( آموزش نصب هر دوتاش تو لینک مقابل هست ) : نیازمندی های رزبری پای
دوتا کتابخونه بالا رو فقط برای این می خوایم که فریم جاری دوربین رو فراخوانی کنه چون خود کتابخونه dlib فقط تابع فراخواندن عکس داره!!! حالا بریم سراغ تست کتابخونه.
تو ترمینال دستورات زیر روتایپ کنید :
1 2 3 |
mkdir dlibtest cd dlibtest sudo nano face-detect.cpp |
قطعه کد زیر رو تو فایلی که بازکردید، کپی کنید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
//g++ -std=c++11 face-detect.cpp -o fd $(pkg-config --libs opencv dlib-1) -I/usr/local/include -lraspicam -lraspicam_cv -lwiringPi #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include "raspicam/raspicam_cv.h" #include <opencv2/imgproc/imgproc.hpp> #include "iostream" #include <dlib/image_processing/frontal_face_detector.h> #include <dlib/image_processing/render_face_detections.h> #include <dlib/image_processing.h> #include <dlib/gui_widgets.h> #include <dlib/image_io.h> #include <dlib/opencv.h> #include "wiringPi.h" #include "math.h" using namespace std; using namespace dlib; int maximum(float a) { if(a<0) return 0; else return a; } float distcal(int ax,int ay,int bx,int by) { if (((ax - bx) * (ax - bx)) + ((ay - by) * (ay - by)) <= 0) while(1){}; return sqrt(((ax - bx) * (ax - bx)) + ((ay - by) * (ay - by))); } float eyeliddist(dlib::full_object_detection shape) { float lefteyelid1 = distcal(shape.part(47).x(), shape.part(47).y(), shape.part(43).x(), shape.part(43).y()); float lefteyelid2 = distcal(shape.part(46).x(), shape.part(46).y() , shape.part(44).x(), shape.part(44).y()); float lefteyelid = (lefteyelid1 + lefteyelid2) / (2.0 * distcal(shape.part(45).x(), shape.part(45).y(), shape.part(42).x(), shape.part(42).y())); float righteyelid1 = distcal(shape.part(41).x(), shape.part(41).y() , shape.part(37).x(), shape.part(37).y()); float righteyelid2 = distcal(shape.part(40).x(),shape.part(40).y() , shape.part(38).x(), shape.part(38).y()); float righteyelid = (righteyelid1 + righteyelid2) / (2.0 * distcal(shape.part(39).x() , shape.part(39).y() ,shape.part(36).x(), shape.part(36).y())); return ((lefteyelid + righteyelid) / 2.0); } int main(void) { raspicam::RaspiCam_Cv camera ; camera.open(); cv::Rect img_rect = cv::Rect(340,224,600,512); cv::Mat cam,image,small_image; float eyelid = 0.0; image_window win; win.set_size(512,600); frontal_face_detector detector = get_frontal_face_detector(); shape_predictor pose_model; cout << "Please Wait To Load face-detector File" << endl; deserialize("shape_predictor_68_face_landmarks.dat") >> pose_model; cout << "File Loaded" << endl; std::vector<rectangle> faces; while(!win.is_closed()) { camera.grab(); camera.retrieve(cam); image = cv::Mat(cam,img_rect); cv::resize(image,small_image,cv::Size(),1.0/4.0,1.0/4.0); cv_image<bgr_pixel> cimg(image); cv_image<bgr_pixel> cimg_small(small_image); std::vector<full_object_detection> shapes; faces = detector(cimg_small); for(unsigned long i = 0 ; i < faces.size(); ++i ) { faces[i].left() = maximum(faces[i].left() * 4.0) ; faces[i].top() = maximum(faces[i].top() * 4.0) ; faces[i].right() = maximum(faces[i].right() * 4.0) ; faces[i].bottom() = maximum(faces[i].bottom() * 4.0) ; rectangle r( (long)(faces[i].left() ), (long)(faces[i].top() ), (long)(faces[i].right() ), (long)(faces[i].bottom() ) ); full_object_detection shape = pose_model(cimg,r); shapes.push_back(shape); } // faces.size() for end win.clear_overlay(); win.set_image(cimg); cout << " *** " << faces.size() << " Face(s) detected ***" << endl; if(faces.size() > 0) { win.add_overlay(render_face_detections(shapes)); eyelid = eyeliddist(shapes[0]); if(eyelid < 0.2) win.add_overlay(image_window::overlay_rect(point(10,10),rgb_pixel(0,0,255),"Warning")); cout << " *** eyelid : " << eyelid << " *** " << endl; cout << " ********************** " << endl; }//if end }//while end camera.release(); return 0; }//main end |
فایل برنامه رو میتونید از آخر مطلب بگیرید؛ خب یه فایل دیگه هم هست ( shape_predictor_68_face_landmarks.dat.bz2 ) که باید دانلود کنید و از حالت فشرده خارجش کنید و تو پوشه پروژه dlibtest اضافه کنید :
با دستور زیر هم کامپایل و بیلد میشه :
1 |
g++ -std=c++11 face-detect.cpp -o fd $(pkg-config --libs opencv dlib-1) -I/usr/local/include -lraspicam -lraspicam_cv –lwiringPi |
با دستور زیر هم اجراش کنید :
1 |
sudo ./fd |
نتیجه باید به صورت فیلم مقابل باشه : https://www.aparat.com/v/6TEYF
داستانک ( این داستان برای بنده خیلی آموزنده بود... )
بعد از اینکه چند ماه از شروع جنگ ( صفین ) گذشته بود؛ عده ای به سرکردگی اشعث ابن قیس نزد فرمانده خود، علی ابن ابی طالب ع آمده و از طولانی شدن کارزار شکوه کردند؛ لب کلام اشعث این بود: من یمنی ام و اگر کسی با شامیان، سر جنگ داشته باشه،اون منم!!! ولی جنگ بی ثمر تا کی؟؟؟ جمعیت همراه اشعث، پس از تایید سخنان او، خیمه گاه فرمانده رو ترک کردند...
چند روز بعد...
قرآن ها بر سر نیزه رفت و یاران امام، حضرت رو مجبور به برگذاری حکمیت کردند؛ امام مخالفت می کرد ولی یاران مصمم به برگذاری حکمیت؛ پس از اجبار یاران، امام شروطی گذاشتند،که هیچ یک رعایت نشد!!! و شد آنچه نباید؛ پس از شکست حکمیت، همان یاران دور فرمانده جمع شدند و وی را بازخواست نموده که چرا جلو ما نایستادی!!! و اشعث بود که به امام گفت: باید بگویی که از گناه حکمیت، استغفار می کنی...؛ و اینگونه بود که گروهی به نام خوارج تشکیل شد...
کتاب "امام علی ع از خلافت،تا شهادت"و کتاب "داستان کوفه"
خب الان بریم سراغ ( فیلم ) تشریح کد : https://www.aparat.com/v/9lLpG
یه نسخه ویندوزی هم نوشتم که از لینک زیر می تونید دانلودش کنید ( موقع اجرا، وب کم فعال باشه!! )
فیلم نتیجه اجرا نسخه ویندوزی روی لپ تاپ : https://www.aparat.com/v/H7iUJ
منبع ( مثال های آماده کتابخونه dlib ) : سایت Dlib C++ Library
راه های افزایش سرعت پردازش ( که ازشون تو برنامه استفاده شده ) : Speeding up Dlib’s Facial Landmark Detector
اگه کسی هم دنبال برنامه پایتون می گرده، به این لینک بره : Eye blink detection with OpenCV, Python, and dlib
پیشنهاد : استفاده از پردازش موازی برای افزایش سرعت؛ برای دریافت بهترین نتیجه، توجه داشته باشید که شدت نور و جهت نور مناسب باشه.
تمرین : برنامه ای بنویسید که تعداد خمیازه رو بشماره.
هزینه این مطلب!!! :
در صورت امکان،یه فیلم 1 دقیقه ای از زوایای مختلف چهره تون بگیرید ( ترجیها با دوربین رزبری پای ) و جایی آپلودش کنید و به ایمیل بنده ارسال کنید!! می خوام چیکار؟؟؟!! می خوام یه پروژه بازشناسی چهره ی کار درست بسازم و آموزشش رو تو سایت بذارم؛ برای این کار،نیاز به چند صد چهره مختلف،از زوایای مختلف دارم... ( این فیلم ها رو در دسترس هیچ کسی قرار نخواهم داد؛ فقط ازشون برای ساخت یک شبکه عصبی استفاده میشه و این تصاویر، از درون شبکه عصبی، قابل بازیابی نیست. )؛ از هر زاویه چهره درچرخش دوربین، حداقل 2 فریم تهیه بفرمایید ( اگر دو ویدئو یکی از شب و یکی از روز بفرستید که دیگه عالی میشه )؛ برای ضبط ویدیو در رزبری پای ،میتونید از برنامه زیر استفاده کنید :
ایمیل بنده : mohammad_r_eslami@yahoo.com
با تشکر
جهت هر چه مستحکم تر شدن مقام ولایت فقیه و تعجیل درظهور بابای خوبمون مهدی(عج) صلوات
برای جاماندگان اربعین : https://www.aparat.com/v/uXOtF
مهمان
سلام لطفا کمک کنید خیلی ضروری هست من هر چی در opencv دستور make رو میزنم کتابخونه ها نصب نمیشن سه روز هست درگیر هستم نشد لطفا کمک کنید
نویسنده این مطلب
سلام چه اروری میده؟عکسش رو بگیرید و بذارید.
مهمان
خسته ام کرد این
این ارور چیه؟ چیکارش باید کرد؟
g++:erorr: -iwiringpi: no such file or directory
نویسنده این مطلب
سلام.
دردستور کامپایل به جای iwiringpi-باید بنویسید lwiringpi-
اولشi نیست L هست
مهمان
خب حالا باید کتابخونه رو از dlib.net دانلود کنید ( پایین نوار سمت چپ سایت،درحال حاضر، نسخه 19.7 جدیدترینه )
kojast ?
نویسنده این مطلب
سلام. سایت dlib.net
قسمت پایین سمت چپ.اینم آدرس دانلودش:
http://dlib.net/files/dlib-19.17.zip
مهمان
cmake –build . –config Release
سلام توی اجرای دستور بالا بهم میگه پوشه release وجود نداره. این پوشه رو دستس ساختم ولی بازم ارور میده فایل makefile.txt رو نمیتونم پیدا کنم میشه راهنمایی بفرمایید
نویسنده این مطلب
سلام
از ترمینالتون بعد از اجرای دستور بالا عکس بگیرید و آپلود کنید.
مهمان
سلام آقای اسلامی
بنده هنگام نصب کتابخانه ی dlib با ارور های زیر مواجه شدم .لطفا بگید باید چیکار کنم؟باتشکر
http://s8.picofile.com/file/8323037534/%DB%B2%DB%B0%DB%B1%DB%B8%DB%B0%DB%B4%DB%B0%DB%B5_%DB%B1%DB%B5%DB%B3%DB%B2%DB%B2%DB%B9.jpg
نویسنده این مطلب
سلام
پوشه dlib رو در پوشه downloads بریزید.
مهمان
سلام آقای اسلامی
یک سوال دارم
نحوه پخش صدای آلارم در این پروژه به چه صورتیه ؟
یعنی بخواهیم هنگام بسته شدن پلک صدای آلارم پخش شود ؟با تشکر از شما
نویسنده این مطلب
سلام.
باید یه بیزر به رزبری وصل کنید و وقتی پلک بسته شد،یکی از پایه ها رو یک کنید تا بیزر بوق بزنه.
مهمان
ببخشید ،میشه بگید کجای برنامه باید اضافه بشه و اگه ممکنه بگید برنامش چطوری میشه؟مرسی از شما
نویسنده این مطلب
برنامه رو بررسی بفرمایید.
خط 83 باید برای هدف شما تغییر کنه.
اگر فاصله پلکها کمتر از 0.2 شد، پایه فلان،یک بشه.
برای کار با پایه ها هم آموزش زیر رو مشاهده بفرمایید.
آموزش کار با gpio رزبری پای
مهمان
باسلام و عرض تشکر از جناب اسلامی
یک سوال دارم خدمتتون اینکه چه مدل دوربینی باید برای اتصال به رزبری خریداری کنیم و آیا در این برنامه راه اندازی خاصی برای دوربین باید انجام دهیم ؟
ممنون از شما.
نویسنده این مطلب
سلام
بنده از دوربین رزبری پای استفاده کردم(مخصوص رزبری هست_15 پایه)
برای راه اندازیش هم نیاز به نصب کتابخونه کار با دوربین هست از لینک زیر:
http://www.aparat.com/v/0GIdo
مهمان
سلام آقای اسلامی
من سه تا سوال داشتم ازتون
1- در قسمت نصب کتابخانه dlib فقط باید #step1 رو انجام بدیم؟
2- وقتی کتابخانه رو از dlib.net دانلود کردیم فایل رو باید کجا بریزیم ؟
3-پوشه dlibtest دقیقا کجاست وفایل ( shape_predictor_68_face_landmarks.dat.bz2 ) رو چطوری باید در پوشه dlibtest اضافه کنیم ؟
من این سه مرحله رو اصلن متوجه نشدم لطفا راهنمایی بفرمایید با تشکر.
نویسنده این مطلب
1.بله تو مطلب هم گفتم که فقط step1
2.در پوشه اصلی رزبین.
3.پوشه dlibtest وجود نداره!!!باید یکی بسازید با دستور زیر:
mkdir dlibtest
مهمان
سلام جناب اسلامی
مشکل ۱و۲ حل شد ولی
اگر ممکنه نحوه اضافه کردن Shape_predictor_68_face_landmarks.Dat.Bz2 ) رو در پوشه Dlibtest توضیح بدید
من به مشکل خوردم.اصلن نمیدونم چطوری باید اضافش کنم لطفا راهنمایی کنید بعد از دانلود باید چیکار کنم؟
نویسنده این مطلب
سلام
دانلودش کنید
کپیش کنید
پیستش کنید تو پوشه مورد نظر!!!
بعدش هم از حالت زیپ در بیاریدش.
مهمان
باسلام ودرود خدمت شما
بنده در قسمت نصب dlib library در مرحله (Change your boot options) هنگامی که از قسمت تنظیمات بوت خارج میشوم و رزبری ریبوت میشود ،پس از راه اندازی دوباره رزبری صفحه سیاه نمایان میشود و اجازه هیچ کاری را به کاربر نمیدهد لطفا من را راهنمایی کنید که چگونه این مشکل را برطرف کنم .با تشکر فراوان از شما
نویسنده این مطلب
سلام
نیازی به این تنظیم نبود.!!!
چون باعث میشه مستقیما ترمینال باز بشه.بعد از اومدن این صفحه سیاه،
دستور sudo raspi-config
رو وارد کنید.
و تنظیمات رو به desktop auto login تغییر بدید.
گرچه با این وضعیت هم میتونید ادامه بدید و در آخر درستش کنید.
مهمان
سلام جناب اسلامی. بنده ایمیلی رو خدمت شما ارسال کردم لطفا بررسی کنید.
سپاسگزارم
مهمان
سلام آقای اسلامی. من چجوری میتونم کدی که به زبان سی داخل ویندوز نوشتم رو با رزبری پیاده سازی کنم؟ میشه یک سایت بهم معرفی کنین؟
و اینکه برای شناسایی شی دلخواد در محیط باید به کدوم آموزش مراجعه کنم؟ باتشکر
نویسنده این مطلب
سلام
1.باید کدی که در ویندوز نوشتید رو بیارید تو رزبری و کامپایلش کنید.
2.سایتی نمی شناسم که کد رو تبدیل کنه
3.تا حالا فقط شناسایی چهره کار کردم.شاید در آینده،شناسایی شکل هم تو سایت گذاشته بشه.
مهمان
سلام عالی بود من orange win plus تازه خریدم
دوربین 2مگش تو بازار نیست دارم هی آزمایشی روش برنامه مینویسم.. که چجوری به webcamوصل میشه و چجوری opencvروش نصب میشه ..خیلی قویه ولی این مشکلات بد هم داره..ان شاالله تونستم درست کنم چشم هزینه مطلب روی چشمم..
سلامت باشین ان شاالله..
مهمان
من قسمتایی از این پروژه رو دیدم. اشکال داره عکسمو نفرستم براتون؟
نویسنده این مطلب
خیر نوشتم در صورت امکان…
اگر دوست ندارید،نفرستید
مهمان
سلام لطفا سورس نرم افزار ویندوزی رو هم بذارید یا برای من ایمیل کنید . ممنون
نویسنده این مطلب
آخه باید آموزشش رو هم بذارم،حال ندارم
نصب dlib و opencv و …
به امید خدا اگر تونستم میذارم.
مهمان
سلام مجدد


آقا آموزش رو نمیخواد بگید ، خودم کتابخونه هاشو اد میکنم
فقط سورسش باشه کفایت میکنه
ممنون میشم اگه امکانش باشه برام ایمیلش کنین
نویسنده این مطلب
از لینک زیر دانلود کنید
تشخیص خواب آلودگی با ویژال استودیو
مهمان
سلام، عالی بود