def test_centre_of_mass(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img'], pixdim=[2]) self.assertListEqual(list(pairwise_measures.com_ref()), [0.0]) self.assertListEqual(list(pairwise_measures.com_seg()), [1.0]) self.assertEqual(pairwise_measures.com_dist(), 2.)
def test_centre_of_mass(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img'], pixdim=[2]) self.assertListEqual(list(pairwise_measures.com_ref()), [0.0]) self.assertListEqual(list(pairwise_measures.com_seg()), [1.0]) self.assertEqual(pairwise_measures.com_dist(), 2.)
def test_accuracy(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img']) self.assertEqual(pairwise_measures.accuracy(), 3. / 4)
def test_sensitivity(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img']) self.assertEqual(pairwise_measures.sensitivity(), 1.)
def test_n_negative(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img']) self.assertEqual(pairwise_measures.n_neg_ref(), 3.) self.assertEqual(pairwise_measures.n_neg_seg(), 2.)
def test_faulty_inputs(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[3]['seg_img'], ref_img=TEST_CASES[3]['ref_img']) self.assertRaises(ValueError, pairwise_measures.tp)
def test_binary_check_for_probabilities(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[3]['seg_img'], ref_img=TEST_CASES[3]['ref_img']) self.assertRaises(ValueError, pairwise_measures.check_binary)
def test_informedness(self): # true positive rate - false positive rate pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img']) self.assertAlmostEqual(pairwise_measures.informedness(), 2. / 3)
def test_n_negative(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img']) self.assertEqual(pairwise_measures.n_neg_ref(), 3.) self.assertEqual(pairwise_measures.n_neg_seg(), 2.)
def test_true_negative(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img']) self.assertEqual(pairwise_measures.tn(), 2.)
def test_dice_score(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[0]['seg_img'], ref_img=TEST_CASES[0]['ref_img']) self.assertEqual(pairwise_measures.dice_score(), 1.0)
def test_vol_diff(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img'], pixdim=[2]) self.assertEqual(pairwise_measures.vol_diff(), 1.)
def test_markedness(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img']) self.assertEqual(pairwise_measures.markedness(), 1. / 2)
def test_informedness(self): # true positive rate - false positive rate pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img']) self.assertAlmostEqual(pairwise_measures.informedness(), 2. / 3)
def test_intersection(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img']) self.assertEqual(pairwise_measures.n_intersection(), 1.)
def test_jaccard(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img']) self.assertEqual(pairwise_measures.jaccard(), 1. / 2)
def test_sensitivity(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img']) self.assertEqual(pairwise_measures.sensitivity(), 1.)
def test_markedness(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img']) self.assertEqual(pairwise_measures.markedness(), 1. / 2)
def test_specificity(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img']) self.assertEqual(pairwise_measures.specificity(), 2. / 3)
def test_vol_diff(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img'], pixdim=[2]) self.assertEqual(pairwise_measures.vol_diff(), 1.)
def test_accuracy(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img']) self.assertEqual(pairwise_measures.accuracy(), 3. / 4)
def test_dice_score(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[0]['seg_img'], ref_img=TEST_CASES[0]['ref_img']) self.assertEqual(pairwise_measures.dice_score(), 1.0)
def test_false_positive_rate(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img']) self.assertEqual(pairwise_measures.false_positive_rate(), 1. / 3)
def test_true_negative(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img']) self.assertEqual(pairwise_measures.tn(), 2.)
def test_positive_predictive_value(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img']) self.assertEqual(pairwise_measures.positive_predictive_values(), 1. / 2)
def test_intersection(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img']) self.assertEqual(pairwise_measures.n_intersection(), 1.)
def test_false_positive_rate(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img']) self.assertEqual(pairwise_measures.false_positive_rate(), 1. / 3)
def test_specificity(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img']) self.assertEqual(pairwise_measures.specificity(), 2. / 3)
def test_negative_predictive_value(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img']) self.assertEqual(pairwise_measures.negative_predictive_values(), 1.)
def train(dsets, model, criterion, optimizer, num_epochs, device, cp_path, batch_size): since = time.time() dataloaders = { x: DataLoader(dsets[x], batch_size=batch_size, shuffle=True, num_workers=4) for x in ['training', 'validation'] } model = model.to(device) for epoch in range(num_epochs): print('Epoch {}/{}'.format(epoch + 1, num_epochs)) print('-' * 10) # Each epoch has a training and validation phase for phase in ['training', 'validation']: if phase == 'training': model.train() # Set model to training mode else: model.eval() # Set model to evaluate mode running_loss = 0.0 running_corrects = 0.0 epoch_samples = 0 # Iterate over data for iteration, (inputs, labels) in enumerate(dataloaders[phase], 1): nbatches, wsize, nchannels, x, y, z, _ = inputs.size() inputs = inputs.view(nbatches * wsize, nchannels, x, y, z) labels = labels.view(nbatches * wsize, nchannels, x, y, z) inputs = inputs.to(device) labels = labels.to(device) # zero the parameter gradients optimizer.zero_grad() # forward # track history if only in train with torch.set_grad_enabled(phase == 'training'): outputs = model(inputs) pred = (outputs > 0.5) loss = criterion(outputs, labels) # backward + optimize only if in training phase if phase == 'training': loss.backward() optimizer.step() # statistics epoch_samples += inputs.size(0) running_loss += loss.item() * inputs.size(0) measures = PairwiseMeasures(pred.cpu().numpy(), labels.cpu().numpy()) running_corrects += measures.dice_score() * inputs.size(0) epoch_loss = running_loss / epoch_samples epoch_acc = running_corrects / epoch_samples print('{} Loss: {:.4f} Dice: {:.4f}'.format( phase, epoch_loss, epoch_acc)) if epoch == 0: best_loss = epoch_loss torch.save(model.state_dict(), cp_path.format(epoch + 1)) # deep copy the model if phase == 'validation' and epoch_loss < best_loss: best_loss = epoch_loss torch.save(model.state_dict(), cp_path) print('Checkpoint {} saved!'.format(epoch + 1)) print() time_elapsed = time.time() - since print('Training complete in {:.0f}m {:.0f}s'.format( time_elapsed // 60, time_elapsed % 60))
def test_jaccard(self): pairwise_measures = PairwiseMeasures(seg_img=TEST_CASES[1]['seg_img'], ref_img=TEST_CASES[1]['ref_img']) self.assertEqual(pairwise_measures.jaccard(), 1. / 2)