梯度直方图(HOG)用于图像多分类和图像推荐
介绍机器学习的神奇之处在于 , 我们对原理的概念和思路理解得越多 , 它就变得越容易 。 在本文中 , 我们将研究在图像分类和图像推荐中使用定向梯度直方图的方法 。
数据集
文章插图
来源:Kaggle Fashion图像分类数据集(Small)
kaggle/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是一种将图像转换为梯度直方图 , 然后使用直方图制作用于训练模型的一维矩阵的技术 。
在我们计算之前 , 让我们先导入相关库!
import osimport numpy as npimport pandas as pdimport cv2 as cvfrom pathlib import Pathimport warningsfrom skimage.feature import hogimport tqdmfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn import metricsfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import MinMaxScalerfrom sklearn.neighbors import NearestNeighborswarnings.filterwarnings("ignore")pd.options.display.max_columns = None
然后读取图片
all_images = []#labels = []def load_image(ids,path=image_folder):img = cv.imread(image_folder+ids+'.jpg',cv.IMREAD_GRAYSCALE) #load at gray scale#img = cv.cvtColor(img, cv.COLOR_BGR2GRAY) #convert to gray scalereturn img,ids#20k samples were taken for modelingfor ids in tqdm(list(styles.id)[:20000]):img,ids = load_image(str(ids))if img is not None:all_images.append([img,int(ids)])#labels.append(ids)len(all_images)