|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import os |
|
|
from abc import abstractmethod |
|
|
from pathlib import Path |
|
|
|
|
|
from pytorch3d.transforms import RotateAxisAngle |
|
|
|
|
|
|
|
|
class Instance: |
|
|
def __init__(self): |
|
|
self.mount = '/home/wzielonka/Cluster/lustre' |
|
|
self.dst = 'empty' |
|
|
self.src = 'empty' |
|
|
self.device = 'cuda:0' |
|
|
self.actors = [] |
|
|
self.use_mount = os.path.exists(self.mount) |
|
|
|
|
|
def get_dst(self): |
|
|
return self.dst if not self.use_mount else self.mount + self.dst |
|
|
|
|
|
def get_src(self): |
|
|
return self.src if not self.use_mount else self.mount + self.src |
|
|
|
|
|
@abstractmethod |
|
|
def get_min_det_score(self): |
|
|
return 0 |
|
|
|
|
|
@abstractmethod |
|
|
def preprocess(self): |
|
|
pass |
|
|
|
|
|
@abstractmethod |
|
|
def get_images(self): |
|
|
return {} |
|
|
|
|
|
@abstractmethod |
|
|
def get_flame_params(self): |
|
|
return {} |
|
|
|
|
|
@abstractmethod |
|
|
def get_registrations(self): |
|
|
return {} |
|
|
|
|
|
@abstractmethod |
|
|
def get_meshes(self): |
|
|
return {} |
|
|
|
|
|
@abstractmethod |
|
|
def transform_mesh(self, path): |
|
|
return None |
|
|
|
|
|
@abstractmethod |
|
|
def transform_image(self, img): |
|
|
return [img] |
|
|
|
|
|
@abstractmethod |
|
|
def transform_path(self, file): |
|
|
return Path(file).name |
|
|
|
|
|
@abstractmethod |
|
|
def get_rotations(self): |
|
|
rots = {} |
|
|
degree = 2.5 |
|
|
step = int(15 / degree / 2) |
|
|
X = range(-step, step + 1) |
|
|
degree = 8.0 |
|
|
step = int(144 / degree / 2) |
|
|
Y = range(-step, step + 1) |
|
|
for a, angles in [('X', X), ('Y', Y)]: |
|
|
r = [] |
|
|
for i in angles: |
|
|
r.append((RotateAxisAngle(float(degree * i), axis=a, device=self.device), float(degree * i))) |
|
|
rots[a] = r |
|
|
return rots |
|
|
|
|
|
@abstractmethod |
|
|
def update_obj(self, path, fix_mtl=False): |
|
|
mesh = Path(path).stem |
|
|
with open(path, 'r') as file: |
|
|
filedata = file.readlines() |
|
|
|
|
|
input = [] |
|
|
for line in filedata: |
|
|
if 'usemtl' in line or 'newmtl' in line: |
|
|
continue |
|
|
input.append(line) |
|
|
|
|
|
output = [] |
|
|
for line in input: |
|
|
if 'mtllib' in line: |
|
|
mtl = line.split(' ')[-1].split('.')[0] |
|
|
line += f'usemtl {mtl}\n' |
|
|
output.append(line) |
|
|
with open(path, 'w') as file: |
|
|
file_lines = "".join(output) |
|
|
file.write(file_lines) |
|
|
|
|
|
if not fix_mtl: |
|
|
return |
|
|
|
|
|
with open(path.replace('obj', 'mtl'), 'r') as file: |
|
|
filedata = file.readlines() |
|
|
|
|
|
output = [] |
|
|
for line in filedata: |
|
|
if 'newmtl' in line: |
|
|
line = 'newmtl ' + mesh + '\n' |
|
|
output.append(line) |
|
|
with open(path.replace('obj', 'mtl'), 'w') as file: |
|
|
file_lines = "".join(output) |
|
|
file.write(file_lines) |
|
|
|