خانه > مقالات آموزشی > بینایی ماشین > هیستوگرام شیب های جهت دار (بخش اول)

هیستوگرام شیب های جهت دار (بخش اول)

در این پست قصد داریم در مورد توصیف گر هیستوگرام شیب های جهت دار ( HOG ) بحث کنیم. هر چند این توصیف کننده در Matlab، OpenCV‌ و برخی کتابخانه های دیگر پیاده سازی شده اما آشنایی با جزئیات پیاده سازی این توصیف گر کمک می کند تا بتوانیم به بهترین نحو از آن استفاده کنیم.

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

توصیف گر چیست؟

توصیف گرها همان طور که از اسمشان بر می آید توصیفی از کل یک تصویر یا بخشی از آن هستند. آن ها با استخراج اطلاعات مفید و دور ریختن اطلاعات غیر ضرور، تصویر را ساده می کنند. معمولا توصیف گرها تصویری با اندازه ( طول * عرض * ۳ ) را تبدیل به بردار ویژگی ای با طول n می کنند. به عنوان مثال هیستوگرام شیب های جهت دار ( HOG ) ، تصویری با اندازه ۶۴*۱۲۸*۳ را تبدیل به برداری با طول ۳۷۸۰ میکند. البته هیستوگرام شیب های جهت دار ( HOG ) می تواند تصویر را به بردارهایی با طول های دیگر هم تبدیل کند اما از آنجا که مرجع ما مقاله ی Dalal and Triggs خواهد بود به پارامترهای مقاله مرجع استناد خواهیم کرد.

خب، همه چیز به نظر خوب میاد! اما یک لحظه صبر کنید. کدام اطلاعات ”مفید“ و کدام اطلاعات ”غیر مفید“ اند؟ برای تعریف واژه ”مفید“ ابتدا باید این سوال را مطرح کنیم که مفید برای انجام چه کاری؟ قطعا بردار ویژگی برای هدف ”مشاهده“ تصویر مفید نیست اما برای image recognition  یا  object detection بسیار مفید است. بردار ویژگی تولید شده توسط این الگوریتم ها هنگامی که به کلاسه بندهایی نظیر SVM اعمال می شوند نتایج بسیار خوبی را تولید می کنند.

خب، سوال بعدی این که چه انواعی از ویژگی ها برای عمل طبقه بندی مفید است؟ بهتر است با مثالی مساله را روشن کنیم. فرض کنید می خواهیم یک object detector بسازیم که دکمه های پیراهن و کت را تشخیص دهد. معمولا دکمه ها دایره ای اند و نیز چند سوراخ روی آن ها وجود دارد. شما می توانید یک تشخیص دهنده ی لبه را بر تصویر دکمه اعمال کنید و صرفاً با نگاه کردن به لبه های تصویر تعیین کنید که آیا این تصویر یک دکمه هست یا خیر. پس در این مورد اطلاعات لبه ”مفید“ و اطلاعات رنگ ”غیر مفید“ است. به علاوه ویژگی ها باید قدرت متمایز کنندگی یا جداسازی را داشته باشند. مثلا ویژگی استخراج شده از تصویر باید قدرت تمایز بین دکمه و سایر اشیاء مدور نظیر سکه یا لاستیک ماشین را داشته باشد.

در HOG، توزیع ( هیستوگرام ) جهات شیب ها ( oriented gradients ) به عنوان ویژگی استفاده می شود. گرادیان ( مشتقات x و y ) یک تصویر مفید است زیرا اندازه یا بزرگی شیب در اطراف لبه ها و گوشه ها عدد بزرگی خواهد شد و می دانیم که لبه ها و گوشه ها اطلاعات بیشتری را نسبت به سطوح هموار تصویر در خود نگه می دارند.

چطور HOG را محاسبه کنیم؟

گام اول – پیش پردازش:

طبق مقاله ای که در آن هیستوگرام شیب های جهت دار ( HOG ) معرفی و برای تشخیص عابر پیاده استفاده شد، این توصیف گر در تکه های۱۲۸*۶۴ پیکسلی از تصویر محاسبه شده است. البته تصویر می تواند هر اندازه ای داشته باشد. معمولا تکه های عکس در مقیاس های متعدد و مکان های متفاوتی از تصویر تحلیل خواهند شد. تنها شرط ما این است که تکه های عکس پردازش شده می بایست نسبت ابعاد ثابتی داشته باشند. به عنوان مثال در مورد عابر پیاده این نسبت باید ۱:۲ باشد. یعنی این که سایز تکه ها می تواند مثلا ۲۰۰*۱۰۰ یا ۲۵۶*۱۲۸ باشد اما نمی تواند ۱۰۵*۷۰ باشند.

