про распознавание strokes (хуй знает, как это поточней перевести) |
[Sep. 26th, 2013|08:40 pm] |
как я уже когда-то писал, есть у меня библиотека для распознавания методом DTW. распознаёт, конечно, зверски, но и тормозит примерно так же. к тому же математика внутри (хорошо, что её самому писать не пришлось, а удалось красиво спиздить). и данных хранит дохуя. несомненный плюс — даже по одному образцу, как выше сказано, зверь-машина.
есть ещё распознавалка по методу Олега Доперчука: на основе dot product (как это будет на вашем… а! скалярное произведение, вроде бы). в принципе, распознаёт, но таки хочет, чтобы рисовали поточнее. со сложными фигурками типа буквы «пси» или пентаграммы у неё плоховато.
также игрался с $1 recognizer: неплох. правда, одиночные линии не умеет вовсе. даже на одном шаблоне распознаёт достаточно неплохо, но лучше ей нарисовать по нескольку шаблонов на stroke.
ну, и совсем недавно таки накарябал protractor. ему вместо 64 опорных точек вообще достаточно 16. также ему не надо укладывать stroke в квадратик, поэтому он теоретически способен понимать прямые линии (на практике, правда, он что горизонтальную, что вертикальную — обе считает одним и тем же). а ещё он не елозит туда-сюда по stroke, поэтому если ему скормить много-много шаблонов, то он будет значительно быстрее $1. и кода в нём поменьше.
правда, статью про то, как этот protractor толком работает, я не одолел, поэтому нихуя не понимаю, что у него получается на выхлопе. опытным путём установлено, что stroke более-менее сложной формы стоит принимать «на веру», если выхлоп больше четырёх. и вообще: чем больше, тем лучше попадание.
на практике protractor разрывает всех по совокупности параметров «количество байт на шаблон / скорость / точность». то есть, за счёт того, что для одного шаблона нужно всего 16*2*sizeof(float) и скорости можно хранить дохуя и ещё чуть-чуть шаблонов, что сильно повысит точность распознавания.
а вот если никто никуда не спешит — то там, натурально, DTW: эта зверюка распознает такое, что я и сам не сразу узнать смогу. но считает она риальне дохера и больше и не заморачивается ресэмплингом, поэтому для десятка шаблонов ей захавать 40кб — не проблема ваще. и на процессорах без hard fp это будет медленно и печально. и код там даже с поллитрой не проссышь. но с прямыми линиями зато — никаких проблем вообще.
ах, да: $1 и protractor могут насрать на ориентацию stroke в пространстве (и по-умолчанию срут). лично я считаю это скорее недостатком. для DTW же придётся или понять математику, которая там внизу, потом охуеть и всё равно попытаться «покрутить» stroke руками, чтобы они более-менее одинаково были расположены. предыдущие два, кстати, тоже stroke крутят, но не очень навязчиво.
в общем, для большинства практических применений советую protractor. если будете брать код со страницы $1, то не забывайте, что для protractor'а совершенно не надо масштабировать накарябаное: ему плевать. а лучше почитайте псевдокод, который даёт автор статьи, и транслируйте его в любимый язык — в этом псевдокоде ещё и простой метод обрубить независимость от ориентации дан. нужны вам будут sqrt, sin, cos, atan2, просто atan, а также acos. |
|
|