Fork me on GitHub

人体姿态的相似性评价基于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.

posted @ 2017-12-01 17:32  hellowOOOrld  阅读(1937)  评论(0编辑  收藏  举报