Skip to content

Commit 3c56d78

Browse files
authored
Merge pull request #205 from TomographicImaging/fix_3D_regularisers
ctypes: pass the dimension parameters in the correct order
2 parents b0e1888 + 6f6de90 commit 3c56d78

File tree

8 files changed

+826
-2409
lines changed

8 files changed

+826
-2409
lines changed

demos/demo_cpu_regularisers3D.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ def printParametersToString(pars):
7070
Im = Im2
7171
del Im2
7272
"""
73-
slices = 15
73+
slices = 20
7474

7575
noisyVol = np.zeros((slices,N,M),dtype='float32')
7676
noisyRef = np.zeros((slices,N,M),dtype='float32')
@@ -90,14 +90,15 @@ def printParametersToString(pars):
9090
fig = plt.figure()
9191
plt.suptitle('Performance of ROF-TV regulariser using the CPU')
9292
a=fig.add_subplot(1,2,1)
93-
a.set_title('Noisy 15th slice of a volume')
94-
imgplot = plt.imshow(noisyVol[10,:,:],cmap="gray")
93+
slice_num = 10
94+
a.set_title(f'Noisy slice {slice_num} of a volume')
95+
imgplot = plt.imshow(noisyVol[slice_num,:,:],cmap="gray")
9596

9697
# set parameters
9798
pars = {'algorithm': ROF_TV, \
9899
'input' : noisyVol,\
99-
'regularisation_parameter':0.02,\
100-
'number_of_iterations': 7000,\
100+
'regularisation_parameter':0.02 * 100,\
101+
'number_of_iterations': 200,\
101102
'time_marching_parameter': 0.0007,\
102103
'tolerance_constant':1e-06}
103104

@@ -108,7 +109,7 @@ def printParametersToString(pars):
108109
pars['regularisation_parameter'],
109110
pars['number_of_iterations'],
110111
pars['time_marching_parameter'],
111-
pars['tolerance_constant'], device='cpu', infovector=info_vec_cpu)
112+
pars['tolerance_constant'], device='gpu', infovector=info_vec_cpu)
112113

113114
Qtools = QualityTools(idealVol, rof_cpu3D)
114115
pars['rmse'] = Qtools.rmse()
@@ -126,6 +127,7 @@ def printParametersToString(pars):
126127
imgplot = plt.imshow(rof_cpu3D[10,:,:], cmap="gray")
127128
plt.title('{}'.format('Recovered volume on the CPU using ROF-TV'))
128129

130+
print (f"information vector: {info_vec_cpu}")
129131
#%%
130132
print ("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%")
131133
print ("_______________FGP-TV (3D)__________________")
@@ -141,8 +143,8 @@ def printParametersToString(pars):
141143
# set parameters
142144
pars = {'algorithm' : FGP_TV, \
143145
'input' : noisyVol,\
144-
'regularisation_parameter':0.02, \
145-
'number_of_iterations' :1000 ,\
146+
'regularisation_parameter': 0.08,# 0.02 * 10000,
147+
'number_of_iterations' :2000 ,\
146148
'tolerance_constant':1e-06,\
147149
'methodTV': 0 ,\
148150
'nonneg': 0}
@@ -171,6 +173,9 @@ def printParametersToString(pars):
171173
verticalalignment='top', bbox=props)
172174
imgplot = plt.imshow(fgp_cpu3D[10,:,:], cmap="gray")
173175
plt.title('{}'.format('Recovered volume on the CPU using FGP-TV'))
176+
177+
#%%
178+
imgplot = plt.imshow(fgp_cpu3D[:,1,:], cmap="gray")
174179
#%%
175180
print ("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%")
176181
print ("_______________PD-TV (3D)__________________")

src/Python/ccpi/filters/TV.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def TV_ROF_CPU(inputData, regularisation_parameter, iterationsNumb,
3434
infovector = np.zeros((2,), dtype='float32')
3535
infovector_p = infovector.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
3636

37-
dims = list(inputData.shape)
37+
dims = list(inputData.shape)[::-1]
3838
if inputData.ndim == 2:
3939
dims.append(1)
4040

@@ -79,7 +79,7 @@ def TV_FGP_CPU(inputData, lambdaPar, iterationsNumb, epsil, methodTV, nonneg, ou
7979
infovector = np.zeros((2,), dtype='float32')
8080
infovector_p = infovector.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
8181

82-
dims = list(inputData.shape)
82+
dims = list(inputData.shape)[::-1]
8383
if inputData.ndim == 2:
8484
dims.append(1)
8585

@@ -122,7 +122,7 @@ def PDTV_CPU(inputData, lambdaPar, iterationsNumb, epsil, lipschitz_const, metho
122122
infovector = np.zeros((2,), dtype='float32')
123123
infovector_p = infovector.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
124124

125-
dims = list(inputData.shape)
125+
dims = list(inputData.shape)[::-1]
126126
if inputData.ndim == 2:
127127
dims.append(1)
128128

@@ -161,7 +161,7 @@ def SB_TV_CPU(inputData, mu, iter, epsil, methodTV, out=None, infovector=None):
161161
infovector = np.zeros((2,), dtype='float32')
162162
infovector_p = infovector.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
163163

164-
dims = list(inputData.shape)
164+
dims = list(inputData.shape)[::-1]
165165
if inputData.ndim == 2:
166166
dims.append(1)
167167

@@ -199,7 +199,7 @@ def LLT_ROF_CPU(inputData, lambdaROF, lambdaLLT, iterationsNumb, tau, epsil, out
199199
infovector = np.zeros((2,), dtype='float32')
200200
infovector_p = infovector.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
201201

202-
dims = list(inputData.shape)
202+
dims = list(inputData.shape)[::-1]
203203
if inputData.ndim == 2:
204204
dims.append(1)
205205

@@ -239,7 +239,7 @@ def TGV_CPU(inputData, lambdaPar, alpha1, alpha0, iterationsNumb, L2, epsil, out
239239
infovector = np.zeros((2,), dtype='float32')
240240
infovector_p = infovector.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
241241

242-
dims = list(inputData.shape)
242+
dims = list(inputData.shape)[::-1]
243243
if inputData.ndim == 2:
244244
dims.append(1)
245245

@@ -281,7 +281,7 @@ def dTV_FGP_CPU(inputData, inputRef, lambdaPar, iterationsNumb, epsil, eta, meth
281281
infovector = np.zeros((2,), dtype='float32')
282282
infovector_p = infovector.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
283283

284-
dims = list(inputData.shape)
284+
dims = list(inputData.shape)[::-1]
285285
if inputData.ndim == 2:
286286
dims.append(1)
287287

@@ -312,7 +312,7 @@ def TNV(inputData, lambdaPar, maxIter, tol, out=None):
312312
out = np.zeros_like(inputData)
313313
out_p = out.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
314314

315-
dims = list(inputData.shape)
315+
dims = list(inputData.shape)[::-1]
316316
if inputData.ndim != 3:
317317
raise ValueError('Input data must be 2D + 1 channel')
318318

@@ -439,7 +439,7 @@ def TV_ENERGY(U, U0, lambdaPar, type, E_val=None):
439439
ctypes.c_int, # dimY (int)
440440
]
441441
cilreg.TV_energy2D.restype = ctypes.c_float # return value is float
442-
result = cilreg.TV_energy2D(u_p, u0_p, e_val_p, lambdaPar, type, dims[0], dims[1])
442+
result = cilreg.TV_energy2D(u_p, u0_p, e_val_p, lambdaPar, type, dims[1], dims[0])
443443
elif U.ndim == 3:
444444
# float TV_energy3D(float *U, float *U0, float *E_val, float lambdaPar, int type, int dimX, int dimY, int dimZ);
445445
cilreg.TV_energy3D.argtypes = [
@@ -455,7 +455,7 @@ def TV_ENERGY(U, U0, lambdaPar, type, E_val=None):
455455
cilreg.TV_energy3D.restype = ctypes.c_float # return value is float
456456

457457
# float TV_energy3D(float *U, float *U0, float *E_val, float lambdaPar, int type, int dimX, int dimY, int dimZ);
458-
result = cilreg.TV_energy3D(u_p, u0_p, e_val_p, lambdaPar, type, dims[0], dims[1], dims[2])
458+
result = cilreg.TV_energy3D(u_p, u0_p, e_val_p, lambdaPar, type, dims[2], dims[1], dims[0])
459459
else:
460460
raise ValueError(f"TV_ENERGY: Only 2D and 3D data are supported. Got {U.ndim}")
461461
return E_val
@@ -503,7 +503,7 @@ def TV_ROF_GPU(inputData, regularisation_parameter, iterationsNumb,
503503
infovector = np.zeros((2,), dtype='float32')
504504
infovector_p = infovector.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
505505

506-
dims = list(inputData.shape)
506+
dims = list(inputData.shape)[::-1]
507507
if inputData.ndim == 2:
508508
dims.append(1)
509509

@@ -551,7 +551,7 @@ def TV_FGP_GPU(inputData, lambdaPar, iterationsNumb, epsil, methodTV, nonneg, gp
551551
infovector = np.zeros((2,), dtype='float32')
552552
infovector_p = infovector.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
553553

554-
dims = list(inputData.shape)
554+
dims = list(inputData.shape)[::-1]
555555
if inputData.ndim == 2:
556556
dims.append(1)
557557
if gpu_device == 'gpu':
@@ -594,7 +594,7 @@ def PDTV_GPU(Input, lambdaPar, iter, epsil, lipschitz_const, methodTV, nonneg, g
594594
infovector = np.zeros_like(Input)
595595
infovector_p = infovector.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
596596

597-
dims = list(Input.shape)
597+
dims = list(Input.shape)[::-1]
598598
if Input.ndim == 2:
599599
dims.append(1)
600600
# int TV_PD_GPU_main(float *Input, float *Output, float *infovector, float lambdaPar, int iter, float epsil,
@@ -635,7 +635,7 @@ def SB_TV_GPU(inputData, lambdaPar, iterationsNumb, epsil, methodTV,
635635
infovector = np.zeros((2,), dtype='float32')
636636
infovector_p = infovector.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
637637

638-
dims = list(inputData.shape)
638+
dims = list(inputData.shape)[::-1]
639639
if inputData.ndim == 2:
640640
dims.append(1)
641641

@@ -676,7 +676,7 @@ def LLT_ROF_GPU(inputData, lambdaROF, lambdaLLT, iterationsNumb, tau, epsil, gpu
676676
infovector = np.zeros((2,), dtype='float32')
677677
infovector_p = infovector.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
678678

679-
dims = list(inputData.shape)
679+
dims = list(inputData.shape)[::-1]
680680
if inputData.ndim == 2:
681681
dims.append(1)
682682

@@ -719,7 +719,7 @@ def TGV_GPU(inputData, lambdaPar, alpha1, alpha0, iterationsNumb, L2, epsil,
719719
infovector = np.zeros((2,), dtype='float32')
720720
infovector_p = infovector.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
721721

722-
dims = list(inputData.shape)
722+
dims = list(inputData.shape)[::-1]
723723
if inputData.ndim == 2:
724724
dims.append(1)
725725
dims = dims[::-1]
@@ -765,7 +765,7 @@ def dTV_FGP_GPU(inputData, inputRef, lambdaPar, iterationsNumb, epsil, eta,
765765
infovector = np.zeros((2,), dtype='float32')
766766
infovector_p = infovector.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
767767

768-
dims = list(inputData.shape)
768+
dims = list(inputData.shape)[::-1]
769769
if inputData.ndim == 2:
770770
dims.append(1)
771771

src/Python/ccpi/filters/diffusion.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def NDF_CPU(inputData, lambdaPar, sigmaPar, iterationsNumb, tau, penaltytype, ep
3535
infovector = np.zeros((2,), dtype='float32')
3636
infovector_p = infovector.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
3737

38-
dims = list(inputData.shape)
38+
dims = list(inputData.shape)[::-1]
3939
if inputData.ndim == 2:
4040
dims.append(1)
4141

@@ -74,7 +74,7 @@ def Diffus4th_CPU(inputData, lambdaPar, sigmaPar, iterationsNumb, tau, epsil, ou
7474
infovector = np.zeros((2,), dtype='float32')
7575
infovector_p = infovector.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
7676

77-
dims = list(inputData.shape)
77+
dims = list(inputData.shape)[::-1]
7878
if inputData.ndim == 2:
7979
dims.append(1)
8080

@@ -117,7 +117,7 @@ def NDF_GPU(inputData, lambdaPar, sigmaPar, iterationsNumb, tau,
117117
infovector = np.zeros((2,), dtype='float32')
118118
infovector_p = infovector.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
119119

120-
dims = list(inputData.shape)
120+
dims = list(inputData.shape)[::-1]
121121
if inputData.ndim == 2:
122122
dims.append(1)
123123

@@ -159,7 +159,7 @@ def Diffus4th_GPU(inputData, lambdaPar, sigmaPar, iterationsNumb, tau, epsil, gp
159159
infovector = np.zeros((2,), dtype='float32')
160160
infovector_p = infovector.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
161161

162-
dims = list(inputData.shape)
162+
dims = list(inputData.shape)[::-1]
163163
if inputData.ndim == 2:
164164
dims.append(1)
165165

0 commit comments

Comments
 (0)