Feature Engineering for Images: A Valuable Introduction to the HOG Feature Descriptor
این یک مقاله ترجمه شده با همین عنوان است و سعی کردم تا حد امکان متن و محتوای اصلی رو دست نخورده و قابل فهم منتقل کنم
بررسی اجمالی:
- آموزش اینکه چه اتفاقی توش میفته و ریاضیات پشت توصیف کننده ویژگی HOG
- توصیف کننده ویژگی HOG عموما توی بینایی ماشین (computer vision) برای تشخیص یک آبجکت ( object detection) استفاده میشه
- یک راهنمای ارزشمند مهندسی ویژگی برای کلیه علاقه مندان به زمینه بینایی ماشین (computer vision)
مقدمه:
مهندسی ویژگی یک تغییر دهنده بازی (یعنی روند کار رو تغییر میده) توی دنیای الگوریتم های یادگیری ماشین هست. درواقع یکی از جنبه های مورد علاقه (نویسنده اصلی و مترجم) در دانشمند داده بودن. اینجا جاییه که تجربه کسب میکنم برای مهندسی ویژگی های جدید از قبلی ها و بهبود مدلمون.
برخی از بهترین داده کاوان و داشمندان داده در سرار دنیا فقط با تکیه مهندسی ویژگی برای بهبود امتیاز leaderboard توی hackathons (یک رویداد مربوط به برنامه نویسی)هستند. من مطمئن هستم که حتی شما هم از روش های مختلفی برای مهندسی ویژگی روی داده ها استفاده کردید.
همین طور ببینید: What do leaderboard scores mean?
آیا ما میتونیم این تکنیک رو برای فهمیدن داده مثل عکس استفاده کنیم؟ این یک معمای جالب برای علاقمندان در زمینه بینایی ماشین است و ما در این مقاله حلش میکنم. برای انجام مهندسی ویژگی در قالب استخراج ویژگی از داده های تصویری آماده باشید.
در واقع روش های چندگانه ای برای استخراج ویژگی هست. ما سه روش پایه روی در مقاله ای پرداختیم (لینک به سایت اصلی)
توی این مقاله من یک روش محبوب برای استخراج ویژگی رو معرفی میکنم به شما - Histogram of Oriented Gradients که به عنوان HOF معمولا شناخته میشود. ما متوجه میشویم که توصیف کننده ویژگی HOG چطوری کار میکنه ( ریاضیات کامل پشت الگوریتم) و در نهایت توی پایتون پیاده سازیش میکنیم.
جدول محتوایی:
- یک توصیف کننده ویژگی چیست
- معرفی توصیف کننده ویژگی HOG
- ۳پردازش hog
- پیش پردازش داده ها
- محاسبه گرادیان
- محاسبه اندازه و جهت
- ۴. روش ساخت یک هیستوگرام با کمک گرادیان و جهت
- ۵. پردازش اندازه HOG
- اندازه هیستوگرام گرادیان
- نرمالایز گرادیان
- ویژگی های یک عکس
- ۶. پیاده سازی یک توصیف کننده ویژگی HOG توی پایتون
یک توصیف کننده ویژگی چیست؟
احتمالا شما این سئوال وقتی که عنوان رو میخونید دشتید. خب بذارید شفاف کنم قبل از اینکه به بخش HOG مقاله بریم.
نگاهی به این دو تصویر نمایش داده شده بندازید میتونید تمایز بین این دو عکس رو قائل بشید؟
ما میتونیم به صورت واضح ببینم که سمت راست یک سگ و سمت چپ تصویر یک ماشین (اتوموبیل) هست حالا بیاید یکم کار رو سخت تر کنیم اشیایی که توی تصویر زیر نمایش داده شده رو مشخص کنید.
هنوز سادس درسته؟ میتونید فرق بین حالت اول و دوم رو تشخیص بدید؟ حالت اول تصویر کلی اطلاعات داشت مثل شکل تصویر توی عکس, رنگشون, لبه, پس زمینه و… .
از طرف دیگه تصویر دوم اطلاعات خیلی کمی داره (شامل فقط شکل و لبه هاست) ولی هنوز دو تصویر (سگ و ماشین) به اندازه کافی قابل تمایز هستند.
متوجه شدید به کدوم سمت دارم میرم؟ ما میتونیم به صورت ساده تمایز اشیا رو توی کیس دوم بفهمیم به خاطر اینکه اطلاعات مورد نیازی که برای تشخیص اشیا رو می خواهیم داره. این چیزی که توصیف کننده ویژگی انجام میده.
« این نمایش تصویر ساده شده است که تنها مهمترین اطلاعات در مورد تصویر وجود دارد»
چندین توصیف کننده ویژگی وجود دارد محبوب ترین انها:
- HOG: Histogram of Oriented Gradients
- SIFT: Scale Invariant Feature Transform
- SURF: Speeded-Up Robust Feature
در این مقاله روی توصیف کننده ویژگی HOG و نحوه کارکردش تمرکز میکنیم. بیاید شروع کنیم.
مقدمه ای بر توصیف کننده ویژگی HOG
HOG یا Histogram of Oriented Gradients یک توصیف کننده ویژگی هست که معمولا برای استخراج ویژگی از تصاویر مورد استفاده قرار میگیرد. به صورت گسترده ای در بینایی ماشین برای کارهایی تشخیص شی استفاده میشود.
بیایید نگاه به جلوه های مهم HOG بندازیم که متفاوتش میکنه از دیگر توصیف کننده های ویژگی:
- توصیف کننده HOG روی یک ساختار یا شکل یک شی تمرکز میکنه به همین دلیل شاید بپرسید چطوری تفاوت لبه های ویژگی ها رو از تصویر استخراج میکنه؟ در مورد ویژگی های لبه ما فقط شناسایی میکنیم یک پیکسل لبه هست یا نه. HOG توانایی فراهم کردن جهت لبه رو به خوبی داره. البته این مورد با گرادیان و جهت (یا بزرگی و جهت) لبه ها انجام میشه.
- به علاوه جهت آنها به صورت بخش های محلی محاسبه میشه. به این معنا که برای محاسبه یک تصویر به بخش های کوچک تر شکسته میشه و گرادیان و جهت محاسبه میشه.ما دربارش بیشتر دربارش صحبت میکنیم در بخش های بعدی.
- در نهایت HOG میتونه یک هیستوگرام هر بخش رو به صورت جداگانه بسازه. هیستوگرام با استفاده از گرادیان و جهت یک مقدار پیکسل ساخته میشه که با عنوان Histogram of Oriented Gradients شناخته میشه.
برای قرار دادن یک تعریف رسمی:
توصیف کننده ویژگی HOG محاسبه میکنه وقوع (occurrences ) یک جهت گرادیان رو توی بخش های محلی تصویر (localized portions)
پیاده سازی یک HOG با کمک ابزارهایی مثل OPENCV خیلی سادس فقط چند خط کد که از تابع از قبل تعیین شده به اسم hog توی sklearn.feature استفاده کنیم. توی این مقاله روی نحوه محاسبه این ویژگی ها صحبت میکنیم.
پردازش محاسبه Histogram of Oriented Gradients (HOG)
حالا شما باید یک ایده اولیه از اینکه توصیف کننده ویژگی HOG چی هست داشته باشید. زمان میبره که به هسته ایده پیش مقاله برسید. بیاید درباره مراحل پردازش محاسبه HOG صحبت کنیم.
با در نظر گرفتن تصویر زیر با سایز ۱۸۰ در ۲۸۰ بیاید یک با جزئیات به نحوه کار ویژگی های HOG که از تصویر به دست می آید بندازیم.
قدم اول: پیش پردازش داده ( تغییر سایز ب ۶۴ در ۱۲۸)
این یکی از قدم های مهم هست که به خوبی باهاش آشنا هستید. پیش پردازش داده یک قدم مهم در هر پروژه یادگیری ماشین هست و فرقی نمیکنه با تصاویر کار میکنیم.
برای پیش پردازش تصویر نیاز دارید که عرض و طول تصویر رو به نسبت ۱ به ۲ تبدیل کنید. این تصویر ترجیحا باید ۶۴ در ۱۲۸ باشد. به خاطر اینکه ما تصویر رو به بخش هایی ۸ در ۸ و ۱۶ در ۱۶ مسیر (patches) برای استخراج ویژگی تبدیل میکنیم. داشتن سایز دقیق ۶۴ در ۱۲۸ تمام محاسبات ما رو ساده میکنه. در واقع این دقیق مقادیری هست که در مقاله اصلی استفاده شده.
برگردیم به نمونه ای که داریم. بیاید سایز رو به ۶۴ در ۱۲۸ تبدیل کنیم.
قدم دوم: محاسبه گرادیان (اندازه و جهت x و y)
قدم بعدی این هست که گرادیان هر پیکسل توی تصویر رو حساب کنیم. گرادیان تغییرات کوچیک توی مسیر x و y هستند . اینجا من یک بخش کوچکی از تصویر رو برمیدارم و گرادیان رو روی اون حساب میکنم.
بیایید مقادیر پیکسل ها رو از این بخش بگیریم. ماتریس زیر ساخته شده از پیکسل های اون بخش است. (ماتریس نمایس داده شده از به عنوان نمونه هست و از مقادیر پیکسل های مقاله استفاده نمیکند.)
من پیکسل ۸۵ رو پر رنگ کرده ام حالا بیاید مقدار گرادیان (یا تغییر) جهت رو توی x ها حساب کنیم. ما نیاز داریم مقدایر سمت راست و چپ این پیکسل رو در بیاریم.مشابه کاری که باید برای جهت y ها انجام بدیم و مقادیر بالا و پایین رو انتخاب میکنیم.
اینجا نتایج گرادیان توی جهت x و y این پیکسل رو میبینید:
تغییرات توی جهت x مساویست با ۸۹-۷۸=۱۱
تغییرات توی جهت y مساویست با ۶۸-۵۶=۸
این پردازش به دو ماتریس جدید رو میده یکی برای نگه داری مقادیر گرادیان در جهت x ها و دیگری برای y ها. این مشابه استفاده از Sobel Kernel با مقدار یک هست.
تغییرات شدیدتر خواهید بود وقتی شکل یک تصویر عوض میشه مثل اطراف لبه ها.
ما گرادیان توی دو جهت x و y رو به صورت جداگانه ای اندازه گرفتیم. این روند رو برای تمام پیکسل های موجود در تصویر تکرار میکنیم. مرحله بعدی یافتن مقدار و جهت اندازه گیری با کمک این مقادیر خواهد بود.
قدم سوم محاسبه جهت و اندازه
با استفاده از گرادیانی که حساب کردیم در مرحله قبلی حالا میتونیم جهت و اندازه هر مقدار هر پیکسل رو حساب کنیم. برای این قدم ما با استفاده از تئوری فیثاغورس استفاده میکنیم ( بله همان چیزی که توی مدرسه خوندید).
بیاید یک نگاهی به تصویر زیر بندازیم:
گرادیان به صورت پایه ای عمدی و افقی برای نمونه قبلی داریم Gx و Gy که ۱۱ و ۸ هستند. بیاید تئوری فیثاغورث رو اعمال کنیم برای محاسبه اندازه گرادیان.
اندازه گرادیان
اندازه گرادیان برای نمونه ما
بعدش محاسبه جهت برای همین پیکسل هست. ما میدونیم که با کمک tan و زاویه مقادیر اون رو بدست بیاریم حالا:
حالا با کمک مقادیر زاویه رو بدست میاریم:
زاویه این پیکسل ۳۶ درجه است خب حالا برای همه مقادیر پیکسل ها ما اندازه گرادیان و جهتش رو داریم حالا نیاز هست هیستوگرام رو با کمک گرادیان و جهت بسازیم.
اما صبر کنید ما یک قبل از اینکه به نحوه ایجاد یک هیستوگرام وی توصیف کننده ویژگی HOG بپردازیم باید کمی توقف کنیم. این یک قدم کوچک در روند کلی در نظر بگیرید. و ما شروع میکنیم اینکه درباره روش های هیستوگرام با کمک دو مقداری که داریم - اندازه و جهت.
روش های مختلفی برای ساخت یک هیستوگرام با کمک گرادیان و جهت.
هیستوگرام یک یک نمودار هست که نشون میده فرکانس توضیع یک مجموعه ای از داده ها ما متغیر (به شکل bin ها) روی محور x و فرکانس روی محور y داریم. در اینجا ما میخواهیم زاویه یا جهت روی محور x و فرکانس روی محور y بکشیم.
روش یک
بیایید با ساده ترین روش ایجاد هیستوگرام شروع کنیم. ما مقدار هر پیکسل رو میگیریم و جهت اون پیکسل رو پیدا میکنیم و جدول فرکانس رو آپدیت میکنیم.
این جا فرایند برای پیکسل علامت گذاری شده (۸۵) است. با توجه به اینکه جهت این پیکسل ۳۶ هست ما در کنار زاویه ۳۶ که این تعداد تکرار این زاویه را نشان میدهد.
همین پردازش رو برای تمام مقادیر پیکسل ها تکرار می کنیم و در نهایت یک جدول فرکانس (تکرار) داریم که میگه هر زاویه چقدر در تصویر تکرار شده. این جدول فرکانس میتونه برای ساخت هیستوگرام با مقادیر زاویه در محور x و فرکانس در محور y استفاده بشه.
این یک روش ایجاد هیستوگرام است. توجه داشته باشید که در اینجا مقدار bin هیستوگرام ۱ است. از این رو ما ۱۸۰ bin مختلف داریم که برای هر مقدار جهت یابی رو انجام میدیم. روش دیگر برای ایجاد هیستوگرام ویژگی برای مقادیر بالاتر هست.
(منظور از bin تقسیم بندی داده به بخش هایی با اندازه bin است که در اینجا ۱۸۰ درجه رو به bin ها یکی تبدیل کردیم و ۱۸۰ bin مختلف داریم)
روش دوم:
این روش مشابه روش قبل است, در اینجا انتظار داریم که به bin های ۲۰ تایی تبدیل کنیم و در نهایت به ۹ تا bin میرسیم.
دوباره برای از پیکسل ما جهت رو بررسی میکنیم و فرکانس (مقدار تکرار) اون جهت رو توی مقادیر از در فرم ماتریس ۹ در ۱ نمایش میدیم که به ما هیستوگرام میده.
روش سوم:
دو روش قبلی فقط مقادیر جهت رو برای ساخت هیستوگرام در نظر میگرفتند و گرادیان رو حساب نمیکردند. در اینجا یک روش دیگر هست که میتونه هیستوگرام رو به جای استفاده از تکرار با کمک اندازه گرادیان مقادیر ماتریس رو پر کنیم. در زیر یک نمونه از این روش هست:
شما متوجه شدید که ما در حال استفاده از جهت مقدار ۳۰ هستیم و و بین ۲۰ رو فقط بروز رسانی میکنیم. به علاوه ما به دیگر بین ها هم یک وزنی رو میدیم.
روش چهارم:
باید یک تغییر کوچک در روش بالا بدیم. اینجا ما مشارکت دو طرف گرادیان یک پیکسل رو به بین ها میدیم. به یاد داشته باشید مشارکت بالا باید به bin ی داده شود ک مقدار نزدیک تر رو به جهت داره.
این دقیقا روشی هست که هیستوگرام ها در توصیف کننده ویژگی HOG ساخته میشود.
قدم چهارم: محاسبه هیستوگرام توی ۸ در۸ سلول ۹ در 1
هیستوگرام ایجاد شده توی توصیف کننده ویژگی HOG دقیقا از کل تصویر ساخته نمیشه بلکه تصویر به سلول های ۸ در ۸ تقسیم میشه و هیستوگرام جهت گرادیان برای هر سلول محاسبه میشه. چرا اینطوری اتفاق میوفته؟
با این کار ویژگی ها (یا هیستوگرام) را برای تکه های کوچیک تر که به نوبه خود نشان دهنده کل تصویر است دریافت میکنیم. ما میتونیم مقداریم رو از ۸ در ۸ به ۱۶ در ۱۶ یا ۳۲ در ۳۲ تغییر دهیم.
اگر تصویر رو به سلول های ۸ در ۸ تقسیم کنیم و هیستوگرام رو بسازیم برای هر سلول ما ماتریس ۹ در ۱ رو داریم این ماتریس با کمک چهار روشی که قبلی که دربارش صحبت کردیم ساخته میشود.
هنگامی که hog رو برای تکه های ۸ در ۸ تصویر ایجاد میکنیم مرحله بعدی نرمالیز هیستوگرام است.
قدم پنجم: نرمالایز گرادیان در سلول ۱۶ در ۱۶ (۳۶ در ۱)
قبل از اینکه بفهمیم این چطوری انجام میشه مهم هست بفهمیم چرا این باید در قدم اول ما قرار گرفته.
اگرچه همین الان هم ویژگی های HOG ساخته شده از سلول های ۸ در ۸ عکس رو داریم. گرادیان یک عکس خیلی حساس هست به نورپردازی کلی. به این معنا که یک تصویر خاص مقداری از کل تصویر نسب به سایز بخش ها روشن تر خواهد بود.
ما نمی توانیم این بخش عکس رو به صورت کلی حذف کنیم ولی میتونیم این تغییر نور رو کاهش بدیم با نرمالایز گرادیان در بلوک های ۱۶ در ۱۶. اینجا یک نمونه هست از نحوه ساخت بلوک های ۱۶ در ۱۶:
اینجا ما چهار سلول ۸ در ۸ رو ترکیب میکنیم تا یک سلول ۱۶ در ۱۶ رو بسازیم و همانطور که میدونیم هر سلول ۸ در ۸ ای یک ماتریس ۹ در۱ برای هیستوگرام داره. خب ما چهار ماتریس ۹ در ۱ داریم یا یک ماتریس ۳۶ در ۱. برای نرمالایز این ماتریس ما هر مقدار رو به توان دو ریشه جمع سری از مقادیر انجام میدیم. به صورت ریاضی وار ما یک وکتور داریم :
که محاسبه کردیم ریشه جمع همه مقادیرش رو
حالا همه مقادیرj توی وکتور V رو تقسیم بر با مقدار k کردیم
نتیجه میتواند یک وکتور نرمال شده ۳۶ در ۱ باشد.
قدم ششم: ویژگی ها برای کل تصویر
حالا ما در قدم نهایی از ساختن ویژگیهای HOG برای یک تصویر هستیم. تا کنون ویژگی ها رو باری بلوک های ۱۶ در ۱۶ یک تصویر در آوردیم حالا تمام این ویژگیها رو ترکیب میکنیم تا تصویر نهایی رو بسازیم.
آيا میتونید حدس بزنید تعداد کلی ویژگی هایی که خواهیم داشت چقدر است؟ ابتدا باید بفهمیم چند بلاک ۱۶ در ۱۶ وجود دارد تا یک تصویر ۱۲۸ در ۶۴ را بسازد:
ما ۱۰۵ بلاک (۷ ضرب در ۱۵) با اندازه ۱۶ در ۱۶ داریم. هرکدام از این بلاک ها یک وکتور ۳۶ در ۱ رو به عنوان ویژگی ها داره. از این رو کل ویژگی های تصویر میتواند ۱۰۵ در ۳۶ که مساویست با ۳۷۸۰ ویژگیست باشد.
حالا ما ویژگی های HOG رو برای یک تصویر می سازیم و بررسی میکنیم که همان مقدار ویژگی داشه باشه در انتها.
پیاده سازی توصیف کننده ویژگی HOG در پایتون
حالا وقتشه بریم سر بحث پایتون! مطمئنا این قابل پیش بینی ترین بخش مقاله هست بیاید شروعش کنیم پس.
میبینم که چطوری میتونیم ویژگی های HOG رو روی تک تصویر و اگر ممکن باشد روی یک دیتاست بزرگتر اجرا کنیم. ابتدا کتابخونه ها و عکسی که میخواهیم باهاش ویژگی های HOG رو بسازیم لود کنیم
(663, 459, 3)
ید که کتابخونه skimage ورودی رو به عنوان height x width میگیره.
(128, 64, 3)
اینجا ما از تابع hog از کتابخونه skimage.features به صورت مستقیم استفاده می کنیم. پس خب لازم نیست گرادیان و اندازه و جهت رو به صورت جداگانه حساب کنیم. تابع hog به صورت داخلی تمام این موارد را حساب میکنه و به ماتریس ویژگی ها رو برمیگردونه.
همچنین اگر شما یک پارامتر visualize = True رو تنظیم کنید عکس hog رو برمیگردونه.
قبل از اینکه پیشرویم اجازه بدید من یک سری ایده از اینکه هر کدوم از پارامتر ها انجام میدن رو بهتون بدم. از سوی دیگر شما میتونید این تعاریف رو از داکیومنت رسمی مشاهده کنید.
- پارامتر orientations که تعداد bin هایی که میخواهیم بسازیم رو میگم بهش. وقتی که من میخواهم یک ماتریس ۹ در ۱ داشته باشم این پارامتر رو ۹ تنظیم میکنم.
- پارامتر pixels_per_cell اندازه سایز هر سلول که میخواهیم ازش هیستوگرام رو بسازیم تعیین میکنیم. توی نمونه ای که در مقاله بررسی کردیم ما از سلول های ۸ در ۸ استفاده کردیم و اینجا هم همین مقادیر رو قرار میدیم. البته میتونید هر مقدار دیگه ای هم باشه.
- پارامتر cells_per_block که سایز هر بلاک رو که میخواهیم نرمالیز کنیم هیستوگرام رو تعیین میکنه. همانطور که گفتیم سلول بر بلاک هست و نباید سایز پیکسل رو بنویسیم به جا نوشتن ۱۶ در ۱۶ ما می نویسیم ۲ در ۲ اینجا.
ماتریس ویژگی ساخته شده از تابع توی متغیری به اسم fd قرار دارد و تصویر روی hog_image قرار دارد. اجازه بدید ماتریس ویژگی ها رو بررسی کنیم:
(3780,)
همانطور که انتظار داشتیم ما ۳۷۸۰ ویژگی برای این تصویر داریم و این محاسباتی که در قدم های قبلی انجام دادیم رو تایید میکنه. شما می توانید انتخاب کنید که مقادیر هایپر پارامترها hyperparameters تغییر کنه و یک ماتریس ویژگی با سایز جدید بگیرید.
بیایید به تصویر نهایی hog نگاهی بیندازیم.
سخن پایانی
ایده ای که پشت مقاله بود این بود که به شما یک درکی از اون چیزی که توی توصیف کننده ویژگی HOG بیوفته رو بده و چطوری ویژگی ها محاسبه میشن. کل فرایند به هفت قدم ساده تقسیم بندی شد.
به عنوان یک قدم بعدی شما رو تشویق میکنم که از ویژگی های HOG در حل یک مسئله بینایی ماشین استفاده کنید و ببینید که آیا کارایی مدل بهبود پیدا میکند یا نه.