Added test switch, mock options data

pull/1/head
Piero Toffanin 2016-09-24 20:07:02 -04:00
rodzic 955fc04eca
commit 3230c4b45a
5 zmienionych plików z 249 dodań i 1 usunięć

Wyświetl plik

@ -12,5 +12,6 @@
"port": 3000,
"deamon": false,
"parallelQueueProcessing": 2,
"cleanupTasksAfter": 3
"cleanupTasksAfter": 3,
"test": false
}

Wyświetl plik

@ -33,6 +33,7 @@ Options:
-d, --deamonize Set process to run as a deamon
--parallel_queue_processing <number> Number of simultaneous processing tasks (default: 2)
--cleanup_tasks_after <number> Number of days that elapse before deleting finished and canceled tasks (default: 3)
--test Enable test mode. In test mode, no commands are sent to OpenDroneMap. This can be useful during development or testing (default: false)
Log Levels:
error | debug | info | verbose | debug | silly
`);
@ -76,5 +77,6 @@ config.port = parseInt(argv.port || argv.p || fromConfigFile("port", process.env
config.deamon = argv.deamonize || argv.d || fromConfigFile("daemon", false);
config.parallelQueueProcessing = argv.parallel_queue_processing || fromConfigFile("parallelQueueProcessing", 2);
config.cleanupTasksAfter = argv.cleanup_tasks_after || fromConfigFile("cleanupTasksAfter", 3);
config.test = argv.test || fromConfigFile("test", false);
module.exports = config;

Wyświetl plik

@ -501,6 +501,8 @@ process.on ('SIGTERM', gracefulShutdown);
process.on ('SIGINT', gracefulShutdown);
// Startup
if (config.test) logger.info("Running in test mode");
async.series([
cb => odmOptions.initialize(cb),
cb => { taskManager = new TaskManager(cb); },

Wyświetl plik

@ -16,11 +16,14 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
"use strict";
let fs = require('fs');
let path = require('path');
let assert = require('assert');
let spawn = require('child_process').spawn;
let config = require('../config.js');
let logger = require('./logger');
module.exports = {
run: function(options, done, outputReceived){
assert(options["project-path"] !== undefined, "project-path must be defined");
@ -42,6 +45,15 @@ module.exports = {
logger.info(`About to run: python ${command.join(" ")}`);
if (config.test){
logger.info("Test mode is on, command will not execute");
// TODO: simulate test output
done(null, 0, null);
return; // Skip rest
}
// Launch
let childProcess = spawn("python", command, {cwd: config.odm_path});
@ -56,6 +68,32 @@ module.exports = {
},
getJsonOptions: function(done){
// In test mode, we don't call ODM,
// instead we return a mock
if (config.test){
let optionsTestFile = "../tests/odm_options.json";
fs.readFile(path.resolve(__dirname, optionsTestFile), 'utf8', (err, json) => {
if (!err){
try{
let options = JSON.parse(json);
// We also mark each description with "TEST" (to make sure we know this is not real data)
options.forEach(option => { option.help = "## TEST ##" + (option.help !== undefined ? ` ${option.help}` : ""); });
done(null, options);
}catch(e){
console.log(`Invalid test options ${optionsTestFile}: ${err.message}`);
done(e);
}
}else{
console.log(`Error: ${err.message}`);
done(err);
}
});
return; // Skip rest
}
// Launch
let childProcess = spawn("python", [`${__dirname}/../helpers/odmOptionsToJson.py`,
"--project-path", config.odm_path]);

Wyświetl plik

@ -0,0 +1,205 @@
[
{
"domain": "integer",
"help": "The maximum number of images per cluster. Default: 500",
"name": "cmvs-maxImages",
"type": "int",
"value": "500"
},
{
"domain": "positive integer",
"help": "Oct-tree depth used in the mesh reconstruction, increase to get more vertices, recommended values are 8-12. Default: 9",
"name": "odm_meshing-octreeDepth",
"type": "int",
"value": "9"
},
{
"domain": "positive integer",
"help": "The maximum vertex count of the output mesh Default: 100000",
"name": "odm_meshing-maxVertexCount",
"type": "int",
"value": "100000"
},
{
"domain": "percent",
"help": "Ignore matched keypoints if the two images share less than <float> percent of keypoints. Default: 2",
"name": "matcher-threshold",
"type": "float",
"value": "2"
},
{
"domain": "integer",
"help": "Minimum number of features to extract per image. More features leads to better results but slower execution. Default: 4000",
"name": "min-num-features",
"type": "int",
"value": "4000"
},
{
"domain": "positive float",
"help": "Override the focal length information for the images",
"name": "force-focal",
"type": "float",
"value": "0"
},
{
"domain": "integer",
"help": "resizes images by the largest side",
"name": "resize-to",
"type": "int",
"value": "2400"
},
{
"domain": "positive integer",
"help": "The level in the image pyramid that is used for the computation. see http://www.di.ens.fr/pmvs/documentation.html for more pmvs documentation. Default: 1",
"name": "pmvs-level",
"type": "int",
"value": "1"
},
{
"domain": "float: -1.0 <= x <= 1.0",
"help": "A patch reconstruction is accepted as a success and kept if its associated photometric consistency measure is above this threshold. Default: 0.7",
"name": "pmvs-threshold",
"type": "float",
"value": "0.7"
},
{
"domain": "positive integer",
"help": "Each 3D point must be visible in at least minImageNum images for being reconstructed. 3 is suggested in general. Default: 3",
"name": "pmvs-minImageNum",
"type": "int",
"value": "3"
},
{
"domain": "float >= 1.0",
"help": "Number of points per octree node, recommended and default value: 1",
"name": "odm_meshing-samplesPerNode",
"type": "float",
"value": "1"
},
{
"domain": "string",
"help": "Skip filling of holes in the mesh. Default: false",
"name": "mvs_texturing-skipHoleFilling",
"type": "string",
"value": "false"
},
{
"domain": "string",
"help": "Skip geometric visibility test. Default: false",
"name": "mvs_texturing-skipGlobalSeamLeveling",
"type": "string",
"value": "false"
},
{
"domain": "positive float",
"help": "Override the ccd width information for the images",
"name": "force-ccd",
"type": "float",
"value": "0"
},
{
"domain": "",
"help": "Generates a benchmark file with runtime info\nDefault: false",
"name": "time",
"type": "bool",
"value": "false"
},
{
"domain": "positive integer",
"help": "The resolution of the output textures. Must be greater than textureWithSize. Default: 4096",
"name": "odm_texturing-textureResolution",
"type": "int",
"value": "4096"
},
{
"domain": "integer",
"help": "Distance threshold in meters to find pre-matching images based on GPS exif data. Set to 0 to skip pre-matching. Default: 0",
"name": "matcher-distance",
"type": "int",
"value": "0"
},
{
"domain": "positive integer",
"help": "Cell size controls the density of reconstructionsDefault: 2",
"name": "pmvs-csize",
"type": "int",
"value": "2"
},
{
"domain": "float > 0.0",
"help": "Orthophoto ground resolution in pixels/meterDefault: 20",
"name": "odm_orthophoto-resolution",
"type": "float",
"value": "20"
},
{
"domain": "positive integer",
"help": "Oct-tree depth at which the Laplacian equation is solved in the surface reconstruction step. Increasing this value increases computation times slightly but helps reduce memory usage. Default: 9",
"name": "odm_meshing-solverDivide",
"type": "int",
"value": "9"
},
{
"domain": "positive integer",
"help": "pmvs samples wsize x wsize pixel colors from each image to compute photometric consistency score. For example, when wsize=7, 7x7=49 pixel colors are sampled in each image. Increasing the value leads to more stable reconstructions, but the program becomes slower. Default: 7",
"name": "pmvs-wsize",
"type": "int",
"value": "7"
},
{
"domain": "string",
"help": "Keep faces in the mesh that are not seen in any camera. Default: false",
"name": "mvs_texturing-keepUnseenFaces",
"type": "string",
"value": "false"
},
{
"domain": "positive integer",
"help": "The resolution to rescale the images performing the texturing. Default: 3600",
"name": "odm_texturing-textureWithSize",
"type": "int",
"value": "3600"
},
{
"domain": "string",
"help": "Type of photometric outlier removal method: [none, gauss_damping, gauss_clamping]. Default: none",
"name": "mvs_texturing-outlierRemovalType",
"type": "string",
"value": "none"
},
{
"domain": "integer",
"help": "Number of nearest images to pre-match based on GPS exif data. Set to 0 to skip pre-matching. Neighbors works together with Distance parameter, set both to 0 to not use pre-matching. OpenSFM uses both parameters at the same time, Bundler uses only one which has value, prefering the Neighbors parameter. Default: 8",
"name": "matcher-neighbors",
"type": "int",
"value": "8"
},
{
"domain": "string",
"help": "Skip local seam blending. Default: false",
"name": "mvs_texturing-skipLocalSeamLeveling",
"type": "string",
"value": "false"
},
{
"domain": "string",
"help": "Data term: [area, gmi]. Default: gmi",
"name": "mvs_texturing-dataTerm",
"type": "string",
"value": "gmi"
},
{
"domain": "string",
"help": "Skip geometric visibility test. Default: false",
"name": "mvs_texturing-skipGeometricVisibilityTest",
"type": "string",
"value": "false"
},
{
"domain": "float",
"help": "Ratio of the distance to the next best matched keypoint. Default: 0.6",
"name": "matcher-ratio",
"type": "float",
"value": "0.6"
}
]