MNN models test
(cfg, model_path, data_loader, imgs_per_gpu)
| 95 | |
| 96 | |
| 97 | def single_mnn_test(cfg, model_path, data_loader, imgs_per_gpu): |
| 98 | ''' |
| 99 | MNN models test |
| 100 | ''' |
| 101 | # build MNN interpreter, and get input tensor |
| 102 | interpreter = MNN.Interpreter(model_path) |
| 103 | session = interpreter.createSession() |
| 104 | input_all = interpreter.getSessionInputAll(session) |
| 105 | name = list(input_all.keys())[0] |
| 106 | input_image = interpreter.getSessionInput(session, name) |
| 107 | correct = 0 |
| 108 | |
| 109 | if hasattr(data_loader, 'dataset'): # normal dataloader |
| 110 | data_len = len(data_loader.dataset) |
| 111 | else: |
| 112 | data_len = len(data_loader) * data_loader.batch_size |
| 113 | |
| 114 | prog_bar = mmcv.ProgressBar(data_len) |
| 115 | results = {} |
| 116 | for i, data in enumerate(data_loader): |
| 117 | # use scatter_kwargs to unpack DataContainer data for raw torch.nn.module |
| 118 | input_args, kwargs = scatter_kwargs(None, data, [-1]) |
| 119 | kwargs[0]['img'] = kwargs[0]['img'].squeeze(dim=0) |
| 120 | images = kwargs[0]['img'] |
| 121 | img_meta = kwargs[0]['img_metas'] |
| 122 | images = images.cpu().numpy() |
| 123 | |
| 124 | # transfer ndarray to MNN.tensor |
| 125 | image_mnn_tensor = MNN.Tensor(images.shape, MNN.Halide_Type_Float, |
| 126 | images, MNN.Tensor_DimensionType_Caffe) |
| 127 | |
| 128 | input_image.copyFromHostTensor(image_mnn_tensor) |
| 129 | |
| 130 | # run MNN Session |
| 131 | interpreter.runSession(session) |
| 132 | |
| 133 | # get MNN session output |
| 134 | output_tensor = interpreter.getSessionOutputAll(session) |
| 135 | |
| 136 | # get output shape |
| 137 | output_shape = model_output_shape(cfg.model.type, imgs_per_gpu) |
| 138 | |
| 139 | # transfor MNN's tensor to PyTorch's tensor |
| 140 | tmp_output = MNN.Tensor(output_shape, MNN.Halide_Type_Float, |
| 141 | np.ones(list(output_shape)).astype(np.float32), |
| 142 | MNN.Tensor_DimensionType_Caffe) |
| 143 | output_name = list(output_tensor.keys())[0] |
| 144 | output = output_tensor[output_name] |
| 145 | output.copyToHostTensor(tmp_output) |
| 146 | output = tmp_output.getData() |
| 147 | output = torch.tensor(output).view(output_shape) |
| 148 | |
| 149 | output = postprocess(output, cfg.model.num_classes, |
| 150 | cfg.model.test_conf, cfg.model.nms_thre) |
| 151 | output = output_postprocess(output, img_meta) |
| 152 | |
| 153 | for k, v in output.items(): |
| 154 | if k not in results: |
nothing calls this directly
no test coverage detected