I(x,y) - LMS - Высшая школа экономики

advertisement
Правительство Российской Федерации
Федеральное государственное автономное образовательное учреждение высшего
профессионального образования
«Национальный исследовательский университет
«Высшая школа экономики»
Факультет информатики, математики и компьютерных наук
Кафедра информационных систем и технологий
Выпускная квалификационная работа
на тему «Исследование алгоритмов детектирования текстурированных
объектов на видео для мобильных платформ»
Студент группы № 11БИ-2
Шипова Ксения Геннадьевна
Оценка за работу______
Руководитель
доцент кафедры
информационных систем
и технологий, к.м.н.
Савченко Андрей Владимирович
Нижний Новгород
2015
ОГЛАВЛЕНИЕ
ВВЕДЕНИЕ………………………………………………………………........3
Глава 1. АЛГОРИТМЫ ДЕТЕКТИРОВАНИЯ ОБЪЕКТОВ НА ВИДЕО
ДЛЯ МОБИЛЬНЫХ ПЛАТФОРМ……..………….....………………….......6
1.1.
Обучение
с
учителем
и
формальная
запись
задачи
классификации……………....…………………………………….........6
1.2. Каскадный классификатор……………………………....………..8
1.2.1. Признаки Хаара……………………………………….......9
1.2.2. Алгоритм Adaboost ……………………….......................11
1.2.3. Локальные бинарные шаблоны …………………...........14
1.3. Выбор предметной области и обзор реализаций методов
машинного
обучения
с
учителем
в
этой
области………………………………...................................................16
1.4. Выбор мобильной платформы и изучение инструментов
разработки……………………………………………………………..21
Глава
2.
НАПИСАНИЕ
ПРИЛОЖЕНИЯ,
ИСПОЛЬЗУЮЩЕГО
КАСКАДНЫЙ КЛАССИФИКАТОР……………………………..………...26
2.1. Подготовка базы изображений…………………..……………...26
2.2. Обучение каскадного классификатора…………..……………..31
2.3 Структура и интерфейс программы……………………………..33
Глава
3.
РЕЗУЛЬТАТЫ
ЭКСПЕРИМЕНТАЛЬНОГО
ИССЛЕДОВАНИЯ..........................................................................................37
3.1. Программа экспериментальных исследований…………….......37
3.2. Описание проведенных экспериментов………………...............40
3.3. Выводы по результатам тестирования………………………….49
ЗАКЛЮЧЕНИЕ………………………………………………………...........52
СПИСОК ЛИТЕРАТУРЫ………….………………………………………..55
1
ПРИЛОЖЕНИЕ А. Исходный код программы для подготовки обучающей
выборки………………………………………………………………..……..59
ПРИЛОЖЕНИЕ Б. Исходный код приложения для детектирования
пешеходов……………………………………………………………………62
2
ВВЕДЕНИЕ
С недавнего времени такая область кибернетики, как создание
искусственных систем распознавания образов, стала представлять особый
интерес. Потребность в создании и применении автоматических методов
анализа изображений и видео возникает в самых разных сферах – от
распознавания текстов [32] до проблем робототехники и систем обнаружения
целей [17]. Однако процесс распознавания является сложной задачей в
программировании и с теоретической, и технической стороны.
К основным задачам распознавания образов относится классификация
изображений (определение наличия объекта), детектирование и локализация
объекта
(вычисление
его
координат
и/или
выделение
границ)
и
непосредственно распознавание объекта (определение сущности найденного
объекта, отнесение его к некоторому классу объектов) [27]. В данной работе
рассматривается задача детектирования текстурированного объекта на видео.
Не случайно изучаются именно текстурированные объекты. Под
текстурой
понимается
некоторое
свойство
макроскопической
области
изображения, описывающее пространственную упорядоченность простых
геометрических
элементов
(примитивов)
этого
изображения.
Область
определяется как текстурная, когда число этих элементов в области достаточно
велико, а если в ней присутствуют только несколько примитивов, то на
изображении воспринимается группа исчисляемых объектов [13]. Выбор
текстурированных изображений в качестве тестовых объектов исследования
определяется тем, что многие текстурированные изображения обладают
скрытой периодической линейчатостью, что позволяет реализовать методы
детектирования с приемлемой вычислительной сложностью.
В практических задачах часто решаются проблемы распознавания людей,
лиц, автомобилей, автомобильных номеров, дорожных знаков и других
объектов, которых можно отнести к текстурированным. Частным случаем
обнаружения и отслеживания людей является детектирование пешеходов.
3
Данная проблема является чрезвычайно актуальной. Общая идея заключается в
создании активных систем безопасности, которые предназначены для снижения
частоты и тяжести несчастных случаев на дороге, предупреждая водителя об
опасности и/или осуществляя переход к автоматическому управлению
транспортным средством во избежание дорожно-транспортного происшествия.
В основе таких систем так или иначе лежит распознавание объектов, поэтому
качество работы целой системы будет зависеть от реализации этого процесса на
программном уровне [19]. Поэтому далее в работе будут применяться общие
алгоритмы распознавания текстурированных объектов для этой практически
важной задачи.
Алгоритмы машинного обучения являются наиболее привлекательным
методом в решении задачи распознавания и, в частности, успешно
используются в распознавании пешеходов. Машинное обучение известно как
одно из самых интенсивно развивающихся направлений в программировании, о
чем свидетельствуют научные работы последних десятилетий. В этой связи
стоит упомянуть труды П. Фельценсцвальба (P. F. Felzenszwalb) [8, 9], З.
Гарамани (Zoubin Ghahramani) [10], Д.М. Гаврила (D.M. Gavrila) [11], которые
послужили основой для написания данной работы.
Однако многие предлагаемые методы показывают себя неэффективными.
Простейшие алгоритмы не всегда дают хорошие практические результаты,
имеют непростительно высокий процент пропусков объекта в потоке или
большую
вероятность
ложного
срабатывания.
Большинство
сложных
алгоритмов требуют слишком много времени и ресурсов на реализацию, и
потому не могут быть использованы в реальном времени. Поэтому именно
процесс распознавания был выбран как объект оптимизации в данной работе.
Отдельную проблему представляет собой распознавание в видеопотоке. В
данной работе используется распространенный подход still-to-still recognition,
представляющий собой покадровое распознавание и комбинирование этих
результатов для нескольких последовательных кадров [36, 37].
4
В
данной
работе
было
принято
решение
изучить
проблему
детектирования пешеходов в реальном времени для мобильных платформ, так
как использование мобильных устройств обеспечит более удобное и
эффективное тестирование исследуемых методов в выбранной предметной
области.
Таким образом, целью работы является повышение точности и
вычислительной эффективности алгоритмов детектирования текстурированных
объектов на видео для мобильной платформы Android на примере задачи
обнаружения пешеходов.
Основные задачи, решаемые в рамках работы, таковы:
1. Провести аналитический обзор литературы.
2. Реализовать изученные методы детектирования текстурированного
объекта в виде образца программы.
3.
Провести
приложения
экспериментальное
применительно
к
задаче
видеоизображении.
5
тестирование
детектирования
разработанного
пешеходов
на
1. АЛГОРИТМЫ ДЕТЕКТИРОВАНИЯ ОБЪЕКТОВ НА ВИДЕО
ДЛЯ МОБИЛЬНЫХ ПЛАТФОРМ
1.1. Обучение с учителем и формальная запись задачи классификации
Теория машинного обучения решает задачи предсказания будущего
поведения сложных систем в том случае, когда отсутствуют точные гипотезы о
механизмах, управляющих поведением таких систем. Имеется ряд категорий
машинного обучения: контролируемое обучение или обучение с учителем
(supervised learning), неконтролируемое обучение (unsupervised learning) (в
частности, кластеризация), обучение с подкреплением (reinforcement learning).
В данной работе рассматривается первый тип машинного обучения –
контролируемое обучение. Оно берет начало на обучающей выборке, которая
представляет собой примеры: пары вида «вход – выход». Целью обучения
является восстановление зависимости между элементами этих пар с целью
предсказания будущего выхода по заданному входу. В сущности, имеется два
основных класса задач: задачи классификации и задачи регрессии. В данном
исследовании интерес представляет задача классификации, в которой выход это метка класса, к которому принадлежит вход [31].
Задача классификации базируется на основных идеях теории PACмашинного обучения (Probably Approximately Correct-learning), предложенную
Валлиантом [38]. В работе предлагается отойти от классической концепции
этой теории; вместо этого используется постановка задачи, принятая в
современной статистической теории машинного обучения.
Так, предполагается, что каждый пример x, представленный для обучения
или проверки, является элементом некоторого множества X (снабженного
полем борелевских множеств) и генерируется некоторым неизвестным
распределением вероятностей P на X . Предполагается, что каждый пример x
имеет метку y – признак принадлежности к некоторому классу. Метки классов
образуют множество D. Пары (x; y) объектов x и их меток y одинаково и
6
независимо распределены согласно некоторому неизвестному вероятностному
распределению P на множестве X  D . В соответствии с этим полагается, что
выборка
S 
 x1; y1 ,
 ,  xl ; yl  
