Но почему вы хотите классифицировать это «вручную»? OpenCV has a classification routine называется predict
, который использует нашел КУ и альфы
float response = SVM.predict(sampleMat);
Если вы действительно хотите сделать это самостоятельно, вы бы не только нужно SVs и альфа, но и функция ядра используется для обучения и вычислый
SUM alpha_i K(support_vector_i , data_point) - rho
Я не уверен, можно ли извлечь альфу «от руки», без расширения класса SVM, как можно видеть в sources - альфы хранятся в CvSVMDecisionFunc
структуры:
struct CvSVMDecisionFunc
{
double rho;
int sv_count;
double* alpha;
int* sv_index;
};
пока единственная ссылка на эту структуру в разделе protected
:
protected:
(...)
CvSVMDecisionFunc* decision_func;
Из исходного кода svm.cpp
мы можем найти, что это только публично через подъезд save
рутина. Таким образом, некоторые «взломать» будут состоять в том, чтобы сохранить модель и извлечь из нее альфы (она будет находиться в разделе «Функция принятия решений», написанном в человекообразном формате).
Самый простой метод extracion кажется, насколько CvSVM
класса и включают в себя метод, как
public:
CvSVMDecisionFunc* get_decision_function() { return decision_func; }
обновление
после разъяснений, что OP действительно пытается использовать externaly обученную модель в OpenCV - самый простой способ для преобразования модели libsvm, созданной другим способом (libsvm, linearsvm и т. д.) в формат, совместимый с opencv, и загрузить его с использованием метода read
void CvSVM::read(CvFileStorage* fs, CvFileNode* svm_node)
see source for more details.
Как я понял, вы можете использовать .predict(), но вы должны предоставить ему уже вычисленную HOG для изображения такого же размера, как вы обучили CvSVM, и это неудобно. Если вы хотите использовать процедуру, которая сканирует данное изображение, и возвращает массив точек, где он нашел ответ, вы должны использовать .detectMultiScale(). – degot
Я не совсем понимаю ваш комментарий. SVM всегда будет ** требовать того же размера ввода, что и в ходе обучения. Неважно, извлекаете ли вы альфа или используете метод прогнозирования, он будет работать одинаково. – lejlot
Ну, во-первых, я решил не использовать openCV для обучения, потому что я нашел много информации, где люди говорят, что лучше использовать svmlight или libsvm, поэтому я не могу использовать CvSVMDecisionFunc. Во-вторых, я говорю о том, что detectMultiScale() принимает изображение ЛЮБОГО размера и выполняет всю работу за вас, вычисляя HOG в каждой точке изображения и возвращая соответствующие точки. Я прав? – degot