def val(self, epoch):
        predict_list = list()
        target_list = list()
        # self.model.eval()
        if self.local_rank == 0:
            pbar = tqdm(self.vloader)
        else:
            pbar = self.vloader
        for img_tensor, targets_tensor, _ in pbar:
            _, _, h, w = img_tensor.shape
            targets_tensor[:, 3:] = targets_tensor[:, 3:] * torch.tensor(
                data=[w, h, w, h])
            img_tensor = img_tensor.to(self.device)
            targets_tensor = targets_tensor.to(self.device)
            predicts = self.ema.ema(img_tensor)
            predicts = non_max_suppression(
                predicts,
                conf_thresh=self.val_cfg['conf_thresh'],
                iou_thresh=self.val_cfg['iou_thresh'],
                max_det=self.val_cfg['max_det'],
            )
            for i, predict in enumerate(predicts):
                if predict is not None:
                    clip_coords(predict, (h, w))
                predict_list.append(predict)
                targets_sample = targets_tensor[targets_tensor[:, 0] == i][:,
                                                                           2:]
                target_list.append(targets_sample)
        mp, mr, map50, map = coco_map(predict_list, target_list)
        print(
            "epoch: {:2d}|local:{:d}|mp:{:6.4f}|mr:{:6.4f}|map50:{:6.4f}|map:{:6.4f}"
            .format(epoch + 1, self.local_rank, mp * 100, mr * 100,
                    map50 * 100, map * 100))
        last_weight_path = os.path.join(
            self.val_cfg['weight_path'],
            "{:s}_last.pth".format(self.cfg['model_name']))
        best_map_weight_path = os.path.join(
            self.val_cfg['weight_path'],
            "{:s}_best_map.pth".format(self.cfg['model_name']))
        best_map50_weight_path = os.path.join(
            self.val_cfg['weight_path'],
            "{:s}_best_map50.pth".format(self.cfg['model_name']))
        # model_static = self.model.module.state_dict() if is_parallel(self.model) else self.model.state_dict()

        ema_static = self.ema.ema.state_dict()
        cpkt = {
            "ema": ema_static,
            "map": map * 100,
            "epoch": epoch,
            "map50": map50 * 100
        }
        if self.local_rank != 0:
            return
        torch.save(cpkt, last_weight_path)
        if map > self.best_map:
            torch.save(cpkt, best_map_weight_path)
            self.best_map = map
        if map50 > self.best_map50:
            torch.save(cpkt, best_map50_weight_path)
            self.best_map50 = map50
Exemplo n.º 2
0
 def val(self, epoch):
     self.ema.ema.eval()
     predict_list = list()
     target_list = list()
     # self.model.eval()
     if self.local_rank == 0:
         pbar = tqdm(self.vloader)
     else:
         pbar = self.vloader
     for i, (img_tensor, targets_tensor, _) in enumerate(pbar):
         _, _, h, w = img_tensor.shape
         targets_tensor[:, 3:] = targets_tensor[:, 3:] * torch.tensor(
             data=[w, h, w, h])
         img_tensor = img_tensor.to(self.device)
         targets_tensor = targets_tensor.to(self.device)
         predicts, _ = self.ema.ema(img_tensor, None)
         for i, predict in enumerate(predicts):
             predict_list.append(predict)
             targets_sample = targets_tensor[targets_tensor[:, 0] == i][:,
                                                                        2:]
             target_list.append(targets_sample)
     mp, mr, map50, map = coco_map(predict_list, target_list)
     mp = reduce_sum(torch.tensor(mp,
                                  device=self.device)).item() / self.gpu_num
     mr = reduce_sum(torch.tensor(mr,
                                  device=self.device)).item() / self.gpu_num
     map50 = reduce_sum(torch.tensor(
         map50, device=self.device)).item() / self.gpu_num
     map = reduce_sum(torch.tensor(
         map, device=self.device)).item() / self.gpu_num
     if self.local_rank == 0:
         print(
             "epoch: {:2d}|gpu_num:{:d}|mp:{:6.4f}|mr:{:6.4f}|map50:{:6.4f}|map:{:6.4f}"
             .format(epoch + 1, self.gpu_num, mp * 100, mr * 100,
                     map50 * 100, map * 100))
     last_weight_path = os.path.join(
         self.val_cfg['weight_path'],
         "{:s}_last.pth".format(self.cfg['model_name']))
     best_map_weight_path = os.path.join(
         self.val_cfg['weight_path'],
         "{:s}_best_map.pth".format(self.cfg['model_name']))
     best_map50_weight_path = os.path.join(
         self.val_cfg['weight_path'],
         "{:s}_best_map50.pth".format(self.cfg['model_name']))
     ema_static = self.ema.ema.state_dict()
     cpkt = {
         "ema": ema_static,
         "map": map * 100,
         "epoch": epoch,
         "map50": map50 * 100
     }
     if self.local_rank != 0:
         return
     torch.save(cpkt, last_weight_path)
     if map > self.best_map:
         torch.save(cpkt, best_map_weight_path)
         self.best_map = map
     if map50 > self.best_map50:
         torch.save(cpkt, best_map50_weight_path)
         self.best_map50 = map50
