Классификация изображений - Определение поэтажных планов

StackOverflow https://stackoverflow.com/questions/1935249

Вопрос

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

Поскольку я пишу на 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

Это было полезно?

Решение

Как всегда, есть встроенная функция 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.

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

Вот простая функция для вычисления насыщенности шестнадцатеричного цвета 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, вы можете немного изменить ее, добавив дополнительные примеры.

Другие советы

Возможно, проще всего передать это на аутсорсинг людям.

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

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

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

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

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

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

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

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

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

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

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

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

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

Небольшое (как по объему, так и по размерам) изображение, скорее всего, является логотипом.

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

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

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

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

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

Однако, просматривая ваши образцы, я вижу критерии, которые МОГ БЫ работает довольно хорошо, и было бы довольно легко реализовать, если бы это было так:

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top