به پارت سوم مقاله ساخت موتور جست و جوگربصری رسیدیم، در پارت قبل به طور کامل در مورد دیتاست و پیش پردازش های تصاویر باهم صحبت کردیم؛ در این پارت قرار به فان ماجرا برسیم و مدل اصلی را اموزش بدیم.
در یادگیری ماشین (machine learning) و یادگیری عمیق (deep learning) روش هایی وجود دارد که با دقت زیاد به مسائل کلاس بندی (classification), رگرسیون ( برای object detection) در پردازش تصویر به خوبی پاسخ میدهد.
نوع دیگری مسئله وجود دارد که در آن مدل ورودی دو تصویر چهره بگیرد و خروجی جواب سوال " آیا این تصاویر یک شخص هست یا خیر؟ "را بدهد.
در یادگیری متریک (metric learning) ما به دنبال یادگیری شباهت بین دو تصویر یا چیز (موزیک و فیلم و …) هسیم.
درک شباهت بین تصاویر یک مشکل کلیدی در بینایی کامپیوتر است. برای اندازه گیری شباهت بین تصاویر، معمولا تصاویر را در یک فضای ویژگی به عنوان بردار تعبیه میکنیم(embedded in a feature vector space) که فاصله ی بردار ها نسبت به هم در این فضا، تشابه نسبی برقرار است.
برگردیم به سوال " آیا این تصاویر یک شخص هست یا خیر؟ " برای جواب دادن به این سوال، ما میتوانیم هر شخص را یک کلاس در نظر بیریم و مدل را اموزش بدیم.
ولی این روش یه سری محدودیت هایی دارد، مهم ترینش این است که ما عکس همه ادم های روی کره زمین را نداریم تا با کلاس بندی آن ها و سپس تشخیص اون ادم بتوانیم قفل گوشی را باز کنیم.
به جای کلاس بندی هر شخص از یه تابعه شباهت (similarity function) استفاده میکنیم، به این صورت که دو تا تصویر به تابع بدهیم و ازش امتیاز شباهت بین دو تصویر را بخواهیم.
در پارت اول با استخراج ویژگی تصاویر در فضای n بعدی اشنا شدیم، بعد از استخراج ویژگی در تصویر، ما یک بردار 128 بعدی( 128-dim) که نشون دهنده ی ویژگی های تصویر هست.
دو نوع تابع هزینه (loss function) برای این شبکه وجود دارد. - Contrastive loss - Triplet loss
در تابع هزینه contrastive loss مدل یک جفت عکس میگیرد، اگر این جفت از یک شخص باشد(positive pair) که *y برابر با 1 خواهد بود و فقط نیمه اول تابع هزینه محاسبه میشود و در اینجا باید فاصله این جفت عکس به هم نزدیک شود.
اگر این جفت عکس از یک شخص نباشد(negative pair)، در اینجا باید فاصله دو تصویر نسبت به هم زیاد شود (در فرمول ما m(مارجین) قرار میدهیم که اگر فاصله ی دو تصویر اندازه مارجین بود دیگر عمل بکپروپگیشن (backpropagation) و تغییر وزن های مدل را انجام نده.).
در تابع هزینه triplet loss مدل سه تا عکس به عنوان ورودی میگیرد anchor, positive, negative؛
در این نوع از آموزش دادن، مدل یک تصویر(anchor) را میگیرد و هم زمان با positive pair و negative pair مقایسه میکند؛ قطعا باید شباهت بین anchor و positive زیاد باشد (فاصله دو عکس نسبت به هم کم باشد) و شباهت anchor و negative کم باشد (فاصله دو عکس نسبت به هم زیادباشد).
برگردیم به موضوع اصلی مقاله که شباهت بین تی شرت های دیجی کالا بود، دیتا هارو طوری در یک فایل csv قرار میدهیم کهدر هر ردیف، ستون اول anchor، ستون دوم posetive و ستون سوم negative باشه؛ میتونیم برای قسمت posetive از طریق دیتا اگمنتیشن یک سری تغیرات(نویز،کراپ،تغییر سایز عکس و ... ) روی anchor انجام بدیم و برای قسمت negative هم به صورت رندوم یک تصویر دیگه از دیتاستون را انتخاب میکینم.
بعد از حدود دو ساعت اموزش مدل یه خروجی نسبتا قابل قبولی دریافت کردم.
تمام کد های siamese network به زبان پایتون (python) در گیت هابم موجود هست.
بخش سوم و این سری از مقالات را تمام میکنم امیدوارم خوشتان آمده باشد من تازه شروع کردم به نوشتن پروژه ها، اگر پیشنهادی یا انتقادی به نوع نوشتاری و کلا همه چی داشتید خوش حال میشم نظرتون را برای من بنویسید.