Как data science экономит сотни часов рабочего времени

Кейс оценки качества изображений с помощью модуля на Python

Как data science экономит сотни часов рабочего времени

Заказчик

Агрегатор видеороликов, зарабатывает на показах рекламы

Проблема

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

Задача

Найти и удалить все изображения в плохом качестве

Решение

Применить методы data science: разработать модуль на Python, который отсортирует изображения по качеству

Результат

- Провели исследование и предложили принцип оценки качества изображений. Согласовали с заказчиком критерии: какие превью считать качественными, какие — нет.

- Написали модуль на Python, который сортирует изображения по степени размытости.

- Модуль проанализировал 50 миллионов изображений: нашел 4,7 миллиона в плохом качестве и 4,5 миллиона в очень хорошем. Остальные — нормального качества.

- Потратили неделю — от ТЗ до результата.

- Заказчик смог удалить с сайта все превью низкого качества и повысить количество просмотров.

Заказчик: агрегатор видеороликов

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

На платформе размещено более 13 миллионов видео. От владельцев контента компания получает изображения для превью, у каждого ролика их от 1 до 10 штук — всего более 50 миллионов изображений.

Компания не снимает собственные видео, а собирает ролики с других сайтов
Компания не снимает собственные видео, а собирает ролики с других сайтов

Проблема: часть превью-изображений для видео в плохом качестве

Некоторые превью были плохого качества: никакой проверки перед загрузкой платформа не производила. Пользователи не кликали на видео с размытым превью, не смотрели рекламу, а компания теряла прибыль.

Заказчик решил удалить все некачественные изображения, но делать это вручную в таком количестве трудозатратно. Если просматривать каждое изображение хотя бы секунду, потребовалось бы около 14 тысяч часов. Заказчик обратился в OrbitSoft, чтобы автоматизировать процесс.

Решение: написали модуль на Python, который оценивает качество изображений

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

Например, в статье Analysis of focus measure operators in shape рассмотрено почти 36 методов вычисления показателя размытости. Мы отметили для себя варианты, которые проще в реализации.

Хорошее решение описано в работе Diatom autofocusing in brightfield microscopy: A comparative study. В этом варианте берется один канал изображения и вычисляется абсолютное значение оператора Лапласа. Взяв за основу этот метод, мы написали модуль на Python, который определяет степень размытия изображения.

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

Каждая картинка состоит из пикселей. Если изображение размытое, на границе объектов получается плавный градиент — цвет соседних пикселей меняется постепенно. Если изображение четкое, то и границы между объектами четкие, а значение цветности соседних пикселей на границе объектов изменяется резко.

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

Чтобы определить размытость картинки, модуль на Python рассчитывает величину градиента цвета с помощью оператора Лапласа:

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

Как data science экономит сотни часов рабочего времени

2. рассчитывает дисперсию результата — стандартное отклонение в квадрате;

3. получается коэффициент, по которому можно судить о степени размытия: чем четче изображение, тем больше коэффициент.

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

Как модуль переводит изображения в монохром

<p>Чтобы оценить размытость цветной картинки, нужно определить градацию каждого из цветов. В монохромных изображениях — только серого</p>

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

Чтобы переводить цветные изображения в черно-белые, нужно было подключить библиотеку, которая умеет работать с цветом. Мы протестировали несколько Python-библиотек и остановились на OpenCV.

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

Как модуль оценивает качество изображения

Результат работы алгоритма — коэффициент, который принимает значения от 0 до 2000. Чем его значение выше, тем изображение качественнее.

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

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

Результат: модуль нашел 4,7 миллиона изображений в плохом качестве и 4,5 миллиона в отличном

Модуль (1) переводит загруженные на платформу превью в монохром; (2) рассчитывает коэффициент размытия; (3) распределяет изображения по двум группам: если коэффициент ниже порогового значения, изображение размытое, если выше — четкое
Модуль (1) переводит загруженные на платформу превью в монохром; (2) рассчитывает коэффициент размытия; (3) распределяет изображения по двум группам: если коэффициент ниже порогового значения, изображение размытое, если выше — четкое

Методы data science позволили нам автоматизировать оценку качества изображений. Вручную на это понадобилось бы более 14 тысяч рабочих часов. У нас ушло меньше 40: от постановки задачи до результата.

Модуль на Python проанализировал 50 миллионов изображений и распределил их по двум группам:

1. 4,7 миллиона изображений размытые: коэффициент от 0 до 100;

2. остальные — достаточно четкие, из них 4,5 миллиона очень хорошего качества: коэффициент больше 1000.

Со временем заказчик убрал с сайта все изображения в плохом качестве. Количество просмотров на платформе возросло.

Начать дискуссию