Search
Write a publication
Pull to refresh
65
0
Send message

Сегментация текстовых строк документов на символы с помощью сверточных и рекуррентных нейронных сетей

Reading time11 min
Views23K
Сегментация строки на символы является одним из важнейших этапов в процессе оптического распознавания символов (OCR), в частности, при оптическом распознавании изображений документов. Сегментацией строки называется декомпозиция изображения, содержащего последовательность символов, на фрагменты, содержащие отдельные символы.

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

Поиск границ символов усложняется из-за артефактов печати и оцифровки (сканирования) документа, приводящим к “рассыпанию” и “склеиванию” символов. В случае использования стационарных или мобильных малоразмерных видеокамер спектр артефактов оцифровки существенно пополняется: возможны дефокусировка и смазывание, проективные искажения, деформирование и изгибы документа. При съемке камерой в естественных сценах на изображениях часто возникают паразитные перепады яркости (тени, отражения), а также цветовые искажения и цифровой шум в результате низкой освещенности. На рисунке ниже показаны примеры сложных случаев при сегментации полей паспорта РФ.





В этой статье мы расскажем о методе сегментации символов текстовых строк документов, разработанном нами в Smart Engines, основанный на обучении сверточных и рекуррентных нейронных сетей. Основным рассматриваемым в работе документом является паспорт РФ.
Читать дальше →

Компьютерная криминалистика (форензика) — обзор инструментария и тренировочных площадок

Reading time5 min
Views140K

 
Форензика (компьютерная криминалистика, расследование киберпреступлений) — прикладная наука о раскрытии преступлений, связанных с компьютерной информацией, об исследовании цифровых доказательств, методах поиска, получения и закрепления таких доказательств. В этой статье мы рассмотрим популярные инструменты для проведения криминалистического анализа и сбора цифровых доказательств.
Читать дальше →

Как поднять свой i2p-сайт(eepsite) на VDS(VPS) под Ubuntu(LAMP). Краткий инструктаж для новичков

Reading time4 min
Views11K
Предыстория: намедни написалась книжка относительно нового государственного строя (Государство-домен), который ждет нас в близком будущем. А поскольку Роскомнадзор реагирует на подобные вещи неадекватно – решил завести под свою писанину сайт в приватной сети i2p. По ходу создания пришлось решать некоторые технические вопросы, которые я ниже и рассмотрю, пытаясь сэкономить ваше время, заодно и шпаргалка мне будет.

Итак, имеется удаленный VPS под Ubuntu, и разместить сайт нужно именно на нем. Ибо, можно, конечно сделать его у себя на ноуте, но когда ноут выключен – сайт ведь недоступен (лично меня это неизменно раздражает в .i2p и .onion).

Далее я предполагаю, что ваш LAMP уже настроен, и нормально отдает контент в обычный интернет. Т.е. у вас на нем уже крутится пара-тройка обычных (не-i2p) сайтов.

Сначала ставим i2p на Ubuntu:

sudo apt-add-repository ppa:i2p-maintainers/i2p
sudo apt-get update
sudo apt-get install i2p

Конфигурируем i2p-роутер как постоянно работающий демон:

sudo dpkg-reconfigure -plow i2p
Читать дальше →

Индексы в PostgreSQL — 1

Reading time17 min
Views485K

Предисловие


В этой серии статей речь пойдет об индексах в PostgreSQL.

Любой вопрос можно рассматривать с разных точек зрения. Мы будем говорить о том, что должно интересовать прикладного разработчика, использующего СУБД: какие индексы существуют, почему в PostgreSQL их так много разных, и как их использовать для ускорения запросов. Пожалуй, тему можно было бы раскрыть и меньшим числом слов, но мы втайне надеемся на любознательного разработчика, которому также интересны и подробности внутреннего устройства, тем более, что понимание таких подробностей позволяет не только прислушиваться к чужому мнению, но и делать собственные выводы.

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

В этой части мы поговорим про разделение сфер ответственности между общим механизмом индексирования, относящимся к ядру СУБД, и отдельными методами индексного доступа, которые в PostgreSQL можно добавлять как расширения. В следующей части мы рассмотрим интерфейс метода доступа и такие важные понятия, как классы и семейства операторов. После такого длинного, но необходимого введения мы подробно рассмотрим устройство и применение различных типов индексов: Hash, B-tree, GiST, SP-GiST, GIN и RUM, BRIN и Bloom.
Читать дальше →

Введение в машинное обучение с tensorflow

Reading time12 min
Views199K
Если мы в ближайшие пять лет построим машину с интеллектуальными возможностями одного человека, то ее преемник уже будет разумнее всего человечества вместе взятого. Через одно-два поколения они попросту перестанут обращать на нас внимание. Точно так же, как вы не обращаете внимания на муравьев у себя во дворе. Вы не уничтожаете их, но и не приручаете, они практически никак не влияют на вашу повседневную жизнь, но они там есть.
Сет Шостак

