# مهندسی نرم افزار > مباحث مرتبط با مهندسی نرم‌افزار > پردازش تصویر (Image Processing) >  پردازش چهره از صفر تا ...

## farhaneh

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

----------


## مصطفی ساتکی

شما برای شروع در ابتدا بایستی با پردازش تصویر آشنایی داشته باشی.بعد اون برای شناسایی چهره های مشخص شده بایستی شبکه عصبی بدونید.شما دراین پروژه به mlp و متد آموزش backpropagation نیازدارید. بعد اون به PCA جهت کاهش ابعاد بردارهای مربوط به face pattern هاتون. بعد از اون یک مدل شبکه عصبی SVM رو جهت Classification مجدد بردارهاتون جهت بالابردن سرعت .به علت realtime بودن مسئله. layerin شبکتون با توجه به موارد ذکر شده 4 لایه به ترتیب از لایه ورودی 40و20و10و1 در نظر بگیرن.ابعاد تصاویر اولیه که مخاین آموزش بدین رو کمتر از 20*20 در نظر بگیرید.تصاویر رو به دو دسته چهره و غیره چهره تقسیم کنید جهت آموزش.و در ضمن جهت یکسان سازی و رفع نویز از Guassian blur استفاده کنید.

----------


## farhaneh

پس من فکر میکنم بهتره اولش یه کم با متلب و toolbox image processing اون آشنا بشیم.
فقط قبلش چند تا نکته: 
اول اینکه من از منابع مختلفی استفاده میکنم: وب، کتاب گونزالس، ترجمه خودم، help متلب و...
اگه مشکلی داشتم ممنون میشم کمک کنید و اطلاع بدین تا هم من و هم بقیه دوستان استفاده کنن.
بازم ممنون میشم دوستان آموزش دستوراتی رو که مسلطن رو بذارن تا کار سریع تر پیش بره :تشویق: 

به نام خدا
1. آشنايي مقدماتي با تصاوير
 1-1. تصاوير سياه و سفيد
       تصاوير سياه و سفيد در واقع ماتريس هاي دو بعدي هستند كه هر بيت نمايانگر يك نقطه از تصوير است. كنار هم قرار گرفتن تمامي اين نقاط (بيت ها) در دو بعد تصوير را مي سازد. مقدار پیکسل صفر نشان دهنده رنگ سیاه و 1 نشان دهنده رنگ سفید میباشد.
1-2. تصاوير مقايس خاكستري
       در اين        تصاوير هر بايت (از صفر تا 255)  نمايانگر يك پيكسل است. اگه مقدار بايت        صفر باشد نمايانگر سياه مطلق و اگر 255 باشد نمايانگر سفيد مطلق هست و بقيه        در اين رنج از رنگ سياه تا سفيد (خاكستري) قرار خواهند گرفت.
1-4. تصاوير RGB
               در اين نوع تصاوير با توجه به تركيب سه رنگ قرمز R ، سبز G و        آبي B بقيه رنگ ها ساخته خواهد شد.
 آشنايي با Matlab و Image Processing          Toolbox
 متلب می‌تونه          فايل‌هاي گرافيکي با فرمت‌هاي JPEG, TIFF, GIF, BMP, PNG, HDF, PCX, XWD,          ICO, CUR را به عنوان فايل گرافيکي بخونه. 
