机器学习之掌纹识别(掌纹分类)

机器学习之掌纹识别

  • 一、掌纹特征提取
    • 1.1 Gabor滤波器
  • 二、掌纹信息分类
    • 2.1 基于PCA+SVM的掌纹信息分类
    • 2.2 基于PCA+KNN的掌纹信息分类
    • 分类结果总结
  • 三、掌纹信息匹配
    • 3.1掌纹信息相似度匹配

一、掌纹特征提取

1.1 Gabor滤波器

Gabor滤波器是一个或一组Gabor函数离散形式,在计算机视觉中常用到Gabor滤波器来提取纹理特征。说白了,就是一个加了高斯窗的傅里叶变换。
Gabor滤波器(专注于纹理特征的一种滤波器)
链接: Gabor特征的详细介绍(博主推荐)

下面时我们项目的代码部分:
Gabor特征采集部分如下(示例):
1.建立Gabor滤波器

def build_filters():
    gabor_filters = []
    gabor_size = [6,9,12,15,18,21] #定义gabor尺度,6个
    lamda = np.pi/1.0 #波长
    for theta in np.arange(0,np.pi,np.pi / 4): #定义gabor的4个方向
        for i in range(6):
            kern = cv2.getGaborKernel((gabor_size[i],gabor_size[i]),1.0,theta,lamda,0.5,0,ktype=cv2.CV_32F)
            kern /= 1.2*kern.sum()
            filters.append(kern)
    print("np.arange(0,np.pi,np.pi / 4)",np.arange(0,np.pi,np.pi / 4))
    print("np.pi",np.pi)
    print("len",len(gabor_filters))
    return gabor_filters

2.Gabor特征提取

def getGabor(img,filters):
    print('len(filters)',len(filters))
    res = [] #滤波结果
    for i in range(len(filters)):
        res1 = scan_win(img,filters[i])
        res.append(np.asarray(res1))
    # pb.figure(2)
    for temp in range(len(res)):
        pb.subplot(4,6,temp+1)
        pb.imshow(res[temp],cmap='gray')
    # pb.show()
    return res

3.整合特征导入txt文件

def make_feature(filters):
    pic_list = []
    #将所有图片的特征向量进行堆叠,最后得到(500,16384)大小的特征矩阵
    stack_metrix = np.array([[0]])
    count=0
    for i in range(0, 100):
        # 用于存放当前类别标签(用外层循环i的值来表示)
        pic_list.append(i)
        class_matrix = np.array(pic_list, ndmin=2)
        for j in range(1, 6):
            path = 'ROI/p_{}_{}.bmp'.format(i, j)
            x = cv2.imread(path)
            data=getGabor(x,filters)
            data = np.asarray(data)
            data=normalization(data)
            data = np.reshape(data, (1, -1))
            one_data = np.column_stack((data, class_matrix))
            print(one_data)
            count=count+1
            print('第{}次'.format(count))
            # y压缩标签列表添加到每张图片特征矩阵的最后一维即为扁平化处理
            # 第一次不堆叠
            if i == 0 and j == 1:
                stack_metrix = one_data
                continue
            stack_metrix = np.row_stack((stack_metrix, one_data))
        pic_list.pop()
    np.savetxt('(new)feature.txt', stack_metrix)

二、掌纹信息分类

2.1 基于PCA+SVM的掌纹信息分类

链接: SVM(支持向量机)最佳理解.

代码如下(示例):

def train_model_pca_svm():
    """
    1.PCA+SVM进行分类
    2.PCA降维至20:return:
    """
    data, target = load_data()
    x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.3, random_state=13)

    # 利用PCA将特征降至20维,测试集上的预测精度为: 0.9487179487179487
    # 利用PCA将特征降至50维,测试集上的预测精度为: 0.9572649572649573
    # 利用PCA将特征降至100维,测试集上的预测精度为: 0.9658119658119658
    pca = PCA(n_components=100)
    x_train = pca.fit_transform(x_train)
    svm_clf = SVC(C=100)
    svm_clf.fit(x_train, y_train)

    # 利用在训练集上进行降维的PCA对测试数据进行降维
    # 保证转换矩阵相同
    x_test_process = pca.transform(x_test)
    y_predict = svm_clf.predict(x_test_process)
    score = svm_clf.score(x_test_process, y_test)
    print('测试集上的预测精度为:{}'.format(score))
    print('\n')
    print('测试集前10个样本的类别为:', y_test[:10].tolist())
    print('预测的类别为:', y_predict[:10])
    print('\n')
    print(classification_report(y_test, y_predict))

2.2 基于PCA+KNN的掌纹信息分类

链接: KNN(K邻近)最佳理解.

代码如下(示例):