Exemplo n.º 3
0
 def val(self, epoch):
     self.model.eval()
     self.ema.ema.eval()
     predict_list = list()
     target_list = list()
     # self.model.eval()
     if self.local_rank == 0:
         pbar = tqdm(self.vloader)
     else:
         pbar = self.vloader
     for i, (input_tensor, _) in enumerate(pbar):
         input_tensor.un_normalize_box()
         input_tensor.to(self.device)
         predicts, _ = self.model(input_tensor)
         for i, predict in enumerate(predicts):
             predict_list.append(predict)
             boxes = input_tensor.boxes[i]
             labels = input_tensor.labels[i]
             target_list.append(
                 torch.cat([labels.float().unsqueeze(-1), boxes], dim=-1))
     mp, mr, map50, map = coco_map(predict_list, target_list)
     mp = reduce_sum(torch.tensor(mp,
                                  device=self.device)).item() / self.gpu_num
     mr = reduce_sum(torch.tensor(mr,
                                  device=self.device)).item() / self.gpu_num
     map50 = reduce_sum(torch.tensor(
         map50, device=self.device)).item() / self.gpu_num
     map = reduce_sum(torch.tensor(
         map, device=self.device)).item() / self.gpu_num
     if self.local_rank == 0:
         print(
             "epoch: {:2d}|gpu_num:{:d}|mp:{:6.4f}|mr:{:6.4f}|map50:{:6.4f}|map:{:6.4f}"
             .format(epoch + 1, self.gpu_num, mp * 100, mr * 100,
                     map50 * 100, map * 100))
     last_weight_path = os.path.join(
         self.val_cfg['weight_path'],
         "{:s}_last.pth".format(self.cfg['model_name']))
     best_map_weight_path = os.path.join(
         self.val_cfg['weight_path'],
         "{:s}_best_map.pth".format(self.cfg['model_name']))
     best_map50_weight_path = os.path.join(
         self.val_cfg['weight_path'],
         "{:s}_best_map50.pth".format(self.cfg['model_name']))
     ema_static = self.ema.ema.state_dict()
     cpkt = {
         "ema": ema_static,
         "map": map * 100,
         "epoch": epoch,
         "map50": map50 * 100,
         "model": self.model.module.state_dict()
     }
     if self.local_rank != 0:
         return
     torch.save(cpkt, last_weight_path)
     if map > self.best_map:
         torch.save(cpkt, best_map_weight_path)
         self.best_map = map
     if map50 > self.best_map50:
         torch.save(cpkt, best_map50_weight_path)
         self.best_map50 = map50
