介绍
机器学习的神奇之处在于,我们对原理的概念和思路理解得越多,它就变得越容易。在本文中,我们将研究在图像分类和图像推荐中使用定向梯度直方图的方法。
数据集
来源:Kaggle Fashion图像分类数据集(Small)
https://www.kaggle.com/paramaggarwal/fashion-product-images-small
数据集有主类别、子类别、性别、季节和每个图像的标签。目的是将数据集用于图像分类和推荐。让我们先看看数据分布!
每个列的惟一值。对于每个性别,masterCategory、subCategory、gender、usage和season列使用KNN分类器进行图像分类,然后使用K个最近邻数据进行图像推荐
这个设计的目标是提出一个解决方案,将所有的类别分为不同的类(类是在下面的图表中提到的分布)。然后构建推荐引擎,根据用户选择的测试图像,给出最匹配的n幅图像。
每列下不同类的数据(只显示前10个)
分类和推荐是建立在一种局部特征提取和描述方法上的,即定向梯度直方图(Histogram of Oriented Gradients, HOG)。使用不同的特征检测器(例如:SIFT, Shi-Thomas, ORB, FAST等),我们可以定位特征,并在多幅图像之间匹配提取的特征。但是为了使用这些信息来训练一个模型,我们需要提取一维向量形式的特征(如[x1,x2,..,xn])。HOG(“Histogram of Oriented Gradients for Human Detection\”——Dalal & Triggs, 2005)的想法就是基于同样的原理。下面让我们看看HOG是如何工作的,以及如何在Python中配置它。
注意:HOG最初是由Dalal & Triggs(2005)发明的,他们使用特定的参数来获得最佳的人体检测性能。但是,这些参数不是通用的,并且根据图像类型的不同而变化。
计算HOG的步骤:
HOG是一种将图像转换为梯度直方图,然后使用直方图制作用于训练模型的一维矩阵的技术。
在我们计算之前,让我们先导入相关库!
importosimportnumpyasnpimportpandasaspdimportcv2ascvfrompathlibimportPathimportwarningsfromskimage.featureimporthogimporttqdmfromsklearn.neighborsimportKNeighborsClassifierfromsklearnimportmetricsfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportMinMaxScalerfromsklearn.neighborsimportNearestNeighborswarnings.filterwarnings("ignore") pd.options.display.max_columns=None
然后读取图片
all_images= [] #labels= []defload_image(ids,path=image_folder): img=cv.imread(image_folder+ids+'.jpg',cv.IMREAD_GRAYSCALE) #loadatgrayscale#img=cv.cvtColor(img, cv.COLOR_BGR2GRAY) #converttograyscalereturnimg,ids#20ksamplesweretakenformodelingforidsintqdm(list(styles.id)[:20000]): img,ids=load_image(str(ids)) ifimgisnotNone: all_images.append([img,int(ids)]) #labels.append(ids) len(all_images)
现在让我们考虑下面的图像,
让我们假设红色的方框用8x8矩阵表示,每个单元格中都有数字。在进行图像特征工程之前,建议做以下几件事:
- Resize:将所有图像调整为统一形状,以避免任何与计算相关的隐患。在本例中,所有图像的形状统一(60x80)。如果您想执行调整大小操作,请参阅以下内容:
defresize_image(img,ids): returncv.resize(img, (60, 80),interpolation=cv.INTER_LINEAR) all_images_resized= [[resize_image(x,y),y] forx,yinall_images] len(all_images_resized)