diff --git a/src/Taggers.jl b/src/Taggers.jl index 833096a3c396afeb5a258c4497bf2f17ccbaada4..dbfccf2eaba740b45c9c0c01dc164cbf29bc8644 100644 --- a/src/Taggers.jl +++ b/src/Taggers.jl @@ -8,14 +8,18 @@ struct Tagger backend_dir::String model_instance::String sandbox::Union{Nothing, String} + output_filenames::Dict{String, String} end -Tagger(backend_dir, model_instance) = Tagger(backend_dir, model_instance, nothing) +function Tagger(backend_dir, model_instance) + Tagger(backend_dir, model_instance, nothing, Dict{String, String}()) +end function isolate(tagger) mkpath(joinpath(tagger.backend_dir, "data", "raw")) rawdatadir = mktempdir(joinpath(tagger.backend_dir, "data", "raw"); cleanup=false) - Tagger(tagger.backend_dir, tagger.model_instance, basename(rawdatadir)) + Tagger(tagger.backend_dir, tagger.model_instance, basename(rawdatadir), + tagger.output_filenames) end isbackend(path) = isdir(joinpath(path, "models")) && @@ -134,7 +138,8 @@ function pull(tagger::Tagger, dest_dir::String) parent′= joinpath(dest_dir, relpath(parent, proc_data_dir)) for file in files src_file = normpath(joinpath(parent, file)) - dest_file = normpath(joinpath(parent′, file)) + file′= get(tagger.output_filenames, file, file) + dest_file = normpath(joinpath(parent′, file′)) if dest_file != src_file open(src_file, "r") do f open(dest_file, "w") do g diff --git a/src/cli.jl b/src/cli.jl index 9fdf28250fcc86fb906e1370f79181e432c66bb7..ab9a0341feff42dd394f059febff75c9314090e4 100644 --- a/src/cli.jl +++ b/src/cli.jl @@ -11,8 +11,8 @@ usage = """Larva Tagger. Usage: larvatagger.jl open <file-path> [--backends=<path>] [--port=<number>] [--quiet] [--viewer] [--browser] [--manual-label=<label>] larvatagger.jl import <input-path> [<output-file>] [--id=<id>] [--framerate=<fps>] [--pixelsize=<μm>] [--overrides=<comma-separated-list>] [--default-label=<label>] [--manual-label=<label>] [--decode] - larvatagger.jl train <backend-path> <data-path> <model-instance> [--pretrained-model=<instance>] [--labels=<comma-separated-list>] [--sample-size=<N>] [--balancing-strategy=<strategy>] [--class-weights=<csv>] [--manual-label=<label>] [--layers=<N>] [--iterations=<N>] - larvatagger.jl predict <backend-path> <model-instance> <data-path> [--make-dataset] [--skip-make-dataset] [--data-isolation] + larvatagger.jl train <backend-path> <data-path> <model-instance> [--pretrained-model=<instance>] [--labels=<comma-separated-list>] [--sample-size=<N>] [--balancing-strategy=<strategy>] [--class-weights=<csv>] [--manual-label=<label>] [--layers=<N>] [--iterations=<N>] [--seed=<seed>] + larvatagger.jl predict <backend-path> <model-instance> <data-path> [--output=<filename>] [--make-dataset] [--skip-make-dataset] [--data-isolation] larvatagger.jl merge <input-path> <input-file> [<output-file>] [--manual-label=<label>] [--decode] larvatagger.jl -V | --version larvatagger.jl -h | --help @@ -34,6 +34,7 @@ Options: --sample-size=<N> Sample only N track segments from the data repository. --layers=<N> (MaggotUBA) Number of layers of the classifier. --iterations=<N> (MaggotUBA) Number of training iterations (can be two integers separated by a comma). + --seed=<seed> Seed for the backend's random number generators. --decode Do not encode the labels into integer indices. --default-label=<label> Label all untagged data as <label>. --manual-label=<label> Secondary label for manually labelled data [default: edited]. @@ -42,6 +43,7 @@ Options: --pretrained-model=<instance> Name of the pretrained encoder (from `pretrained_models` registry). --balancing-strategy=<strategy> Any of `auto`, `maggotuba`, `none` [default: auto]. --overrides=<comma-separated-list> Comma-separated list of key:value pairs. + -o <filename> --output=<filename> Predicted labels filename. Commands: diff --git a/src/cli_toolkit.jl b/src/cli_toolkit.jl index b387f2ad3fa7369194e2b1c72cfed4fd59ac80d2..632863c76dd1a3268637090f19aaf4b026ce968d 100644 --- a/src/cli_toolkit.jl +++ b/src/cli_toolkit.jl @@ -15,7 +15,7 @@ usage = """Larva Tagger. Usage: larvatagger-toolkit.jl import <input-path> [<output-file>] [--id=<id>] [--framerate=<fps>] [--pixelsize=<μm>] [--overrides=<comma-separated-list>] [--default-label=<label>] [--manual-label=<label>] [--decode] larvatagger-toolkit.jl train <backend-path> <data-path> <model-instance> [--pretrained-model=<instance>] [--labels=<comma-separated-list>] [--sample-size=<N>] [--balancing-strategy=<strategy>] [--class-weights=<csv>] [--manual-label=<label>] [--layers=<N>] [--iterations=<N>] [--seed=<seed>] - larvatagger-toolkit.jl predict <backend-path> <model-instance> <data-path> [--make-dataset] [--skip-make-dataset] [--data-isolation] + larvatagger-toolkit.jl predict <backend-path> <model-instance> <data-path> [--output=<filename>] [--make-dataset] [--skip-make-dataset] [--data-isolation] larvatagger-toolkit.jl merge <input-path> <input-file> [<output-file>] [--manual-label=<label>] [--decode] larvatagger-toolkit.jl -V | --version larvatagger-toolkit.jl -h | --help @@ -41,6 +41,7 @@ Options: --pretrained-model=<instance> Name of the pretrained encoder (from `pretrained_models` registry). --balancing-strategy=<strategy> Any of `auto`, `maggotuba`, `none` [default: auto]. --overrides=<comma-separated-list> Comma-separated list of key:value pairs. + -o <filename> --output=<filename> Predicted labels filename. Commands: @@ -277,6 +278,7 @@ function main(args=ARGS; exit_on_error=true) model_instance = parsed_args["<model-instance>"] data_path = parsed_args["<data-path>"] data_isolation = parsed_args["--data-isolation"] + output_filename = parsed_args["--output"] # datapath = abspath(data_path) destination = if isfile(datapath) @@ -292,6 +294,9 @@ function main(args=ARGS; exit_on_error=true) end # tagger = Tagger(backend_path, model_instance) + if !isnothing(output_filename) + tagger.output_filenames["predicted.label"] = output_filename + end if data_isolation tagger = Taggers.isolate(tagger) @info "Tagger isolated" sandbox=tagger.sandbox