对服装照片进行分类有哪些好的功能?

时间:2013-09-19 16:15:52

标签: python machine-learning computer-vision image-recognition

我想建立一个服装分类器,拍摄一件衣服的照片,并将其分类为“牛仔裤”,“礼服”,“运动鞋”等。

一些例子:

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's 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

我正在提取一个简单的13x13灰度网格作为粗略的形状近似。但是,使用nltk的NaiveBayesClassifier这些功能只能获得34%的准确率。

哪些功能在这方面效果很好?

4 个答案:

答案 0 :(得分:10)

这是一个棘手的问题,因此有很多方法。

通常的方法(尽管很复杂)采用输入图像,超级映像图像并计算那些超像素的描述符(例如SIFTSURF),通过累积构建一个词袋表示每个超像素的直方图,该操作从一堆像素中提取关键信息,降低维数。然后, Conditional Random Field 算法搜索图像中超像素之间的关系,并对已知类别内的像素组进行分类。对于像素化图像scikit-image包实现SLIC算法segmentation.slic,对于CRF,您应该查看PyStruct包。可以使用OpenCV计算SURF和SIFT。

enter image description here

另一个简单的版本是给定图像的计算描述符(SIFT,SURF,边界,直方图等)并将它们用作分类器算法中的输入,您可能希望从这里开始,也许scikit-learn.org是最简单的这是最强大的包。

答案 1 :(得分: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/

答案 2 :(得分:2)

直接使用图像中的所有原始像素值作为特征并不是很好,特别是随着特征数量的增加,由于搜索空间非常大(169个特征代表一个大的搜索空间,这对于任何分类算法解决)。这可能是为什么与13x13相比,移动到20x20图像实际上会降低性能。减少功能集/搜索空间可能会提高性能,因为您可以简化分类问题。

实现此目的的一种非常简单(通用)的方法是使用像素统计作为功能。这是图像的给定区域中的原始像素值的平均值和标准偏差(SD)。这可以捕获给定区域的对比度/亮度。

您可以根据反复试验选择区域,例如:

  • 在图像中心的一系列半径增加的同心圆形区域。四个增加大小的圆形区域的平均值和SD给出了八个特征。
  • 一系列矩形区域,尺寸增大或尺寸固定但放置在图像中的不同区域周围。图像四个角中的四个非重叠区域(大小为6x6)的平均值和标准差以及中心的一个区域给出了10个特征。
  • 圆形和方形区域的组合。

答案 3 :(得分:0)

你试过SVM吗?它通常比朴素贝叶斯表现更好。