Search
Write a publication
Pull to refresh
19
0.6
Send message

Работа каскада Хаара в OpenCV в картинках: теория и практика

Reading time7 min
Views80K


В прошлой статье мы подробно описали алгоритм распознавания номеров (ссылка), который заключается в получении текстового представления на заранее подготовленном изображении, содержащем рамку с номером + небольшие отступы для удобства распознавания. Мы лишь вскользь упомянули, что для выделения областей, где содержатся номера, использовался метод Виолы-Джонса. Данный метод уже описывался на хабре (ссылка, ссылка, ссылка, ссылка). Сегодня мы проиллюстрируем наглядно то, как он работает и коснёмся ранее необсужденных аспектов + в качестве бонуса будет показано, как подготовить вырезанные картинки с номерами на платформе iOS для последующего получения уже текстового представления номера.
Читать дальше →

Компьютерное зрение на Java для Android. Обзор библиотеки BoofCV

Reading time3 min
Views23K
Наверное, каждый Android программист хотя бы раз задумывался о написание чего-нибудь полезного с использованием компьютерного зрения или дополненной реальности. А некоторые даже написали hello, word при помощи opencv, которую таки портировали и на Android. К сожалению, если мы захотим написать что-то серьезное, мы обнаружим, что набор библиотек с уже реализованными функциями Computer Vision не так велик, особенно это касается платформы Android. Чаще всего для этой цели используют opencv, написанную на C++ либо пишут свои велосипеды, что в общем тоже хорошо, но не так быстро, как хотелось бы в плане реализации. Однако, не все так плохо. Существует такой замечательный проект BoofCV, который представляет из себя библиотеку компьютерного зрения, написанную на чистом Java. Последние две буквы в названии библиотеки означают именно то, о чем вы подумали. А в последнем релизе появилась долгожданная поддержка Android. Ниже мы рассмотрим основные плюшки, предоставляемые библиотекой на конкретном примере.
Читать дальше →

Об одном алгоритме сжатия случайных сигналов (с потерями)

Reading time5 min
Views25K


Аннотация


Известно, что существуют различные способы формирования псевдослучайных чисел для моделирования случайных величин на ЭВМ. Если допустить, что высокочастотный (ВЧ) сигнал представляет из себя реализацию некоторой случайной величины, то возникает большой соблазн подобрать для этой реализации свою модель случайной величины, имеющую известные параметры реализации алгоритма её формирования. Тогда мы можем представить ВЧ сигнал в виде этого алгоритма, а хранить лишь его параметры, т.е. происходит сжатие.
Читать дальше →

Обзор наиболее интересных материалов по анализу данных и машинному обучению №2 (16 — 23 июня 2014)

Reading time4 min
Views13K

В очередном обзоре наиболее интересных материалов, посвященных теме анализа данных и машинного обучения, достаточно большое внимание уделено популярному набору алгоритмов машинного обучения Deep Learning и его практическому применению. Несколько статей посвящено тому какие есть пути для собственного развития как специалиста по анализу данных и машинному обучению. Также несколько статей касаются такой темы как Data Engineering и рассматривают такие популярные продукты как Cassandra и Apache Kafka. Но начинается данный выпуск с обзора стартующих в ближайшее онлайн-курсов, связанных с темой анализа данных и машинного обучения.
Читать дальше →

Про котиков, собак, машинное обучение и deep learning

Reading time15 min
Views84K
image
«В 1997 году Deep Blue обыграл в шахматы Каспарова.
В 2011 Watson обставил чемпионов Jeopardy.
Сможет ли ваш алгоритм в 2013 году отличить Бобика от Пушистика?»


Эта картинка и предисловие — из челленджа на Kaggle, который проходил осенью прошлого года. Забегая вперед, на последний вопрос вполне можно ответить «да» — десятка лидеров справилась с заданием на 98.8%, что на удивление впечатляет.

И все-таки — откуда вообще берется такая постановка вопроса? Почему задачи на классификацию, которые легко решает четырехлетний ребенок, долгое время были (и до сих пор остаются) не по зубам программам? Почему распознавать предметы окружающего мира сложнее, чем играть в шахматы? Что такое deep learning и почему в публикациях о нем с пугающим постоянством фигурируют котики? Давайте поговорим об этом.
По заветам издателей Стивена Хокинга - без формул