генерируется (порождается) некоторым
источником, а на множестве ( X  D)l задано распределение вероятностей
P l  P  P...  P .
Правило или функция (гипотеза) классификации – это функция типа
k : X  D , которая разбивает элементы xi  X на несколько классов. Мы будем
также называть функцию k классификатором, или решающим правилом. В
дальнейшем будет рассмотрен случай бинарной классификации D  {1,1} , а
функция k : X  D будет называться индикаторной.
В этом случае вся выборка S разбивается на две подвыборки:
положительные
примеры
(или
первый
класс)
и
S   (( xi , yi ) : yi  1)
-
S   (( xi , yi ) : yi  1)
- отрицательные примеры (или второй класс). Именно эта
информация и подводит к физической, программной реализации алгоритма
AdaBoost. Подробнее об этом рассказывается в главе 2, там же можно
проследить
параллели
между
положительными
и
отрицательными
подвыборками S и позитивными и негативными наборами изображений для
тренировки каскада.
В некоторых случаях индикаторная функция классификации k задается с
помощью некоторой вещественной функции f и числа r  :
1, если 𝑓(𝑥) > 𝑟
𝑘(𝑥) = {
.
−1 в противном случае
Строго говоря, пары (x; y) являются реализациями случайной величины
(X;Y), которая имеет распределение вероятностей P. Плотность распределения
P будет обозначаться так же, как и P(x; y).
Предсказательная способность произвольной функции классификации k
будет оцениваться по ошибке классификации, которая определяется как
вероятность неправильной классификации:
eP (k )  P{k ( X )  Y }  P{( x, y) : k ( x)  y} ,
7
где k(X) - функция от случайной величины X, также является случайной
величиной, поэтому можно рассматривать вероятность события {k ( X )  Y } .
Основная цель при решении задачи классификации – для заданного
класса функций классификации K построить оптимальный классификатор, т.е.
такую функцию классификации k  K , при которой ошибка классификации
eP (k ) является наименьшей в классе K.
1.2. Каскадный классификатор
В настоящее время метод Виолы–Джонса является самым популярным
методом для детектирования в силу своей высокой скорости и эффективности.
В 2001 году П. Виола и М. Джонс [21, 22] представили многоэтапную
процедуру
классификации,
которая
позволила
существенно
сократить
вычислительное время. При этом качество осталось сопоставимо со многими
более медленными и сложными одноэтапными классификаторами, такими как
машина опорных векторов (SVM)[8], случайный лес (Random Forest)[25] и
нейронные сети (ANN) [12]. На протяжении порядка 10 лет предлагались
различные модификации этого метода, пригодные для решения более
специфичных задач [36].
Этапами алгоритма Виолы и Джонса являются классификаторы бустинга
[28] над решающими деревьями, использующими в качестве признаков
характеристики Хаара. Общий подход Виолы–Джонса к детектированию
объектов на изображении комбинирует четыре концепции:
1.
Использование простых прямоугольных функций, так называемых
функций Хаара;
2.
Интегральное представление изображения по этим признакам для
быстрого обнаружения функции;
3.
алгоритма
Использование метода построения классификатора на основе
адаптивного
бустинга
AdaBoost,
машинного обучения;
8
реализующего
концепцию
4.
Применение метода комбинирования классификаторов в каскадную
структуру для эффективного совмещения множественных функций.
Именно эти идеи позволяют осуществлять детектирование объекта в
режиме реального времени [2].
1.2.1. Признаки Хаара
Признаки Хаара (Haar-Like features) представляют собой двоичную
аппроксимацию вейвлета Хаара. Каждый признак представляет собой
двоичную маску, т.е., черно-белое изображение. В исходных работах [28]
использовалось лишь несколько типов характеристик Хаара (рис. 1.1, пп. 1, 2).
В более поздних работах [29], представляющих расширенный метод ВиолыДжонса,
набор
характеристик
Хаара
был
дополнен
наклонными
характеристиками (рис. 1.1, п.3).
Рисунок 1.1. Признаки Хаара
Характеристику Хаара можно определить как функцию f от суммарной
интенсивности I A и I B двух прямоугольных участков изображения A и B таких,
что участок A вложен в участок B. Прямоугольная форма участков выбрана
затем, чтобы можно было применить технику интегральных изображений [18,
22] для расчета суммарных интенсивностей в них. В современных работах
9
используется характеристика вида f ( A, B)   I A   I B , где  и  – константы.
Поэтому применение алгоритма Виолы и Джонса требует корректировки
освещения:
I '( x, y ) 
I ( x, y )  
, c  0.
c
Здесь I ( x, y ) – интенсивность в точке (x,y),  – оценочная дисперсия,  –
оценочное среднее значение интенсивности по некоторой окрестности, c –
положительная константа, которую обычно полагают равной двум [6].
Поскольку
признаки
Хаара
мало
подходят
для
обучения
или
классификации, для описания объекта с достаточной точностью необходимо
большее число признаков. На этапе обнаружения в методе Виолы—Джонса
используется окно определенного размера, которое движется по изображению.
Признак Хаара рассчитывается для каждой области изображения, над которой
проходит окно. Для того, чтобы рассчитать яркость прямоугольного участка
изображения, используют интегральное представление. Этот способ позволяет
эффективно определять наличие и отсутствие сотен функций Хаара на каждой
локации изображении и в нескольких масштабах. Интегральное представление
изображения представляет собой матрицу, совпадающую по размерам с
исходным
изображением.
В
каждом
ее
элементе
хранится
сумма
интенсивностей всех пикселей, находящихся левее и выше данного элемента.
Элементы матрицы рассчитываются по следующей формуле:
I ( x, y ) 

i ( x ', y '),
x ' x , y ' y
где I(x,y) – значение точки (x,y) интегрального изображения; i(x,y) – значение
интенсивности исходного изображения.
Каждый элемент матрицы I(x,y) представляет собой сумму пикселей в
прямоугольнике от i(0,0) до i(x,y), т. е. значение каждого элемента I(x,y) равно
сумме значений всех пикселей левее и выше данного пикселя i(x,y). Расчет
10
матрицы занимает линейное время, пропорциональное числу пикселей в
изображении и его можно производить по следующей формуле:
I ( x, y )  i( x, y )  I(x  1, y  1)  I ( x, y  1)  I ( x  1, y).
Наличие или отсутствие объекта в окне определяется разницей между
значением признака и обучаемым порогом, то есть посредством вычитания
среднего значения области темных пикселей из среднего значения области
светлых пикселей, то есть вычисляемым значением такого признака будет:
F = U – V,
где U – сумма значений яркостей точек, закрываемых светлой частью
признака, а V – сумма значений яркостей точек, закрываемых темной частью
признака. Если разница превышает порог, то говорят, что функция является
существующей.
Преимущество использования признаков Хаара является наибольшая,
по сравнению с остальными признаками, скорость. При использовании
интегрального представления изображения, признаки Хаара могут вычисляться
за постоянное время.
Таким
образом,
признаки
Хаара
организованы
в
каскадный классификатор.
1.2.2. Алгоритм AdaBoost
В основе формирования каскада классификаторов Хаара лежит алгоритм
adaptive boosting’a (адаптивного усиления), или сокращенно AdaBoost (метаалгоритм, предложенный Йоавом Фройндом (Yoav Freund) и Робертом
Шапиром (Robert Schapire), [10]). AdaBoost комбинирует T «слабых»
классификаторов с целью создания одного «сильного» классификатора.
«Слабым» здесь считается такой классификатор, который получает правильный
ответ не намного чаще, чем при случайном угадывании. Но если имеется
множество таких слабых классификаторов, и каждый из них выдвигает
окончательный ответ примерно в верном направлении, можно получить
серьёзную, комбинированную силу для достижения корректного решения.
11
AdaBoost выбирает набор слабых классификаторов для объединения и
присваивает каждому из них свой вес. Эта взвешенная комбинация и является
сильным классификатором.
На данный момент наиболее распространёнными вариантами базового
алгоритма являются Gentle AdaBoost и Real AdaBoost, превосходящие базовый
алгоритм по своим характеристикам, но сохраняющие все основные принципы
[10].
Общая идея алгоритма заключается в следующем:
1. Требуется: построить классифицирующую функцию F : X  Y , где X –
пространство векторов признаков, Y – пространство меток классов.
2. Имеется:
2.1. Обучающая выборка (x1, y1), ..., (xN, yN),
где i – номер
признака, xi  X - вектор признаков, а yi  Y - бинарная метка класса,
yi  {1, 1} ,
к
которому
принадлежит xi  X (для
других
boosting-
алгоритмов может быть диапазон значений меток).
2.2. Семейство классифицирующих функций K : X  Y ;
2.3. Начальное распределение D0 (i)  1/ N , для i=1,…,N, т.е. оно
должно быть инициализировано заранее; сообщает, сколько стоит
неправильная оценка каждого признака.
3. Для каждого шага m=1,2,…,M строится итеративный процесс вида:
3.1. Выбирается наилучший на текущем распределении Dm (t )
слабый классификатор km ( x)  K :
N
km  arg min(em   Dm (i )(km ( xi )  yi )) ,
i 1
e
то есть тренируется km  K , минимизирующий взрешенную ошибку
N
классификации em   Dm (i )(km ( xi )  yi ) , пока em >0,5, иначе выход;
i 1
12
3.2. Вычисляется коэффициент
am 
1  em
1
log[
],
2
em
показывающий
вклад текущего слагаемого классифицирующей функции;
3.3. Добавляется слагаемое f m   m km ( x) , вычисляемое с учетом
работы уже постороенной части классификатора;
3.4. Обновляется распределение (весовые коэффициенты для
признаков):
Dm 1 (i ) 
Dm (i ) exp(  yi f m ( xi ))
,
Zt
где Z t - нормализующий по всем признакам коэффициент, такой, что
N
D
i 1
m 1
(i )  1 . Вес каждого элемента обучающей выборки на текущем шаге задает
«важность» этого примера для очередного шага обучения алгоритма. Чем
больше вес, тем больше алгоритм будет стараться на данном шаге
классифицировать этот пример правильно. Как видно из формулы, чем
уверенней пример распознаётся предыдущими шагами, тем его вес меньше таким образом, самые большие веса получают примеры, которые предыдущими
шагами были классифицированы неверно. Проще говоря, веса варьируются
таким образом, чтобы классификатор, включенный в комитет на текущем шаге,
концентрировался на примерах, с которыми предыдущие шагами не
справились. Таким образом, на каждом шаге мы работаем с какой-то частью
данных,
плохо
классифицируемой
предыдущими
шагами,
а
в
итоге
комбинируем все промежуточные результаты.
Процесс продолжается до некоторого шага
M, номер которого
определяется вручную. По окончании описанного алгоритма составляется
комитет (сильный классификатор): берется новый входной вектор X и
M
классифицируется на основе взвешенной суммы F ( X )  sign[ f m ( x)] .
i 1
Очевидно, что ключевой особенностью boosting-а является то, что, когда
алгоритм прогрессирует, эта стоимость будет развиваться так, что обучение
13
«слабых» классификаторов будет сфокусировано на тех признаках, которые
ранее в «слабых» классификаторах давали плохие результаты [2].
Однако стоит признать, что конвергенция на учебном этапе этого
алгоритма во многом зависит от обучающих данных, точность прогнозирования
также остается низкой. К другим недостаткам алгоритма относятся:
1) Склонность к переобучению при наличии значительного уровня шума
в данных;
2) Требование большой выборки данных, больших объёмов памяти для
хранения базовых алгоритмов и существенных затрат времени на вычисление
классификаций;
3)
Жадная
стратегия
последовательного
добавления
приводит
к
построению неоптимального набора базовых алгоритмов.
В связи с этим оптимальным решением станет параллельное изучение и
реализация другого метода для последующего сравнения их эффективности.
AdaBoost является одним из самых популярных алгоритмов бустинга, но
существуют и другие методы, как, например, AnyBoost (бустинг как процесс
градиентного спуска), LogitBoost, BrownBoost, TotalBoost, MadaBoost и другие.
В работе описан метод, основанный на локальных бинарных шаблонах.
1.2.3. Локальные бинарные шаблоны
Оператор LBP (Local Binary Patterns, локальные бинарные шаблоны)
впервые был предложен T.Ojala в 1996 году [20]. Базовый оператор LBP,
применяемый
к
пикселю
изображения,
использует
восемь
пикселей
окрестности, принимая значение интенсивности центрального пикселя в
качестве порога. Он представляет каждый пиксель изображения в виде
бинарного числа: пиксели со значением интенсивности большим или равным
значению интенсивности центрального пикселя принимают значения равные
«1», остальные принимают значения равные «0» (рис. 1.2). Описание восьми
пикселей окрестности в двоичном представлении и есть локальный бинарный
шаблон (рис. 1.3).
14
Таким образом, результатом применения базового оператора LBP к
пикселю изображения является восьмиразрядный бинарный код, который
описывает окрестность этого пикселя. Использование круговой окрестности и
билинейной интерполяции значений интенсивностей пикселей позволяет
построить локальный бинарный шаблон с произвольным количеством точек P и
радиусом R.
Рисунок 1.2. Базовый оператор LBP
Рисунок 1.3. Графическое представление базового и расширенных операторов LBP
При работе с этим оператором учитывается, что некоторые бинарные
коды несут в себе больше информации, чем остальные (равномерные LBP
определяют важные локальные особенности изображения, такие как концы
линий, грани, углы и пятна и обеспечивают существенную экономию памяти).
Применяя оператор LBP к каждому пикселю изображения, можно
построить гистограмму, в которой каждому равномерному коду LBP
соответствует отдельный столбец. Также имеется еще один дополнительный
столбец, который содержит информацию обо всех неравномерных шаблонах
[14].
15
Основной целью алгоритма является вычисление меры различия
гистограмм сопоставляемых изображений и построение соответствующего
решающего правила. Существует множество подходов: это и взвешенное
расстояние Кульбака-Лейблера (областям назначаются веса в соответствии с
важностью информации, которую они несут), и расстояние Махаланобиса
(создание векторов различий двух изображений), и применение линейного
дискриминанта Фишера, а также некоторые другие.
1.3. Выбор предметной области и обзор реализаций методов
машинного обучения с учителем в этой области
В работе возникает необходимость выбора предметной области, в
которой будет тестироваться каскадный классификатор. Главными вопросами
на данном этапе являются:
1) Актуальность предметной области;
2)
Уровень
проработанности
предметной
области;
решенные
и
нерешенные задачи по этой тематике; методы, примененные для решения этих
задач.
В
качестве
предметной
области
было
выбрано
детектирование
пешеходов. Детектирование людей остается одной самых популярных областей
распознавания, а детектирование пешеходов, в частности, - еще и коммерчески
выгодной. Это обосновывается всё возрастающей потребностью общества
получить средство защиты и обеспечения максимальной безопасности человека
на проезжей части. Анализируя ситуацию на современных дорогах России в
целом, стоит отметить тенденцию усиления интенсивности движения,
возрастающее
число
субъектов
дорожного
движения
на
дороге,
и,
соответственно, увеличение процента дорожно-транспортных происшествий.
Статистика1 представлена на рис. 1.4.
1
Данные с официального сайта ГИБДД РФ, URL::http://www.gibdd.ru/stat/charts/
16
Если говорить о мерах снижения риска для людей, то становится
очевидным, что меры по обеспечению физической безопасности принимаются в
основном в отношении водителей. Данное положение вещей объясняется тем,
что такие инициативы исходят от автомобильных компаний, прибыль которых
зависит от реализации подобного рода проектов. Безопасность же пешехода
целиком и полностью зависит от человеческого фактора, что совершенно
недопустимо.
В
последнее
время
развитие
получила
концепция,
решающая
обозначенную проблему. Речь идет именно о системах автоматического
распознавания пешеходов.
Рисунок 1.4. Статистика ДТП
Программный
уровень
реализации
таких
систем
работает
непосредственно с задачей детектирования. Для решения данной задачи
предложено множество методов, каждый из которых обеспечивает разное
качество распознавания и служит для применения в конкретных подзадачах,
начиная с самых примитивных, как, например, простое обнаружение пешехода,
определение расстояния до него и обозначение контура пешехода на фоне, и
заканчивая сложными, к примеру, предсказанием траектории движения
пешехода.
17
В таблице 1.1 содержится информация о работах, в которых решается
задача детектирования пешеходов с применением методов машинного
обучения с учителем. Эти данные могут помочь проанализировать, есть ли
нерешенные проблемы в данной предметной области и существует ли
пространство для оптимизации в данной сфере.
Таблица 1.1
Применение алгоритмов контролируемого обучения в выбранной предметной области
Примеры алгоритмов
Работы
Алгоритмы на основе [6], [30], [9], [8]
гистограмм
R−HOG,
(Lin.
C−HOG,
EC−HOG и др.)
Метод
Достоинства
Недостатки
метода
метода
Возможна
работа
алгоритма
в
режиме
реального
времени;
- В большинстве
случаев обучение
занимает
много
времени;
опорных [30], [8], [33]
- Возможность
обучить такой
Бустинг
[28], [11], [33], [8], распознаватель
, который был
[36]
бы устойчив ко
всем факторам
Баггинг (Random Forest) [25]
изменяющейся
среды
Нейросети
[12], [7], [34]
векторов (SVM)
- Необходимость
подготовки
обучающих
выборок;
Зависимость
качества обучения
от
обучающей
выборки
Если предпринять попытку проанализировать содержание ячеек таблицы,
можно
сделать
выводы
о
том,
что
предметная
область
активно
прорабатывается, в частности, написано много трудов по бустингу и обучению
классификаторов. Однако сами авторы этих работ подчеркивают, что обучение
каскадных
классификаторов
имеет
ряд
существенных
недостатков,
с
последствиями которых не всегда удается справиться. Таким образом, работа с
каскадными классификаторами применительно к задаче детектирования
пешеходов является необходимой и практически полезной.
Для того, чтобы объективно оценить результаты работы с каскадным
классификатором, на данном этапе исследования было принято решение
дополнительно реализовать другой метод классификации. Такая мера поможет
18
сравнить результаты детектирования, чтобы определить, превосходит ли
разрабатываемый метод уже существующие, и если да, то насколько.
Выбор пал на метод HOG (Histogram of Oriented Gradients, гистограмма
направленных градиентов) [7], так как он изначально был разработан именно
для детектирования пешеходов и в настоящий момент в том или ином виде
используется в большинстве современных детекторов.
Основная идея, лежащая в основе HOG, заключается в том, что внешний
вид и форма части объекта могут быть достаточно хорошо описаны
распределением градиентов интенсивности пикселей, соответствующих данной
части, без точной информации о градиентах в каждой точке. Под градиентом
здесь понимается аппроксимация градиента функции интенсивности (яркости),
которая предполагается дифференцируемой, но известной лишь в узлах
равномерной сетки – пикселях, в заданной точке с помощью некоторой
разностной схемы.
Базовой
единицей
HOG-дескриптора
является
блок
(block)
–
прямоугольная область пикселей изображения заданных размеров. Блок
состоит из ячеек (cells), в свою очередь состоящих из пикселей. Каждой ячейке
ставится
в
соответствие
гистограмма
ориентаций
hi
(углов
наклона
относительно горизонтали) градиентов из заданного количества полос (bins),
при этом направление считается «беззнаковым», т.е. угол в  и (2   )
считаются эквивалентными.
Магнитуда градиента в некотором пикселе дает вклад в полосы
гистограммы ячейки, которой принадлежит данный пиксель, а также в
гистограммы соседних ячеек. При этом используется линейная интерполяция
по
углу
наклона
(полосам
одной
гистограммы),
и
билинейная
по
пространственному расположению (по гистограммам соседних ячеек). Также
возможно взвешивание магнитуд градиентов с помощью гауссиана с центром,
совпадающим с центром блока. После вычисления гистограмм в каждой ячейке
19
блока, они конкатенируются в одну гистограмму h  f (h1,..., hk ) , тем самым
образуя вектор признаков блока.
Полученный вектор подвергается нормализации по яркости ( L2 или L1
норма): hL 
2
h
h 2 
2
, hL2 
h
,h
h1 
L1
 hL1 , где  - некая малая константа. Таким