Exemplo n.º 4
0
 def val(self, epoch):
     self.model.eval()
     self.ema.ema.eval()
     predict_list = list()
     target_list = list()
     if self.local_rank == 0:
         pbar = tqdm(self.vloader)
     else:
         pbar = self.vloader
     for img_tensor, targets_tensor in pbar:
         _, _, h, w = img_tensor.shape
         targets_tensor[:, 1:] = targets_tensor[:, 1:] * torch.tensor(data=[w, h, w, h])
         targets_tensor[:, [1, 2]] = targets_tensor[:, [1, 2]] - targets_tensor[:, [3, 4]] * 0.5
         targets_tensor[:, [3, 4]] = targets_tensor[:, [1, 2]] + targets_tensor[:, [3, 4]]
         img_tensor = img_tensor.to(self.device)
         targets_tensor = targets_tensor.to(self.device)
         predicts = self.ema.ema(img_tensor)['predicts']
         for i, pred in enumerate(predicts):
             if pred is not None:
                 pred = torch.cat([pred, torch.zeros_like(pred[..., [0]])], dim=-1)
             predict_list.append(pred)
             targets_sample = targets_tensor[targets_tensor[:, 0] == i][:, 1:]
             targets_sample = torch.cat([torch.zeros_like(targets_sample[..., [0]]), targets_sample], dim=-1)
             target_list.append(targets_sample)
     mp, mr, map50, map = coco_map(predict_list, target_list)
     mp = reduce_sum(torch.tensor(mp, device=self.device)).item() / self.gpu_num
     mr = reduce_sum(torch.tensor(mr, device=self.device)).item() / self.gpu_num
     map50 = reduce_sum(torch.tensor(map50, device=self.device)).item() / self.gpu_num
     map = reduce_sum(torch.tensor(map, device=self.device)).item() / self.gpu_num
     if self.local_rank == 0:
         print("epoch: {:2d}|gpu_num:{:d}|mp:{:6.4f}|mr:{:6.4f}|map50:{:6.4f}|map:{:6.4f}"
               .format(epoch + 1,
                       self.gpu_num,
                       mp * 100,
                       mr * 100,
                       map50 * 100,
                       map * 100))
     last_weight_path = os.path.join(self.val_cfg['weight_path'],
                                     "{:s}_{:s}_last.pth"
                                     .format(self.cfg['model_name'], self.model_cfg['scale_name']))
     best_map_weight_path = os.path.join(self.val_cfg['weight_path'],
                                         "{:s}_{:s}_best_map.pth"
                                         .format(self.cfg['model_name'], self.model_cfg['scale_name']))
     ema_static = self.ema.ema.state_dict()
     cpkt = {
         "ema": ema_static,
         "map": map * 100,
         "epoch": epoch,
     }
     if self.local_rank != 0:
         return
     torch.save(cpkt, last_weight_path)
     if map > self.best_map:
         torch.save(cpkt, best_map_weight_path)
         self.best_map = map
Exemplo n.º 5
0
    def val(self, epoch):
        predict_list = list()
        target_list = list()
        self.model.eval()
        self.ema.ema.eval()
        if self.local_rank == 0:
            pbar = tqdm(self.vloader)
        else:
            pbar = self.vloader
        for img_tensor, valid_size, targets_tensor, mask_tensor, batch_len in pbar:
            img_tensor = img_tensor.to(self.device)
            targets_tensor = targets_tensor.to(self.device)
            predicts = self.ema.ema(img_tensor,
                                    valid_size=valid_size)['predicts']
            predicts = [p[0] for p in predicts]
            for pred, target in zip(predicts, targets_tensor.split(batch_len)):
                predict_list.append(pred)
                target_list.append(target)
        mp, mr, map50, mean_ap = coco_map(predict_list, target_list)
        mp = reduce_sum(torch.tensor(mp, device=self.device)) / self.gpu_num
        mr = reduce_sum(torch.tensor(mr, device=self.device)) / self.gpu_num
        map50 = reduce_sum(torch.tensor(map50,
                                        device=self.device)) / self.gpu_num
        mean_ap = reduce_sum(torch.tensor(mean_ap,
                                          device=self.device)) / self.gpu_num

        if self.local_rank == 0:
            print("*" * 20, "eval start", "*" * 20)
            print(
                "epoch: {:2d}|mp:{:6.4f}|mr:{:6.4f}|map50:{:6.4f}|map:{:6.4f}".
                format(epoch + 1, mp * 100, mr * 100, map50 * 100,
                       mean_ap * 100))
            print("*" * 20, "eval end", "*" * 20)
        last_weight_path = os.path.join(
            self.val_cfg['weight_path'],
            "{:s}_{:s}_last.pth".format(self.cfg['model_name'],
                                        self.model_cfg['backbone']))
        best_map_weight_path = os.path.join(
            self.val_cfg['weight_path'],
            "{:s}_{:s}_best_map.pth".format(self.cfg['model_name'],
                                            self.model_cfg['backbone']))
        ema_static = self.ema.ema.state_dict()
        cpkt = {
            "ema": ema_static,
            "map": mean_ap * 100,
            "epoch": epoch,
        }
        if self.local_rank != 0:
            return
        torch.save(cpkt, last_weight_path)
        if mean_ap > self.best_map:
            torch.save(cpkt, best_map_weight_path)
            self.best_map = mean_ap
