Я пытаюсь выполнить KNN для классификации изображений с использованием OpenCV и OpenCL. Модуль ocl в OpenCV обеспечивает именно это с помощью класса ocl :: KnearestNeigbhour. Однако я имею дело с изображением, которое может быть довольно большим. Это приводит к прерыванию процесса, поскольку Windows требует, чтобы ядро, входящее в состав графического процессора, отвечающее за отображение экрана, не занимало более 2 секунд (см. WDDM TDR).
Чтобы избежать этой проблемы, я разделил изображение на серию меньших изображений и классифицировал их итеративно, используя цикл for. При использовании класса CvKNearest, не относящегося к gpu, он работает как шарм. К сожалению, когда я использую класс ocl :: KnearestNeighbour, результат первого изображения повторяется снова и снова для всех других изображений в серии.
Вот код, который я использую:
cv::Mat mResult(mImgLab.rows, mImgLab.cols, CV_32FC1);
cv::ocl::KNearestNeighbour knn;
knn.train(mtrainData, mlabels);
for (int i = 0; i * ROW_NUMBER < mImgLab.rows; i++)
{
int iStart = i * ROW_NUMBER;
int iStop = std::min(mImgLab.rows, iStart + ROW_NUMBER);
int iSpan = iStop - iStart;
int iRows = iSpan * mImgLab.cols;
cv::ocl::oclMat mOclSample(mImgLab.rowRange(iStart, iStop).reshape(1, iRows));
cv::ocl::oclMat mOclKnn(iRows, 1, CV_32FC1);
knn.find_nearest(mOclSample, K, mOclKnn);
cv::Mat mKnn = mOclKnn;
mKnn = mKnn.reshape(0, iSpan);
mKnn.copyTo(mResult.rowRange(iStart, iStop));
}
Итак, мой вопрос, как я могу разделить изображение, чтобы мои ядра на GPU не были слишком большими?
Задача ещё не решена.