Вопрос по c++, algorithm – Обработка изображений: Улучшение алгоритма для распознавания Coca-Cola Can

1504

Одним из наиболее интересных проектов, над которыми я работал в последние пару лет, был проект оОбработка изображения, Цель состояла в том, чтобы разработать систему, способную распознавать кока-колу'cans' (обратите внимание, что я подчеркиваю слово «банки», вы поймете почему через минуту). Вы можете увидеть образец ниже, с банкой, распознанной вgreen rectangle с масштабом и вращением.

Template matching

Некоторые ограничения на проект:

The background could be very noisy. The can could have any scale or rotation or even orientation (within reasonable limits). The image could have some degree of fuzziness (contours might not be entirely straight). There could be Coca-Cola bottles in the image, and the algorithm should only detect the can! The brightness of the image could vary a lot (so you can't rely "too much" on color detection). The can could be partly hidden on the sides or the middle and possibly partly hidden behind a bottle. There could be no can at all in the image, in which case you had to find nothing and write a message saying so.

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

Total fail

Я сделал этот проект некоторое время назад, и мне было очень весело, и у меня была достойная реализация. Вот некоторые подробности о моей реализации:

Language: Сделано в C ++ с использованиемOpenCV библиотека.

Pre-processing: Для предварительной обработки изображения, то есть преобразования изображения в более сырую форму, чтобы придать алгоритму, я использовал 2 метода:

Changing color domain from RGB to HSV and filtering based on "red" hue, saturation above a certain threshold to avoid orange-like colors, and filtering of low value to avoid dark tones. The end result was a binary black and white image, where all white pixels would represent the pixels that match this threshold. Obviously there is still a lot of crap in the image, but this reduces the number of dimensions you have to work with. Binarized image Noise filtering using median filtering (taking the median pixel value of all neighbors and replace the pixel by this value) to reduce noise. Using Canny Edge Detection Filter to get the contours of all items after 2 precedent steps. Contour detection

Algorithm: Сам алгоритм, который я выбрал для этой задачи, был взят изэтот удивительная книга по извлечению функций и называетсяОбобщенное преобразование Хафа (довольно сильно отличается от обычного преобразования Хафа). В основном это говорит о нескольких вещах:

You can describe an object in space without knowing its analytical equation (which is the case here). It is resistant to image deformations such as scaling and rotation, as it will basically test your image for every combination of scale factor and rotation factor. It uses a base model (a template) that the algorithm will "learn". Each pixel remaining in the contour image will vote for another pixel which will supposedly be the center (in terms of gravity) of your object, based on what it learned from the model.

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

GHT

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

ResultsТеперь, хотя этот подход работал в основных случаях, в некоторых областях его не хватало:

It is extremely slow! I'm not stressing this enough. Almost a full day was needed to process the 30 test images, obviously because I had a very high scaling factor for rotation and translation, since some of the cans were very small. It was completely lost when bottles were in the image, and for some reason almost always found the bottle instead of the can (perhaps because bottles were bigger, thus had more pixels, thus more votes) Fuzzy images were also no good, since the votes ended up in pixel at random locations around the center, thus ending with a very noisy heat map. In-variance in translation and rotation was achieved, but not in orientation, meaning that a can that was not directly facing the camera objective wasn't recognized.

Можете ли вы помочь мне улучшить мойspecific алгоритм, используяexclusively OpenCV особенности, чтобы решитьfour specific упомянутые проблемы?

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

Как насчет подхода, аналогичногоreCAPTCHA? ;) George Duckett
Почему это было перенесено изdsp.stackexchange.com? Кажется, что этот сайт будет даже лучше, чем stackoverflow o_O BlueRaja - Danny Pflughoeft
Можно было бы сказать, что этот вопрос более уместен на dsp.stackexchange.com или stats.stackexchange.com, и вам, безусловно, следует рассмотреть возможность повторного запроса на этих сайтах. ely
Первое, что нужно сделать, это проанализироватьwhy происходят разные случаи сбоев. Например, выделите примеры мест, где выигрывают бутылки, где изображения размыты и т. Д., И проведите некоторый статистический анализ, чтобы узнать разницу между их представлениями Хафа и теми, которые вы хотели бы обнаружить. Некоторые отличные места, чтобы узнать об альтернативных подходахhere а такжеhere ely
@stacker делает хорошую мысль. Для скорости вы хотите получить дешевые функции для вычисления, такие как гистограммы ориентированных градиентов. По-настоящему наивным первым подходом было бы вручную пометить группу прямоугольников банок на некоторых обучающих изображениях и использовать эти плюс случайные отрицательные примеры для обучения SVM или классификатора дерева решений. Обучение займет больше времени, но выполнение на новых изображениях будет намного быстрее. Я планирую написать этот метод, когда у меня будет больше свободного времени, чтобы включить правильные ссылки. ely

