服装照片分类的好特征是什么?

2024-04-29 01:04:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我想构建一个服装分类器,它对一件衣服拍照,并将其分类为“牛仔裤”、“连衣裙”、“运动鞋”等

一些例子:

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'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%的准确率。在

什么功能在这里能很好地工作?在


Tags: inimageforgetreturnpildef特性
3条回答

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

实现这一点的一个非常简单(通用的)方法是使用像素统计信息作为特征。这是图像给定区域中原始像素值的平均值和标准差(SD)。这将捕获给定区域的对比度/亮度。在

您可以根据试错选择区域,例如,这些区域可以是:

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

HOG通常用于目标检测方案。OpenCV有一个HOG描述符包:

http://docs.opencv.org/modules/gpu/doc/object_detection.html

也可以使用基于弓的功能。这里有一篇文章解释了这个方法: http://gilscvblog.wordpress.com/2013/08/23/bag-of-words-models-for-visual-categorization/

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

在通常的方法(虽然复杂)是采取一个输入图像,超混合图像和计算描述符(如SIFTSURF)这些超级像素建立了一个单词表示袋每一个超级像素的直方图,该操作从一堆像素中提取关键信息降维。然后一个Conditional Random Field算法搜索图像中超像素之间的关系,并将像素组划分为一个已知类别。对于像素化图像^{}包实现了SLIC算法^{},对于CRF,您应该看看^{}包。SURF和SIFT可以用OpenCV计算。在

enter image description here

另一个简单的版本是计算给定图像的描述符(SIFT、SURF、borders、histogram等),并将它们用作分类器算法的输入,您可能需要从这里开始,也许{a7}是实现这一点的最简单和最强大的包。在

相关问题 更多 >