【机器学习随笔】基于kmeans的车牌类型分类注意点

kmeans是无监督的聚类算法,可用于数据的分类。本文尝试用kmeans对车牌类型进行分类,记录使用过程中的注意点。

kmeans使用过程中涉及两个大部分,模型与分析。模型部分包括训练模型和使用模型,分析部分主要为可视化分析。两部分的主要流程如下。

训练与使用

数据可视化

下面对主要的部分进行解释和代码说明

一、数据集与预处理

使用车牌数据,车牌数据为rgb图片数据,共7种类型的车牌500张。主要想从颜色上进行区分,所以数据不进行灰度化,而是提取了r分量与g分量的比值做为输入。同时图片需要展开成一维数据送入kmeans的接口

cpp 复制代码
img = img.convert('RGB')
r, g, b = img.split()
r_array = np.array(r).flatten().astype(float)#0.592
g_array = np.array(g).flatten().astype(float)#0.436
b_array = np.array(b).flatten().astype(float)#0.554
img_array = r_array/g_array#0.816

二、kmeans参数配置

定义了7分类,将随机数从0-79进行尝试,取数据最好的。

cpp 复制代码
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
images_data = scaler.fit_transform(images_data)
# 定义聚类数量
n_clusters = 7  # 根据实际情况选择聚类的数量
# 使用KMeans进行聚类
bestacc = 0
for i in range(80):
    kmeans = KMeans(n_clusters=n_clusters,max_iter=8,random_state=i)#, random_state=42)
    kmeans.fit(images_data)
    # 输出每个图片所属的聚类
    pre_labels = kmeans.labels_

每次循环后计算acc,数据好的acc就保存下来。

cpp 复制代码
   acc = getacc(pre_labels,gt_labels)
    if acc >= bestacc:
        bestacc = acc
        model_path = 'kmeans_model_'+str(i)+'.joblib'
        joblib.dump(kmeans, model_path)
    print("iter:",i," Acc:", acc)

计算acc时需要注意的地方:1、训练好的标签与标定标签之间不一样,我的解决方法是:提取预测标签相同的目标,统计其中标定标签个数最多的那个做为这一类的真实标签。

2、需要注意,该方法可能存再多个标定标签的个数是一样的,这时候需要自己检查,选择一下。

完成上两步后,可进一步获取预测标签与真实标签的映射关系,后续预测其他数据时,经过转换就可以直接看到预测标签与标定标签的关系。

三、可视化问题

1、图片数据进行处理后,是一维向量,对于128x48大小的车牌而言,是转换成1*6144维度的向量。高维向量难以用散点图的形式进行可视化,所以需要对数据进行降维,得到一个二维向量,即可在平面上显示,此处用PCA进行降维。

2、降维后的数据,按类进行区分,计算其均值做为类中心位置。

3、计算每类数据与中心位置的距离

4、获得距离后即可进行可视化。

cpp 复制代码
pca = PCA(n_components=2,whiten=True)
X_reduced = pca.fit_transform(data)
    cluster_centers=[]
for clust in range(7):
    indices_of_clust = np.where(labels == clust)[0]
    cluster_centers.append(np.mean(X_reduced[indices_of_clust], axis=0))
cluster_centers = np.array(cluster_centers)
distances = [np.linalg.norm(x - cluster_centers[label]) for x, label in zip(X_reduced, labels)]

    # 可视化
    plt.figure(figsize=(10, 8))
    scatter = plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=labels, cmap='magma', s=[d*50 for d in distances])
    centers = plt.scatter(cluster_centers[:, 0], cluster_centers[:, 1], c='red', marker='x')
    plt.title('K-Means Clustering with Centroids and Distances')
    plt.xlabel('Feature 1')
    plt.ylabel('Feature 2')
    unique_labels = np.unique(labels)
    colors = scatter.cmap(scatter.norm(unique_labels))
    legend_elements = [plt.Line2D([0], [0], marker='o', color='w', label=f'Label {label}', markerfacecolor=color, markersize=10) for label, color in zip(unique_labels, colors)]

四、可视化效果

可视化效果图:其中0是黄牌,3,4是新能源牌。从颜色上看,新能源的两类绿色较难分开,黄色与绿色也很大程度上重叠。

至此,完成了kmeans的验证和可视化,从颜色上对车牌进行区分会受限于相同颜色不同类型的干扰,也会有黄绿难区分的的情况

相关推荐
山顶夕景28 分钟前
【ML】机器学习中常见的25个数学公式
人工智能·数学·机器学习
Crossoads30 分钟前
【汇编语言】外中断(一)—— 外中断的魔法:PC机键盘如何触发计算机响应
android·开发语言·数据库·深度学习·机器学习·计算机外设·汇编语言
Zik----32 分钟前
Anaconda搭建Python虚拟环境并在Pycharm中配置(小白也能懂)
开发语言·人工智能·python·机器学习·pycharm
Hz、辉3 小时前
损失函数-二分类和多分类
人工智能·深度学习·神经网络·分类·多分类
IT古董3 小时前
【机器学习】机器学习的基本分类-半监督学习ーSemi-supervised SVM
机器学习·支持向量机·分类
sp_fyf_20244 小时前
【大语言模型】ACL2024论文-36 利用NLI和ChatGPT及编码簿知识进行零样本政治关系分类
深度学习·神经网络·机器学习·语言模型·chatgpt·分类·数据挖掘
sp_fyf_20247 小时前
【大语言模型】ACL2024论文-35 WAV2GLOSS:从语音生成插值注解文本
人工智能·深度学习·神经网络·机器学习·语言模型·自然语言处理·数据挖掘
AITIME论道7 小时前
论文解读 | EMNLP2024 一种用于大语言模型版本更新的学习率路径切换训练范式
人工智能·深度学习·学习·机器学习·语言模型
明明真系叻8 小时前
第二十六周机器学习笔记:PINN求正反解求PDE文献阅读——正问题
人工智能·笔记·深度学习·机器学习·1024程序员节
IT猿手9 小时前
多目标应用(一):多目标麋鹿优化算法(MOEHO)求解10个工程应用,提供完整MATLAB代码
开发语言·人工智能·算法·机器学习·matlab