{"id":14291,"url":"\/distributions\/14291\/click?bit=1&hash=257d5375fbb462be671b713a7a4184bd5d4f9c6ce46e0d204104db0e88eadadd","hash":"257d5375fbb462be671b713a7a4184bd5d4f9c6ce46e0d204104db0e88eadadd","title":"\u0420\u0435\u043a\u043b\u0430\u043c\u0430 \u043d\u0430 Ozon \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0442\u0430\u043c \u043d\u0435 \u043f\u0440\u043e\u0434\u0430\u0451\u0442","buttonText":"","imageUuid":""}

Неочевидное в выборе библиотеки обработки изображений для машинного обучения

В спектр задач многих аналитиков входит такие, где машинное обучение способно многократно ускорить получение результата. В этой статье расскажем, как простая смена библиотеки для работы с изображениями в разы ускорила столь затратный по вычислительным мощностям процесс: подготовка большого количества изображений для последующего обучения и работы модели нейронной сети.

Для работы с изображениями в Python наиболее часто используют библиотеку PIL (Python Image Library) и поисковые системы выдадут нам несколько решений только с использованием PIL, прежде чем предложат что-то другое.

На помощь способны прийти технологии компьютерного зрения, а именно – библиотека OpenCV. Что такое OpenCV? — библиотека компьютерного зрения и машинного обучения с открытым исходным кодом. В неё входят более 2500 алгоритмов, в которых есть как классические, так и современные алгоритмы для компьютерного зрения и машинного обучения. Реализована на C/C++, также разрабатывается для Python, Java, Ruby, Matlab, Lua и других языков. Может свободно использоваться в академических и коммерческих целях — распространяется в условиях лицензии BSD.

Условия тестирования:

  • тестовое изображение с разрешением 700 на 700 пикселей;
  • вычисления производились на процессоре Intel Core i3-2120.

Примеры кода и результаты замеров производительности

Подключаем библиотеки:

from PIL import Image import cv2 from timeit import Timer

открываем тестовое изображение обеими библиотеками:

image_file_PIL = Image.open("convert_image.jpg") image_file_OpenCV = cv2.imread("convert_image.jpg")

функции, которые будем вызывать для преобразования изображения по 5000 раз:

def convert_to_monochrome_by_PIL(image_file, repeats): for i in range (repeats): gray = image_file.convert('L') def convert_to_monochrome_by_OpenCV(image_file, repeats): for i in range (repeats): gray = cv2.cvtColor(image_file, cv2.COLOR_BGR2GRAY) def resize_to_half_by_PIL(image_file, repeats, size): for i in range(repeats): small = image_file.resize(size) def resize_to_half_by_OpenCV(image_file, repeats, size): for i in range(repeats): small = cv2.resize(image_file,size)

совершаем по 5000 итераций преобразования нашего тестового изображения к монохромному замеряя время выполнения. Этот тест проводим 100 раз и берем средний результат:

t = Timer(lambda: convert_to_monochrome_by_PIL(image_file_PIL, 5000)) print (t.timeit(number=100)/100) t = Timer(lambda: convert_to_monochrome_by_OpenCV(image_file_OpenCV, 5000)) print (t.timeit(number=100)/100)

Разница больше трех раз.

совершаем по 5000 итераций изменения разрешения нашего тестового изображения на 100 на 100 пикселей замеряя время выполнения. Этот тест также проводим 100 раз и берем средний результат:

t = Timer(lambda: resize_to_half_by_PIL(image_file_PIL, 5000, (100, 100))) print (t.timeit(number=100)/100) t = Timer(lambda: resize_to_half_by_OpenCV(image_file_OpenCV, 5000, (100, 100))) print (t.timeit(number=100)/100)

Разница более 59 раз!

Рассмотренные библиотеки отличаются не только скоростью обработки изображений, но и алгоритмами, которыми они это делают. Результаты работы алгоритмов тоже отличаются. Предлагаем читателю провести собственное исследование используя образцы кода из статьи.

0
Комментарии
-3 комментариев
Раскрывать всегда