Сбой Python при использовании большого изображения в качестве UMat - PullRequest
0 голосов
/ 23 апреля 2019

Я художник, использующий opencv-python для обработки изображений.Часть моего процесса включает в себя неоднократное применение фильтра свертки к изображению с моими собственными ядрами.Из всех методов, которые я пробовал, разделение изображения на каналы r, g, b, преобразование их в UMat и последующее использование filter2D для каждого из них работает быстрее всего.Проблема, с которой я сталкиваюсь, заключается в том, что когда я использую изображения размером больше ~ 22000x22000, происходит сбой Python (прерывание прерывания: 6).Этого не происходит, когда я не использую UMat.Ранее я делал тот же процесс, разделяя изображение и используя многопроцессорную обработку для параллельной обработки каналов на процессоре.Это в 2-3 раза медленнее, чем в UMat.

Я использую Macbook Pro со встроенной видеокартой Iris Pro (1536 МБ).Я предположил, что python зависал из-за проблем с памятью видеокарты, но то же самое произошло, когда друг попробовал это на GTX 1080.

im = cv2.imread('src.png') # >24000x24000

kernel = np.array([[-1, 24, -64], [-8, -2, -64], [-8, 128, -4]])
b, g, r = cv2.split(im)

_b = cv2.UMat(b)
for x in range(50):
  _b = cv2.filter2D(src = _b, kernel = kernel)
b = cv2.UMat.get(_b)

# repeat the above for the other two channels and then merge

out = cv2.merge((b, g, r))

Примечание: если я делаю то же самое без разделения каналов, происходит сбой pythonв еще меньших размерах (примерно 14000 пикселей).Кроме того, я использую PyQt5 для графического интерфейса пользователя

В идеале я хотел бы сохранить скорость, которую я получаю с UMat, при обработке изображений размером более 40000x40000

...