Классификация изображений - Определение планов этажей - PullRequest
4 голосов
/ 20 декабря 2009

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

Поскольку я пишу на php, я предпочту решение php, но подойдет и любое решение на c ++ или opencv.

Пример плана этажа:

альтернативный текст http://www.rentingtime.com/uploads/listing/l0050/0000050930/68614.jpg

альтернативный текст http://www.rentingtime.com/uploads/listing/l0031/0000031701/44199.jpg

Образец логотипа:

альтернативный текст http://www.rentingtime.com/uploads/listing/l0091/0000091285/95205.jpg

Ответы [ 9 ]

6 голосов
/ 20 декабря 2009

Как всегда, для этого есть встроенная функция PHP . Просто шутка. =)

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

Например: is the image has less than 2 or 3 colors is a floor plan.

Например: if the sum / average of the saturation is less than X it's a floor plan.

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

Вот простая функция для вычисления насыщенности цвета Hex RGB:

function Saturation($color)
{
    $color = array_map('hexdec', str_split($color, 2));

    if (max($color) > 0)
    {
        return (max($color) - min($color)) / max($color);
    }

    return 0;
}

var_dump(Saturation('000000')); // black    0.0000000000000000
var_dump(Saturation('FFFFFF')); // white    0.0000000000000000
var_dump(Saturation('818185')); // grey     0.0300751879699249
var_dump(Saturation('5B9058')); // green    0.3888888888888889
var_dump(Saturation('DE1C5F')); // pink     0.8738738738738738
var_dump(Saturation('FE7A15')); // orange   0.9173228346456692
var_dump(Saturation('FF0000')); // red      1.0000000000000000
var_dump(Saturation('80FF80')); // ---      0.4980392156862745
var_dump(Saturation('000080')); // ---      1.0000000000000000

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

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

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

$images = array('./44199.jpg', './68614.jpg', './95205.jpg', './logo.png', './logo.gif');

foreach ($images as $image)
{
    $sat = 0;
    $image = ImageCreateFromString(file_get_contents($image));

    for ($x = 0; $x < ImageSX($image); $x++)
    {
        for ($y = 0; $y < ImageSY($image); $y++)
        {
            $color = ImageColorsForIndex($image, ImageColorAt($image, $x, $y));

            if (is_array($color) === true)
            {
                $sat += Saturation(dechex($color['red']) . dechex($color['green']) . dechex($color['blue']));
            }
        }
    }

    echo ($sat / (ImageSX($image) * ImageSY($image)));
    echo '<hr />';
}

А вот и результаты:

green floor plant:      0.0151028053
black floor plant:      0.0000278867
black and white logo:   0.1245559912
stackoverflow logo:     0.0399864136
google logo:            0.1259357324

Используя только эти примеры, я бы сказал, что изображение является растением для пола, если средняя насыщенность меньше 0,03 или 0,035, вы можете немного подкорректировать его, добавив дополнительные примеры.

3 голосов
/ 11 января 2010

Может быть проще всего передать это людям.

Если у вас есть бюджет, рассмотрите Механический турок Амазонки . См. Википедию для общего описания .

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

Еще лучше, сделайте это соревнованием - человек, который сортирует большинство изображений, выиграет ставку!

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

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

2 голосов
/ 21 декабря 2009

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

Для быстрого первого прохода необходимо выполнить Обнаружение канни-края на изображении и проголосовать за углы, используя преобразование Хафа и rho, определение тета линии. Если вы видите очень сильное соответствие для Theta = (0, 90, 180, 270), суммированного по rho, вы можете классифицировать изображение как план этажа.

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

1 голос
/ 22 декабря 2009

Простая легкая попытка, которую я сначала попробую, состоит в том, чтобы использовать SVM для изучения ключевых точек SIFT, полученных из образцов. Но прежде чем вы сможете это сделать, вам нужно пометить небольшое подмножество изображений, указав ему -1 (план этажа) или 1 (логотип). если изображение имеет больше ключевых точек, классифицированных как план этажа, то это должен быть план этажа; если оно имеет больше ключевых точек, классифицированных как логотип, то это должен быть логотип. В Computer Vision это называется подходом с набором функций, который также является одним из самых простых методов. Более сложные методы, вероятно, дадут лучшие результаты, но это хорошее начало.

1 голос
/ 20 декабря 2009

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

Небольшое (с точки зрения размера и размера) изображение может быть логотипом.

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

Однако это будет только измерение вероятности и ни в коем случае не надежное.

Тип изображения также является индикатором, но менее одного. Логотипы, скорее всего, будут JPG, PNG или GIF, планы этажей могут быть в формате TIFF или другом формате без потерь, но это не гарантия.

1 голос
/ 20 декабря 2009

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

Могу я спросить, зачем вам это нужно? Нет ли в рабочем процессе вашего сайта точки, в которой можно было бы определить вручную, является ли изображение логотипом или планом здания? Разве не было бы проще написать приложение, которое позволит пользователям определять, что именно на момент загрузки? Почему в первую очередь смешанный набор данных?

1 голос
/ 20 декабря 2009

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

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

0 голосов
/ 21 декабря 2009

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

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

0 голосов
/ 20 декабря 2009

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

Тем не менее, просматривая ваши образцы, я вижу критерий того, что МОЖЕТ работать довольно хорошо и его было бы довольно легко реализовать, если бы он работал:

Запустите изображение через хороший OCR, посмотрите, какие строки всплывают. Если вы найдете несколько слов, которые описывают комнаты или такие особенности ...

Я бы повернул изображение на 90 градусов и попытался бы снова поймать вертикальные метки.

Edit: Поскольку вы говорите, что пробовали, и это не сработало, может быть, вам нужно сначала очистить беспорядок. Разделите изображение вверх на основе пробелов. Запустите OCR для каждого подизображения на случай, если он попытается разобрать строки. Вы можете проверить это вручную, используя редактор изображений, чтобы нарезать его на кусочки.

...