Ваш Ответ

23   ответа
609

к) с использованиеммасштабно-инвариантное преобразование объектов (SIFT) илиУскоренные надежные функции (SURF).

Это реализовано вOpenCV 2.3.1.

Вы можете найти хороший пример кода, используя функции вОсобенности 2D + Гомография для поиска известного объекта

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

Enter image description here

Источник изображения: учебный пример

Обработка занимает несколько сотен мсек для SIFT, SURF немного быстрее, но не подходит для приложений реального времени. ORB использует FAST, который слабее относительно инвариантности вращения.

The original papers SURF: Speeded Up Robust Features Distinctive Image Features from Scale-Invariant Keypoints ORB: an efficient alternative to SIFT or SURF
Так что попробуйте OpenCV's ORB или FREAK, у которых нет проблем с патентами. ORB намного быстрее, чем SIFT. ORB это немного плохо с масштабными и легкими вариациями в моем опыте, но проверьте это сами.
@ G453 ты абсолютно прав! Вероятно, он был очарован работой SHIFT и забыл, что извлечение и сопоставление функций НЕ было проблемой ...
Как вы можете принять это как ответ ... Ни один из дескрипторов функций не может отличить бутылки от банок ... Все они просто просматривают инвариантные локальные дескрипторы образца. Я согласен с тем, что SIFT, SURF, ORB, FREAK и т. Д. Могут помочь вам в подборе функций, но ... Как насчет других ваших частей вопроса, таких как окклюзия, бутылка против банок и т. Д. Я надеюсь, что на самом деле это не полное решение, если бы вы УДАЛИТЕ вашу проблему, вероятно, первым результатом будет только этот ответ.
Я согласен с @stacker - SIFT - отличный выбор. Он очень устойчив к операциям масштабирования и вращения. Он несколько устойчив к деформации перспективы (это может быть улучшено в соответствии с предложением укладчика: база данных шаблонов с различными видами перспективы желаемого объекта). Его Ахиллес & apos; каблук в моем опыте был бы сильными изменениями освещения и очень дорогими вычислениями Я не знаю ни одной реализации Java. Я знаю о реализации OpenCV и использовал графический процессор c ++ / Windows (SiftGPU) реализация подходит для производительности в реальном времени.
Предупреждение: насколько я люблю SIFT / SURF и что они сделали со мной, они обременены патентом. этоmight быть проблемой, в зависимости от ряда условий, включая географическое положение AFAIK.
30

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

Также я могу предложить, не обязательно для точности или скорости, но для удовольствия вы можете использовать обученную нейронную сеть на вашем сегментном изображении, чтобы определить форму банки. Это очень быстро и часто может быть до 80/90% точности. Обучение было бы немного долгим процессом, так как вы должны были бы вручную идентифицировать банку на каждом изображении.

Error: User Rate Limit Exceeded
Количество тренировочных наборов варьируется, но вы должны быть осторожны в нескольких вещах: не перетренируйтесь, вам, вероятно, нужен тестовый набор, чтобы показать, как ваша точность движется. Также количество тренировочных наборов будет зависеть от количества слоев, которые вы будете использовать.
Каков примерно размер тренировочного набора с нейронной сетью, чтобы иметь удовлетворительные результаты? Что хорошо в этом методе, так это то, что мне нужен только один шаблон, чтобы соответствовать почти всем. Charles Menguy
Error: User Rate Limit Exceeded Charles Menguy
На самом деле я не объяснил это в посте, но для этого задания мне дали набор из примерно 30 изображений, и мне пришлось создать алгоритм, который бы соответствовал им всем в различных ситуациях, как описано. Конечно, некоторые изображения были проведены для проверки алгоритма в конце. Но мне нравится идея датчиков Kinect, и я бы хотел больше узнать об этом! Charles Menguy
9

