梯度直方图(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)
现在让我们考虑下面的图像 ,
文章插图
让我们假设红色的方框用8x8矩阵表示 , 每个单元格中都有数字 。 在进行图像特征工程之前 , 建议做以下几件事:
1. Resize:将所有图像调整为统一形状 , 以避免任何与计算相关的隐患 。 在本例中 , 所有图像的形状统一(60x80) 。 如果您想执行调整大小操作 , 请参阅以下内容:
def resize_image(img,ids):return cv.resize(img, (60, 80),interpolation =cv.INTER_LINEAR)all_images_resized = [[resize_image(x,y),y] for x,y in all_images]len(all_images_resized)
1. Normalize :以避免亮度、对比度或其他照明效果造成的影响 。
1. Filtering:考虑几个相邻像素 , 而不是单一像素值作为像素的真实值 。 高斯滤波对中心像素权重最大 , 对相邻像素权重按w、r、t递减 , 即根据窗口大小确定与中心像素的距离 。
最后对滤波后的图像进行如下计算:
文章插图
将整个图像分成若干块(b) 。 一个典型的块是上面提到的红框 。 此外 , 其他块可以看作是黑盒中提到的单元格(c)的集合 。 上图中 , b的尺寸是8x8, c的尺寸是4x4
- 王伟华|梯度科技董事长王伟华受邀出席中国-东盟青年领袖论坛
- 损失函数|可视化深入理解损失函数与梯度下降 | 技术头条
- 手推公式:LSTM单元梯度的详细的数学推导
- 实战PyQt5: 117-梯度渐变效果QGradient
- 梯度下降算法在机器学习中的工作原理
- OpenCV-Python 直方图-2:直方图均衡 | 二十七
- 偏导数和函数的梯度
- 王者荣耀|王者荣耀:法师梯度榜更新,T3变成甄姬与她?“天秀”的她成最后赢家!
- 王者荣耀|法师梯度榜突然更新,小乔甄姬沦为T3,玩不懂的她却再无克星
- 王者荣耀|世冠赛射手梯度榜更新!公孙离沦为T3,曾经的版本之子却重回T0