in tools/kitti_eval/evaluate_object_3d_offline_ap40.cpp [383:456]
void cleanData(CLASSES current_class, const vector<tGroundtruth> >, const vector<tDetection> &det, vector<int32_t> &ignored_gt, vector<tGroundtruth> &dc, vector<int32_t> &ignored_det, int32_t &n_gt, DIFFICULTY difficulty){
// extract ground truth bounding boxes for current evaluation class
for(int32_t i=0;i<gt.size(); i++){
// only bounding boxes with a minimum height are used for evaluation
double height = gt[i].box.y2 - gt[i].box.y1;
// neighboring classes are ignored ("van" for "car" and "person_sitting" for "pedestrian")
// (lower/upper cases are ignored)
int32_t valid_class;
// all classes without a neighboring class
if(!strcasecmp(gt[i].box.type.c_str(), CLASS_NAMES[current_class].c_str()))
valid_class = 1;
// classes with a neighboring class
else if(!strcasecmp(CLASS_NAMES[current_class].c_str(), "Pedestrian") && !strcasecmp("Person_sitting", gt[i].box.type.c_str()))
valid_class = 0;
else if(!strcasecmp(CLASS_NAMES[current_class].c_str(), "Car") && !strcasecmp("Van", gt[i].box.type.c_str()))
valid_class = 0;
// classes not used for evaluation
else
valid_class = -1;
// ground truth is ignored, if occlusion, truncation exceeds the difficulty or ground truth is too small
// (doesn't count as FN nor TP, although detections may be assigned)
bool ignore = false;
if(gt[i].occlusion>MAX_OCCLUSION[difficulty] || gt[i].truncation>MAX_TRUNCATION[difficulty] || height<MIN_HEIGHT[difficulty])
ignore = true;
// set ignored vector for ground truth
// current class and not ignored (total no. of ground truth is detected for recall denominator)
if(valid_class==1 && !ignore){
ignored_gt.push_back(0);
n_gt++;
}
// neighboring class, or current class but ignored
else if(valid_class==0 || (ignore && valid_class==1))
ignored_gt.push_back(1);
// all other classes which are FN in the evaluation
else
ignored_gt.push_back(-1);
}
// extract dontcare areas
for(int32_t i=0;i<gt.size(); i++)
if(!strcasecmp("DontCare", gt[i].box.type.c_str()))
dc.push_back(gt[i]);
// extract detections bounding boxes of the current class
for(int32_t i=0;i<det.size(); i++){
// neighboring classes are not evaluated
int32_t valid_class;
if(!strcasecmp(det[i].box.type.c_str(), CLASS_NAMES[current_class].c_str()))
valid_class = 1;
else
valid_class = -1;
int32_t height = fabs(det[i].box.y1 - det[i].box.y2);
// set ignored vector for detections
if(height<MIN_HEIGHT[difficulty])
ignored_det.push_back(1);
else if(valid_class==1)
ignored_det.push_back(0);
else
ignored_det.push_back(-1);
}
}