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

Поиск товаров на полках

Recommended Posts

Здравствуйте.

Есть такая задача: все видели на полках в супермаркетах товары, есть как попало брошенные, есть те что красиво расставленые. Речь пойдет о вторых. Есть фотка полок супермаркета, есть фотка определенного товара(какой-то пример в базе данных). Нужно на фотке с супермаркета найти данный нам пример (как показано на фотке ниже)

f6164916fcdb0c1d3cf4da35169f7032.png

Вопрос состоит в том, как это легче реализировать, какими способами и может какойто примерчик ^_^

Cпасибо!

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


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

В папке с примерами, входящими в комплект opencv есть исходники как раз для этих целей: find_obj.cpp, find_obj_calonder.cpp, find_obj_ferns.cpp

Еще будут полезны: descriptor_extractor_matcher.cpp, detector_descriptor_evaluation.cpp, generic_descriptor_match.cpp, matcher_simple.cpp, matching_to_many_images.cpp

Ну и корреляционные методы никто не отменял: см. ф-цию cvMatchTemplate.

  • Like 1

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


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

+ bagofwords_classification.cpp

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


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

C AdaBoosting тебе будет непросто.

Во-первых, в классическом варианте разделяется только два класса (а у тебя видов продуктов будет больше?).

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

  • Like 1

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


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

Продуктов должно быть много и они должны быть найдены на фото как можно скорее.

Пока с adaBoosting удалось добиться незначительных результатов!

a1fb10ee7414ad84009f8b7e6188cac8.jpeg 5243876bb6b7aba0db243e34a617d30e.jpeg

Да и по неизвестным причинам иногда зависает haartraining при обучении dolf_ru_117.gif.

(Было бы супер если бы ктота подсказал где может быть проблема).

фрагмент кода где возможно проблема (cvhaartraining.cpp)

for( ; ; )

           {

               ok = callback( &img, userdata );

               if( !ok )

                   break;


               CCOUNTER_INC(thread_consumed_count);


               sumdata = (sum_type*) (data->sum.data.ptr + i * data->sum.step);

               tilteddata = (sum_type*) (data->tilted.data.ptr + i * data->tilted.step);

               normfactor = data->normfactor.data.fl + i;

               sum.data.ptr = (uchar*) sumdata;

               tilted.data.ptr = (uchar*) tilteddata;

               icvGetAuxImages( &img, &sum, &tilted, &sqsum, normfactor );            

               if( cascade->eval( cascade, sumdata, tilteddata, *normfactor ) != 0.0F )

               {

                   CCOUNTER_INC(thread_getcount);

                   break;

               }

           }

насчет кода: как видите должно виполнится какое-то условие чтоб выйти с цикла, но при построении некоторых класыфикаторов почемуто условие не выполняется и цикл не останавливается(при том что для предидущих все было ок (да кстати на другой ОС для того же vec файла и тех же параметров тоже все било ок))

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

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


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

>Дело в том что для данной задачи надо найти метод устойчив к разному освещению, угла наклона и масштаба.

есть дескрипторы инвариантные ко всему этому.(Sift,Surf и т.д.) точно не помню у каких как, но можно погуглить по

feature descriptor is invariant to scale, orientation, and affine distortion, and partially invariant to illumination changes.

  • Like 1

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


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

Спасибо за совет.

SURF то что надо!

Но теперь большой вопрос как приспособиты SURF к базе данных из более 1000 продуктов. Не бежать же по базе и проверять наличие каждого продукта?

Подскажите что-то эффективное пожалуйстаdolf_ru_225.gif

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


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

Про Image Hash ничего не слышали?

Библитека для копания:

http://phash.org/

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

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


Ссылка на сообщение
Поделиться на других сайтах
Но теперь большой вопрос как приспособиты SURF к базе данных из более 1000 продуктов. Не бежать же по базе и проверять наличие каждого продукта?

Подскажите что-то эффективное пожалуйста

