20
Ruby && OpenCV Computer Vision Intro ( интерпретация изображений, калибровка камеры по эталону, устранение оптических искажений, определение сходства, анализ перемещения объекта, определение формы объекта и слежение за объектом, 3D-реконструкция, сегментация объекта, распознавание жестов )

“ComputerVision(Ruby && OpenCV)”, Людмила Дежкина ( Senior Ruby, DataArt)

Embed Size (px)

Citation preview

Page 1: “ComputerVision(Ruby && OpenCV)”, Людмила Дежкина ( Senior Ruby, DataArt)

Ruby && OpenCV

Computer Vision Intro(интерпретация изображений, калибровка камеры по эталону, устранение оптических искажений, определение

сходства, анализ перемещения объекта, определение формы объекта и слежение за объектом, 3D-реконструкция,

сегментация объекта, распознавание жестов )

Page 2: “ComputerVision(Ruby && OpenCV)”, Людмила Дежкина ( Senior Ruby, DataArt)

Лена Седерберг 1972

Page 3: “ComputerVision(Ruby && OpenCV)”, Людмила Дежкина ( Senior Ruby, DataArt)

Использование1. Google

Google Glass

Google Mobile

2. Робототехника и Arduino

3. Промышленное производство

Page 4: “ComputerVision(Ruby && OpenCV)”, Людмила Дежкина ( Senior Ruby, DataArt)

Сложно или интересно?

1) Big Data? (Google Car 1 Гб/с , человеческий мозг ~ 45 Мб - 3Гб)

2) Алгоритмы? (тензоры, фильтрация)3) DeepLearning , MachineLearning

Page 5: “ComputerVision(Ruby && OpenCV)”, Людмила Дежкина ( Senior Ruby, DataArt)

Из чего состоит ядро?

Page 6: “ComputerVision(Ruby && OpenCV)”, Людмила Дежкина ( Senior Ruby, DataArt)

CXCORE

* содержит базовые структуры данных и алгоритмы:

— базовые операции над многомерными числовыми массивами

— матричная алгебра, математические ф-ции, генераторы случайных чисел

— Запись/восстановление структур данных в/из XML

— базовые функции 2D графики

Page 7: “ComputerVision(Ruby && OpenCV)”, Людмила Дежкина ( Senior Ruby, DataArt)

CVмодуль обработки изображений и компьютерного зрения

— базовые операции над изображениями (фильтрация, геометрические преобразования, преобразование цветовых пространств и т. д.)

— анализ изображений (выбор отличительных признаков, морфология, поиск контуров, гистограммы)

— анализ движения, слежение за объектами

— обнаружение объектов, в частности лиц

— калибровка камер, элементы восстановления пространственной структуры

Page 8: “ComputerVision(Ruby && OpenCV)”, Людмила Дежкина ( Senior Ruby, DataArt)

CVCAM CVAUX HIGHGUIHighgui — модуль для ввода/вывода изображений и видео, создания пользовательского интерфейса

— захват видео с камер и из видео файлов, чтение/запись статических изображений.

— функции для организации простого UI (все демо приложения используют HighGUI)

Cvaux — экспериментальные и устаревшие функции

— пространств. зрение: стерео калибрация, само калибрация

— поиск стерео-соответствия, клики в графах

— нахождение и описание черт лица

Page 9: “ComputerVision(Ruby && OpenCV)”, Людмила Дежкина ( Senior Ruby, DataArt)

Примеры патентов или стартапов?1) Виртуальная примерочная(17%

продаж за 2015 г)

http://zugara.com/virtual-dressing-room-technology

2) Распознавание автомобильных номеров (алгоритмы или нейронная сеть?)

Page 10: “ComputerVision(Ruby && OpenCV)”, Людмила Дежкина ( Senior Ruby, DataArt)

Нейронные сети (механизмы обучения)

1) TensorFlow (Google)2) Theano, PyLearn2 && EcoSystem3) Torch4) Caffehttp://deeplearning4j.org/compare-dl4j-torch7-pylearn.html

Page 11: “ComputerVision(Ruby && OpenCV)”, Людмила Дежкина ( Senior Ruby, DataArt)

Трудности построения системы1) Soft vs Железо2) Алгоритм vs Нейронная Сеть Tesseract OCR

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

K-nearest

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

Работает он следующим образом:

1) предварительно записываем приличное количество изображений реальных символов уже корректно разбитые на классы своими глазами и руками

