Ниже приведена упрощенная версия моего кода:
Код: Выделить всё
private void OpenCLTest()
{
CvInvoke.UseOpenCL = true;
List openCLDevices = new();
VectorOfOclPlatformInfo platformInfoVector = OclInvoke.GetPlatformsInfo(); //Gets all available platforms.
for (int i = 0; i < platformInfoVector.Size; i++)
{
for (int j = 0; j < platformInfoVector[i].DeviceNumber; j++) // Gets all the devices in a platform
{
Device openCLDevice = platformInfoVector[i].GetDevice(j);
openCLDevices.Add(openCLDevice); // Adds a device to the device list.
}
}
foreach (Device openCLDevice in openCLDevices)
{
CvInvoke.OclSetDefaultDevice(openCLDevice.Name); // Try to use each device in the device list and set it as the default device
//Device.Default.Set(openCLDevice.NativeDevicePointer); Tried this as well, but with the same result.
tryResize();
Debug.WriteLine($"Resized image with {Device.Default.Name}");
TryDetect();
Debug.WriteLine($"Detected image with {Device.Default.Name}");
}
}
private void tryResize()
{
UMat uMat = new(@"Path\to\random\image.png", Emgu.CV.CvEnum.ImreadModes.Color); // UMat is supposed to use OpenCL where possible
CvInvoke.Resize(uMat, uMat, new Size(1280, 704));
uMat.Dispose();
}
private void TryDetect()
{
Net net = DnnInvoke.ReadNetFromDarknet(@"Path\to\darknet\model.cfg", @"Path\to\darknet\model.weights");
net.SetPreferableBackend(Emgu.CV.Dnn.Backend.OpenCV);
net.SetPreferableTarget(Target.OpenCL); // Sets net target to use OpenCL.
Mat mat = new(@"Path\to\random\image.png", Emgu.CV.CvEnum.ImreadModes.Color);
CvInvoke.Resize(mat, mat, new(1280, 704));
Mat blob = DnnInvoke.BlobFromImage(mat, 1/255F, swapRB: true);
net.SetInput(blob);
net.Forward(); // This is where the error occurs.
blob.Dispose();
mat.Dispose();
net.Dispose();
}
Чтобы попытаться устранить эту проблему, я попытался использовать OpenCL для более простой задачи — изменения размера изображения. Кажется, это работает без проблем на обоих устройствах, в том числе после переключения их в приложении. Также печать текущего устройства OpenCL по умолчанию показывает, что установлено правильное устройство. Единственное, что не работает, это обнаружение объектов. Я также пытался использовать другой способ установки устройства по умолчанию, но безуспешно.
У меня не так уж много опыта в использовании OpenCL и OpenCV, и, похоже, документации по ! исключение kernelQueue.empty(), поэтому я немного растерялся.
Надеюсь, кто-нибудь подскажет, что делать дальше. Заранее спасибо!
Подробнее здесь: https://stackoverflow.com/questions/791 ... -in-emgucv
Мобильная версия