Переключение устройств OpenCL не работает в EmguCVC#

Место общения программистов C#
Ответить
Anonymous
 Переключение устройств OpenCL не работает в EmguCV

Сообщение Anonymous »

В настоящее время я работаю над проектом, который обнаруживает объекты на изображении с помощью winforms C#. Для этого я использую OpenCV с оболочкой EmguCV C# версии 4.9.5494 от Nuget. Я хочу иметь возможность переключать, какое устройство OpenCL использует OpenCV для обнаружения объектов, но это работает не так, как ожидалось.
Ниже приведена упрощенная версия моего кода:

Код: Выделить всё

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: Nvidia RTX A1000 Ada Generation и iGPU Intel Arc Graphics. Оба могут выполнить обнаружение, если я настрою свое приложение на использование любого графического процессора по умолчанию в настройках графики Windows и ничего не изменю на устройство OpenCL по умолчанию в своем приложении. Однако, когда я пытаюсь установить устройство OpenCL по умолчанию для моего приложения на нечто иное, чем значение по умолчанию для Windows (например, установка iGPU в приложении, но Windows пытается использовать dGPU), это приводит к исключению !kernelQueue.empty() OpenCV в сети. метод вперед(). Если я сначала использую графический процессор Windows по умолчанию для обнаружения, а затем пытаюсь переключиться на другой графический процессор, во время вызова выдается ошибка CL_INVALID_DEVICE (-33): clGetKernelWorkGroupInfo(CL_KERNEL_WORK_GROUP_SIZE).
Чтобы попытаться устранить эту проблему, я попытался использовать OpenCL для более простой задачи — изменения размера изображения. Кажется, это работает без проблем на обоих устройствах, в том числе после переключения их в приложении. Также печать текущего устройства OpenCL по умолчанию показывает, что установлено правильное устройство. Единственное, что не работает, это обнаружение объектов. Я также пытался использовать другой способ установки устройства по умолчанию, но безуспешно.
У меня не так уж много опыта в использовании OpenCL и OpenCV, и, похоже, документации по ! исключение kernelQueue.empty(), поэтому я немного растерялся.
Надеюсь, кто-нибудь подскажет, что делать дальше. Заранее спасибо!

Подробнее здесь: https://stackoverflow.com/questions/791 ... -in-emgucv
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»