Signed Distance Field или как сделать из растра вектор

Reading time12 min
Views61K
Речь сегодня пойдёт о генерации изображений с картой расстояний (Signed Distance Field). Данный вид изображений примечателен тем, что фактически позволяет получить «векторную» графику на видеоускорителе, причём даром. Одной из первых данный метод растеризации предложила компания Valve в игре Team Fortress 2 для масштабируемых декалей в 2007 году, но до сих пор он не пользуется особой популярностью, хотя позволяет рендерить прекрасного качества шрифты, используя текстуру всего 256х256 точек. Данный метод прекрасно подходит для современных экранов высокой чёткости и позволяет серьёзно сэкономить на текстурах в играх, он не требователен к железу и прекрасно работает на смартфонах.



Хитрость заключается в создании такой специально подготовленной карты расстояний, что при использовании простейшего шейдера получается идеальная векторная картинка. Более того, с помощью шейдеров можно получить эффекты тени, свечения, объёма и т. п.

Как же создавать такие изображения? Очень просто, ImageMagick позволяет сделать это одной командой:

convert in.png -filter Jinc -resize 400% -threshold 30% \( +clone -negate -morphology Distance Euclidean -level 50%,-50% \) -morphology Distance Euclidean -compose Plus -composite -level 45%,55% -resize 25% out.png

На этом можно было бы поставить точку, но так полноценного топика не получится. Что ж, под катом — описание быстрого алгоритма расчёта SDF, пример на C++ и немного шейдеров для OpenGL.
Читать дальше →

Беззнаковая арифметика в Java

Reading time5 min
Views95K
Как известно, в Java нет беззнаковых типов. Если в Си вы могли написать unsigned int (char, long), то в Java так не получится. Однако нередко возникает необходимость в выполнении арифметических операций именно с числами без знака. На первый взгляд кажется, что беззнаковые типы в принципе-то и не особо нужны (подумаешь, MaxInt для чисел со знаком меньше в два раза, если нужны числа больше, я просто возьму long и далее BigInteger). Но основное различие на самом деле не в том, сколько различных неотрицательных чисел можно положить в signed или unsigned int, а в том, как над ними производятся арифметические операции и сравнения. Если вы работаете с бинарными протоколами или с двоичной арифметикой, где важен каждый используемый бит, нужно уметь выполнять все основные операции в беззнаковом режиме. Рассмотрим эти операции по порядку:

Преобразование byte в short (int, long)


Обычный каст (int) myByte выполнит расширение до 32 бит со знаком — это означает, что если старший бит байта был установлен в 1, то результатом будет то же самое отрицательное число, но записанное в 32-битном формате:

0xff -> 0xffffffff (-1)

Часто это не то, чего бы мы хотели. Для того, чтобы выполнить расширение до 32 бит без знака и получить 0x000000ff, в Java можно записать:

int myInt = myByte & 0xff;
short myShort = myByte & 0xff;

Сравнение без учёта знака


Для беззнакового сравнения есть лаконичная формула:

int compareUnsigned(int a, int b) {
    return Integer.compare( a ^ 0x80000000, b ^ 0x80000000 );
}

Для byte, short и long, соответственно, константы будут 0x80, 0x8000 и 0x8000000000000000L.
Читать дальше →

Распознавание автомобильных номеров в деталях

Reading time9 min
Views153K
image
Настало время подробно рассказать, как работает наша реализация алгоритма распознавания номеров: что оказалось удачным решением, что работало весьма скверно. И просто отчитаться перед Хабра-пользователями — ведь вы с помощью Android приложения Recognitor помогли нам набрать приличного размера базу снимков номеров, снятых совершенно непредвзято, без объяснения как снимать, а как нет. А база снимков при разработке алгоритмов распознавания самое важное!
Читать дальше →

Дайджест статей по анализу данных №2 (26.05.2014 — 8.06.2014)

Reading time5 min
Views20K
Добрый день, уважаемые читатели.
Представляю вашему вниманию дайджест новостей и полезных материалов из мира анализа данных. Предыдущий дайджест пользовался большой популярностью и поэтому я решил сделать их регулярными. Периодичность таких подборок будет 1 раз в 2 недели.

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

Читать дальше →