Exemplo n.º 6
0
def valid_model():
    model = FCOS()
    weights = torch.load("weights/0_focs_last.pth")['ema']
    model.load_state_dict(weights)
    model.cuda().eval()
    predict_list = list()
    target_list = list()
    vdata = COCODataSets(
        img_root="/home/huffman/data/val2017",
        annotation_path="/home/huffman/data/annotations/instances_val2017.json",
        use_crowd=False,
        augments=False,
        debug=False,
        remove_blank=False,
        img_size=640)
    vloader = DataLoader(dataset=vdata,
                         batch_size=4,
                         num_workers=4,
                         collate_fn=vdata.collate_fn,
                         shuffle=False)
    pbar = tqdm(vloader)
    for img_tensor, targets_tensor, _ in pbar:
        _, _, h, w = img_tensor.shape
        targets_tensor[:, 3:] = targets_tensor[:, 3:] * torch.tensor(
            data=[w, h, w, h])
        img_tensor = img_tensor.cuda()
        targets_tensor = targets_tensor.cuda()
        predicts = model(img_tensor)

        for i in range(len(predicts)):
            predicts[i][:, [0, 2]] = predicts[i][:, [0, 2]].clamp(min=0, max=w)
            predicts[i][:, [1, 3]] = predicts[i][:, [1, 3]].clamp(min=0, max=h)
        predicts = non_max_suppression(predicts,
                                       conf_thresh=0.05,
                                       iou_thresh=0.6,
                                       max_det=300)
        for i, predict in enumerate(predicts):
            predict_list.append(predict)
            targets_sample = targets_tensor[targets_tensor[:, 0] == i][:, 2:]
            target_list.append(targets_sample)
    mp, mr, map50, map = coco_map(predict_list, target_list)
    print(map50, map)
