panlabel 0.7.0

The universal annotation converter
Documentation
mod common;

use assert_cmd::cargo::cargo_bin_cmd;
use predicates::prelude::*;
use std::fs;
use tempfile::tempdir;

#[test]
fn list_formats_includes_eight_new_bbox_adapters() {
    let mut cmd = cargo_bin_cmd!("panlabel");
    cmd.args(["list-formats", "--output-format", "json"]);
    cmd.assert()
        .success()
        .stdout(predicate::str::contains("datumaro"))
        .stdout(predicate::str::contains("wider-face"))
        .stdout(predicate::str::contains("oidv4"))
        .stdout(predicate::str::contains("bdd100k"))
        .stdout(predicate::str::contains("v7-darwin"))
        .stdout(predicate::str::contains("edge-impulse"))
        .stdout(predicate::str::contains("openlabel"))
        .stdout(predicate::str::contains("via-csv"));
}

#[test]
fn via_csv_alias_converts_but_via_remains_json_name() {
    let dir = tempdir().unwrap();
    let out = dir.path().join("via.csv");
    let mut cmd = cargo_bin_cmd!("panlabel");
    cmd.args([
        "convert",
        "-f",
        "ir-json",
        "-t",
        "vgg-via-csv",
        "-i",
        "tests/fixtures/sample_valid.ir.json",
        "-o",
        out.to_str().unwrap(),
        "--allow-lossy",
    ]);
    cmd.assert()
        .success()
        .stdout(predicate::str::contains("Converted"));
    let csv = fs::read_to_string(out).unwrap();
    assert!(csv.starts_with("filename,file_size,file_attributes,region_count,region_id,region_shape_attributes,region_attributes"));

    let mut list = cargo_bin_cmd!("panlabel");
    list.args(["list-formats", "--output-format", "json"]);
    list.assert()
        .success()
        .stdout(predicate::str::contains("\"name\":\"via\""))
        .stdout(predicate::str::contains("\"name\":\"via-csv\""));
}

#[test]
fn auto_detects_datumaro_bdd_openlabel_edge_and_via_csv() {
    let dir = tempdir().unwrap();
    let datumaro = dir.path().join("datumaro.json");
    fs::write(&datumaro, r#"{"categories":{"label":{"labels":[{"name":"cat"}]}},"items":[{"id":"a.bmp","image":{"path":"a.bmp","size":[80,100]},"annotations":[{"type":"bbox","bbox":[1,2,3,4],"label_id":0}]}]}"#).unwrap();
    let bdd = dir.path().join("bdd.json");
    fs::write(&bdd, r#"[{"name":"a.bmp","width":100,"height":80,"labels":[{"category":"cat","box2d":{"x1":1,"y1":2,"x2":4,"y2":6}}]}]"#).unwrap();
    let openlabel = dir.path().join("openlabel.json");
    fs::write(&openlabel, r#"{"openlabel":{"objects":{"1":{"type":"cat"}},"frames":{"0":{"frame_properties":{"file_name":"a.bmp","width":100,"height":80},"objects":{"1":{"object_data":{"bbox":[{"name":"cat","val":[2.5,4,3,4]}]}}}}}}}"#).unwrap();
    let edge_dir = dir.path().join("edge");
    fs::create_dir_all(&edge_dir).unwrap();
    fs::write(edge_dir.join("bounding_boxes.labels"), r#"{"version":1,"type":"bounding-box-labels","files":[{"path":"a.bmp","boundingBoxes":[{"label":"cat","x":1,"y":2,"width":3,"height":4}]}]}"#).unwrap();
    fs::write(dir.path().join("a.bmp"), common::bmp_bytes(100, 80)).unwrap();
    let via = dir.path().join("via.csv");
    fs::write(&via, "filename,file_size,file_attributes,region_count,region_id,region_shape_attributes,region_attributes\na.bmp,,{},1,0,\"{\"\"name\"\":\"\"rect\"\",\"\"x\"\":1,\"\"y\"\":2,\"\"width\"\":3,\"\"height\"\":4}\",\"{\"\"label\"\":\"\"cat\"\"}\"\n").unwrap();

    for input in [&datumaro, &bdd, &openlabel, &via] {
        let out = dir.path().join(format!(
            "{}.ir.json",
            input.file_stem().unwrap().to_string_lossy()
        ));
        let mut cmd = cargo_bin_cmd!("panlabel");
        cmd.args([
            "convert",
            "-f",
            "auto",
            "-t",
            "ir-json",
            "-i",
            input.to_str().unwrap(),
            "-o",
            out.to_str().unwrap(),
        ]);
        cmd.assert().success();
    }
    let edge_out = dir.path().join("edge.ir.json");
    let mut cmd = cargo_bin_cmd!("panlabel");
    cmd.args([
        "convert",
        "-f",
        "auto",
        "-t",
        "ir-json",
        "-i",
        edge_dir.to_str().unwrap(),
        "-o",
        edge_out.to_str().unwrap(),
    ]);
    cmd.assert().success();
}