دستور خواندن تصاویر در متلب: imread
i=imread('coins.png
')
و یا به جای نام تصویر موجود در متلب میتونید مسیر هر تصویر دلخواهتون رو بدید.
دستور نمایش تصاویر در متلب: Imshow
imshow(i)
تا بعد...

----------


## مصطفی ساتکی

سلام.نه نرم افزار Matlab برای پیاده سازی این پروژه به کارتون نمیاد.تا کی بگم.Matlab یه آزمایشگاه ریاضی تا بتونیم صحت ایده مون تائید کنه. من در این حالت هم از matlab استفاده نمی کنم.چون یه کتابخانه پردازش تصویر سرعت بالا طی چندین سال پیاده سازی کردم.شما برای این کار که Realtime بایستی از یک زبان برنامه نویسی مثل دلفی ،C#‎,C++‎ یا جاوا استفاده کنید. نگاه کنید در تاپیکی که بالا زدید مثل یجور وقت تلف کردن.شما بجای این کار هر چه سریعتر با تمرین کنید که بتوید با اون پردازش تصویر و شبکه عصبی رو پیدا کنید حتی شده از کامپوننت و OpenSource استفاده کنید. مطالعه کتاب گنزالس نه همه بخش هاش به بقیه کاراتون اولویت داره بعد اون هم یادگیری شبکه عصبی هاگان(Hagan) رو یگیرید مطالعه کنید تا فصل 13 البته رو فصل 12 و 13 تاکید بیشتری داشته باشید چون تو این پروژه به کارتون میاد. تا اینجا رو شروع کنید گزارش کارتونو نه Detail که یاد می گیرید رو اینجا بزارید من در ادامه راهنمایتون می کنم.سوالی هم داشتید در ادامه همین تاپیک مطرح کنید تا با هم بررسیش کنیم.البته یه بانک چهره هم بعد ها بایستی دانلود کنید.

----------


## madira

دوست عزیز آیا برای ردیابی اشیا در تصاویر هم میتونید راهنمایی نمایید؟

ممنون از پاسخ شما.

----------


## farhaneh

اگه اشتباه نکنم و سوالتون رو درست متوجه شده باشم،  برای این کار میتونیم از دستور های bwtraceboundary و bwboundaries استفاده کنیم. حالا فرقشون چیه؟ 
دستور اول مختصات سطر و ستون پیکسل های مرز یک شی از تصویر رو بر می گردونه و دستور دوم مختصات سطر و ستون پیکسل های تشکیل دهنده مرز تمامی اشیای موجود در تصویر رو بر می گردونه. اینم یه قسمت از help خود متلب در این مورد:
bwboundaries also descends into the outermost objects (parents) and traces their 
children (objects completely enclosed by the parents

b=bwboundaries(bw) 
ساختار b مهمه. b در واقع یه آرایه p-by-1 هستش که هر سلول در p خودش شامل ماتریسی با ابعاد q-by-2 هست که هر سطر ماتریس شامل مختصات طول و عرض یه پیکسل از مرز است و q تعداد کل پیکسل های مرز برای ناحیه مورد نظر.
در مورد مابقی سینتکس این دستورا پیشنهاد میکنم به  Help متلب مراجعه کنید.
موفق باشید.

----------


## مصطفی ساتکی

دوست عزیز تو دنیای واقعی این طوری نیست که تصویرو رو Edge بگیری بعد بیای لبه ها رو دنبال کنی چنان سرباری داره که نپرس. معمولاً برای دنبال کردن Object های هدف ابتدا difference می گرن و سپس در همون نواحی که توش تغییرات صورت گرفته(RIO) یا نواحی هدف فیلترشونو پیدا می کنن.برای لبه گرفتن هم از لبه های رایج استفاده نمی کن چون معمولی هاش کیفیت خوبی ندارن و بهترین شون Canny در تصاویر طبیعی لبه های شلوغی رو به شما میده که این هم سرعت کار رو کاهش میده و هم دقتو. با توجه به پست های قبلی که عرض کردم از لبه گیر های Real time که یه بحث مفصلی تو پردازش تصویر پیشرفته اس مطرح میشه که معروف ترینشون CNN . تو سایت Search کنید یه چیزایی در موردش گفتم اگر اطلاعات بیشتری هم در این زمینه خواستید خدمتون عرض می کنم.
پس از اون این لبه های بدست آمده بایستی با روش مختلف بایستی شناسایی بشن.که برای این کار میتونید از Neural Network یا Neuro-Fazzy استفاده کنید .بایستی حیطه کار مشخص شه تا بعداً در مورد نظر داده بشه .با این مقوله ها به صورت کلی نمیشه رفتار کرد

----------


## farhaneh

> شما برای شروع در ابتدا بایستی با پردازش تصویر آشنایی داشته باشی.بعد اون برای شناسایی چهره های مشخص شده بایستی شبکه عصبی بدونید.شما دراین پروژه به mlp و متد آموزش backpropagation نیازدارید. بعد اون به PCA جهت کاهش ابعاد بردارهای مربوط به face pattern هاتون. بعد از اون یک مدل شبکه عصبی SVM رو جهت Classification مجدد بردارهاتون جهت بالابردن سرعت .به علت realtime بودن مسئله. layerin شبکتون با توجه به موارد ذکر شده 4 لایه به ترتیب از لایه ورودی 40و20و10و1 در نظر بگیرن.ابعاد تصاویر اولیه که مخاین آموزش بدین رو کمتر از 20*20 در نظر بگیرید.تصاویر رو به دو دسته چهره و غیره چهره تقسیم کنید جهت آموزش.و در ضمن جهت یکسان سازی و رفع نویز از Guassian blur استفاده کنید.


ممکنه کمی در مورد آنالیز المان های اصلی یا PCA توضیح بدین؟
مرسی.

----------


## مصطفی ساتکی

PCA  (Principal Component Analyze یک متد آماری بوده که از جهت کاهش ابعاد بردار استفاده میشه که کاربردهای متنوعی در زمینه پردازش سیگنال و تصویر داره.از جمله کاربردهاش می تونیم به فشردهسازی تصاویر ،Feature Extraction ،تشخیص چهره،تشخیص آبجکت و ... نام برد.به فرض یه تصویر یا Feature هایی از یه تصویر داریم که اونو به آرایه یک بعدی(بردار) تبدیل کردیم و قتیکه این اطلاعات حجیم باشن مسلماً در کارایی کلی برنامه تاثیر می زارن پس چه بهتره که با روشی حجم این اطلاعات یا به اصطلاح ریاضی ابعاد بردار رو کاهش بدیم .PCA برای این کار ابتدا از بردار ورودی تهیه شده Cov (کوواریانس) می گیره .به فرض بعد بردار ورودی N باشه Cov به صورت یه ماتریس بوده با ابعاد N*N .ما با استفاد از ماتریس Cov بردارهای ویژه(EigenVector) و مقادیر ویژه(EigenValue) رو بدست میاریم. PC فقط مقادیر ویژه ای مطلوبشه که دارای بیشترین واریانس باشه به مرتبشون میکنه و با در نظر گرفتن یه threshold بقیه مقادیری رو که دارای واریانس پایین هستند رو حذف می کنه که البته این روشی که من گفتم به صورت سنتی بوده و روش علمی هم برای این کار وجود داره که اون روش های تضمین می کنن .که مقادیر  مطلوب از بین نرن.البته قابل ذکر که محاسبه ماتریس Cov هزینه بالایی داره به طوری پیچیدگی برابر با O(n3) که این روش زمانگیر به همین خاطر روش هایی با شبکه عصبی هم وجود داره که می تونه این کارو واسمون انجام بده که از جمله اونا Hebb بدون ناظر که این کارو می تونه واسمون انجام بده.پس از جمله مزایای اصلی pca همون کاهش ابعاد بردار ورودی یا فشرده سازیه.که تو تشخیص چهره بجای EigenValue به این بردارها می گن EigenFace.

----------


## tahaf18

سلام  فکر کنم برای شروع کار استفاده از verilook SDK بهتر باشه.
خیلی کار رو راحت می کنه و نیاز به برنامه نویسی پیشرفته نداره.

----------


## ayub_coder

ببخشید اومدم وسط حرفتون.برای شروع از صفر می تونید منابعی معرفی کنید؟ در مورد پردازش تصویر؟

----------


## dousti_design

delphi_cat عزیز سلام. خیلی خوشحالم این تالار بالاخره راه اندازی شد. چند تا سوال از خدمتتون داشتم:
 برای یه برنامه ocr ساده چه نوع شبکه عصبی رو پیشنهاد میکنید.
من برای تشخیص یک عدد خیلی کوچیک و ساده از پرسپترون چند لایه استفاده کردم اصلا جواب نداد(زیادم وارد نیستم).
درضمن فریمورک Aforge رو برای کار با شبکه های عصبی( و یادگیری آن) در سی شارپ توصیه میکنید یا خیر؟
کلا برای شبکه های عصبی فریم ورکی سراغ دارید که قابلیت تغییرش هم آسون باشه؟ برای پردازش تصویر و بینایی چی؟
برای کار با تصاویر چه زبان برنامه نویسی را پیشنهاد میکنید؟ سی شارپ مناسب هست؟
با تشکر فراوان

----------


## dousti_design

> ببخشید اومدم وسط حرفتون.برای شروع از صفر می تونید منابعی معرفی کنید؟ در مورد پردازش تصویر؟


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

----------


## مصطفی ساتکی

> برای یه برنامه ocr ساده چه نوع شبکه عصبی رو پیشنهاد میکنید.


 البته شما از classifier های دیگر همچون SVM  یا حتی رگرسیون هم می تونید استفاده کنید یا classifier های model base همانند hmm.
اما اگر فقط مد نظرتون این مورد که حتماً شبکه عصبی استفاده کنید 2 گزینه مناسب در پیش روتون دارید MLP و RBF.




> من برای تشخیص یک عدد خیلی کوچیک و ساده از پرسپترون چند لایه استفاده کردم اصلا جواب نداد(زیادم وارد نیستم).


نگاه کنید مرحله forward مطلب خاصی نداره که شما بخاید رو مانور بدید مسئله اصلی مربوط میشه به متدی تصحیح خطا که در اون بایستی وزن ها رو به گونه ای تغییر بدید که شبکه با توجه به ورودی و جواب مطلوب خروجی رو به شما بده که کمترین خطا رو  نسبت به جواب مطلوب بده.
متدی های که میان وزن ها رو اصلاح می کنند در واقع روش های بهینه ساز مدل هستند که از جمله آنها می توان به روش gradient descent ، maximum liklihod ، ضرایب لاگرانژ ، روش نیوتن و بسیاری از روش های دیگر استفاده نمود . در مورد روش gradient descent در اینجا بحث شده .البته برای جزئیات بیشتر می تونید به کتاب hugan رجوع کنید.
علاوه بر مواردی که گفته شد در مورد تنظیم پارامترهای شبکه شما بایستی استراتژی آموزش هم در نظر بگیرید که نحوه در هم ریختگی داده های ورودی رو در هر گام از شبکه مشخص می نماید .البته بایستی در ابتدا بایستی از روش های segmentation خودکار بیاید داده ها ورودی تونو کلاسه بندی کنید که برای اینکار می تونید از kmean و LVQ استفاده نماید .اگر داده هاتون خیلی زیاد باشه بایستی از روش های کاهش ابعاد بردار همچون pca بردارهای ورودی تونو از نظر حجم کاهش بدید و فقط از اون قسمت از اطلاعاتشون استفاده کنید که بیشترین بار اطلاعاتی رو دارند (در همین پست که وسطش سوال پرسدید توضیح دادم) همچین بجای استفاده از یک تک شبکه می تونید برای هر کلاستر یک شبکه در نظر بگیرید همانند decision tree که اصطلاحا به آن مدل OCON گفته میشه این روش هم باعث میشه هر کدام از زیر شبکه براحتی آموزش ببینند سرعت آموزش بالاتر خطای ردرون کلاسی کمتر میشه و اگر در مینیمم محلی گیر افتادید با روش تعداد iteration می تونید همون زیر شبکه رو reset نمایید.




> درضمن فریمورک Aforge رو برای کار با شبکه های عصبی( و یادگیری آن) در سی شارپ توصیه میکنید یا خیر؟


بایستی به متد بهینه سازیش نگاه کنید و پارامترهایی که در نظر گرفته بقیه مواردی رو که خدمتون عرض کردم رو بایستی خودتون در نظر بگیرید .اگر نیازی ندارید که قسمت آموزش هم تو application باشه می تونید از MATLAB هم برای آموزش استفاده نمایید تو matlab وزن ها رو ذخیره کنید و تو برنامه خودتون اونو load کنید فقط خودتون forward رو بنویسید.




> برای کار با تصاویر چه زبان برنامه نویسی را پیشنهاد میکنید؟ سی شارپ مناسب هست؟


بهترین گزینه مشتقات زبان C  می باشد
موفق باشید

----------


## en-keramat

ممنون میشم منابعی برای پردازش تصویر در VB.Net نیز معرفی کنید 

من یک سری از برنامه های زمبنه تخصصی خودم که مربوط به مبحث  پردازش تصویر هستنش در Matlab نوشتم ، قصد دارم برنامه که تو متلب نوشتم با Vb.net باز نویسی اش کنم  .

ممنون میشم راهنمایی ام کنید.

----------

