12

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

一些例子:

牛仔裤 教练员 在此处输入图像描述

这些图像来自零售商网站,因此通常是从相同的角度拍摄的,通常是在白色或浅色背景上——它们往往非常相似。

我有一组数千张我已经知道其类别的图像,我可以用它们来训练机器学习算法。

但是,我正在努力寻找应该使用哪些功能的想法。我目前拥有的功能:

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

4 回答 4

10

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

常用方法(虽然很复杂)是获取输入图像,对图像进行超像素化并计算这些超像素的描述符(例如SURF的SIFT ) ,通过累积每个超像素的直方图来构建词袋表示,此操作从一堆像素降低维度。然后条件随机场算法搜索图像中超像素之间的关系,并对已知类别中的像素组进行分类。对于像素化图像包实现 SLIC 算法,对于 CRF,你应该看看打包。可以使用 OpenCV 计算 SURF 和 SIFT。scikit-imagesegmentation.slicPyStruct

在此处输入图像描述

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

于 2013-09-19T17:16:59.527 回答
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/

于 2013-09-19T18:05:04.700 回答
2

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

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

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

  • 一系列同心圆区域,半径增加,位于图像的中心。四个增大的圆形区域的平均值和 SD 给出了八个特征。
  • 一系列矩形区域,大小增加或固定大小,但放置在图像中的不同区域周围。图像四个角和中心一个的四个非重叠区域(大小为 6x6)的平均值和 SD 给出了 10 个特征。
  • 圆形和方形区域的组合。
于 2013-09-19T21:27:29.663 回答
0

你试过支持向量机吗?它通常比朴素贝叶斯表现更好。

于 2013-09-19T17:11:04.327 回答