我想构建一个服装分类器,它对一件衣服拍照,并将其分类为“牛仔裤”、“连衣裙”、“运动鞋”等
一些例子:
这些图片来自零售商网站,所以通常是从同一角度拍摄的,通常是在白色或浅色背景上拍摄的,它们往往非常相似。在
我有一组几千幅图像,它们的类别我已经知道了,我可以用它们来训练机器学习算法。在
然而,我正在为我应该使用什么特性而苦苦挣扎。到目前为止,我的特点是:
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%的准确率。在
什么功能在这里能很好地工作?在
直接使用图像中的所有原始像素值作为特征并不是很好,特别是随着特征数量的增加,这是因为搜索空间非常大(169个特征代表一个很大的搜索空间,任何分类算法都很难解决)。这也许就是为什么移动到20x20图像实际上会降低13x13的性能。由于简化了分类问题,减少功能集/搜索空间可能会提高性能。在
实现这一点的一个非常简单(通用的)方法是使用像素统计信息作为特征。这是图像给定区域中原始像素值的平均值和标准差(SD)。这将捕获给定区域的对比度/亮度。在
您可以根据试错选择区域,例如,这些区域可以是:
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/
这是一个棘手的问题,因此有许多方法。在
在通常的方法(虽然复杂)是采取一个输入图像,超混合图像和计算描述符(如SIFT,SURF)这些超级像素建立了一个单词表示袋每一个超级像素的直方图,该操作从一堆像素中提取关键信息降维。然后一个Conditional Random Field算法搜索图像中超像素之间的关系,并将像素组划分为一个已知类别。对于像素化图像^{} 包实现了SLIC算法^{} ,对于CRF,您应该看看^{} 包。SURF和SIFT可以用OpenCV计算。在
另一个简单的版本是计算给定图像的描述符(SIFT、SURF、borders、histogram等),并将它们用作分类器算法的输入,您可能需要从这里开始,也许{a7}是实现这一点的最简单和最强大的包。在
相关问题 更多 >
编程相关推荐