Автоматизация контроля качества

Одной из вещей, которыми я занимаюсь в Spatial Networks, Inc. (SNI), является автоматизация некоторых из наших мер по контролю качества и добавление ценности в наш репозиторий фотографий и видео, определяя, какие объекты появляются в каждом и, в случае видео , когда они появляются. Это даст нам больше информации о наших медиа и позволит нам выполнять такие запросы, как Покажи мне все фотографии со светофором, и возвращать результат с учетом местоположения. В этом сообщении в блоге обсуждается текущая работа по автоматизации контроля качества, а в следующем — распознавание объектов.

Для выполнения этих задач я выбрал OpenCV. Я использовал его в течение многих лет, и это зрелый, хорошо известный продукт с открытым исходным кодом (BSD) в сообществах, занимающихся компьютерным зрением и машинным обучением. Кроме того, у него есть порты для мобильных устройств, так что мы потенциально можем перенести часть нашего контроля качества на сами устройства, чтобы уведомить наши Skribes (наша сеть сборщиков геопространственных данных) во время сбора, что им может потребоваться переснять изображение.

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

  1. Определите, является ли фотография слишком яркой или темной.
  2. Определите, является ли фотография слишком размытой.
  3. Определите, закрыта ли большая часть фотографии каким-либо объектом, например большим пальцем над объективом.

Две из этих задач, обнаружение яркого/темного и окклюзия, легко выполняются OpenCV. В OpenCV есть функция cv::mean(), которая возвращает средний уровень яркости изображения. Эта функция вычисляет среднее статистическое значение каждого канала изображения. Выберите верхнее и нижнее значения от нуля до 255, и все готово.

Обнаружение окклюзии может быть выполнено:

  1. Выделение красного канала фотографии, поскольку там больше деталей, с помощью cv::split().
  2. Удаление шума из красного канала с помощью cv::bilateralFilter().
  3. Пороговое значение изображения с помощью cv::threshold(), чтобы нам было легче обнаруживать кляксы на изображении.
  4. Обнаружение контуров на изображении с помощью cv::findContours().
  5. Пройдитесь по контурам и определите, какой процент изображения содержит контур с наименьшей детализацией.

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

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

Однако рассмотрите следующее изображение.

И человек, и компьютер воспринимают это изображение как размытое. Но человек, который все еще может разобрать текст на вывеске, может считать его действительным изображением, тогда как компьютер его выбросит. Это особый случай, поскольку SNI считает полезной информацию из носителей, где большинство проблем с компьютерным зрением можно легко обнаружить.

Обычный метод обнаружения размытия включает подсчет статистической дисперсии краев изображения. Говоря простым языком, размытое изображение будет иметь сглаженные острые края, поэтому разница между краями и областями вокруг них будет не такой большой. С технической точки зрения, большинство детекторов размытия свертывают изображение с ядром Лапласа (умножают части значений пикселей изображения на матрицу), а затем вычисляют дисперсию (квадрат стандартного отклонения) вывода. В OpenCV это можно сделать, сначала запустив функцию cv::Laplacian() для изображения, а затем возведя в квадрат результат функции cv::meanStdDev().

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

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

  1. Форма из фокуса
  2. Автофокусировка диатомовых водорослей в светлопольной микроскопии: сравнительное исследование
  3. Диапазон от фокуса
  4. Оценка функций автофокуса в молекулярно-цитогенетическом анализе

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

Мой следующий пост расскажет, как я использую OpenCV и глубокое обучение для идентификации объектов на фотографиях и видео. Быть в курсе!