|
import torch |
|
import torchsummary |
|
torch.set_default_tensor_type(torch.FloatTensor) |
|
|
|
from pynvml import * |
|
try: nvmlInit() |
|
except:pass |
|
|
|
class VoxelNetFeat(torch.nn.Module): |
|
|
|
def __init__(self, verbose=False): |
|
super(VoxelNetFeat, self).__init__() |
|
|
|
self.verbose = verbose |
|
|
|
self.backbone_block1 = torch.nn.Sequential() |
|
self.backbone_block1.add_module("BBone1_Conv3D", torch.nn.Conv3d(in_channels=1, out_channels=32, kernel_size=(7,7,7),padding=(3,3,3), bias=False)) |
|
self.backbone_block1.add_module("BBone1_MPool3D", torch.nn.MaxPool3d(kernel_size=(2, 2, 2))) |
|
self.backbone_block1.add_module("BBone1_BN3D", torch.nn.BatchNorm3d(num_features=32)) |
|
self.backbone_block1.add_module("BBone1_LRelu", torch.nn.ReLU(inplace=True)) |
|
|
|
self.backbone_block2 = torch.nn.Sequential() |
|
self.backbone_block2.add_module("BBone2_Conv3D", torch.nn.Conv3d(in_channels=32, out_channels=64, kernel_size=(5,5,5),padding=(2,2,2), bias=False)) |
|
self.backbone_block2.add_module("BBone2_MPool3D", torch.nn.MaxPool3d(kernel_size=(2, 2, 2))) |
|
self.backbone_block2.add_module("BBone2_BN3D", torch.nn.BatchNorm3d(num_features=64)) |
|
self.backbone_block2.add_module("BBone2_LRelu", torch.nn.ReLU(inplace=True)) |
|
|
|
self.backbone_block3 = torch.nn.Sequential() |
|
self.backbone_block3.add_module("BBone3_Conv3D", torch.nn.Conv3d(in_channels=64, out_channels=128, kernel_size=(3,3,3), padding=(1,1,1), bias=False)) |
|
self.backbone_block3.add_module("BBone3_BN3D", torch.nn.BatchNorm3d(num_features=128)) |
|
self.backbone_block3.add_module("BBone3_LRelu", torch.nn.ReLU(inplace=True)) |
|
|
|
def forward(self, x): |
|
|
|
if self.verbose: print (' ---- [VoxelNetFeatOrig] x: ', x.shape) |
|
x = self.backbone_block1(x) |
|
if self.verbose: print (' ---- [VoxelNetFeatOrig] backbone_block1(x): ', x.shape) |
|
x = self.backbone_block2(x) |
|
if self.verbose: print (' ---- [VoxelNetFeatOrig] backbone_block2(x): ', x.shape) |
|
x_backbone = self.backbone_block3(x) |
|
if self.verbose: print (' ---- [VoxelNetFeatOrig] backbone_block3(x): ', x_backbone.shape) |
|
|
|
return x_backbone |
|
|
|
class VoxelNetJointOrig(torch.nn.Module): |
|
def __init__(self, count_joints, in_channels, inter_channels, tag): #tag='Joints1' |
|
super(VoxelNetJointOrig, self).__init__() |
|
|
|
self.count_joints = count_joints |
|
|
|
self.task_joints = torch.nn.Sequential() |
|
self.task_joints.add_module(tag + "_Conv3D_1", torch.nn.Conv3d(in_channels=in_channels, out_channels=inter_channels, kernel_size=(3,3,3), padding=(1,1,1))) |
|
self.task_joints.add_module(tag + "_LRelu_1", torch.nn.ReLU(inplace=True)) |
|
self.task_joints.add_module(tag + "_Conv3D_2", torch.nn.Conv3d(in_channels=inter_channels, out_channels=inter_channels, kernel_size=(3,3,3), padding=(1,1,1))) |
|
self.task_joints.add_module(tag + "_LRelu_2", torch.nn.ReLU(inplace=True)) |
|
self.task_joints.add_module(tag + "_Conv3D_3", torch.nn.Conv3d(in_channels=inter_channels, out_channels=inter_channels, kernel_size=(3,3,3), padding=(1,1,1))) |
|
self.task_joints.add_module(tag + "_LRelu_3", torch.nn.ReLU(inplace=True)) |
|
self.task_joints.add_module(tag + "_Conv3D_4", torch.nn.Conv3d(in_channels=inter_channels, out_channels=inter_channels, kernel_size=(1,1,1), padding=(0,0,0))) |
|
self.task_joints.add_module(tag + "_LRelu_4", torch.nn.ReLU(inplace=True)) |
|
self.task_joints.add_module(tag + "_Conv3D_5", torch.nn.Conv3d(in_channels=inter_channels, out_channels=self.count_joints, kernel_size=(1,1,1), padding=(0,0,0))) |
|
|
|
def forward(self, x): |
|
return self.task_joints(x) |
|
|
|
class VoxelNetBPartOrig(torch.nn.Module): |
|
def __init__(self, count_bparts, in_channels, inter_channels, tag): #tag='BParts1' |
|
super(VoxelNetBPartOrig, self).__init__() |
|
|
|
self.count_bparts = count_bparts |
|
|
|
self.task_bparts = torch.nn.Sequential() |
|
self.task_bparts.add_module(tag + "_Conv3D_1", torch.nn.Conv3d(in_channels=in_channels, out_channels=inter_channels, kernel_size=(3,3,3), padding=(1,1,1))) |
|
self.task_bparts.add_module(tag + "_LRelu_1", torch.nn.ReLU(inplace=True)) |
|
self.task_bparts.add_module(tag + "_Conv3D_2", torch.nn.Conv3d(in_channels=inter_channels, out_channels=inter_channels, kernel_size=(3,3,3), padding=(1,1,1))) |
|
self.task_bparts.add_module(tag + "_LRelu_2", torch.nn.ReLU(inplace=True)) |
|
self.task_bparts.add_module(tag + "_Conv3D_3", torch.nn.Conv3d(in_channels=inter_channels, out_channels=inter_channels, kernel_size=(3,3,3), padding=(1,1,1))) |
|
self.task_bparts.add_module(tag + "_LRelu_3", torch.nn.ReLU(inplace=True)) |
|
self.task_bparts.add_module(tag + "_Conv3D_4", torch.nn.Conv3d(in_channels=inter_channels, out_channels=inter_channels, kernel_size=(1,1,1), padding=(0,0,0))) |
|
self.task_bparts.add_module(tag + "_LRelu_4", torch.nn.ReLU(inplace=True)) |
|
self.task_bparts.add_module(tag + "_Conv3D_5", torch.nn.Conv3d(in_channels=inter_channels, out_channels=self.count_bparts, kernel_size=(1,1,1), padding=(0,0,0))) |
|
|
|
def forward(self, x): |
|
return self.task_bparts(x) |
|
|
|
def get_interpolated(x, align_corners_interpolate=False): |
|
return torch.nn.functional.interpolate(x, scale_factor=4, mode='trilinear', align_corners=align_corners_interpolate) |
|
|
|
def print_gpustats(): |
|
import os |
|
info = nvmlDeviceGetMemoryInfo(nvmlDeviceGetHandleByIndex(int(os.environ['CUDA_VISIBLE_DEVICES']))) |
|
str_gpu = '%.4f' % (info.used/1024/1024/1000) + '/' + '%.4f' % (info.total/1024/1024/1000) + ' GB' |
|
print (' - GPU: ' + str_gpu) |
|
|
|
class VoxelNetOrig(torch.nn.Module): |
|
def __init__(self, count_joints, count_bparts, iters=1 |
|
, output='raw', nonlinearity_order='first', batch_norm=True |
|
, net_interpolate=False, inference_only=False, align_corners_interpolate=False): |
|
super(VoxelNetOrig, self).__init__() |
|
|
|
self.count_joints = count_joints |
|
self.count_bparts = count_bparts |
|
self.net_interpolate = net_interpolate |
|
self.align_corners_interpolate = align_corners_interpolate |
|
self.iters = iters |
|
|
|
self.x_backbone_net = VoxelNetFeatOrig().cuda() |
|
self.x_joints1_net = VoxelNetJointOrig(self.count_joints, in_channels=128, inter_channels=128, tag="Joints1").cuda() |
|
self.x_bparts1_net = VoxelNetBPartOrig(self.count_bparts, in_channels=128, inter_channels=128, tag="BParts1").cuda() |
|
|
|
if self.iters == 3: |
|
self.x_joints2_net = VoxelNetJointOrig(self.count_joints, in_channels=128 + self.count_joints + self.count_bparts, inter_channels=128, tag="Joints2").cuda() |
|
self.x_bparts2_net = VoxelNetBPartOrig(self.count_bparts, in_channels=128 + self.count_joints + self.count_bparts, inter_channels=128, tag="BParts2").cuda() |
|
|
|
self.x_joints3_net = VoxelNetJointOrig(self.count_joints, in_channels=128 + self.count_joints + self.count_bparts, inter_channels=128, tag="Joints3").cuda() |
|
self.x_bparts3_net = VoxelNetBPartOrig(self.count_bparts, in_channels=128 + self.count_joints + self.count_bparts, inter_channels=128, tag="BParts3").cuda() |
|
|
|
def forward(self, x): |
|
|
|
x_backbone = self.x_backbone_net(x) |
|
x_joints1 = self.x_joints1_net(x_backbone) |
|
x_bparts1 = self.x_bparts1_net(x_backbone) |
|
|
|
if self.iters == 1: |
|
if self.net_interpolate is False: |
|
return [], [x_joints1], [x_bparts1] |
|
else: |
|
x_joints1_interpolate = get_interpolated(x_joints1) |
|
x_bparts1_interpolate = get_interpolated(x_bparts1) |
|
return x_backbone, [x_joints1, x_joints1_interpolate], [x_bparts1, x_bparts1_interpolate] |
|
|
|
if self.iters == 3: |
|
x_iter1_op = torch.cat([x_backbone, x_joints1, x_bparts1], dim=1) |
|
x_joints2 = self.x_joints2_net(x_iter1_op) |
|
x_bparts2 = self.x_bparts2_net(x_iter1_op) |
|
|
|
x_iter2_op = torch.cat([x_backbone, x_joints2, x_bparts2], dim=1) |
|
x_joints3 = self.x_joints3_net(x_iter2_op) |
|
x_bparts3 = self.x_bparts3_net(x_iter2_op) |
|
|
|
if self.net_interpolate is False: |
|
return [], [x_joints1, x_joints2, x_joints3], [x_bparts1, x_bparts2, x_bparts3] |
|
else: |
|
x_joints1_interpolate = get_interpolated(x_joints1) |
|
x_bparts1_interpolate = get_interpolated(x_bparts1) |
|
return [], [x_joints1, x_joints1_interpolate, x_joints2, [], x_joints3, []], [x_bparts1, x_bparts1_interpolate, x_bparts2, [], x_bparts3, []] |
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
x = torch.rand(1,1,256,256,160).float() |
|
|
|
if 1: |
|
net = VoxelNetOrig(count_joints=8, count_bparts=7).cuda() |
|
if 0: |
|
x_backbone, x_joints, x_bparts = net(x.cuda()) |
|
print (' - [VoxelNetOrig] x_joints1: ', x_joints[0].shape, ' || x_bparts: ', x_bparts[0].shape) |
|
print_gpustats() |
|
else: |
|
from torchsummary import summary |
|
summary(net.cuda(), input_size=(1,256,256,160)) |