From 387f42af5c6147a16af52cae4d50acaa3e6753a3 Mon Sep 17 00:00:00 2001 From: lxm <1367240116@qq.com> Date: Fri, 11 Aug 2023 18:29:22 +0800 Subject: [PATCH 1/7] COCO Model mAP eVAL --- CMakeLists.txt | 3 + .../test/eval_mAP_on_coco_val/coco_eval.py | 32 +++++ .../eval_mAP_on_coco_val.cpp | 100 ++++++++++++++ .../test/eval_mAP_on_coco_val/gt2cocojson.py | 124 ++++++++++++++++++ .../test/eval_mAP_on_coco_val/pd2cocojson.py | 66 ++++++++++ 5 files changed, 325 insertions(+) create mode 100644 samples/test/eval_mAP_on_coco_val/coco_eval.py create mode 100644 samples/test/eval_mAP_on_coco_val/eval_mAP_on_coco_val.cpp create mode 100644 samples/test/eval_mAP_on_coco_val/gt2cocojson.py create mode 100644 samples/test/eval_mAP_on_coco_val/pd2cocojson.py diff --git a/CMakeLists.txt b/CMakeLists.txt index e35dffe..d19ed0c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -269,6 +269,9 @@ target_link_libraries(GimbalUdpDetectionInfoSender sv_world) add_executable(EvalFpsOnVideo samples/test/eval_fps_on_video.cpp) target_link_libraries(EvalFpsOnVideo sv_world) +add_executable(EvalModelOnCocoVal samples/test/eval_mAP_on_coco_val/eval_mAP_on_coco_val.cpp) +target_link_libraries(EvalModelOnCocoVal sv_world) + include_directories(${CMAKE_CURRENT_SOURCE_DIR}/samples/calib) add_executable(CameraCalibrarion samples/calib/calibrate_camera_charuco.cpp) target_link_libraries(CameraCalibrarion ${OpenCV_LIBS}) diff --git a/samples/test/eval_mAP_on_coco_val/coco_eval.py b/samples/test/eval_mAP_on_coco_val/coco_eval.py new file mode 100644 index 0000000..25f90af --- /dev/null +++ b/samples/test/eval_mAP_on_coco_val/coco_eval.py @@ -0,0 +1,32 @@ +from pycocotools.coco import COCO +from pycocotools.cocoeval import COCOeval +import os + +if __name__ == '__main__': + path = os.path.abspath(os.path.join(os.getcwd(),"../../..")) + pred_json = 'pd_coco.json' + anno_json = path + '/val2017/gt_coco.json' + + # use COCO API to load forecast results and annotations + cocoGt = COCO(anno_json) + cocoDt = cocoGt.loadRes(pred_json) + + # create COCO eval object + cocoEval = COCOeval(cocoGt, cocoDt,'bbox') + + # assessment + cocoEval.evaluate() + cocoEval.accumulate() + cocoEval.summarize() + + + # save results + with open('coco_eval.txt', 'w') as f: + f.write(str(cocoEval.stats)) + + + + + + + diff --git a/samples/test/eval_mAP_on_coco_val/eval_mAP_on_coco_val.cpp b/samples/test/eval_mAP_on_coco_val/eval_mAP_on_coco_val.cpp new file mode 100644 index 0000000..dc31f8a --- /dev/null +++ b/samples/test/eval_mAP_on_coco_val/eval_mAP_on_coco_val.cpp @@ -0,0 +1,100 @@ +#include +#include +// 包含SpireCV SDK头文件 +#include + +using namespace std; +using namespace cv; + +//extract name +std::string GetImageFileName(const std::string& imagePath) { + size_t lastSlash = imagePath.find_last_of("/\\"); + if (lastSlash == std::string::npos) { + return imagePath; + } else { + std::string fileName = imagePath.substr(lastSlash + 1); + size_t lastDot = fileName.find_last_of("."); + if (lastDot != std::string::npos) { + return fileName.substr(0, lastDot); + } + return fileName; + } +} + + +int main(int argc, char *argv[]) +{ + // 实例化 通用目标 检测器类 + sv::CommonObjectDetector cod; + // 手动导入相机参数,如果使用Amov的G1等吊舱或相机,则可以忽略该步骤,将自动下载相机参数文件 + cod.loadCameraParams(sv::get_home() + "/SpireCV/calib_webcam_640x480.yaml"); + + //load data + string val_path = sv::get_home() + "/SpireCV/val2017/val2017"; + vector val_image; + glob(val_path, val_image, false); + if (val_image.size() == 0) + { + printf("val_image error!!!\n"); + exit(1); + } + + //preds folder + + std::string folder = sv::get_home() + "/SpireCV/val2017/preds"; + int checkStatus = std::system(("if [ -d \"" + folder + "\" ]; then echo; fi").c_str()); + if(checkStatus == 0) + { + int removeStatus = std::system(("rm -rf \"" + folder + "\"").c_str()); + if(removeStatus != 0) + { + printf("remove older preds folder error!!!\n"); + exit(1); + } + } + + int status = std::system(("mkdir \""+folder+"\"").c_str()); + if(status != 0) + { + printf("create preds folder error!!!\n"); + exit(1); + } + + + for (int i = 0; i < val_image.size(); i++) { + + //create pred file + std::string val_image_name = GetImageFileName(val_image[i]); + std::string filename = folder+ val_image_name + ".txt"; + std::ofstream file(filename); + file.is_open(); + file< Date: Fri, 11 Aug 2023 18:33:17 +0800 Subject: [PATCH 2/7] COCO Model mAP Eval --- samples/test/eval_mAP_on_coco_val/coco_eval.py | 7 ------- samples/test/eval_mAP_on_coco_val/gt2cocojson.py | 1 - samples/test/eval_mAP_on_coco_val/pd2cocojson.py | 8 -------- 3 files changed, 16 deletions(-) diff --git a/samples/test/eval_mAP_on_coco_val/coco_eval.py b/samples/test/eval_mAP_on_coco_val/coco_eval.py index 25f90af..9412ddd 100644 --- a/samples/test/eval_mAP_on_coco_val/coco_eval.py +++ b/samples/test/eval_mAP_on_coco_val/coco_eval.py @@ -23,10 +23,3 @@ if __name__ == '__main__': # save results with open('coco_eval.txt', 'w') as f: f.write(str(cocoEval.stats)) - - - - - - - diff --git a/samples/test/eval_mAP_on_coco_val/gt2cocojson.py b/samples/test/eval_mAP_on_coco_val/gt2cocojson.py index 46a66aa..c3ff5a4 100644 --- a/samples/test/eval_mAP_on_coco_val/gt2cocojson.py +++ b/samples/test/eval_mAP_on_coco_val/gt2cocojson.py @@ -121,4 +121,3 @@ with open(coco_json_save, 'w') as f: json.dump(coco_json, f, indent=2) print(len(coco_json['images']), len(coco_json['annotations']), len(coco_json['categories']), 'Done!') - diff --git a/samples/test/eval_mAP_on_coco_val/pd2cocojson.py b/samples/test/eval_mAP_on_coco_val/pd2cocojson.py index 4c5d890..05f002a 100644 --- a/samples/test/eval_mAP_on_coco_val/pd2cocojson.py +++ b/samples/test/eval_mAP_on_coco_val/pd2cocojson.py @@ -56,11 +56,3 @@ with open(os.path.join(coco_json_save), 'w') as f: json.dump(coco_json, f, indent=2) print(len(coco_json), 'Done!') - - - - - - - - From 7a01223db47bd9d1b714e8f6a1a94f7db5853bf1 Mon Sep 17 00:00:00 2001 From: jario-jin Date: Fri, 11 Aug 2023 11:27:38 +0000 Subject: [PATCH 3/7] update samples/test/eval_mAP_on_coco_val/coco_eval.py. Signed-off-by: jario-jin --- .../test/eval_mAP_on_coco_val/coco_eval.py | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/samples/test/eval_mAP_on_coco_val/coco_eval.py b/samples/test/eval_mAP_on_coco_val/coco_eval.py index 9412ddd..7ff2303 100644 --- a/samples/test/eval_mAP_on_coco_val/coco_eval.py +++ b/samples/test/eval_mAP_on_coco_val/coco_eval.py @@ -3,23 +3,23 @@ from pycocotools.cocoeval import COCOeval import os if __name__ == '__main__': - path = os.path.abspath(os.path.join(os.getcwd(),"../../..")) - pred_json = 'pd_coco.json' - anno_json = path + '/val2017/gt_coco.json' + path = os.path.abspath(os.path.join(os.getcwd(),"../../..")) + pred_json = 'pd_coco.json' + anno_json = path + '/val2017/gt_coco.json' - # use COCO API to load forecast results and annotations - cocoGt = COCO(anno_json) - cocoDt = cocoGt.loadRes(pred_json) + # use COCO API to load forecast results and annotations + cocoGt = COCO(anno_json) + cocoDt = cocoGt.loadRes(pred_json) - # create COCO eval object - cocoEval = COCOeval(cocoGt, cocoDt,'bbox') + # create COCO eval object + cocoEval = COCOeval(cocoGt, cocoDt,'bbox') - # assessment - cocoEval.evaluate() - cocoEval.accumulate() - cocoEval.summarize() + # assessment + cocoEval.evaluate() + cocoEval.accumulate() + cocoEval.summarize() - # save results - with open('coco_eval.txt', 'w') as f: - f.write(str(cocoEval.stats)) + # save results + with open('coco_eval.txt', 'w') as f: + f.write(str(cocoEval.stats)) From cf7fad3b2b1dda84d3f4bf27102043cd393b5ba5 Mon Sep 17 00:00:00 2001 From: jario-jin Date: Fri, 11 Aug 2023 11:31:51 +0000 Subject: [PATCH 4/7] update samples/test/eval_mAP_on_coco_val/pd2cocojson.py. Signed-off-by: jario-jin --- .../test/eval_mAP_on_coco_val/pd2cocojson.py | 66 +++++++++---------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/samples/test/eval_mAP_on_coco_val/pd2cocojson.py b/samples/test/eval_mAP_on_coco_val/pd2cocojson.py index 05f002a..3d74acb 100644 --- a/samples/test/eval_mAP_on_coco_val/pd2cocojson.py +++ b/samples/test/eval_mAP_on_coco_val/pd2cocojson.py @@ -17,42 +17,42 @@ coco_json = [] # load images dir images = os.listdir(images_path) for image in images: - print(image) - # get image name - image_name, image_suffix = os.path.splitext(image) - # get image W and H - image_path = images_path + '/' + image - img = cv2.imread(image_path) - height, width, _ = img.shape + print(image) + # get image name + image_name, image_suffix = os.path.splitext(image) + # get image W and H + image_path = images_path + '/' + image + img = cv2.imread(image_path) + height, width, _ = img.shape - # read pred's txt - pred_path = preds_path + '/' + image_name + '.txt' - if not os.path.exists(pred_path): - continue - with open(pred_path, 'r') as f: - preds = f.readlines() - preds = [l.strip() for l in preds] - for j,pred in enumerate(preds): - pred = pred.split(' ') - category_id = int(pred[0]) - x = float(pred[1]) * width - y = float(pred[2]) * height - w = float(pred[3]) * width - h = float(pred[4]) * height - xmin = x - w / 2 - ymin = y - h / 2 - xmax = x + w / 2 - ymax = y + h / 2 - - coco_json.append({ - 'image_id': int(image_name), - 'category_id': category_id + 1, - 'bbox': [xmin, ymin, w, h], - 'score': float(pred[5]), - 'area': w * h}) + # read pred's txt + pred_path = preds_path + '/' + image_name + '.txt' + if not os.path.exists(pred_path): + continue + with open(pred_path, 'r') as f: + preds = f.readlines() + preds = [l.strip() for l in preds] + for j, pred in enumerate(preds): + pred = pred.split(' ') + category_id = int(pred[0]) + x = float(pred[1]) * width + y = float(pred[2]) * height + w = float(pred[3]) * width + h = float(pred[4]) * height + xmin = x - w / 2 + ymin = y - h / 2 + xmax = x + w / 2 + ymax = y + h / 2 + + coco_json.append({ + 'image_id': int(image_name), + 'category_id': category_id + 1, + 'bbox': [xmin, ymin, w, h], + 'score': float(pred[5]), + 'area': w * h}) # save json with open(os.path.join(coco_json_save), 'w') as f: - json.dump(coco_json, f, indent=2) + json.dump(coco_json, f, indent=2) print(len(coco_json), 'Done!') From 6d0f83b4d3bf7ccc4362887a476370efd589f526 Mon Sep 17 00:00:00 2001 From: lxm <1367240116@qq.com> Date: Sun, 13 Aug 2023 16:05:24 +0800 Subject: [PATCH 5/7] COCO Model mAP Eval --- .../test/eval_mAP_on_coco_val/coco_eval.py | 30 ++--- .../eval_mAP_on_coco_val.cpp | 2 +- .../test/eval_mAP_on_coco_val/gt2cocojson.py | 123 ------------------ .../test/eval_mAP_on_coco_val/pd2cocojson.py | 70 +++++----- 4 files changed, 53 insertions(+), 172 deletions(-) delete mode 100644 samples/test/eval_mAP_on_coco_val/gt2cocojson.py diff --git a/samples/test/eval_mAP_on_coco_val/coco_eval.py b/samples/test/eval_mAP_on_coco_val/coco_eval.py index 7ff2303..81391d5 100644 --- a/samples/test/eval_mAP_on_coco_val/coco_eval.py +++ b/samples/test/eval_mAP_on_coco_val/coco_eval.py @@ -3,23 +3,23 @@ from pycocotools.cocoeval import COCOeval import os if __name__ == '__main__': - path = os.path.abspath(os.path.join(os.getcwd(),"../../..")) - pred_json = 'pd_coco.json' - anno_json = path + '/val2017/gt_coco.json' + path = os.path.abspath(os.path.join(os.getcwd(),"../../..")) + pred_json = 'pd_coco.json' + anno_json = path + '/val2017/instances_val2017.json' - # use COCO API to load forecast results and annotations - cocoGt = COCO(anno_json) - cocoDt = cocoGt.loadRes(pred_json) + # use COCO API to load forecast results and annotations + cocoGt = COCO(anno_json) + cocoDt = cocoGt.loadRes(pred_json) - # create COCO eval object - cocoEval = COCOeval(cocoGt, cocoDt,'bbox') + # create COCO eval object + cocoEval = COCOeval(cocoGt, cocoDt,'bbox') - # assessment - cocoEval.evaluate() - cocoEval.accumulate() - cocoEval.summarize() + # assessment + cocoEval.evaluate() + cocoEval.accumulate() + cocoEval.summarize() - # save results - with open('coco_eval.txt', 'w') as f: - f.write(str(cocoEval.stats)) + # save results + with open('coco_eval.txt', 'w') as f: + f.write(str(cocoEval.stats)) diff --git a/samples/test/eval_mAP_on_coco_val/eval_mAP_on_coco_val.cpp b/samples/test/eval_mAP_on_coco_val/eval_mAP_on_coco_val.cpp index dc31f8a..5ec4514 100644 --- a/samples/test/eval_mAP_on_coco_val/eval_mAP_on_coco_val.cpp +++ b/samples/test/eval_mAP_on_coco_val/eval_mAP_on_coco_val.cpp @@ -65,7 +65,7 @@ int main(int argc, char *argv[]) //create pred file std::string val_image_name = GetImageFileName(val_image[i]); - std::string filename = folder+ val_image_name + ".txt"; + std::string filename = folder+"/"+ val_image_name + ".txt"; std::ofstream file(filename); file.is_open(); file< Date: Mon, 14 Aug 2023 01:53:16 +0000 Subject: [PATCH 6/7] update samples/test/eval_mAP_on_coco_val/coco_eval.py. Signed-off-by: jario-jin --- .../test/eval_mAP_on_coco_val/coco_eval.py | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/samples/test/eval_mAP_on_coco_val/coco_eval.py b/samples/test/eval_mAP_on_coco_val/coco_eval.py index 81391d5..b534d29 100644 --- a/samples/test/eval_mAP_on_coco_val/coco_eval.py +++ b/samples/test/eval_mAP_on_coco_val/coco_eval.py @@ -3,23 +3,23 @@ from pycocotools.cocoeval import COCOeval import os if __name__ == '__main__': - path = os.path.abspath(os.path.join(os.getcwd(),"../../..")) - pred_json = 'pd_coco.json' - anno_json = path + '/val2017/instances_val2017.json' + path = os.path.abspath(os.path.join(os.getcwd(),"../../..")) + pred_json = 'pd_coco.json' + anno_json = path + '/val2017/instances_val2017.json' - # use COCO API to load forecast results and annotations - cocoGt = COCO(anno_json) - cocoDt = cocoGt.loadRes(pred_json) + # use COCO API to load forecast results and annotations + cocoGt = COCO(anno_json) + cocoDt = cocoGt.loadRes(pred_json) - # create COCO eval object - cocoEval = COCOeval(cocoGt, cocoDt,'bbox') + # create COCO eval object + cocoEval = COCOeval(cocoGt, cocoDt,'bbox') - # assessment - cocoEval.evaluate() - cocoEval.accumulate() - cocoEval.summarize() + # assessment + cocoEval.evaluate() + cocoEval.accumulate() + cocoEval.summarize() - # save results - with open('coco_eval.txt', 'w') as f: - f.write(str(cocoEval.stats)) + # save results + with open('coco_eval.txt', 'w') as f: + f.write(str(cocoEval.stats)) From 1859cd66eb33ba3c792a0fc78beab1b2f2110c03 Mon Sep 17 00:00:00 2001 From: jario-jin Date: Mon, 14 Aug 2023 01:57:52 +0000 Subject: [PATCH 7/7] update samples/test/eval_mAP_on_coco_val/pd2cocojson.py. Signed-off-by: jario-jin --- .../test/eval_mAP_on_coco_val/pd2cocojson.py | 72 +++++++++---------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/samples/test/eval_mAP_on_coco_val/pd2cocojson.py b/samples/test/eval_mAP_on_coco_val/pd2cocojson.py index fa0c48b..7373110 100644 --- a/samples/test/eval_mAP_on_coco_val/pd2cocojson.py +++ b/samples/test/eval_mAP_on_coco_val/pd2cocojson.py @@ -6,57 +6,57 @@ import cv2 # revert prediction results to coco_json path = os.path.abspath(os.path.join(os.getcwd(),"../../..")) # all files dir -images_path = path+'/val2017/val2017' -preds_path = path+'/val2017/preds' +images_path = path + '/val2017/val2017' +preds_path = path + '/val2017/preds' -coco_json_save ='pd_coco.json' +coco_json_save = 'pd_coco.json' # config coco_json coco_json = [] # remap the id of the coco dataset id_map = {1: 0, 2: 1, 3: 2, 4: 3, 5: 4, 6: 5, 7: 6, 8: 7, 9: 8, 10: 9, 11: 10, 13: 11, 14: 12, 15: 13, 16: 14, 17: 15, 18: 16, 19: 17, 20: 18, 21: 19, 22: 20, 23: 21, 24: 22, 25: 23, 27: 24, 28: 25, 31: 26, 32: 27, 33: 28, 34: 29, 35: 30, 36: 31, 37: 32, 38: 33, 39: 34, 40: 35, 41: 36, 42: 37, 43: 38, 44: 39, 46: 40, 47: 41, 48: 42, 49: 43, 50: 44, 51: 45, 52: 46, 53: 47, 54: 48, 55: 49, 56: 50, 57: 51, 58: 52, 59: 53, 60: 54, 61: 55, 62: 56, 63: 57, 64: 58, 65: 59, 67: 60, 70: 61, 72: 62, 73: 63, 74: 64, 75: 65, 76: 66, 77: 67, 78: 68, 79: 69, 80: 70, 81: 71, 82: 72, 84: 73, 85: 74, 86: 75, 87: 76, 88: 77, 89: 78, 90: 79} -reid_mp = { value: key for key, value in id_map.items()} +reid_mp = {value: key for key, value in id_map.items()} # load images dir images = os.listdir(images_path) for image in images: - print(image) - # get image name - image_name, image_suffix = os.path.splitext(image) - # get image W and H - image_path = images_path + '/' + image - img = cv2.imread(image_path) - height, width, _ = img.shape + print(image) + # get image name + image_name, image_suffix = os.path.splitext(image) + # get image W and H + image_path = images_path + '/' + image + img = cv2.imread(image_path) + height, width, _ = img.shape - # read pred's txt - pred_path = preds_path + '/' + image_name + '.txt' - if not os.path.exists(pred_path): - continue - with open(pred_path, 'r') as f: - preds = f.readlines() - preds = [l.strip() for l in preds] - for j,pred in enumerate(preds): - pred = pred.split(' ') - category_id = int(pred[0]) - x = float(pred[1]) * width - y = float(pred[2]) * height - w = float(pred[3]) * width - h = float(pred[4]) * height - xmin = x - w / 2 - ymin = y - h / 2 - xmax = x + w / 2 - ymax = y + h / 2 + # read pred's txt + pred_path = preds_path + '/' + image_name + '.txt' + if not os.path.exists(pred_path): + continue + with open(pred_path, 'r') as f: + preds = f.readlines() + preds = [l.strip() for l in preds] + for j, pred in enumerate(preds): + pred = pred.split(' ') + category_id = int(pred[0]) + x = float(pred[1]) * width + y = float(pred[2]) * height + w = float(pred[3]) * width + h = float(pred[4]) * height + xmin = x - w / 2 + ymin = y - h / 2 + xmax = x + w / 2 + ymax = y + h / 2 - coco_json.append({ - 'image_id': int(image_name), - 'category_id': int(reid_mp[category_id]), - 'bbox': [xmin, ymin, w, h], - 'score': float(pred[5]), - 'area': w * h}) + coco_json.append({ + 'image_id': int(image_name), + 'category_id': int(reid_mp[category_id]), + 'bbox': [xmin, ymin, w, h], + 'score': float(pred[5]), + 'area': w * h}) # save json with open(os.path.join(coco_json_save), 'w') as f: - json.dump(coco_json, f, indent=2) + json.dump(coco_json, f, indent=2) print(len(coco_json), 'Done!')