Распознавание текста в ABBYY FineReader (1/2)

Reading time7 min
Views57K
Содержание
imageРаспознавание текста в ABBYY FineReader (1/2)
imageРаспознавание текста в ABBYY FineReader (2/2)

Систему распознавания текста в FineReader можно описать очень просто.

У нас есть страница с текстом, мы разбираем ее на текстовые блоки, затем блоки разбираем на отдельные строчки, строчки на слова, слова на буквы, буквы распознаем, дальше по цепочке собираем все обратно в текст страницы.



Выглядит очень просто, но дьявол, как обычно, кроется в деталях.

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



В этой статье мы начнём рассказ про распознавание текста от уровня строки и ниже.
Читать дальше →

А что действительно скрывают нейронные сети?

Reading time7 min
Views56K
Несколько дней назад на хабре вышла статья Что скрывают нейронные сети?. Она является вольным пересказом английской статьи The Flaw Lurking In Every Deep Neural Net, а та в свою очередь рассказывает о конкретном исследовании некоторых свойств нейронных сетей (Интригующие свойства нейронных сетей).

В статье, описывающей исследование, авторы выбрали несколько сенсационный подход к подаче материала и написали текст в духе «в нейронных сетях найдена серьезная проблема» и «мы не можем доверять нейросетям в проблемах, связанных с безопасностью». Ссылку на пост на Хабре среди моих знакомых много кто расшарил, в фейсбуке завязалось сразу несколько дискуссий на эту тему. При этом у меня сложилось впечатление, что за два пересказа часть информации из начального исследования потерялась, плюс возникло много вопросов, связанных с нейронными сетями, которые в изначальном тексте не рассматривались. Мне кажется, что есть потребность подробнее описать, что же делали в исследовании, а заодно попробовать ответить на изначальные вопросы. Формат фейсбука для таких длинных текстов не подходит совсем, так что я решил попробовать оформить свои размышления в пост на Хабре.
Читать дальше →

Создание API: в рамку и на стену

Reading time5 min
Views57K
Каждый программист — проектировщик API. Хорошие программы состоят из модулей, а протокол взаимодействия модулей — это тоже API. Хорошие модули используются повторно.

API — это большая сила и большая ответственность. У хорошего API будут благодарные пользователи; поддержка плохого превратится в кошмар.

Публичный API — не воробей, опубликуешь — не уберешь. Есть только одна попытка сделать все правильно, поэтому постарайся.

API должно быть легко использовать, но сложно использовать неправильно. Сделать что-то простое с помощью такого API должно быть просто; сложное — возможно; сделать что-то неправильно должно быть невозможно, или, по крайней мере, трудно.

API должен описывать сам себя. Изучение кода на таком API не вызывает желания читать комментарии. Вообще, комментарии редко нужны.

Перед разработкой API собери требования с долей здорового скептицизма. Осознай общие задачи и реши их.

Оформляй требования как шаблоны использования API. Сверяйся с ними в процессе проектирования.
Читать дальше →

Лямбда-выражения в Java 8

Reading time19 min
Views465K
В новой версии Java 8 наконец-то появились долгожданные лямбда-выражения. Возможно, это самая важная новая возможность последней версии; они позволяют писать быстрее и делают код более ясным, а также открывают дверь в мир функционального программирования. В этой статье я расскажу, как это работает.

Java задумывалась как объектно-ориентированный язык в 90-е годы, когда объектно-ориентированное программирование было главной парадигмой в разработке приложений. Задолго до этого было объектно-ориентированное программирование, были функциональные языки программирования, такие, как Lisp и Scheme, но их преимущества не были оценены за пределами академической среды. В последнее время функциональное программирование сильно выросло в значимости, потому что оно хорошо подходит для параллельного программирования и программирования, основанного на событиях («reactive»). Это не значит, что объектная ориентированность – плохо. Наоборот, вместо этого, выигрышная стратегия – смешивать объектно-ориентированное программирование и функциональное. Это имеет смысл, даже если вам не нужна параллельность. Например, библиотеки коллекций могут получить мощное API, если язык имеет удобный синтаксис для функциональных выражений.

Главным улучшением в Java 8 является добавление поддержки функциональных программных конструкций к его объектно-ориентированной основе.
Читать дальше →