Введение.


Серия моих статей является расширенной версией того, что я хотел увидеть когда только решил познакомиться с нейронными сетями. Он рассчитан в первую очередь на программистов, желающих познакомится с tensorflow и нейронными сетями. Уж не знаю к счастью или к сожалению, но эта тема настолько обширна, что даже мало-мальски информативное описание требует большого объёма текста. Поэтому, я решил разделить повествование на 4 части:

  1. Введение, знакомство с tensorflow и базовыми алгоритмами (эта статья)
  2. Первые нейронные сети
  3. Свёрточные нейронные сети
  4. Рекуррентные нейронные сети

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

Похоже, я не предприниматель

Reading time7 min
Views47K
Для того, чтобы это понять, мне потребовалось четыре миллиона рублей (половина из которых — мои) и четыре года.

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

В этой статье я хотел бы

— поделиться сделанными выводами
— порекомендовать проект, если вы хотите присоединиться к нему в качестве разработчика/инвестора
— выложить техническую документацию, если вы захотите сделать форк

image

Векторные модели и русская литература

Reading time8 min
Views30K

image


Вы никогда не задумывались, почему тексты классических русских писателей так ценятся, а сами писатели считаются мастерами слова? Дело явно не только в сюжетах произведений, не только в том, о чём написано, но и в том, как написано. Но при быстром чтении по диагонали осознать это трудно. Кроме того, текст какого-нибудь значимого романа нам просто не с чем сравнить: почему, собственно, так прекрасно, что в этом месте появилось именно это слово, и чем это лучше какого-то другого? В какой-то мере реальное словоупотребление могло бы контрастно оттенить потенциальное, которое можно найти в черновиках писателя. Писатель не сразу вдохновенно пишет свой текст от начала до конца, он мучается, выбирает между вариантами, те, что кажутся ему недостаточно выразительными, он вычеркивает и ищет новые. Но черновики есть не для всех текстов, они отрывочны и читать их сложно. Однако можно провести такой эксперимент: заменить все поддающиеся замене слова на похожие, и читать классический текст параллельно с тем, которого никогда не было, но который мог бы возникнуть в какой-то параллельной вселенной. Попутно мы можем попытаться ответить на вопрос, почему это слово в этом контексте лучше, чем другое, похожее на него, но всё-таки другое.


А сейчас всё это (кроме собственно чтения) можно сделать автоматически.

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

Тест Lossless-оптимизаторов изображений (PNG и JPG)

Reading time3 min
Views21K
Для многих не секрет, что большинство изображений в форматах JPEG и PNG содержат избыточную информацию, которая может быть удалена без потери качества. Обычно это достигается за счет эвристических алгоритмов перебора различных параметров компрессии и выбора наименее затратного варианта. Применение оптимизаторов особенно важно на файлах, которые используются на посещаемых сайтах, для экономии дискового пространства, трафика и уменьшения времени загрузки страниц у пользователей. Программ такого типа довольно много и мы поставили себе цель найти какие же оптимизаторы сжимают лучше и работают быстро.

В тесте принимали участие следующие программы.

Для PNG:

1. Leanify 0.4.3 (x64)
2. pingo v0.79c
3. pinga v0.09
4. OptiPNG 0.7.6
5. pngout
6. PngOptimizer 2.5 (x64)
7. advpng aka AdvanceCOMP v1.23
8. ECT 0.6 (x64)
9. TruePNG 0.6.2.2
10. pngwolf-zopfli 1.1.1 (x64)

Для JPEG:

1. Leanify 0.4.3 (x64)
2. pingo v0.79c
3. ECT 0.6 (x64)
4. mozjpeg 3.2 (x64)
5. jhead 3.00
6. jpegoptim v1.4.4 (x64)
7. jpegtran
Читать дальше →

Почтовый сервер на Linux

Reading time11 min
Views326K
Как наладить работу почтового сервера, умеющего принимать и отправлять электронную корреспонденцию, бороться со спамом, взаимодействовать с клиентами? На самом деле, всё довольно просто.

Сегодня поговорим о почтовых серверах на Linux. Мы расскажем о том, как настроить сервер, о широко распространённом в интернете протоколе SMTP, а также о других протоколах, таких, как POP и IMAP. В итоге вы окажетесь обладателем полноценной системы для работы с электронной почтой.



Начнём с SMTP-сервера на Linux
Читать дальше →

OpenSSL, ssl_ciphers и nginx: прокачиваем на 100%

Reading time11 min
Views95K


Много где написано о том, как получить 100% и A+ по тесту от Qualys. При всём при том практически везде директивы ssl_ciphers и подобные даются как эдакие магические строки, которые нужно просто вставить, и надеяться, что автор не подводит вас под монастырь. Эта статья призвана исправить это недоразумение. По прочтению этой статьи директива ssl_ciphers потеряет для вас всякую магию, а ECDHE и AES будут как друзья да братья.


Также вы узнаете почему 100% по тестам — не всегда хорошо в реальности.

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

Как защитить свои данные

Reading time3 min
Views13K
Рассматривается ситуация, когда злоумышленники (доброумышленники) могут заполучить Ваш сервер для подробного изучения.

Основная идея


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

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

Вычисление факториала или мощь Stream API

Reading time4 min
Views33K
На днях появилась статья 5nw Два способа быстрого вычисления факториала, в которой приводится идея ускорения подсчёта факториала с помощью группировки перемножаемых чисел в дерево по принципу «разделяй и властвуй». Взглянув на это, я сразу понял, что тут параллельные потоки Java проявят себя во всей красе: ведь они делят задачу на подзадачи с помощью сплитераторов именно таким образом. Получается, что быстрая реализация будет ещё и красивой:

public static BigInteger streamedParallel(int n) {
    if(n < 2) return BigInteger.valueOf(1);
    return IntStream.rangeClosed(2, n).parallel().mapToObj(BigInteger::valueOf).reduce(BigInteger::multiply).get();
}

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

Погиб Крис Касперски. Памяти настоящего хакера посвящается

Reading time7 min
Views142K

Крис Касперски на RSA Conference 2015. Источник: хакер.ру

Говорят, что незаменимых людей нет. По большей части это действительно так, но есть и исключения. Например, если говорить о Николае Лихачеве, которого весь мир знает, как Криса Касперски, то здесь утверждение о незаменимости дает сбой. В ИТ-сфере этот человек сделал очень многое, о чем можно судить хотя бы по печатному «наследию»: Касперски оставил после себя больше 20 книг и 500 статей. Он был настоящим хакером, в изначальном понимании этого слова. То есть человеком, который прекрасно разбирался в том, как и что работает в ИТ.

Собственно, информационными технологиями он стал заниматься очень рано — с начальных классов, сразу после появления первого компьютера, который носил гордое название «Правец 8Д». По сути, это клон британского компьютера Oric Atmos, причем инструкция была на болгарском языке. Тем не менее, Крис (тогда еще Николай) быстро со всем освоился, написав свою первую игру. В ней пользователь должен был поймать рыбку. Графики здесь не было, ее роль играли символы. В центре экрана находился рыбак в виде знака вопроса, а рыбка отображалась при помощи нолика и знака «больше». Ловить рыбу нужно было, нажимая на пробел.

Программа на PYTHON для определения авторства текста по частоте появления новых слов

Reading time11 min
Views14K

Короткая история метода


В короткой публикации [1] под названием “Авторство писателей можно узнать по специальной формуле” сообщалось, что в научном издании «New Journal of Physics», группа шведских физиков из университета Умео под руководством Себастьяна Бернгардсона описала новый метод, который позволяет на основе статистических данных определить автора текста. Исследователи проверяли, как в текстах трех писателей — Томаса Харди, Генри Мелвилла и Дэвида Лоуренса — реализуется так называемый закон Ципфа. Исследователи обнаружили, что частота появления новых слов по мере роста объема текста меняется у разных авторов по-разному, причем эта закономерность не зависит от конкретного текста, а только от автора.

Это сообщение было опубликовано 11.12.2009, а, более двадцати лет тому назад, Джон Чарльз Бейкер [2] ввел единицу для измерения способности автора использовать новые слова (здесь понятие «новые» трактуется как ранее не используемые в данном тексте). Джон доказал, что указанная единица является индивидуальной характеристикой автора.

В периодических изданиях и в сети отсутствует информация о реализации закона Зипфа для определения авторства. Поэтому моя работа является первым научным исследованием в указанной области.
Читать дальше →

Генерирование полигональных карт для игр

Reading time24 min
Views61K
Я хотел научиться генерировать интересные игровые карты, которые не обязательно были бы реалистичными, а также попробовать техники, с которыми раньше не работал. Обычно я создаю карты с другой структурой. Что можно сделать с тысячей полигонов вместо миллиона тайлов? Отчётливо различимые игроком области могут быть полезны для геймплея: местоположения городов, места квестов, территории для захвата или колонизации, ориентиры, точки поиска пути, зоны с разной сложностью и т.д. Я генерировал карты с помощью полигонов, а затем растеризировал их вот в такие карты:

image

Во многих процедурных генераторах карт, в том числе и некоторых моих предыдущих проектах, для генерирования карты высот используются функции шума (midpoint displacement, фракталы, diamond-square, шум Перлина и т.д.). Здесь я их не применял. Вместо неё я использовал структуру графов для моделирования элементов, определяемых ограничениями геймплея (высота, дороги, течение рек, места квестов, типы монстров) и функции шума для моделирования того, что не ограничивается геймплеем (форма побережья, расположение рек и деревьев).
Читать дальше →

