示例#1
0
    def _G_pred(self, input, now_frame, label, prev_class):
        input_part = input[:, :, :, now_frame:now_frame +
                           self.test_frame, :, :].to(self.device1)
        label_og_part = label[:, now_frame:now_frame + self.test_frame].to(
            self.device1)

        # tensor to numpy and label condition
        label_og_part = tensor2np(label_og_part)
        input_part = tensor2np(input_part)
        input_part, label_part = vid_init_test(label_og_part, prev_class,
                                               input_part)

        # [V, D, H, W, C] -> [N, V, C, D, H, W]
        input_part = np.expand_dims(input_part, axis=0)
        label_part = np.expand_dims(label_part, axis=0)
        label_og_part = np.expand_dims(label_og_part, axis=0)

        # numpy to tensor
        input_part = torch.from_numpy(input_part).to(self.device1)
        label_part = torch.from_numpy(label_part).to(self.device1)
        label_og_part = torch.from_numpy(label_og_part).to(self.device1)

        features = self.extractor(input_part[:, 0, :, :, :, :])
        for i in range(1, args.num_of_vid):
            features = torch.cat(
                (features, self.extractor(input_part[:, 0, :, :, :, :])),
                dim=1)
        predict = self.G(features)

        return predict, label_part, label_og_part
示例#2
0
def valid():
    model.eval()
    avg_psnr, avg_ssim = 0, 0
    for i, batch in enumerate(testing_data_loader):
        lr_tensor, hr_tensor = batch[0], batch[1]
        if args.cuda:
            lr_tensor = lr_tensor.to(device)
            hr_tensor = hr_tensor.to(device)

        with torch.no_grad():
            pre = model(lr_tensor)

        sr_img = utils.tensor2np(pre.detach()[0])
        gt_img = utils.tensor2np(hr_tensor.detach()[0])
        crop_size = args.scale
        cropped_sr_img = utils.shave(sr_img, crop_size)
        cropped_gt_img = utils.shave(gt_img, crop_size)
        if args.isY is True:
            im_label = utils.quantize(sc.rgb2ycbcr(cropped_gt_img)[:, :, 0])
            im_pre = utils.quantize(sc.rgb2ycbcr(cropped_sr_img)[:, :, 0])
        else:
            im_label = cropped_gt_img
            im_pre = cropped_sr_img

        psnr = utils.compute_psnr(im_pre, im_label)
        ssim = utils.compute_ssim(im_pre, im_label)

        avg_psnr += psnr
        avg_ssim += ssim
        print(
            f" Valid {i}/{len(testing_data_loader)} with PSNR = {psnr} and SSIM = {ssim}"
        )
    print("===> Valid. psnr: {:.4f}, ssim: {:.4f}".format(
        avg_psnr / len(testing_data_loader),
        avg_ssim / len(testing_data_loader)))
示例#3
0
    def _pred_label(self, og_label, changed_label, predict, k, predict_label,
                    i):
        pred = predict[:, i, :]
        _, pred = torch.max(pred.data, 1)
        frame_num = k * self.test_frame + i

        pred = tensor2np(pred)
        ch_la = tensor2np(changed_label)
        og_la = tensor2np(og_label)

        # return
        pred = vid_init_return(og_la, ch_la, pred)
        pred = [frame_num, pred]
        predict_label.append(pred)
def train(model, device, trainloader, optimizer, loss_function):
    model.train()
    running_loss = 0
    mask_list, iou = [], []
    for i, (input, mask) in enumerate(trainloader):
        # load data into cuda
        input, mask = input.to(device,
                               dtype=torch.float), mask.to(device,
                                                           dtype=torch.float)

        # forward
        predict = model(input)
        loss = loss_function(predict, mask)

        # metric
        iou.append(get_iou_score(predict, mask).mean())
        running_loss += (loss.item())

        # zero the gradient + backprpagation + step
        optimizer.zero_grad()

        loss.backward()
        optimizer.step()

        # log the first image of the batch
        if ((i + 1) % 20) == 0 and not args.tuning:
            rand = np.random.randint(0, 6000)
            img, pred, mak = tensor2np(input[1]), tensor2np(
                predict[1]), tensor2np(mask[1])
            savenp2Img(SAVE_PATH + f'image_{rand}.jpg', img)
            savenp2Img(SAVE_PATH + f'prediction_{rand}.jpg', pred)
            savenp2Img(SAVE_PATH + f'mask_{rand}.jpg', mak)
            mask_list.extend([
                wandb.Image(SAVE_PATH + f'image_{rand}.jpg'),
                wandb.Image(SAVE_PATH + f'mask_{rand}.jpg'),
                wandb.Image(SAVE_PATH + f'prediction_{rand}.jpg'),
            ])

    mean_iou = np.mean(iou)
    total_loss = running_loss / len(trainloader)
    if not args.tuning:
        wandb.log({
            'Train loss': total_loss,
            'Train IoU': mean_iou,
            'Train prediction': mask_list
        })
    else:
        wandb.log({'Train loss': total_loss, 'Train IoU': mean_iou})

    return total_loss, mean_iou
def test(model, device, testloader, loss_function, best_iou):
    model.eval()
    running_loss = 0
    mask_list, iou = [], []
    with torch.no_grad():
        for i, (input, mask) in enumerate(testloader):
            input, mask = input.to(device, dtype=torch.float), mask.to(
                device, dtype=torch.float)

            predict = model(input)
            loss = loss_function(predict, mask)

            running_loss += loss.item()
            iou.append(get_iou_score(predict, mask).mean())

            # log the first image of the batch
            if ((i + 1) % 10) == 0 and not args.tuning:
                rand = np.random.randint(0, 6000)
                img, pred, mak = tensor2np(input[1]), tensor2np(
                    predict[1]), tensor2np(mask[1])
                savenp2Img(SAVE_PATH + f'image_{rand}.jpg', img)
                savenp2Img(SAVE_PATH + f'prediction_{rand}.jpg', pred)
                savenp2Img(SAVE_PATH + f'mask_{rand}.jpg', mak)
                mask_list.extend([
                    wandb.Image(SAVE_PATH + f'image_{rand}.jpg'),
                    wandb.Image(SAVE_PATH + f'mask_{rand}.jpg'),
                    wandb.Image(SAVE_PATH + f'prediction_{rand}.jpg'),
                ])

    test_loss = running_loss / len(testloader)
    mean_iou = np.mean(iou)
    if not args.tuning:
        wandb.log({
            'Valid loss': test_loss,
            'Valid IoU': mean_iou,
            'Prediction': mask_list
        })
    else:
        wandb.log({'Valid loss': test_loss, 'Valid IoU': mean_iou})

    if mean_iou > best_iou:
        # export to onnx + pt
        try:
            torch.onnx.export(model, input, SAVE_PATH + RUN_NAME + '.onnx')
            torch.save(model.state_dict(), SAVE_PATH + RUN_NAME + '.pth')
        except:
            print('Can export weights')

    return test_loss, mean_iou
示例#6
0
def sr_process(model):

    # im_l = cv2.imread(imname, cv2.IMREAD_COLOR)[:, :, [2, 1, 0]]  # BGR to RGB

    while (True):
        image = frame_queue.get()

        start = time.time() * 1000
        im_l = image[:, :, [2, 1, 0]]

        im_input = im_l / 255.0
        im_input = np.transpose(im_input, (2, 0, 1))
        im_input = im_input[np.newaxis, ...]
        im_input = torch.from_numpy(im_input).float()

        if cuda:
            im_input = im_input.to(device)

        print(f"time cost 01 = {time.time()*1000-start} ms")
        # with torch.no_grad():

        out = model(im_input)
        torch.cuda.synchronize()
        print(f"time cost 02 = {time.time()*1000-start} ms")

        out_img = utils.tensor2np(out.detach()[0])
        print(f"time cost 03 = {time.time()*1000-start} ms")
示例#7
0
    def test(self):
        with torch.no_grad():
            # predict label for saving csv file
            for iter, batch in enumerate(self.test_data, 1):
                # for save predicted label
                predict_label = []

                input, label = batch[0].to(self.device0), batch[1].to(
                    self.device0)
                vid_total_frame = label.shape[1]
                total_iter = int(vid_total_frame / self.test_frame)
                total_frame = int(label.shape[1] / self.test_frame)
                last_iter_start = int(vid_total_frame - self.test_frame)
                print('video total frames : ', vid_total_frame)

                # start video condition
                prev_class = self._start_vid(iter)
                for k in range(total_frame):
                    if k != 0:
                        prev_class = np.array(predict_label)[-1, 1]

                    now_frame = k * self.test_frame
                    predict, label_part, label_og_part = \
                        self._G_pred(input, now_frame, label, prev_class)

                    for i in range(self.test_frame):
                        self._pred_label(label_og_part, label_part, predict, k,
                                         predict_label, i)

                # last iteration
                prev_class = np.array(predict_label)[-1, 1]
                now_frame = last_iter_start

                predict, label_part, label_og_part = \
                    self._G_pred(input, now_frame, label, prev_class)

                # append additional predict label
                for i in range(self.test_frame):
                    frame_num = now_frame + i
                    if frame_num < total_iter * self.test_frame:
                        pass
                    else:
                        self._pred_label(label_og_part, label_part, predict, k,
                                         predict_label, i)

                # calculate accuracy
                predict_label = np.array(predict_label)
                label = tensor2np(label)
                print("accuracy : ", self._cal_accuracy(label, predict_label))

                # sequnetial processing
                sequential_predict_label = self._sequential_process(
                    np.array(predict_label), 2)
                sequential_predict_label = self._sequential_process(
                    np.array(sequential_predict_label), 1)
                # save results video
                self.save_pred_label(sequential_predict_label, iter)
                # clear gpu
                torch.cuda.empty_cache()
def process(image):

    im_l = image[:, :, [2, 1, 0]]  # BGR to RGB
    # im_l = sio.imread(opt.test_lr_folder + '/' + imname.split('/')[-1])  # RGB
    im_input = im_l / 255.0
    im_input = np.transpose(im_input, (2, 0, 1))
    im_input = im_input[np.newaxis, ...]
    im_input = torch.from_numpy(im_input).float()

    if cuda:
#         print("use cuda!!!")
        im_input = im_input.to(device)

    with torch.no_grad():
        start = time.time()*1000
        out = model(im_input)
        torch.cuda.synchronize()
#         time_cost = time.time()*1000 - start
#         print(f"time cost = {time_cost} ms")

    out_img = utils.tensor2np(out.detach()[0])
    print(f"time cost = {time.time()*1000 - start} ms")
    return out_img[:, :, [2, 1, 0]]
示例#9
0
def process(imname, model):

    im_l = cv2.imread(imname, cv2.IMREAD_COLOR)[:, :, [2, 1, 0]]  # BGR to RGB
    # im_l = sio.imread(opt.test_lr_folder + '/' + imname.split('/')[-1])  # RGB
    im_input = im_l / 255.0
    im_input = np.transpose(im_input, (2, 0, 1))
    im_input = im_input[np.newaxis, ...]
    im_input = torch.from_numpy(im_input).float()

    if cuda:
        print("use cuda!!!")
        im_input = im_input.to(device)

    with torch.no_grad():
        start = time.time() * 1000
        out = model(im_input)
        torch.cuda.synchronize()
        time_cost = time.time() * 1000 - start
        print(f"time cost = {time_cost} ms")

    out_img = utils.tensor2np(out.detach()[0])
    crop_size = upscale_factor
    cropped_sr_img = utils.shave(out_img, crop_size)
示例#10
0
    im_input = np.transpose(im_input, (2, 0, 1))
    im_input = im_input[np.newaxis, ...]
    im_input = torch.from_numpy(im_input).float()

    if cuda:
        model = model.to(device)
        im_input = im_input.to(device)

    with torch.no_grad():
        start.record()
        out = model(im_input)
        end.record()
        torch.cuda.synchronize()
        time_list[i] = start.elapsed_time(end)  # milliseconds

    out_img = utils.tensor2np(out.detach()[0])
    crop_size = opt.upscale_factor
    cropped_sr_img = utils.shave(out_img, crop_size)
    cropped_gt_img = utils.shave(im_gt, crop_size)
    if opt.is_y is True:
        im_label = utils.quantize(sc.rgb2ycbcr(cropped_gt_img)[:, :, 0])
        im_pre = utils.quantize(sc.rgb2ycbcr(cropped_sr_img)[:, :, 0])
    else:
        im_label = cropped_gt_img
        im_pre = cropped_sr_img
    psnr_list[i] = utils.compute_psnr(im_pre, im_label)
    ssim_list[i] = utils.compute_ssim(im_pre, im_label)

    output_folder = os.path.join(
        opt.output_folder,
        imname.split('/')[-1].split('.')[0] + 'x' + str(opt.upscale_factor) +
示例#11
0
model.eval()

avg_psnr, avg_ssim = 0, 0
start = time.time()


for _,batch in enumerate(testing_data_loader):
    lr_tensor, hr_tensor = batch[0], batch[1]
    if 1:
        lr_tensor = lr_tensor.to(device)
        hr_tensor = hr_tensor.to(device)

    with torch.no_grad():
        pre = model(lr_tensor)

    sr_img = utils.tensor2np(pre.detach()[0])
    gt_img = utils.tensor2np(hr_tensor.detach()[0])
    crop_size = 2
    cropped_sr_img = utils.shave(sr_img, crop_size)
    cropped_gt_img = utils.shave(gt_img, crop_size)

    im_label = utils.quantize(sc.rgb2ycbcr(cropped_gt_img)[:, :, 0])
    im_pre = utils.quantize(sc.rgb2ycbcr(cropped_sr_img)[:, :, 0])

    img_save=sr_img.transpose(2,0,1)

    cv2.imwrite(os.path.join("./results/",str(_)+".png"),img_save)

    avg_psnr += utils.compute_psnr(im_pre, im_label)
    avg_ssim += utils.compute_ssim(im_pre, im_label)
示例#12
0
    def test(self):
        with torch.no_grad():
            # predict label for saving csv file
            for iter, batch in enumerate(self.test_data, 1):
                # for save predicted label
                predict_label = []

                input, label = batch[0].to(self.device0), batch[1].to(
                    self.device0)
                vid_total_frame = label.shape[1]
                print('video total frames : ', vid_total_frame)

                total_iter = int(vid_total_frame / self.test_frame)
                total_frame = int(label.shape[1] / self.test_frame)
                last_iter_start = int(vid_total_frame - self.test_frame)

                for k in range(total_frame):
                    now_frame = k * self.test_frame
                    input_part = input[:, :, :, now_frame:now_frame +
                                       self.test_frame, :, :].to(self.device1)
                    label_og_part = label[:, now_frame:now_frame +
                                          self.test_frame].to(self.device1)

                    if k == 0 and iter == 1:
                        prev_class = 0
                    elif k == 0 and iter == 2:
                        prev_class = 6
                    elif k == 0 and iter == 3:
                        prev_class = 1
                    elif k == 0 and iter == 4:
                        prev_class = 2
                    else:
                        prev_class = np.array(predict_label)[-1, 1]

                    # tensor에서 numpy로 변환
                    label_og_part = tensor2np(label_og_part)
                    input_part = tensor2np(input_part)
                    input_part, label_part = vid_init_test(
                        label_og_part, prev_class, input_part)

                    # [V, D, H, W, C] -> [N, V, C, D, H, W]
                    input_part = np.expand_dims(input_part, axis=0)
                    label_part = np.expand_dims(label_part, axis=0)
                    label_og_part = np.expand_dims(label_og_part, axis=0)

                    # numpy에서 tesnor 변환
                    input_part = torch.from_numpy(input_part).to(self.device1)
                    label_part = torch.from_numpy(label_part).to(self.device1)
                    label_og_part = torch.from_numpy(label_og_part).to(
                        self.device1)

                    features = self.extractor(input_part[:, 0, :, :, :, :])
                    for i in range(1, args.num_of_vid):
                        features = torch.cat(
                            (features,
                             self.extractor(input_part[:, 0, :, :, :, :])),
                            dim=1)
                    predict = self.G(features)
                    for i in range(self.test_frame):
                        self._pred_label(label_og_part, label_part, predict, k,
                                         predict_label, i)

                # last iteration
                now_frame = last_iter_start
                input_part = input[:, :, :, now_frame:now_frame +
                                   self.test_frame, :, :].to(self.device1)
                label_og_part = label[:, now_frame:now_frame +
                                      self.test_frame].to(self.device1)

                # vid init을 해줘서 label_og와 label을 구분
                if k == 0:
                    prev_class = 0
                else:
                    prev_class = np.array(predict_label)[-1, 1]

                # tensor에서 numpy로 변환
                label_og_part = tensor2np(label_og_part)
                input_part = tensor2np(input_part)
                input_part, label_part = vid_init_test(label_og_part,
                                                       prev_class, input_part)

                # [V, D, H, W, C] -> [N, V, C, D, H, W]
                input_part = np.expand_dims(input_part, axis=0)
                label_part = np.expand_dims(label_part, axis=0)
                label_og_part = np.expand_dims(label_og_part, axis=0)

                # numpy에서 tesnor 변환
                input_part = torch.from_numpy(input_part).to(self.device1)
                label_part = torch.from_numpy(label_part).to(self.device1)
                label_og_part = torch.from_numpy(label_og_part).to(
                    self.device1)

                features = self.extractor(input_part[:, 0, :, :, :, :])
                for i in range(1, args.num_of_vid):
                    features = torch.cat(
                        (features, self.extractor(input_part[:,
                                                             0, :, :, :, :])),
                        dim=1)
                predict = self.G(features)

                # add predict label
                for i in range(self.test_frame):
                    frame_num = now_frame + i
                    if frame_num < total_iter * self.test_frame:
                        pass
                    else:
                        self._pred_label(label_og_part, label_part, predict, k,
                                         predict_label, i)

                # sequnetial processing
                sequential_predict_label = self.sequential_process(
                    np.array(predict_label), 2)
                sequential_predict_label = self.sequential_process(
                    np.array(sequential_predict_label), 1)
                # save results video
                self.save_pred_label(sequential_predict_label, iter)
                # clear gpu
                torch.cuda.empty_cache()