Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];

Вниз

Распознавание цифр   Найти похожие ветки 

 
guitarist ©   (2006-03-11 20:23) [0]

Вот хочу написать программу для распознавания цифр. Даже уже написал, правда работает просто отвратительно. Как я делал. Взял по 10 примеров каждой цифры (они размером всего 10*15) и посчитал популярность каждого пикселя, и проверяю если пиксель в подстановочной цифре белый, а у пикселя цифры (пусть 7) популярность больше 6, то засчитываю штраф к этой цифре в размере (популярность пикселя/10), делаю так для каждой цифры от 0 до 9 и смотрю где меньше штрафов.
Иногда распознает неплохо, но часто 1 с 7 путает и 6 с 8. Пытался давать штраф за отмеченный пиксель, который   имеет в цифре популярность <6, но в картинке возможен шум, поэтому это только портит распознавание.
Какой еще вариант распознавания возможен или как улучшить мой?
ЗЫ Цифры фиксированы(т.е они все похожи на образцы, если не учитывать шум), поэтому нейронных сетей не надо.


 
Чародей ©   (2006-03-11 20:46) [1]

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


 
[lamer]barmaglo   (2006-03-11 20:55) [2]

Если не секрет, для чего это программа? Меня гложут смутные сомнения...

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

Ну а если по теме насколько мне известно большинство алгоритмов распознования образов недоступно широкой публике...


 
Kolan ©   (2006-03-11 21:43) [3]

Используе метод шаблонов. Или неро сеть..


 
guitarist ©   (2006-03-11 21:58) [4]

Нет, нет не думайте обо мне так плохо, ничего такого, как в [2] я не собираюсь делать.
Еще одна довольно сложная задача -- найти место начала цифры.
Я делаю так: верхний правый угол первой ищу в квадратике 3*4 (там точно он есть), но все равно рассматриваю все варианты и просто смотрю начиная с какого из 12 пикселей получается лучше распознование (меньше штрафов), дальше прибавляю 9 и делаю то же, именно поэтому, на мой взгляд, и случаются ошибки.


 
Pavia ©   (2006-03-11 23:29) [5]

Как часто путает?

> а у пикселя цифры (пусть 7) популярность больше 6,

Не понял фразу? Ты что считаешь процент черных пикселей на одном шаблоне, так это не верно. И зачем делешь на 10? И зачем привязываться только к белому цвету, а если он на всех шаблонах белый то и незачем прибавлять.
Помеха может быть, как черная так и белая.

Алгоритм такой берем пиксель, от каждого примитива и сравниваем с эталономи(XOR) считаем число отличий(популярность цвета в данной точке). И выстовляем штраф той цифре где есть отличия. Штраф раен популярности.

Пример.

procedure TForm1.Button1Click(Sender: TObject);
var s,i,j,k:integer;
x,y:integer;
a:array [0..9] of integer;
s1,s2:string;
t,n:integer;
begin
Randomize;
n:=0;
for t:=1 to 100 do
with Image1.canvas do
begin
font.Style:=[fsBold];
Rectangle(0,0,100,70);
for i:=0 to 10 do
 TextOut(1+10*i,1,Char(i+$30));
s1:="";
for i:=0 to 4 do
 begin
 j:=Random(10)+$30;
 s1:=s1+Char(j);
 TextOut(1+10*i,16,Char(j));
 TextOut(1+10*i,31,Char(j));
 end;
for i:=0 to( 50*15)*5 div 100 do
 begin
 x:=1+Random(10*5);
 y:=16+Random(15);
 Pixels[x,y]:= Pixels[x,y] xor $FFFFFF;
 end;
s2:="";
for i:=0 to 4 do
 begin
 fillchar(a,SizeOf(a),0);
 for x:=0 to 10-1 do
  for y:=0 to 15-1 do
   begin
   s:=0;
   for j:=0 to 9 do
    if  Pixels[1+j*10+x,1+y] xor Pixels[1+i*10+x,16+y]<>0 then
     s:=s+1;
   for j:=0 to 9 do
    if  Pixels[1+j*10+x,1+y] xor Pixels[1+i*10+x,16+y]<>0 then a[j]:=a[j]+s;
   end;
   s:=a[0]; k:=0;
   for j:=0 to 9 do
    if a[j]<s then
     begin
      s:=a[j];
      k:=j;
     end;
 s2:=s2+ Char(k+$30);
 TextOut(1+10*i,46,Char(k+$30));
 end;
if s1<>s2 then
 begin
 inc(n);
 end;
end;
Caption:=floattostr(n/100); // Процент не удачь.
end;


To [lamer]barmaglo  
Доступно. Просто книжки большие. Да и на русском мало.


 
Pavia ©   (2006-03-11 23:48) [6]

