diff --git a/scripts/dataset.py b/scripts/dataset.py new file mode 100644 index 00000000..00b941a9 --- /dev/null +++ b/scripts/dataset.py @@ -0,0 +1,27 @@ +import os + +import context +import datatypes + +def load_dataset(images_dir, args, photos): + + # check if the extension is sopported + def supported_extension(file_name): + (pathfn, ext) = os.path.splitext(file_name) + return ext.lower() in context.supported_extensions + + # find files in the given directory + files = os.listdir(images_dir) + + # filter images for its extension type + # by now only 'jpg' and 'jpeg are supported + files = [f for f in files if supported_extension(f)] + + #photos = [] + + # create ODMPhoto list + for f in files: + file_name = os.path.join(images_dir, f) + photos.append(datatypes.ODMPhoto(file_name, args)) + + #return photos \ No newline at end of file diff --git a/scripts/datatypes.py b/scripts/datatypes.py index 17a345b2..8333ff86 100644 --- a/scripts/datatypes.py +++ b/scripts/datatypes.py @@ -2,11 +2,11 @@ import os import subprocess import log -import context +import dataset from tasks import ODMTaskManager class ODMApp: - ''' ODMJob - a class for ODM Activities + ''' ODMApp - a class for ODM Activities ''' def __init__(self, images_dir, args=None): # Internal app config @@ -14,11 +14,12 @@ class ODMApp: self.images_dir = os.path.abspath(images_dir) # Initialize odm photos - self.photos = self.init_photos(self.images_dir, self.args) + #self.photos = dataset.load_dataset(self.images_dir, self.args) + self.photos = [] # Task manager # configure and schedule tasks - self.task_manager = ODMTaskManager() + self.task_manager = ODMTaskManager(self) # Run all tasks given an starting point def run(self, initial_task_id): @@ -27,30 +28,6 @@ class ODMApp: self.task_manager.run_tasks() - def init_photos(self, images_dir, args): - - # check if the extension is sopported - def supported_extension(file_name): - (pathfn, ext) = os.path.splitext(file_name) - return ext.lower() in context.supported_extensions - - # find files in the given directory - files = os.listdir(images_dir) - - # filter images for its extension type - # by now only 'jpg' and 'jpeg are supported - files = [f for f in files if supported_extension(f)] - - photos = [] - - # create ODMPhoto list - for f in files: - file_name = os.path.join(images_dir, f) - photos.append(ODMPhoto(file_name, args)) - - return photos - - class ODMPhoto: """ ODMPhoto - a class for ODMPhotos """ @@ -92,6 +69,11 @@ class ODMPhoto: # TODO(edgar): compute global min/max # def compute_min_max() + # min_width = min(min_width, width) + # max_width = max(max_width, width) + # min_height = min(min_height, heigth) + # max_height = max(max_height, height) + ## populate & update max/mins # #if objODMJob.minWidth == 0: diff --git a/scripts/tasks.py b/scripts/tasks.py index dbdad6b5..f4502212 100644 --- a/scripts/tasks.py +++ b/scripts/tasks.py @@ -2,27 +2,33 @@ import log import resize import opensfm +import datatypes + +from dataset import load_dataset +from resize import resize # Define pipeline tasks -tasks_dict = { '0': 'resize', - '1': 'opensfm', - '2': 'cmvs', - '3': 'pmvs', - '4': 'odm_meshing', - '5': 'odm_texturing', - '6': 'odm_georeferencing', - '7': 'odm_orthophoto', - '8': 'zip_results' } +tasks_dict = { '0': 'load_dataset', + '1': 'resize', + '2': 'opensfm', + '3': 'cmvs', + '4': 'pmvs', + '5': 'odm_meshing', + '6': 'odm_texturing', + '7': 'odm_georeferencing', + '8': 'odm_orthophoto', + '9': 'zip_results' } class ODMTaskManager(object): """docstring for ODMTaskManager""" - def __init__(self): + def __init__(self, odm_app): + self.odm_app = odm_app self.initial_task_id = 0 self.current_task_id = 0 - self.tasks = self.init_tasks(tasks_dict) + self.tasks = self.init_tasks(tasks_dict, self.odm_app) - def init_tasks(self, _tasks_dict): + def init_tasks(self, _tasks_dict, _odm_app): # dict to store tasks objects tasks = {} @@ -37,79 +43,57 @@ class ODMTaskManager(object): # Setup each tasks i/o command = None - if task_name == 'resize': + if task_name == 'load_dataset': # setup this task - num_inputs = 1 - num_outputs = 1 - command = task_name + '.' + task_name - inputs = {} - outputs = {} + command = load_dataset + inputs = { 'images_dir': _odm_app.images_dir, + 'args': _odm_app.args , + 'photos': _odm_app.photos } + + elif task_name == 'resize': + # setup this task + command = resize + inputs = { 'photos': _odm_app.photos } elif task_name == 'opensfm': # setup this task - num_inputs = 0 - num_outputs = 0 inputs = {} - outputs = {} elif task_name == 'cmvs': # setup this task - num_inputs = 0 - num_outputs = 0 inputs = {} - outputs = {} elif task_name == 'pmvs': # setup this task - num_inputs = 0 - num_outputs = 0 inputs = {} - outputs = {} elif task_name == 'odm_meshing': # setup this task - num_inputs = 0 - num_outputs = 0 inputs = {} - outputs = {} elif task_name == 'odm_texturing': # setup this task - num_inputs = 0 - num_outputs = 0 inputs = {} - outputs = {} elif task_name == 'odm_georeferencing': # setup this task - num_inputs = 0 - num_outputs = 0 inputs = {} - outputs = {} elif task_name == 'odm_orthophoto': # setup this task - num_inputs = 0 - num_outputs = 0 inputs = {} - outputs = {} elif task_name == 'zip_results': # setup this task - num_inputs = 0 - num_outputs = 0 inputs = {} - outputs = {} - else: - log.ODM_ERROR('task_name %s is not valid' % task_name) - # setup values + else: + log.ODM_ERROR('task_name %s is not valid' % task_name) + + # setup task configuration task = tasks[key] task.command = command - task.num_inputs = num_inputs - task.num_outputs = num_outputs task.inputs = inputs - task.outputs = outputs return tasks @@ -119,6 +103,7 @@ class ODMTaskManager(object): # catch task with current id task = self.tasks[str(id)] # update task tracking + log.ODM_INFO('Running task %s: %s' % (task.id, task.name)) self.current_task_id = task.id # run task task.state = task.run() @@ -130,33 +115,23 @@ class ODMTask(object): # task definition self.id = id self.name = name - self.command = None - # task i/o - self.num_inputs = 0 - self.num_outputs = 0 + self.command = None self.inputs = {} - self.num_outputs = {} - # Current task state (0:waiting, 1:running, 2:succeded: 3:failed) # By default we set a task in waiting state self.state = 0 # Launch task def run(self): - - log.ODM_INFO('Running task %s %s ' % (self.id, self.name)) - # while doing something self.state = 1 self.launch_command() - # if succeeded with current task if True: self.state = 2 else: self.state = 3 - # Return task state return self.state @@ -164,12 +139,11 @@ class ODMTask(object): if self.command is None: log.ODM_ERROR('Call method for task %s not defined' % self.name) return - - method_call_str = str(self.command) + '()' + # run configured conmmand try: - eval(method_call_str) + self.command(**self.inputs) except Exception, e: - log.ODM_ERROR('Method %s cannot be called' % method_call_str) + log.ODM_ERROR('Method %s cannot be called' % str(self.command)) log.ODM_ERROR(str(e))