|
- # encoding:utf-8
- # Author: Zylo117
- import json
- import numpy as np
- import os
- import argparse
- import yaml
- from tqdm import tqdm
- from pycocotools.coco import COCO
- from pycocotools.cocoeval import COCOeval
- from src.mind_backbone import EfficientDetBackbone
- from src.efficientdet.utils import BBoxTransform, ClipBoxes_eval
- from util_ import preprocess, invert_affine, postprocess, boolean_string
- # from util_ import display
- from src.config import config
- from mindspore import load_checkpoint, load_param_into_net
- from mindspore import ops as op
- import mindspore
- from mindspore import Tensor
- from mindspore import context
- import moxing as mox
- from src.efficientdet.utils import ClipBoxes_eval
-
-
- ap = argparse.ArgumentParser()
- ap.add_argument('-p', '--project', type=str, default='coco', help='project file that contains parameters')
- ap.add_argument('-c', '--compound_coef', type=int, default=0, help='coefficients of efficientdet')
- ap.add_argument('-w', '--weights', type=str, default=None, help='/path/to/weights')
- ap.add_argument('--nms_threshold', type=float, default=0.5,
- help='nms threshold, don\'t change it if not for testing purposes')
- ap.add_argument('--device', type=int, default=0)
- ap.add_argument('--float32', type=boolean_string, default=False)
- ap.add_argument('--override', type=boolean_string, default=True, help='override previous bbox results file if exists')
- ap.add_argument("--dataset", type=str, default="coco2017", help="Dataset, default is coco.")
- ap.add_argument("--checkpoint_path", type=str, default="/data/efficientdet_ch/efdet.ckpt", help="")
- ap.add_argument("--data_url", type=str, default="/data/efficientdet_ch/efdet.ckpt", help="")
- ap.add_argument("--train_url", type=str, default="/data/efficientdet_ch/efdet.ckpt", help="")
- args = ap.parse_args()
-
- compound_coef = args.compound_coef # 0
- nms_threshold = args.nms_threshold # 0.5
- use_float32 = args.float32
- override_prev_results = args.override
- project_name = args.project
-
- from mindspore import context, Tensor
- context.set_context(mode=context.PYNATIVE_MODE, device_target="Ascend", enable_reduce_precision=True) # save_graphs=True
- device_id = int(os.getenv("DEVICE_ID", 3))
- context.set_context(device_id=device_id)
-
- obj_list = config.coco_classes
-
- input_sizes = [512, 640, 768, 896, 1024, 1280, 1280, 1536, 1536]
-
- obj_list = ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light',
- 'fire hydrant', '', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep',
- 'cow', 'elephant', 'bear', 'zebra', 'giraffe', '', 'backpack', 'umbrella', '', '', 'handbag', 'tie',
- 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove',
- 'skateboard', 'surfboard', 'tennis racket', 'bottle', '', 'wine glass', 'cup', 'fork', 'knife', 'spoon',
- 'bowl', 'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut',
- 'cake', 'chair', 'couch', 'potted plant', 'bed', '', 'dining table', '', '', 'toilet', '', 'tv',
- 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone', 'microwave', 'oven', 'toaster', 'sink',
- 'refrigerator', '', 'book', 'clock', 'vase', 'scissors', 'teddy bear', 'hair drier',
- 'toothbrush']
-
-
- def evaluate_coco(img_path, set_name, image_ids, coco, model, threshold=0.05):
- results = []
- num = 1
-
- for image_id in tqdm(image_ids):
-
- image_info = coco.loadImgs(image_id)[0]
- image_path = img_path + '/' + image_info['file_name']
-
- ori_imgs, framed_imgs, framed_metas = preprocess(image_path, max_size=input_sizes[compound_coef],
- mean=config.mean, std=config.std)
- # 原始图片 新图片 其他信息
- # x = torch.from_numpy(framed_imgs[0])
- x = framed_imgs[0].astype(np.float32) # (512,512,3)
-
- x = np.expand_dims(x, axis=0) # (1,512,512,3)
- x = np.transpose(x, axes=(0, 3, 1, 2))
- x = mindspore.Tensor(x)
-
- _, regression, classification, anchors = model(x)
-
- preds = postprocess(x=x, anchors=anchors, regression=regression, classification=classification, threshold=threshold, iou_threshold=nms_threshold)
-
- if not preds:
- continue
-
- preds = invert_affine(framed_metas, preds)[0]
-
- # display(image_id, [preds,], ori_imgs, obj_list, imshow=False, imwrite=True)
-
- scores = preds['scores']
- class_ids = preds['class_ids']
- rois = preds['rois']
-
- if rois.shape[0] > 0:
- # x1,y1,x2,y2 -> x1,y1,w,h
- rois[:, 2] -= rois[:, 0]
- rois[:, 3] -= rois[:, 1]
- bbox_score = scores
-
- for roi_id in range(rois.shape[0]):
- score = float(bbox_score[roi_id])
- label = int(class_ids[roi_id])
- box = rois[roi_id, :]
-
- image_result = {
- 'image_id': image_id,
- 'category_id': label + 1,
- 'score': float(score),
- 'bbox': box.tolist(),
- }
-
- results.append(image_result)
-
- print("results len :{}".format(len(results)))
-
- # write output
- filepath = f'{set_name}_bbox_results.json'
- if os.path.exists(filepath):
- os.remove(filepath)
- json.dump(results, open(filepath, 'w'), indent=4)
-
- print("save json success.")
-
-
- def _eval(coco_gt, image_ids, pred_json_path):
- # load results in COCO evaluation tool
- coco_pred = coco_gt.loadRes(pred_json_path)
- # run COCO evaluation
- coco_eval = COCOeval(coco_gt, coco_pred, 'bbox')
- coco_eval.params.imgIds = image_ids
- coco_eval.evaluate()
- coco_eval.accumulate()
- coco_eval.summarize()
-
- if __name__ == '__main__':
-
- local_data_url = "/cache/data/"
- mox.file.make_dirs(local_data_url)
-
- mox.file.copy_parallel(args.data_url, local_data_url)
-
- coco_root = local_data_url
- data_type = config.val_data_type
- VAL_GT = os.path.join(coco_root, config.instances_set.format(data_type))
-
- SET_NAME = config.val_data_type
- VAL_IMGS = os.path.join(coco_root, SET_NAME)
- MAX_IMAGES = 10000
- coco_gt = COCO(VAL_GT)
- image_ids = coco_gt.getImgIds()[:MAX_IMAGES]
-
- print("create json")
- print(os.path.exists(f'{SET_NAME}_bbox_results.json') == True)
- if override_prev_results or not os.path.exists(f'{SET_NAME}_bbox_results.json'):
-
- model = EfficientDetBackbone(90, 0, False, False) # 传入参数
- print("Load Checkpoint!")
-
- checkpoint_path = "/cache/ckpt"
- mox.file.make_dirs(local_data_url)
- checkpoint_path = os.path.join(checkpoint_path, "efdet.ckpt")
-
- mox.file.copy(args.checkpoint_path, checkpoint_path)
-
- param_dict = load_checkpoint(checkpoint_path)
- model.init_parameters_data()
- load_param_into_net(model, param_dict) # param_dict = load_checkpoint(ckpt_path)
- model.set_train(False)
- evaluate_coco(VAL_IMGS, SET_NAME, image_ids, coco_gt, model)
-
- print("go into eval json")
- _eval(coco_gt, image_ids, f'{SET_NAME}_bbox_results.json')
|