نمایش/عدم نمایش سایدبار
رفتن به بالای صفحه
آزادی حجاز از دست نااهلان
Avatar

بازشناسی چهره انسان با رزبری پای face recognition_قسمت دوم

به نام خدا :در قسمت اول ،چهره را از غیر چهره جدا کردیم(face detection) ( بازشناسی چهره انسان با رزبری پای face recognition_قسمت اول )؛ در این قسمت میخوایم با شبکه عصبی آشنا بشیم و یه شبکه MLP برای تشخیص سه شخص مختلف از هم آموزش بدیم.
بازشناسی چهره انسان با رزبری پای face recognition قسمت دوم

بازشناسی چهره انسان با رزبری پای face recognition قسمت دوم


شبکه عصبی،به صورت خلاصه،پیاده سازی یادگیری و نحوه تشخیص الگوهای مغز انسان بر روی کامپیوتر گفته می شود.
پروژه رزبری پای و opencv
هر کدام از این دایره ها رو یک نرون می گیم ( شبکه بالا دارای 3 نرون در ورودی و 2 نرون در خروجی و همچنین 5 نرون در لایه های مخفی می باشد. )؛ هر نرون شامل ورودی ها ، خروجی ها ، بایاس و تابع فعالیت می باشد.
پروژه رزبری پای و opencv
آموزش یک شبکه عصبی،یعنی تعیین ضرایب ورودی ها برای حصول خروجی مورد نظر ما.
برای اطلاع از نحوه تعیین ضرایب و آشنایی با شبکه های عصبی،به اسلاید های درس شبکه های عصبی دکتر روحانی دانشگاه فردوسی مشهد مراجعه کنید(3 واحد درسی)
هدف ما در استفاده از شبکه عصبی در این پروژه،طبقه بندی افراد مختلف از روی چهره آن هاست.به این صورت که،هر گاه یکی از سه شخص ویا هر سه شخص که جلو دوربین بایستند،آن ها را با نام از دیگری تفکیک کند.
برای ساخت یک شبکه عصبی،نیاز به تعدادی ورودی (داده های آموزش) و خروجی متناظر با هدف شبکه (کلاس ها) می باشیم.از انواع شبکه های موجود،ما از MLP استفاده می کنیم.
برای تهیه ورودی ها،از چهره های مورد نظر،چند عکس سیاه و سفید تهیه می کنیم.(از زوایای مختلف صورت به نحوی که برای سیستم تشخیص چهره که در مطلب قبلی گفته شد،قابل شناسایی باشد.)عکس های تهیه شده،باید ابعاد یکسانی داشته باشند.مثلا 70*70
خب تا اینجا هر عکس،دارای 70*70=4900 ویژگی می باشد.
پس لایه ورودی شبکه ما باید دارای 4900 نورون باشد.وهمچنین برای هر حالت مطلوب هم،یک نورون در خروجی در نظر می گیریم(سه نورون در خروجی)