Exemplo n.º 7
0
    def val(self, epoch):
        predict_list = list()
        target_list = list()
        self.model.eval()
        if self.local_rank == 0:
            pbar = tqdm(self.vloader)
        else:
            pbar = self.vloader
        for img_tensor, targets_tensor, _ in pbar:
            _, _, h, w = img_tensor.shape
            targets_tensor[:, 3:] = targets_tensor[:, 3:] * torch.tensor(
                data=[w, h, w, h])
            img_tensor = img_tensor.to(self.device)
            targets_tensor = targets_tensor.to(self.device)
            predicts = self.ema.ema(img_tensor)

            for i in range(len(predicts)):
                predicts[i][:, [0, 2]] = predicts[i][:, [0, 2]].clamp(min=0,
                                                                      max=w)
                predicts[i][:, [1, 3]] = predicts[i][:, [1, 3]].clamp(min=0,
                                                                      max=h)
            predicts = non_max_suppression(
                predicts,
                conf_thresh=self.val_cfg['conf_thresh'],
                iou_thresh=self.val_cfg['iou_thresh'],
                max_det=self.val_cfg['max_det'],
            )
            for i, predict in enumerate(predicts):
                predict_list.append(predict)
                targets_sample = targets_tensor[targets_tensor[:, 0] == i][:,
                                                                           2:]
                target_list.append(targets_sample)
        mp, mr, map50, map = coco_map(predict_list, target_list)
        print(
            "epoch: {:2d}|local:{:d}|mp:{:6.4f}|mr:{:6.4f}|map50:{:6.4f}|map:{:6.4f}"
            .format(epoch + 1, self.local_rank, mp * 100, mr * 100,
                    map50 * 100, map * 100))
        last_weight_path = os.path.join(
            self.val_cfg['weight_path'],
            "{:s}_last.pth".format(self.cfg['model_name']))
        best_map_weight_path = os.path.join(
            self.val_cfg['weight_path'],
            "{:s}_best_map.pth".format(self.cfg['model_name']))
        best_map50_weight_path = os.path.join(
            self.val_cfg['weight_path'],
            "{:s}_best_map50.pth".format(self.cfg['model_name']))

        ema_static = self.ema.ema.state_dict()
        cpkt = {
            "ema": ema_static,
            "map": map * 100,
            "epoch": epoch,
            "map50": map50 * 100
        }
        if self.local_rank != 0:
            return

        if self.tb_writer:
            tags = [
                'metrics/precision', 'metrics/recall', 'metrics/mAP_0.5',
                'metrics/mAP_0.5:0.95'
            ]
            for x, tag in zip([mp, mr, map50, map], tags):
                self.tb_writer.add_scalar(tag, x, epoch + 1)

        torch.save(cpkt, last_weight_path)
        if map > self.best_map:
            torch.save(cpkt, best_map_weight_path)
            self.best_map = map
        if map50 > self.best_map50:
            torch.save(cpkt, best_map50_weight_path)
            self.best_map50 = map50
    def val(self, epoch):
        predict_list = list()
        target_list = list()
        # self.model.eval()

        pbar = tqdm(self.vloader)

        path_list, shape_list = [], []
        for img_tensor, targets_tensor, imgIDs, shapes in pbar:
            _, _, h, w = img_tensor.shape
            targets_tensor[:, 3:] = targets_tensor[:, 3:] * torch.tensor(
                data=[w, h, w, h])
            img_tensor = img_tensor.to(self.device)
            targets_tensor = targets_tensor.to(self.device)
            predicts = self.ema.ema(img_tensor)
            #  predicts after nms is a list(len=bs), its element has shape=[N,6]  6==>(x1, y1, x2, y2, conf, cls)
            predicts = non_max_suppression(
                predicts,
                conf_thresh=self.val_cfg['conf_thresh'],
                iou_thresh=self.val_cfg['iou_thresh'],
                max_det=self.val_cfg['max_det'])

            for i, predict in enumerate(predicts):
                if predict is not None:
                    clip_coords(predict, (h, w))
                predict_list.append(predict)
                targets_sample = targets_tensor[targets_tensor[:, 0] == i][:,
                                                                           2:]
                target_list.append(targets_sample)
                path_list.append(imgIDs[i])
                shape_list.append(shapes[i])
            # after above code block, predict_list(len=len(dataset)), its element shape = [n,6]  6==>(x1,y1,x2,y2,score,cls_id)
            #                         target_list(len=len(dataset)), its element shape = [m, 5] 5==>(cls_id,x1,y1,x2,y2)
        mp, mr, map50, map, self.maps = coco_map(predict_list, target_list,
                                                 path_list, shape_list,
                                                 self.data_cfg['img_size'])
        print(
            "epoch: {:2d}|local:{:d}|mp:{:6.4f}|mr:{:6.4f}|map50:{:6.4f}|map:{:6.4f}"
            .format(epoch + 1, 0, mp * 100, mr * 100, map50 * 100, map * 100))
        last_weight_path = os.path.join(
            self.val_cfg['weight_path'],
            "{:s}_last.pth".format(self.cfg['model_name']))
        best_map_weight_path = os.path.join(
            self.val_cfg['weight_path'],
            "{:s}_best_map.pth".format(self.cfg['model_name']))
        best_map50_weight_path = os.path.join(
            self.val_cfg['weight_path'],
            "{:s}_best_map50.pth".format(self.cfg['model_name']))
        # model_static = self.model.module.state_dict() if is_parallel(self.model) else self.model.state_dict()

        ema_static = self.ema.ema.state_dict()
        cpkt = {
            "ema": ema_static,
            "map": map * 100,
            "epoch": epoch,
            "map50": map50 * 100
        }

        torch.save(cpkt, last_weight_path)
        if map > self.best_map:
            torch.save(cpkt, best_map_weight_path)
            self.best_map = map
        if map50 > self.best_map50:
            torch.save(cpkt, best_map50_weight_path)
            self.best_map50 = map50