Все алгоритмы машинного обучения основаны на выполнении математических операций, которые, естественно, могут работать только с числами. Часто мы хотим, чтобы алгоритмы учились чему-то на основе изображений или текстов, которые, по нашему мнению, не являются числовыми по своей сути. В этой записной книжке мы рассмотрим технику Хаара, основанную на функциях, для создания числовых функций из логотипа Scandinavian Telecoms (Telia). Затем мы обучаем алгоритм для обнаружения логотипов Telia на любом изображении или видео. Этот метод был де-факто методом обнаружения изображений примерно с 2001–2011 гг. И до сих пор широко используется такими компаниями, как Facebook. В последнее время он используется в тандеме со сверточными нейронными сетями для создания нового поколения обнаружения изображений.

От пикселей к числам - создание элементов, похожих на Хаара

Чтобы начать создавать элементы логотипа Telia, похожие на волосы, сначала нужно взять изображение, на котором есть логотип Telia, а затем обрезать его вокруг. Возьмем, к примеру, изображение ниже, сделанное с фотографии магазина Telia.

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

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

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

Машинное обучение - что значит быть логотипом Telia

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

К счастью, мы можем создать сотни изображений логотипа Telia из одного исходного изображения Telia, применив искажения и добавив случайный фон. Однако нам нужна база данных из многих тысяч изображений для создания нашего негативного набора данных, но в Интернете есть много баз данных изображений, которые могут здесь помочь.

AdaBoost и проклятие размерности

Когда у нас будут наборы данных положительных и отрицательных изображений, мы сможем обучить алгоритм по всем 160000 функциям. За исключением того, что будет так много функций. общность логотипов Telia.
Вот почему мы используем алгоритм машинного обучения AdaBoost. Вкратце: при распознавании изображений наш алгоритм AdaBoost попытается найти одну функцию, которая немного лучше, чем случайная, при прогнозировании наличия на изображении логотипа Telia. Затем он превратит эту функцию в свой собственный очень слабый алгоритм прогнозирования. Затем AdaBoost будет искать другую функцию, создавая еще один очень слабый алгоритм прогнозирования и добавляя его к первому. Он будет продолжать делать это до тех пор, пока не сможет правильно идентифицировать 99,9% изображений с логотипами Telia, но ошибочно пометить 50% негативных изображений как имеющие логотипы Telia.
Мы останавливаемся на неправильной маркировке негативных изображений на 50%, как оказалось Достаточно лишь нескольких функций, чтобы быть уверенным, что на большинстве негативных изображений нет логотипа Telia. И мы можем запустить этот первый алгоритм AdaBoost в качестве чрезвычайно быстрого теста, чтобы исключить изображение без логотипа. Затем мы берем те изображения, которые не можем исключить как имеющие логотип, и применяем второй этап алгоритмов AdaBoost, который также настроен на 99,9% истинных положительных и 50% ложных срабатываний. И мы продолжаем добавлять этапы, пока не убедимся, что есть логотип.
Этот процесс добавления этапов алгоритмов AdaBoost называется каскадным алгоритмом. Его главная сила - скорость исключения негативных изображений и возможность впервые обнаруживать лица в реальном времени.

OpenCV - применение того, что мы узнали

Ниже приведен список команд, используемых с opencv для построения модели распознавания изображений логотипа Telis с использованием вышеупомянутой теории.
Вот обрезанные логотипы telia, которые я использовал в этом упражнении. В идеале, чем больше, тем лучше.

Создайте папку img / и сохраните здесь все ваши изображения, которые образуют набор негативных данных. Затем создайте текстовый файл bg.txt, в каждой строке которого указано расположение каждого негативного изображения.

Пример файла bg.txt
img / 2007_000027.jpg
img / 2008_005376.jpg
img / 2009_003407.jpg
img / 2010_004942.jpg
img / 2011_004709.jpg
img / 2007_000032.jpg

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

Повторите эту команду для каждого обрезанного изображения логотипа telia

opencv_createsamples -img Picture1.png -bg bg.txt -info sampleImageDirectory/Picture1.txt \
-bgcolor 0 -bgthresh 8 -num 128 -maxxangle 0.0 -maxyangle 0.0 -maxzangle 0.3

Мы совмещаем расположение всех созданных нами изображений.

cat sampleImageDirectory/Picture*.txt > positives.txt

Затем мы создаем векторный файл из всех наших положительных и отрицательных изображений, который мы можем использовать на следующем шаге, который тренирует алгоритм adaBoost.

opencv_createsamples -info positives.txt -bg ../bg.txt -vec test.vec

Затем мы строим нашу модель, используя следующую команду. Результатом будет файл cascade.xml, который будет нашим алгоритмом для прогнозирования логотипов Telia.

opencv_traincascade -data data -vec picture.vec -bg ../bg.txt -numPos 1000 -numNeg 600 -numStages 20 -mode ALL

Используйте файл cascade.xml в любом приложении, которое вы хотите, прочтите документацию opencv для получения дополнительной информации или посмотрите короткий пример ниже.

#Import the opencv library into python
import cv2 

#Load out model into opencv
teliaCascade = cv2.CascadeClassifier("cascade.xml")

# Read an image we want to detect logos in and make it grey scale
image = cv2.imread("telia_shop.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

telias = teliaCascade.detectMultiScale(
    gray,
    
    scaleFactor=1.1,   #We keep scaling the haar cascade model by 10%
                       #to look for bigger and bigger logos
    
    minNeighbors=1,    #A tuning parameter that says how accurate we want the model to be. 
                       #Bigger is more accurate, but will detect less logos
    
    minSize=(24, 24),  #The smallest pixel width and height our cascade should be able to detect logos. 
                       #Defined by what size we set during training
    
    flags = cv2.cv.CV_HAAR_SCALE_IMAGE #Flag saying we want the appropriately scale the image
)

print "Found {0} telias!".format(len(telias))

# Draw a rectangle around the telia logos
for (x, y, w, h) in telias:
    cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)