OpenDroneMap-ODM/scripts/tasks.py

151 wiersze
3.6 KiB
Python
Czysty Zwykły widok Historia

2015-11-17 11:54:56 +00:00
import log
2015-11-18 16:41:20 +00:00
import system
2015-11-17 11:23:12 +00:00
2015-11-17 12:28:11 +00:00
import opensfm
2015-11-18 13:51:05 +00:00
import datatypes
from resize import resize
2015-11-18 16:41:20 +00:00
from dataset import load_dataset
2015-11-19 14:46:30 +00:00
from opensfm import opensfm
2015-11-17 12:28:11 +00:00
2015-11-17 11:23:12 +00:00
# Define pipeline tasks
2015-11-18 13:51:05 +00:00
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' }
2015-11-17 11:23:12 +00:00
class ODMTaskManager(object):
"""docstring for ODMTaskManager"""
2015-11-18 13:51:05 +00:00
def __init__(self, odm_app):
self.odm_app = odm_app
2015-11-17 11:23:12 +00:00
self.initial_task_id = 0
self.current_task_id = 0
2015-11-18 13:51:05 +00:00
self.tasks = self.init_tasks(tasks_dict, self.odm_app)
2015-11-17 11:23:12 +00:00
2015-11-18 13:51:05 +00:00
def init_tasks(self, _tasks_dict, _odm_app):
2015-11-17 11:23:12 +00:00
# dict to store tasks objects
tasks = {}
# loop over tasks dict
for key, in _tasks_dict:
# instantiate and append ODMTask
task_name = _tasks_dict[key]
tasks[key] = ODMTask(key, task_name)
2015-11-19 12:03:03 +00:00
2015-11-18 16:51:47 +00:00
# setup tasks
2015-11-18 13:51:05 +00:00
if task_name == 'load_dataset':
2015-11-17 11:23:12 +00:00
# setup this task
2015-11-18 13:51:05 +00:00
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
2015-11-19 12:03:03 +00:00
inputs = { 'images_dir': _odm_app.images_dir,
'args': _odm_app.args ,
'photos': _odm_app.photos }
2015-11-17 11:23:12 +00:00
elif task_name == 'opensfm':
# setup this task
2015-11-19 14:46:30 +00:00
command = opensfm
inputs = { 'images_dir': _odm_app.images_dir }
2015-11-17 11:23:12 +00:00
elif task_name == 'cmvs':
# setup this task
2015-11-18 16:51:47 +00:00
command = None
2015-11-17 11:23:12 +00:00
inputs = {}
elif task_name == 'pmvs':
# setup this task
2015-11-18 16:51:47 +00:00
command = None
2015-11-17 11:23:12 +00:00
inputs = {}
elif task_name == 'odm_meshing':
# setup this task
2015-11-18 16:51:47 +00:00
command = None
2015-11-17 11:23:12 +00:00
inputs = {}
elif task_name == 'odm_texturing':
# setup this task
2015-11-18 16:51:47 +00:00
command = None
2015-11-17 11:23:12 +00:00
inputs = {}
elif task_name == 'odm_georeferencing':
# setup this task
2015-11-18 16:51:47 +00:00
command = None
2015-11-17 11:23:12 +00:00
inputs = {}
elif task_name == 'odm_orthophoto':
# setup this task
2015-11-18 16:51:47 +00:00
command = None
2015-11-17 11:23:12 +00:00
inputs = {}
elif task_name == 'zip_results':
# setup this task
2015-11-18 16:51:47 +00:00
command = None
2015-11-17 11:23:12 +00:00
inputs = {}
2015-11-18 13:51:05 +00:00
2015-11-17 11:23:12 +00:00
else:
2015-11-18 13:51:05 +00:00
log.ODM_ERROR('task_name %s is not valid' % task_name)
2015-11-17 11:23:12 +00:00
2015-11-18 13:51:05 +00:00
# setup task configuration
2015-11-17 11:23:12 +00:00
task = tasks[key]
2015-11-17 12:28:11 +00:00
task.command = command
2015-11-17 11:28:31 +00:00
task.inputs = inputs
2015-11-17 11:23:12 +00:00
return tasks
def run_tasks(self):
for id in range(self.initial_task_id, len(self.tasks)):
# catch task with current id
task = self.tasks[str(id)]
# update task tracking
2015-11-18 13:51:05 +00:00
log.ODM_INFO('Running task %s: %s' % (task.id, task.name))
2015-11-17 11:23:12 +00:00
self.current_task_id = task.id
# run task
task.state = task.run()
2015-11-18 16:41:20 +00:00
if task.state == 2:
log.ODM_INFO('Succeeded task %s: %s - %s' % (task.id, task.name, system.now()))
else:
log.ODM_ERROR('Aborted task %s: %s' % (task.id, task.name))
2015-11-17 11:23:12 +00:00
class ODMTask(object):
"""docstring for ODMTask"""
def __init__(self, id, name):
# task definition
self.id = id
self.name = name
# task i/o
2015-11-18 13:51:05 +00:00
self.command = None
2015-11-17 11:23:12 +00:00
self.inputs = {}
# 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):
# while doing something
self.state = 1
2015-11-18 16:41:20 +00:00
return self.launch_command()
2015-11-17 12:28:11 +00:00
def launch_command(self):
if self.command is None:
log.ODM_ERROR('Call method for task %s not defined' % self.name)
2015-11-18 16:41:20 +00:00
return 3 # failed
# run conmmand
2015-11-17 12:28:11 +00:00
try:
2015-11-18 16:41:20 +00:00
succeed = self.command(**self.inputs)
return 2 if succeed else 3 # 2:succeed, 3:failed
2015-11-17 12:28:11 +00:00
except Exception, e:
2015-11-18 13:51:05 +00:00
log.ODM_ERROR('Method %s cannot be called' % str(self.command))
2015-11-17 12:38:24 +00:00
log.ODM_ERROR(str(e))
2015-11-18 16:41:20 +00:00
return 3 # failed