From 3107907644e3d00715577394488ea7e67276a994 Mon Sep 17 00:00:00 2001 From: Tully Foote <tullyfoote@intrinsic.ai> Date: Thu, 30 Jan 2025 17:29:51 -0800 Subject: [PATCH 01/12] Create setup.py structure for pip package --- ibpc_py/README.md | 24 ++++++++++++++++++++ ibpc_py/setup.py | 34 +++++++++++++++++++++++++++++ ibpc_py/src/ibpc/__init__.py | 0 ibpc.py => ibpc_py/src/ibpc/ibpc.py | 4 ---- 4 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 ibpc_py/README.md create mode 100644 ibpc_py/setup.py create mode 100644 ibpc_py/src/ibpc/__init__.py rename ibpc.py => ibpc_py/src/ibpc/ibpc.py (98%) diff --git a/ibpc_py/README.md b/ibpc_py/README.md new file mode 100644 index 00000000..6438d02f --- /dev/null +++ b/ibpc_py/README.md @@ -0,0 +1,24 @@ +# Industrial Bin Picking Challenge (IBPC) + +This is the python entrypoint for the Industrial Bin Picking Challenge + +## Usage + +`ibpc <Pose Estimator Image Name> ~/<Path to dataset to test>` + +`ibpc ibpc:pose_estimator ~/ws/ibpc/lm` + + +## Prerequisites + + +### Install the package: + +In a virtualenv +`pip install ibpc` + + +### Nvidia Docker (optoinal) +Make sure nvidia_docker is installed if you want cuda. + +Add `--cuda` to your command line options \ No newline at end of file diff --git a/ibpc_py/setup.py b/ibpc_py/setup.py new file mode 100644 index 00000000..659ff295 --- /dev/null +++ b/ibpc_py/setup.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 + +import os +import setuptools + +with open("README.md", "r") as fh: + long_description = fh.read() + + +setuptools.setup( + name='ibpc', + version="0.0.1", + packages=['ibpc'], + package_dir={'': 'src'}, + # package_data={'ibpc': ['templates/*.em']}, + author="Tully Foote", + author_email="tullyfoote@intrinsic.ai", + description="An entrypoint for the Industrial Bin Picking Challenge", + long_description=long_description, + long_description_content_type="text/markdown", + url="https://bpc.opencv.org/", + license='Apache 2.0', + install_requires=[ + 'empy', + 'rocker>=0.2.13', + ], + install_package_data=True, + zip_safe=False, + entry_points={ + 'console_scripts': [ + 'ibpc = ibpc.ibpc:main', + ], + } +) \ No newline at end of file diff --git a/ibpc_py/src/ibpc/__init__.py b/ibpc_py/src/ibpc/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ibpc.py b/ibpc_py/src/ibpc/ibpc.py similarity index 98% rename from ibpc.py rename to ibpc_py/src/ibpc/ibpc.py index 4c0475c1..43a19d2c 100644 --- a/ibpc.py +++ b/ibpc_py/src/ibpc/ibpc.py @@ -104,7 +104,3 @@ def run_instance(dig_instance, args): result = dig.run(**args_dict) # TODO clean up threads here return result - - -if __name__ == "__main__": - main() From 4c697239ff4e65a77c7342547c5a83b7eb663d45 Mon Sep 17 00:00:00 2001 From: Tully Foote <tullyfoote@intrinsic.ai> Date: Thu, 30 Jan 2025 17:45:15 -0800 Subject: [PATCH 02/12] tempoarry workaround rocker release pending --- ibpc_py/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ibpc_py/README.md b/ibpc_py/README.md index 6438d02f..4daa5029 100644 --- a/ibpc_py/README.md +++ b/ibpc_py/README.md @@ -17,6 +17,9 @@ This is the python entrypoint for the Industrial Bin Picking Challenge In a virtualenv `pip install ibpc` +Temporary before rocker release of https://github.com/osrf/rocker/pull/317/ +`pip uninstall rocker && pip install git+http://github.com/osrf/rocker.git@console_to_file` + ### Nvidia Docker (optoinal) Make sure nvidia_docker is installed if you want cuda. From 057ae80c827f285705bfad070bbe21e3bff2b151 Mon Sep 17 00:00:00 2001 From: Tully Foote <tullyfoote@intrinsic.ai> Date: Thu, 30 Jan 2025 21:45:18 -0800 Subject: [PATCH 03/12] formatting --- ibpc_py/setup.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/ibpc_py/setup.py b/ibpc_py/setup.py index 659ff295..4b812eae 100644 --- a/ibpc_py/setup.py +++ b/ibpc_py/setup.py @@ -8,10 +8,10 @@ setuptools.setup( - name='ibpc', + name="ibpc", version="0.0.1", - packages=['ibpc'], - package_dir={'': 'src'}, + packages=["ibpc"], + package_dir={"": "src"}, # package_data={'ibpc': ['templates/*.em']}, author="Tully Foote", author_email="tullyfoote@intrinsic.ai", @@ -19,16 +19,16 @@ long_description=long_description, long_description_content_type="text/markdown", url="https://bpc.opencv.org/", - license='Apache 2.0', + license="Apache 2.0", install_requires=[ - 'empy', - 'rocker>=0.2.13', + "empy", + "rocker>=0.2.13", ], install_package_data=True, zip_safe=False, entry_points={ - 'console_scripts': [ - 'ibpc = ibpc.ibpc:main', - ], - } -) \ No newline at end of file + "console_scripts": [ + "ibpc = ibpc.ibpc:main", + ], + }, +) From e959f9c06d356bd046d86ab97a07362be4803e53 Mon Sep 17 00:00:00 2001 From: Tully Foote <tullyfoote@intrinsic.ai> Date: Thu, 30 Jan 2025 22:06:36 -0800 Subject: [PATCH 04/12] remove debugging slowdowns and resolved todos --- ibpc_py/src/ibpc/ibpc.py | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/ibpc_py/src/ibpc/ibpc.py b/ibpc_py/src/ibpc/ibpc.py index 43a19d2c..d1b91210 100644 --- a/ibpc_py/src/ibpc/ibpc.py +++ b/ibpc_py/src/ibpc/ibpc.py @@ -76,20 +76,10 @@ def run_instance(dig_instance, args): tester_thread = threading.Thread(target=run_instance, args=(dig_zenoh, zenoh_args)) tester_thread.start() - # TODO Redirect stdout - import time - - time.sleep(3) - tester_thread = threading.Thread( target=run_instance, args=(dig_tester, tester_args) ) tester_thread.start() - # TODO Redirect stdout - - import time - - time.sleep(3) dig = DockerImageGenerator(active_extensions, args_dict, args_dict["test_image"]) @@ -102,5 +92,6 @@ def run_instance(dig_instance, args): args_dict["command"] = "bash" result = dig.run(**args_dict) - # TODO clean up threads here + # TODO clean up th "bpc = ibpc.ibpc:main", +reads here return result From d9f2d04464f73a05bd154de7bc43b86d4b0c6b30 Mon Sep 17 00:00:00 2001 From: Tully Foote <tullyfoote@intrinsic.ai> Date: Thu, 30 Jan 2025 22:23:07 -0800 Subject: [PATCH 05/12] add subcommand test --- ibpc_py/README.md | 4 ++-- ibpc_py/src/ibpc/ibpc.py | 23 +++++++++++++---------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/ibpc_py/README.md b/ibpc_py/README.md index 4daa5029..259b6b56 100644 --- a/ibpc_py/README.md +++ b/ibpc_py/README.md @@ -4,9 +4,9 @@ This is the python entrypoint for the Industrial Bin Picking Challenge ## Usage -`ibpc <Pose Estimator Image Name> ~/<Path to dataset to test>` +`ibpc test <Pose Estimator Image Name> ~/<Path to dataset to test>` -`ibpc ibpc:pose_estimator ~/ws/ibpc/lm` +`ibpc test ibpc:pose_estimator ~/ws/ibpc/lm` ## Prerequisites diff --git a/ibpc_py/src/ibpc/ibpc.py b/ibpc_py/src/ibpc/ibpc.py index d1b91210..4bf10759 100644 --- a/ibpc_py/src/ibpc/ibpc.py +++ b/ibpc_py/src/ibpc/ibpc.py @@ -11,22 +11,26 @@ def main(): - parser = argparse.ArgumentParser( + main_parser = argparse.ArgumentParser( description="The entry point for the Bin Picking Challenge", formatter_class=argparse.ArgumentDefaultsHelpFormatter, ) - parser.add_argument("test_image") - parser.add_argument("dataset_directory") - parser.add_argument( + main_parser.add_argument( "-v", "--version", action="version", version="%(prog)s " + get_rocker_version() ) - parser.add_argument("--debug-inside", action="store_true") + + sub_parsers= main_parser.add_subparsers(title="test") + test_parser = sub_parsers.add_parser("test") + + test_parser.add_argument("estimator_image") + test_parser.add_argument("dataset_directory") + test_parser.add_argument("--debug-inside", action="store_true") extension_manager = RockerExtensionManager() default_args = {"cuda": True, "network": "host"} - extension_manager.extend_cli_parser(parser, default_args) + extension_manager.extend_cli_parser(test_parser, default_args) - args = parser.parse_args() + args = main_parser.parse_args() args_dict = vars(args) # Confirm dataset directory is absolute @@ -81,7 +85,7 @@ def run_instance(dig_instance, args): ) tester_thread.start() - dig = DockerImageGenerator(active_extensions, args_dict, args_dict["test_image"]) + dig = DockerImageGenerator(active_extensions, args_dict, args_dict["estimator_image"]) exit_code = dig.build(**vars(args)) if exit_code != 0: @@ -92,6 +96,5 @@ def run_instance(dig_instance, args): args_dict["command"] = "bash" result = dig.run(**args_dict) - # TODO clean up th "bpc = ibpc.ibpc:main", -reads here + # TODO clean up threads here return result From 43fe46b53183143e4ed77668c571b73dda008624 Mon Sep 17 00:00:00 2001 From: Tully Foote <tullyfoote@intrinsic.ai> Date: Thu, 30 Jan 2025 22:24:33 -0800 Subject: [PATCH 06/12] rename executable to bpc --- ibpc_py/README.md | 5 ++--- ibpc_py/setup.py | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/ibpc_py/README.md b/ibpc_py/README.md index 259b6b56..df978cf1 100644 --- a/ibpc_py/README.md +++ b/ibpc_py/README.md @@ -4,9 +4,9 @@ This is the python entrypoint for the Industrial Bin Picking Challenge ## Usage -`ibpc test <Pose Estimator Image Name> ~/<Path to dataset to test>` +`bpc test <Pose Estimator Image Name> ~/<Path to dataset to test>` -`ibpc test ibpc:pose_estimator ~/ws/ibpc/lm` +`bpc test ibpc:pose_estimator ~/ws/ibpc/lm` ## Prerequisites @@ -24,4 +24,3 @@ Temporary before rocker release of https://github.com/osrf/rocker/pull/317/ ### Nvidia Docker (optoinal) Make sure nvidia_docker is installed if you want cuda. -Add `--cuda` to your command line options \ No newline at end of file diff --git a/ibpc_py/setup.py b/ibpc_py/setup.py index 4b812eae..80e57a05 100644 --- a/ibpc_py/setup.py +++ b/ibpc_py/setup.py @@ -28,7 +28,7 @@ zip_safe=False, entry_points={ "console_scripts": [ - "ibpc = ibpc.ibpc:main", + "bpc = ibpc.ibpc:main", ], }, ) From 59c1c5915a78555fd959dad1a98e780cc1b203f3 Mon Sep 17 00:00:00 2001 From: Tully Foote <tullyfoote@intrinsic.ai> Date: Thu, 30 Jan 2025 22:26:01 -0800 Subject: [PATCH 07/12] formatting fix --- ibpc_py/src/ibpc/ibpc.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ibpc_py/src/ibpc/ibpc.py b/ibpc_py/src/ibpc/ibpc.py index 4bf10759..70b36449 100644 --- a/ibpc_py/src/ibpc/ibpc.py +++ b/ibpc_py/src/ibpc/ibpc.py @@ -19,7 +19,7 @@ def main(): "-v", "--version", action="version", version="%(prog)s " + get_rocker_version() ) - sub_parsers= main_parser.add_subparsers(title="test") + sub_parsers = main_parser.add_subparsers(title="test") test_parser = sub_parsers.add_parser("test") test_parser.add_argument("estimator_image") @@ -85,7 +85,9 @@ def run_instance(dig_instance, args): ) tester_thread.start() - dig = DockerImageGenerator(active_extensions, args_dict, args_dict["estimator_image"]) + dig = DockerImageGenerator( + active_extensions, args_dict, args_dict["estimator_image"] + ) exit_code = dig.build(**vars(args)) if exit_code != 0: From 68002459bd968ec622fcdee7cbdc4aa99bcc21c8 Mon Sep 17 00:00:00 2001 From: Tully Foote <tullyfoote@intrinsic.ai> Date: Thu, 30 Jan 2025 22:33:02 -0800 Subject: [PATCH 08/12] 0.0.2 with build and upload notes --- ibpc_py/README.md | 7 +++++++ ibpc_py/setup.py | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/ibpc_py/README.md b/ibpc_py/README.md index df978cf1..6be6e28c 100644 --- a/ibpc_py/README.md +++ b/ibpc_py/README.md @@ -24,3 +24,10 @@ Temporary before rocker release of https://github.com/osrf/rocker/pull/317/ ### Nvidia Docker (optoinal) Make sure nvidia_docker is installed if you want cuda. +## Release instructions + +``` +rm -rf dist/* +python3 -m build --sdist . +twine upload dist/* +``` \ No newline at end of file diff --git a/ibpc_py/setup.py b/ibpc_py/setup.py index 80e57a05..08654a56 100644 --- a/ibpc_py/setup.py +++ b/ibpc_py/setup.py @@ -9,7 +9,7 @@ setuptools.setup( name="ibpc", - version="0.0.1", + version="0.0.2", packages=["ibpc"], package_dir={"": "src"}, # package_data={'ibpc': ['templates/*.em']}, From e342bb458cb48423ea9c8aac7c3036e7dc57d2ea Mon Sep 17 00:00:00 2001 From: Tully Foote <tullyfoote@intrinsic.ai> Date: Fri, 31 Jan 2025 00:04:19 -0800 Subject: [PATCH 09/12] add fetch subcommand with support for lm --- ibpc_py/src/ibpc/ibpc.py | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/ibpc_py/src/ibpc/ibpc.py b/ibpc_py/src/ibpc/ibpc.py index 70b36449..ff0b5a36 100644 --- a/ibpc_py/src/ibpc/ibpc.py +++ b/ibpc_py/src/ibpc/ibpc.py @@ -8,6 +8,33 @@ from rocker.core import RockerExtensionManager from rocker.core import OPERATIONS_NON_INTERACTIVE +from io import BytesIO +from urllib.request import urlopen +from zipfile import ZipFile + + +def get_bop_template(modelname): + return f"https://huggingface.co/datasets/bop-benchmark/datasets/resolve/main/{modelname}/{modelname}" + + +available_datasets = {"lm": get_bop_template("lm")} + +bop_suffixes = [ + "_base.zip", + "_models.zip", + "_test_all.zip", + "_train_pbr.zip", +] + + +def fetch_bop_dataset(dataset, output_path): + for suffix in bop_suffixes: + + url = get_bop_template(dataset) + suffix + with urlopen(url) as zipurlfile: + with ZipFile(BytesIO(zipurlfile.read())) as zfile: + zfile.extractall(output_path) + def main(): @@ -19,19 +46,27 @@ def main(): "-v", "--version", action="version", version="%(prog)s " + get_rocker_version() ) - sub_parsers = main_parser.add_subparsers(title="test") + sub_parsers = main_parser.add_subparsers(title="test", dest="subparser_name") test_parser = sub_parsers.add_parser("test") test_parser.add_argument("estimator_image") test_parser.add_argument("dataset_directory") test_parser.add_argument("--debug-inside", action="store_true") + fetch_parser = sub_parsers.add_parser("fetch") + fetch_parser.add_argument("dataset", choices=["lm"]) + fetch_parser.add_argument("--dataset-path", default=".") + extension_manager = RockerExtensionManager() default_args = {"cuda": True, "network": "host"} extension_manager.extend_cli_parser(test_parser, default_args) args = main_parser.parse_args() args_dict = vars(args) + if args.subparser_name == "fetch": + print("called fetch_dataset") + fetch_bop_dataset(args_dict["dataset"], args_dict["dataset_path"]) + return # Confirm dataset directory is absolute args_dict["dataset_directory"] = os.path.abspath(args_dict["dataset_directory"]) From 641571ceb68c8d5b9f6d7c1721cf0eeaf1f8f722 Mon Sep 17 00:00:00 2001 From: Tully Foote <tullyfoote@intrinsic.ai> Date: Fri, 31 Jan 2025 00:39:30 -0800 Subject: [PATCH 10/12] resolve dataset paths --- ibpc_py/src/ibpc/ibpc.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/ibpc_py/src/ibpc/ibpc.py b/ibpc_py/src/ibpc/ibpc.py index ff0b5a36..159e52e7 100644 --- a/ibpc_py/src/ibpc/ibpc.py +++ b/ibpc_py/src/ibpc/ibpc.py @@ -50,7 +50,8 @@ def main(): test_parser = sub_parsers.add_parser("test") test_parser.add_argument("estimator_image") - test_parser.add_argument("dataset_directory") + test_parser.add_argument("dataset") + test_parser.add_argument("--dataset_directory", action="store", default=".") test_parser.add_argument("--debug-inside", action="store_true") fetch_parser = sub_parsers.add_parser("fetch") @@ -59,13 +60,14 @@ def main(): extension_manager = RockerExtensionManager() default_args = {"cuda": True, "network": "host"} - extension_manager.extend_cli_parser(test_parser, default_args) + # extension_manager.extend_cli_parser(test_parser, default_args) args = main_parser.parse_args() args_dict = vars(args) if args.subparser_name == "fetch": - print("called fetch_dataset") + print(f"Fetching dataset {args_dict['dataset']} to {args_dict['dataset_path']}") fetch_bop_dataset(args_dict["dataset"], args_dict["dataset_path"]) + print("Fetch complete") return # Confirm dataset directory is absolute @@ -78,10 +80,13 @@ def main(): "network": "host", "extension_blacklist": {}, "operating_mode": OPERATIONS_NON_INTERACTIVE, - "env": [[f"BOP_PATH:/opt/ros/underlay/install/datasets"]], + "env": [ + [f"BOP_PATH:/opt/ros/underlay/install/datasets/{args_dict['dataset']}"], + [f"DATASET_NAME:{args_dict['dataset']}"], + ], "console_output_file": "ibpc_test_output.log", "volume": [ - [f"{args_dict['dataset_directory']}:/opt/ros/underlay/install/datasets/lm"] + [f"{args_dict['dataset_directory']}:/opt/ros/underlay/install/datasets"] ], } print("Buiding tester env") @@ -98,11 +103,13 @@ def main(): "extension_blacklist": {}, "console_output_file": "ibpc_zenoh_output.log", "operating_mode": OPERATIONS_NON_INTERACTIVE, + "volume": [], } + zenoh_extensions = extension_manager.get_active_extensions(tester_args) print("Buiding zenoh env") dig_zenoh = DockerImageGenerator( - tester_extensions, tester_args, "eclipse/zenoh:1.1.1" + zenoh_extensions, zenoh_args, "eclipse/zenoh:1.1.1" ) exit_code = dig_zenoh.build(**zenoh_args) if exit_code != 0: From 54b86d351ae9657ec461317f875efe659e1b9296 Mon Sep 17 00:00:00 2001 From: Tully Foote <tullyfoote@intrinsic.ai> Date: Fri, 31 Jan 2025 00:45:47 -0800 Subject: [PATCH 11/12] update readme --- ibpc_py/README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ibpc_py/README.md b/ibpc_py/README.md index 6be6e28c..1fa0ded8 100644 --- a/ibpc_py/README.md +++ b/ibpc_py/README.md @@ -4,9 +4,14 @@ This is the python entrypoint for the Industrial Bin Picking Challenge ## Usage -`bpc test <Pose Estimator Image Name> ~/<Path to dataset to test>` +Get a dataset +`bpc fetch lm` -`bpc test ibpc:pose_estimator ~/ws/ibpc/lm` + +Run tests against a dataset +`bpc test <Pose Estimator Image Name> <datasetname> ` + +`bpc test ibpc:pose_estimator lm` ## Prerequisites From a40640fe9ef6c4a7c2c0e6d2614903675a19a4c5 Mon Sep 17 00:00:00 2001 From: Tully Foote <tullyfoote@intrinsic.ai> Date: Fri, 31 Jan 2025 14:58:28 -0800 Subject: [PATCH 12/12] downloading ipd --- ibpc_py/src/ibpc/ibpc.py | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/ibpc_py/src/ibpc/ibpc.py b/ibpc_py/src/ibpc/ibpc.py index 159e52e7..f3943dd0 100644 --- a/ibpc_py/src/ibpc/ibpc.py +++ b/ibpc_py/src/ibpc/ibpc.py @@ -10,14 +10,15 @@ from io import BytesIO from urllib.request import urlopen +import urllib.request from zipfile import ZipFile def get_bop_template(modelname): return f"https://huggingface.co/datasets/bop-benchmark/datasets/resolve/main/{modelname}/{modelname}" - -available_datasets = {"lm": get_bop_template("lm")} +def get_ipb_template(modelname): + return f"https://huggingface.co/datasets/bop-benchmark/{modelname}/resolve/main/{modelname}" bop_suffixes = [ "_base.zip", @@ -26,11 +27,21 @@ def get_bop_template(modelname): "_train_pbr.zip", ] +ipb_suffixes = [s for s in bop_suffixes] +ipb_suffixes.append('_val.zip') +ipb_suffixes.append('_test_all.z01') + +available_datasets = { + "ipb": (get_ipb_template("ipb"), ipb_suffixes), + "lm": (get_bop_template("lm"), bop_suffixes), + } -def fetch_bop_dataset(dataset, output_path): - for suffix in bop_suffixes: +def fetch_dataset(dataset, output_path): + (url_base, suffixes) = available_datasets[dataset] + for suffix in suffixes: - url = get_bop_template(dataset) + suffix + url = url_base + suffix + print(f"Downloading from url: {url}") with urlopen(url) as zipurlfile: with ZipFile(BytesIO(zipurlfile.read())) as zfile: zfile.extractall(output_path) @@ -55,7 +66,7 @@ def main(): test_parser.add_argument("--debug-inside", action="store_true") fetch_parser = sub_parsers.add_parser("fetch") - fetch_parser.add_argument("dataset", choices=["lm"]) + fetch_parser.add_argument("dataset", choices=available_datasets.keys()) fetch_parser.add_argument("--dataset-path", default=".") extension_manager = RockerExtensionManager() @@ -66,7 +77,7 @@ def main(): args_dict = vars(args) if args.subparser_name == "fetch": print(f"Fetching dataset {args_dict['dataset']} to {args_dict['dataset_path']}") - fetch_bop_dataset(args_dict["dataset"], args_dict["dataset_path"]) + fetch_dataset(args_dict["dataset"], args_dict["dataset_path"]) print("Fetch complete") return