независимо от того, является ли он не по теме или нет: P

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

Нам пришлось разработать робота, который использовал Xbox Kinect для обнаружения бутылок и банок кокса любой ориентации при различных условиях освещения и окружающей среды. Наше решение заключалось в использовании полосового фильтра на канале Хюэ в сочетании с преобразованием крутого круга. Мы смогли немного ограничить окружающую среду (мы могли выбрать, где и как расположить робота и датчик Kinect), в противном случае мы собирались использовать преобразования SIFT или SURF.

Вы можете прочитать о нашем подходе намой блог на тему :)

Error: User Rate Limit Exceeded
18

something (это похоже на самый интересный вопрос в истории - так что было бы стыдно не продолжать пытаться найти «идеальный» ответ, даже если приемлемый был найден) ...

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

Какиеis вокруг логотипа? Для банки можно увидеть металл, который, несмотря на воздействие света, не меняет своего основного цвета. Пока мы знаем угол метки, мы можем сказать, что находится непосредственно над ней, поэтому мы смотрим на разницу между ними:

Здесь то, что выше и ниже логотипа, полностью темное, имеет постоянный цвет. Относительно легко в этом отношении.

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

И, наконец, хитрый. Но не так сложно, как только мы перейдем к тому, что видим непосредственно над (и под) красной оберткой. Он прозрачный, что означает, что он покажет все, что стоит за ним. Это хорошо, потому что вещи, которые стоят за ним, вряд ли будут такими же постоянными по цвету, как серебристый круговой металл банки. За этим может быть много разных вещей, которые говорят нам, что это пустая (или заполненная прозрачной жидкостью) бутылка, или однородного цвета, что может означать, что она заполнена жидкостью или что бутылка просто перед сплошным цветом. Мы работаем с тем, что ближе всего к верху и низу, и шансы на то, что правильные цвета находятся в нужном месте, относительно невелики. Мы знаем, что это бутылка, потому что у нее нет того ключевого визуального элемента банки, который относительно упрощен по сравнению с тем, что может быть за бутылкой.

(that last one was the best I could find of an empty large coca cola bottle - interestingly the cap AND ring are yellow, indicating that the redness of the cap probably shouldn't be relied upon)

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

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

Find the main attraction (red logo background, and possibly the logo itself for orientation, though in case the can is turned away, you need to concentrate on the red alone) Verify the shape and orientation, yet again via the very distinctive redness Check colours around the shape (since it's quick and painless) Finally, if needed, verify the shape of those colours around the main attraction for the right roundness.

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

Интересные дополнительные ночные кошмары могут включать банку, удобно расположенную за бутылкой на таком расстоянии, что ее металл просто так окажется над и под этикеткой, которая все равно потерпит неудачу, пока вы сканируете по всей длине красного Этикетка - это на самом деле большая проблема, потому что вы не обнаруживаете банку, где вы могли бы иметь, в отличие от того, что вы действительно обнаруживаете бутылку, включая банку случайно. В этом случае стакан наполовину пуст!

Как заявление об отказе от ответственности, я не имею никакого опыта обработки изображений за пределами этого вопроса и никогда не думал об этом, но это настолько интересно, что заставило меня задуматься об этом, и после прочтения всех остальных ответов я считаю, что это, возможно, самый легкийand самый эффективный способ сделать это. Лично я просто рад, что я неactually надо подумать о программировании этого!

EDIT

bad drawing of a can in MS paint Кроме того, посмотрите на этот рисунок, который я сделал в MS Paint ... Он абсолютно ужасный и неполный, но, основываясь только на форме и цветах, вы можете догадаться, каким он может быть. По сути, это единственные вещи, которые нужно сканировать. Когда вы смотрите на эту очень отличительную форму и сочетание цветов так близко, что еще это может быть? Бит, который я не рисовал, белый фон, следует считать «чем-то непоследовательным». Если бы у него был прозрачный фон, он мог бы охватить практически любое другое изображение, и вы все равно могли бы его увидеть.

Error: User Rate Limit Exceededcheckerboard illusion.
21

HSV, красный фильтр - & gt; двоичное изображение,близко (затем расширить эродировать, известный какimclose в матлаб)

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

Это оставит вас с красными прямоугольниками, тогда вам нужно будет каким-то образом обнаружить логотипы, чтобы сказать, являются ли они красным прямоугольником или банкой из-под кока-колы. Нравится OCR, но с известным логотипом?

Error: User Rate Limit Exceeded Charles Menguy
47

Даррен Кук а такжеОтветы укладчика к этой проблеме. Я был в состоянии бросить свои мысли в комментарии к ним, но я считаю, что мой подход слишком сформирован, чтобы не уходить отсюда.

Вкратце, вы определили алгоритм для определения того, что логотип Coca-Cola присутствует в определенном месте в пространстве. Вы сейчас пытаетесь определить для произвольных ориентаций и произвольных коэффициентов масштабирования эвристику, подходящую для различения Coca-Colacans от других объектов, в том числе:bottles, billboards, advertisements, а такжеCoca-Cola paraphernalia все связано с этим знаковым логотипом. Вы не вызывали многие из этих дополнительных случаев в своем заявлении о проблеме, но я чувствую, что они жизненно важны для успеха вашего алгоритма.

Секрет в том, чтобы определить, какие визуальные особенностиcan содержит или, через отрицательное пространство, какие функции присутствуют для других продуктов кока-колы, которые отсутствуют для банок. С этой целью,текущий топ-ответ обрисовывает в общих чертах основной подход для выбора "может" тогда и только тогда, когда «бутылка» не идентифицируется ни наличием крышки бутылки, жидкости или других подобных визуальных эвристик.

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

Для этого наиболее правильными критериями выбора банок являются следующие:

Is the shape of the object silhouette, as you sketched out in your question, correct? If so, +1. If we assume the presence of natural or artificial light, do we detect a chrome outline to the bottle that signifies whether this is made of aluminum? If so, +1. Do we determine that the specular properties of the object are correct, relative to our light sources (illustrative video link on light source detection)? If so, +1. Can we determine any other properties about the object that identify it as a can, including, but not limited to, the topological image skew of the logo, the orientation of the object, the juxtaposition of the object (for example, on a planar surface like a table or in the context of other cans), and the presence of a pull tab? If so, for each, +1.

Ваша классификация может выглядеть следующим образом:

For each candidate match, if the presence of a Coca Cola logo was detected, draw a gray border. For each match over +2, draw a red border.

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

Обнаружение каждого свойства несет в себе очень разную временную и пространственную сложность, и для каждого подхода быстрое прохождениеhttp://dsp.stackexchange.com более чем разумно для определения наиболее правильного и наиболее эффективного алгоритма для ваших целей. Я намерен здесь просто и просто подчеркнуть, чтоdetecting if something is a can by invalidating a small portion of the candidate detection space не является наиболее надежным или эффективным решением этой проблемы, и в идеале вы должны принять соответствующие меры.

И эй, поздравляю сХакерские новости! В целом, это довольно потрясающий вопрос, достойный той рекламы, которую он получил. :)

Это то, о чем я думал: не исключаю, какие-то ложные срабатывания. Правило в том, что делает колу. Но мне интересно: что ты делаешь со сплющенной банкой? Я имею в виду, что если вы наступите на кокс, это все равно может быть кокс. Но он больше не будет иметь такую же форму. Или это проблема AI-Complete?
Это интересный подход, который, по крайней мере, стоит попробовать, мне очень нравится ваше рассуждение о проблеме Charles Menguy
8

Deep Learning

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

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

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

OpenCV и Google Net: http://docs.opencv.org/trunk/d5/de7/tutorial_dnn_googlenet.html

OpenCV и SVM: http://docs.opencv.org/2.4/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html

0

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

1: первая характеристика - цвет, а красный цвет очень доминирующий. После обнаружения Coca Cola Red есть несколько предметов, представляющих интерес 1А: насколько велика эта красная область (достаточно ли ее для определения истинной банки или нет - вероятно, 10 пикселей недостаточно), 1B: содержит ли он цвет этикетки - «Coca-Cola» или волна. 1B1: Достаточно ли, чтобы рассмотреть высокую вероятность того, что это метка?

Элемент 1 является своего рода кратким сокращением - предварительная обработка, если в изображении нет сопляков, - переходите к следующему.

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

2: с учетом вышеуказанного идентификатора области изображения d в 1 - проверить окружающие точки [края] рассматриваемого элемента. A: Есть ли то, что кажется верхней или нижней частью банки - серебро? B: Бутылка может показаться прозрачной, но может быть и стеклянный стол - есть ли стеклянный стол / полка или прозрачная зона - если это так, есть несколько возможных выходов. Бутылка МОЖЕТ иметь красную крышку, может и не быть, но она должна иметь либо форму крышки бутылки / винта с резьбой, либо крышку. C: Даже если это потерпит неудачу A и B, оно все еще может быть частичным. Это более сложно, когда оно является частичным, потому что частичная бутылка / частичная может выглядеть одинаково, поэтому некоторая дополнительная обработка измерения Красной области от края до края ... маленькая бутылка может быть одинакового размера.

3: После вышеупомянутого анализа, когда я посмотрю на буквы и логотип волны, - потому что я могу ориентироваться в поиске некоторых букв в словах, так как у вас может не быть всего текста из-за отсутствия всех может, волна будет выравниваться в определенных точках с текстом (по расстоянию), чтобы я мог искать эту вероятность и знать, какие буквы должны существовать в этой точке волны на расстоянии x.

2

MVTec чьи демки могут дать вам хорошие идеи алгоритма. Существует множество примеров, похожих на вашу проблему, которые вы можете запустить в демонстрационном режиме, а затем посмотреть на операторы в коде и посмотреть, как их реализовать из существующих операторов OpenCV.

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

39

Looking at shape

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

Looking at highlights

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

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

В вашем примере, обратите внимание, что зеркальность пластиковой этикетки гораздо более размыта, чем очень яркие пятна на банке? Вот как вы можете сказать.
Что, если источник света был позади банки? Я думаю, что вы не увидите основной момент.
Мне нравится эта идея, но, похоже, вам нужны действительно хорошие условия освещения. На примере изображения, где есть и банка, и бутылка, например, это довольно сложно различить. Charles Menguy
Я вижу, какой тип представления цветового пространства вы бы использовали в этом случае для отражения зеркальности в вашем алгоритме? Это кажется довольно сложным, чтобы получить в RGB или HSV Charles Menguy
6

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

Это может быть полезно для извлечения только банок и может сочетаться с обнаружением прозрачных объектов.

35

Хищник трекер, Требуется некоторое обучение, но он может активно изучать, как отслеживаемый объект выглядит в разных ориентациях и масштабах, и делает это в режиме реального времени!

Исходный код доступен на его сайте. Это вMATLAB, но, возможно, есть реализация Java, уже сделанная членом сообщества. Я успешно повторно внедрил часть трекера TLD в C #. Если я правильно помню, TLD использует Папоротники в качестве детектора ключевых точек. Вместо этого я использую SURF или SIFT (уже предложенный @stacker) для повторного получения объекта, если он был потерян трекером. Обратная связь трекера позволяет легко со временем построить динамический список шаблонов просеивания / прибоя, которые со временем позволяют повторно захватывать объект с очень высокой точностью.

Если вы заинтересованы в моей реализации трекера на C #, не стесняйтесь спрашивать.

Новая ссылка:kahlan.eps.surrey.ac.uk/featurespace/tld
Нотабене Спустя годы ссылка сейчас мертва
Спасибо за ссылку, которая выглядит интересно. Что касается обучения, какой размер тренировочного набора был бы разумным для достижения разумных результатов? Если у вас есть реализация даже в c #, это было бы очень полезно! Charles Menguy
Исследуя TLD, я обнаружил, что другой пользователь ищет реализацию C # - есть ли причина не размещать вашу работу на Github?stackoverflow.com/questions/29436719/…
114

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

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

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

Второе, что я подумал, было о прозрачности бутылки. OpenCV имеет несколько работ по поиску прозрачных объектов на изображении. Проверьте ссылки ниже.

OpenCV Meeting Notes Minutes 2012-03-19

OpenCV Meeting Notes Minutes 2012-02-28

Особо посмотрите на это, чтобы увидеть, насколько точно они обнаруживают стекло:

OpenCV Meeting Notes Minutes 2012-04-24

Смотрите их результат:

Enter image description here

Они говорят, что это реализация документа& quot; Геодезическая структура активного контура для поиска стекла & quot; К. МакГенри и Дж. Понсе, CVPR 2006.

Это может быть полезно в вашем случае немного,but problem arises again if the bottle is filled.

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

Enter image description here

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

Во всяком случае, это решение также имеет другие проблемы, как и в других решениях.

It works only if your bottle is empty. In that case, you will have to search for the red region between the two black colors (if the Coca Cola liquid is black). Another problem if transparent part is covered.

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
10

которая изучает и повышает точность классификации органично из опыта.

Я предлагаю глубокое обучение, а с глубоким изучением это становится тривиальной проблемой.

Вы можете переучить начальную v3 модель на Tensorflow:

Как восстановить финальный слой Inception для новых категорий.

В этом случае вы будете обучать сверточную нейронную сеть классифицировать объект как кока-колу или нет.

Хот-дог или не хот-дог?
20

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

Я также проверил, что отношение ширины к высоте довольно схоже для бутылки и может, так что это тоже не вариант. Charles Menguy
Соотношение этикеток (будучи товарным знаком) одинаково. Поэтому, если (большая) бутылка находится немного дальше на картинке, ее размер будет точно таким же, как и размер банки.
Это всего лишь комментарий, а не ответ, но он намного ближе к тому, чтобы быть ответом, чем приведенный выше комментарий с ответом со 120 голосами.
На самом деле нет: нет никаких ограничений по размеру или ориентации (или ориентации, но я действительно не справился с этим), поэтому вы можете иметь бутылку очень далеко на заднем плане и банку на переднем плане, и банка может быть намного больше чем бутылка. Charles Menguy
Чтобы объяснить немного больше. Предположим, что банка находится при z = 0, а бутылка при z = -100. Поскольку бутылка далеко позади, она будет выглядеть меньше. Но если я знаю, что бутылка находится при z = -100 и может при z = 0, тогда я могу рассчитать ожидаемый размер банки / бутылки, если оба значения будут переведены в z = 0. Так что теперь они на одной глубине, и, следовательно, я могу принимать решения в зависимости от размера.
8

что последние 5 лет современные технологии были доведены до предела, я не буду использовать OpenCV для выполнения этой задачи сейчас! (I know you specifically wanted OpenCv features in the questionЯ чувствую, что алгоритмы обнаружения объектов, такие как Faster-RCNN, YOLO, SSD и т. Д., Могли бы решить эту проблему со значительным преимуществом по сравнению с функциями OpenCV. Если бы я решил эту проблему сейчас (через 6 лет !!), я бы определенно использовалFaster-RCNN.

13

и я хотел дать ответ, который, я думаю, решает проблему.

Extract features (keypoints, descriptors such as SIFT, SURF) of the logo Match the points with a model image of the logo (using Matcher such as Brute Force ) Estimate the coordinates of the rigid body (PnP problem - SolvePnP) Estimate the cap position according to the rigid body Do back-projection and calculate the image pixel position (ROI) of the cap of the bottle (I assume you have the intrinsic parameters of the camera) Check with a method whether the cap is there or not. If there, then this is the bottle

Обнаружение шапки это еще одна проблема. Это может быть сложным или простым. На вашем месте я бы просто проверил цветовую гистограмму в ROI для простого решения.

Пожалуйста, дайте отзыв, если я не прав. Благодарю.

15

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

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

Error: User Rate Limit Exceeded
0

слишком много лет спустя, но, тем не менее, теория, чтобы попробовать.

Отношение ограничивающего прямоугольника красной области логотипа к общему размеру бутылки / банки различно. В случае Can, должно быть 1: 1, тогда как будет отличаться от бутылки (с крышкой или без). Это должно облегчить различие между ними.

Обновить: Горизонтальная кривизна области логотипа будет отличаться для банки и бутылки из-за разницы в размерах. Это может быть особенно полезно, если ваш робот должен забрать банку / бутылку, и вы решаете захват соответственно.

143

когда я взглянул на изображение твоей бутылки, я тоже подумал, что это банка Но, как человек, я заметил разницу, когда заметил, что это тоже бутылка ...

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

Не слишком сложно реализовать, если вы уже делаете банки. Настоящим недостатком является удвоение времени обработки. (Но если подумать о реальных приложениях, вы все равно захотите делать бутылки ;-)

Если есть красный колпачок (или кольцо), параллельный «кока-коле»; это скорее всего бутылка.
По сути это разумное направление. Я бы сформулировал это немного по-другому: сначала найдите всех кандидатов, а затем для каждого кандидата определите, является ли это бутылкой, банкой или чем-то еще.
@linker Как вы тренировали свой алгоритм для банок? У вас были примеры банок? Как насчет тренировки с примерами бутылок?
Сила этого алгоритма в том, что вам нужно толькоone шаблон для обучения, а затем он применяет все преобразования, чтобы сопоставить его с другими потенциальными банками. Я использовал бинаризованную и контурную версию этого шаблона для тренировки, поэтому единственной разницей между банкой и бутылкой была бы пробка, но я боюсь, что это принесет больше ложных срабатываний, поскольку центр тяжести будет где-то на краю. или вне бутылки. Думаю, стоит попробовать. Но это удвоит мое время обработки, и я заплачу;) Charles Menguy
Да, я тоже об этом думал, но у меня не было много времени, чтобы сделать это. Как бы вы узнали бутылку, поскольку ее основная часть будет выглядеть как чешуйчатая банка? Я тоже думал о поиске красной пробки и смотрю, выровнена ли она по центру бутылки, но это не кажется очень надежным. Charles Menguy
10

используемых для распознавания объектов, в приведенной ниже статье их много. Они особенно мощны в сочетании с SIFT или SURF. SURF или SIFT сами по себе не очень полезны в изображении кока-колы, потому что они не распознают много интересных точек, вам нужна информация о цвете, чтобы помочь. Я использую BIC (Border / Interior Pixel Classi & # xFB01; cation) с SURF в проекте, и он отлично работал для распознавания объектов.

Цветовые дескрипторы для поиска веб-изображений: сравнительное исследование

Ссылка не работает.
350

я бы воспользовался тем, что вас не просят найти произвольное изображение / объект, а именно изображение с логотипом Coca-Cola. Это важно, потому что этот логотип является очень отличительным, и он должен иметь характерную масштабно-инвариантную сигнатуру в частотной области, особенно в красном канале RGB. Другими словами, чередующийся шаблон красного с белого на красный, встречающийся горизонтальной линией сканирования (натренированный на горизонтально выровненном логотипе), будет иметь характерный «ритм»; как это проходит через центральную ось логотипа. Этот ритм будет «ускоряться» или "замедление" в разных масштабах и ориентациях, но останется пропорционально эквивалентным. Вы можете идентифицировать / определить несколько десятков таких линий развертки, как по горизонтали, так и по вертикали через логотип и еще несколько по диагонали, в виде звездных вспышек. Назовите их «строки проверки подписи».

Signature scan line

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

Я был бы удивлен, если бы это не был линейно-эффективный алгоритм или почти так. Это, очевидно, не учитывает вашу дискриминацию в бутылках, но, по крайней мере, у вас будут свои логотипы.

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

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Charles Menguy
Error: User Rate Limit ExceededanyError: User Rate Limit Exceeded
Error: User Rate Limit Exceededextremely fastError: User Rate Limit Exceeded
Error: User Rate Limit ExceededapproximationError: User Rate Limit ExceededthesisError: User Rate Limit Exceeded
0

чтобы это происходило в режиме реального времени, то вам нужно добавить фильтр предварительной обработки, чтобы определить, что сканируется с использованием сверхпрочных материалов. Хороший быстрый фильтр предварительной обработки, работающий в режиме реального времени, который позволит вам сканировать вещи, которые с большей вероятностью могут быть кока-колой, чем прежде, чем переходить к более сомнительным вещам, выглядит примерно так: ищите на изображении самые большие участки цвета, которые являются определенной терпимостью отsqrt(pow(red,2) + pow(blue,2) + pow(green,2)) вашей кока-колы Начните с очень строгой цветопередачи и переходите к более мягким допускам по цвету. Затем, когда вашему роботу не хватает времени для обработки текущего кадра, он использует найденные в данный момент бутылки для ваших целей. Обратите внимание, что вам придется настроить цвета RGB вsqrt(pow(red,2) + pow(blue,2) + pow(green,2)) чтобы получить их правильно.

Кроме того, это кажется действительно глупым, но вы обязательно включите-oFast Оптимизация компилятора, когда вы компилировали свой код на C?

Похожие вопросы