Каковы хорошие возможности для классификации фотографий одежды?

Я хочу создать классификатор одежды, который снимает предмет одежды и классифицирует его как "джинсы", "платье", "тренеры" и т.д.

Некоторые примеры:

jeanstrainerenter image description here

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

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

Однако я борюсь за идеи о том, какие функции я должен использовать. Возможности, которые у меня есть до сих пор:

def get_aspect_ratio(pil_image):
    _, _, width, height = pil_image.getbbox()

    return width / height


def get_greyscale_array(pil_image):
    """Convert the image to a 13x13 square grayscale image, and return a
    list of colour values 0-255.

    I've chosen 13x13 as it very small but still allows you to
    distinguish the gap between legs on jeans in my testing.

    """
    grayscale_image = pil_image.convert('L')
    small_image = grayscale_image.resize((13, 13), Image.ANTIALIAS)

    pixels = []
    for y in range(13):
        for x in range(13):
            pixels.append(small_image.getpixel((x, y)))

    return pixels


def get_image_features(image_path):
    image = Image.open(open(image_path, 'rb'))

    features = {}
    features['aspect_ratio'] = get_aspect_ratio(image)

    for index, pixel in enumerate(get_greyscale_array(image)):
        features["pixel%s" % index] = pixel

    return features

Я извлекаю простую сетку серого серого 13х13 как грубое приближение формы. Howerver, используя эти функции с nltk NaiveBayesClassifier, получает только 34% точности.

Какие функции будут работать здесь?

Ответ 1

Это сложная проблема, и поэтому существует множество подходов.

По общему методу (хотя и сложному) берется входное изображение, суперпикселируют изображение и вычисляют дескрипторы (такие как SIFT SURF) этих суперпикселей, создающих представление о сумме слова, путем накопления гистограмм на суперпиксель, эта операция извлекает ключевую информацию из связки пикселей, уменьшая размерность. Затем алгоритм условное случайное поле ищет отношения между суперпикселями в изображении и классифицирует группу пикселей внутри известной категории. Для пиксельных изображений scikit-image пакет реализует алгоритм SLIC segmentation.slic, а для CRF вы должны взглянуть на PyStruct. SURF и SIFT могут быть рассчитаны с использованием OpenCV.

enter image description here

Другая простая версия - это вычисление дескрипторов заданного изображения (SIFT, SURF, границы, гистограмма и т.д.) и использование их в качестве входов в алгоритме классификатора, возможно, вы захотите начать с этого момента, возможно scikit-learn.org - это самый простой и мощный пакет для этого.

Ответ 3

Использование всех исходных значений пикселей в изображении напрямую, поскольку функции невелики, особенно по мере увеличения числа функций из-за очень большого пространства поиска (169 функций представляют собой большое пространство поиска, что может быть затруднено для любого алгоритм классификации для решения). Возможно, именно поэтому переход на 20х20-образное изображение ухудшает производительность по сравнению с 13х13. Сокращение вашего набора функций/пространства поиска может повысить производительность, поскольку вы упростите проблему классификации.

Очень простой (и общий) подход для достижения этого - использовать статистику пикселов как функции. Это среднее и стандартное отклонение (SD) значений исходного пикселя в данной области изображения. Это фиксирует контраст/яркость заданной области.

Вы можете выбрать регионы на основе проб и ошибок, например, это могут быть:

  • серия концентрических круговых областей, увеличивающихся по радиусу, в центре изображения. Среднее значение и SD четырех круговых областей увеличивающегося размера дают восемь особенностей.
  • ряд прямоугольных областей, либо увеличивающихся по размеру, либо фиксированных размеров, но расположенных вокруг разных областей изображения. Среднее значение и SD четырех неперекрывающихся областей (размером 6x6) в четырех углах изображения и один в центре дают 10 признаков.
  • комбинация круговых и квадратных областей.

Ответ 4

Вы пробовали SVM? Он обычно лучше, чем Наивный Байес.