setCustomKernel (cv.SVM) - MATLAB File Help |
Initialize with custom kernel
model.setCustomKernel(kernelFunc)
Parts of cv::ml::SVM
implementation are thread-parallelized
(for example SVM::predict
runs a ParallelLoopBody
). By using
a custom kernel, we would be calling a MATLAB function
from C++ code using the MEX-API (mexCallMATLAB
), which is not
thread-safe. This can cause MATLAB to crash. It is therefore
necessary to tempoararily disable threading in OpenCV when using
a custom SVM kernel (see cv.Utils.setNumThreads and
cv.Utils.getNumThreads).
The following MATLAB function implements a simple linear kernel. The function must be saved in a separate M-file, and placed on the MATLAB path. It receives an Nxd matrix of samples (each row is a sample vector), and another sample 1xd (row vector), and should return a vector Nx1 of inner products between every sample in "vecs" against "another". It will be called during training and prediction by the SVM class.
function results = my_custom_kernel(vecs, another)
[vcount,n] = size(vecs);
results = zeros(vcount, 1, 'single');
for i=1:vcount
results(i) = dot(vecs(i,:), another);
end
% or computed in a vectorized manner as
%results = sum(bsxfun(@times, vecs, another), 2);
% or simply written as matrix-vector product
%results = vecs * another.';
end
We use the custom kernel in the following manner:
% load some data for classification
load fisheriris
samples = meas;
responses = int32(grp2idx(species));
cv.Utils.setNumThreads(1) % see above note
model = cv.SVM();
model.setCustomKernel('my_custom_kernel');
model.train(samples, responses)
nnz(model.predict(samples) == responses)
cv.Utils.setNumThreads(cv.Utils.getNumberOfCPUs())
Access | public |
Sealed | false |
Static | false |