Думал, что у тебя фиксированное положение цыфр.
Перебираем все варианты начала.  Как только встречается наименьший штраф считаем, что нашли цыфру. Вернее берем минимумы.


 
QwertyKz ©   (2006-03-12 12:40) [7]

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1203
Может это пригодится


 
Kolan ©   (2006-03-12 12:53) [8]

Чтобы найти начало нужно идти гор или верт фронтом. Те проверять есть ли на линии черный пиксель....


 
guitarist ©   (2006-03-12 13:40) [9]

Pavia, я так собственно и делаю.

Ну можно обойтись без популярности, просто если на подстановочной цифре пиксель не отмечен, а в шаблоне отмечен, то штраф+1. Там собственно для каждой цифры есть штук 15-20 пикселей, получивших наибольшую популярность, вот по ним и анализируем. Но если у нас подстановочная цифра 7, и у нее на вертикальной палке все пиксели хорошие, а на горизонтальной с пропусками, то неудивительно, что она может показаться 1, т.к 1 получит, в таком случае меньший штраф за счет того, то мы не смотрим пиксели на горизонтальной палке.

Чародей, а что это вычитание даст, вроде ничего полезного.


 
Pavia ©   (2006-03-12 14:02) [10]

guitarist
Так тыж штраф зачисляешь за присутствующий белый цвет. А я за то есть ли отличия. Поэтому в таком случае 1 и 7 будут иметь в равной степени вероятность.


 
Pavia ©   (2006-03-12 14:25) [11]

guitarist
Темболее я зачисляю штраф еще в зависемости от популярности данного пикселя в других шаблонах.
К примеру при шрифте
font.Name:="CityBlueprint";
Такой способ дает 1-2% не удачь на 15% муссора.
А если не учитывать популяность S заменить на 1.То процент не удачь возрастает в 10 раз и становиться равным 15-20%.


 
Pavia ©   (2006-03-12 16:10) [12]

А да там в примере квадрат залазит на шаблон 9 по-этому была ошибка распознования 9.


 
guitarist ©   (2006-03-12 17:52) [13]

Пример посмотрел, хорошо работает.
Но моя прога при таком же алгоритме дает вероятность распознавания около 1/3 при анализе числа из 4 цифр, хотелось бы улучшить, но боюсь придется все кардинально менять


 
Чародей ©   (2006-03-12 20:43) [14]


> Чародей, а что это вычитание даст, вроде ничего полезного.

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


 
guitarist ©   (2006-03-12 21:48) [15]

Нет, шум к сожалению тоже черный :(. И его не мало. Даже визуально иногда трудновато бывает отличить 6 от 5. Все было бы замечательно, если бы цифры стояли на известных местах, тогда (я проверял, правильность >80%), но левый угол цифры может плавать в прямоугольнике 3*4 и соответственно нечаянно получается, что он находит цифру там, где ее визуально не видно (что-то типа набора точек, которые на взгляд не составляют цифру, но по алгоритму походят на цифру, вот в чем проблема)


 
Чародей ©   (2006-03-12 22:41) [16]


> Нет, шум к сожалению тоже черный :(. И его не мало.
> Даже визуально иногда трудновато бывает отличить 6 от 5.

В таких шумах даже такие танки как Finereader, вязнут. Научить машину тому, что сам с трудом сделать можешь - это не реально. А по теме, можно попытаться использовать многократные проходы с не небольшими смещениями(размер все-таки не большой), вести статистику и самых неподходящих отсеивать.

> Нет, шум к сожалению тоже черный

При таком раскладе вероятность успешного распознования очень низка


 
Pavia ©   (2006-03-13 00:24) [17]

guitarist
Переписал алгоритм для поиска чисел с не фиксированном положением. Но пока не провел опитмизацию. Да и ошибки не выявленны. На глазок при 5% грязи распознает больше 80%. Про алгоритм писал  выши перебираем все варианты ищим минимумы.


 
guitarist ©   (2006-03-13 18:59) [18]

Нет, делаю все как можно оптимальнее: и популярность считаю и минимумы смотрю, но похоже больше процент успеха не увеличить при таком подходе. Нужно что-то кардинально другое, но другие алгоритмы в голову не приходят. Похоже придется оставить так.
Спасибо всем, кто помогал!

ЗЫ Жду предложений



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.043 c
1-1141933850
SveT
2006-03-09 22:50
2006.04.16
формат даты


4-1138030365
Volf_555
2006-01-23 18:32
2006.04.16
Как получить ТЕКСТ окна, найденного при помощь GetWindowText?


1-1141375970
MegaVolt
2006-03-03 11:52
2006.04.16
Куда делась память?


6-1136699997
ezorcist
2006-01-08 08:59
2006.04.16
Запретить показывать ошибку


15-1143477953
DillerXX
2006-03-27 20:45
2006.04.16
Проиграть файл в микрофон :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский