Перейти к содержимому
Compvision.ru
svoyak

Подготовка сэмплов для OCR(вопросы)

Recommended Posts

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

Спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

FloodFill

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нарисовать контуры заполненными, т.е. получить бинарную маску, потом использовать маску  src.copyTo(dst, mask)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Добрый вечер всем..:-)) Дошло у меня наконец то дело до обучения сети, я пользовал FANN и враппер для нее с#, сделал файл тренировочный и вперед. Хочу оговорится, у меня есть не мой проверочный проект, на котором я проверял работу своего кода - т.е. файл делается правильно и сеть тренируется правильно - смотрел потом отклики.На моих данных все вышло очень печально(FAIL).  Вкратце проблема в том, что при сравнимых объемах входных данных(и одинаковых настройках сети) тестовый проект обучается минут за 5 и работает четко, а с моими данными получается ерунда - обучается может чуть подольше - но отклики радикально неправильные. Попробовал увеличить количество итераций(2000->10000) - начал считать часами(наверно так не должно быть), при том что тестовый сходится на 500 итерациях, а мои данные после 2000 считают неправильно. Вот думаю куда теперь мне копать.. Неплохо наверно было бы GPU подключить как нить, чтоб быстрей хоть было. Или понять что не так: у меня условно 3000 картинок 20x25 -> это 16 символов, картинки бинарные, если код делает сеть, которая  отлично решает тестовые 3000 таких картинок и не может сделать сеть для моих, то 1. картинок нужно больше?, 2.картинки в пределах одного символа нужно сделать более похожими? может нужно использовать адский шушпанцер типа NVdida Tesla?4. какието настройки в сети менять? я чесно говоря немного в растерянности.. Спасибо за советы..

Посчитал 10000 итераций(2 часа) - результаты неверные..печалька

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Здесь не в итерациях дело.

И GPU пока бесполезно подключать.

Попробуйте разобраться с преобразованиями данных.

Лучше для этого использовать матлаб.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Выкинул из каждого набора для символов наиболее нехарактерные сэмплы, к примеру есть символы полностью нарисованные черным, а есть как бы контур символа черным а внутри белое(я писал выше), так вот вторые выкинул и уменьшил количесвто входных данных - не заработало.  Выкинул 2/3 символов вообще, т.е. было 16 оставил 5 -  заработало. Может кто нить сказать по этому признаку чего не хватает моей сети?? нейронов/слоев/мощности/итераций?. Т.е. на меньшем разнообразии входных данных сетка начала работать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

По всей видимости не хватает данных, или регуляризации.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот полный набор сэмплов, когда их готовил я был излишне оптимистичен по поводу производительности, поэтому сделал их 80x100(это почти без сжатия), но с такими параметрами сеть вообще залипает наверно навсегда, поэтому последние разы для тренировочного файла и тестов конвертил в 20x25.. если надо могу выложить этот же набор в таком разрешении.. Если не тяжело посмотрите плз на предмет того, что не так с этим набором..Спасибо.

1.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Читая доки по FANN понял, что у меня создается сетка с одним скрытым слоем:

                uint[] layers = { (uint)(char_size.Width * char_size.Height), 2000, (uint)ch_arr.Length };
                net.CreateStandardArray(layers);

наверно мне нужно больше слоев?? вот только как их выбрать, и количество нейронов в них..

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не, больше не нужно, обычно одного скрытого слоя хватает.

Данные посмотрю, надо преобразователь в матлабовский формат сворганить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А что за матлабовский формат?? там вроде картинки просто.. а в матлабе что-то другое на входе?? Я из картинок делаю тренировочный файл, там одна строка - входной вектор(картинка), следующая - выходной вектор, где на соотвествующем месте 1, а остальные 0. Получается такой большой текстовый файл, его скармливаю уже сети.. если нужно могу выложить делалку таких файлов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Набросал средствами OpenCV. 

Пришлось переименовать русские подпапки, но вроде учится, проверять лень, но по цифрам похоже.

SimpleOCR_NN.rar

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

вот решение для VS.. полученная сеть сохраняется в корень C. ну это поправить там не долго. Новый файл - нужно создать файл рядом с папками с сэпмлами и выбрать его(train.tr например).. туда запишутся данные..потом Тренировать и выбрать этот файл. Потом выбрать полученную сеть и подсовывать ей сэмплы.

FileMaker.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я не большой спец по с++, я так понял мне нужен один файл из архива, main.cpp - точней нужно заставить его скомпилироваться и заработать. Это верно?? Я решение открыл там три проекта..вообщем чегото недопонял:-) Ушел читать про установку opencv на винду и ее пользование.. я до этого враппер пользовал..:-))

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да, там все в одном файле, остальные проекты служебные.

Сишных команд там мало, в основном OpenCV-шные, которые в шарповской обертке, по идее, не должны сильно отличаться.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Здравствуйте, подскажите, что делает этот кусок, если можно то сигнатуру конструктора, никак не могу найти подходящий в с# врапере

// Архитектура сети. Создадим трехслойную сеть.
Mat layer_sizes1( 1, 3, CV_32SC1 );
// По размеру входного вектора
layer_sizes1.at<int>(0) = image_area;
// Ну, так мне захотелось
layer_sizes1.at<int>(1) = image_area/10.0;
// По количеству классов
layer_sizes1.at<int>(2) = DirNames.size();

