Переглянути джерело

Rename labelme_json_to_dataset -> labelme_export_json

Kentaro Wada 1 рік тому
батько
коміт
09b0812a94

+ 1 - 1
examples/tutorial/README.md

@@ -26,7 +26,7 @@ To convert the json to set of image and label, you can run following:
 
 
 ```bash
-labelme_json_to_dataset apc2016_obj3.json -o apc2016_obj3_json
+labelme_export_json apc2016_obj3.json -o apc2016_obj3_json
 ```
 
 It generates standard files from the JSON file.

+ 1 - 1
labelme/cli/__init__.py

@@ -2,5 +2,5 @@
 
 from . import draw_json
 from . import draw_label_png
-from . import json_to_dataset
+from . import export_json
 from . import on_docker

+ 72 - 0
labelme/cli/export_json.py

@@ -0,0 +1,72 @@
+import argparse
+import base64
+import json
+import os
+import os.path as osp
+
+import imgviz
+import PIL.Image
+
+from labelme.logger import logger
+from labelme import utils
+
+
+def main():
+    parser = argparse.ArgumentParser()
+    parser.add_argument("json_file")
+    parser.add_argument("-o", "--out", default=None)
+    args = parser.parse_args()
+
+    json_file = args.json_file
+
+    if args.out is None:
+        out_dir = osp.basename(json_file).replace(".", "_")
+        out_dir = osp.join(osp.dirname(json_file), out_dir)
+    else:
+        out_dir = args.out
+    if not osp.exists(out_dir):
+        os.mkdir(out_dir)
+
+    data = json.load(open(json_file))
+    imageData = data.get("imageData")
+
+    if not imageData:
+        imagePath = os.path.join(os.path.dirname(json_file), data["imagePath"])
+        with open(imagePath, "rb") as f:
+            imageData = f.read()
+            imageData = base64.b64encode(imageData).decode("utf-8")
+    img = utils.img_b64_to_arr(imageData)
+
+    label_name_to_value = {"_background_": 0}
+    for shape in sorted(data["shapes"], key=lambda x: x["label"]):
+        label_name = shape["label"]
+        if label_name in label_name_to_value:
+            label_value = label_name_to_value[label_name]
+        else:
+            label_value = len(label_name_to_value)
+            label_name_to_value[label_name] = label_value
+    lbl, _ = utils.shapes_to_label(
+        img.shape, data["shapes"], label_name_to_value
+    )
+
+    label_names = [None] * (max(label_name_to_value.values()) + 1)
+    for name, value in label_name_to_value.items():
+        label_names[value] = name
+
+    lbl_viz = imgviz.label2rgb(
+        lbl, imgviz.asgray(img), label_names=label_names, loc="rb"
+    )
+
+    PIL.Image.fromarray(img).save(osp.join(out_dir, "img.png"))
+    utils.lblsave(osp.join(out_dir, "label.png"), lbl)
+    PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir, "label_viz.png"))
+
+    with open(osp.join(out_dir, "label_names.txt"), "w") as f:
+        for lbl_name in label_names:
+            f.write(lbl_name + "\n")
+
+    logger.info("Saved to: {}".format(out_dir))
+
+
+if __name__ == "__main__":
+    main()

+ 5 - 4
labelme/cli/json_to_dataset.py

@@ -13,12 +13,13 @@ from labelme import utils
 
 def main():
     logger.warning(
-        "This script is aimed to demonstrate how to convert the "
-        "JSON file to a single image dataset."
+        "DEPRECATED: This script will be removed in the near future. "
+        "Please use `labelme_export_json` instead."
     )
     logger.warning(
-        "It won't handle multiple JSON files to generate a "
-        "real-use dataset."
+        "NOTE: This script is aimed to demonstrate how to convert a JSON file "
+        "to a single image dataset. so it won't handle multiple JSON files to "
+        "generate a real-use dataset."
     )
 
     parser = argparse.ArgumentParser()

+ 1 - 0
setup.py

@@ -151,6 +151,7 @@ def main():
                 "labelme_draw_json=labelme.cli.draw_json:main",
                 "labelme_draw_label_png=labelme.cli.draw_label_png:main",
                 "labelme_json_to_dataset=labelme.cli.json_to_dataset:main",
+                "labelme_export_json=labelme.cli.export_json:main",
                 "labelme_on_docker=labelme.cli.on_docker:main",
             ],
         },