2) вводим меру расстояния между символами (если изображение бинаризованно, то операция XOR будет оптимальна)

3) затем, когда мы пытаемся распознать символ, поочередно рассчитываем дистанцию между ним и всеми символами в базе. Среди k ближайших соседей, возможно, будут представители различных классов. Естественно, представителей какого класса больше среди соседей, к тому классу стоит отнести распознаваемый символ.

Page 12: “ComputerVision(Ruby && OpenCV)”, Людмила Дежкина ( Senior Ruby, DataArt)

Типы данныхCvPoint — точка — (структура из двух переменных (x,y))

CvSize — размер — (структура из двух переменных (width,height))

CvRect — прямоугольник — (структура из 4 переменных (x,y,width,height))

CvScalar — скаляр — (4 числа типа double)

CvArr — массив — его можно считать «абстрактным базовым классом» для CvMat и далее IplImage (CvArr->CvMat->IplImage)

CvMat — матрица

IplImage — изображение

Page 13: “ComputerVision(Ruby && OpenCV)”, Людмила Дежкина ( Senior Ruby, DataArt)

Загрузка картинкиcvLoadImage( filename, int iscolor=CV_LOAD_IMAGE_COLOR )// окно для отображения картинки

filename — имя файлаiscolor — определяет как представить картинкуiscolor > 0 — цветная картинка с 3-мя каналамиiscolor == 0 — картинка будет загружена в формате GRAYSCALE (градации серого)iscolor < 0 — картинка будет загружена как есть

cvNamedWindow("original",CV_WINDOW_AUTOSIZE); // показываем картинкуcvShowImage("original",image);

Page 14: “ComputerVision(Ruby && OpenCV)”, Людмила Дежкина ( Senior Ruby, DataArt)

Информация, доступная после загрузкиimage->nChannels // число каналов картинки (RGB, хотя в OpenCV - BGR ) (1-4)image->depth // глубина в битахimage->width // ширина картинки в пикселяхimage->height // высота картинки в пикселяхimage->imageSize // память занимаемая картинкой (==image->height*image->widthStep)image->widthStep // расстояние между соседними по вертикали точками изображения (число байт в одной строчке картинки)- может потребоваться для самостоятельного обхода всех пикселей изображения)

Page 15: “ComputerVision(Ruby && OpenCV)”, Людмила Дежкина ( Senior Ruby, DataArt)

Метод Виолы Джонса

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

Page 16: “ComputerVision(Ruby && OpenCV)”, Людмила Дежкина ( Senior Ruby, DataArt)

Свертка— это операция, показывающая «схожесть» одной функции с отражённой и сдвинутой копией другой.

cvFilter2D( src, dst, kernel, CvPoint anchor CV_DEFAULT(cvPoint(-1,-1)))

Page 17: “ComputerVision(Ruby && OpenCV)”, Людмила Дежкина ( Senior Ruby, DataArt)

Нейронные сети— классические 2-3х-слойные нейросети, обучающиеся градиентными методами с обратным распространением ошибок (3х-слойная нейросеть изображена на рисунке);

— так называемые deep-learning нейросети и сверточные сети.

Page 18: “ComputerVision(Ruby && OpenCV)”, Людмила Дежкина ( Senior Ruby, DataArt)

Детектор границ CannyКрая(границы) — это такие кривые на изображении, вдоль которых происходит резкое изменение яркости или других видов неоднородностей.

Проще говоря, край — это резкий переход/изменение яркости.

Причины возникновения краёв:

* изменение освещенности

* изменение цвета

* изменение глубины сцены (ориентации поверхности)

Page 19: “ComputerVision(Ruby && OpenCV)”, Людмила Дежкина ( Senior Ruby, DataArt)

Реализация ))) cvCanny( image, edges, threshold1, threshold2, CV_DEFAULT(3) );

image — одноканальное изображение для обработки (градации серого)edges — одноканальное изображение для хранения границ, найденных функциейthreshold1 — порог минимумаthreshold2 — порог максимумаaperture_size — размер для оператора Собеля

Page 20: “ComputerVision(Ruby && OpenCV)”, Людмила Дежкина ( Senior Ruby, DataArt)

Шаги детектора

— Убрать шум и лишние детали из изображения

— Рассчитать градиент изображения

— Сделать края тонкими (edge thinning)

— Связать края в контура (edge linking)