def train_model_pca_knn(i):
    """
    1.PCA+KNN进行分类
    2.PCA降维至20:return:
    """
    data, target = load_data()
    x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.3, random_state=13)
    # 利用PCA将特征降至100维,测试集上的预测精度为: 0.9658119658119658
    pca = PCA(n_components=20)
    x_train = pca.fit_transform(x_train)
    my_model=KNeighborsClassifier(algorithm='kd_tree',p=10,n_neighbors=i)
    my_model.fit(x_train, y_train)
    #k1,测试集上的预测精度为:0.9316239316239316
    # 利用在训练集上进行降维的PCA对测试数据进行降维
    # 保证转换矩阵相同
    x_test_process = pca.transform(x_test)
    y_predict = my_model.predict(x_test_process)
    score = my_model.score(x_test_process, y_test)
    print('测试集上的预测精度为:{}'.format(score))
    print('\n')
    print('测试集前10个样本的类别为:', y_test[:10].tolist())
    print('预测的类别为:', y_predict[:10])
    print('\n')
    print(classification_report(y_test, y_predict))

分类结果总结

对于该类掌纹分类效果上看,分类效果可见SVM优于KNN,由此可得出结论,SVM在该类图片数据集上的分类效果较好。

分类结果展示

三、掌纹信息匹配

3.1掌纹信息相似度匹配

原理:获取特征文件进行扁平化处理之后对特征集的数据逐一匹配。

def compare_pic(feature1,feature2):
    unsim = 0
    x1 = np.array(feature1).flatten() #将特征做扁平化处理
    x2 = np.array(feature2).flatten()
    for pic1,pic1 in zip(x1,x2):
        if pic1 != pic1:
            unsim += 1
    print(unsim)
    sim = 1 - unsim/len(x1)
    print('相似度',sim)
    return sim

之后对图片特征逐个遍历检索即可。

    for i in range(0, 100):
            path = 'ROI/p_{}_{}.bmp'.format(i,1)
            x = cv2.imread(path)
            data=Gg.getGabor(x,filters)
            simial_score.append(int(compare_pic(data,feature)*1000))
            count=count+1
            print('第{}次检索'.format(count))
   	class_score=simial_score.index(max(simial_score))

又是熬夜写文章的一晚。
### LlamaIndex 多模态 RAG 实现 LlamaIndex 支持多种数据类型的接入与处理,这使得它成为构建多模态检索增强生成(RAG)系统的理想选择[^1]。为了实现这一目标,LlamaIndex 结合了不同种类的数据连接器、索引机制以及强大的查询引擎。 #### 数据连接器支持多样化输入源 对于多模态数据的支持始于数据收集阶段。LlamaIndex 的数据连接器可以从多个异构资源中提取信息,包括但不限于APIs、PDF文档、SQL数据库等。这意味着无论是文本还是多媒体文件中的内容都可以被纳入到后续的分析流程之中。 #### 统一化的中间表示形式 一旦获取到了原始资料之后,下一步就是创建统一而高效的内部表达方式——即所谓的“中间表示”。这种转换不仅简化了下游任务的操作难度,同时也提高了整个系统的性能表现。尤其当面对复杂场景下的混合型数据集时,良好的设计尤为关键。 #### 查询引擎助力跨媒体理解能力 借助于内置的强大搜索引擎组件,用户可以通过自然语言提问的形式轻松获得所需答案;而对于更复杂的交互需求,则提供了专门定制版聊天机器人服务作为补充选项之一。更重要的是,在这里实现了真正的语义级关联匹配逻辑,从而让计算机具备了一定程度上的‘认知’功能去理解和回应人类意图背后所蕴含的意义所在。 #### 应用实例展示 考虑到实际应用场景的需求多样性,下面给出一段Python代码示例来说明如何利用LlamaIndex搭建一个多模态RAG系统: ```python from llama_index import GPTSimpleVectorIndex, SimpleDirectoryReader, LLMPredictor, PromptHelper, ServiceContext from langchain.llms.base import BaseLLM import os def create_multi_modal_rag_system(): documents = SimpleDirectoryReader(input_dir='./data').load_data() llm_predictor = LLMPredictor(llm=BaseLLM()) # 假设已经定义好了具体的大型预训练模型 service_context = ServiceContext.from_defaults( chunk_size_limit=None, prompt_helper=PromptHelper(max_input_size=-1), llm_predictor=llm_predictor ) index = GPTSimpleVectorIndex(documents, service_context=service_context) query_engine = index.as_query_engine(similarity_top_k=2) response = query_engine.query("请描述一下图片里的人物表情特征") print(response) ``` 此段脚本展示了从加载本地目录下各类格式文件开始直到最终完成一次基于相似度排序后的top-k条目返回全过程。值得注意的是,“query”方法接收字符串参数代表使用者想要询问的内容,而在后台则会自动调用相应的解析模块并结合先前准备好的知识库来进行推理计算得出结论。
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炼丹小白师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值