Каковы хорошие возможности для классификации фотографий одежды?
Я хочу создать классификатор одежды, который снимает предмет одежды и классифицирует его как "джинсы", "платье", "тренеры" и т.д.
Некоторые примеры:
![jeans]()
![trainer]()
![enter 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
- это самый простой и мощный пакет для этого.
Ответ 2
HOG обычно используется в схемах обнаружения объектов. OpenCV имеет пакет для дескриптора HOG:
http://docs.opencv.org/modules/gpu/doc/object_detection.html
Вы также можете использовать функции на основе BoW. Здесь сообщение, которое объясняет метод:
http://gilscvblog.wordpress.com/2013/08/23/bag-of-words-models-for-visual-categorization/
Ответ 3
Использование всех исходных значений пикселей в изображении напрямую, поскольку функции невелики, особенно по мере увеличения числа функций из-за очень большого пространства поиска (169 функций представляют собой большое пространство поиска, что может быть затруднено для любого алгоритм классификации для решения). Возможно, именно поэтому переход на 20х20-образное изображение ухудшает производительность по сравнению с 13х13. Сокращение вашего набора функций/пространства поиска может повысить производительность, поскольку вы упростите проблему классификации.
Очень простой (и общий) подход для достижения этого - использовать статистику пикселов как функции. Это среднее и стандартное отклонение (SD) значений исходного пикселя в данной области изображения. Это фиксирует контраст/яркость заданной области.
Вы можете выбрать регионы на основе проб и ошибок, например, это могут быть:
- серия концентрических круговых областей, увеличивающихся по радиусу, в центре изображения. Среднее значение и SD четырех круговых областей увеличивающегося размера дают восемь особенностей.
- ряд прямоугольных областей, либо увеличивающихся по размеру, либо фиксированных размеров, но расположенных вокруг разных областей изображения. Среднее значение и SD четырех неперекрывающихся областей (размером 6x6) в четырех углах изображения и один в центре дают 10 признаков.
- комбинация круговых и квадратных областей.
Ответ 4
Вы пробовали SVM? Он обычно лучше, чем Наивный Байес.