ну наверно деревья, хэш-таблицы.

вопрос не очень понятен, надо на одной картинке(полка товаров) найти объекты из 1000 продуктов?

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

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

вот вы каким сейчас методом сравниваете брутфорсом?

тоже не очень понятно как это поможет, если там сравниваются 2 предположительно похожих\непохожих изображения.

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

http://stackoverflow.com/questions/3505674/comparing-sift-features-stored-in-a-mysql-database

http://metaoptimize.com/qa/questions/5003/searching-an-image-database-using-sift

These features are matched to the SIFT feature database obtained from the training images. This feature matching is done through a Euclidean-distance based nearest neighbor approach. To increase robustness, matches are rejected for those keypoints for which the ratio of the nearest neighbor distance to the second nearest neighbor distance is greater than 0.8. This discards many of the false matches arising from background clutter. Finally, to avoid the expensive search required for finding the Euclidean-distance-based nearest neighbor, an approximate algorithm called the best-bin-first algorithm is used.[22] This is a fast method for returning the nearest neighbor with high probability, and can give speedup by factor of 1000 while finding nearest neighbor (of interest) 95% of the time.

http://en.wikipedia.org/wiki/Scale-invariant_feature_transform

но это все применяется к поиску объект-объект , а не объект -много объектов

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


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

еще про то как матчить быстрее с помощью bag of worlds, сравнивается только со средним значением n кластеров.

хотя непонятно как и когда эти кластеры должны перестраиваться.

I'm guessing you are trying to use SIFT for image retrieval since you mentioned you have a database of images which you are comparing a query image to.

You should realize that comparing every SIFT descriptor vector in a query image with every other descritpor vectors in the image database is not feasible as this will require exponential number of comparisons. The current popular approach to do image retrieval using SIFT descriptors is the bag of words model borrowed from document retrieval.

First, what you want to do is given an image, represent it using a SINGLE vector which can be compared to the vectors of the other images in the database. This is unlike your current approach where each image has many SIFT descriptor vectors (one for each keypoint). In the bag of words(BOW) model, you first need to create what is called a visual codebook (or sometimes referred to as dictionary). You do this by:

Selecting representative images from your image database

Collect all the SIFT descriptors from the images in 1)

Cluster these descriptors using K Means into k number of clusters where k is a number you set. The center of these clusters are the "visual words" i.e. representative features in your database of images.

For every image in the database, you are going to create a vector v that counts how frequently the different features in the dictionary occurs so each image would be represented by a vector in the form of: <# times feature 1 in dictionary occur, ... feature 2 in dictionary occur..., ..., ... feature k in dictionary occur> i.e. a k dimensional vector>. You obtain this vector for a image by: 4.1) Extracting SIFT descriptors in the image 4.2) For each SIFT descriptor in the image, find the closest cluster center (using Euclidean distance) in the codebook/dictionary and increment its corresponding count in the vector v by 1. For e.g., you have a 5 cluster dictionary (i.e. k = 5) and an image has 3 SIFT descriptor. 2 of them are closest to the first cluster center and 1 is closest to the fifth cluster center. Your vector v would be v = <2, 0, 0, 0, 1>. Since v counts the number of times the representative vectors occur in an image, v is sometimes also referred to as a frequency histogram.

Now, to compare 2 images, you compare this new vector v instead of the SIFT descriptors themselves. Comparison can be done using euclidean distance (also known as L2 distance).

Basically comparing the SIFT descriptors themselves in an image to those of another is not feasible because you will end up with multiple SIFT descriptors in an image and their number varies depending on how you extract them. What you want is a common basis for comparison and that is done in the BOW model by matching the descriptors to a common codebook/dictionary which accounts for the representative features in a database of images.

кстати Adaboost можно использовать с SIFT дескрипторами?

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


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

Если на каждом образце находить ровно N штук (чтобы сохранить размерность пространства), дальше их как-то упорядочить, чтобы измерения не перемешивались то думаю можно.

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×