Уравнение теплопроводности в tensorflow

Reading time9 min
Views26K
Привет, Хабр! Некоторое время назад увлекся глубоким обучением и стал потихоньку изучать tensorflow. Пока копался в tensorflow вспомнил про свою курсовую по параллельному программированию, которую делал в том году на 4 курсе университета. Задание там формулировалось так:

Линейная начально-краевая задача для двумерного уравнения теплопроводности:

\frac{\partial u}{\partial t} = \sum \limits_{\alpha=1}^{2} \frac{\partial}{\partial x_\alpha} \left (k_\alpha \frac{\partial u}{\partial x_\alpha} \right ) -u, \quad x_\alpha \in [0,1] \quad (\alpha=1,2), \ t&gt;0;

k_\alpha =
\begin{cases}
    50, (x_1, x_2) \in \Delta ABC\\
    1, (x_1, x_2) \notin \Delta ABC
\end{cases}

(\alpha = 1,2), \ A(0.2,0.5), \ B(0.7,0.2), \ C(0.5,0.8);

u(x_1, x_2, 0) = 0,\ u(0,x_2,t) = 1 - e^{-\omega t},\  u(1, x_2, t) = 0,

u(x_1,0,t) = 1 - e^{-\omega t},\ u(0, x_2, t) = 0,\  \omega = 20.

Хотя правильнее было бы назвать это уравнением диффузии.

Задачу тогда требовалось решить методом конечных разностей по неявной схеме, используя MPI для распараллеливания и метод сопряженных градиентов.

Я не специалист в численных методах, пока не специалист в tensorflow, но опыт у меня уже появился. И я загорелся желанием попробовать вычислять урматы на фреймворке для глубокого обучения. Метод сопряженных градиентов реализовывать второй раз уже не интересно, зато интересно посмотреть как с вычислением справится tensorflow и какие сложности при этом возникнут. Этот пост про то, что из этого вышло.

Численный алгоритм


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

Детектор движения на основе биоинспирированного модуля OpenCV

Reading time7 min
Views18K
image

Данная статья будет полезна новичкам, которые только начали использовать библиотеку OpenCV и еще не знают все её возможности. В частности, на основе биоинспирированного модуля библиотеки OpenCV можно сделать адаптивный к освещению детектор движения. Данный детектор движения будет работать в полумраке лучше, чем обычное вычитание двух кадров.
Читать дальше →

В поисках анонимной почты

Reading time5 min
Views289K

Источник картинки


Как мыть голову, не снимая фольгированную шапочку?
Неизвестный автор

Не так давно у меня возникла необходимость в полностью анонимном адресе электронной почты, который, даже имея доступ к содержимому письма, нельзя было бы однозначно со мной связать. Мне было нужно отправить в больницу несколько вопросов по поводу лечения ребёнка, но очень не хотелось, чтобы эта информация осталась условно навечно ассоциированной c моим и его именами в логах провайдеров, поисковиков, почтовиков, товарища майора и кто знает каких ещё операторов Big Data, орудующих во Всемирной паутине. От адресата ожидалось получение файлов неизвестного размера с документами, необходимыми для госпитализации.


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

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

Есть две функции

Reading time16 min
Views54K
Привет

Есть две булевы функции n аргументов, одна — константная, другая — сбалансированная. На какую сам сядешь, на какую фронтендера посадишь? Вот только функции неизвестны, а вызвать их разрешается лишь один раз.

Если не знаешь, как решить подобную задачу, добро пожаловать под кат. Там я расскажу про квантовые алгоритмы и покажу как их эмулировать на самом народном языке — на Python.
Hello darkness, my old friend

Что происходит в интернете, когда вы на него не смотрите

Reading time5 min
Views29K
image

Очень многие люди, даже профессионалы сферы информационных технологий, не представляют, что творится в интернете. А очень желательно, чтобы представляли.

Многие видят будущее как киберпанк, но они пропускают при этом подводную часть айсберга. Думают об имплантатах и нейроинтерфейсах, но забывают об огромной инфраструктуре интернета и петабайтах данных, проходящих по нему за микросекунды. Что происходит в интернете кроме того, что робоглаз сохраняет видео в чей-то мозг? Да ничего хорошего! И происходит это уже сейчас.

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

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

Честно признаться, я и сам не ожидал, что всё настолько плохо. Под катом немного статистики из жизни моего сервера и разъяснения, что же это значит. У сервера есть только IP, о его существовании знает семь человек и провайдер, его адрес указывался дважды в скайпе и три раза в письме. Он существует всего один месяц.
Читать дальше →

Information

Rating
Does not participate
Registered
Activity