Skip to content

Commit e671d45

Browse files
authored
Merge pull request #180 from eigenvivek/pytorch3d-remove
Remove dependency on `pytorch3d`
2 parents 6831c49 + 5979636 commit e671d45

File tree

11 files changed

+4326
-115
lines changed

11 files changed

+4326
-115
lines changed

README.md

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,6 @@ To install `DiffDRR` from PyPI:
3131
pip install diffdrr
3232
```
3333

34-
`DiffDRR` also requires `PyTorch3D`, which gives us the ability to use multiple parameterizations of SO(3) when constructing camera poses! For most users,
35-
```zsh
36-
conda install pytorch3d -c pytorch3d
37-
```
38-
should work perfectly well. Otherwise, see PyTorch3D's [installation guide](https://github.com/facebookresearch/pytorch3d/blob/main/INSTALL.md).
39-
4034
## Usage
4135

4236
The following minimal example specifies the geometry of the projectional radiograph imaging system and traces rays through a CT volume:

diffdrr/_modidx.py

Lines changed: 87 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,23 +56,108 @@
5656
'diffdrr.siddon._get_index': ('api/siddon.html#_get_index', 'diffdrr/siddon.py'),
5757
'diffdrr.siddon._get_voxel': ('api/siddon.html#_get_voxel', 'diffdrr/siddon.py'),
5858
'diffdrr.siddon.siddon_raycast': ('api/siddon.html#siddon_raycast', 'diffdrr/siddon.py')},
59-
'diffdrr.utils': { 'diffdrr.utils._10vec_to_4x4symmetric': ('api/utils.html#_10vec_to_4x4symmetric', 'diffdrr/utils.py'),
59+
'diffdrr.utils': { 'diffdrr.utils.Rotate': ('api/utils.html#rotate', 'diffdrr/utils.py'),
60+
'diffdrr.utils.Rotate.__init__': ('api/utils.html#rotate.__init__', 'diffdrr/utils.py'),
61+
'diffdrr.utils.Rotate._get_matrix_inverse': ( 'api/utils.html#rotate._get_matrix_inverse',
62+
'diffdrr/utils.py'),
63+
'diffdrr.utils.RotateAxisAngle': ('api/utils.html#rotateaxisangle', 'diffdrr/utils.py'),
64+
'diffdrr.utils.RotateAxisAngle.__init__': ('api/utils.html#rotateaxisangle.__init__', 'diffdrr/utils.py'),
65+
'diffdrr.utils.Scale': ('api/utils.html#scale', 'diffdrr/utils.py'),
66+
'diffdrr.utils.Scale.__init__': ('api/utils.html#scale.__init__', 'diffdrr/utils.py'),
67+
'diffdrr.utils.Scale._get_matrix_inverse': ('api/utils.html#scale._get_matrix_inverse', 'diffdrr/utils.py'),
68+
'diffdrr.utils.Transform3d': ('api/utils.html#transform3d', 'diffdrr/utils.py'),
69+
'diffdrr.utils.Transform3d.__getitem__': ('api/utils.html#transform3d.__getitem__', 'diffdrr/utils.py'),
70+
'diffdrr.utils.Transform3d.__init__': ('api/utils.html#transform3d.__init__', 'diffdrr/utils.py'),
71+
'diffdrr.utils.Transform3d.__len__': ('api/utils.html#transform3d.__len__', 'diffdrr/utils.py'),
72+
'diffdrr.utils.Transform3d._get_matrix_inverse': ( 'api/utils.html#transform3d._get_matrix_inverse',
73+
'diffdrr/utils.py'),
74+
'diffdrr.utils.Transform3d.clone': ('api/utils.html#transform3d.clone', 'diffdrr/utils.py'),
75+
'diffdrr.utils.Transform3d.compose': ('api/utils.html#transform3d.compose', 'diffdrr/utils.py'),
76+
'diffdrr.utils.Transform3d.cpu': ('api/utils.html#transform3d.cpu', 'diffdrr/utils.py'),
77+
'diffdrr.utils.Transform3d.cuda': ('api/utils.html#transform3d.cuda', 'diffdrr/utils.py'),
78+
'diffdrr.utils.Transform3d.get_matrix': ('api/utils.html#transform3d.get_matrix', 'diffdrr/utils.py'),
79+
'diffdrr.utils.Transform3d.get_se3_log': ('api/utils.html#transform3d.get_se3_log', 'diffdrr/utils.py'),
80+
'diffdrr.utils.Transform3d.inverse': ('api/utils.html#transform3d.inverse', 'diffdrr/utils.py'),
81+
'diffdrr.utils.Transform3d.rotate': ('api/utils.html#transform3d.rotate', 'diffdrr/utils.py'),
82+
'diffdrr.utils.Transform3d.rotate_axis_angle': ( 'api/utils.html#transform3d.rotate_axis_angle',
83+
'diffdrr/utils.py'),
84+
'diffdrr.utils.Transform3d.scale': ('api/utils.html#transform3d.scale', 'diffdrr/utils.py'),
85+
'diffdrr.utils.Transform3d.stack': ('api/utils.html#transform3d.stack', 'diffdrr/utils.py'),
86+
'diffdrr.utils.Transform3d.to': ('api/utils.html#transform3d.to', 'diffdrr/utils.py'),
87+
'diffdrr.utils.Transform3d.transform_normals': ( 'api/utils.html#transform3d.transform_normals',
88+
'diffdrr/utils.py'),
89+
'diffdrr.utils.Transform3d.transform_points': ( 'api/utils.html#transform3d.transform_points',
90+
'diffdrr/utils.py'),
91+
'diffdrr.utils.Transform3d.translate': ('api/utils.html#transform3d.translate', 'diffdrr/utils.py'),
92+
'diffdrr.utils.Translate': ('api/utils.html#translate', 'diffdrr/utils.py'),
93+
'diffdrr.utils.Translate.__init__': ('api/utils.html#translate.__init__', 'diffdrr/utils.py'),
94+
'diffdrr.utils.Translate._get_matrix_inverse': ( 'api/utils.html#translate._get_matrix_inverse',
95+
'diffdrr/utils.py'),
96+
'diffdrr.utils._10vec_to_4x4symmetric': ('api/utils.html#_10vec_to_4x4symmetric', 'diffdrr/utils.py'),
97+
'diffdrr.utils._acos_linear_approximation': ( 'api/utils.html#_acos_linear_approximation',
98+
'diffdrr/utils.py'),
99+
'diffdrr.utils._angle_from_tan': ('api/utils.html#_angle_from_tan', 'diffdrr/utils.py'),
100+
'diffdrr.utils._axis_angle_rotation': ('api/utils.html#_axis_angle_rotation', 'diffdrr/utils.py'),
101+
'diffdrr.utils._broadcast_bmm': ('api/utils.html#_broadcast_bmm', 'diffdrr/utils.py'),
102+
'diffdrr.utils._check_valid_rotation_matrix': ( 'api/utils.html#_check_valid_rotation_matrix',
103+
'diffdrr/utils.py'),
60104
'diffdrr.utils._convert_from_rotation_matrix': ( 'api/utils.html#_convert_from_rotation_matrix',
61105
'diffdrr/utils.py'),
62106
'diffdrr.utils._convert_to_rotation_matrix': ( 'api/utils.html#_convert_to_rotation_matrix',
63107
'diffdrr/utils.py'),
108+
'diffdrr.utils._copysign': ('api/utils.html#_copysign', 'diffdrr/utils.py'),
109+
'diffdrr.utils._dacos_dx': ('api/utils.html#_dacos_dx', 'diffdrr/utils.py'),
110+
'diffdrr.utils._get_se3_V_input': ('api/utils.html#_get_se3_v_input', 'diffdrr/utils.py'),
111+
'diffdrr.utils._handle_angle_input': ('api/utils.html#_handle_angle_input', 'diffdrr/utils.py'),
112+
'diffdrr.utils._handle_coord': ('api/utils.html#_handle_coord', 'diffdrr/utils.py'),
113+
'diffdrr.utils._handle_input': ('api/utils.html#_handle_input', 'diffdrr/utils.py'),
114+
'diffdrr.utils._index_from_letter': ('api/utils.html#_index_from_letter', 'diffdrr/utils.py'),
115+
'diffdrr.utils._safe_det_3x3': ('api/utils.html#_safe_det_3x3', 'diffdrr/utils.py'),
116+
'diffdrr.utils._se3_V_matrix': ('api/utils.html#_se3_v_matrix', 'diffdrr/utils.py'),
117+
'diffdrr.utils._so3_exp_map': ('api/utils.html#_so3_exp_map', 'diffdrr/utils.py'),
118+
'diffdrr.utils._sqrt_positive_part': ('api/utils.html#_sqrt_positive_part', 'diffdrr/utils.py'),
119+
'diffdrr.utils.acos_linear_extrapolation': ('api/utils.html#acos_linear_extrapolation', 'diffdrr/utils.py'),
120+
'diffdrr.utils.axis_angle_to_matrix': ('api/utils.html#axis_angle_to_matrix', 'diffdrr/utils.py'),
121+
'diffdrr.utils.axis_angle_to_quaternion': ('api/utils.html#axis_angle_to_quaternion', 'diffdrr/utils.py'),
64122
'diffdrr.utils.convert': ('api/utils.html#convert', 'diffdrr/utils.py'),
123+
'diffdrr.utils.euler_angles_to_matrix': ('api/utils.html#euler_angles_to_matrix', 'diffdrr/utils.py'),
124+
'diffdrr.utils.get_device': ('api/utils.html#get_device', 'diffdrr/utils.py'),
65125
'diffdrr.utils.get_focal_length': ('api/utils.html#get_focal_length', 'diffdrr/utils.py'),
66126
'diffdrr.utils.get_principal_point': ('api/utils.html#get_principal_point', 'diffdrr/utils.py'),
127+
'diffdrr.utils.hat': ('api/utils.html#hat', 'diffdrr/utils.py'),
128+
'diffdrr.utils.hat_inv': ('api/utils.html#hat_inv', 'diffdrr/utils.py'),
129+
'diffdrr.utils.make_device': ('api/utils.html#make_device', 'diffdrr/utils.py'),
130+
'diffdrr.utils.matrix_to_axis_angle': ('api/utils.html#matrix_to_axis_angle', 'diffdrr/utils.py'),
131+
'diffdrr.utils.matrix_to_euler_angles': ('api/utils.html#matrix_to_euler_angles', 'diffdrr/utils.py'),
132+
'diffdrr.utils.matrix_to_quaternion': ('api/utils.html#matrix_to_quaternion', 'diffdrr/utils.py'),
133+
'diffdrr.utils.matrix_to_rotation_6d': ('api/utils.html#matrix_to_rotation_6d', 'diffdrr/utils.py'),
67134
'diffdrr.utils.parse_intrinsic_matrix': ('api/utils.html#parse_intrinsic_matrix', 'diffdrr/utils.py'),
68135
'diffdrr.utils.quaternion_adjugate_to_quaternion': ( 'api/utils.html#quaternion_adjugate_to_quaternion',
69136
'diffdrr/utils.py'),
137+
'diffdrr.utils.quaternion_apply': ('api/utils.html#quaternion_apply', 'diffdrr/utils.py'),
138+
'diffdrr.utils.quaternion_invert': ('api/utils.html#quaternion_invert', 'diffdrr/utils.py'),
139+
'diffdrr.utils.quaternion_multiply': ('api/utils.html#quaternion_multiply', 'diffdrr/utils.py'),
140+
'diffdrr.utils.quaternion_raw_multiply': ('api/utils.html#quaternion_raw_multiply', 'diffdrr/utils.py'),
141+
'diffdrr.utils.quaternion_to_axis_angle': ('api/utils.html#quaternion_to_axis_angle', 'diffdrr/utils.py'),
142+
'diffdrr.utils.quaternion_to_matrix': ('api/utils.html#quaternion_to_matrix', 'diffdrr/utils.py'),
70143
'diffdrr.utils.quaternion_to_quaternion_adjugate': ( 'api/utils.html#quaternion_to_quaternion_adjugate',
71144
'diffdrr/utils.py'),
72145
'diffdrr.utils.quaternion_to_rotation_10d': ( 'api/utils.html#quaternion_to_rotation_10d',
73146
'diffdrr/utils.py'),
147+
'diffdrr.utils.random_quaternions': ('api/utils.html#random_quaternions', 'diffdrr/utils.py'),
148+
'diffdrr.utils.random_rotation': ('api/utils.html#random_rotation', 'diffdrr/utils.py'),
149+
'diffdrr.utils.random_rotations': ('api/utils.html#random_rotations', 'diffdrr/utils.py'),
74150
'diffdrr.utils.rotation_10d_to_quaternion': ( 'api/utils.html#rotation_10d_to_quaternion',
75-
'diffdrr/utils.py')},
151+
'diffdrr/utils.py'),
152+
'diffdrr.utils.rotation_6d_to_matrix': ('api/utils.html#rotation_6d_to_matrix', 'diffdrr/utils.py'),
153+
'diffdrr.utils.se3_exp_map': ('api/utils.html#se3_exp_map', 'diffdrr/utils.py'),
154+
'diffdrr.utils.se3_log_map': ('api/utils.html#se3_log_map', 'diffdrr/utils.py'),
155+
'diffdrr.utils.so3_exp_map': ('api/utils.html#so3_exp_map', 'diffdrr/utils.py'),
156+
'diffdrr.utils.so3_exponential_map': ('api/utils.html#so3_exponential_map', 'diffdrr/utils.py'),
157+
'diffdrr.utils.so3_log_map': ('api/utils.html#so3_log_map', 'diffdrr/utils.py'),
158+
'diffdrr.utils.so3_relative_angle': ('api/utils.html#so3_relative_angle', 'diffdrr/utils.py'),
159+
'diffdrr.utils.so3_rotation_angle': ('api/utils.html#so3_rotation_angle', 'diffdrr/utils.py'),
160+
'diffdrr.utils.standardize_quaternion': ('api/utils.html#standardize_quaternion', 'diffdrr/utils.py')},
76161
'diffdrr.visualization': { 'diffdrr.visualization._make_camera_frustum_mesh': ( 'api/visualization.html#_make_camera_frustum_mesh',
77162
'diffdrr/visualization.py'),
78163
'diffdrr.visualization.animate': ('api/visualization.html#animate', 'diffdrr/visualization.py'),

diffdrr/detector.py

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,7 @@
1010
# %% auto 0
1111
__all__ = ['Detector', 'diffdrr_to_deepdrr']
1212

13-
# %% ../notebooks/api/02_detector.ipynb 4
14-
try:
15-
import pytorch3d
16-
except ModuleNotFoundError:
17-
install = "https://github.com/facebookresearch/pytorch3d/blob/main/INSTALL.md"
18-
raise ModuleNotFoundError(
19-
f"PyTorch3D is not installed, which is required to parameterize camera poses. See installation instructions here: {install}"
20-
)
21-
22-
# %% ../notebooks/api/02_detector.ipynb 6
13+
# %% ../notebooks/api/02_detector.ipynb 5
2314
class Detector(torch.nn.Module):
2415
"""Construct a 6 DoF X-ray detector system. This model is based on a C-Arm."""
2516

@@ -53,7 +44,7 @@ def __init__(
5344
self.register_buffer("source", source)
5445
self.register_buffer("target", target)
5546

56-
# %% ../notebooks/api/02_detector.ipynb 7
47+
# %% ../notebooks/api/02_detector.ipynb 6
5748
@patch
5849
def _initialize_carm(self: Detector):
5950
"""Initialize the default position for the source and detector plane."""
@@ -100,10 +91,8 @@ def _initialize_carm(self: Detector):
10091
self.subsamples.append(sample.tolist())
10192
return source, target
10293

103-
# %% ../notebooks/api/02_detector.ipynb 8
104-
from pytorch3d.transforms import Transform3d
105-
106-
from .utils import convert
94+
# %% ../notebooks/api/02_detector.ipynb 7
95+
from .utils import Transform3d, convert
10796

10897

10998
@patch
@@ -128,13 +117,13 @@ def forward(
128117
source, target = make_xrays(t, self.source, self.target)
129118
return source, target
130119

131-
# %% ../notebooks/api/02_detector.ipynb 9
120+
# %% ../notebooks/api/02_detector.ipynb 8
132121
def make_xrays(t: Transform3d, source: torch.Tensor, target: torch.Tensor):
133122
source = t.transform_points(source)
134123
target = t.transform_points(target)
135124
return source, target
136125

137-
# %% ../notebooks/api/02_detector.ipynb 10
126+
# %% ../notebooks/api/02_detector.ipynb 9
138127
def diffdrr_to_deepdrr(euler_angles):
139128
alpha, beta, gamma = euler_angles.unbind(-1)
140129
return torch.stack([beta, alpha, gamma], dim=1)

diffdrr/drr.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,8 @@ def reshape_subsampled_drr(
9292
return drr
9393

9494
# %% ../notebooks/api/00_drr.ipynb 10
95-
from pytorch3d.transforms import Transform3d
96-
9795
from .detector import make_xrays
96+
from .utils import Transform3d
9897

9998

10099
@patch

0 commit comments

Comments
 (0)