Commit
·
8fb4d8e
1
Parent(s):
fd0e2dc
Implemented NCC loss function
Browse files- .idea/vcs.xml +6 -0
- DeepDeformationMapRegistration/losses.py +23 -0
.idea/vcs.xml
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<project version="4">
|
| 3 |
+
<component name="VcsDirectoryMappings">
|
| 4 |
+
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
| 5 |
+
</component>
|
| 6 |
+
</project>
|
DeepDeformationMapRegistration/losses.py
CHANGED
|
@@ -2,6 +2,7 @@ import tensorflow as tf
|
|
| 2 |
from scipy.ndimage import generate_binary_structure
|
| 3 |
|
| 4 |
from DeepDeformationMapRegistration.utils.operators import soft_threshold
|
|
|
|
| 5 |
|
| 6 |
|
| 7 |
class HausdorffDistanceErosion:
|
|
@@ -46,3 +47,25 @@ class HausdorffDistanceErosion:
|
|
| 46 |
|
| 47 |
return batched_dist
|
| 48 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
from scipy.ndimage import generate_binary_structure
|
| 3 |
|
| 4 |
from DeepDeformationMapRegistration.utils.operators import soft_threshold
|
| 5 |
+
from DeepDeformationMapRegistration.utils.constants import EPS_tf
|
| 6 |
|
| 7 |
|
| 8 |
class HausdorffDistanceErosion:
|
|
|
|
| 47 |
|
| 48 |
return batched_dist
|
| 49 |
|
| 50 |
+
|
| 51 |
+
class NCC:
|
| 52 |
+
def __init__(self, in_shape, eps=EPS_tf):
|
| 53 |
+
self.__shape_size = tf.cast(tf.reduce_prod(in_shape), tf.float32)
|
| 54 |
+
self.__eps = eps
|
| 55 |
+
|
| 56 |
+
def ncc(self, y_true, y_pred):
|
| 57 |
+
f_yt = tf.reshape(y_true, [-1])
|
| 58 |
+
f_yp = tf.reshape(y_pred, [-1])
|
| 59 |
+
mean_yt = tf.reduce_mean(f_yt)
|
| 60 |
+
mean_yp = tf.reduce_mean(f_yp)
|
| 61 |
+
std_yt = tf.math.reduce_std(f_yt)
|
| 62 |
+
std_yp = tf.math.reduce_std(f_yp)
|
| 63 |
+
|
| 64 |
+
n_f_yt = f_yt - mean_yt
|
| 65 |
+
n_f_yp = f_yp - mean_yp
|
| 66 |
+
numerator = tf.reduce_sum(n_f_yt * n_f_yp)
|
| 67 |
+
denominator = std_yt * std_yp * self.__shape_size + self.__eps
|
| 68 |
+
return tf.math.divide_no_nan(numerator, denominator)
|
| 69 |
+
|
| 70 |
+
def loss(self, y_true, y_pred):
|
| 71 |
+
return tf.map_fn(lambda x: 1 - self.ncc(x[0], x[1]), (y_true, y_pred), tf.float32)
|