![]() |
Sift و svm
با سلام.
1- من با استفاده از الگوریتم SIFT که در سایت Keypoint detector وجود دارد، نقاط کلیدی و ویژگی های تصویرم رو بدست آوردم. حالا می خواستم این نقاط رو با svm دسته بندی کنم ولی دقیقا نمیدونم ویژگیهایی که تابع SIFT برمیگرداند چه چیزهایی هستند که با استفاده از آنها این نقاط رو دسته بندی کنم. اگر امکان داره یکی کمک کند..... 2- نحوه دسته بندی کردن این نقاط بدست آمده از خروجی SIFT با svm هم اگر توضیحاتی بدهید ممنون میشم. با تشکر از کمک های شما... |
یکم بیشتر توضیح بدین دقییق کارتون چیه
از یه تصویر ویژگی استخراج کردین!!؟ اگه مسالتون دسته بندی هست باید چند دسته تصویر داشته باشین مثلا یه دسته تصاویر ادم یه دسته ماشین یه دسته جنگل مثلا برای مساله بازیابی تصویر گفتم بعد شما میاین نقاطو استخراج می کنین تو تصاویر و بعدش بردار ویژگی برای هرنقطه که تو روش SIFT 128 تا هست. یعنی میشه تو فضای 128 بعدی. بعد با داشتن این بردارهای 128 تایی برای هر نقطه برای هر تصویر و داشتن برچسبشون(آدم برچسب صفر ماشین 1 و ...) میتونین از svm استفاده کنین |
با سلام.
من کارم دقیقا تشخیص عیوب سطوح چوب هست. ویژگی های تصویر رو با SIFT بدست آوردم و با SVM می خوام کار دسته بندی رو انجام بدم. مثلا یک تصویر سطح چوب را که به تابع sift داده ام 443 نقطه کلیدی پیدا کرده است و دو متغیر با نام های descrips و loc نیز داده است. متغیر descrips ماتریسی 128*443 خانه ای است که ویژگی های تصویر را دارد. من این ماتریس را متوجه نمی شوم..... همچنین نمی دانم کدام یک از این خروجی های تابع sift رو باید به svm بدهم.... اگر دارم اشتباه می کنم لطفا راهنمایی کنید....ممنون با تشکر. |
نقل قول:
به نام خدا در مورد sift بیشتر مطالعه کنید. چنانکه احتمالا می دانید sift به ازای هر نقطه کلیدی یک بردار ویژگی 128 عنصری بعنوان خروجی میدهد بنابراین برای معرفی هر عنصر مهم یا بعبارتی همان نقاط با اهمیت یک (مثلا) آرایه 128 عضوی داریم. حالا اگر شما 443 نقطه کلیدی رو استخراج کرده باشید (که توصیه می کنم با pca اون رو کاهش بدید و مثلا 100 نقطه خیلی مهم رو انتخاب کنید) قاعدتا باید یک آرایه دو بعدی 128*443 داشته باشید که باید تحویل svm بدید. موفق باشید |
با سلام.
راجع به svm من مثالهایی که دیدم مختصات نقاط، گروه هرکدام از این نقاط و اینکه نوع kernel برای svm مشخص میشد ولی این آرایه دو بعدی که از SIFT بدست آمده است مختصات نقاط رو نداره... |
نقل قول:
خب در حقیقت تفاوت های پردازش تصویر و بینایی کامپیوتر در چنین مواردی مشخص می شود. شما نیاز ندارید به اینکه موقعیت نقاط را داشته باشید این روش مبتنی بر یادگیری است. در واقع شما دارید نمونه هایی را به SVM می دهید که می گوید سطح مورد نظر دارای عیب است. وقتی می خواهید با SVM کار کنید باید نمونه ها را تفکیک کنید مثلا نمونه معیوب و نمونه سالم. خب پس دو ماتریس خواهید داشت ماتریس اول مربوط به نمونه های سالم و ماتریس دوم مربوط به نمونه های معیوب. که این ماتریس ها توسط یک توصیف کننده مثل SIFT تولید شده اند. مثال: كد:
|
با سلام.
ببخشید چندتا سوال برام پیش اومده. 1- یعنی تمام تصاویر سالم را به sift بدهم و خروجی هایی که بدست آمده است را به صورت یکجا در ماتریس A قرار بدهم. و همین کار را برای تمام تصاویر معیوب انجام دهم؟ 2- در کدی که svmtrain را نوشته اید از training_label_vector و training_instance_matrix استفاده کرده اید، این متغیرها چه چیزی را نشان می دهند و محتوای آنها چیست؟؟ 3- این کد به libsvm نیاز دارد. درسته؟ با تشکر. |
نقل قول:
2- داده های آموزشی و برچسب داده های آموزشی 3- بله |
پروژه
با نام خدا و با سلام دوست من
یک کد آموزشی از svm در لینک زیر که برایتان می گذارم موجود است امیدوارم راه حلی بر مشکل شما باشد . لینک : سایت دانشجویار موفق و سربلند باشید .. |
همون طوری که اشاره شد شما اینجا به مختصات نقاط نیازی ندارین
چون مختصات نقاط به عنوان ویژگی برای شما محسوب نمیشن. مثلا تو یه مساله با مختصات نقاط میشه دو کلاسو از هم جدا کرد. اونجا مختصات نقاط برامون مهمه و عامل تفکیک. ولی اینجا مختصات نقاط هیچ ربطی و هیچ کمکی در پیدا کردن و کلاسه بندی سطوح معیوب و سالم نمیکنه. اینجا برای ما استخراج ویژگیهایی پایدار و مستقل در تصاویر هست که برای هرنقطه همین بردار 128تایی همین کارو میکنه. این بردار با درنطر گرفتن یک پنجره مربعی -که به 4*4 زیر مربع تقسیم شده- اطراف اون نقطه استخراجی و محاسبه جهت و گرادیان در هر زیرمربع (360 درجه به هشت بازه تقسیم شده پس میشه 4*4*8=128) و ساخت یک بافت نگار 128تایی به دست اومده ، پس باید این نقاطو مثلا 100*128 از تصویر سالم اول استخراج شده و 128*50 از تصویر سالم بعدی و همین طور تا آخر. اینا مربوط به کلاس سطوح سالم هستن. هر نقطه در فضای 128 بعدی درنظرگرفته شده. پس تمام این نقاط 100 برای تصویر سالم اول، 50 برای تصویر سالم دوم و ... با برچسب سالم باید به svm داده بشه و برای تصاویر معیوب هم به همین صورت تمام نقاط با برچسب معیوب به svm داده میشه. مساله شما یه کلاسه بندی به دو کلاس سالم و معیوب در فضای 128 بعدی، با داشتن نقاط 128 بعدی با برچسب سالم و معیوب هست. فقط نکته ای رو بگم که با pca میشه طول بردارو کاهش داد یعنی به جای اینکه هر نقطه با 128 عدد توصیف شود با طول کمتری مثلا 64 توصیف شود. این یک نکته اسم روششم pca sift هست و برای اینکه تعداد نقاطتون کمتر بشه و نقاط برجسته تر و مهم تر از تصویر انتخاب بشن نه 1000 تا نقطه باید مقدار آستانه مربوط به الگوریتم sift رو تغییر بدین. الگوریتم sift پارامترهایی داره که با تنظیم اون میتونین نقاط استخراجی برجسته تر رو انتخاب کنین. بنابراین تعداد این نقاط کمتر میشه. |
فقط سوالی که من دارم اینه که
شاید نقاطی از یک تصویر سالم استخراج بشه که بردار ویژگی اونها (همون بردار 128 تایی) خیلی شبیه به بعضی نقاط در یک تصویر معیوب باشه. اینجا الگوریتم به مشکل نمیخوره؟! چون تصاویر چوب سالم و معیوب دارای نواحی مشترکی با یکدیگر هستند یعنی بعضی نواحی تصاویر سالم و معیوب مثل هم هس و بنابراین نقاط استخراجی و بردارهای ویژگیشون با هم یکی میشه!!! به نظرم بعد محاسبه نقاط و بردارهای ویژگی باید کارهای دیگه ای هم انجام بشه مثلا برای تک تک نقاط در تصویر سالم فاصله اقلیدسی اونها(بردار 128تایی) با تک تک نقاط در تصویر معیوب محاسبه بشه و اگه فاصله کم بود یعنی این نقاط دارای ویژگگیهای مشابه هستن که باید حذف بشن. پس این نقاطو حذف میکنیم و با این نقاط عمل کلاسه بندیو انجام نمیدیم |
نقل قول:
|
با سلام و تشکر.
امکانش هست سایتی معرفی کنید که تابع pca-sift رو با matlab پیاده سازی کرده باشه.... من از سایت PCA-SIFT دانلود کردم ولی به زبان matlab نیست. با تشکر. |
منم همون سی پلاس پلاسشو دارم
اگه برین سمت opencv خیلی بهتره چون بیشتر کدها تو این زمینه سی پلاس پلاس هس نخیر آقای رها الگوریتمهایی مانند pca برای کاهش تعداد ویژگی به کار میروند نه کاهش تعداد نقاط!!! |
کاهش نقاط کلیدی
نقل قول:
در بخشی از تابعی که من از sift دارم نقاط کلیدی را با استفاده از دستور زیر بدست می آورد. و سپس تعداد نقاط دو در متغیر num میریزد. كد:
command = [command ' <tmp.pgm >tmp.key']; آیا کاهش resolution پیشنهاد خوبیست؟ من این کار رو برای تصویری که نقاط کلیدی اش 1649 بود انجام دادم نقاط کلیدی اش 1104 شد..... و با تغییر سایز تصویر نقاط 604 شد...... با تشکر. |
سلام مجدد
گویا شما مطالب منو نخوندید من گفتم تابعی که نقاط ویژگی رو پیدا میکنه احتمالا با نام featuredetection خطوط پایینو ببینید این برای الگوریتم surf هست که روشی مشابه با sift هست اون مقدار آستانه ای که گفتم اینجا 1100 انتخاب شده با تغییر اون می تونین تعداد نقاط کم یا زیاد کنین cv::SurfFeatureDetector detector( 1100 ); std::vector<cv::KeyPoint> keypoints1; std::vector<cv::KeyPoint> keypoints2; detector.detect(rgb1,keypoints1); detector.detect(rgb2,keypoints2); روشی که شما گفتین روش مناسبی نیس که با کم کردن رزولوشن تعداد نقاط رو کم کنین چون این طوری دارین اطلاعات تصویرو دور میریزین. بهتره این کارو بسپارین به خود الگوریتم sift و با تنظیم پارامترهاش این کارو بکنین. البته اگه تصویرتون دارای رزولوشن خیلی بالایی هست میتونین تصویرو کوچک کنین مثلا رزولوشن 2000*3000 خیلی زیاده و باعث کندی برنامتونم میشه رزولوشن مناسب حدود 640*480 یا 800*600 هست البته بسته به کاربردتون شاید دقت بالا و نیاز به تفکیک پذیری بالا داشته باشین اون موقع رزولوشن بالا نیاز هس |
با سلام.
درسته متوجه شدم. من تو برنامه matlab دنبالش میگشتم پیدا نکردم. تو کدی که به c++ داشتم پیدا کردم.. متغیری هم به نام FVSIZE با مقدار 128 تعریف شده که فک میکنم مربوط به بردار ویژگی است. با تشکر. |
برنامه متلبشم این پارامترها رو داره!!!
|
با سلام.
راستش من یک کد sift دیگه هم به زبان matlab دارم از سایت Index of /~vedaldi/assets/sift/binaries دانلود کردم ولی وقتی اجراش می کنم این error رو میده: كد:
??? Undefined function or method 'imsmooth' for input arguments of type 'double'. |
نقل قول:
ببخشید مگر تابع svmpredict روی تصاویر تست اعمال نمی شود... در تصاویر تست هم که ما می خواهیم تابع خودش تشخیص دهد تصویر معیوب است یا خیر پس LABEL را که ما نمی توانیم بدهیم... مگر خود این تابع نباید LABEL را برای ما مشخص کند؟؟؟؟؟ :confused::confused::confused: :2::2::2: |
نقل قول:
خطا مشخصه چی میگه میگه تابع imsmooth با پارامتر دابل رو پیدا نمیکنه. این تابع جزو توابع خود متلب هست و احتمالا تصویری که شما بهش میدین دابل هست اونو تبدیل به uint8 بکنید و بعدش بدین به تابع با دستور uint8(I) |
با سلام.
واقعا از کمکها و راهنمایی هایی که انجام دادید متشکرم. بالاخره تونستم کارم رو تموم کنم. با تشکر فراوان...... |
surf
سلام
میشه لطفاً بگین تفاوت surf و sift چیه؟ خیلی نیاز فوری دارم ولی مطلب فارسی اصلاً پیدا نکردم. |
تفاوتشون در روشهایی هست که نقاط ویژه رو استخراج میکنن و توصیفشون میکنن.
|
زمان محلي شما با تنظيم GMT +3.5 هم اکنون ۰۹:۲۳ بعد از ظهر ميباشد. |
Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.1.0 ©2007, Crawlability, Inc.