Advertisement
Guest User

Untitled

a guest
Mar 26th, 2019
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Latex 26.76 KB | None | 0 0
  1. % Тут используется класс, установленный на сервере Papeeria. На случай, если
  2. % текст понадобится редактировать где-то в другом месте, рядом лежит файл matmex-diploma-custom.cls
  3. % который в момент своего создания был идентичен классу, установленному на сервере.
  4. % Для того, чтобы им воспользоваться, замените matmex-diploma на matmex-diploma-custom
  5. % Если вы работаете исключительно в Papeeria то мы настоятельно рекомендуем пользоваться
  6. % классом matmex-diploma, поскольку он будет автоматически обновляться по мере внесения корректив
  7. %
  8.  
  9. % По умолчанию используется шрифт 14 размера. Если нужен 12-й шрифт, уберите опцию [14pt]
  10. \documentclass[14pt]{matmex-diploma}
  11. %\documentclass[14pt]{matmex-diploma-custom}
  12. \usepackage{amsmath}
  13.  
  14.  
  15. \begin{document}
  16. % Год, город, название университета и факультета предопределены,
  17. % но можно и поменять.
  18. % Если англоязычная титульная страница не нужна, то ее можно просто удалить.
  19. \filltitle{ru}{
  20.    chair              = {Кафедра информационно-аналитических систем},
  21.    title              = {Разработка и улучшение алгоритма построения тепловых карт},
  22.     % Здесь указывается тип работы. Возможные значения:
  23.     %   coursework - Курсовая работа
  24.     %   diploma - Диплом специалиста
  25.     %   master - Диплом магистра
  26.     %   bachelor - Диплом бакалавра
  27.     type               = {bachelor},
  28.    position           = {студента},
  29.    group              = 441,
  30.    author             = {Машарский Станислав Сергеевич},
  31.    supervisorPosition = {к. ф.-м. н., доцент},
  32.    supervisor         = {Михайлова Е. Г.},
  33.    reviewerPosition   = {Старший специалист по тестированию},
  34.    reviewer           = {Бухмастов Д. С.},
  35.    university         = {Санкт-Петербургский Государственный Университет},
  36.    faculty            = {Математико-механический факультет},
  37.    city               = {Санкт-Петербург},
  38.    year               = {2019}
  39. }
  40. \filltitle{en}{
  41.    type               = {bachelor},
  42.    chair              = {Dept. of Analytical Information Systems},
  43.    title              = {Development and improvement of the heat mapping algorithm},
  44.    faculty            = {Mathematics and Mechanics Faculty},
  45.    author             = {Stanislav Masharskii},
  46.    supervisorPosition = {Associate professor},
  47.    supervisor         = {Elena Mikhailova},
  48.    reviewerPosition   = {Senior QA \& Testing Analyst},
  49.    reviewer           = {Dmitry Bukhmastov},
  50.    year               = {2019}
  51. }
  52. \maketitle
  53. \tableofcontents
  54.  
  55.  
  56.  
  57. % У введения нет номера главы
  58. \section*{Введение}
  59. В настоящее время собирается очень большое количество данных,
  60. которые можно как-то анализировать и использовать.
  61. Делать это вручную долго и утомительно, поэтому учёные разрабатывают
  62. различные алгоритмы, агрегирующие каким-то образом эти данные в
  63. данные меньшего объёма, которые анализировать проще.
  64. Например, предприятия хотят знать о наиболее популярных местах
  65. передвижений людей по своей территории, в таких местах обычно
  66. устанавливаются видеокамеры.
  67.  
  68. С помощью анализа мест наибольшей активности,
  69. можно определить наиболее популярные места передвижения клиентов, покупателей
  70. и в связи с этим сделать перепланировку таким образом, чтобы пока человек
  71. идёт к самому популярному отделу (магазину), проходил мимо наибольшего количества других
  72. отделов (магазинов), на которых размещена реклама, и тем самым создавая
  73. ситуацию, в которой человек с б\'ольшей вероятностью купит что-то ещё в местах
  74. по пути.
  75.  
  76. Анализ видеозаписей непосредственно
  77. людьми является очень трудозатрантым прицессом.
  78. В данной работе был разработан алгоритм,
  79. который будет агрегировать видеозаписи в данные меньшего размера,
  80. а именно в то, сколько движений происходило за период времени
  81. в той или иной области съёмки.
  82.  
  83.  
  84.  
  85. \section{План работы}
  86. Целью работы является разработка алгоритма, агрегирующего данные с видеозаписей
  87. таким образом, чтобы можно было легко узнать и увидеть,
  88. в какой области происходило больше движений людей.
  89.  
  90. Для достижения цели были поставлены задачи:
  91. \begin{enumerate}
  92.    \item Разработка алгоритма
  93.    \begin{enumerate}
  94.        \item Разработка алгоритма обнаружения движений
  95.        \item Разработка алгоритма нейтрализации помех
  96.    \end{enumerate}
  97.    \item Ускорение алгоритма
  98. \end{enumerate}
  99.  
  100.  
  101.  
  102. \section{Разработка алгоритма}
  103. Был разработан алгоритм, агрегирующий в каждом пикселе исходной
  104. видеозаписи количество движений, происходивших в нём.
  105.  
  106. Для работы с видео и обработки кадров из него была выбрана популярная
  107. библиотека OpenCV, написанная на C++ и предоставляющая функции для работы
  108. с изображениями и видео на этом языке. На данный момент она предоставляет
  109. наибольший функционал.
  110.  
  111.  
  112.  
  113. \newpage
  114. \subsection{Обнаружение движений}
  115. Вся информация о видеофайле и кадры из него считываются программой спомощью
  116. соответствующих методов из библиотеки OpenCV.
  117. В начале алгоритма заводится двумерный массив $\mathtt{Counters}$ такого же размера,
  118. как разрешение видеозаписи, и заполняется нулями.
  119.  
  120. Для определения наличия движения на видеозаписи рассматривается
  121. симметрическая разность двух последовательно идущих кадров.
  122. Далее применяется фильтр binary thresholding \cite{opencv:tutorial_threshold},
  123. который делает следующее:
  124.  
  125.  
  126. \[ \mathtt{dst} (x, y) = \left\{
  127. \begin{array}{ll}
  128. \mathtt{maxVal} & \textrm{если } \mathtt{src} (x, y) > \mathtt{thresh} \textrm{,}\\
  129. 0 & \textrm{иначе.}
  130. \end{array}
  131. \right. \]
  132.  
  133. где $x$ -- номер пикселя по горизонтали,
  134. $y$ -- номер пикселя по вертикали,
  135. $\mathtt{thresh}$ -- планка, которую должна превосходить интенсивность каждого канала в пикселе,
  136. $\mathtt{maxVal}$ -- значение, которое присваивается пиклесям, преодолевшим планку,
  137. в данном алгоритме это $255$,
  138. $\mathtt{src}$ -- исходное изображение,
  139. $\mathtt{dst}$ -- результирующее изображение.
  140.  
  141. Здесь важно отметить, что если $src$ был многоканальным изображением,
  142. то $\mathtt{dst}$ -- это уже однокональное изображение, в котором пиксели бывают
  143. только интенсивности $0$ либо $255$, т.е. изображение даже бинарное
  144. и к нему можно будет применять соответствующие алгоритмы.
  145.  
  146. Для выделения областей активности, то есть тех областей, в которых теперь
  147. интенсивность пикселя $255$, применяется алгоритм поиска контуров \cite{find_contours}.
  148. Каждый контур -- это набор точек, задающих полигон при последовательном соединении.
  149. Затем для каждого контура применяем алгоритм поиска выпуклой оболочки \cite{convex_hull},
  150. возвращающий набор точек, при последовательном соединении которых получается
  151. выпуклый многоугольник, ограничивающий контур.
  152. Данная выпуклая оболочка считается местом, в котором происходило движение.
  153.  
  154. Осталось только инкрементировать значение счётчиков в матрице $\mathtt{Counters}$
  155. на соответствующих позициях.
  156.  
  157. Чтобы это сделать, нужно будет пройтись по каждому
  158. пикселю $(x, y)$ и если точка лежит в выпуклой оболочке
  159. (проверяется за $O(k)$, где $k$ -- количество точек в оболочке,
  160. проходом по направлению "по часовой стрелке" по каждому ребру и проверкой,
  161. что точка "правее" ребра). Такой подход потребует $\mathcal{O} \left(w \cdot h \cdot \sum\limits_{c \in C} \lVert c \rVert \right)$
  162. операций, где $w$ -- количество пикселей по вертикали,
  163. $h$ -- количество пикселей по горизонтали,
  164. $C$ -- множество найденных выпуклых оболочек.
  165. $h$ и $w$ могут быть довольно велики, например при разрешении видеозаписи
  166. 1920x1080 px произведение $w \cdot h$ из асимптотики будет примерно $2$ миллиона,
  167. что непозволительно много.
  168.  
  169. Ввиду вышесказанного перед записью результатов для каждой выпуклой оболочки
  170. ищется обрамляющий её прямоугольник, с которым сильно проще работать.
  171. Прямоугольники ищутся за $\mathcal{O} \left(\sum\limits_{c \in C}{\lVert c \rVert} \right)$.
  172. Затем проходимся по каждому прямоугольнику (по каждой строке в нём)
  173. и инкрементируем значения счётчиков $\mathtt{Counters}$ в соответствующих точках.
  174. Данный подход потребует $\mathcal{O} \left(\sum\limits_{c \in C}{\lVert c \rVert} + \sum\limits_{p \in P} S(p) \right)$,
  175. где $C$ -- множество найденных выпуклых оболочек,
  176. $P$ -- множество ограничивающих выпуклые оболочки прямоугольников,
  177. $S(p)$ -- площадь прямоугольника $p$, то есть количество пикселеё в нём.
  178. Такой подход сильно более эффективен, особенно если выпуклых оболочек было
  179. найдено не много и их площадь сильно меньше площади всего кадра.
  180.  
  181.  
  182.  
  183. \newpage
  184. \subsection{Нейтрализация помех}
  185. Для нейтрализации шума на изображении, к каждому кадру применяется размытие,
  186. то есть усреднение определённым образом значения интенсивности в пикселе
  187. с учётом значений в соседних пикселях.
  188.  
  189. Как компромиссное решение для быстрого и плавного сглаживания было выбрано
  190. размытие gaussian blur \cite{gaussian_blur_1} \cite{gaussian_blur_2}
  191. c ядром $5$ на $5$ пикселей, то есть усредняться значение
  192. интенсивностей каналов в пиклелях будет с учётом
  193. соседних $24$-х пикселей, стоящих вокруг текущего.
  194.  
  195. Значения интенсивностей пикселей в обработанном изображении вычисляется
  196. по следующей формуле:
  197.  
  198. $G(x, y) = \frac{1}{2\pi\sigma^2} e^{(-\frac{x^2+y^2}{2\sigma^2})}$,
  199.  
  200. где $x$ -- координата текущего пикселя по горизонтали,
  201. $y$ -- координата текущего пикселя по вертикали,
  202. $\sigma$ -- параметр сглаживания и автоматически вычисляется при заданном размере ядра.
  203.  
  204.  
  205. \vspace{\baselineskip}
  206. На видеозаписях также есть более сильные помехи, иногда на изображении
  207. размера 1920x1080 px появляются на один кадр совершенно другие блоки
  208. случайно расположенные и размера примерно 40x40 px, похожие на такое:
  209. % Здесь вставить снимок с кучей крупных шумов
  210.  
  211. Чтобы они не учитывались,
  212. после рассмотрения абсолютной разности между кадрами и binary thresholding
  213. к полученному изображению применяются последовательно несколько раз
  214. две фундаментальные операции в морфологической обработке изображений:
  215. erosion и dilation \cite{opencv:tutorial_erosion_and_dilation}. % нужно больше ссылок
  216.  
  217. Erosion -- это морфология "разъедание", будем использовать её с заданным ядром
  218. размера $n$ на $n$, в центре которого стоит текущий пиксель.
  219. Значения в результирующем изображении получаются с помощью следующей формулы:
  220.  
  221. $$\mathtt{dst} (x, y) = \min\limits_
  222.    {\substack{\lvert x' \rvert \leq \lfloor n/2 \rfloor \\
  223.               \lvert y' \rvert \leq \lfloor n/2 \rfloor}}
  224.    \mathtt{src} (x + x', y + y')$$
  225. где где $x$ -- номер пикселя по горизонтали,
  226. $y$ -- номер пикселя по вертикали,
  227. $\mathtt{src}$ -- исходное изображение,
  228. $\mathtt{dst}$ -- результирующее изображение.
  229. Пиксель, который в исходном изображении был $255$ останется таковым
  230. только если значения всех остальных пикселей в ядре будут тоже $255$.
  231. Если там был хоть один нулевой, значение в текущем пикселе обнуляется.
  232. Таким образом, отбрасываются пиксели вблизи границы в зависимости от размера ядра,
  233. все обьёкты становятся меньше (тоньше), а очень маленькие исчезают целиком.
  234. Dilation -- это морфология "раздутие", будем использовать её с заданным ядром
  235. размера $n$ на $n$, в центре которого стоит текущий пиксель.
  236. Значения в результирующем изображении получаются с помощью следующей формулы:
  237. \vspace{\baselineskip}
  238. Сначала применяется dilation (раздутие), потом erosion (сжатие) с одинаковым ядром,
  239. шумовые пятна расширятся и сожмутся обратно.
  240. Если в областях, где были движения людей, в некоторых пикселях или маленьких
  241. подобластях были пропуски (внутри облака движения есть точки нераспознанного движения),
  242. то они тоже примут значение $255$, то есть облако движения будет содержать
  243. внутри только пиксели со значением $255$, без $0$.
  244.  
  245. % Здесь нужны картинки
  246.  
  247. Теперь нужно примерить морфологии в обратном порядке, erosion и dilation с одинаковым ядром.
  248. Так как области движения людей сильно больше, чем шумовые пятна, то после
  249. erosion они только уменьшатся, в то время как шумовые пятна исчезнут.
  250. После dilation области движения людей восстановятся до прежних размеров
  251. и будут примерно такие же, как до этого шага, шумовые пятна не восстановятся.
  252.  
  253. % Здесь нужны картинки
  254.  
  255.  
  256.  
  257. \newpage
  258. \subsection{Результаты алгоритма}
  259. В итоге получается двумерный массив такого же размера,
  260. как и расширение видеозаписи с камеры,
  261. в котором каждый элемент хранит в себе то, сколько раз было зафиксировано
  262. движение в этом пикселе.
  263. По данной матрице можно производить анализ движения людей,
  264. накладывая её на изображение с камеры.
  265. Можно генерировать картинку, которая будет показывать где происходит больше
  266. движений, можно сравнивать количество движений в том или ином
  267. месте за промежуток времени по сравнению с данными со всех остальных камер.
  268.  
  269.  
  270.  
  271. \section{Ускорение алгоритма}
  272. Так как на обнаружение движения людей не влияет цвет видео, а чёрно-белые
  273. изображения содержат в $3$ раза меньший объём информации и, следовательно,
  274. могут обрабатываться в $3$ раза быстрее, сначала каждый получаемый из видео
  275. кадр проходит через фильтр и становится чёрно-белым. Для этого используеся
  276. специальный фильтр из библиотеки OpenCV.
  277.  
  278. Значения интенсивности цвета в пикселе в результирующем чёрно-белом изображении
  279. вычисляется по формуле:
  280.  
  281. $newValue = 0.299 \cdot R + 0.587 \cdot G + 0.114 \cdot B$
  282.  
  283. где $newValue$ -- интенсивность цвета в новом, обработанном изображении,
  284. $R, G, B$ -- интенсивности красного, зелёного и синего каналов,
  285. которые были в изображении соответственно.
  286.  
  287. Для уменьшения влияния помех на результат и лучшего выявления движения людей,
  288. а также для ускорения алгоритма, рассматривается
  289. разность не двух соседних кадров, а стоящих через каждые
  290. $10$ кадров. Таким образом, обрабатываются кадры, по времени отстоящие не на
  291. $\frac{1}{24}$ секунды, а на $\frac{5}{12}$ секунды,
  292. что примерно равняется половине секунды и приемлемо для выявления движения людей.
  293.  
  294. Б\'oльшая часть обработки изображений производится на видеокарте с помощью
  295. технологии CUDA, но на данный момент считывание кадров из видезаписи с диска,
  296. поиск контура и выпуклой оболочки осуществляются процессором
  297. в связи с отсутствием их реализации в OpenCV с помощью CUDA.
  298.  
  299. % У заключения нет номера главы
  300. \section{Заключение}
  301.  
  302. Был разработан устойчивый к шумам алгоритм построения тепловой карты
  303. для записи с камеры видеонаблюдения, использующий видеокарту
  304. для почти всей обработки изображений, агрерирующий количество движений
  305. на видеозаписи в каждом пикселе.
  306.  
  307. Алгоритм реализован в виде проекта на языке C++, принимает на вход имя файла
  308. (видеозаписи), анализирует данные и записывает результаты в новый файл
  309. в том же каталоге, что и запущенная программа.
  310.  
  311. В чём недостатки такого алгоритма. Сложно распознавать людей, которые стоят неподвижно;
  312. нет данных об уникальности людей; есть данные только за весь промежуток времени,
  313. но не за его часть, то есть если видеозапись за неделю, то нельзя будет узнать
  314. статистику конкретно за вторник, или за вечер среды.
  315.  
  316. Первые две проблемы планируется решать с помощью нейронных сетей,
  317. последнюю с помощью префиксного массива сумм
  318. % не могу найти ни одной статьи с описанием использования
  319. % префиксных сумм для вычисления сумм подмассивов
  320. , состоящий из агрегированных с
  321. интервалом в час данных.
  322.  
  323. \setmonofont[Mapping=tex-text]{CMU Typewriter Text}
  324. \bibliographystyle{ugost2008ls}
  325. \bibliography{diploma.bib}
  326. \end{document}
  327.  
  328.  
  329. @book{saturday_is_monday,
  330.  author    = "Стругацкий, А.Н. and Стругацкий, Б.Н.",
  331.  title     = "Понедельник начинается в субботу",
  332.  address   = "М.",
  333.  editor    = "Иванов",
  334.  publisher = "Детская литература",
  335.  year      = 1965,
  336.  language  = "russian"
  337. }
  338. @book{book:fourier,
  339.  title      = {Ряды и интеграл Фурье: Теория поля. Аналитические и специальные функции. Преобразование Лапласа},
  340.  author     = {Кожевников, Н.И. and Краснощекова, Т.И. and Шишкин, Н.Е.},
  341.  lccn       = {66051327},
  342.  series     = {Избранные главы высшей математики для инженеров и студентов втузов. Задачи и упражнения},
  343.  url        = {http://books.google.ru/books?id=xvXuAAAAMAAJ},
  344.  year       = {1964},
  345.  publisher  = {Наука},
  346.  eprint     = {http://books.google.ru/books?id=xvXuAAAAMAAJ},
  347.  eprinttype = {Google Books}
  348. }
  349.  
  350. @online{opencv:tutorial_erosion_and_dilation,
  351.  author       = "OpenCV",
  352.  title        = "Eroding and Dilating",
  353.  url          = {https://docs.opencv.org/3.4/db/df6/tutorial_erosion_dilatation.html},
  354.  urldate      = "16.12.2018",
  355.  language     = "english"
  356. }
  357. @online{opencv:tutorial_threshold,
  358.  author       = "OpenCV",
  359.  title        = "Basic Thresholding Operations",
  360.  url          = {https://docs.opencv.org/3.4/db/d8e/tutorial_threshold.html},
  361.  urldate      = "16.12.2018",
  362.  language     = "english"
  363. }
  364.  
  365. @article{find_contours,
  366.  author    = "Satoshi Suzuki and others",
  367.  title     = "Topological structural analysis of digitized binary images by border following",
  368.  journal   = "Computer Vision, Graphics, and Image Processing",
  369.  pages     = "30(1):32–46",
  370.  year      = 1985,
  371.  language  = "english"
  372. }
  373. @article{convex_hull,
  374.  author    = "Jack Sklansky",
  375.  title     = "Finding the convex hull of a simple polygon",
  376.  journal   = "Pattern Recognition Letters",
  377.  pages     = "1(2):79–83",
  378.  year      = 1982,
  379.  language  = "english"
  380. }
  381. @article{gaussian_blur_1,
  382.  author    = "Shapiro, L. G. \& Stockman",
  383.  title     = "G. C: "Computer Vision"",
  384.  journal   = "Prentice Hall",
  385.  pages     = "137, 150",
  386.  year      = 2001,
  387.  language  = "english"
  388. }
  389. @article{gaussian_blur_2,
  390.  author    = "Mark S. Nixon and Alberto S. Aguado",
  391.  title     = "Feature Extraction and Image Processing",
  392.  journal   = "Academic Press",
  393.  pages     = "88",
  394.  year      = 2008,
  395.  language  = "english"
  396. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement