Я создаю веб-приложение с использованием .NET 3.5 (ASP.NET, SQL Server, C#, WCF, WF и т. д.), И я столкнулся с серьезной дилеммой дизайна. Кстати, это универсальный проект, но то, что я буду развивать, на 100% зависит от меня.
Мне нужно разработать систему, с помощью которой я могу взять изображение и автоматически обрезать определенный объект внутри него без ввода данных пользователем. Так, например, вырежьте автомобиль на изображении дороги. Я много думал об этом и не вижу подходящего метода. Я предполагаю, что эта ветка предназначена для обсуждения проблем и возможности достижения этой цели. В конце концов, я получал размеры автомобиля (или что-то еще), а затем передавал их в приложение для 3D-моделирования (настраиваемое) в качестве параметров для рендеринга 3D-модели. Этот последний шаг намного более осуществим. Проблема в обрезке. Я придумал всевозможные идеи, например, получить цвет машины, а затем обвести контур вокруг этого цвета. Итак, если автомобиль (пример) желтого цвета, когда на изображении есть желтый пиксель, обведите его. Но это не получится, если на фото две желтые машины.
В идеале хотелось бы, чтобы система была полностью автоматизирована. Но я думаю, я не могу все делать по-своему. Кроме того, мои навыки связаны с тем, что я упомянул выше (.NET 3.5, SQL Server, AJAX, веб-дизайн), а не с C++, но я был бы открыт для любого решения, просто чтобы убедиться в его осуществимости.
Я также нашел этот патент: Патент США 7034848 - Система и метод автоматической обрезки графических изображений.
Спасибо





Если я правильно это читаю ... Вот где сияет ИИ.
Я думаю, что «самым простым» решением было бы использование алгоритма распознавания изображений на основе нейронной сети. Если вы не знаете, что автомобиль будет выглядеть точный одинаково на всех фотографиях, то это в значительной степени единственный способ.
Если это то же самое, то вы можете просто найти пиксельный узор, получить ограничивающий прямоугольник и просто установить границу изображения на внутреннюю границу прямоугольника.
Некоторые из лучших попыток, которые я видел, - это использование большой базы данных изображений, чтобы помочь понять изображение, которое у вас есть. В наши дни у вас есть flickr, который представляет собой не только гигантский корпус изображений, но и помечен метаинформацией о том, что это за изображение.
Некоторые проекты, которые делают это, описаны здесь:
Я думаю, что вы никогда не получите хороших результатов, если реальный пользователь не скажет программе, что делать. Подумайте об этом так: как ваша программа должна решить, если присутствует более 1 объекта интересно (например: 2 машины)? что, если объект, который вам нужен, на самом деле гора на заднем плане? что, если внутри изображения нет ничего интересного, поэтому нечего выбирать в качестве объекта для обрезки? и т.д, и т.д ...
С учетом сказанного, если вы можете сделать предположения как: будет присутствовать только 1 объект, тогда вы можете попробовать использовать алгоритмы распознавания изображений.
Теперь, когда я думаю об этом. Недавно я прочитал лекцию об искусственном интеллекте в роботах и методах робототехнических исследований. Их исследование продолжалось по поводу языковое взаимодействие, эволюция и распознавание языка. Но для этого им также потребовались несколько простых алгоритмов распознавания изображений для обработки воспринимаемой среды. Один из приемов, который они использовали, состоял в том, чтобы создать трехмерный график изображения, где x и y, где нормальные оси x и y и ось z были яркостью этой конкретной точки, затем они использовали ту же технику для значений красно-зеленого цвета, и сине-желтый. И, о чудо, у них было кое-что (относительно) простое, что они могли использовать для выделения объектов из воспринимаемой среды.
(Мне ужасно жаль, но я не могу найти ссылку на хорошие диаграммы, которые у них были, чтобы показать, как все это работает).
В любом случае, дело в том, что они не были заинтересованы (настолько сильно) в распознавании изображений, поэтому они создали что-то, что работало достаточно хорошо, и использовали что-то менее продвинутое и, следовательно, менее затратное по времени, поэтому можно создать что-то простое для этой сложной задачи.
Также в любой хорошей программе для редактирования изображений есть своего рода Волшебная палочка, который выберет, с нужным количеством настроек, интересующий объект, на который вы его укажете, возможно, стоит потратить время и на то, чтобы изучить это.
Итак, это в основном будет означать, что вы:
.. но я не говорю, что это решение в для вашей проблемы, может быть, можно использовать что-нибудь попроще.
О, и я буду продолжать искать эти ссылки, они содержат действительно ценную информацию по этой теме, но я не могу ничего обещать.
Начните с самостоятельного анализа изображений. Таким образом вы сможете сформулировать критерии, по которым будет соответствовать автомобиль. И вы можете определить, с чем не можете сопоставить.
Например, если все автомобили имеют одинаковый фон, это не обязательно должно быть так сложно. Но в вашем примере говорится об автомобиле на улице. Могут быть припаркованные машины. Следует ли их узнавать?
Если у вас есть доступ к MatLab, вы можете протестировать свои фильтры распознавания образов с помощью специализированного программного обеспечения, такого как PRTools.
Когда я учился (очень давно :) Я использовал Хорос Кантата и обнаружил, что краевой фильтр может значительно упростить изображение.
Но опять же, сначала определите условия на входе. Если вы этого не сделаете, у вас ничего не получится, потому что распознать образы действительно сложно (подумайте, сколько времени потребовалось, чтобы взломать капчу)
Я сказал фото, значит, это может быть черная машина с черным фоном. Я действительно подумал о том, чтобы указать цвет объекта, а затем, когда этот цвет будет найден, обведите его (объяснение высокого уровня). Но с черным объектом на черном фоне (другими словами, без контраста) это было бы очень сложной задачей.
А еще я наткнулся на несколько сайтов с 3д моделями машин. Я всегда мог использовать это, вставить в 3D-модель и отрендерить.
С 3D-моделью было бы легче работать, с реальной фотографией - намного сложнее. Это отстой :(
Это одна из проблем, которую нужно было решить, чтобы закончить DARPA Grand Challenge. В видео Google есть отличная презентация руководителя проекта из команды-победителя, где он рассказывает о том, как они работали над своим решением и как к нему подходили некоторые другие команды. Соответствующая часть начинается примерно в 19:30 видео, но это отличный разговор, и все это стоит посмотреть. Надеюсь, это станет хорошей отправной точкой для решения вашей проблемы.
Речь идет об открытой исследовательской проблеме или даже о нескольких исследовательских задачах. Один из способов решить эту проблему - сегментировать изображения. Если вы можете с уверенностью предположить, что на изображении есть один интересующий объект, вы можете попробовать алгоритм сегментации «фигура-фон». Таких алгоритмов много, и ни один из них не идеален. Обычно они выводят маску сегментации: двоичное изображение, в котором фигура белая, а фон черный. Затем вы найдете ограничительную рамку фигуры и используете ее для кадрирования. Следует помнить, что ни один из существующих алгоритмов сегментации не даст вам то, что вы хотите, в 100% случаев.
В качестве альтернативы, если вы заранее знаете, какой именно тип объекта нужно обрезать (автомобиль, человек, мотоцикл), вы можете попробовать алгоритм обнаружения объекта. Опять же, их много, и ни один из них не идеален. С другой стороны, некоторые из них могут работать лучше, чем сегментация, если ваш интересующий объект находится на очень загроможденном фоне.
Подводя итог, если вы хотите добиться этого, вам придется прочитать изрядное количество статей о компьютерном зрении и попробовать изрядное количество различных алгоритмов. Вы также увеличите свои шансы на успех, если максимально ограничите свою проблемную область: например, ограничитесь небольшим количеством категорий объектов, предположите, что в изображении есть только один интересующий объект, или ограничитесь определенным типом сцен (природа, море и др.). Также имейте в виду, что даже точность современных подходов к решению этого типа проблем имеет много возможностей для улучшения.
И, кстати, выбор языка или платформы для этого проекта - безусловно, наименее сложная часть.
Для обнаружения лиц на изображениях часто используется метод каскада классификаторов Хаара. Каскад классификатора можно обучить обнаруживать любые объекты, а не только лица, но способность классификатора сильно зависит от качества обучающих данных.
В этом документе Виола и Джонс объясняется, как это работает и как его можно оптимизировать.
Хотя это C++, вы можете взглянуть на библиотеки обработки изображений, предоставляемые проектом OpenCV, которые включают код как для обучения, так и для использования каскадов Хаара. Для обучения системы вам понадобится набор изображений автомобилей и не автомобилей!
Просто сделайте все возможное, чтобы пометить. Как видите, сообщество поправит вас. :)