diff --git a/examples/tutorial/README.md b/examples/tutorial/README.md index 7ca53996c..289285013 100644 --- a/examples/tutorial/README.md +++ b/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. diff --git a/labelme/cli/__init__.py b/labelme/cli/__init__.py index 21bbbc375..75751a56e 100644 --- a/labelme/cli/__init__.py +++ b/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 diff --git a/labelme/cli/export_json.py b/labelme/cli/export_json.py new file mode 100644 index 000000000..6272d85cf --- /dev/null +++ b/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() diff --git a/labelme/cli/json_to_dataset.py b/labelme/cli/json_to_dataset.py index 78d79f4fb..638d7a0be 100644 --- a/labelme/cli/json_to_dataset.py +++ b/labelme/cli/json_to_dataset.py @@ -13,12 +13,13 @@ 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() diff --git a/setup.py b/setup.py index b9f2a9b3e..dfc6270ce 100644 --- a/setup.py +++ b/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", ], },