梯度直方图(HOG)用于图像多分类和图像推荐( 三 )
下面是一些HOG图像的可视化表示:
文章插图
在建模中使用梯度方向的想法是因为这种方法人类神经系统的工作方式相似 。 当人类看到某一物体时 , 大脑皮层会引起人们的注意 , 或者人类为了看得更清楚而改变观察的角度
由于是多分类问题 , 而且类内分布也不均匀 , 建议采用分层抽样 。
X_train, X_test, y_train, y_test = train_test_split(hog_features,df_labels['class'],test_size=0.2,stratify=df_labels['class'])print('Training data and target sizes: \n{}, {}'.format(X_train.shape,y_train.shape))print('Test data and target sizes: \n{}, {}'.format(X_test.shape,y_test.shape))=============================================Training data and target sizes: (15998, 1728), (15998,)Test data and target sizes: (4000, 1728), (4000,)
最后 , 将数据使用分类器处理 。 针对该问题 , 分别采用了支持向量机、随机森林和KNN算法 。 在所有最近邻查找算法(balltree、kdtree和brute force)中 , KNN的表现都优于其他分类器 。 最后 , 使用"贪婪"搜索 , 因为它的计算速度比balltree和kdtree快得多 。
KNN分类器的代码片段
test_accuracy = []scaler = StandardScaler()X_scaled = scaler.fit_transform(X_train)classifier = KNeighborsClassifier(n_neighbors=3,algorithm='brute')classifier.fit(X_scaled, y_train)test_accuracy = classifier.score(scaler.transform(X_test), y_test)print(test_accuracy)
在masterCategory中 , 主要包括以下五个类别:["服饰"、"配饰"、"鞋履"、"个人护理"、"免费物品"] 。 所有属于其他类别的记录被命名为"其他" 。
通过更改Jupyter笔记本中的列名 , 可以对任何列类型进行分类 。
下面是一些有助于评估模型性能的数字 。
文章插图
list_of_categories = categories +['Others']print("Classification Report: \n Target: %s \n Labels: %s \n Classifier: %s:\n%s\n"% (target,list_of_categories,classifier, metrics.classification_report(y_test, y_pred)))df_report = pd.DataFrame(metrics.confusion_matrix(y_test, y_pred),columns = list_of_categories )df_report.index = [list_of_categories]df_report
文章插图
最后 , 让我们对测试图像进行推断
#test image with idtest_data_location = root+'/test/'img = cv.imread(test_data_location+'1570.jpg',cv.IMREAD_GRAYSCALE) #load at gray scaleimage = cv.resize(img, (60, 80),interpolation =cv.INTER_LINEAR)ppcr = 8ppcc = 8hog_images_test = []hog_features_test = []blur = cv.GaussianBlur(image,(5,5),0)fd_test,hog_img = hog(blur, orientations=8, pixels_per_cell=(ppcr,ppcc),cells_per_block=(2,2),block_norm= 'L2',visualize=True)hog_images_test.append(hog_img)hog_features_test.append(fd)hog_features_test = np.array(hog_features_test)y_pred_user = classifier.predict(scaler.transform(hog_features_test))#print(plt.imshow(hog_images_test))print(y_pred_user)print("Predicted MaterCategory: ", mapper[mapper['class']==int(y_pred_user)]['masterCategory'])
一些建议!
scaler_global = MinMaxScaler()final_features_scaled = scaler_global.fit_transform(hog_features)neighbors = NearestNeighbors(n_neighbors=20, algorithm='brute')neighbors.fit(final_features_scaled)distance,potential = neighbors.kneighbors(scaler_global.transform(hog_features_test))print("Potential Neighbors Found!")neighbors = []for i in potential[0]:neighbors.append(i)recommendation_list = list(df_labels.iloc[neighbors]['id'])recommendation_list