Факторный анализ для чайников

Reading time3 min
Views98K
Думаю многие из нас, хотя бы однажды интересовались искусственным интеллектом и нейронными сетями. В теории нейронных сетей далеко не последнее место занимает факторный анализ. Он призван выделить так называемые скрытые факторы. У этого анализа есть много методов. Особняком стоит метод главных компонент, отличительной особенностью которого является полное математическое обоснование. Признаться честно, когда я начал читать статьи по приведенным выше ссылкам — стало не по себе от того, что я ничего не понимал. Мой интерес поутих, но, как это обычно бывает, понимание пришло само по себе, нежданно-негаданно.
Поехали..

Автоматическое выделение меток

Reading time5 min
Views23K
В машинном зрении и робототехнике есть забавный класс задачек: обнаружение заранее известных меток. Сюда можно отнести всё: QR-коды, Augmented Reality ( AR, дополненная реальность), задачи позиционирования объектов (motion capture, определение местоположения), детектирование объектов по меткам, классификация объектов в робототехнике (например при автоматической сортировке), помощь автоматическим системам в позиционировании (роботизированные захваты), трекинг объектов, и.т.д.



В статье описаны основные методы захвата меток, их возможности, границы применимости.
Читать дальше →

Применение SURF для создания маркера дополненной реальности

Reading time6 min
Views20K

Применение SURF для создания маркера дополненной реальности


Это продолжение топика о дополненной реальности. Вот здесь первая часть. В обсуждении топика юзером Inco были показаны интересные результаты его работы в направлении распознавании маркера дополненной реальности Видео.На тот момент времени не оказалось, но через пару месяцев мне стало интересно как всё это работает, насколько устойчив подход — и свободные часы нашлись. Представляю вам свою реализацию этой идеи, который вылился в доклад на вот этом событии.

Читать дальше →

Использование каскада Хаара для сравнения изображений

Reading time4 min
Views74K
image

Признаки Хаара, про которые я расскажу, известны большинству людей, которые так или иначе связаны с системами распознавания и машинного обучения, но, судя по всему, мало кто использует их для решения задач вне стандартной области применения. Статья посвящена применению каскадов Хаара для сравнения близких изображений, в задачах сопровождение объекта между соседними кадрами видео, поиска соответствия на нескольких фотографиях, поиска образа на изображении и прочих подобных задач.

Обучение OpenCV каскада Хаара

Reading time8 min
Views199K
На хабре уже есть несколько статей и про то, что такое каскад Хаара (раз, два, три). Есть даже одна, где затронут процесс обучения, но в отношении описанной задачи. На тему обучения есть пара неплохих статей на английском (первая, вторая, третья), но, на мой взгляд, они путанные: либо рассказывают очень мало, либо слишком много и обо всём — выделить нужную мысль сложно.
image
В этой статье я попробую показать, как обучить каскад с нуля за несколько часов, натренировав на поиск простого предмета в видеопотоке (примером будет очаровательная сова с фотографии). Все обучающие выборки и программы будут приложены.
Зачем всё это нужно? Каскад Хаара это один из простейших способов распознавания классов объектов с большой скоростью работы. К ним относятся лица и руки людей, номера автомобилей, пешеходы. Детектором Хаара просто находить животных в кадре (кстати, удивительно, что я не видел ещё ни одной автоматической кормушки для синиц на raspberry pi). К тому же, готовые реализации OpenCV есть под большинство существующих систем (даже для blackfin'a встречал). Всё это делает Хаара одним из самых удобных методов, позволяющих решать задачи видеообработки даже людям, которые никогда не работали с обработкой видео.
Читать дальше →

Распознавание номеров: от А до 9. Часть 3

Reading time6 min
Views81K
Неделю назад мы опубликовали статью про открытый сервер для распознавания изображений автомобильных номеров. Теперь, как и обещали, статья про то, как отправлять на него свои фотографии с номерами. Наша цель была, как вы помните, вовсе не ругаться друг на друга неприличными словами, а именно сделать функционирующий сервер в интернете, который справляется с фотографиями и отправляет назад результат распознавания.


(часть фотографий, присланных в течение недели)
Читать дальше →

Information

Rating
3,378-th
Location
Киев, Киевская обл., Украина
Date of birth
Registered
Activity