последний параметр в к-ре задает точность как я понял, что присваивается понятно, неясно чему присваивается. Спасибо

у меня есть вот такой конструктор, но тут еще количество каналов нужно, не знаю чего туда написать

public Mat(
	int rows,
	int cols,
	DepthType type,
	int channels
)

здесь вроде бы DepthType - это ваш последний параметр

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Подскажите плз такой момент, варианты враппера делятся по типу(вот не пойму чего, точности чтоли), ну т.е. есть одинаковые либы для float, double и fixed. Я вот никак не могу вписать это в свое понимание, не могли бы вы прояснить плз. Как тип влияет и как его надо выбирать? Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Там, вероятно определен тип для работы с числами с плавающей точкой, что то типа RealNumber. И в разных вариантах он разный. Float хватает для большинства случаев. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Параметр  CV_32SC1 означает, что используется целочисленный знаковый тип (int короче), количество каналов равно 1. Вот единицу последним параметром и передавай.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

С тренировкой разобрался..:-)) как ни стыдно сказать, но ошибся опять я..:-)) теперь уже когда подсовывал данные для готовой сети.. Тупой копипаст с примера, селяви.. в примере из-за специфичности работало, а у меня 50/50.. или еще хуже.. Однако все равно результаты не радуют, хотя гораздо лучше чем было. Я бы хотел попробовать сделать входные данные более похожими, так сказать..чтоб сеть не сходила с ума при обучении.. Для этого я бы хотел для начала научиться заливать изображения как на рисунке. Контуры я их получаю и могу закрасить, вопрос в том, как из закрашенного вычесть фон, чтоб как в примере получилась дырка вверху цифры 9.9_beg.png9_fiil.png. Насколько я понимаю о чем-то похожем писал

В 05.08.2016 at 15:59, mrgloom сказал:

Нарисовать контуры заполненными, т.е. получить бинарную маску, потом использовать маску  src.copyTo(dst, mask)

но я непонял как это сделать, если можно подробней.  Мне кажется нужно научится выделять контуры с фоновым цветом, тогда они были бы маской? Что нибудь типа волшебной палочки фотошопа, но в отношении всей картинки для какого-нить определенного цвета +- Tolerance.  Можно такое сделать?? или я сильно увлекся теорией..:-))Спасибо. После препроцессинга изображений у меня получаются картинки 80x100, если я их смасштабирую 20x25 с количеством нейронов в скрытом слое 150 то за пару часов сеть как-то обучается. Я подумал, что если увеличить размерность входных данных и не масштабировать, то наверно это будет лучше, однако уже на 40x50 и 600 нейронов во входном - сеть не обучилась в течение несокльких суток.. Что я неправильно понимаю здесь? Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Попробовал ваши данные на Lenet используя DIGITS(caffe как бэкэнд), получилось что то положительное даже просто обучив на 80% этих данных, точность 94%, наверно можно и больше если будет больше данных или если зафайнтюнится на MNIST.

Тут еще можно заметить, что разные буквы в разном количестве, неплохо бы сделать чтобы кол-во было одинаковое.

454537267b0142dc9e9b1642bc590604.png

Confusion matrix (тут я дал дурацкие имена буквам т.к. DIGITS не переваривает кирилицу)

5c19721221564290a1e46ad5acdf9a93.png

График обучения.

bc4146d024b9426f9dbdbaf04660b6d8.png

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

mrgloom - большое спасибо, не могли бы вы уточнить - вы конвертили картинки, или так 80x100 из архива и давали в сеть?? и параметры сети если можно, может я их неправильно выбираю..Обучение долго шло? И если не тяжело, можно кратко  написать что есть Lenet, Digits и зафайнтюнится на MNIST.. а то буду читать и что нить не так себе представлю.. Похоже мне надо уйти с FANN :-)) ил правильные параметры сетки подбирать, что звучит довольно грустно..

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я сжал до стандартного размера для Lenet 28x28 методом squeeze (просто рейсайз?)

по MNIST и Lenet

https://github.com/NVIDIA/DIGITS/blob/master/docs/GettingStarted.md

про finetuning

https://github.com/NVIDIA/DIGITS/tree/master/examples/fine-tuning

Если у вас нет проблем с linux, то можно накатить на ubuntu 14.04 DIGITS+Caffe без проблем. Хотя и на винду должно ставиться(нужен VS2013 для сборки Caffe).

https://github.com/NVIDIA/DIGITS/blob/master/docs/BuildDigitsWindows.md

Но после обучения модели надо еще быть готовым к тому чтобы прикрутить Caffe к своему проекту и написать inference на C++ с выводом например в текстовый файл или куда еще.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

mrgloom - еще раз большое спасибо, правильно ли я понимаю, мне нужно установить DIGITS на винде, - это будет как я понял чтото типа надстройки над Caffe. Caffe - это собственнно фреймворк для работы с нейросетями.  В нем есть несколько, что ли типов сетей, один из которых Lenet(специально созданный для работы с символами, скажем так)? И мне нужно будет сделать и обучить сеть такого типа, используя DIGITS(Caffe). MNIST - это стандартный набор данных для проверки результатов?. Я так понял в нем только цифирь находится. Про файнтюнинг пока не буду спрашивать, хочу пока научиться получать такие же результаты как у вас на картинке:-) - очень они отличаются от моих на FANN. Поправьте если что неверно. Спасибо :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×