refactored to PEP8
Browse files- .github/workflows/build.yml +0 -4
- livermask/livermask.py +2 -1
- livermask/utils/process.py +30 -23
- livermask/utils/unet3d.py +16 -22
- livermask/utils/utils.py +2 -5
- livermask/utils/yaml_utils.py +1 -6
.github/workflows/build.yml
CHANGED
@@ -88,10 +88,6 @@ jobs:
|
|
88 |
|
89 |
- name: Install wheel
|
90 |
run: |
|
91 |
-
python -V
|
92 |
-
python3 -V
|
93 |
-
pip -V
|
94 |
-
pip3 -V
|
95 |
pip3 install --find-links=${{github.workspace}} livermask
|
96 |
|
97 |
- name: Download test sample
|
|
|
88 |
|
89 |
- name: Install wheel
|
90 |
run: |
|
|
|
|
|
|
|
|
|
91 |
pip3 install --find-links=${{github.workspace}} livermask
|
92 |
|
93 |
- name: Download test sample
|
livermask/livermask.py
CHANGED
@@ -1,5 +1,6 @@
|
|
1 |
import numpy as np
|
2 |
-
import os
|
|
|
3 |
from tqdm import tqdm
|
4 |
import nibabel as nib
|
5 |
from nibabel.processing import resample_to_output, resample_from_to
|
|
|
1 |
import numpy as np
|
2 |
+
import os
|
3 |
+
import sys
|
4 |
from tqdm import tqdm
|
5 |
import nibabel as nib
|
6 |
from nibabel.processing import resample_to_output, resample_from_to
|
livermask/utils/process.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
import numpy as np
|
2 |
import os, sys
|
3 |
-
from tqdm import tqdm
|
4 |
import nibabel as nib
|
5 |
from nibabel.processing import resample_to_output, resample_from_to
|
6 |
from scipy.ndimage import zoom
|
@@ -41,7 +41,7 @@ def liver_segmenter_wrapper(curr, output, cpu, verbose, multiple_flag, name):
|
|
41 |
# run inference in a different process
|
42 |
mp.set_start_method('spawn', force=True)
|
43 |
with mp.Pool(processes=1, maxtasksperchild=1) as p: # , initializer=initializer)
|
44 |
-
result = p.map_async(liver_segmenter, ((curr, output, cpu, verbose, multiple_flag, name),
|
45 |
log.info("getting result from process...")
|
46 |
ret = result.get()[0]
|
47 |
return ret
|
@@ -67,7 +67,7 @@ def liver_segmenter(params):
|
|
67 |
data = zoom(data, [img_size / data.shape[0], img_size / data.shape[1], 1.0], order=1)
|
68 |
|
69 |
# intensity normalization
|
70 |
-
intensity_clipping_range = [-150, 250]
|
71 |
data = intensity_normalization(volume=data, intensity_clipping_range=intensity_clipping_range)
|
72 |
|
73 |
# fix orientation
|
@@ -78,8 +78,10 @@ def liver_segmenter(params):
|
|
78 |
# predict on data
|
79 |
pred = np.zeros_like(data).astype(np.float32)
|
80 |
for i in tqdm(range(data.shape[-1]), "pred: ", disable=not verbose):
|
81 |
-
pred[..., i] =
|
82 |
-
|
|
|
|
|
83 |
|
84 |
# threshold
|
85 |
pred = (pred >= 0.4).astype(int)
|
@@ -123,7 +125,7 @@ def liver_segmenter(params):
|
|
123 |
if multiple_flag:
|
124 |
nib.save(resampled_lab, output + "/" + curr.split("/")[-1].split(".")[0] + "-livermask.nii")
|
125 |
else:
|
126 |
-
nib.save(resampled_lab, output
|
127 |
|
128 |
return pred
|
129 |
except KeyboardInterrupt:
|
@@ -131,7 +133,6 @@ def liver_segmenter(params):
|
|
131 |
|
132 |
|
133 |
def vessel_segmenter(curr, output, cpu, verbose, multiple_flag, liver_mask, name_vessel):
|
134 |
-
|
135 |
# check if cupy is available, if not, set cpu=True
|
136 |
try:
|
137 |
import cupy
|
@@ -150,7 +151,7 @@ def vessel_segmenter(curr, output, cpu, verbose, multiple_flag, liver_mask, name
|
|
150 |
nib_volume = nib.load(curr)
|
151 |
new_spacing = [1., 1., 1.]
|
152 |
resampled_volume = resample_to_output(nib_volume, new_spacing, order=1)
|
153 |
-
#resampled_volume = nib_volume
|
154 |
org = resampled_volume.get_data().astype('float32')
|
155 |
|
156 |
# HU clipping
|
@@ -159,10 +160,10 @@ def vessel_segmenter(curr, output, cpu, verbose, multiple_flag, liver_mask, name
|
|
159 |
org[org > intensity_clipping_range[1]] = intensity_clipping_range[1]
|
160 |
|
161 |
# Calculate maximum of number of patch at each side
|
162 |
-
ze,ye,xe = org.shape
|
163 |
-
xm = int(math.ceil((float(xe)/float(config.patch['patchside']))))
|
164 |
-
ym = int(math.ceil((float(ye)/float(config.patch['patchside']))))
|
165 |
-
zm = int(math.ceil((float(ze)/float(config.patch['patchside']))))
|
166 |
|
167 |
margin = ((0, config.patch['patchside']),
|
168 |
(0, config.patch['patchside']),
|
@@ -171,8 +172,10 @@ def vessel_segmenter(curr, output, cpu, verbose, multiple_flag, liver_mask, name
|
|
171 |
org = chainer.Variable(xp.array(org[np.newaxis, np.newaxis, :], dtype=xp.float32))
|
172 |
|
173 |
# init prediction array
|
174 |
-
prediction_map = np.zeros(
|
175 |
-
|
|
|
|
|
176 |
|
177 |
log.info("predicting...")
|
178 |
# Patch loop
|
@@ -182,34 +185,38 @@ def vessel_segmenter(curr, output, cpu, verbose, multiple_flag, liver_mask, name
|
|
182 |
zi = int(s / (ym * xm)) * config.patch['patchside']
|
183 |
|
184 |
# check if current region contains any liver mask, if not, skip
|
185 |
-
parenchyma_patch = liver_mask[zi:zi + config.patch['patchside'], yi:yi + config.patch['patchside'],
|
186 |
-
|
|
|
187 |
if np.mean(parenchyma_patch) < 0.25:
|
188 |
continue
|
189 |
|
190 |
# Extract patch from original image
|
191 |
-
patch = org[:, :, zi:zi + config.patch['patchside'], yi:yi + config.patch['patchside'],
|
|
|
192 |
with chainer.using_config('train', False), chainer.using_config('enable_backprop', False):
|
193 |
probability_patch = unet(patch)
|
194 |
|
195 |
# Generate probability map
|
196 |
probability_patch = probability_patch.data
|
197 |
-
#if args.gpu >= 0:
|
198 |
if not cpu:
|
199 |
probability_patch = chainer.cuda.to_cpu(probability_patch)
|
200 |
for ch in range(probability_patch.shape[1]):
|
201 |
-
probability_map[ch, zi:zi + config.patch['patchside'],yi:yi + config.patch['patchside'],
|
|
|
202 |
|
203 |
prediction_patch = np.argmax(probability_patch, axis=1)
|
204 |
|
205 |
-
prediction_map[zi:zi + config.patch['patchside'], yi:yi + config.patch['patchside'],
|
|
|
206 |
|
207 |
-
probability_map = probability_map[:, :ze, :ye, :xe]
|
208 |
prediction_map = prediction_map[:ze, :ye, :xe]
|
209 |
|
210 |
# post-process prediction
|
211 |
-
#prediction_map = prediction_map + liver_mask
|
212 |
-
#prediction_map[prediction_map > 0] = 1
|
213 |
|
214 |
# filter segmented vessels outside the predicted liver parenchyma
|
215 |
pred = prediction_map.astype(np.uint8)
|
|
|
1 |
import numpy as np
|
2 |
import os, sys
|
3 |
+
from tqdm import tqdm
|
4 |
import nibabel as nib
|
5 |
from nibabel.processing import resample_to_output, resample_from_to
|
6 |
from scipy.ndimage import zoom
|
|
|
41 |
# run inference in a different process
|
42 |
mp.set_start_method('spawn', force=True)
|
43 |
with mp.Pool(processes=1, maxtasksperchild=1) as p: # , initializer=initializer)
|
44 |
+
result = p.map_async(liver_segmenter, ((curr, output, cpu, verbose, multiple_flag, name),))
|
45 |
log.info("getting result from process...")
|
46 |
ret = result.get()[0]
|
47 |
return ret
|
|
|
67 |
data = zoom(data, [img_size / data.shape[0], img_size / data.shape[1], 1.0], order=1)
|
68 |
|
69 |
# intensity normalization
|
70 |
+
intensity_clipping_range = [-150, 250] # HU clipping limits (Pravdaray's configs)
|
71 |
data = intensity_normalization(volume=data, intensity_clipping_range=intensity_clipping_range)
|
72 |
|
73 |
# fix orientation
|
|
|
78 |
# predict on data
|
79 |
pred = np.zeros_like(data).astype(np.float32)
|
80 |
for i in tqdm(range(data.shape[-1]), "pred: ", disable=not verbose):
|
81 |
+
pred[..., i] = \
|
82 |
+
model.predict(np.expand_dims(np.expand_dims(np.expand_dims(data[..., i], axis=0), axis=-1), axis=0))[
|
83 |
+
0, ..., 1]
|
84 |
+
del data
|
85 |
|
86 |
# threshold
|
87 |
pred = (pred >= 0.4).astype(int)
|
|
|
125 |
if multiple_flag:
|
126 |
nib.save(resampled_lab, output + "/" + curr.split("/")[-1].split(".")[0] + "-livermask.nii")
|
127 |
else:
|
128 |
+
nib.save(resampled_lab, output + "-livermask.nii")
|
129 |
|
130 |
return pred
|
131 |
except KeyboardInterrupt:
|
|
|
133 |
|
134 |
|
135 |
def vessel_segmenter(curr, output, cpu, verbose, multiple_flag, liver_mask, name_vessel):
|
|
|
136 |
# check if cupy is available, if not, set cpu=True
|
137 |
try:
|
138 |
import cupy
|
|
|
151 |
nib_volume = nib.load(curr)
|
152 |
new_spacing = [1., 1., 1.]
|
153 |
resampled_volume = resample_to_output(nib_volume, new_spacing, order=1)
|
154 |
+
# resampled_volume = nib_volume
|
155 |
org = resampled_volume.get_data().astype('float32')
|
156 |
|
157 |
# HU clipping
|
|
|
160 |
org[org > intensity_clipping_range[1]] = intensity_clipping_range[1]
|
161 |
|
162 |
# Calculate maximum of number of patch at each side
|
163 |
+
ze, ye, xe = org.shape
|
164 |
+
xm = int(math.ceil((float(xe) / float(config.patch['patchside']))))
|
165 |
+
ym = int(math.ceil((float(ye) / float(config.patch['patchside']))))
|
166 |
+
zm = int(math.ceil((float(ze) / float(config.patch['patchside']))))
|
167 |
|
168 |
margin = ((0, config.patch['patchside']),
|
169 |
(0, config.patch['patchside']),
|
|
|
172 |
org = chainer.Variable(xp.array(org[np.newaxis, np.newaxis, :], dtype=xp.float32))
|
173 |
|
174 |
# init prediction array
|
175 |
+
prediction_map = np.zeros(
|
176 |
+
(ze + config.patch['patchside'], ye + config.patch['patchside'], xe + config.patch['patchside']))
|
177 |
+
probability_map = np.zeros((config.unet['number_of_label'], ze + config.patch['patchside'],
|
178 |
+
ye + config.patch['patchside'], xe + config.patch['patchside']))
|
179 |
|
180 |
log.info("predicting...")
|
181 |
# Patch loop
|
|
|
185 |
zi = int(s / (ym * xm)) * config.patch['patchside']
|
186 |
|
187 |
# check if current region contains any liver mask, if not, skip
|
188 |
+
parenchyma_patch = liver_mask[zi:zi + config.patch['patchside'], yi:yi + config.patch['patchside'],
|
189 |
+
xi:xi + config.patch['patchside']]
|
190 |
+
# if np.count_nonzero(parenchyma_patch) == 0:
|
191 |
if np.mean(parenchyma_patch) < 0.25:
|
192 |
continue
|
193 |
|
194 |
# Extract patch from original image
|
195 |
+
patch = org[:, :, zi:zi + config.patch['patchside'], yi:yi + config.patch['patchside'],
|
196 |
+
xi:xi + config.patch['patchside']]
|
197 |
with chainer.using_config('train', False), chainer.using_config('enable_backprop', False):
|
198 |
probability_patch = unet(patch)
|
199 |
|
200 |
# Generate probability map
|
201 |
probability_patch = probability_patch.data
|
202 |
+
# if args.gpu >= 0:
|
203 |
if not cpu:
|
204 |
probability_patch = chainer.cuda.to_cpu(probability_patch)
|
205 |
for ch in range(probability_patch.shape[1]):
|
206 |
+
probability_map[ch, zi:zi + config.patch['patchside'], yi:yi + config.patch['patchside'],
|
207 |
+
xi:xi + config.patch['patchside']] = probability_patch[0, ch, :, :, :]
|
208 |
|
209 |
prediction_patch = np.argmax(probability_patch, axis=1)
|
210 |
|
211 |
+
prediction_map[zi:zi + config.patch['patchside'], yi:yi + config.patch['patchside'],
|
212 |
+
xi:xi + config.patch['patchside']] = prediction_patch[0, :, :, :]
|
213 |
|
214 |
+
# probability_map = probability_map[:, :ze, :ye, :xe]
|
215 |
prediction_map = prediction_map[:ze, :ye, :xe]
|
216 |
|
217 |
# post-process prediction
|
218 |
+
# prediction_map = prediction_map + liver_mask
|
219 |
+
# prediction_map[prediction_map > 0] = 1
|
220 |
|
221 |
# filter segmented vessels outside the predicted liver parenchyma
|
222 |
pred = prediction_map.astype(np.uint8)
|
livermask/utils/unet3d.py
CHANGED
@@ -1,23 +1,17 @@
|
|
1 |
-
#coding:utf-8
|
2 |
-
'''
|
3 |
-
* @auther mygw
|
4 |
-
* @date 2018-6-15
|
5 |
-
'''
|
6 |
-
|
7 |
import chainer
|
8 |
import chainer.functions as F
|
9 |
import chainer.links as L
|
10 |
|
11 |
-
class UNet3D(chainer.Chain):
|
12 |
|
|
|
13 |
def __init__(self, num_of_label):
|
14 |
w = chainer.initializers.HeNormal()
|
15 |
super(UNet3D, self).__init__()
|
16 |
with self.init_scope():
|
17 |
# encoder pass
|
18 |
-
self.ce0 = L.ConvolutionND(ndim=3, in_channels=1, out_channels=16, ksize=3, pad=1,initialW=w)
|
19 |
self.bne0 = L.BatchNormalization(16)
|
20 |
-
self.ce1 = L.ConvolutionND(ndim=3, in_channels=16, out_channels=32, ksize=3, pad=1,initialW=w)
|
21 |
self.bne1 = L.BatchNormalization(32)
|
22 |
|
23 |
self.ce2 = L.ConvolutionND(ndim=3, in_channels=32, out_channels=32, ksize=3, pad=1, initialW=w)
|
@@ -31,22 +25,23 @@ class UNet3D(chainer.Chain):
|
|
31 |
# decoder pass
|
32 |
self.cd4 = L.ConvolutionND(ndim=3, in_channels=64, out_channels=128, ksize=3, pad=1, initialW=w)
|
33 |
self.bnd4 = L.BatchNormalization(128)
|
34 |
-
self.deconv2 = L.DeconvolutionND(ndim=3, in_channels=128, out_channels=128, ksize=2, stride=2, initialW=w,
|
|
|
35 |
|
36 |
-
self.cd3 = L.ConvolutionND(ndim=3, in_channels=64+128, out_channels=64, ksize=3, pad=1, initialW=w)
|
37 |
self.bnd3 = L.BatchNormalization(64)
|
38 |
self.cd2 = L.ConvolutionND(ndim=3, in_channels=64, out_channels=64, ksize=3, pad=1, initialW=w)
|
39 |
self.bnd2 = L.BatchNormalization(64)
|
40 |
-
self.deconv1 = L.DeconvolutionND(ndim=3, in_channels=64, out_channels=64, ksize=2, stride=2, initialW=w,
|
|
|
41 |
|
42 |
-
self.cd1 = L.ConvolutionND(ndim=3, in_channels=32+64, out_channels=32, ksize=3, pad=1, initialW=w)
|
43 |
self.bnd1 = L.BatchNormalization(32)
|
44 |
self.cd0 = L.ConvolutionND(ndim=3, in_channels=32, out_channels=32, ksize=3, pad=1, initialW=w)
|
45 |
self.bnd0 = L.BatchNormalization(32)
|
46 |
self.lcl = L.ConvolutionND(ndim=3, in_channels=32, out_channels=num_of_label, ksize=1, pad=0, initialW=w)
|
47 |
|
48 |
def __call__(self, x):
|
49 |
-
|
50 |
# encoder pass
|
51 |
e0 = F.relu(self.bne0(self.ce0(x)))
|
52 |
e1 = F.relu(self.bne1(self.ce1(e0)))
|
@@ -69,25 +64,24 @@ class UNet3D(chainer.Chain):
|
|
69 |
del d1
|
70 |
lcl = F.softmax(self.lcl(d0), axis=1)
|
71 |
|
72 |
-
return lcl
|
73 |
-
|
74 |
|
75 |
def cropping(self, input, ref):
|
76 |
'''
|
77 |
* @param input encoder feature map
|
78 |
* @param ref decoder feature map
|
79 |
'''
|
80 |
-
edgez = (input.shape[2] - ref.shape[2])/2
|
81 |
-
edgey = (input.shape[3] - ref.shape[3])/2
|
82 |
-
edgex = (input.shape[4] - ref.shape[4])/2
|
83 |
edgez = int(edgex)
|
84 |
edgey = int(edgey)
|
85 |
edgex = int(edgez)
|
86 |
|
87 |
-
X = F.split_axis(input,(edgex,int(input.shape[4]-edgex)),axis=4)
|
88 |
X = X[1]
|
89 |
-
X = F.split_axis(X,(edgey,int(X.shape[3]-edgey)),axis=3)
|
90 |
X = X[1]
|
91 |
-
X = F.split_axis(X,(edgez,int
|
92 |
X = X[1]
|
93 |
return X
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
import chainer
|
2 |
import chainer.functions as F
|
3 |
import chainer.links as L
|
4 |
|
|
|
5 |
|
6 |
+
class UNet3D(chainer.Chain):
|
7 |
def __init__(self, num_of_label):
|
8 |
w = chainer.initializers.HeNormal()
|
9 |
super(UNet3D, self).__init__()
|
10 |
with self.init_scope():
|
11 |
# encoder pass
|
12 |
+
self.ce0 = L.ConvolutionND(ndim=3, in_channels=1, out_channels=16, ksize=3, pad=1, initialW=w)
|
13 |
self.bne0 = L.BatchNormalization(16)
|
14 |
+
self.ce1 = L.ConvolutionND(ndim=3, in_channels=16, out_channels=32, ksize=3, pad=1, initialW=w)
|
15 |
self.bne1 = L.BatchNormalization(32)
|
16 |
|
17 |
self.ce2 = L.ConvolutionND(ndim=3, in_channels=32, out_channels=32, ksize=3, pad=1, initialW=w)
|
|
|
25 |
# decoder pass
|
26 |
self.cd4 = L.ConvolutionND(ndim=3, in_channels=64, out_channels=128, ksize=3, pad=1, initialW=w)
|
27 |
self.bnd4 = L.BatchNormalization(128)
|
28 |
+
self.deconv2 = L.DeconvolutionND(ndim=3, in_channels=128, out_channels=128, ksize=2, stride=2, initialW=w,
|
29 |
+
nobias=True)
|
30 |
|
31 |
+
self.cd3 = L.ConvolutionND(ndim=3, in_channels=64 + 128, out_channels=64, ksize=3, pad=1, initialW=w)
|
32 |
self.bnd3 = L.BatchNormalization(64)
|
33 |
self.cd2 = L.ConvolutionND(ndim=3, in_channels=64, out_channels=64, ksize=3, pad=1, initialW=w)
|
34 |
self.bnd2 = L.BatchNormalization(64)
|
35 |
+
self.deconv1 = L.DeconvolutionND(ndim=3, in_channels=64, out_channels=64, ksize=2, stride=2, initialW=w,
|
36 |
+
nobias=True)
|
37 |
|
38 |
+
self.cd1 = L.ConvolutionND(ndim=3, in_channels=32 + 64, out_channels=32, ksize=3, pad=1, initialW=w)
|
39 |
self.bnd1 = L.BatchNormalization(32)
|
40 |
self.cd0 = L.ConvolutionND(ndim=3, in_channels=32, out_channels=32, ksize=3, pad=1, initialW=w)
|
41 |
self.bnd0 = L.BatchNormalization(32)
|
42 |
self.lcl = L.ConvolutionND(ndim=3, in_channels=32, out_channels=num_of_label, ksize=1, pad=0, initialW=w)
|
43 |
|
44 |
def __call__(self, x):
|
|
|
45 |
# encoder pass
|
46 |
e0 = F.relu(self.bne0(self.ce0(x)))
|
47 |
e1 = F.relu(self.bne1(self.ce1(e0)))
|
|
|
64 |
del d1
|
65 |
lcl = F.softmax(self.lcl(d0), axis=1)
|
66 |
|
67 |
+
return lcl # (batchsize, ch, z, y, x)
|
|
|
68 |
|
69 |
def cropping(self, input, ref):
|
70 |
'''
|
71 |
* @param input encoder feature map
|
72 |
* @param ref decoder feature map
|
73 |
'''
|
74 |
+
edgez = (input.shape[2] - ref.shape[2]) / 2
|
75 |
+
edgey = (input.shape[3] - ref.shape[3]) / 2
|
76 |
+
edgex = (input.shape[4] - ref.shape[4]) / 2
|
77 |
edgez = int(edgex)
|
78 |
edgey = int(edgey)
|
79 |
edgex = int(edgez)
|
80 |
|
81 |
+
X = F.split_axis(input, (edgex, int(input.shape[4] - edgex)), axis=4)
|
82 |
X = X[1]
|
83 |
+
X = F.split_axis(X, (edgey, int(X.shape[3] - edgey)), axis=3)
|
84 |
X = X[1]
|
85 |
+
X = F.split_axis(X, (edgez, int(X.shape[2] - edgez)), axis=2)
|
86 |
X = X[1]
|
87 |
return X
|
livermask/utils/utils.py
CHANGED
@@ -6,14 +6,12 @@ from .unet3d import UNet3D
|
|
6 |
|
7 |
def get_model(output):
|
8 |
url = "https://drive.google.com/uc?id=12or5Q79at2BtLgQ7IaglNGPFGRlEgEHc"
|
9 |
-
|
10 |
-
gdown.cached_download(url, output) #, md5=md5) #, postprocess=gdown.extractall)
|
11 |
|
12 |
|
13 |
def get_vessel_model(output):
|
14 |
url = "https://drive.google.com/uc?id=1-8VNoRmIeiF1uIuWBqmZXz_6dIQFSAxN"
|
15 |
-
|
16 |
-
gdown.cached_download(url, output) #, md5=md5)
|
17 |
|
18 |
|
19 |
def load_vessel_model(path, cpu):
|
@@ -22,7 +20,6 @@ def load_vessel_model(path, cpu):
|
|
22 |
if not cpu:
|
23 |
chainer.cuda.get_device_from_id(0).use()
|
24 |
unet.to_gpu()
|
25 |
-
|
26 |
xp = unet.xp
|
27 |
return unet, xp
|
28 |
|
|
|
6 |
|
7 |
def get_model(output):
|
8 |
url = "https://drive.google.com/uc?id=12or5Q79at2BtLgQ7IaglNGPFGRlEgEHc"
|
9 |
+
gdown.cached_download(url, output)
|
|
|
10 |
|
11 |
|
12 |
def get_vessel_model(output):
|
13 |
url = "https://drive.google.com/uc?id=1-8VNoRmIeiF1uIuWBqmZXz_6dIQFSAxN"
|
14 |
+
gdown.cached_download(url, output)
|
|
|
15 |
|
16 |
|
17 |
def load_vessel_model(path, cpu):
|
|
|
20 |
if not cpu:
|
21 |
chainer.cuda.get_device_from_id(0).use()
|
22 |
unet.to_gpu()
|
|
|
23 |
xp = unet.xp
|
24 |
return unet, xp
|
25 |
|
livermask/utils/yaml_utils.py
CHANGED
@@ -1,13 +1,8 @@
|
|
1 |
-
import shutil
|
2 |
-
import sys, os, time
|
3 |
import yaml
|
4 |
|
5 |
|
6 |
-
#
|
7 |
class Config(object):
|
8 |
-
'''
|
9 |
-
'https://github.com/pfnet-research/sngan_projection/blob/master/source/yaml_utils.py'
|
10 |
-
'''
|
11 |
def __init__(self, config_dict):
|
12 |
self.config = config_dict
|
13 |
|
|
|
|
|
|
|
1 |
import yaml
|
2 |
|
3 |
|
4 |
+
# https://github.com/pfnet-research/sngan_projection/blob/master/source/yaml_utils.py
|
5 |
class Config(object):
|
|
|
|
|
|
|
6 |
def __init__(self, config_dict):
|
7 |
self.config = config_dict
|
8 |
|