образом, данный описатель содержит пространственную информацию о
фрагменте и инвариантен к освещению.
Такие признаковые описания вычисляются для всех блоков, не
выходящих за пределы изображения, с координатами левого верхнего пикселя
кратными заданным шагам по вертикали и горизонтали. Причем данные шаги,
как правило, задаются так, что блоки перекрываются, т.е. градиент пикселя
учитывается при вычислении признаковых описаний нескольких блоков. HOGописание изображения получается путем конкатенации векторов признаков
всех блоков.
При вычислении градиентов производится свертка изображения с ядрами
 1,0,1 и  1,0,1T , в результате чего образуются две матрицы
и Dy
Dx
производных вдоль осей 𝑥 и 𝑦 соответственно. Эти матрицы используются для
вычисления углов и величин (модулей) градиентов в каждой точке
изображения.
Пусть множество углов (−𝜋, 𝜋] разбивается на 𝑛 равных интервалов вида
k 
 k 1
  ,    , где

n
n 

𝑘 = {1, . . . , 𝑛}. Каждому интервалу ставится в соответствие
бин гистограммы. Тогда гистограмма ячейки заполняется так, что величина
градиента в каждой внутренней его точке добавляется к величине бина,
соответсвующего интервалу, содержащему угол данного градиента [5].
Обычно ячейки, так же, как и сами фрагменты, имеют прямоугольную
форму, которая позволяет применять технику интегральных изображений.
Итак, на данном этапе исследования тема была рассмотрена с
математической
точки
зрения:
описана
20
общая
формальная
задача
классификации, даны определения ключевым понятиям (признаки Хаара и
локальные бинарные шаблоны), представлен алгоритм AdaBoost, основанный
на использовании признаков Хаара, также дополнительно изучен метод HOG.
Изучение теоретической составляющей алгоритмов необходимо для их
грамотной реализации, которая имеет место быть в данной работе. Также на
данном шаге была выбрана предметная область, открытая для применения
изученных методов.
1.4.
Выбор мобильной платформы и изучение инструментов
разработки
Практическая реализация алгоритмов, представленных в предыдущих
пунктах, предполагает:
1) Выбор мобильной платформы;
2) Изучение соответствующей среды разработки;
3) Исследование сторонних библиотек, использование которых даёт
возможность эффективно решить поставленные задачи.
На современном рынке мобильных устройств конкурируют 3 основные
операционные системы (ОС): Android, iOS и Windows Phone. Для того, чтобы
определиться с выбором, в таблице 1.2 подготовлен краткий сравнительный
обзор этих платформ.
В силу открытости, доступности и высокой распространенности, в
качестве платформы была выбрана ОС Android.
Для работы с платформой Android была использована интегрированная
среда
разработки
Android
Studio
0.9.92,
основанная
на
программном
обеспечении IntelliJ IDEA и системе Gradle. Android Studio не случайно
предпочтена среде Eclipse. Выбор обуславливается тем, что эта среда:
- специально предназначена для разработчиков Android;
2
URL:https://developer.android.com/sdk/index.html
21
- позиционируется непосредственно как замена Eclipse3 (в связи с чем
рекомендован переход с Eclipse);
Таблица 1.2
Сравнительный обзор основных мобильных платформ4
Доля
устройств,
использующих
Ресурсозатратность разработки
Среда
Язык
разработки
разработки
данную ОС, %
Высокая (необходимость
учитывать разную
производительность устройств,
Android
81,5
большое количество размеров
Eclipse IDE;
экрана и пр., следствие -
Android
увеличенные затраты на
Studio
Java
проектирование нескольких
интерфейсов и дополнительное
тестирование)
Высокая (за счет повышенных
требований к готовому продукту
14,8
iOS
и, как следствие,
Xcode IDE
Objective-C
дополнительных затрат на
доработку)
Windows
Phone
2,7
C++, C#,
Низкая (за счет низкой
Microsoft
конкуренции внутри магазина)
Visual Studio
Visual Basic
или XAML
- обладает более удобным для работы над мобильным приложением
интерфейсом;
- быстрее обновляется и развивается. На момент сдачи выпускной
квалификационной работы выпущена первая стабильная версия 1.0.
Конференция Google I/O, 03.2013
Данные
по
мировому
http://4pda.ru/2015/01/30/199363/
3
4
рынку
мобильных
22
устройств
на
30.01.2015.
URL:
Дополнительно была использована интегрированная среда разработки
приложений на языке C++ Microsoft Visual Studio 2010.
Для того, чтобы получить возможность реализовать алгоритм обучения
каскадного
классификатора практически, в работе была использована
библиотека машинного зрения OpenCV5 с открытым исходным кодом.
Библиотека написана на оптимизированном C и C++, работает под Linux,
Windows и Mac OS X. Фактически, OpenCV – это набор типов данных, функций
и классов для обработки изображений алгоритмами компьютерного зрения.
Структурно библиотека OpenCV разделена на небольшие модули по
функциональному использованию. Отдельно стоит отметить модуль методов и
моделей машинного обучения opencv_ml. Так, OpenCV включает в себя
подбиблиотеку общего назначения MLL (Machine Learning Library, Библиотека
Обучения Машин). Эта подбиблиотека решает задачи статистического
распознавания образов, классификации и кластеризации. В работе используется
версия библиотеки OpenCV 2.4.9.
Заявленная библиотека подходит как для программирования на языке
C++, так и для разработки под Android. Она предоставляет несколько утилит,
необходимых для тренировки каскадного классификатора: opencv_haartraining,
opencv_traincascade, opencv_createsamples и opencv_performance. Подробнее
использование этих приложений описано в следующей главе.
Проектирование архитектуры приложения основывалось на базовых
принципах разработки Android-приложений, а именно:
1) SOLID (Single responsibility, Open-closed, Liskov substitution, Interface
segregation и Dependency inversion):
- принцип единственной обязанности класса (т.е. на каждый класс должна
быть возложена только одна обязанность);
5
URL:http://opencv.org/
23
-
принцип
открытости/закрытости
программных
сущностей
(т.е.
программные сущности должны быть открыты для расширения, но закрыты для
изменения);
- принцип подстановки Барбары Лисков (т.е. функции, которые
используют базовый тип, должны иметь возможность использовать подтипы
базового типа, не зная об этом);
- принцип разделения интерфейса (т.е. несколько специализированных
интерфейсов лучше, чем один универсальный);
- принцип инверсии зависимостей (зависимости внутри системы строятся
на основе абстракций, модули верхнего уровня не зависят от модулей нижнего
уровня, абстракции не должны зависеть от деталей, детали должны зависеть от
абстракций);
1) DRY (Don’t repeat yourself): принцип нацеленности на снижение
повторения информации различного рода;
2) KISS (Keep it short and simple): принцип, при котором простота
системы декларируется в качестве основной цели и/или ценности;
3) YAGNI (You Ain't Gonna Need It): принцип, при котором в качестве
основной цели и/или ценности декларируется отказ от добавления избыточной
функциональности, т.е. от функциональности, в которой нет непосредственной
надобности.
Таким образом, правильная архитектура основывается на группе методов,
реализующих системы, которые являются:
- независимыми от фреймворков;
- тестируемыми;
- независимыми от интерфейса пользователя (user interface, UI);
- независимыми от баз данных;
- независимыми от любой внешней службы.
24
Применение перечисленных принципов гарантирует то, что созданное
приложение будет простым как в поддержке, так и в тестировании, а также
будет обладать свойством составлять единое целое, будучи разделенным.
25
2. НАПИСАНИЕ ПРИЛОЖЕНИЯ, ИСПОЛЬЗУЮЩЕГО
КАСКАДНЫЙ КЛАССИФИКАТОР
В
данной
главе
описан
процесс
создания
Android-приложения,
способного детектировать пешеходов в видеопотоке, используя обученный
каскадный
классификатор.
Представленная
методология
разработки
приложения состоит из нескольких этапов:
1) Подготовка обучающей выборки изображений;
2) Процесс обучения каскадного классификатора, основанный на методах,
рассмотренных в главе 1, и инструментах, которые предлагают выбранные
языки программирования;
3) Написание мобильного приложения, использующего обученный
каскадный классификатор.
2.1. Подготовка базы изображений
Целями первого этапа процедуры обучения каскадного классификатора
будет являться:
1) Сбор и подготовка двух выборок изображений: содержащих и не
содержащих детектируемые объекты (т.н. выборок позитивных и негативных
изображений);
2) Подготовка файлов-описаний для каждой выборки в соответствии с
требованиями используемых утилит.
Пешеходы являются трудными для детектирования объектами в силу
внутриклассовой изменчивости и риска быть перекрытыми друг другом или
иными объектами. На данном этапе работы были предложены идеи того, как
можно
избежать
ухудшения
качества
последующего
детектирования
вследствие ошибок на стадии подготовки обучающей выборки. В таблице 2.1
перечислены основные проблемы детектирования и предложенные способы их
устранения.
26
В соответствии с поставленными целями, на основе сделанных
предположений для обучения каскадного классификатора были собрана
выборка позитивных изображений объемом 17000 штук и выборка негативных
изображений
объемом
15000
штук
в
разрешении
640х480
пикселей.
Позитивные содержали в себе один или несколько объектов «пешеход», на
негативных образах не было ни одного объекта, которого можно было бы
классифицировать как объект «пешеход».
Выборки
были
собраны
путем
комбинации
готового
свободно
распространяемого датасета от Даймлера6 (Daimler Pedestrian Detection
Benchmark Dataset) и уникальной выборки, состоящей из кадров, записанных
авторегистратором. Учитывая то, что выборка изображений от Даймлера также
была получена захватом изображений из автомобиля во время 27-минутной
езды по городу, общий набор данных для обучения каскадного классификатора
является реалистичным.
Так как для улучшения качества будущего классификатора (а также для
ускорения его обучения) было решено использовать позитивные изображения,
содержащие
позволяющее
только
лишь
произвести
сам
объект,
обрезку
было
написано
положительных
приложение,
изображений
и
одновременно автоматически заполнить файл их описания. Дополнительные
требования к приложению: максимально простой и удобный интерфейс,
позволяющий быстро обработать большое число изображений вручную.
Исходный код представлен в приложении А. Блок-схема работы с приложением
изображена на рис. 2.1. Примеры позитивного изображения и позитивных
образцов можно увидеть на рис. 2.2 и 2.3 соответственно; пример негативного
изображения представлен на рис. 2.4. Также был сгенерирован файл,
описывающий негативные изображения.
6
URL:
http://www.gavrila.net/Research/Pedestrian_Detection/Daimler_Pedestrian_Benchmark_D/Daimler_Mono_Ped__Detec
tion_Be/daimler_mono_ped__detection_be.html
27
На следующем шаге использовалась утилита opencv_createsamples для
создания обучающих образцов. Целью стало приведение подготовленных
изображений к формату, пригодному для обучения каскадного классификатора.
Таблица 2.1
Идеи, предложенные для решения проблем детектирования
Проблема
Решение
Отсутствие эталонного образа пешехода;
наличие радикальных различий в
представлении человека: мимические
искажения лица, особенности прически и
растительности на лице, наличие головного
Предпочтение отдается настоящим
изображениям пешеходов
убора и других предметов, поза, рост,
параметры фигуры и т.п.
Многообразие пространственного
Использование обучающей выборки
расположения объекта, зависимость от
большого размера (N позитивных и M
ориентации и масштаба
негативных изображений)
Существование определенных трудностей,
Использование кадров подлинных
которые представляет среда нахождения
видеозаписей видеорегистратора, сделанных
человека: разнообразие погодных условий,
в реальной среде при различных степенях
ландшафтов, характера освещения и т.п.
освещенности и в разное время года
Подготовка положительной выборки таким
образом, чтобы на каждом обучающем
образце находился один объект, по размеру
Риск пропусков объекта или ложных
совпадающий с размером изображения
срабатываний при детектировании
Использование частей позитивных
изображений, на которых отсутствует
объект, в качестве негативных
В работе применятся использование данной утилиты как инструмента
создания положительных образцов из коллекции изображений, т.к. генерация
28
образцов из одного объекта, как правило, не дает хороших результатов. В
параметрах указывается адрес файла-описания позитивных изображений и
выходного vec-файла, количество положительных изображений, а также длина
и высота каждого выходного образца, причем:
-
соотношение
сторон
образца
должно
отражать
пропорции
детектируемого объекта;
- размер образца не может быть меньше размера самого маленького из
позитивных изображений.
Рисунок 2.1. Блок-схема работы с приложением для подготовки обучающей выборки
29
Рисунок 2.2. Пример позитивного изображения
а)
б)
Рисунок 2.3. Примеры позитивных образцов
30
Рисунок 2.4. Пример негативного изображения
Таким образом, результатом работы на этапе подготовки базы
изображений
стал
vec-файл,
содержащий
информацию
для
обучения
каскадного классификатора.
2.2. Обучение каскадного классификатора
В
OpenCV
есть
два
приложения
для
тренировки
каскадов7:
opencv_haartraining и opencv_traincascade (новая версия, написанная на C++).
Предпочтение отдается использованию opencv_traincascade, так как эта утилита
хранит обученные каскады в новом формате. Для наилучшей оценки итогового
результата, решено обучить два каскадных классификатора: основанный на
признаках Хаара и основанный на локальных бинарных шаблонах. Библиотека
OpenCV и, в частности, утилита opencv_traincascade дает возможность обучить
оба классификатора путем установки значения параметра –featureType: Haar
или LBP. Оба каскадных классификатора были обучены по одной и той же
выборке, описанной в п.2.2.
7
URL:
http://docs.opencv.org/modules/objdetect/doc/cascade_classification.html?highlight=cascade%20classifier
31
Главной задачей на этапе тренировки каскадов является корректное
определение параметров обучения. В таблице 2.2 показаны параметры,
переданные приложению при первом запуске и оптимальные параметры,
вычисленные опытным путем.
Таблица 2.2
Экспериментальный подбор оптимальных параметров для обучения каскадов
Параметр
Изнач.
Оптим.
значение
значение
Обоснование
Изначально делалась скидка на сложность
детектируемых
объектов,
вероятность
смешения объекта с фоном и ложных тревог,
- minHitRate
0,95
0,996
поэтому процент «правильных» обнаружений
устанавливался не
максимально высоким.
Однако свойства хорошей выборки позволили
увеличить значение
Указывается не всё количество позитивных
образцов, так как процент правильных
-numPos
17256
15000
обнаружений не равен 100%, и некоторая
часть изображений будет признана
непригодной, а значит, высока вероятность
невозможности обучения каскадов до конца
-numNeg
10000
10000
Точное количество негативных образцов
Большее число уровней, которые будут
-numStages
15
31
обучаться, обеспечит большую точность
последующего детектирования
-precalcValBufSize
1024
1024
-precalcIdxBufSize
1024
1024
HAAR/
HAAR/
LBP
LBP
8
8
-featureType
-w
Под процесс выделяется большое количество
памяти для ускорения обучения
классификатора
Обучается классификатор, использующий
признаки Хаара или LBP
Параметры в точности должны совпадать с
32
Таблица 2.2 (продолж.)
размером сгенерированных на предыдущем
-h
32
32
шаге примитивов
Изначально выставлялось среднее значение
-
0,5
maxFalseAlarmRate
0,7
параметра, однако при обучении на хорошей
выборке уровень ложной тревоги достигался
слишком быстро
Предполагается использование полного
-mode
ALL
ALL
комплекта Хаар-признаков, чтобы достигнуть
максимально возможной точности
В общей сложности, каскадный классификатор, использующий признаки
Хаара, обучался 3360 минут; в свою очередь, классификатор, использующий
локальные бинарные шаблоны, обучался 339 минут.
Итак, результатом работы на этапе тренировки стали 2 каскада в формате
xml-файлов: обученный на признаках Хаара и обученный по локальным
бинарным шаблонам.
2.3. Структура и интерфейс приложения
В этой части работы описывается процесс создания мобильного
приложения на платформе Android, способного использовать обученные
каскадные классификаторы для детектирования пешеходов в реальном времени
и визуализировать результат.
Приложение разрабатывалось непосредственно для ОС Android 5.0.2,
однако также реализована поддержка старых версий.
С точки зрения архитектуры программы, было принято решение разбить
проект на 3 логических слоя:
1) Слой представления (Presentation Layer). На данном уровне не
присутствует бизнес-логика; здесь содержатся представления (views), логика UI
и посредники (interactors), связывающиеся с представителями (presenters) и
передающие информацию для её отображения в views;
33
2) Слой бизнес-логики (Domain Layer). На этом слое реализована вся
бизнес-логика приложения. Данный модуль реализован на языке java без какихлибо Android-зависимостей;
3) Слой данных (Data Layer). Все данные, необходимые для работы
приложения, поставляются из этого слоя. Именно к этому слою относится
используемая библиотека OpenCV, обученные каскады в формате xml-файлов и
элементы графического интерфейса.
На
рис.
2.5.
схематично
представлена
описанная
структура;
с
соответствующей UML-диаграммой классов можно ознакомиться по рис. 2.6.
Рисунок 2.5. Логические уровни проекта
Исходный код каждого класса и view-представлений программы
представлен в приложении Б.
Основными требованиями к интерфейсу пользователя стали:
1) Простота и интуитивность;
2) Возможность быстрого выбора и смены методов детектирования для
их адекватной визуальной оценки;
3) Правильное
отображение
всех
элементов,
в
том
числе
при
горизонтальном положении экрана, так как процесс детектирования
предполагает именно такое положение устройства;
4) Отрисовка элементов под разрешение экрана xhdpi (720х1280).
34
Рисунок 2.6. Диаграмма классов приложения
Интерфейс включает в себя:
- экран главного меню; это первое, что видит пользователь при запуске
приложения;
- экран детектирования пешеходов в реальном времени.
Переход от главного меню к экрану детектирования осуществляется
путем нажатия пользователем одной из трёх кнопок, реализованных в
соответствии с имплементированными методами детектирования: Haar, LBP и
HOG.
Переход обратно к главному меню осуществляется с помощью клавиш
навигации: учитывается, что смартфон LG G2 обладает наэкранными
клавишами навигации, реализованными в Android версии 5.0 и выше, а
смартфоны Philips W8510 и LG P705 L7 имеют сенсорные навигационные
клавиши на корпусе. Этот факт позволяет не создавать кнопку возврата с
экрана детектирования к главному меню, поскольку функционала хард-клавиш
достаточно для удобной работы с приложением.
На рис. 2.7 представлен скриншот главного меню приложения при работе
на смартфоне LG G2.
35
а)
б)
Рисунок 2.7. Главное меню приложения
36
3. РЕЗУЛЬТАТЫ ЭКСПЕРИМЕНТАЛЬНОГО ИССЛЕДОВАНИЯ
3.1. Программа экспериментальных исследований
В предыдущей главе была описана процедура создания приложения, а
также его структура и интерфейс. В данной главе проводится сравнительная
оценка качества работы этого приложения при использовании каскада,
обученного при помощи признаков Хаара, каскада, тренированного на
локальных бинарных шаблонах, а также метода гистограмм направленных
градиентов.
Общее тестирование приложения включало в себя:
1) Проверку приложения на предмет ошибок безотносительно изучаемых
методов детектирования (проведение юнит-тестов при помощи JUnit,
проведение тестирования UI приложения путем использования
библиотеки Espresso8);
2) Непосредственно анализ эффективности исследуемых методов в
задаче детектирования пешеходов в реальном времени, производимый
по следующим критериям:
- продолжительность обучения классификаторов (T);
- ошибки I рода; абсолютное число и процент пропусков объектов:
false negatives (FN) и false negatives rate (FNR);
- средне число пропущенных объектов в секунду (FNa);
- ошибки II рода; абсолютное число и процент ложных
срабатываний: false positives (FP) и false positives rate, (FPR);
- абсолютное число и процент верно классифицированных
положительных примеров: true positives (TP) и true positives rate (TPR);
- процент верно классифицированных отрицательных примеров
(истинно отрицательных случаев, true negatives rate, TNR);
8
URL: https://developer.android.com/training/testing/ui-testing/espresso-testing.html
37
-
чувствительность
и
специфичность
модели
и
(Se
Sp
соответственно);
- среднее время обработки одного кадра из видеопотока в реальном
времени (t).
Возможность оценить качество обучения классификатора предоставляет
сама библиотека OpenCV. При помощи утилиты opencv_performance она
использует коллекцию размеченных изображений, запускает классификатор и
сообщает так называемую производительность, т.е. количество найденных
объектов,
количество
пропущенных
объектов,
количество
ложных
срабатываний и другую информацию. Однако данное приложение работает
только с классификатором, обученным утилитой opencv_haartraining, а значит,
не может быть использовано в данном случае.
Среда Android Studio дает возможность использовать эмулятор для
разработки и тестирования программ. Однако этот вариант также был найден
непригодным. Приложение проверялось на реальных устройствах, так как
настройка нескольких эмуляторов продолжительнее и ресурсозатратнее, чем
подготовка устройств и установка на них пакета приложения. Главными же
причинами для отказа от эмулятора стала невозможность учета характеристик
смартфонов
при
оценке
работы
приложения
и
отсутствие
реальной
окружающей среды для детектирования.
Таким образом, было принято решение проводить экспериментальные
тесты на мобильных устройствах в реальном времени, в условиях, максимально
приближенных к условиям практического применения приложения такого рода.
Для
проведения
тестирования
использовались
три
смартфона,
обладающие различными характеристиками дисплея, камеры и процессора, а
также функционирующие на разных версиях платформы Android (4.0.3.Ice
Cream Sandwich, 4.2.2 Jelly Bean, 5.0.2 Lollipop). Такие меры по учету
аппаратной
и
программной
специфики
устройств
обязательны
при
оптимизации мобильного приложения как с точки зрения интерфейса, так и с
38
точки зрения производительности. В таблице 3.1. обозначены все необходимые
для анализа характеристики выбранных устройств.
Таблица 3.1.
Используемые для тестирования устройства
Характеристики
Устройство
Дисплей
5,2”
Смартфон LG 1980x1080
G-серии
GOLD D802
G2 FULL HD IPS
423 точек на
дюйм
4,7”
Смартфон
1280x720
Philips Xenium TFT IPS
W8510
312 точек на
дюйм
Смартфон LG 4,3”
Optimus
P705
L7 800x480
IPS
Процессор
4-ядерный
2,26 ГГц
ОС:
Android
v. 5.0.2
4-ядерный 1,2
ГГц
ОС:
Android
v. 4.2.2
Память
Встроенная:
13 Мп
32 Гб
ОЗУ: 1 Гб
Встроенная:
8 Мп
32 Гб
ОЗУ:
1.0 ГГц
Мб
512
Android Встроенная:
v. 4.0.3
камера
ОЗУ: 2 Гб
1-ядерный
OC:
Основная
5 Мп
16 Гб
Подготовка к тестированию была осуществлена в несколько этапов:
1) На персональный компьютер был установлен интерфейс для отладки
Android, ADB (Android Debug Bridge) Driver, для выполнения отладки по USB
и, в целом, контроля работы устройств через USB-соединение;
39
2) На все используемые устройства было установлено приложение
OpenCVManager9, обеспечивающее поддержку средств библиотеки OpenCV; в
противном случае запуск созданного приложения для детектирования
невозможен;
3) Приложение было успешно установлено на все устройства. В отличие
от закрытых систем, в ОС Android предусмотрена возможность установки
приложения на устройство без участия Google Play Market двумя способами:
- установка через пакет .apk c помощью менеджера приложений или
файлового менеджера;
- установка приложения через пакет .apk с компьютера через Android
SDK (средствами отладки ADB). Именно этот вариант и был использован.
После подготовительных работ была проведена серия тестов. Ход
эксперимента выглядел следующим образом:
1)
Смартфоны
устанавливались
в
автомобиле
в
горизонтальное
положение таким образом, чтобы их основные камеры имели максимальный
обзор и возможность полного захвата происходящего на дороге;
2) При приближении к регулируемому перекрестку или пешеходному
переходу производился запуск приложения для детектирования пешеходов;
3) Запускалась запись работы приложения с экранов;
4) Для каждого имплементированного метода детектирования пешеходов
проводились два теста одинаковой длительности, подробно описанные в пп. 4.1
и 4.2;
5) После завершения эксперимента полученные видеозаписи разбивались
на кадры (изображения в формате *.jpg) .
6) Полученные результаты подвергались визуальному анализу.
3.2. Описание проведенных экспериментов
1) Эксперимент №1. Детектирование множества объектов.
9
URL:http://docs.opencv.org/platforms/android/service/doc/index.html
40
Детектирование множества объектов – задача, с которой работающее
приложение должно справляться при его непосредственном применении на
практике. Главной задачей проведения такого эксперимента стало определение
коэффициентов FP, FN, TP и TN, являющиеся показателем точности
детектирования объектов.
Условия эксперимента:
- длительность записи, сек: 60;
- количество кадров: 1440;
- количество пешеходов в кадре ежесекундно меняется. Общее число
объектов составляет 8256 (вычисления показаны на рис. 3.1).
Для наглядной демонстрации эксперимента №1 на рис. 3.2–3.4.
представлены кадры работы приложения в условиях, описанных выше.
Количественные результаты представлены в сводной таблице сравнения
эффективности рассматриваемых методов детектирования в п. 3.3.
Рисунок 3.1. Вычисление количества объектов
41
Рисунок 3.2. Демонстрация работы приложения на смартфоне LG G2. Эксперимент 1, метод
Haar
Рисунок 3.3. Демонстрация работы приложения на смартфоне LG G2. Эксперимент 1, метод
LBP
42
Рисунок 3.4. Демонстрация работы приложения на смартфоне LG G2. Эксперимент 1, метод
HOG
2) Эксперимент №2. Детектирование одного объекта.
Эксперимент с детектированием одного объекта позволит определить
среднее число пропущенных объектов в секунду, а также узнать среднее время
обработки одного кадра. Такой тест поможет узнать, насколько велико время
реакции системы.
Условия эксперимента:
- длительность записи, сек: 10;
- количество кадров: 240;
- расстояние до объекта: 9 м.
- общее количество объектов: 240.
На основе полученных данных можно рассчитать время, в течение
которого система обнаружения будет бездействовать:
t '  n * tc ,
(1)
где t’ – время простоя, n – среднее количество пропускаемых объектов за
секунду, tc - длительность одного кадра.
43
Демонстрация хода эксперимента №2 представлена на рис. 3.5-3.7.
Рисунок 3.5. Демонстрация работы приложения на смартфоне LG G2. Эксперимент 2, метод
Haar
Рисунок 3.6. Демонстрация работы приложения на смартфоне LG G2. Эксперимент 2, метод
LBP
44
Рисунок. 3.7. Демонстрация работы приложения на смартфоне LG G2. Эксперимент 2, метод
HOG
Для объективного количественного анализа данных обоих экспериментов
построена сводная таблица результатов (табл. 3.2). На основе абсолютных
показателей, представленных в данной таблице, составлена дополнительная
таблица (табл 3.3) с относительными показателями, выраженными в процентах.
Коэффициенты TPR, FPR, Se и Sp вычисляются по следующим формулам:
TPR 
TP
 100% ;
