又是一段辛酸史,又是自己的粗心。。。(大哭中)
1、问题描述
处理一个图像分类问题,本来只是简单得统计下测试集的查准和查全,由于不停在调整分类大小,所以首先使用宏定义类的大小为NUMCLASS:
#define NUMClASS 54
然后,声明vector<int>向量时初始化了其大小如下:
vector<int> numLabels(NUMClASS, 0); vector<int> numAccuracy(NUMClASS, 0); vector<int> numAllDetect(NUMClASS, 0);
其中,numLabels存储样本每类groundTruth标签;numAccuracy存储样本每类识别准确个数;numAllDetect存储样本每类识别总个数;
其次,在while循环测试单张样本中,定义了统计查准和查全的函数:
while(fgets(buff, 2000 ,fpListFile) != NULL) { getImageIDAndLabel(buff, loadImgPath, label); //loadImgPath为测试图片存储路径;label为测试图片groundTrouth标签 IplImage *img = cvLoadImage(loadImgPath); //读取图片 if(!img || img->nChannels!=3 || img->depth!=IPL_DEPTH_8U) { cout<<"Can't open " << loadImgPath << endl; cvReleaseImage(&img);img = 0; continue; } predict(img, Res_clothRecognition); //识别,Res_clothRecognition存储识别结果 resultStatic(label, Res_clothRecognition, numLabels, numAccuracy, numThreshDetect, numAllDetect); //统计结果 }
其中,predict()为识别分类接口;resultStatic()为统计识别结果接口;
2、问题原因
在我又一次调整了类别个数时,忘记修改NUMCLASS 的值,也就是说,我实际进行预测的那一批数据中,有label是大于54的,所以在resultStatic()函数中,直接给numLabels[label]中大于其size的index赋值,是违法的!!!
但是,我使用gdb调试程序运行产生的core文件时,bug定位的位置为while()那行!!!也有memory violation提示,但根本没找到位置,又因为vin界面用的太不熟悉,一直没注意到我最初的宏定义位置,直到将cpp文件在Source Insight中打开,我才一眼注意到了define!!!
好桑心,一直排斥用vim,总觉得不够直观。四个小时就这么过去了,深深地为我的程序生涯感到担忧。。。