zoukankan      html  css  js  c++  java
  • 人体姿态的相似性评价基于OpenCV实现最近邻分类KNN K-Nearest Neighbors

    最近学习了人体姿态的相似性评价。需要用到KNN来统计与当前姿态相似的k个姿态信息。

    假设我们已经有了矩阵W和给定的测试样本姿态Xi,需要寻找与Xi相似的几个姿态,来估计当前Xi的姿态标签。

    //knn操作
    //读入一帧测试帧 去训练集里面求距离
    /*
    1、计算已知类别数据集合汇总的点与当前点的距离
    2、按照距离递增次序排序
    3、选取与当前点距离最近的K个点
    4、确定距离最近的前K个点所在类别的出现频率
    5、返回距离最近的前K个点中频率最高的类别作为当前点的预测分类
    */

    //knn操作 
    //读入一帧测试帧 去训练集里面求距离
    /*
    1、计算已知类别数据集合汇总的点与当前点的距离
    2、按照距离递增次序排序
    3、选取与当前点距离最近的K个点
    4、确定距离最近的前K个点所在类别的出现频率
    5、返回距离最近的前K个点中频率最高的类别作为当前点的预测分类
    */
    //test mat 输入是 1*60的或者1*n的   matrix需要平方。。才是马氏距离矩阵
    //20171129
    int knn(vector<Mat>&trainSample, vector<int>&trainLabel, Mat &test, Mat& matrix, int k, string prefix)
    {
        int label,n = trainSample.size();
        map<float, vector<int>>mp;//记录距离与训练集的索引 距离从小到大排列
    
        ofstream of(prefix+"\distance.txt");
    
        for (int i = 0; i < n;i++)
        {
            Mat diff = test - trainSample[i];        
    
            Mat dis = diff * matrix * matrix.t() * diff.t();//不开方了
    
            cout <<i<<"距离---"<< dis << endl;        
            float distance = dis.at<float>(0, 0);
    
            of << distance << " ";
            mp[distance].push_back(i);
        }
        of << endl;
        of.close();
    
        map<int,int>testLabel;//统计label出现次数 
        for (auto it = mp.begin(); it != mp.end() && k>0;it++)
        {
            for (int j = 0; j < it->second.size() && k>0; j++)
            {
                testLabel[trainLabel[it->second[j]]]++;
                k--;
            }
        }
        int temp = 0;//找到出现次数最多的label作为测试的标签
        for (auto it = testLabel.begin(); it != testLabel.end();it++)
        {
            if (temp < it->second)
            {
                label = it->first;
                temp = it->second;
            }
        }
        return label;
    }

    如下是准备训练和测试数据,并评估当前knn实验结果。

    //测试一下knn是否跑通 跑正确
    //20171130
    void testknn()
    {
        vector<Mat> trainSample, testSample;
        vector<int> trainLabel, testLabel;  
        string prefix = "E:\laboratory\dataset\synthesisdata\mypartresults"; 
        int row = 1, col = 66;//groundtruth是60=20*3列  聚类特征是22*3=66
        int k = 5;
        int label,correct=0;
        
        Mat matrix = InitMat("E:\code_bsm\bsm\W_bsm_d=5_kc=1_kr=0.1_eps1=0.0001_eps2=1e-06.txt", 66, 5, false, label);
        getTrainAndTestData(trainSample, testSample, trainLabel, testLabel, prefix, row, col);
        
        for (int i = 20; i < testSample.size();i++)
        {
            label = knn(trainSample, trainLabel, testSample[i], matrix, k,prefix);
            if (label == testLabel[i])
            {
                correct++; 
            }
        }
        cout << correct << "/" << testSample.size() << endl;
    }

    参考文献:

    辛永佳. 基于分层稀疏表示模型的人体姿态和行为相似性度量[D]. 北京工业大学, 2016.

  • 相关阅读:
    DevC++手动开栈
    二分图|网络流建模复习
    C++常用数据类型范围
    卡常剪贴板
    AcWing 2425. 奇怪的计算器
    AcWing 153. 双栈排序 震惊 !2^n 过 1000
    AcWing 352. 闇の連鎖
    AcWing 246. 区间最大公约数
    AcWing 221. 龙哥的问题
    AcWing 381. 有线电视网络
  • 原文地址:https://www.cnblogs.com/hellowooorld/p/7943614.html
Copyright © 2011-2022 走看看