TP  FN
(2)
FPR 
FP
 100% ;
TN  FP
(3)
Se  TPR 
Sp 
TP
 100% ;
TP  FN
(4)
TN
 100% .
TN  FP
(5)
45
Таблица 3.2
Результаты экспериментов №1 и №2 с максимальным разрешением входного кадра
LG G2
Количество
Philips W8510
LG P705 L7
Haar
LBP
HOG
Haar
LBP
HOG
Haar
LBP
HOG
189
1106
343
272
1321
446
1205
1334
1238
8067
7150
7922
7984
6935
7810
7051
6922
7018
247
508
133
389
642
201
675
818
594
3,15
18,4
5,71
4,53
22,0
7,43
20,08
22,2
20,6
218
140
167
200
143
179
308
237
166
ложно
отрицательных
срабатываний
(false
negatives, FN)
Количество
истинно
положительных
срабатываний
(true
positives, TP)
Количество
ложно
положительных
срабатываний
(false
positives, FP)
Среднее
число
пропущенных
объектов в секунду
(FNa)
Время
обработки
входного кадра (t), мс
Из таблиц видно, что время обработки одного кадра при использовании
смартфонов LG G2 и Philips не намного меньше, чем значение этого показателя
при запуске приложения на смартфоне LG P705, при том, что их
вычислительная мощность на порядок выше. Можно сделать вывод, что такие
показатели
обусловлены
слишком
высоким
разрешением
входного
изображения (1980х1080 и 1280х720). Также учитывается тот факт, что
46
каскадные классификаторы были обучены по выборке изображений с
разрешением 640х480.
Таблица 3.3
Вычисление относительных показателей по данным таблицы 3.2
LG G2
Доля
Philips W8510
LG P705 L7
Haar
LBP
HOG
Haar
LBP HOG Haar LBP HOG
97
86,6
95,9
96,7
83,9
94,5
85,4
83,8
85,0
17
35,2
9,2
27,0
44,6
13,9
45,6
56,8
41,25
97
86,6
95,9
96,7
83,9
94,5
85,4
83,8
85,0
83
64,8
90,8
73,0
55,4
86,1
54,4
43,2
58,75
истинно
положительных
срабатываний
(true
positives rate, TPR) %
Доля
ложно
положительных
срабатываний
(false
positives rate, FPR) %
Чувствительность
модели (Sensitivity, Se),
%
Специфичность модели
(Specificity, Sp), %
Исходя из этого, было принято решение реализовать функцию для
искусственного автоматического снижения разрешения. Функция снижает
разрешение кадра, если оно превышает 640х480 пикселей; далее к полученному
изображению применяются методы детектирования объектов, и, наконец, на
экран выводится результат детектирования в изначальном разрешении.
Реализацию функции можно найти в программном коде (приложение В).
В таблицах 3.4 и 3.5 представлены обновленные показатели, полученные
в ходе повторного проведения экспериментов в тех же условиях с разрешением
входного кадра 640х480. Цветом выделены обновленные данные.
47
Таблица 3.4
Результаты экспериментов №1 и №2 с разрешением входного кадра 640х480
LG G2
Количество
Philips W8510
LG P705 L7
Haar
LBP
HOG
Haar
LBP
HOG
Haar
LBP
HOG
223
1312
522
462
1461
691
1205
1334
1238
8033
6944
7134
7794
6795
7565
7051
6922
7018
279
618
293
452
998
352
675
818
594
3,71
21,8
8,7
7,7
24,3
11,52
20,08
22,2
20,6
98
71
88
132
107
145
308
237
166
ложно
отрицательных
срабатываний
(false
negatives, FN)
Количество
истинно
положительных
срабатываний
(true
positives, TP)
Количество
ложно
положительных
срабатываний
(false
positives, FP)
Среднее
число
пропущенных
объектов в секунду
(FNa)
Время
обработки
входного кадра (t), мс
Таблица 3.5
Вычисление относительных показателей по данным таблицы 3.4
LG G2
Доля
LG P705 L7
Haar
LBP
HOG
Haar
LBP HOG Haar LBP HOG
97,2
84,1
86,4
94,4
82,3
истинно
положительных
срабатываний
Philips W8510
(true
positives rate, TPR) %
48
91,6
85,4
83,8
85,0
Таблица 3.5 (продолж.)
Доля
ложно
положительных
срабатываний
(false
19,3
42,9
20,3
31,3
69,3
24,4
45,6
56,8
41,25
97,2
84,1
86,4
94,4
82,3
91,6
85,4
83,8
85,0
80,7
57,1
79,7
68,7
30,7
75,6
54,4
43,2
58,75
positives rate, FPR) %
Чувствительность
модели (Sensitivity, Se),
%
Специфичность модели
(Specificity, Sp), %
Данные таблиц 3.2., 3.3, 3.4 и 3.5 указывают на то, что точность
детектирования ухудшается при снижении разрешения входного кадра. Однако
это ухудшение можно считать незначительным в сравнении с уменьшением
времени обработки изображения (почти в 2 раза на смартфоне LG G2 и в 1,3
раза на смартфоне Philips).
3.3. Выводы по результатам тестирования
По полученным в ходе анализа данным сделать вывод о качестве
обученных каскадных классификаторов и о причинах таких результатов, а
также выяснить, какие меры необходимо предпринять для их дальнейшего
улучшения. Также можно сделать выводы о рациональности использования
приложения-детектора, работающего на основе обученных каскадов, в задаче
детектирования пешеходов.
1) Результаты, полученные при тестировании программы на смартфоне
LG P705, показывают, что разработанное приложение следует испытывать
только на устройствах с достаточной вычислительной мощностью для
обеспечения приемлемого быстродействия; в противном случае ни один из
исследуемых методов не сможет обеспечить необходимой точности и быстроты
детектирования;
2)
Искусственное
понижение
разрешения
входного
кадра
дает
удовлетворительный результат: при возникновении необходимости такой
49
способ позволяет достигнуть уменьшения времени обработки изображения при
незначительном ухудшении качества детектирования;
3) Каскадный классификатор, обученный на локальных бинарных
шаблонах, не показал удовлетворительных результатов: при достаточно
высокой вероятности детектирования объекта в видеопотоке (83,4% в среднем),
процент отрицательных примеров, классифицированных как положительные,
недопустимо
высок
(56,3%
в
среднем).
Такой
результат
связан
непосредственно со спецификой алгоритма. Классификатор в том виде, в
котором он представлен в работе, не годится для детектирования объектов на
видео в реальном времени;
4)
Есть
возможность
улучшить
качество
работы
каскадного
классификатора LBP, дополнить или модифицировать алгоритм (например,
использовать бинарный шаблон в форме эллипса). Другим решением станет
применение данного метода к более простой практической задаче (к примеру,
детектирование однотипных объектов или объектов, не меняющих свою
ориентацию).
5) Сравнивая результаты работы приложения при использовании методов
Haar и HOG, можно сделать вывод, что первый показывает лучший процент
верно классифицированных положительных примеров, в то время как второй
обеспечивает меньшую долю ложноположительных примеров. Так как в
конкретной
задаче
детектирования
пешеходов
коэффициент
истинно
положительных случаев более определяющий, классификатор, обученный по
признакам Хаара, является более предпочтительным методом;
6) В целом, каскадный классификатор, обученный на признаках Хаара,
даёт хорошие практические результаты и пригоден для детектирования
пешеходов в реальном времени;
7) Хорошее качество обученного каскадного классификатора Хаара
напрямую связано с применением дополнительных мер по улучшению работы
приложения и внедрением новых решений в стандартную процедуру обучения.
50
Итак, в главе 3 была описана система экспериментов, по результатам
которых была оценена работа приложения, использующего исследуемые
методы. Полученные экспериментальные данные были систематизированы, и
на их основе было произведено сравнение каскадных классификаторов Хаара и
LBP и метода HOG.
51
ЗАКЛЮЧЕНИЕ
В настоящей выпускной квалификационной работе была исследована
процедура обучения каскадного классификатора с целью повышения точности
и
вычислительной
эффективности
алгоритмов
детектирования
текстурированных объектов на видео для мобильных платформ. Данная
проблема была рассмотрена как с теоретической точки зрения, обращаясь к
математическим основам, так и с практической – применительно к задаче
детектирования пешеходов в реальном времени.
Задачи, поставленные в рамках исследования, были решены. Результаты
выглядят следующим образом:
1) Произведен обзор литературы, в ходе которого рассмотрены
существующие методы классификации и проанализирована предметная
область;
2)
Изученный
метод
обучения
каскадного
классификатора
был
реализован в виде приложения для платформы Android;
3) Для разработанного приложения проведена серия экспериментальных
тестов по детектированию пешеходов в реальных условиях.
Работа по реализации метода была произведена в несколько этапов, на
каждом из которых были предложены подходы к решению существующих
проблем детектирования.
Первый
этап
предусматривал
подготовку
обучающей
выборки
изображений. На данном шаге были устранены основные трудности, которые
представляет предметная область:
1) Во-первых, была ослаблена проблема отсутствия эталонного образа
человека и наличия существенных различий в представлении пешехода.
Решением этой проблемы стало комбинирование готовых реалистичных баз
изображений и кадров подлинных записей с видеорегистратора, сделанных в
реальной среде при различных степенях освещенности и в разное время года;
52
2) Во-вторых, была ослаблена проблема, касающаяся трудностей,
которые
представляет
среда
нахождения
детектируемых
объектов.
Обозначенная проблема была решена путем использования частей позитивных
изображений, на которых отсутствует объект, в качестве негативных;
3) В-третьих, была ослаблена проблема многообразия пространственного
расположения объекта, зависимости от ориентации и масштаба. Положительная
выборка была подготовлена таким образом, что на каждом обучающем
положительном
образце
находился
один
только
объект,
по
размеру
совпадающий с размером изображения; для этого создано дополнительное
приложение для быстрой обрезки полного набора позитивных изображений
вручную. Такие меры также способствуют снижению длительности обучения
классификатора и увеличению точности обучения каскадов.
Вторым этапом была проведена процедура тренировки классификаторов.
На этом шаге экспериментальным путем были подобраны оптимальные
параметры обучения, что позволило обучить классификаторы наиболее точно и
эффективно.
На третьем этапе было реализовано полноценное приложение-детектор
для платформы Android, обладающее удобным ннтерфейсом, правильной
архитектурой и способное работать с обученными каскадами обоих типов.
Структура приложения такова, что в нем можно реализовать любой другой
метод детектирования объектов без существенного изменения кода. Так, был
имплементирован метод HOG. Эта мера была необходима для сравнения
методов, использующих каскадные классификаторов Haar и LBP, с другими
способами классификации.
На финальном этапе была предложена экспериментальная система оценки
качества работы приложения. Она включает в себя два теста, условия
проведения
которых
были
максимально
приближены
к
реальным:
детектирование одного объекта и детектирование множества объектов.
53
На основе результатов экспериментального анализа были сделаны
выводы о проведенной работе в целом, а также о рациональности применения
каждого из алгоритмов в задаче детектирования текстурированных объектов на
видео, что и было основной целью в рамках данного исследования. Эти выводы
таковы:
1) Каскадный классификатор, обученный на признаках Хаара, даёт
хорошие практические результаты и пригоден для детектирования пешеходов в
реальном времени благодаря внедрению новых решений в стандартную
процедуру обучения;
2) Метод Haar является более предпочтительным для использования в
задаче детектирования пешеходов, чем метод HOG, так как он обеспечивает
более высокий процент верно классифицированных положительных примеров,
что является ключевым фактором в выборе метода;
3) Каскадный классификатор, обученный на локальных бинарных
шаблонах, не показал удовлетворительных результатов и потому не годится для
детектирования объектов на видео в реальном времени. В работе сделаны
предположения о том, как можно уйти от этой проблемы.
Данное исследование может считаться хорошей базой для дальнейшего
изучения проблем детектирования объектов. Также идеи, представленные в
работе, следует совершенствовать и в других направлениях. Дальнейшую
работу
можно
проводить
в
нескольких
направлениях.
Наиболее
перспективными можно назвать трекинг и предсказание направления движения
объекта. Существует множество алгоритмов и методов, которые можно
применить как к трекингу (Lucas-Kanade, Tomasi-Kanade, Shi-Tomasi-Kanade и
др.), так и к предсказанию (например, использование рекурсивных байесовских
фильтров), а значит, целью будущей работы может стать выбор, модификация и
реализация одного из них применительно к некой практически важной задаче.
54
СПИСОК ЛИТЕРАТУРЫ
1. Binelli E. A modular tracking system for far infrared pedestrian recognition / E.
Binelli, A. Broggi, A. Fascioli, S. Ghidoni, T. Graf, P. Grisleri, M. Meinecke //
Intelligent Vehicles Symposium. - 2005. – pp. 759-764.
2. Chellapilla K. Optimally Combining a Cascade of Classifiers / K. Chellapilla, M.
Shilman, P. Simard // Microsoft Research. - 2007.
3. Chellappa R. Face Tracking and Recognition in Video / R. Chellappa, M. Du, P.
Turaga, S.K. Zhou // Handbook of Face Recognition. – 2011. – pp. 323-351.
4. Dalal N. Histograms of oriented gradients for human detection / N. Dalal, B.
Triggs // Computer Vision and Pattern Recognition. – 2005. – pp. 54-58.
5. Déniza O. Face recognition using Histograms of Oriented Gradients / O. Déniza,
G. Buenoa, J. Salidoa, F. De la Torre // Pattern Recognition Letters. – 2011. – vol.
32. – issue 12. – pp. 1598-1603.
6. Enzweiler M. Monocular Pedestrian Detection: Survey and Experiments / M.
Enzweiler, D.M. Gavrila // IEEE Transactions on Pattern Analysis and Machine
Intelligence. – 2009. - vol. 31. - №12. - pp. 2179-2195.
7. Eveland C. Background modeling for segmentation of video-rate stereo sequences /
C. Eveland, K. Konolige, R.C. Bolles // Computer Vision and Pattern Recognition. –
1998. - pp. 266–271.
8. Felzenszwalb P.F. Cascade Object Detection with Deformable Part Models / P.F.
Felzenszwalb, R.B. Girshick // University of Chicago. - 2010. – pp. 609-618.
9. Felzenszwalb P. A discriminatively trained, multiscale, deformable part model / P.
Felzenszwalb, D. McAllester, D. Ramanan // CVPR Computer Vision and Pattern
Recognition. – 2008. – pp. 120-131.
10. Freund Y. A Short Introduction to Boosting / Y. Freund, R.E. Schapire // Journal
of Japanese Society for Artificial Intelligence. – 1999. – vol.14(5). – pp. 771-780.
11. Gavrila D.M. Multi-cue Pedestrian Detection and Tracking from a Moving
Vehicle / D.M. Gavrila, S. Munder // Computer Vision. - vol.2. - 2006. – pp. 37-49.
55
12. Giang H.Ng. Reduced training of convolutional neural networks for pedestrian
detection / H.Ng. Giang, S.L. Phung // The 6th International Conference on
Information Technology and Applications. – 2009. – pp. 61-66.
13. Haralick R.M. Statistical and Structural Approaches to Texture // Proc. of the
IEEE. – vol. 67. – No. 5. – 1979. – pp. 786-804.
14. Haritauglu I. W S: A real-time system for detecting and tracking people in 2 1/2D
/ I. Haritauglu, D. Harwood, L.S. Davis // European Conference of Computer Vision.
- 1998, pp. 877–892.
15. Huang D. Local Binary Patterns and Its Application to Facial Image Analysis: A
Survey / D. Huang, C. Shan, M. Ardabilian, Y. Wang // IEEE transactions on
Systems, man and cybernetics – part C: Applications and rewiews. – 2011. - vol. 41.
– pp. 765 – 770.
16. James V.Sh. Simultaneous Detection and Segmentation of Pedestrians using Topdown and Bottom-up Processing / V.Sh. James, W. Davis // Dept. of Computer
Science and Engineering. – 2008. – pp. 567-588.
17. Madry M. Unsupervised Learning of Spatio-Temporal Features for Tactile Data /
M. Madry, L. Bo, D. Kragic, D. Fox // IEEE International Conference on Robotics
and Automation. – 2014. – pp. 2262-2269.
18. Martinez-Gil F., Multi-agent Reinforcement Learning for Simulating Pedestrian
Navigation / F. Martinez-Gil, M. Lozano, F. Fernández // Lecture Notes in Computer
Science. – 2012. – vol. 7113. - pp 54-69.
19. McCarthy M. Active Pedestrian Protection / M. McCarthy, I. Simmons // 19th
International Technical Conference on the Enhanced Safety of Vehicles. – 2005.
20. Ojala T. Multiresolution Gray Scale and Rotation Invariant Texture Classification
with Local Binary Patterns / T. Ojala, M. Pietikäinen,T. Mäenpää // Machine Vision
and Media Processing Unit. – 2000.
21. Ouyang W. Modeling Mutual Visibility Relationship in Pedestrian Detection / .
W. Ouyang, X. Zeng, X. Wang // Department of Electronic Engineering. - 2011. – pp.
89-101.
56
22. Ouyang W. Single-Pedestrian Detection aided by Multi-pedestrian Detection / W.
Ouyang, X. Wang // CVPR. – 2013. – pp. 449-460.
23. Sermanet P. Pedestrian Detection with Unsupervised and Multi-Stage Feature
Learning / P. Sermanet, K. Kavukcuoglu, S. Chintala, Y. Lecun // Vision and Pattern
Recognition. – 2012. – pp. 2903-2910.
24. Suneetha J. A survey on Video-based Face Recognition Approaches / J. Suneetha
// International Journal of Application or Innovation in Engineering & Management.
– 2014. – vol. 3 – issue 2. – pp. 208-215.
25. Tang D., Fast Pedestrian Detection by Cascaded Random Forest with Dominant
Orientation Templates / D. Tang, Y. Liu, T.-K. Kim // Department of Electrical
Engineering. – 2012. – pp. 878-890.
26. Tang S. Learning People Detectors for Tracking in Crowded Scenes / S. Tang, M.
Andriluka, A. Milan, K. Schindler, S. Roth, B. Schiele // International Conference on
Computer Vision. - 2013. – pp. 231-235.
27. Tou, J.T. Pattern recognition principles / J.T. Tou, R.C. Gonzalez // Journal of
Applied Mathematics and Mechanics. – 1977. – vol. 57. – pp. 353-354.
28. Viola P. Detecting pedestrians using patterns of motion and appearance / P. Viola,
M. Jones, D. Snow // Proceedings of the 9th International Conference on Computer
Vision. - 2003. – vol. 1. - pp. 734-741.
29. Viola P. M.J. Jones Rapid Object Detection using a Boosted Cascade of Simple
Features / P.Viola, M.J. Jones // Proceedings IEEE Conference on Computer Vision
and Pattern Recognition. - 2001.
30. Walk S. New features and insights for pedestrian detection / S.Walk, N. Majer, K.
Schindler, B. Schiele // Computer Vision and Pattern Recognition. – 2010. – pp. 9099.
31. Wu J. Fast Asymmetric Learning for Cascade Face Detection / J. Wu, S.Ch.
Brubaker, M.D. Mullin, J.M. Rehg // Pattern Analysis and Machine Intelligence. 2008. – 30 с.
57
32. Yudav U. A Survey on Text Recognition from Natural Scene Images and Videos
/ U. Yudav, N. Verma // International Journal of Soft Computing and Engineering. 2015. – vol. 5. - pp. 137-140.
33. Zhang L. Pedestrian detection in infrared images based on local shape features /
L. Zhang, B. Wu, R. Nevatia // Computer Vision and Pattern Recognition. - 2007. –
pp. 245-253.
34. Zhao L. Stereo- and Neural Network-Based Pedestrian Detection / L. Zhao, Ch.E.
Thorpe // IEEE Transactions on intelligent transportation systems. – 2000. - vol. 1, №
3. – pp. 332-354.
35. Вьюгин В.В. Математические основы теории машинного обучения и
прогнозирования / В.В. Вьюгин. - М.: 2013. - 387 с.
36. Инновационные информационные технологии: Материалы международной
научно-практической конференции. / Под ред. С.У.Увайсова; Отв. за вып. И.А.
Иванов, Л.М. Агеева, Д.А. Дубоделова, В.Е. Еремина. – М.:МИЭМ, 2012, 602 с.
37. Казаков А. Быстрый Алгоритм Обнаружения Пешеходов по Видеоданным /
А. Казаков, А. Бовырин // The 22nd International Conference on Computer
Graphics and Vision. - 2012. – pp. 514-523.
38. Местецкий Л. М. Математические методы распознавания образов / Л. М
Местецкий // Курс лекций МГУ, ВМиК, кафедра Математические методы
прогнозирования. - 2002–2004.
58
ПРИЛОЖЕНИЕ А
ИCХОДНЫЙ КОД ПРОГРАММЫ ДЛЯ ПОДГОТОВКИ
ОБУЧАЮЩЕЙ ВЫБОРКИ
1) file “Program.cs”
using
using
using
using
System;
System.Collections.Generic;
System.Linq;
System.Windows.Forms;
namespace PictureCropper {
static class Program {
/// The main entry point for the application.
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
//end of the file//
2) file “Positives.cs”
using
using
using
using
using
using
using
using
using
using
using
using
using
using
using
System;
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Drawing;
System.Linq;
System.Text;
System.Windows.Forms;
Emgu.CV;
Emgu.Util;
Emgu.CV.Structure;
Emgu.CV.Features2D;
Emgu.CV.CvEnum;
Emgu.CV.Util;
System.IO;
namespace Positive{
public partial class Form1 : Form{
public Form1(){
InitializeComponent();
}
List<string> St = new List<string>(); //file addresses
Image<Bgr, Byte> CurentIm; //current image
int currentimg = 0; //# of the current image
string fileadress; //description file address
Point MouseDownStart = new Point();
Image<Bgr, Byte> Crop; //cropped image
private void Form1_Load(object sender, EventArgs e){
FolderBrowserDialog FBD = new FolderBrowserDialog();
59
FBD.SelectedPath = Environment.CurrentDirectory;
if (FBD.ShowDialog() == DialogResult.OK) { //open drectory
string folder = FBD.SelectedPath;
DirectoryInfo thisdir = new DirectoryInfo(folder);
FileInfo[] FI = thisdir.GetFiles();
for (int l = 0; l < FI.Length; l++) //all images in the list
if ((FI[l].Extension == ".jpg") || (FI[l].Extension == ".jpeg") ||
(FI[l].Extension == ".bmp") || (FI[l].Extension == ".png")){
St.Add(FI[l].FullName);
}
CurentIm = new Image<Emgu.CV.Structure.Bgr, byte>(St[currentimg]);
PictureWindow.Image = CurentIm; //current image output
string s = folder + ".dat";
if (File.Exists(s))
File.Delete(s);
fileadress = s;
}
}
private void PictureWindow_MouseDown(object sender, MouseEventArgs e)
{
MouseDownStart = new System.Drawing.Point(e.X, e.Y);
}
private void PictureWindow_MouseUp(object sender, MouseEventArgs e)
{
Point Select = new Point(Math.Min(e.X, MouseDownStart.X), Math.Min(e.Y,
MouseDownStart.Y));
Point Size = new Point(0, 0);
Size.X = Math.Abs(e.X - MouseDownStart.X);
Size.Y = Math.Abs(e.Y - MouseDownStart.Y);
double sx = ((double)CurentIm.Width / (double)PictureWindow.Width);
double sy = ((double)CurentIm.Height / (double)PictureWindow.Height);
Rectangle Rec = new Rectangle((int)(Select.X * sx), (int)(Select.Y * sy),
(int)(Size.X * sx), (int)(Size.Y * sy));
Image<Bgr, Byte> Sel = CurentIm.Clone();
Sel.Draw(Rec, new Bgr(100, 100, 100), 3);
PictureWindow.Image = Sel;
CurentIm.ROI = Rec;
Crop = CurentIm.Clone();
CvInvoke.cvResetImageROI(CurentIm);
}
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == ' ')
{
NewNumber(); //next image
}
if ((e.KeyChar == 's') || (e.KeyChar == 'ы')){
SaveIm(); //save
}
if ((e.KeyChar == 'r') || (e.KeyChar == 'к')){
SaveIm(); //save
NewNumber();//next image
}
}
private void NewNumber(){
if (currentimg + 1 < St.Count){
currentimg += 1;
if (File.Exists(St[currentimg])){
CurentIm = new Image<Emgu.CV.Structure.Bgr, byte>(St[currentimg]);
60
PictureWindow.Image = CurentIm;
}
}
}
private void SaveIm()
{
string s = St[currentimg].Substring(0, St[currentimg].LastIndexOf("\\") + 1) +
"Cropper";
if (!Directory.Exists(s))
System.IO.Directory.CreateDirectory(s);
s = s + St[currentimg].Substring(St[currentimg].LastIndexOf("\\"),
St[currentimg].Length - St[currentimg].LastIndexOf("\\") - 4)
+ DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() +
DateTime.Now.Second.ToString() + ".bmp";
Crop.Save(s);
File.AppendAllText(fileadress, s + " 1 " + "0 0 " + Crop.Width + " " +
Crop.Height + "\r\n");
}
private void PictureWindow_Click(object sender, EventArgs e){
}
}
//end of the file//
61
ПРИЛОЖЕНИЕ Б
ИСХОДНЫЙ КОД ПРИЛОЖЕНИЯ ДЛЯ ДЕТЕКТИРОВАНИЯ
ПЕШЕХОДОВ
1) File “MainActivity.java”
package opencvex.hig.opencvdetect;
import
import
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
org.opencv.android.BaseLoaderCallback;
org.opencv.android.LoaderCallbackInterface;
android.view.View;
android.widget.TextView;
android.content.Intent;
public class MainActivity extends Activity{
private TextView mHelloTextView;
public static String classifierType;
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:// Load native library after(!) OpenCV
initialization
setContentView(R.layout.activity_main);
mHelloTextView = (TextView)findViewById(R.id.mHelloTextView);
break;
default:
super.onManagerConnected(status);
break;
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
mHelloTextView = (TextView)findViewById(R.id.mHelloTextView);
super.onCreate(savedInstanceState);
}
public void onClickHaar(View view) {
mHelloTextView.setText("Haar method is chosen");
classifierType = "Haar";
Intent intent = new Intent(MainActivity.this, VideoActivity.class);
startActivity(intent);
}
public void onClickLBP(View view) {
mHelloTextView.setText("LBP method is chosen");
classifierType = "LBP";
Intent intent = new Intent(MainActivity.this, VideoActivity.class);
startActivity(intent);
}
62
public void onClickHOG(View view) {
mHelloTextView.setText("HOG method is chosen");
Intent intent = new Intent(MainActivity.this, VideoActivity.class);
classifierType = "HOG";
startActivity(intent);
}
}//end of the file//
2) File “VideoActivity.java”
package opencvex.hig.opencvdetect;
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
android.app.Activity;
android.content.Context;
android.os.Bundle;
android.util.Log;
org.opencv.android.BaseLoaderCallback;
org.opencv.android.CameraBridgeViewBase;
org.opencv.android.LoaderCallbackInterface;
org.opencv.android.OpenCVLoader;
org.opencv.core.CvType;
org.opencv.core.Mat;
org.opencv.core.MatOfRect;
org.opencv.imgproc.Imgproc;
android.view.WindowManager;
org.opencv.android.*;
org.opencv.android.CameraBridgeViewBase.CvCameraViewListener;
java.io.File;
java.io.InputStream;
public class VideoActivity extends Activity implements CvCameraViewListener {
private int screen_w, screen_h;
private CameraBridgeViewBase openCvCameraView;
private Mat grayscaleImage;
private Mat mGrey;
DetectionActivity detection = new DetectionActivity();
public static InputStream is;
public static File mCascadeFile;
public static File cascadeDir;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
openCvCameraView = new JavaCameraView(this, -1);
setContentView(openCvCameraView);
openCvCameraView.setCvCameraViewListener(this);
}
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:// Load native library after(!) OpenCV
initialization
if
(MainActivity.classifierType
==
"Haar"
||
MainActivity.classifierType == "LBP") {
classifierType(MainActivity.classifierType);
detection.load_cascade();// Copy the resource into a temp file so
OpenCV can load it
openCvCameraView.enableView();//go
63
} else {
openCvCameraView.enableView();//go
}
break;
default:
super.onManagerConnected(status);
break;
}
}
};
@Override
public Mat onCameraFrame(Mat aInputFrame) {
Imgproc.cvtColor(aInputFrame, grayscaleImage, Imgproc.COLOR_RGBA2RGB); // Create a
grayscale image
MatOfRect pedestrians = new MatOfRect();
if (screen_w >= 1920 & screen_h >= 1080) {
detection.low_resolution(aInputFrame);//use the func to reduce resolution
}
if (MainActivity.classifierType == "Haar" || MainActivity.classifierType == "LBP") {
detection.cascadeDetector(aInputFrame, grayscaleImage, pedestrians);
} else {
detection.hogDetector(aInputFrame, grayscaleImage, pedestrians);
}
return aInputFrame;
}
@Override
public void onResume() {
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_9, this, mLoaderCallback);
}
@Override
public void onDestroy() {
super.onDestroy();
if (openCvCameraView != null)
openCvCameraView.disableView();
}
@Override
public void onCameraViewStarted(int width, int height) {
screen_w = width;
screen_h = height;
grayscaleImage = new Mat(height, width, CvType.CV_8UC4);
mGrey = new Mat(screen_w, screen_h, CvType.CV_8UC1);
Log.v("MyActivity","Height: "+height+" Width: "+width);
}
@Override
public void onCameraViewStopped() {
grayscaleImage.release();
}
public void classifierType(String classifierType){
switch (classifierType) {
// Copy the resource into a temp file so OpenCV
can load it
case "Haar":
is = getResources().openRawResource(R.raw.cascade);
cascadeDir = getDir("cascade", Context.MODE_PRIVATE);
mCascadeFile = new File(cascadeDir, "cascade.xml");
break;
case "LBP":
64
is = getResources().openRawResource(R.raw.lbpcascade);
cascadeDir = getDir("cascade", Context.MODE_PRIVATE);
mCascadeFile = new File(cascadeDir, "lbpcascade.xml");
break;
default:
break;
}
}
}//end of the file//
3) File “DetectionActivity.java”
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
android.app.Activity;
android.util.Log;
org.opencv.android.CameraBridgeViewBase;
org.opencv.core.Core;
org.opencv.core.CvType;
org.opencv.core.Mat;
org.opencv.core.MatOfRect;
org.opencv.core.Rect;
org.opencv.core.Scalar;
org.opencv.core.Size;
org.opencv.imgproc.Imgproc;
org.opencv.objdetect.CascadeClassifier;
java.io.FileOutputStream;
java.util.List;
org.opencv.core.MatOfDouble;
org.opencv.core.MatOfFloat;
org.opencv.core.Point;
org.opencv.objdetect.HOGDescriptor;
public class DetectionActivity extends Activity {
private
private
private
private
private
int screen_w, screen_h;
CascadeClassifier cascadeClassifier;
Mat grayscaleImage;
Mat mGrey;
int absoluteFaceSize;
// VideoActivity videoactivity = new VideoActivity();
public void load_cascade() {
try {
//videoactivity.classifierType(classifierType);
FileOutputStream os = new FileOutputStream(VideoActivity.mCascadeFile);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = VideoActivity.is.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead);
}
VideoActivity.is.close();
os.close();
cascadeClassifier = new
CascadeClassifier(VideoActivity.mCascadeFile.getAbsolutePath());// Load the cascade classifier
} catch (Exception e) {
Log.e("MainActivity", "Error loading cascade", e);
}
if(cascadeClassifier.empty()) {
Log.v("MyActivity","--(!)Error loading A\n");
65
return;
}
else{
Log.v("MyActivity", "Loaded cascade classifier");
}
}
public Mat hogDetector(Mat aInputFrame, Mat grayscaleImage, MatOfRect faces){
HOGDescriptor hog = new HOGDescriptor();
MatOfFloat descriptors = HOGDescriptor.getDefaultPeopleDetector();
hog.setSVMDetector(descriptors);
MatOfDouble weights = new MatOfDouble();
hog.detectMultiScale(grayscaleImage, faces, weights
Point rectPoint1 = new Point();
//Переменные для выделения областей на
фотографии
Point rectPoint2 = new Point();
Scalar fontColor = new Scalar(0, 0, 0);
Point fontPoint = new Point();
if (faces.rows() > 0) {
List<Rect> rectangles = faces.toList();
int i = 0;
List<Double> weightList = weights.toList();
for (Rect rect : rectangles) {
float weigh = weightList.get(i++).floatValue();
rectPoint1.x = rect.x;
rectPoint1.y = rect.y;
fontPoint.x = rect.x;
fontPoint.y = rect.y - 4;
rectPoint2.x = rect.x + rect.width;
rectPoint2.y = rect.y + rect.height;
final Scalar rectColor = new Scalar(0, 0, 0);
Core.rectangle(aInputFrame, rectPoint1, rectPoint2, rectColor, 2);//
Core.putText(aInputFrame,
String.format("%1.2f", weigh),
fontPoint, Core.FONT_HERSHEY_PLAIN, 1.5, fontColor,
2, Core.LINE_AA, false);
}
}
return aInputFrame;
}
public Mat cascadeDetector (Mat aInputFrame, Mat grayscaleImage, MatOfRect faces) {
if (cascadeClassifier != null) {// Use the classifier to detect faces
cascadeClassifier.detectMultiScale(grayscaleImage, faces, 1.1, 2, 2,
new Size(absoluteFaceSize, absoluteFaceSize), new Size());//
}
Rect[] facesArray = faces.toArray(); // If there are any faces found, draw a
rectangle around it
for (int i = 0; i < facesArray.length; i++)
Core.rectangle(aInputFrame, facesArray[i].tl(), facesArray[i].br(), new
Scalar(0, 255, 0, 255), 3);
return aInputFrame;
}
public Mat low_resolution(Mat aInputFrame){
Imgproc.resize(aInputFrame, aInputFrame, new Size(), 0.5, 0.5,
Imgproc.INTER_LINEAR);
Imgproc.equalizeHist(aInputFrame, aInputFrame);
return aInputFrame;
}
66
}//end of the file
4) File “activity_main.xml”
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:paddingBottom="16dp"
tools:context=".MainActivity"
android:weightSum="1"
android:background="@color/material_blue_grey_800">
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/haarbuttonbig"
android:layout_below="@+id/mHelloTextView"
android:layout_centerHorizontal="true"
android:layout_marginTop="34dp"
android:onClick="onClickHaar"/>
<TextView
android:id="@+id/mHelloTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/greeting"
android:textAppearance="?android:attr/textAppearanceLarge"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="27dp"
android:textColor="@color/greetingtext_color" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton2"
android:src="@drawable/lbpbuttonbig"
android:onClick="onClickLBP"
android:layout_below="@+id/imageButton"
android:layout_alignLeft="@+id/imageButton"
android:layout_alignStart="@+id/imageButton"
android:layout_marginTop="28dp" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton3"
android:layout_marginTop="32dp"
android:src="@drawable/hogbuttonbig"
android:onClick="onClickHOG"
android:layout_below="@+id/imageButton2"
android:layout_alignRight="@+id/imageButton"
android:layout_alignEnd="@+id/imageButton" />
</RelativeLayout>
//end of the file//
67
5) File “land\activity_main.xml”
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:background="@color/material_blue_grey_800"
android:layout_height="match_parent"
android:weightSum="1">
<LinearLayout
android:orientation="vertical"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_gravity="center"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:background="@color/material_blue_grey_800">
<TableLayout
android:background="@color/material_blue_grey_800"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="center"
android:stretchColumns="*">
<TableRow>
<TextView
android:id="@+id/mHelloTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/greeting2"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="@color/greetingtext_color" />
</TableRow>
<TableRow>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/haarbuttonbig"
android:layout_marginTop="34dp"
android:onClick="onClickHaar"
android:background="@color/dark_button_background2" />
</TableRow>
<TableRow></TableRow>
<TableRow></TableRow></TableLayout>
</LinearLayout>
<ImageButton
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/imageButton2"
android:src="@drawable/lbpbuttonbig"
android:onClick="onClickLBP"
android:background="@color/dark_button_background2"
android:layout_marginTop="18dp" />
<ImageButton
android:layout_width="match_parent"
android:layout_height="match_parent"
68
android:id="@+id/imageButton3"
android:src="@drawable/hogbuttonbig"
android:onClick="onClickHOG"
android:background="@color/dark_button_background2"
android:layout_marginTop="5dp" />
</LinearLayout>
//end of the file//
6) File “AndroidManifest.xml”
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="opencvsranyindk.hig.opencvpodkluch">
android:versionCode="19"
android:versionName="2.1">
<supports-screens android:resizeable="true"
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:anyDensity="true" />
<uses-sdk android:minSdkVersion="8"
android:targetSdkVersion="10" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
<uses-feature android:name="android.hardware.camera.autofocus"
android:required="false"/>
<uses-feature android:name="android.hardware.camera.front" android:required="false"/>
<uses-feature android:name="android.hardware.camera.front.autofocus"
android:required="false"/>
<application
android:allowBackup="true"
android:label="@string/app_name"
android:icon="@drawable/ic_launcher"
android:theme="@style/AppTheme">
<activity android:name="MainActivity">
android:label="@string/app_name"
android:screenOrientation="landscape"
android:configChanges="keyboardHidden|orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".VideoActivity"
android:label="video_title">
</activity>
<activity android:name=".DetectionActivity"
android:label="det_title">
</activity>
</application>
</manifest>
//end of the file//
69
Download