AFAICT, SVM के लिए कस्टम कर्नेल सीधे OpenCV में समर्थित नहीं हैं। यह LIBSVM जैसा दिखता है, जो अंतर्निहित लाइब्रेरी है जो ओपनसीवी इसके लिए उपयोग करता है, कस्टम कर्नेल को परिभाषित करने का विशेष रूप से आसान माध्यम प्रदान नहीं करता है। इसलिए, LIBSVM का उपयोग करने वाले कई रैपर इसे या तो प्रदान नहीं करते हैं। कुछ ऐसा प्रतीत होता है, उदा। पाइथन के लिए scikit: scikit example of SVM with custom kernel
आप SVMlight जैसे पूरी तरह से अलग पुस्तकालय को भी देख सकते हैं। यह सीधे कस्टम कर्नेल का समर्थन करता है। this SO question पर भी एक नज़र डालें। संक्षेप में समीक्षा के साथ उत्तर में एसवीएम पुस्तकालयों का मुट्ठी भर शामिल है।
यदि आपके पास ओपनसीवी के भीतर रहने के लिए अनिवार्य कारण हैं, तो आप इसे कर्नेल प्रकार CvSVM::LINEAR
का उपयोग करके और एसवीएम को प्रशिक्षण देने से पहले डेटा में अपने कस्टम कर्नेल को लागू करके इसे पूरा करने में सक्षम हो सकते हैं। मैं इस बात पर थोड़ा अस्पष्ट हूं कि क्या यह दिशा उपयोगी होगी, इसलिए मुझे आशा है कि एसवीएम के साथ अधिक अनुभव वाला कोई व्यक्ति इसमें शामिल हो और टिप्पणी कर सके। यदि यह आपके कर्नेल के रूप में "रैखिक" चुनकर "प्रीकंप्यूटेड कर्नेल" का उपयोग करने के लिए संभव है, तो आगे बढ़ने के तरीके के बारे में अधिक विचारों के लिए this answer पर एक नज़र डालें।
आप OpenCV का उपयोग किए बिना LIBSVM सहित इसे सीधे कॉल कर सकते हैं और इसे सीधे कॉल कर सकते हैं। FAQ #418 for LIBSVM देखें, जो कस्टम कर्नेल को कैसे संक्षिप्त करता है:
प्रश्न: मैं अपने स्वयं के कर्नेल का उपयोग करना चाहता हूं। कोई उदाहरण? Svm.cpp में, कर्नेल मूल्यांकन के लिए दो subroutines हैं: k_function() और kernel_function()। मुझे किसको संशोधित करना चाहिए?
LIBSVM उपकरण में "स्ट्रिंग डेटा के लिए LIBSVM" उदाहरण है।
हमारे पास दो कार्य होने का कारण निम्नानुसार है। आरबीएफ कर्नेल एक्सप (-g | xi - xj |^2) के लिए, यदि हम पहले xi - xj की गणना करते हैं और फिर मानक वर्ग, 3 एन ऑपरेशन होते हैं। इस प्रकार हम exp (-g (| xi |^2 - 2dot (xi, xj) + | xj |^2)) पर विचार करते हैं और शुरुआत में सभी | xi |^2 की गणना करके, संचालन की संख्या 2 एन तक कम हो जाती है। यह प्रशिक्षण के लिए है। भविष्यवाणी के लिए हम ऐसा नहीं कर सकते हैं, इसलिए 3 एन ऑपरेशंस का उपयोग करके एक नियमित सबराउटिन की आवश्यकता होती है। अपने कर्नेल को रखने का सबसे आसान तरीका किसी भी कर्नेल को बदलकर इन दो सबराउटिन में एक ही कोड डालना है।
वह अंतिम विकल्प दर्द का थोड़ा सा लगता है, हालांकि। मैं scikit या SVMlight की सिफारिश करेंगे। तुम्हारे लिऐ शुभकामना!
धन्यवाद पूर्ण उत्तर के लिए बहुत कुछ! वैसे, मुझे लगता है कि मैं सीधे LibSVM का उपयोग करूंगा ... लगता है कि ओपनसीवी के साथ प्रीकंपिल्ड कर्नेल का उपयोग करने का कोई तरीका नहीं है :( –