حکمتی از نهج البلاغه ( حکمت 149 ) - ضرورت خود شناسی
نابودشدکسی که ارزش خود را ندانست.
در گام بعدی باید داده های ورودی رو نرمال کنیم(بین 0 تا 1(داده های ورودی ما،پیکسل های عکس سیاه و سفید ما هستند که هر پیکسل،8بیت می باشد یعنی مقداری بین 0 تا 255 که ما باید این بازه رو تبدیل به بازه 0 تا 1 کنیم.(اگر این کا ر را نکنیم،شبکه برای بعضی از ویژگی ها شخصی سازی میشه.و کارآیی نخواهد داشت.)
ما نیاز به دسته بندی در 3 کلاس متفاوت داریم پس تعداد نرون خروجی ما هم 3 تا است.
بریم سراغ تهیه دیتا بیس برای معرفی به سیستم.
نیاز داریم تا از افراد مورد نظرمان (اونایی که می خوایم سیستم بشناسدشون) چند تصویر از زوایای مختلف تهیه کنیم.
برای این کار،کد زیر رو اجرا میکنیم و افراد مورد نظر رو در معرض دوربین قرار می دهیم.باید توجه داشت که زاویه صورت رو در هر عکس تغییر دهید تا دیتابیس کامل تری تهیه شود و خطا کمتر شود.
در ترمینال تایپ کنید :

و کد  زیر رو در اون بنویسید :

کد رو با دو دستور زیر کامپایل و اجرا کنید :

 
توجه : هر چهره ای که در پنجره Display شناسایی بشود، ذخیره می شود؛ بعد از اتمام کار تهیه عکس، برنامه رو ببندید و از بین عکسهای گرفته شده، 30مورد(از هر چهره 10 عکس) را که از زوایای مختلف گرفته شده است رو جدا کنید؛ این عکس ها رو در نور کافی و یکسان تهیه فرمایید.
نکته : به دلیل اینکه در ترمینال رسپری، امکان پیشنهاد توابع و پارامترها (مثل ویژوال استودیو) نیست، بنده کتابخونه opencv رو روی کامپیوتر کامپایل کردم و برنامه رو با کامپیوتر می نویسم(بنده از نسخه 2.4.13 استفاده می کنم.) نصب این ورژن opencv روی ویژوال استودیو 2013 ساده است ولی اگر از ویژوال استودیو 2015 استفاده می کنید، باید کتابخونه رو بیلد کنید. برای بیلد کردن اون روی ویژوال 2015، از لینک زیر استفاده کنید ( بنده در ویندوز 8.1 روش زیر رو امتحان کردم ولی موفق نبودم ( شبکه mlp رو نمی شد ساخت ) : How to build OpenCV from source for VC14
 
حالا می رسیم به نحوه بازکردن و دسترسی به پیکسل های عکس های ذخیره شده،جهت استخراج ویژگی عکس ها.
با کد زیر می توان عکسهای ذخیره شده رو باز کرد و نمایش داد :

عدد صفر، عکس رو در مد سیاه و سفید لود می کند چون عکس هایی که در مرحله قبلی ذخیره شدند، سیاه سفید هستند.

توابع و متغیر های مورد استفاده ما

تابع بالا، مقادیر پیکسلهای سطر y رو برمی گردونه، مثل مقادیر زیر :
پروژه رزبری پای و opencv

تابع بالا، مقادیر پیکسل های ستون x رو بر می گردونه، شبیه تابع قبلی.

دو متغیر بالا، به ترتیب، تعداد ستون های عکس و تعداد سطر های عکس را بر می گردانند.
توجه : توابع و متغیر های بالا، از کلاس Mat می باشند.

اشاره گر data به اولین پیکسل از سطر y اشاره می کند.که می توان با اضافه کردن عدد دلخواه به data، همه پیکسل ها را پیمایش کرد. در ویژوال استودیو 2015 از اولی و در ویژوال استودیو 2013 از دومی استفاده میشه)

تابع بالا،برای دسترسی به پیکسل ها به صورت مختصات x,y (البته ما برای سرعت بخشیدن به کار،از تابع ptr استفاده می کنیم.زیرا اشاره گر بسیار سریع تر است.)
تعداد اشخاص ما 3 نفرند که برای هرکدام 10 عکس تهیه کردیم. پس باید یک ماتریس  دارای 30سطر (تعداد دسته وِیژگی ها) و 4900 ستون (تعداد ویژگی هر دسته) بسازیم.

و همچنین خروجی متناظر هم دارای 30سطر و 3 ستون می باشد.(30 سطر به ازای 30 ویژگی ورودی و 3 سطر هم برای طبقه بندی در سه وضعیت 100 و 010 و 001 برای هر کدام از چهره ها .می توان از دو نرون در خروجی استفاده کرد ولی برای تفکیک بهتر نتایج،از سه نرون استفاده می کنیم.)

حال به مقدار دهی این دو ماتریس می پردازیم :
عکس ها رو با نام 1تا 30 در محل پروژه کپی می کنیم.(برای استفاده از کد زیر،باید عکس ها رو سه تا سه تا پشت سر هم نام گذاری کنید.به این صورت که عکس اول،از شخص a و عکس دوم،از شخص b و عکس سوم از شخص c و دوباره عکس چهارم از شخص a و عکس پنجم از شخص b و به این صورت تا عکس سی ام که از شخص c است.اگر دنبال درد سر می گردید و می خواهید این ترتیب رو رعایت نکنید،باید ماتریس trainlabel رو بر حسب ترتیب عکس ها تغییر بدید.)
سپس در ترمینال تایپ کنید:

و در اون کد زیر رو بنویسید :

و با دستور زیر اونا کامپایل کنید :

و با دستور زیر اجراش کنید :

خروجی کار به صورت زیر است :
پروژه رزبری پای و opencv
یک فایل با نام و پسوند nn.xml در کنار پروژه درست شده است.از این به بعد،ما با همین فایل nn.xml کار می کنیم و نیازی به ساختن شبکه در هر بار اجرای پروژه نیست.
اعداد 0 تا 99 که نمایش داده شده است،نشان دهنده تعداد epoch (تعداد آپدیت شدن ضرایب)هست که توسط خودمان تعیین شده است.هر چه این تعداد بیشتر باشد،شبکه به داده های ما همگرا تر می شود ولی از یک جایی به بعد،شبکه از داده هایی که در مجموعه نیست،فاصله می گیرد و در اصطلاح،شخصی سازی می شود که مطلوب نیست.)
ماتریس [1,0,0] هم خروجی به ازای شخص a است.که ناشی از عکس اول است.
و همچنین عکس شماره 30 رو هم در خروجی برنامه خواهیم داشت.(طبق برنامه ای که نوشتیم.ماتریس قبلی و عکس این بخش،جنبه تست برنامه را دارند.)
تشریح کد ها رو در ویدئو زیر مشاهده فرمایید:
http://www.aparat.com/v/KPsaL
 
در ضمن دوستانی که از نسخه opencv 3.1 استفاده می کنند، برای ساختن و آموزش شبکه خودشون از کد های زیر استفاده کنن

و برای استفاده از شبکه ای که ساخته شده،از کد زیر استفاده کنن :

 

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

گروه پرسش و پاسخ الکترونیکی در سروش
تعداد مطالب : 29 تا
Avatar دانش آموخته (فارغ التحصیل سابق) کارشناسی الکترونیک هستم. سه سال اول دانشگاه رو به نحو احسن هدر دادم رفت!! تا پایان ترم هفتم داشتم فکر می کردم که چی کار کنم و چی کار نکنم؟ ترم هشتم اساتید خوبی داشتم و تصمیم گرفتم،یه تکونی به خودم بدم. الان هم در حال یاد گیری علایقم هستم...
ارسال دیدگاه
26

1) نظرات غیر فارسی به صورت خودکار حذف میشوند ( حداقل 5 حرف فارسی وارد کنید ).