برای نشان دادن این نکته ذیلاً تصویری بزرگ با سایز ۴۷۵*۷۲۰ آورده ایم. تکه ای از تصویر با سایز ۲۰۰*۱۰۰ را برای محاسبه HOG انتخاب کردیم. این تکه از تصویر اصلی بریده شده و سپس تغییر اندازه داده شده تا به سایز ۱۲۸*۶۴ برسد. حالا می توان HOG‌ را روی این تکه ی پیش پردازش شده محاسبه کرد.

در مقاله ای که توسط Dalal and Triggs ارائه شد، تصحیح گاما نیز یکی از موارد پیش پردازش است. اما از آنجا که این تصحیح موجب کاهش کارایی خواهد شد، از این مورد صرف نظر کردیم.

گام دوم- محاسبه ی تصاویر شیب:

برای محاسبه ی هیستوگرام شیب های جهت دار ( HOG ) ابتدا باید گرادیان های افقی و عمودی را محاسبه کرد. این کار بوسیله ی فیلتر کردن تصویر توسط کرنل های زیر انجام خواهد شد.

استفاده از اپراتورهای سوبل که در OpenCV بصورت آماده وجود دارد نیز نتیجه ی یکسانی را خواهد داشت. فقط باید توجه داشت که سایز کرنل را ۱ انتخاب کنیم.

// C++ gradient calculation.

// Read image

Mat img = imread("bolt.png");

img.convertTo(img, CV_32F, 1/255.0);




// Calculate gradients gx, gy

Mat gx, gy;

Sobel(img, gx, CV_32F, 1, 0, 1);

Sobel(img, gy, CV_32F, 0, 1, 1);
# Python gradient calculation




# Read image

im = cv2.imread('bolt.png')

im = np.float32(im) / 255.0




# Calculate gradient

gx = cv2.Sobel(img, cv2.CV_32F, 1, 0, ksize=1)

gy = cv2.Sobel(img, cv2.CV_32F, 0, 1, ksize=1)

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

اگر از OpenCV استفاده می کنید، تابع cartToPolar محاسبات بالا را انجام خواهد داد :

// C++ Calculate gradient magnitude and direction (in degrees)

Mat mag, angle;

cartToPolar(gx, gy, mag, angle, 1);
# Python Calculate gradient magnitude and direction (in degrees)

mag, angle = cv2.cartToPolar(gx, gy, angleInDegrees=True)

نتایج را درتصاویر زیر مشاهده می کنید :

چپ: قدر مطلق اندازه شیب در جهت x. وسط: قدر مطلق اندازه شیب در جهت y. راست: اندازه گرادیان

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

همان طور که در تصویر بالا مشاهده می شود، تصویر شیب بسیاری از اطلاعات غیر ضروری (مثل زمینه ی رنگی و ثابت تصویر) را حذف می کند. اما نمای کلی تصویر را برجسته تر خواهد کرد. به عبارت دیگر با این که بسیاری از اطلاعات تصویر حذف شده است، اما با یک نگاه می توان فهمید که یک شخص در تصویر وجود دارد.

شیب هر پیکسل از تصویر دو مقدار دارد: اندازه و جهت. در تصاویر رنگی شیب هر سه کانال بررسی خواهد شد. اندازه گرادیان یک پیکسل برابر است با بزرگ ترین اندازه گرادیان در هر سه کانال و زاویه گرادیان یک پیکسل برابر است با زاویه متناظر با کانالی که بزرگترین اندازه گرادیان را دارد.

منبع LearnOpenCV

امتیاز

User Rating: ۴٫۳۸ ( ۴ votes)

درباره‌ی حسین سعیدی

همچنین ببینید

یادگیری عمیق تشخیص سلول ها 2

الگوریتم های یادگیری عمیق برای شناسایی ساختارهای موجود در سلول های زنده

محققان از با استفاده از هوش مصنوعی ویژگی های مربوط به عکس های میکروسکوپی با …

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *