def sample(self, iter_time):
        if np.mod(iter_time, self.flags.sample_freq) == 0:
            idx = np.random.choice(self.dataset.num_val, 2, replace=False)
            x_imgs, y_imgs = self.dataset.val_imgs[
                idx], self.dataset.val_vessels[idx]
            samples = self.model.sample_imgs(x_imgs)

            # masking
            seg_samples = utils.remain_in_mask(samples,
                                               self.dataset.val_masks[idx])

            # crop to original image shape
            x_imgs_ = utils.crop_to_original(x_imgs, self.dataset.ori_shape)
            seg_samples_ = utils.crop_to_original(seg_samples,
                                                  self.dataset.ori_shape)
            y_imgs_ = utils.crop_to_original(y_imgs, self.dataset.ori_shape)

            # sampling
            self.plot(x_imgs_,
                      seg_samples_,
                      y_imgs_,
                      iter_time,
                      idx=idx,
                      save_file=self.sample_out_dir,
                      phase='train')
    def eval(self, iter_time=0, phase='train'):
        total_time, auc_sum = 0., 0.
        if np.mod(iter_time, self.flags.eval_freq) == 0:
            num_data, imgs, vessels, masks = None, None, None, None
            if phase == 'train':
                num_data = self.dataset.num_val
                imgs = self.dataset.val_imgs
                vessels = self.dataset.val_vessels
                masks = self.dataset.val_masks
            elif phase == 'test':
                num_data = self.dataset.num_test
                imgs = self.dataset.test_imgs
                vessels = self.dataset.test_vessels
                masks = self.dataset.test_masks

            generated = []
            for iter_ in range(num_data):
                x_img = imgs[iter_]
                x_img = np.expand_dims(x_img,
                                       axis=0)  # (H, W, C) to (1, H, W, C)

                # measure inference time
                start_time = time.time()
                generated_vessel = self.model.sample_imgs(x_img)
                total_time += (time.time() - start_time)

                generated.append(np.squeeze(
                    generated_vessel, axis=(0, 3)))  # (1, H, W, 1) to (H, W)

            generated = np.asarray(generated)
            # calculate measurements
            auc_sum = self.measure(generated, vessels, masks, num_data,
                                   iter_time, phase, total_time)

            if phase == 'test':
                # save test images
                segmented_vessel = utils.remain_in_mask(generated, masks)

                # crop to original image shape
                imgs_ = utils.crop_to_original(imgs, self.dataset.ori_shape)
                cropped_vessel = utils.crop_to_original(
                    segmented_vessel, self.dataset.ori_shape)
                vessels_ = utils.crop_to_original(vessels,
                                                  self.dataset.ori_shape)

                for idx in range(num_data):
                    self.plot(np.expand_dims(imgs_[idx], axis=0),
                              np.expand_dims(cropped_vessel[idx], axis=0),
                              np.expand_dims(vessels_[idx], axis=0),
                              'test',
                              idx=[idx],
                              save_file=self.img_out_dir,
                              phase='test')

        return auc_sum
示例#3
0
    # iterate all images
    img_size = (640, 640) if dataset == "DRIVE" else (720, 720)
    ori_shape = (1, 584, 565) if dataset == "DRIVE" else (1, 605,
                                                          700)  # batchsize=1
    fundus_files = utils.all_files_under(fundus_dir.format(dataset))
    mask_files = utils.all_files_under(mask_dir.format(dataset))
    for index, fundus_file in enumerate(fundus_files):
        print("processing {}...".format(fundus_file))
        # load imgs
        img = utils.imagefiles2arrs([fundus_file])
        mask = utils.imagefiles2arrs([mask_files[index]])

        # z score with mean, std (batchsize=1)
        mean = np.mean(img[0, ...][mask[0, ...] == 255.0], axis=0)
        std = np.std(img[0, ...][mask[0, ...] == 255.0], axis=0)
        img[0, ...] = (img[0, ...] - mean) / std

        # run inference
        padded_img = utils.pad_imgs(img, img_size)
        #padded_img=utils.rescale_imgs(img, img_size)
        vessel_img = model.predict(padded_img, batch_size=1) * 255
        # rescaled_vessel = utils.rescale_to_original(vessel_img[...,0], ori_shape)
        # final_result = utils.remain_in_mask(rescaled_vessel[0,...], mask[0,...])
        cropped_vessel = utils.crop_to_original(vessel_img[..., 0], ori_shape)
        final_result = utils.remain_in_mask(cropped_vessel[0, ...], mask[0,
                                                                         ...])
        png_file = os.path.splitext(fundus_file)[0] + '.png'
        Image.fromarray(final_result.astype(np.uint8)).save(
            os.path.join(out_dir.format(dataset), os.path.basename(png_file)))
示例#4
0
        # G
        gan_x_test, gan_y_test=utils.input2gan(val_imgs, val_vessels, d_out_shape)
        loss,acc=gan.evaluate(gan_x_test,gan_y_test, batch_size=batch_size, verbose=0)
        utils.print_metrics(n_round+1, acc=acc, loss=loss, type='GAN')
        
        # save the weights
        g.save_weights(os.path.join(model_out_dir,"g_{}_{}_{}.h5".format(n_round,FLAGS.discriminator,FLAGS.ratio_gan2seg)))
       
    # update step sizes, learning rates
    scheduler.update_steps(n_round)
    K.set_value(d.optimizer.lr, scheduler.get_lr())    
    K.set_value(gan.optimizer.lr, scheduler.get_lr())    
    
    # evaluate on test images
    if n_round in rounds_for_evaluation:    
        generated=g.predict(test_imgs,batch_size=batch_size)
        generated=np.squeeze(generated, axis=3)
        vessels_in_mask, generated_in_mask = utils.pixel_values_in_mask(test_vessels, generated , test_masks)
        auc_roc=utils.AUC_ROC(vessels_in_mask,generated_in_mask,os.path.join(auc_out_dir,"auc_roc_{}.npy".format(n_round)))
        auc_pr=utils.AUC_PR(vessels_in_mask, generated_in_mask,os.path.join(auc_out_dir,"auc_pr_{}.npy".format(n_round)))
        binarys_in_mask=utils.threshold_by_otsu(generated,test_masks)
        dice_coeff=utils.dice_coefficient_in_train(vessels_in_mask, binarys_in_mask)
        acc, sensitivity, specificity=utils.misc_measures(vessels_in_mask, binarys_in_mask)
        utils.print_metrics(n_round+1, auc_pr=auc_pr, auc_roc=auc_roc, dice_coeff=dice_coeff, 
                            acc=acc, senstivity=sensitivity, specificity=specificity, type='TESTING')
         
        # print test images
        segmented_vessel=utils.remain_in_mask(generated, test_masks)
        for index in range(segmented_vessel.shape[0]):
            Image.fromarray((segmented_vessel[index,:,:]*255).astype(np.uint8)).save(os.path.join(img_out_dir,str(n_round)+"_{:02}_segmented.png".format(index+1)))