2) به موارد درخواست پروژه/کد آماده و سوالاتی که بلد نباشم پاسخ داده نمیشه.

3) برای گزاشتن کدهاتون از این سایت استفاده کنید ( طبیعتا لینک کدتون رو باید برای من بفرستید! ) : debian

4) پسورد فایل های سایت : www.dmf313.ir

  1. Avatar

    مهمان

    حسن

    سلام
    با عرض سلام و خدا قوت
    وقتی کد میخوام کامپایل کنم ارور زیر میده :
    https://ufile.io/98a2n
    کد برنامه :
    https://ufile.io/91j34
    من از opncv نسخه 3.4.1 استفاده میکنم.
    با تشکر

    • Avatar

      نویسنده این مطلب

      محمدرضا اسلامی

      سلام.شما از بعضی توابع و کلاس های opencv2 استفاده کردید در حالی که opencv3, نصب کردید!!!!!
      اگر با برنامه نویسی c و c++ آشنایی کامل ندارید،
      Opencv ۲ نصب کنید و از برنامه ای که گذاشته شده استفاده کنید.

      • Avatar

        مهمان

        حسن

        ممنون برای من نشد نداره برنامه رو تغییر میدم تا با opencv3 کار کنه
        با تشکر از شما

        • Avatar

          نویسنده این مطلب

          محمدرضا اسلامی

          به امید خدا،یه کم وقت بذارید،حتما می تونید bb

  2. Avatar

    مهمان

    علی

    سلام و عرض ادب..
    میخواستم بدونم شما به چه دلیل توی برنامه عکس ها رو به شکل توالی چیدین و میخونین؟؟ اگه عکس های شخص اول کنار هم باشه چی میشه
    به جز مشکل شمارش در حلقه واسه خوندن مشکلی پیش میاد؟؟
    ممنون..

    • Avatar

      نویسنده این مطلب

      محمدرضا اسلامی

      سلام
      برای ساخت شبکه عصبی،بهتره ورودی ها به ترتیب نباشن تا نتیجه بهتری به دست بیاد.
      حتی میشه به صورت تصادفی چیده بشن.ولی کنار هم نباشن بهتره(چون ضرائب شبکه،برای داده های آخر شخصی سازی میشن.و ممکنه داده هابی که اول وارد شده،در ضرائب کم اثر تر بشه)

  3. Avatar

    مهمان

    علی

    سلام..
    آقا حل شد..
    بازم ممنون..
    ان شا الله شهید شی heart

  4. Avatar

    مهمان

    علی

    سلام..
    این لینک برنامه
    http://uupload.ir/view/w6h_nn.txt
    ممنون

    • Avatar

      نویسنده این مطلب

      محمدرضا اسلامی

      سلام.اجازه بدید،شب برسم خونه،حتما نگاه می کنم.
      ببخشید که دیر ب دیر جواب می دم.

  5. Avatar

    مهمان

    علی

    سلام و عرض ادب و تشکر از زحماتتون..
    من دوباره از اول opencv-2.4.13 , کتابخونه دوربین رو نصب کردم مشکلات قبلیم رفع شد خدا رو شکر و همه برنامه های قبل از تولید شبکه عصبی اجرا شد. ولی nn رو که میخوام کامبایل کنم خطای زیر میده..من دقیقا همون کد شما رو کبی کردم.ممنون میشم کمک کنید.
    http://uupload.ir/view/qq5w_error.txt
    اینم لینک ارور
    بازم ممنون

    • Avatar

      نویسنده این مطلب

      محمدرضا اسلامی

      سلام خدا رو شکر که مشکلتون حل شد.
      برنامه اتون رو هم قرار بدید.

    • Avatar

      نویسنده این مطلب

      محمدرضا اسلامی

      سلام
      با دستور زیر کامپایل شد
      g++ nn.cpp -o nn $(pkg-config –libs opencv) -I/usr/local/include -lraspicam -lraspicam_cv

  6. Avatar

    مهمان

    علی

    سلام..
    به تلویزیون هم وصل کردم بازم نمیشه همون ارور قبل..

    • Avatar

      نویسنده این مطلب

      محمدرضا اسلامی

      کدتون رو یه جایی آپلود کنید و لینکشو بذارید.
      از ترمینال هم بعد از اجرای دستورات کامپایل و اجرای کد،عکس بگیرید و بذارید.

  7. Avatar

    مهمان

    علی

    سلام..
    من اون کد اول رو میخوام اجرا کنم..کامپایل میشه ولی وقتی میخوام اجراش کنم دوربین رزبری یه لحظه روشن میشه و صفحه نمایش در حد ۱ ثانیه میاد و بسته میشه و ارور زیر رو میده به نظرتون مشکلش چیه؟
    ارور:(Display:1348): GLib-GObject-CRITICAL **: g_object_unref: assertion ‘G_IS_OBJECT (object)’ failed
    ممنون

    • Avatar

      نویسنده این مطلب

      محمدرضا اسلامی

      سلام از روش زیر برای اتصال ب رزبری استفاده کنید
      کار های زیر رو هم انجام بدید:
      ۱٫نصب Vnc روی رزبری و اجرای اون
      ۲٫دانلود Putty روی کامپیوتر برای اتصال به رزبری
      ۳٫نصب Xming روی کامپیوتر و اجرای Xlaunch از زیر مجموعه اون(بعد از اجرای Xlaunch،صفحه ای باز میشه که چند بارباید Next بزنید)
      ۴٫تنظیم Putty مثل عکس زیر
      تنظیمات Putty
      بعد یه محیط مثل ترمینال باز میشه بعد از وارد کردن یوزر و پسورد رزبری،به آدرس پروژتون برید و اونو اجرا کنید ببینید چی میشه.
      اگر جواب نداد،از روش remote controlاستفاده کنید
      اگر این هم نشد،رزبری رو به تلوزیون یا مانیتور وصل کنید(با hdmi ویا rca)

  8. Avatar

    مهمان

    هادی

    با سلامی دوباره اینم از لینک برنامه ها .
    مهندس لطفا کمک کنید .
    http://cdn.persiangig.com/preview/idOQH3FORX/facedetect.cpp
    http://cdn.persiangig.com/preview/2iUR9429oI/nn.cpp
    http://cdn.persiangig.com/preview/koqxM4dxs8/pics.cpp

    • Avatar

      نویسنده این مطلب

      محمدرضا اسلامی

      سلام
      امتحان کردم هر سه بدون مشکل کامپایل شد!!
      با دستوری که اول فایل زیر گذاشتم،هر سه رو میشه کامپایل کرد.
      http://s8.picofile.com/file/8290906576/facedetect.cpp.html

  9. Avatar

    مهمان

    هادی

    سلام
    وقتی میخام کامپایل کنم این اررور را میدهد.
    و اینکه فقط برنامه camerashow ب درستی کامپایل شد
    http://cdn.persiangig.com/preview/hnii6VMFQX/2017-03-30-150948_1024x768_scrot.png

    • Avatar

      نویسنده این مطلب

      محمدرضا اسلامی

      سلام
      به بزرگ و کوچک بودن حروف دقت کنید.
      اگر باز هم نشد،فایل cpp تون رو یه جایی آپلود کنید و لینکشو بذارید
      به امید خدا،شنبه مشکلش رو حل کنیم

  10. Avatar

    مهمان

    احمد

    سلام
    ممنون از زحماتتون .عالی بود.
    میشه یه آدرسی از اون اسلاید های شبکه عصبی که گفتین رو بدین….چطور میشه پیداش کرد؟ من گشتم ولی پیدا نشد.
    بازم ممنون از توضیحات خوبتون smile

    • Avatar

      نویسنده این مطلب

      محمدرضا اسلامی

      سلام.به امید خدا،تو خونه دارم،سر فرصت آپلود می کنم و لینکشونو میذارم.در صورت امکان،یاد آوری بفرمایید.

    • Avatar

      نویسنده این مطلب

      محمدرضا اسلامی

      برای دانلود اسلاید های شبکه عصبی،به وبلاگ زیر مراجعه فرمایید
      http://khosravi.blog.ir/category/شبکه-های-عصبی/

  11. Avatar

    مهمان

    یاسر

    معرکست باید چندین بار بخونم..

  12. Avatar

    مهمان

    azfx41

    مشخصات چهره هر فرد در فایل به چه صورت ذخیره میشه؟؟ یعنی وقتی ما تشخیص دادیم که چهره مال چه کسی هست classifier.detectMultiScale به ما اسم اش زو میده شماره اش رو

    • Avatar

      نویسنده این مطلب

      محمدرضا اسلامی

      در این مرحله،مشخصات استخراج نمیشه…خود عکس صورت که تشخیص داده شده،از کل تصویر جدا میشه و با نام k.jpg ذخیره میشه
      k ،تعداد کل چهره ه انسان است که شناخته شده.یعنی در بخش اول کد های بالا،عکس ها ذخیره میشه و در بخش بعدی،ویژگی عکس های تهیه شده
      استخراج میشه.و بعدش باهاش یه سیستم می سازیم که چهره های مورد نظر ما رو بشناسه.