diff --git a/.gitignore b/.gitignore index df08f80..6c9606a 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,10 @@ MANIFEST *.manifest *.spec +# pictures +*.png +*.jpg + # Installer logs pip-log.txt pip-delete-this-directory.txt diff --git a/data/datasets/source/bear.zarr/.zgroup b/data/datasets/source/demo_ori/bear.zarr/.zgroup similarity index 100% rename from data/datasets/source/bear.zarr/.zgroup rename to data/datasets/source/demo_ori/bear.zarr/.zgroup diff --git a/data/datasets/source/bear.zarr/data/.zgroup b/data/datasets/source/demo_ori/bear.zarr/data/.zgroup similarity index 100% rename from data/datasets/source/bear.zarr/data/.zgroup rename to data/datasets/source/demo_ori/bear.zarr/data/.zgroup diff --git a/data/datasets/source/bear.zarr/data/action/.zarray b/data/datasets/source/demo_ori/bear.zarr/data/action/.zarray similarity index 100% rename from data/datasets/source/bear.zarr/data/action/.zarray rename to data/datasets/source/demo_ori/bear.zarr/data/action/.zarray diff --git a/data/datasets/source/bear.zarr/data/action/0.0 b/data/datasets/source/demo_ori/bear.zarr/data/action/0.0 similarity index 100% rename from data/datasets/source/bear.zarr/data/action/0.0 rename to data/datasets/source/demo_ori/bear.zarr/data/action/0.0 diff --git a/data/datasets/source/bear.zarr/data/action/1.0 b/data/datasets/source/demo_ori/bear.zarr/data/action/1.0 similarity index 100% rename from data/datasets/source/bear.zarr/data/action/1.0 rename to data/datasets/source/demo_ori/bear.zarr/data/action/1.0 diff --git a/data/datasets/source/bear.zarr/data/point_cloud/.zarray b/data/datasets/source/demo_ori/bear.zarr/data/point_cloud/.zarray similarity index 100% rename from data/datasets/source/bear.zarr/data/point_cloud/.zarray rename to data/datasets/source/demo_ori/bear.zarr/data/point_cloud/.zarray diff --git a/data/datasets/source/bear.zarr/data/point_cloud/0.0.0 b/data/datasets/source/demo_ori/bear.zarr/data/point_cloud/0.0.0 similarity index 100% rename from data/datasets/source/bear.zarr/data/point_cloud/0.0.0 rename to data/datasets/source/demo_ori/bear.zarr/data/point_cloud/0.0.0 diff --git a/data/datasets/source/bear.zarr/data/point_cloud/1.0.0 b/data/datasets/source/demo_ori/bear.zarr/data/point_cloud/1.0.0 similarity index 100% rename from data/datasets/source/bear.zarr/data/point_cloud/1.0.0 rename to data/datasets/source/demo_ori/bear.zarr/data/point_cloud/1.0.0 diff --git a/data/datasets/source/bear.zarr/data/state/.zarray b/data/datasets/source/demo_ori/bear.zarr/data/state/.zarray similarity index 100% rename from data/datasets/source/bear.zarr/data/state/.zarray rename to data/datasets/source/demo_ori/bear.zarr/data/state/.zarray diff --git a/data/datasets/source/bear.zarr/data/state/0.0 b/data/datasets/source/demo_ori/bear.zarr/data/state/0.0 similarity index 100% rename from data/datasets/source/bear.zarr/data/state/0.0 rename to data/datasets/source/demo_ori/bear.zarr/data/state/0.0 diff --git a/data/datasets/source/bear.zarr/data/state/1.0 b/data/datasets/source/demo_ori/bear.zarr/data/state/1.0 similarity index 100% rename from data/datasets/source/bear.zarr/data/state/1.0 rename to data/datasets/source/demo_ori/bear.zarr/data/state/1.0 diff --git a/data/datasets/source/bear.zarr/meta/.zgroup b/data/datasets/source/demo_ori/bear.zarr/meta/.zgroup similarity index 100% rename from data/datasets/source/bear.zarr/meta/.zgroup rename to data/datasets/source/demo_ori/bear.zarr/meta/.zgroup diff --git a/data/datasets/source/bear.zarr/meta/episode_ends/.zarray b/data/datasets/source/demo_ori/bear.zarr/meta/episode_ends/.zarray similarity index 100% rename from data/datasets/source/bear.zarr/meta/episode_ends/.zarray rename to data/datasets/source/demo_ori/bear.zarr/meta/episode_ends/.zarray diff --git a/data/datasets/source/bear.zarr/meta/episode_ends/0 b/data/datasets/source/demo_ori/bear.zarr/meta/episode_ends/0 similarity index 100% rename from data/datasets/source/bear.zarr/meta/episode_ends/0 rename to data/datasets/source/demo_ori/bear.zarr/meta/episode_ends/0 diff --git a/data/datasets/source/egg.zarr/.zgroup b/data/datasets/source/demo_ori/egg.zarr/.zgroup similarity index 100% rename from data/datasets/source/egg.zarr/.zgroup rename to data/datasets/source/demo_ori/egg.zarr/.zgroup diff --git a/data/datasets/source/egg.zarr/data/.zgroup b/data/datasets/source/demo_ori/egg.zarr/data/.zgroup similarity index 100% rename from data/datasets/source/egg.zarr/data/.zgroup rename to data/datasets/source/demo_ori/egg.zarr/data/.zgroup diff --git a/data/datasets/source/egg.zarr/data/action/.zarray b/data/datasets/source/demo_ori/egg.zarr/data/action/.zarray similarity index 100% rename from data/datasets/source/egg.zarr/data/action/.zarray rename to data/datasets/source/demo_ori/egg.zarr/data/action/.zarray diff --git a/data/datasets/source/egg.zarr/data/action/0.0 b/data/datasets/source/demo_ori/egg.zarr/data/action/0.0 similarity index 100% rename from data/datasets/source/egg.zarr/data/action/0.0 rename to data/datasets/source/demo_ori/egg.zarr/data/action/0.0 diff --git a/data/datasets/source/egg.zarr/data/action/1.0 b/data/datasets/source/demo_ori/egg.zarr/data/action/1.0 similarity index 100% rename from data/datasets/source/egg.zarr/data/action/1.0 rename to data/datasets/source/demo_ori/egg.zarr/data/action/1.0 diff --git a/data/datasets/source/egg.zarr/data/point_cloud/.zarray b/data/datasets/source/demo_ori/egg.zarr/data/point_cloud/.zarray similarity index 100% rename from data/datasets/source/egg.zarr/data/point_cloud/.zarray rename to data/datasets/source/demo_ori/egg.zarr/data/point_cloud/.zarray diff --git a/data/datasets/source/egg.zarr/data/point_cloud/0.0.0 b/data/datasets/source/demo_ori/egg.zarr/data/point_cloud/0.0.0 similarity index 100% rename from data/datasets/source/egg.zarr/data/point_cloud/0.0.0 rename to data/datasets/source/demo_ori/egg.zarr/data/point_cloud/0.0.0 diff --git a/data/datasets/source/egg.zarr/data/point_cloud/1.0.0 b/data/datasets/source/demo_ori/egg.zarr/data/point_cloud/1.0.0 similarity index 100% rename from data/datasets/source/egg.zarr/data/point_cloud/1.0.0 rename to data/datasets/source/demo_ori/egg.zarr/data/point_cloud/1.0.0 diff --git a/data/datasets/source/egg.zarr/data/state/.zarray b/data/datasets/source/demo_ori/egg.zarr/data/state/.zarray similarity index 100% rename from data/datasets/source/egg.zarr/data/state/.zarray rename to data/datasets/source/demo_ori/egg.zarr/data/state/.zarray diff --git a/data/datasets/source/egg.zarr/data/state/0.0 b/data/datasets/source/demo_ori/egg.zarr/data/state/0.0 similarity index 100% rename from data/datasets/source/egg.zarr/data/state/0.0 rename to data/datasets/source/demo_ori/egg.zarr/data/state/0.0 diff --git a/data/datasets/source/egg.zarr/data/state/1.0 b/data/datasets/source/demo_ori/egg.zarr/data/state/1.0 similarity index 100% rename from data/datasets/source/egg.zarr/data/state/1.0 rename to data/datasets/source/demo_ori/egg.zarr/data/state/1.0 diff --git a/data/datasets/source/egg.zarr/meta/.zgroup b/data/datasets/source/demo_ori/egg.zarr/meta/.zgroup similarity index 100% rename from data/datasets/source/egg.zarr/meta/.zgroup rename to data/datasets/source/demo_ori/egg.zarr/meta/.zgroup diff --git a/data/datasets/source/egg.zarr/meta/episode_ends/.zarray b/data/datasets/source/demo_ori/egg.zarr/meta/episode_ends/.zarray similarity index 100% rename from data/datasets/source/egg.zarr/meta/episode_ends/.zarray rename to data/datasets/source/demo_ori/egg.zarr/meta/episode_ends/.zarray diff --git a/data/datasets/source/egg.zarr/meta/episode_ends/0 b/data/datasets/source/demo_ori/egg.zarr/meta/episode_ends/0 similarity index 100% rename from data/datasets/source/egg.zarr/meta/episode_ends/0 rename to data/datasets/source/demo_ori/egg.zarr/meta/episode_ends/0 diff --git a/data/datasets/source/flower.zarr/.zgroup b/data/datasets/source/demo_ori/flower.zarr/.zgroup similarity index 100% rename from data/datasets/source/flower.zarr/.zgroup rename to data/datasets/source/demo_ori/flower.zarr/.zgroup diff --git a/data/datasets/source/flower.zarr/data/.zgroup b/data/datasets/source/demo_ori/flower.zarr/data/.zgroup similarity index 100% rename from data/datasets/source/flower.zarr/data/.zgroup rename to data/datasets/source/demo_ori/flower.zarr/data/.zgroup diff --git a/data/datasets/source/flower.zarr/data/action/.zarray b/data/datasets/source/demo_ori/flower.zarr/data/action/.zarray similarity index 100% rename from data/datasets/source/flower.zarr/data/action/.zarray rename to data/datasets/source/demo_ori/flower.zarr/data/action/.zarray diff --git a/data/datasets/source/flower.zarr/data/action/0.0 b/data/datasets/source/demo_ori/flower.zarr/data/action/0.0 similarity index 100% rename from data/datasets/source/flower.zarr/data/action/0.0 rename to data/datasets/source/demo_ori/flower.zarr/data/action/0.0 diff --git a/data/datasets/source/flower.zarr/data/action/1.0 b/data/datasets/source/demo_ori/flower.zarr/data/action/1.0 similarity index 100% rename from data/datasets/source/flower.zarr/data/action/1.0 rename to data/datasets/source/demo_ori/flower.zarr/data/action/1.0 diff --git a/data/datasets/source/flower.zarr/data/action/2.0 b/data/datasets/source/demo_ori/flower.zarr/data/action/2.0 similarity index 100% rename from data/datasets/source/flower.zarr/data/action/2.0 rename to data/datasets/source/demo_ori/flower.zarr/data/action/2.0 diff --git a/data/datasets/source/flower.zarr/data/action/3.0 b/data/datasets/source/demo_ori/flower.zarr/data/action/3.0 similarity index 100% rename from data/datasets/source/flower.zarr/data/action/3.0 rename to data/datasets/source/demo_ori/flower.zarr/data/action/3.0 diff --git a/data/datasets/source/flower.zarr/data/point_cloud/.zarray b/data/datasets/source/demo_ori/flower.zarr/data/point_cloud/.zarray similarity index 100% rename from data/datasets/source/flower.zarr/data/point_cloud/.zarray rename to data/datasets/source/demo_ori/flower.zarr/data/point_cloud/.zarray diff --git a/data/datasets/source/flower.zarr/data/point_cloud/0.0.0 b/data/datasets/source/demo_ori/flower.zarr/data/point_cloud/0.0.0 similarity index 100% rename from data/datasets/source/flower.zarr/data/point_cloud/0.0.0 rename to data/datasets/source/demo_ori/flower.zarr/data/point_cloud/0.0.0 diff --git a/data/datasets/source/flower.zarr/data/point_cloud/1.0.0 b/data/datasets/source/demo_ori/flower.zarr/data/point_cloud/1.0.0 similarity index 100% rename from data/datasets/source/flower.zarr/data/point_cloud/1.0.0 rename to data/datasets/source/demo_ori/flower.zarr/data/point_cloud/1.0.0 diff --git a/data/datasets/source/flower.zarr/data/point_cloud/2.0.0 b/data/datasets/source/demo_ori/flower.zarr/data/point_cloud/2.0.0 similarity index 100% rename from data/datasets/source/flower.zarr/data/point_cloud/2.0.0 rename to data/datasets/source/demo_ori/flower.zarr/data/point_cloud/2.0.0 diff --git a/data/datasets/source/flower.zarr/data/point_cloud/3.0.0 b/data/datasets/source/demo_ori/flower.zarr/data/point_cloud/3.0.0 similarity index 100% rename from data/datasets/source/flower.zarr/data/point_cloud/3.0.0 rename to data/datasets/source/demo_ori/flower.zarr/data/point_cloud/3.0.0 diff --git a/data/datasets/source/flower.zarr/data/state/.zarray b/data/datasets/source/demo_ori/flower.zarr/data/state/.zarray similarity index 100% rename from data/datasets/source/flower.zarr/data/state/.zarray rename to data/datasets/source/demo_ori/flower.zarr/data/state/.zarray diff --git a/data/datasets/source/flower.zarr/data/state/0.0 b/data/datasets/source/demo_ori/flower.zarr/data/state/0.0 similarity index 100% rename from data/datasets/source/flower.zarr/data/state/0.0 rename to data/datasets/source/demo_ori/flower.zarr/data/state/0.0 diff --git a/data/datasets/source/flower.zarr/data/state/1.0 b/data/datasets/source/demo_ori/flower.zarr/data/state/1.0 similarity index 100% rename from data/datasets/source/flower.zarr/data/state/1.0 rename to data/datasets/source/demo_ori/flower.zarr/data/state/1.0 diff --git a/data/datasets/source/flower.zarr/data/state/2.0 b/data/datasets/source/demo_ori/flower.zarr/data/state/2.0 similarity index 100% rename from data/datasets/source/flower.zarr/data/state/2.0 rename to data/datasets/source/demo_ori/flower.zarr/data/state/2.0 diff --git a/data/datasets/source/flower.zarr/data/state/3.0 b/data/datasets/source/demo_ori/flower.zarr/data/state/3.0 similarity index 100% rename from data/datasets/source/flower.zarr/data/state/3.0 rename to data/datasets/source/demo_ori/flower.zarr/data/state/3.0 diff --git a/data/datasets/source/flower.zarr/meta/.zgroup b/data/datasets/source/demo_ori/flower.zarr/meta/.zgroup similarity index 100% rename from data/datasets/source/flower.zarr/meta/.zgroup rename to data/datasets/source/demo_ori/flower.zarr/meta/.zgroup diff --git a/data/datasets/source/flower.zarr/meta/episode_ends/.zarray b/data/datasets/source/demo_ori/flower.zarr/meta/episode_ends/.zarray similarity index 100% rename from data/datasets/source/flower.zarr/meta/episode_ends/.zarray rename to data/datasets/source/demo_ori/flower.zarr/meta/episode_ends/.zarray diff --git a/data/datasets/source/flower.zarr/meta/episode_ends/0 b/data/datasets/source/demo_ori/flower.zarr/meta/episode_ends/0 similarity index 100% rename from data/datasets/source/flower.zarr/meta/episode_ends/0 rename to data/datasets/source/demo_ori/flower.zarr/meta/episode_ends/0 diff --git a/data/datasets/source/jar.zarr/.zgroup b/data/datasets/source/demo_ori/jar.zarr/.zgroup similarity index 100% rename from data/datasets/source/jar.zarr/.zgroup rename to data/datasets/source/demo_ori/jar.zarr/.zgroup diff --git a/data/datasets/source/jar.zarr/data/.zgroup b/data/datasets/source/demo_ori/jar.zarr/data/.zgroup similarity index 100% rename from data/datasets/source/jar.zarr/data/.zgroup rename to data/datasets/source/demo_ori/jar.zarr/data/.zgroup diff --git a/data/datasets/source/jar.zarr/data/action/.zarray b/data/datasets/source/demo_ori/jar.zarr/data/action/.zarray similarity index 100% rename from data/datasets/source/jar.zarr/data/action/.zarray rename to data/datasets/source/demo_ori/jar.zarr/data/action/.zarray diff --git a/data/datasets/source/jar.zarr/data/action/0.0 b/data/datasets/source/demo_ori/jar.zarr/data/action/0.0 similarity index 100% rename from data/datasets/source/jar.zarr/data/action/0.0 rename to data/datasets/source/demo_ori/jar.zarr/data/action/0.0 diff --git a/data/datasets/source/jar.zarr/data/agent_pos/.zarray b/data/datasets/source/demo_ori/jar.zarr/data/agent_pos/.zarray similarity index 100% rename from data/datasets/source/jar.zarr/data/agent_pos/.zarray rename to data/datasets/source/demo_ori/jar.zarr/data/agent_pos/.zarray diff --git a/data/datasets/source/jar.zarr/data/agent_pos/0.0 b/data/datasets/source/demo_ori/jar.zarr/data/agent_pos/0.0 similarity index 100% rename from data/datasets/source/jar.zarr/data/agent_pos/0.0 rename to data/datasets/source/demo_ori/jar.zarr/data/agent_pos/0.0 diff --git a/data/datasets/source/jar.zarr/data/point_cloud/.zarray b/data/datasets/source/demo_ori/jar.zarr/data/point_cloud/.zarray similarity index 100% rename from data/datasets/source/jar.zarr/data/point_cloud/.zarray rename to data/datasets/source/demo_ori/jar.zarr/data/point_cloud/.zarray diff --git a/data/datasets/source/jar.zarr/data/point_cloud/0.0.0 b/data/datasets/source/demo_ori/jar.zarr/data/point_cloud/0.0.0 similarity index 100% rename from data/datasets/source/jar.zarr/data/point_cloud/0.0.0 rename to data/datasets/source/demo_ori/jar.zarr/data/point_cloud/0.0.0 diff --git a/data/datasets/source/jar.zarr/meta/.zgroup b/data/datasets/source/demo_ori/jar.zarr/meta/.zgroup similarity index 100% rename from data/datasets/source/jar.zarr/meta/.zgroup rename to data/datasets/source/demo_ori/jar.zarr/meta/.zgroup diff --git a/data/datasets/source/jar.zarr/meta/episode_ends/.zarray b/data/datasets/source/demo_ori/jar.zarr/meta/episode_ends/.zarray similarity index 100% rename from data/datasets/source/jar.zarr/meta/episode_ends/.zarray rename to data/datasets/source/demo_ori/jar.zarr/meta/episode_ends/.zarray diff --git a/data/datasets/source/jar.zarr/meta/episode_ends/0 b/data/datasets/source/demo_ori/jar.zarr/meta/episode_ends/0 similarity index 100% rename from data/datasets/source/jar.zarr/meta/episode_ends/0 rename to data/datasets/source/demo_ori/jar.zarr/meta/episode_ends/0 diff --git a/data/datasets/source/mug.zarr/.zgroup b/data/datasets/source/demo_ori/mug.zarr/.zgroup similarity index 100% rename from data/datasets/source/mug.zarr/.zgroup rename to data/datasets/source/demo_ori/mug.zarr/.zgroup diff --git a/data/datasets/source/mug.zarr/data/.zgroup b/data/datasets/source/demo_ori/mug.zarr/data/.zgroup similarity index 100% rename from data/datasets/source/mug.zarr/data/.zgroup rename to data/datasets/source/demo_ori/mug.zarr/data/.zgroup diff --git a/data/datasets/source/mug.zarr/data/action/.zarray b/data/datasets/source/demo_ori/mug.zarr/data/action/.zarray similarity index 100% rename from data/datasets/source/mug.zarr/data/action/.zarray rename to data/datasets/source/demo_ori/mug.zarr/data/action/.zarray diff --git a/data/datasets/source/mug.zarr/data/action/0.0 b/data/datasets/source/demo_ori/mug.zarr/data/action/0.0 similarity index 100% rename from data/datasets/source/mug.zarr/data/action/0.0 rename to data/datasets/source/demo_ori/mug.zarr/data/action/0.0 diff --git a/data/datasets/source/mug.zarr/data/action/1.0 b/data/datasets/source/demo_ori/mug.zarr/data/action/1.0 similarity index 100% rename from data/datasets/source/mug.zarr/data/action/1.0 rename to data/datasets/source/demo_ori/mug.zarr/data/action/1.0 diff --git a/data/datasets/source/mug.zarr/data/point_cloud/.zarray b/data/datasets/source/demo_ori/mug.zarr/data/point_cloud/.zarray similarity index 100% rename from data/datasets/source/mug.zarr/data/point_cloud/.zarray rename to data/datasets/source/demo_ori/mug.zarr/data/point_cloud/.zarray diff --git a/data/datasets/source/mug.zarr/data/point_cloud/0.0.0 b/data/datasets/source/demo_ori/mug.zarr/data/point_cloud/0.0.0 similarity index 100% rename from data/datasets/source/mug.zarr/data/point_cloud/0.0.0 rename to data/datasets/source/demo_ori/mug.zarr/data/point_cloud/0.0.0 diff --git a/data/datasets/source/mug.zarr/data/point_cloud/1.0.0 b/data/datasets/source/demo_ori/mug.zarr/data/point_cloud/1.0.0 similarity index 100% rename from data/datasets/source/mug.zarr/data/point_cloud/1.0.0 rename to data/datasets/source/demo_ori/mug.zarr/data/point_cloud/1.0.0 diff --git a/data/datasets/source/mug.zarr/data/state/.zarray b/data/datasets/source/demo_ori/mug.zarr/data/state/.zarray similarity index 100% rename from data/datasets/source/mug.zarr/data/state/.zarray rename to data/datasets/source/demo_ori/mug.zarr/data/state/.zarray diff --git a/data/datasets/source/mug.zarr/data/state/0.0 b/data/datasets/source/demo_ori/mug.zarr/data/state/0.0 similarity index 100% rename from data/datasets/source/mug.zarr/data/state/0.0 rename to data/datasets/source/demo_ori/mug.zarr/data/state/0.0 diff --git a/data/datasets/source/mug.zarr/data/state/1.0 b/data/datasets/source/demo_ori/mug.zarr/data/state/1.0 similarity index 100% rename from data/datasets/source/mug.zarr/data/state/1.0 rename to data/datasets/source/demo_ori/mug.zarr/data/state/1.0 diff --git a/data/datasets/source/mug.zarr/meta/.zgroup b/data/datasets/source/demo_ori/mug.zarr/meta/.zgroup similarity index 100% rename from data/datasets/source/mug.zarr/meta/.zgroup rename to data/datasets/source/demo_ori/mug.zarr/meta/.zgroup diff --git a/data/datasets/source/mug.zarr/meta/episode_ends/.zarray b/data/datasets/source/demo_ori/mug.zarr/meta/episode_ends/.zarray similarity index 100% rename from data/datasets/source/mug.zarr/meta/episode_ends/.zarray rename to data/datasets/source/demo_ori/mug.zarr/meta/episode_ends/.zarray diff --git a/data/datasets/source/mug.zarr/meta/episode_ends/0 b/data/datasets/source/demo_ori/mug.zarr/meta/episode_ends/0 similarity index 100% rename from data/datasets/source/mug.zarr/meta/episode_ends/0 rename to data/datasets/source/demo_ori/mug.zarr/meta/episode_ends/0 diff --git a/data/datasets/source/sauce.zarr/.zgroup b/data/datasets/source/demo_ori/sauce.zarr/.zgroup similarity index 100% rename from data/datasets/source/sauce.zarr/.zgroup rename to data/datasets/source/demo_ori/sauce.zarr/.zgroup diff --git a/data/datasets/source/sauce.zarr/data/.zgroup b/data/datasets/source/demo_ori/sauce.zarr/data/.zgroup similarity index 100% rename from data/datasets/source/sauce.zarr/data/.zgroup rename to data/datasets/source/demo_ori/sauce.zarr/data/.zgroup diff --git a/data/datasets/source/sauce.zarr/data/action/.zarray b/data/datasets/source/demo_ori/sauce.zarr/data/action/.zarray similarity index 100% rename from data/datasets/source/sauce.zarr/data/action/.zarray rename to data/datasets/source/demo_ori/sauce.zarr/data/action/.zarray diff --git a/data/datasets/source/sauce.zarr/data/action/0.0 b/data/datasets/source/demo_ori/sauce.zarr/data/action/0.0 similarity index 100% rename from data/datasets/source/sauce.zarr/data/action/0.0 rename to data/datasets/source/demo_ori/sauce.zarr/data/action/0.0 diff --git a/data/datasets/source/sauce.zarr/data/action/1.0 b/data/datasets/source/demo_ori/sauce.zarr/data/action/1.0 similarity index 100% rename from data/datasets/source/sauce.zarr/data/action/1.0 rename to data/datasets/source/demo_ori/sauce.zarr/data/action/1.0 diff --git a/data/datasets/source/sauce.zarr/data/action/2.0 b/data/datasets/source/demo_ori/sauce.zarr/data/action/2.0 similarity index 100% rename from data/datasets/source/sauce.zarr/data/action/2.0 rename to data/datasets/source/demo_ori/sauce.zarr/data/action/2.0 diff --git a/data/datasets/source/sauce.zarr/data/point_cloud/.zarray b/data/datasets/source/demo_ori/sauce.zarr/data/point_cloud/.zarray similarity index 100% rename from data/datasets/source/sauce.zarr/data/point_cloud/.zarray rename to data/datasets/source/demo_ori/sauce.zarr/data/point_cloud/.zarray diff --git a/data/datasets/source/sauce.zarr/data/point_cloud/0.0.0 b/data/datasets/source/demo_ori/sauce.zarr/data/point_cloud/0.0.0 similarity index 100% rename from data/datasets/source/sauce.zarr/data/point_cloud/0.0.0 rename to data/datasets/source/demo_ori/sauce.zarr/data/point_cloud/0.0.0 diff --git a/data/datasets/source/sauce.zarr/data/point_cloud/1.0.0 b/data/datasets/source/demo_ori/sauce.zarr/data/point_cloud/1.0.0 similarity index 100% rename from data/datasets/source/sauce.zarr/data/point_cloud/1.0.0 rename to data/datasets/source/demo_ori/sauce.zarr/data/point_cloud/1.0.0 diff --git a/data/datasets/source/sauce.zarr/data/point_cloud/2.0.0 b/data/datasets/source/demo_ori/sauce.zarr/data/point_cloud/2.0.0 similarity index 100% rename from data/datasets/source/sauce.zarr/data/point_cloud/2.0.0 rename to data/datasets/source/demo_ori/sauce.zarr/data/point_cloud/2.0.0 diff --git a/data/datasets/source/sauce.zarr/data/state/.zarray b/data/datasets/source/demo_ori/sauce.zarr/data/state/.zarray similarity index 100% rename from data/datasets/source/sauce.zarr/data/state/.zarray rename to data/datasets/source/demo_ori/sauce.zarr/data/state/.zarray diff --git a/data/datasets/source/sauce.zarr/data/state/0.0 b/data/datasets/source/demo_ori/sauce.zarr/data/state/0.0 similarity index 100% rename from data/datasets/source/sauce.zarr/data/state/0.0 rename to data/datasets/source/demo_ori/sauce.zarr/data/state/0.0 diff --git a/data/datasets/source/sauce.zarr/data/state/1.0 b/data/datasets/source/demo_ori/sauce.zarr/data/state/1.0 similarity index 100% rename from data/datasets/source/sauce.zarr/data/state/1.0 rename to data/datasets/source/demo_ori/sauce.zarr/data/state/1.0 diff --git a/data/datasets/source/sauce.zarr/data/state/2.0 b/data/datasets/source/demo_ori/sauce.zarr/data/state/2.0 similarity index 100% rename from data/datasets/source/sauce.zarr/data/state/2.0 rename to data/datasets/source/demo_ori/sauce.zarr/data/state/2.0 diff --git a/data/datasets/source/sauce.zarr/meta/.zgroup b/data/datasets/source/demo_ori/sauce.zarr/meta/.zgroup similarity index 100% rename from data/datasets/source/sauce.zarr/meta/.zgroup rename to data/datasets/source/demo_ori/sauce.zarr/meta/.zgroup diff --git a/data/datasets/source/sauce.zarr/meta/episode_ends/.zarray b/data/datasets/source/demo_ori/sauce.zarr/meta/episode_ends/.zarray similarity index 100% rename from data/datasets/source/sauce.zarr/meta/episode_ends/.zarray rename to data/datasets/source/demo_ori/sauce.zarr/meta/episode_ends/.zarray diff --git a/data/datasets/source/sauce.zarr/meta/episode_ends/0 b/data/datasets/source/demo_ori/sauce.zarr/meta/episode_ends/0 similarity index 100% rename from data/datasets/source/sauce.zarr/meta/episode_ends/0 rename to data/datasets/source/demo_ori/sauce.zarr/meta/episode_ends/0 diff --git a/data/datasets/source/process_data_demogen.py b/data/datasets/source/process_data_demogen.py new file mode 100644 index 0000000..44f2600 --- /dev/null +++ b/data/datasets/source/process_data_demogen.py @@ -0,0 +1,161 @@ +import pickle, os +import numpy as np +import pdb +from copy import deepcopy +import zarr +import shutil +import argparse +import yaml +import cv2 +import h5py + + +def load_hdf5(dataset_path): + if not os.path.isfile(dataset_path): + print(f"Dataset does not exist at \n{dataset_path}\n") + exit() + + with h5py.File(dataset_path, "r") as root: + left_gripper, left_arm = ( + root["/joint_action/left_gripper"][()], + root["/joint_action/left_arm"][()], + ) + right_gripper, right_arm = ( + root["/joint_action/right_gripper"][()], + root["/joint_action/right_arm"][()], + ) + vector = root["/joint_action/vector"][()] + pointcloud = root["/pointcloud"][()] + + return left_gripper, left_arm, right_gripper, right_arm, vector, pointcloud + + +def main(): + + parser = argparse.ArgumentParser(description="Process some episodes.") + parser.add_argument( + "task_name", + type=str, + help="The name of the task (e.g., beat_block_hammer)", + ) + parser.add_argument("task_config", type=str) + parser.add_argument( + "expert_data_num", + type=int, + help="Number of episodes to process (e.g., 50)", + ) + parser.add_argument( + "episode_indices", + type=str, + help="Python list of episode indices to process, e.g. [0,2,5]", + ) + args = parser.parse_args() + + task_name = args.task_name + num = args.expert_data_num + task_config = args.task_config + # 解析 episode_indices 参数 + try: + episode_indices = eval(args.episode_indices) + assert isinstance(episode_indices, list) + assert len(episode_indices) == num + except Exception as e: + print("Error parsing episode_indices, should be Python list like [0,2,5]") + raise + + load_dir = "../../data/" + str(task_name) + "/" + str(task_config) + + total_count = 0 + + idx=episode_indices[0] # Use the first episode index for naming + save_dir = f"./data/{task_name}-{task_config}-{num}-demogen-{idx}.zarr" + + if os.path.exists(save_dir): + shutil.rmtree(save_dir) + + zarr_root = zarr.group(save_dir) + zarr_data = zarr_root.create_group("data") + zarr_meta = zarr_root.create_group("meta") + + point_cloud_arrays = [] + episode_ends_arrays, action_arrays, state_arrays, joint_action_arrays = ( + [], + [], + [], + [], + ) + + for idx, ep_num in enumerate(episode_indices): + print(f"processing episode: {idx + 1} / {num} (episode{ep_num})", end="\r") + load_path = os.path.join(load_dir, f"data/episode{ep_num}.hdf5") + ( + left_gripper_all, + left_arm_all, + right_gripper_all, + right_arm_all, + vector_all, + pointcloud_all, + ) = load_hdf5(load_path) + + for j in range(0, left_gripper_all.shape[0]): + pointcloud = pointcloud_all[j] + joint_state = vector_all[j] + if j != left_gripper_all.shape[0] - 1: + point_cloud_arrays.append(pointcloud) + state_arrays.append(joint_state) + if j != 0: + joint_action_arrays.append(joint_state) + + total_count += left_gripper_all.shape[0] - 1 + episode_ends_arrays.append(total_count) + + print() + try: + episode_ends_arrays = np.array(episode_ends_arrays) + state_arrays = np.array(state_arrays) + point_cloud_arrays = np.array(point_cloud_arrays) + joint_action_arrays = np.array(joint_action_arrays) + + compressor = zarr.Blosc(cname="zstd", clevel=3, shuffle=1) + state_chunk_size = (100, state_arrays.shape[1]) + joint_chunk_size = (100, joint_action_arrays.shape[1]) + point_cloud_chunk_size = (100, point_cloud_arrays.shape[1]) + zarr_data.create_dataset( + "point_cloud", + data=point_cloud_arrays, + chunks=point_cloud_chunk_size, + overwrite=True, + compressor=compressor, + ) + zarr_data.create_dataset( + "state", + data=state_arrays, + chunks=state_chunk_size, + dtype="float32", + overwrite=True, + compressor=compressor, + ) + zarr_data.create_dataset( + "action", + data=joint_action_arrays, + chunks=joint_chunk_size, + dtype="float32", + overwrite=True, + compressor=compressor, + ) + zarr_meta.create_dataset( + "episode_ends", + data=episode_ends_arrays, + dtype="int64", + overwrite=True, + compressor=compressor, + ) + except ZeroDivisionError as e: + print("If you get a `ZeroDivisionError: division by zero`, check that `data/pointcloud` in the task config is set to true.") + raise + except Exception as e: + print(f"An unexpected error occurred ({type(e).__name__}): {e}") + raise + +if __name__ == "__main__": + main() diff --git a/data/sam_mask/banana/0/banana.png b/data/sam_mask/banana/0/banana.png deleted file mode 100644 index 7b19de5..0000000 Binary files a/data/sam_mask/banana/0/banana.png and /dev/null differ diff --git a/data/sam_mask/banana/0/basket.png b/data/sam_mask/banana/0/basket.png deleted file mode 100644 index da07e70..0000000 Binary files a/data/sam_mask/banana/0/basket.png and /dev/null differ diff --git a/data/sam_mask/banana/0/source.jpg b/data/sam_mask/banana/0/source.jpg deleted file mode 100644 index 7b2270d..0000000 Binary files a/data/sam_mask/banana/0/source.jpg and /dev/null differ diff --git a/data/sam_mask/banana/1/banana.png b/data/sam_mask/banana/1/banana.png deleted file mode 100644 index 6d637d4..0000000 Binary files a/data/sam_mask/banana/1/banana.png and /dev/null differ diff --git a/data/sam_mask/banana/1/basket.png b/data/sam_mask/banana/1/basket.png deleted file mode 100644 index 6b94108..0000000 Binary files a/data/sam_mask/banana/1/basket.png and /dev/null differ diff --git a/data/sam_mask/banana/1/source.jpg b/data/sam_mask/banana/1/source.jpg deleted file mode 100644 index fd8c90e..0000000 Binary files a/data/sam_mask/banana/1/source.jpg and /dev/null differ diff --git a/data/sam_mask/banana/2/banana.png b/data/sam_mask/banana/2/banana.png deleted file mode 100644 index 4cda77c..0000000 Binary files a/data/sam_mask/banana/2/banana.png and /dev/null differ diff --git a/data/sam_mask/banana/2/basket.png b/data/sam_mask/banana/2/basket.png deleted file mode 100644 index 4190b49..0000000 Binary files a/data/sam_mask/banana/2/basket.png and /dev/null differ diff --git a/data/sam_mask/banana/2/source.jpg b/data/sam_mask/banana/2/source.jpg deleted file mode 100644 index 3bab0b0..0000000 Binary files a/data/sam_mask/banana/2/source.jpg and /dev/null differ diff --git a/data/sam_mask/egg/0/plate.jpg b/data/sam_mask/egg/0/plate.jpg deleted file mode 100644 index 9f2bce9..0000000 Binary files a/data/sam_mask/egg/0/plate.jpg and /dev/null differ diff --git a/data/sam_mask/egg/0/source.jpg b/data/sam_mask/egg/0/source.jpg deleted file mode 100644 index 1a41e0b..0000000 Binary files a/data/sam_mask/egg/0/source.jpg and /dev/null differ diff --git a/data/sam_mask/egg/1/plate.jpg b/data/sam_mask/egg/1/plate.jpg deleted file mode 100644 index 3f3c2a5..0000000 Binary files a/data/sam_mask/egg/1/plate.jpg and /dev/null differ diff --git a/data/sam_mask/egg/1/source.jpg b/data/sam_mask/egg/1/source.jpg deleted file mode 100644 index 0a6b077..0000000 Binary files a/data/sam_mask/egg/1/source.jpg and /dev/null differ diff --git a/data/sam_mask/egg/2/plate.jpg b/data/sam_mask/egg/2/plate.jpg deleted file mode 100644 index f81324b..0000000 Binary files a/data/sam_mask/egg/2/plate.jpg and /dev/null differ diff --git a/data/sam_mask/egg/2/source.jpg b/data/sam_mask/egg/2/source.jpg deleted file mode 100644 index 0bd9541..0000000 Binary files a/data/sam_mask/egg/2/source.jpg and /dev/null differ diff --git a/data/sam_mask/egg/check/plate_0.jpg b/data/sam_mask/egg/check/plate_0.jpg deleted file mode 100644 index e54910c..0000000 Binary files a/data/sam_mask/egg/check/plate_0.jpg and /dev/null differ diff --git a/data/sam_mask/egg/check/plate_1.jpg b/data/sam_mask/egg/check/plate_1.jpg deleted file mode 100644 index a746347..0000000 Binary files a/data/sam_mask/egg/check/plate_1.jpg and /dev/null differ diff --git a/data/sam_mask/egg/check/plate_2.jpg b/data/sam_mask/egg/check/plate_2.jpg deleted file mode 100644 index fbe2b0f..0000000 Binary files a/data/sam_mask/egg/check/plate_2.jpg and /dev/null differ diff --git a/data/sam_mask/flower/0/flowers tied with twine.jpg b/data/sam_mask/flower/0/flowers tied with twine.jpg deleted file mode 100644 index 78cf1fc..0000000 Binary files a/data/sam_mask/flower/0/flowers tied with twine.jpg and /dev/null differ diff --git a/data/sam_mask/flower/0/source.jpg b/data/sam_mask/flower/0/source.jpg deleted file mode 100644 index 63cfd6c..0000000 Binary files a/data/sam_mask/flower/0/source.jpg and /dev/null differ diff --git a/data/sam_mask/flower/0/white vase.jpg b/data/sam_mask/flower/0/white vase.jpg deleted file mode 100644 index 7774528..0000000 Binary files a/data/sam_mask/flower/0/white vase.jpg and /dev/null differ diff --git a/data/sam_mask/flower/1/flowers tied with twine.jpg b/data/sam_mask/flower/1/flowers tied with twine.jpg deleted file mode 100644 index 5f6e0d8..0000000 Binary files a/data/sam_mask/flower/1/flowers tied with twine.jpg and /dev/null differ diff --git a/data/sam_mask/flower/1/source.jpg b/data/sam_mask/flower/1/source.jpg deleted file mode 100644 index 8540819..0000000 Binary files a/data/sam_mask/flower/1/source.jpg and /dev/null differ diff --git a/data/sam_mask/flower/1/white vase.jpg b/data/sam_mask/flower/1/white vase.jpg deleted file mode 100644 index 969f574..0000000 Binary files a/data/sam_mask/flower/1/white vase.jpg and /dev/null differ diff --git a/data/sam_mask/flower/2/flowers tied with twine.jpg b/data/sam_mask/flower/2/flowers tied with twine.jpg deleted file mode 100644 index dbb8609..0000000 Binary files a/data/sam_mask/flower/2/flowers tied with twine.jpg and /dev/null differ diff --git a/data/sam_mask/flower/2/source.jpg b/data/sam_mask/flower/2/source.jpg deleted file mode 100644 index 6aa1458..0000000 Binary files a/data/sam_mask/flower/2/source.jpg and /dev/null differ diff --git a/data/sam_mask/flower/2/white vase.jpg b/data/sam_mask/flower/2/white vase.jpg deleted file mode 100644 index da41054..0000000 Binary files a/data/sam_mask/flower/2/white vase.jpg and /dev/null differ diff --git a/data/sam_mask/flower/check/flowers tied with twine_0.jpg b/data/sam_mask/flower/check/flowers tied with twine_0.jpg deleted file mode 100644 index 539a55a..0000000 Binary files a/data/sam_mask/flower/check/flowers tied with twine_0.jpg and /dev/null differ diff --git a/data/sam_mask/flower/check/flowers tied with twine_1.jpg b/data/sam_mask/flower/check/flowers tied with twine_1.jpg deleted file mode 100644 index a34700d..0000000 Binary files a/data/sam_mask/flower/check/flowers tied with twine_1.jpg and /dev/null differ diff --git a/data/sam_mask/flower/check/flowers tied with twine_2.jpg b/data/sam_mask/flower/check/flowers tied with twine_2.jpg deleted file mode 100644 index c0ab70b..0000000 Binary files a/data/sam_mask/flower/check/flowers tied with twine_2.jpg and /dev/null differ diff --git a/data/sam_mask/flower/check/white vase_0.jpg b/data/sam_mask/flower/check/white vase_0.jpg deleted file mode 100644 index 539a55a..0000000 Binary files a/data/sam_mask/flower/check/white vase_0.jpg and /dev/null differ diff --git a/data/sam_mask/flower/check/white vase_1.jpg b/data/sam_mask/flower/check/white vase_1.jpg deleted file mode 100644 index a34700d..0000000 Binary files a/data/sam_mask/flower/check/white vase_1.jpg and /dev/null differ diff --git a/data/sam_mask/flower/check/white vase_2.jpg b/data/sam_mask/flower/check/white vase_2.jpg deleted file mode 100644 index c0ab70b..0000000 Binary files a/data/sam_mask/flower/check/white vase_2.jpg and /dev/null differ diff --git a/data/sam_mask/get_mask.py b/data/sam_mask/get_mask.py index 785eb7b..069df87 100644 --- a/data/sam_mask/get_mask.py +++ b/data/sam_mask/get_mask.py @@ -53,12 +53,12 @@ def save_binary_mask(mask, output_path): model = LangSAM() -image_pil = Image.open("./assets/source_0.jpg").convert("RGB") -text_prompt = "green basket in the middle." +image_pil = Image.open("./assets/source_0.jpg").convert("RGB") +text_prompt = "an iron hammer with a black handle" # 此处需修改 results = model.predict([image_pil], [text_prompt]) masks = results[0]["masks"] print(masks.shape) assert masks.shape[0] == 1 -save_binary_mask(masks[0], f"assets/outputs/basket_0.png") \ No newline at end of file +save_binary_mask(masks[0], f"assets/outputs/hammer_0.png") # 此处需修改 \ No newline at end of file diff --git a/data/sam_mask/get_mask_bk.py b/data/sam_mask/get_mask_bk.py new file mode 100644 index 0000000..785eb7b --- /dev/null +++ b/data/sam_mask/get_mask_bk.py @@ -0,0 +1,64 @@ +# https://github.com/luca-medeiros/lang-segment-anything + +from PIL import Image +from lang_sam import LangSAM +import numpy as np + + +# Function to apply transparent masks on the image +def save_mask_results(image, masks, output_path): + # Ensure the image is in RGBA mode (with transparency support) + image = image_pil.convert("RGBA") + + # Iterate over the binary masks + for mask in masks: + # Convert mask to the same size as the image + mask_resized = Image.fromarray(mask).resize(image.size, Image.NEAREST).convert("L") + + # Create an RGBA mask with the same size + mask_rgba = mask_resized.convert("RGBA") + + # Get the alpha channel from the mask to apply transparency + mask_rgba = np.array(mask_rgba) + alpha_channel = mask_rgba[:, :, 0] # Assuming the mask is single-channel + + # Create a new transparent image with the same size as the input image + transparent_overlay = np.zeros((image.height, image.width, 4), dtype=np.uint8) + + # Set the red, green, and blue channels to some color (e.g., red) + transparent_overlay[:, :, 0] = 255 # Red channel + transparent_overlay[:, :, 1] = 0 # Green channel + transparent_overlay[:, :, 2] = 0 # Blue channel + + # Set the alpha channel to apply transparency from the mask + transparent_overlay[:, :, 3] = alpha_channel + + # Convert the overlay to an Image object + overlay_image = Image.fromarray(transparent_overlay, "RGBA") + + # Composite the overlay with the original image + image = Image.alpha_composite(image, overlay_image) + + # Save the resulting image + image.save(output_path, "PNG") + +# Function to save a binary mask as an image +def save_binary_mask(mask, output_path): + # Convert the binary mask to a PIL Image object + # Convert the mask to uint8 type (0 or 255) + mask_image = Image.fromarray((mask * 255).astype(np.uint8)) # Multiply by 255 to make 1 white and 0 black + + # Save the mask as an image (you can choose PNG, JPEG, etc.) + mask_image.save(output_path) + + +model = LangSAM() +image_pil = Image.open("./assets/source_0.jpg").convert("RGB") +text_prompt = "green basket in the middle." +results = model.predict([image_pil], [text_prompt]) + +masks = results[0]["masks"] +print(masks.shape) +assert masks.shape[0] == 1 + +save_binary_mask(masks[0], f"assets/outputs/basket_0.png") \ No newline at end of file diff --git a/data/sam_mask/lang-segment-anything/.dockerignore b/data/sam_mask/lang-segment-anything/.dockerignore new file mode 100644 index 0000000..1d17dae --- /dev/null +++ b/data/sam_mask/lang-segment-anything/.dockerignore @@ -0,0 +1 @@ +.venv diff --git a/data/sam_mask/lang-segment-anything/.github/ISSUE_TEMPLATE/bugs.yaml b/data/sam_mask/lang-segment-anything/.github/ISSUE_TEMPLATE/bugs.yaml new file mode 100644 index 0000000..21b736a --- /dev/null +++ b/data/sam_mask/lang-segment-anything/.github/ISSUE_TEMPLATE/bugs.yaml @@ -0,0 +1,54 @@ +name: 🐛 Bugs +description: Report bugs +labels: ["bug"] +title: "Please read & provide the following" +body: + - type: markdown + attributes: + value: | + ## Instructions To Reproduce the 🐛 Bug: + + 1. Background explanation + + - type: textarea + attributes: + label: "Full runnable code or full changes you made:" + description: Please provide the code or changes that led to the bug. + placeholder: | + ``` + ``` + validations: + required: true + + - type: textarea + attributes: + label: "What exact command you ran:" + description: Describe the exact command you ran that triggered the bug. + validations: + required: true + + - type: markdown + attributes: + value: | + 1. Please simplify the steps as much as possible so they do not require additional resources to + run, such as a private dataset. + + ## Expected behavior: + + If there are no obvious errors in "full logs" provided above, + please tell us the expected behavior. + + - type: textarea + attributes: + label: Expected behavior + description: Describe the expected behavior if the bug had not occurred. + validations: + required: true + + - type: checkboxes + attributes: + label: Environment + description: Indicate your environment details. + options: + - label: "I'm using the latest version!" + - label: "It's not a user-side mistake!" diff --git a/data/sam_mask/lang-segment-anything/.github/ISSUE_TEMPLATE/config.yml b/data/sam_mask/lang-segment-anything/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..c19e249 --- /dev/null +++ b/data/sam_mask/lang-segment-anything/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,9 @@ +# require an issue template to be chosen +blank_issues_enabled: false + +# Unexpected behaviors & bugs are split to two templates. +# When they are one template, users think "it's not a bug" and don't choose the template. +# +# But the file name is still "unexpected-problems-bugs.md" so that old references +# to this issue template still works. +# It's ok since this template should be a superset of "bugs.md" (unexpected behaviors is a superset of bugs) diff --git a/data/sam_mask/lang-segment-anything/.github/ISSUE_TEMPLATE/documentation.yaml b/data/sam_mask/lang-segment-anything/.github/ISSUE_TEMPLATE/documentation.yaml new file mode 100644 index 0000000..ea40997 --- /dev/null +++ b/data/sam_mask/lang-segment-anything/.github/ISSUE_TEMPLATE/documentation.yaml @@ -0,0 +1,26 @@ +name: 📚 Documentation Issue +description: Report a problem about existing documentation or comments. +labels: ["documentation"] +body: + - type: markdown + attributes: + value: | + ## 📚 Documentation Issue + + This issue category is for problems about existing documentation, not for asking how-to questions. + + - type: input + attributes: + label: Provide a link to existing documentation/comment + description: Paste the URL or path to the documentation or comment that has an issue. + placeholder: "https://example.com/docs/section" + validations: + required: true + + - type: textarea + attributes: + label: How should the above documentation/comment improve? + description: Describe the changes or improvements that should be made to the documentation or comment. + placeholder: "Please describe the suggested improvements here." + validations: + required: true diff --git a/data/sam_mask/lang-segment-anything/.github/ISSUE_TEMPLATE/feature-request.yaml b/data/sam_mask/lang-segment-anything/.github/ISSUE_TEMPLATE/feature-request.yaml new file mode 100644 index 0000000..a4d5dfe --- /dev/null +++ b/data/sam_mask/lang-segment-anything/.github/ISSUE_TEMPLATE/feature-request.yaml @@ -0,0 +1,30 @@ +name: 🚀 Feature Request +description: Suggest an improvement or new feature +labels: ["enhancement"] +body: + - type: markdown + attributes: + value: | + ## 🚀 Feature + + A clear and concise description of the feature proposal. + + - type: textarea + attributes: + label: Motivation & Examples + description: | + Tell us why the feature is useful. + + Describe what the feature would look like if it is implemented. Best demonstrated using **code examples** in addition to words. + placeholder: | + + validations: + required: true + + - type: markdown + attributes: + value: | + ## Note + + We only consider adding new features if they are relevant to this library. + Consider if this new feature deserves to be here or should be a new library. diff --git a/data/sam_mask/lang-segment-anything/.github/ISSUE_TEMPLATE/refactoring.yaml b/data/sam_mask/lang-segment-anything/.github/ISSUE_TEMPLATE/refactoring.yaml new file mode 100644 index 0000000..cee323e --- /dev/null +++ b/data/sam_mask/lang-segment-anything/.github/ISSUE_TEMPLATE/refactoring.yaml @@ -0,0 +1,27 @@ +name: Refactor +description: Suggest a code refactor or deprecation +labels: ["needs triage"] +body: + - type: textarea + attributes: + label: Outline & Motivation + description: A clear and concise description of the refactor... + placeholder: | + Please outline the motivation for the proposal. + If this is related to another GitHub issue, please link it here + validations: + required: true + + - type: textarea + attributes: + label: Pitch + description: A clear and concise description of what you want to happen. + validations: + required: false + + - type: textarea + attributes: + label: Additional context + description: Add any other context or screenshots here. + validations: + required: false diff --git a/data/sam_mask/lang-segment-anything/.github/pull_request_template.md b/data/sam_mask/lang-segment-anything/.github/pull_request_template.md new file mode 100644 index 0000000..05699d1 --- /dev/null +++ b/data/sam_mask/lang-segment-anything/.github/pull_request_template.md @@ -0,0 +1,11 @@ +## Describe your changes and approach used + +Fixes #ISSUE-NUMBER + +## Checklist before requesting a review + +- [ ] I have performed a self-review of my code. +- [ ] I have performed linting on my code. +- [ ] I have linked the related issue. +- [ ] The code is documented accordingly. +- [ ] If it is a core feature, I have added thorough tests. diff --git a/data/sam_mask/lang-segment-anything/.github/workflows/pre-commit.yml b/data/sam_mask/lang-segment-anything/.github/workflows/pre-commit.yml new file mode 100644 index 0000000..306a690 --- /dev/null +++ b/data/sam_mask/lang-segment-anything/.github/workflows/pre-commit.yml @@ -0,0 +1,29 @@ +name: pre-commit +on: [push, pull_request] + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - name: Checkout branch + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Get changed files + id: changed-files + uses: tj-actions/changed-files@v35 + with: + files: '**/*.py' + + - name: Set up Python [3.11] + uses: actions/setup-python@v1 + with: + python-version: "3.11" + + - name: Install pre-commit + run: pip install pre-commit + + - name: Run pre-commit on changed files + run: | + pre-commit run --files ${{ steps.changed-files.outputs.all_changed_files }} diff --git a/diffusion_policies/.gitignore b/data/sam_mask/lang-segment-anything/.gitignore old mode 100755 new mode 100644 similarity index 93% rename from diffusion_policies/.gitignore rename to data/sam_mask/lang-segment-anything/.gitignore index 23dbd4e..1e7dd58 --- a/diffusion_policies/.gitignore +++ b/data/sam_mask/lang-segment-anything/.gitignore @@ -1,23 +1,3 @@ -bin -logs -wandb -outputs -data -data_local -.vscode -_wandb - -**/.DS_Store - -fuse.cfg - -*.ai - -# Generation results -results/ - -ray/auth.json - # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] @@ -25,6 +5,7 @@ __pycache__/ # C extensions *.so +*.pth # Distribution / packaging .Python @@ -121,6 +102,15 @@ celerybeat.pid # SageMath parsed files *.sage.py +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + # Spyder project settings .spyderproject .spyproject diff --git a/data/sam_mask/lang-segment-anything/.pre-commit-config.yaml b/data/sam_mask/lang-segment-anything/.pre-commit-config.yaml new file mode 100644 index 0000000..0d2cdbb --- /dev/null +++ b/data/sam_mask/lang-segment-anything/.pre-commit-config.yaml @@ -0,0 +1,66 @@ + +default_language_version: + python: python3.11 + + +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.1.0 + hooks: + - id: end-of-file-fixer + - id: trailing-whitespace + - id: check-yaml + - id: check-docstring-first + - id: check-executables-have-shebangs + - id: check-case-conflict + - id: check-added-large-files + args: ['--maxkb=500', '--enforce-all'] + - id: detect-private-key + + - repo: https://github.com/commitizen-tools/commitizen + rev: v2.27.0 + hooks: + - id: commitizen + stages: [commit-msg] + name: Format commit msg + + - repo: https://github.com/asottile/pyupgrade + rev: v2.31.0 + hooks: + - id: pyupgrade + args: [--py311-plus] + name: Upgrade code + + - repo: https://github.com/myint/docformatter + rev: 06907d0267368b49b9180eed423fae5697c1e909 # todo: fix for docformatter after last 1.7.5 + hooks: + - id: docformatter + args: [--in-place, --wrap-summaries=115, --wrap-descriptions=120] + + - repo: https://github.com/asottile/yesqa + rev: v1.3.0 + hooks: + - id: yesqa + name: Unused noqa + + - repo: https://github.com/charliermarsh/ruff-pre-commit + # Ruff version. + rev: 'v0.0.235' + hooks: + - id: ruff + + - repo: https://github.com/asottile/blacken-docs + rev: v1.12.0 + hooks: + - id: blacken-docs + args: [--line-length=120] + additional_dependencies: [black==21.12b0] + + - repo: https://github.com/executablebooks/mdformat + rev: 0.7.11 + hooks: + - id: mdformat + additional_dependencies: + - mdformat-gfm + - mdformat_frontmatter + exclude: CHANGELOG.md diff --git a/data/sam_mask/lang-segment-anything/Dockerfile b/data/sam_mask/lang-segment-anything/Dockerfile new file mode 100644 index 0000000..dc65317 --- /dev/null +++ b/data/sam_mask/lang-segment-anything/Dockerfile @@ -0,0 +1,27 @@ +FROM nvidia/cuda:12.4.1-cudnn-devel-ubuntu22.04 + +# Set environment variables +ENV DEBIAN_FRONTEND=noninteractive +ENV GRADIO_SERVER_NAME="0.0.0.0" + +# Install necessary packages +RUN apt-get update && apt-get install -y \ + python3 \ + python3-pip \ + openssh-client \ + build-essential \ + git \ + libgl1-mesa-glx + +COPY . /lang-segment-anything + +# Install dependencies +WORKDIR /lang-segment-anything +RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt + +EXPOSE 8000 + +# Entry point +CMD ["python3", "app.py"] + +RUN apt-get update && apt-get install -y libglib2.0-0 diff --git a/data/sam_mask/lang-segment-anything/LICENSE b/data/sam_mask/lang-segment-anything/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/data/sam_mask/lang-segment-anything/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/data/sam_mask/lang-segment-anything/README.md b/data/sam_mask/lang-segment-anything/README.md new file mode 100644 index 0000000..878b0d8 --- /dev/null +++ b/data/sam_mask/lang-segment-anything/README.md @@ -0,0 +1,106 @@ +# Language Segment-Anything + +Language Segment-Anything is an open-source project that combines the power of instance segmentation and text prompts to generate masks for specific objects in images. Built on the recently released Meta model, Segment Anything Model 2, and the GroundingDINO detection model, it's an easy-to-use and effective tool for object detection and image segmentation. + +![person.png](/assets/outputs/person.png) + +## Features + +- Zero-shot text-to-bbox approach for object detection. +- GroundingDINO detection model integration. +- SAM 2.1 +- Batch inference support. +- Easy endpoint deployment using the Lightning AI litserve platform. +- Customizable text prompts for precise object segmentation. + +## Getting Started + +### Prerequisites + +- Python 3.10 or higher + +### Installation + +#### Installing PyTorch Dependencies + +Before installing `lang-sam`, please install PyTorch using the following command: + +```bash + +pip install torch==2.4.1 torchvision==0.19.1 --extra-index-url https://download.pytorch.org/whl/cu124 + +``` + +```bash + +pip install -U git+https://github.com/luca-medeiros/lang-segment-anything.git + +``` + +Or +Clone the repository and install the required packages: + +```bash + +git clone https://github.com/luca-medeiros/lang-segment-anything && cd lang-segment-anything +pip install -e . + +``` + +#### Docker Installation + +Build and run the image. + +```bash + +git clone https://github.com/luca-medeiros/lang-segment-anything && cd lang-segment-anything +docker build --tag lang-segment-anything:latest . +docker run --gpus all -p 8000:8000 lang-segment-anything:latest + +``` + +### Usage + +To run the gradio APP: + +`python app.py` +And open `http://0.0.0.0:8000/gradio` + +Use as a library: + +```python +from PIL import Image +from lang_sam import LangSAM + +model = LangSAM() +image_pil = Image.open("./assets/car.jpeg").convert("RGB") +text_prompt = "wheel." +results = model.predict([image_pil], [text_prompt]) +``` + +If desired, arguments below can be passed for offline operations: +```python +LangSAM(sam_ckpt_path, # path for segment anything model + gdino_model_ckpt_path, # path for grounding dino's model checkpoint + gdino_processor_ckpt_path # path for grounding dino's processor checkpoint +) +``` + +## Examples + +![car.png](/assets/outputs/car.png) + +![fruits.png](/assets/outputs/fruits.png) + +## Acknowledgments + +This project is based on/used the following repositories: + +- [GroundingDINO](https://github.com/IDEA-Research/GroundingDINO) +- [Segment-Anything](https://github.com/facebookresearch/segment-anything-2) +- [LitServe](https://github.com/Lightning-AI/LitServe/) +- [Supervision](https://github.com/roboflow/supervision) + +## License + +This project is licensed under the Apache 2.0 License diff --git a/diffusion_policies/diffusion_policies/dataset/__init__.py b/data/sam_mask/lang-segment-anything/[2600:1f18:2148:bc01:9e79:39e7:91ec:665c]:443: old mode 100755 new mode 100644 similarity index 100% rename from diffusion_policies/diffusion_policies/dataset/__init__.py rename to data/sam_mask/lang-segment-anything/[2600:1f18:2148:bc01:9e79:39e7:91ec:665c]:443: diff --git a/data/sam_mask/lang-segment-anything/app.py b/data/sam_mask/lang-segment-anything/app.py new file mode 100644 index 0000000..6f10a74 --- /dev/null +++ b/data/sam_mask/lang-segment-anything/app.py @@ -0,0 +1,98 @@ +import os +from io import BytesIO + +import gradio as gr +import requests +from PIL import Image + +from lang_sam import SAM_MODELS +from lang_sam.server import PORT, server + + +def inference(sam_type, box_threshold, text_threshold, image, text_prompt): + """Gradio function that makes a request to the /predict LitServe endpoint.""" + url = f"http://localhost:{PORT}/predict" # Adjust port if needed + + # Prepare the multipart form data + with open(image, "rb") as img_file: + files = { + "image": img_file, + } + data = { + "sam_type": sam_type, + "box_threshold": str(box_threshold), + "text_threshold": str(text_threshold), + "text_prompt": text_prompt, + } + + try: + response = requests.post(url, files=files, data=data) + except Exception as e: + print(f"Request failed: {e}") + return None + + if response.status_code == 200: + try: + output_image = Image.open(BytesIO(response.content)).convert("RGB") + return output_image + except Exception as e: + print(f"Failed to process response image: {e}") + return None + else: + print(f"Request failed with status code {response.status_code}: {response.text}") + return None + + +with gr.Blocks(title="lang-sam") as blocks: + with gr.Row(): + sam_model_choices = gr.Dropdown(choices=list(SAM_MODELS.keys()), label="SAM Model", value="sam2.1_hiera_small") + box_threshold = gr.Slider(minimum=0.0, maximum=1.0, value=0.3, label="Box Threshold") + text_threshold = gr.Slider(minimum=0.0, maximum=1.0, value=0.25, label="Text Threshold") + with gr.Row(): + image_input = gr.Image(type="filepath", label="Input Image") + output_image = gr.Image(type="pil", label="Output Image") + text_prompt = gr.Textbox(lines=1, label="Text Prompt") + + submit_btn = gr.Button("Run Prediction") + + submit_btn.click( + fn=inference, + inputs=[sam_model_choices, box_threshold, text_threshold, image_input, text_prompt], + outputs=output_image, + ) + + examples = [ + [ + "sam2.1_hiera_small", + 0.32, + 0.25, + os.path.join(os.path.dirname(__file__), "assets", "fruits.jpg"), + "kiwi. watermelon. blueberry.", + ], + [ + "sam2.1_hiera_small", + 0.3, + 0.25, + os.path.join(os.path.dirname(__file__), "assets", "car.jpeg"), + "wheel.", + ], + [ + "sam2.1_hiera_small", + 0.3, + 0.25, + os.path.join(os.path.dirname(__file__), "assets", "food.jpg"), + "food.", + ], + ] + + gr.Examples( + examples=examples, + inputs=[sam_model_choices, box_threshold, text_threshold, image_input, text_prompt], + outputs=output_image, + ) + +server.app = gr.mount_gradio_app(server.app, blocks, path="/gradio") + +if __name__ == "__main__": + print(f"Starting LitServe and Gradio server on port {PORT}...") + server.run(port=PORT) diff --git a/data/sam_mask/lang-segment-anything/assets/car.jpeg b/data/sam_mask/lang-segment-anything/assets/car.jpeg new file mode 100644 index 0000000..65a1c0a Binary files /dev/null and b/data/sam_mask/lang-segment-anything/assets/car.jpeg differ diff --git a/data/sam_mask/lang-segment-anything/client.py b/data/sam_mask/lang-segment-anything/client.py new file mode 100644 index 0000000..5edcbe9 --- /dev/null +++ b/data/sam_mask/lang-segment-anything/client.py @@ -0,0 +1,7 @@ +# This file is auto-generated by LitServe. +# Disable auto-generation by setting `generate_client_file=False` in `LitServer.run()`. + +import requests + +response = requests.post("http://127.0.0.1:8000/predict", json={"input": 4.0}) +print(f"Status: {response.status_code}\nResponse:\n {response.text}") diff --git a/data/sam_mask/lang-segment-anything/get_mask_bbhl.py b/data/sam_mask/lang-segment-anything/get_mask_bbhl.py new file mode 100644 index 0000000..9595f94 --- /dev/null +++ b/data/sam_mask/lang-segment-anything/get_mask_bbhl.py @@ -0,0 +1,73 @@ +# https://github.com/luca-medeiros/lang-segment-anything + +from PIL import Image +from lang_sam import LangSAM +import numpy as np +import os + + +# Function to apply transparent masks on the image +def save_mask_results(image, masks, output_path): + # Ensure the image is in RGBA mode (with transparency support) + image = image_pil.convert("RGBA") + + # Iterate over the binary masks + for mask in masks: + # Convert mask to the same size as the image + mask_resized = Image.fromarray(mask).resize(image.size, Image.NEAREST).convert("L") + + # Create an RGBA mask with the same size + mask_rgba = mask_resized.convert("RGBA") + + # Get the alpha channel from the mask to apply transparency + mask_rgba = np.array(mask_rgba) + alpha_channel = mask_rgba[:, :, 0] # Assuming the mask is single-channel + + # Create a new transparent image with the same size as the input image + transparent_overlay = np.zeros((image.height, image.width, 4), dtype=np.uint8) + + # Set the red, green, and blue channels to some color (e.g., red) + transparent_overlay[:, :, 0] = 255 # Red channel + transparent_overlay[:, :, 1] = 0 # Green channel + transparent_overlay[:, :, 2] = 0 # Blue channel + + # Set the alpha channel to apply transparency from the mask + transparent_overlay[:, :, 3] = alpha_channel + + # Convert the overlay to an Image object + overlay_image = Image.fromarray(transparent_overlay, "RGBA") + + # Composite the overlay with the original image + image = Image.alpha_composite(image, overlay_image) + + # Save the resulting image + image.save(output_path, "PNG") + +# Function to save a binary mask as an image +def save_binary_mask(mask, output_path): + # Ensure the output directory exists + os.makedirs(os.path.dirname(output_path), exist_ok=True) + # Convert the binary mask to a PIL Image object + mask_image = Image.fromarray((mask * 255).astype(np.uint8)) # Multiply by 255 to make 1 white and 0 black + # Save the mask as an image + mask_image.save(output_path) + + +model = LangSAM() +image_paths = [ + f"/home/lemonhdl/workspace/DemoGen/data/sam_mask/beat_block_hammer_loop5/000000.jpg" + for i in range(1) +] +# text_prompt = "an iron hammer with black handle" +text_prompt = "a red cubic building block" + +for idx, image_path in enumerate(image_paths): + image_pil = Image.open(image_path).convert("RGB") + results = model.predict([image_pil], [text_prompt]) + masks = results[0]["masks"] + print(masks.shape) + # assert masks.shape[0] == 1 + save_binary_mask( + masks[0], + f"/home/lemonhdl/workspace/DemoGen/data/sam_mask/beat_block_hammer_loop5/0/block.jpg" + ) \ No newline at end of file diff --git a/data/sam_mask/lang-segment-anything/lang_sam/__init__.py b/data/sam_mask/lang-segment-anything/lang_sam/__init__.py new file mode 100644 index 0000000..9130847 --- /dev/null +++ b/data/sam_mask/lang-segment-anything/lang_sam/__init__.py @@ -0,0 +1,2 @@ +from lang_sam.lang_sam import LangSAM +from lang_sam.models.sam import SAM_MODELS diff --git a/data/sam_mask/lang-segment-anything/lang_sam/lang_sam.py b/data/sam_mask/lang-segment-anything/lang_sam/lang_sam.py new file mode 100644 index 0000000..eea0606 --- /dev/null +++ b/data/sam_mask/lang-segment-anything/lang_sam/lang_sam.py @@ -0,0 +1,83 @@ +import numpy as np +from PIL import Image + +from lang_sam.models.gdino import GDINO +from lang_sam.models.sam import SAM +from lang_sam.models.utils import DEVICE + + +class LangSAM: + def __init__(self, sam_type="sam2.1_hiera_small", sam_ckpt_path: str | None = None, gdino_model_ckpt_path: str | None = None, gdino_processor_ckpt_path: str | None = None, device=DEVICE): + self.sam_type = sam_type + + self.sam = SAM() + self.sam.build_model(sam_type, sam_ckpt_path, device=device) + self.gdino = GDINO() + self.gdino.build_model(model_ckpt_path=gdino_model_ckpt_path, processor_ckpt_path=gdino_processor_ckpt_path, device=device) + + def predict( + self, + images_pil: list[Image.Image], + texts_prompt: list[str], + box_threshold: float = 0.3, + text_threshold: float = 0.25, + ): + """Predicts masks for given images and text prompts using GDINO and SAM models. + + Parameters: + images_pil (list[Image.Image]): List of input images. + texts_prompt (list[str]): List of text prompts corresponding to the images. + box_threshold (float): Threshold for box predictions. + text_threshold (float): Threshold for text predictions. + + Returns: + list[dict]: List of results containing masks and other outputs for each image. + Output format: + [{ + "boxes": np.ndarray, + "scores": np.ndarray, + "masks": np.ndarray, + "mask_scores": np.ndarray, + }, ...] + """ + + gdino_results = self.gdino.predict(images_pil, texts_prompt, box_threshold, text_threshold) + all_results = [] + sam_images = [] + sam_boxes = [] + sam_indices = [] + for idx, result in enumerate(gdino_results): + result = {k: (v.cpu().numpy() if hasattr(v, "numpy") else v) for k, v in result.items()} + processed_result = { + **result, + "masks": [], + "mask_scores": [], + } + + if result["labels"]: + sam_images.append(np.asarray(images_pil[idx])) + sam_boxes.append(processed_result["boxes"]) + sam_indices.append(idx) + + all_results.append(processed_result) + if sam_images: + print(f"Predicting {len(sam_boxes)} masks") + masks, mask_scores, _ = self.sam.predict_batch(sam_images, xyxy=sam_boxes) + for idx, mask, score in zip(sam_indices, masks, mask_scores): + all_results[idx].update( + { + "masks": mask, + "mask_scores": score, + } + ) + print(f"Predicted {len(all_results)} masks") + return all_results + + +if __name__ == "__main__": + model = LangSAM() + out = model.predict( + [Image.open("./assets/food.jpg"), Image.open("./assets/car.jpeg")], + ["food", "car"], + ) + print(out) diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/bet/libraries/mingpt/__init__.py b/data/sam_mask/lang-segment-anything/lang_sam/models/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/bet/libraries/mingpt/__init__.py rename to data/sam_mask/lang-segment-anything/lang_sam/models/__init__.py diff --git a/data/sam_mask/lang-segment-anything/lang_sam/models/gdino.py b/data/sam_mask/lang-segment-anything/lang_sam/models/gdino.py new file mode 100644 index 0000000..81d6a6b --- /dev/null +++ b/data/sam_mask/lang-segment-anything/lang_sam/models/gdino.py @@ -0,0 +1,64 @@ +import torch +from PIL import Image +from transformers import AutoModelForZeroShotObjectDetection, AutoProcessor + +from lang_sam.models.utils import DEVICE + + +class GDINO: + def build_model(self, model_ckpt_path: str | None = None, processor_ckpt_path: str | None = None, device=DEVICE): + if not model_ckpt_path or not processor_ckpt_path: # indicates that we somehow able to load the model from internet + model_id = "IDEA-Research/grounding-dino-base" + print(f"One or both local paths not provided. Loading from Hugging Face Hub: {model_id}") + self.processor = AutoProcessor.from_pretrained(model_id) + self.model = AutoModelForZeroShotObjectDetection.from_pretrained(model_id).to(device) + + else: + print(f"Attempting to load processor from local path: {processor_ckpt_path}") + self.processor = AutoProcessor.from_pretrained( + processor_ckpt_path, + local_files_only=True, # never goes online + trust_remote_code=True, # Grounding-DINO uses custom code + ) + print(f"Attempting to load model from local path: {model_ckpt_path}") + self.model = AutoModelForZeroShotObjectDetection.from_pretrained( + model_ckpt_path, + local_files_only=True, + trust_remote_code=True, + use_safetensors=True, + ).to(device) + + def predict( + self, + images_pil: list[Image.Image], + texts_prompt: list[str], + box_threshold: float, + text_threshold: float, + ) -> list[dict]: + texts_prompt = [prompt if prompt[-1] == "." else prompt + "." for prompt in texts_prompt] + inputs = self.processor( + images=images_pil, text=texts_prompt, padding=True, return_tensors="pt" + ).to(self.model.device) + with torch.no_grad(): + outputs = self.model(**inputs) + + results = self.processor.post_process_grounded_object_detection( + outputs, + inputs.input_ids, + box_threshold, + text_threshold=text_threshold, + target_sizes=[k.size[::-1] for k in images_pil], + ) + return results + + +if __name__ == "__main__": + gdino = GDINO() + gdino.build_model() + out = gdino.predict( + [Image.open("./assets/car.jpeg"), Image.open("./assets/car.jpeg")], + ["wheel", "wheel"], + 0.3, + 0.25, + ) + print(out) diff --git a/data/sam_mask/lang-segment-anything/lang_sam/models/sam.py b/data/sam_mask/lang-segment-anything/lang_sam/models/sam.py new file mode 100644 index 0000000..6cc8b30 --- /dev/null +++ b/data/sam_mask/lang-segment-anything/lang_sam/models/sam.py @@ -0,0 +1,97 @@ +import numpy as np +import torch +from hydra import compose +from hydra.utils import instantiate +from omegaconf import OmegaConf +from sam2.automatic_mask_generator import SAM2AutomaticMaskGenerator +from sam2.sam2_image_predictor import SAM2ImagePredictor + +from lang_sam.models.utils import DEVICE + +SAM_MODELS = { + "sam2.1_hiera_tiny": { + "url": "https://dl.fbaipublicfiles.com/segment_anything_2/092824/sam2.1_hiera_tiny.pt", + "config": "configs/sam2.1/sam2.1_hiera_t.yaml", + }, + "sam2.1_hiera_small": { + "url": "https://dl.fbaipublicfiles.com/segment_anything_2/092824/sam2.1_hiera_small.pt", + "config": "configs/sam2.1/sam2.1_hiera_s.yaml", + }, + "sam2.1_hiera_base_plus": { + "url": "https://dl.fbaipublicfiles.com/segment_anything_2/092824/sam2.1_hiera_base_plus.pt", + "config": "configs/sam2.1/sam2.1_hiera_b+.yaml", + }, + "sam2.1_hiera_large": { + "url": "https://dl.fbaipublicfiles.com/segment_anything_2/092824/sam2.1_hiera_large.pt", + "config": "configs/sam2.1/sam2.1_hiera_l.yaml", + }, +} + + +class SAM: + def build_model(self, sam_type: str, ckpt_path: str | None = None, device=DEVICE): + self.sam_type = sam_type + self.ckpt_path = ckpt_path + cfg = compose(config_name=SAM_MODELS[self.sam_type]["config"], overrides=[]) + OmegaConf.resolve(cfg) + self.model = instantiate(cfg.model, _recursive_=True) + self._load_checkpoint(self.model) + self.model = self.model.to(device) + self.model.eval() + self.mask_generator = SAM2AutomaticMaskGenerator(self.model) + self.predictor = SAM2ImagePredictor(self.model) + + def _load_checkpoint(self, model: torch.nn.Module): + if self.ckpt_path is None: + checkpoint_url = SAM_MODELS[self.sam_type]["url"] + state_dict = torch.hub.load_state_dict_from_url(checkpoint_url, map_location="cpu")["model"] + else: + checkpoint_url = self.ckpt_path # Ensure checkpoint_url is defined + state_dict = torch.load(self.ckpt_path, map_location="cpu", weights_only=True)["model"] + try: + model.load_state_dict(state_dict, strict=True) + except Exception as e: + raise ValueError( + f"Problem loading SAM please make sure you have the right model type: {self.sam_type} \ + and a working checkpoint: {checkpoint_url}. Recommend deleting the checkpoint and \ + re-downloading it. Error: {e}" + ) + + def generate(self, image_rgb: np.ndarray) -> list[dict]: + """ + Output format + SAM2AutomaticMaskGenerator returns a list of masks, where each mask is a dict containing various information + about the mask: + + segmentation - [np.ndarray] - the mask with (W, H) shape, and bool type + area - [int] - the area of the mask in pixels + bbox - [List[int]] - the boundary box of the mask in xywh format + predicted_iou - [float] - the model's own prediction for the quality of the mask + point_coords - [List[List[float]]] - the sampled input point that generated this mask + stability_score - [float] - an additional measure of mask quality + crop_box - List[int] - the crop of the image used to generate this mask in xywh format + """ + + sam2_result = self.mask_generator.generate(image_rgb) + return sam2_result + + def predict(self, image_rgb: np.ndarray, xyxy: np.ndarray) -> tuple[np.ndarray, np.ndarray, np.ndarray]: + self.predictor.set_image(image_rgb) + masks, scores, logits = self.predictor.predict(box=xyxy, multimask_output=False) + if len(masks.shape) > 3: + masks = np.squeeze(masks, axis=1) + return masks, scores, logits + + def predict_batch( + self, + images_rgb: list[np.ndarray], + xyxy: list[np.ndarray], + ) -> tuple[list[np.ndarray], list[np.ndarray], list[np.ndarray]]: + self.predictor.set_image_batch(images_rgb) + + masks, scores, logits = self.predictor.predict_batch(box_batch=xyxy, multimask_output=False) + + masks = [np.squeeze(mask, axis=1) if len(mask.shape) > 3 else mask for mask in masks] + scores = [np.squeeze(score) for score in scores] + logits = [np.squeeze(logit, axis=1) if len(logit.shape) > 3 else logit for logit in logits] + return masks, scores, logits diff --git a/data/sam_mask/lang-segment-anything/lang_sam/models/utils.py b/data/sam_mask/lang-segment-anything/lang_sam/models/utils.py new file mode 100644 index 0000000..895b53d --- /dev/null +++ b/data/sam_mask/lang-segment-anything/lang_sam/models/utils.py @@ -0,0 +1,23 @@ +import logging + +import torch + + +def get_device_type() -> str: + if torch.backends.mps.is_available(): + return "mps" + elif torch.cuda.is_available(): + return "cuda" + else: + logging.warning("No GPU found, using CPU instead") + return "cpu" + + +device_type = get_device_type() +DEVICE = torch.device(device_type) + +if torch.cuda.is_available(): + torch.autocast(device_type="cuda", dtype=torch.bfloat16).__enter__() + if torch.cuda.get_device_properties(0).major >= 8: + torch.backends.cuda.matmul.allow_tf32 = True + torch.backends.cudnn.allow_tf32 = True diff --git a/data/sam_mask/lang-segment-anything/lang_sam/server.py b/data/sam_mask/lang-segment-anything/lang_sam/server.py new file mode 100644 index 0000000..1acba82 --- /dev/null +++ b/data/sam_mask/lang-segment-anything/lang_sam/server.py @@ -0,0 +1,121 @@ +from io import BytesIO + +import litserve as ls +import numpy as np +from fastapi import Response, UploadFile +from PIL import Image + +from lang_sam import LangSAM +from lang_sam.utils import draw_image + +PORT = 8000 + + +class LangSAMAPI(ls.LitAPI): + def setup(self, device: str) -> None: + """Initialize or load the LangSAM model.""" + self.model = LangSAM(sam_type="sam2.1_hiera_small", device=device) + print("LangSAM model initialized.") + + def decode_request(self, request) -> dict: + """Decode the incoming request to extract parameters and image bytes. + + Assumes the request is sent as multipart/form-data with fields: + - sam_type: str + - box_threshold: float + - text_threshold: float + - text_prompt: str + - image: UploadFile + """ + # Extract form data + sam_type = request.get("sam_type") + box_threshold = float(request.get("box_threshold", 0.3)) + text_threshold = float(request.get("text_threshold", 0.25)) + text_prompt = request.get("text_prompt", "") + + # Extract image file + image_file: UploadFile = request.get("image") + if image_file is None: + raise ValueError("No image file provided in the request.") + + image_bytes = image_file.file.read() + + return { + "sam_type": sam_type, + "box_threshold": box_threshold, + "text_threshold": text_threshold, + "image_bytes": image_bytes, + "text_prompt": text_prompt, + } + + def predict(self, inputs: dict) -> dict: + """Perform prediction using the LangSAM model. + + Yields: + dict: Contains the processed output image. + """ + print("Starting prediction with parameters:") + print( + f"sam_type: {inputs['sam_type']}, \ + box_threshold: {inputs['box_threshold']}, \ + text_threshold: {inputs['text_threshold']}, \ + text_prompt: {inputs['text_prompt']}" + ) + + if inputs["sam_type"] != self.model.sam_type: + print(f"Updating SAM model type to {inputs['sam_type']}") + self.model.sam.build_model(inputs["sam_type"]) + + try: + image_pil = Image.open(BytesIO(inputs["image_bytes"])).convert("RGB") + except Exception as e: + raise ValueError(f"Invalid image data: {e}") + + results = self.model.predict( + images_pil=[image_pil], + texts_prompt=[inputs["text_prompt"]], + box_threshold=inputs["box_threshold"], + text_threshold=inputs["text_threshold"], + ) + results = results[0] + + if not len(results["masks"]): + print("No masks detected. Returning original image.") + return {"output_image": image_pil} + + # Draw results on the image + image_array = np.asarray(image_pil) + output_image = draw_image( + image_array, + results["masks"], + results["boxes"], + results["scores"], + results["labels"], + ) + output_image = Image.fromarray(np.uint8(output_image)).convert("RGB") + + return {"output_image": output_image} + + def encode_response(self, output: dict) -> Response: + """Encode the prediction result into an HTTP response. + + Returns: + Response: Contains the processed image in PNG format. + """ + try: + image = output["output_image"] + buffer = BytesIO() + image.save(buffer, format="PNG") + buffer.seek(0) + return Response(content=buffer.getvalue(), media_type="image/png") + except StopIteration: + raise ValueError("No output generated by the prediction.") + + +lit_api = LangSAMAPI() +server = ls.LitServer(lit_api) + + +if __name__ == "__main__": + print(f"Starting LitServe and Gradio server on port {PORT}...") + server.run(port=PORT) diff --git a/data/sam_mask/lang-segment-anything/lang_sam/utils.py b/data/sam_mask/lang-segment-anything/lang_sam/utils.py new file mode 100644 index 0000000..fef18ed --- /dev/null +++ b/data/sam_mask/lang-segment-anything/lang_sam/utils.py @@ -0,0 +1,99 @@ +import cv2 +import numpy as np +import supervision as sv +from PIL import Image + +MIN_AREA = 100 + + +def load_image(image_path: str): + return Image.open(image_path).convert("RGB") + + +def draw_image(image_rgb, masks, xyxy, probs, labels): + box_annotator = sv.BoxCornerAnnotator() + label_annotator = sv.LabelAnnotator() + mask_annotator = sv.MaskAnnotator() + # Create class_id for each unique label + unique_labels = list(set(labels)) + class_id_map = {label: idx for idx, label in enumerate(unique_labels)} + class_id = [class_id_map[label] for label in labels] + + # Add class_id to the Detections object + detections = sv.Detections( + xyxy=xyxy, + mask=masks.astype(bool), + confidence=probs, + class_id=np.array(class_id), + ) + annotated_image = box_annotator.annotate(scene=image_rgb.copy(), detections=detections) + annotated_image = label_annotator.annotate(scene=annotated_image, detections=detections, labels=labels) + annotated_image = mask_annotator.annotate(scene=annotated_image, detections=detections) + return annotated_image + + +def get_contours(mask): + if len(mask.shape) > 2: + mask = np.squeeze(mask, 0) + mask = mask.astype(np.uint8) + mask *= 255 + contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) + effContours = [] + for c in contours: + area = cv2.contourArea(c) + if area > MIN_AREA: + effContours.append(c) + return effContours + + +def contour_to_points(contour): + pointsNum = len(contour) + contour = contour.reshape(pointsNum, -1).astype(np.float32) + points = [point.tolist() for point in contour] + return points + + +def generate_labelme_json(binary_masks, labels, image_size, image_path=None): + """Generate a LabelMe format JSON file from binary mask tensor. + + Args: + binary_masks: Binary mask tensor of shape [N, H, W]. + labels: List of labels for each mask. + image_size: Tuple of (height, width) for the image size. + image_path: Path to the image file (optional). + + Returns: + A dictionary representing the LabelMe JSON file. + """ + num_masks = binary_masks.shape[0] + binary_masks = binary_masks.numpy() + + json_dict = { + "version": "4.5.6", + "imageHeight": image_size[0], + "imageWidth": image_size[1], + "imagePath": image_path, + "flags": {}, + "shapes": [], + "imageData": None, + } + + # Loop through the masks and add them to the JSON dictionary + for i in range(num_masks): + mask = binary_masks[i] + label = labels[i] + effContours = get_contours(mask) + + for effContour in effContours: + points = contour_to_points(effContour) + shape_dict = { + "label": label, + "line_color": None, + "fill_color": None, + "points": points, + "shape_type": "polygon", + } + + json_dict["shapes"].append(shape_dict) + + return json_dict diff --git a/data/sam_mask/lang-segment-anything/pyproject.toml b/data/sam_mask/lang-segment-anything/pyproject.toml new file mode 100644 index 0000000..8a83ebb --- /dev/null +++ b/data/sam_mask/lang-segment-anything/pyproject.toml @@ -0,0 +1,59 @@ +[build-system] +requires = ["setuptools", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "lang-sam" +version = "0.2.1" +description = "Language segment-anything" +readme = "README.md" +authors = [ + { name = "Luca Medeiros", email = "lucamedeiros@outlook.com" }, +] +requires-python = ">=3.10" +dynamic = ["dependencies"] + +[tool.setuptools.dynamic] +dependencies = {file = ["requirements.txt"]} + +[tool.setuptools.packages.find] +where = ["."] +include = ["lang_sam", "lang_sam.*"] + +[tool.ruff] +target-version = "py311" +line-length = 120 +fix = true +select = [ + # https://github.com/charliermarsh/ruff#pyflakes-f + "F", # Pyflakes + # https://github.com/charliermarsh/ruff#pycodestyle-e-w + "E", # pycodestyle + "W", # Warning + # https://github.com/charliermarsh/ruff#flake8-comprehensions-c4 + # https://github.com/charliermarsh/ruff#mccabe-c90 + "C", # Complexity (mccabe+) & comprehensions + # https://github.com/charliermarsh/ruff#pyupgrade-up + "UP", # pyupgrade + # https://github.com/charliermarsh/ruff#isort-i + "I", # isort +] +ignore = [ + # https://github.com/charliermarsh/ruff#pycodestyle-e-w + "E402", # module level import not at top of file + # https://github.com/charliermarsh/ruff#pyupgrade-up + "UP006", # use-pep585-annotation + "UP007", # use-pep604-annotation + "E741", # Ambiguous variable name +] +[tool.ruff.per-file-ignores] +"__init__.py" = [ + "F401", # unused import + "F403", # star imports + ] + +[tool.ruff.mccabe] +max-complexity = 24 + +[tool.ruff.pydocstyle] +convention = "numpy" diff --git a/data/sam_mask/lang-segment-anything/requirements.txt b/data/sam_mask/lang-segment-anything/requirements.txt new file mode 100644 index 0000000..af07a07 --- /dev/null +++ b/data/sam_mask/lang-segment-anything/requirements.txt @@ -0,0 +1,8 @@ +gradio>=5.29.0 +litserve>=0.2.8 +opencv-python-headless>=4.10.0.84 +sam-2 @ git+https://github.com/facebookresearch/segment-anything-2@c2ec8e14a185632b0a5d8b161928ceb50197eddc +supervision>=0.23.0 +transformers>=4.44.2 +torch>=2.3.1 +torchvision>=0.18.1 diff --git a/data/sam_mask/lang-segment-anything/uv.lock b/data/sam_mask/lang-segment-anything/uv.lock new file mode 100644 index 0000000..8b0c308 --- /dev/null +++ b/data/sam_mask/lang-segment-anything/uv.lock @@ -0,0 +1,1800 @@ +version = 1 +revision = 1 +requires-python = ">=3.11" +resolution-markers = [ + "python_full_version >= '3.12' and sys_platform == 'darwin'", + "python_full_version >= '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "(python_full_version >= '3.12' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version < '3.12' and sys_platform == 'darwin'", + "python_full_version < '3.12' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "(python_full_version < '3.12' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.12' and sys_platform != 'darwin' and sys_platform != 'linux')", +] + +[[package]] +name = "aiofiles" +version = "23.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/41/cfed10bc64d774f497a86e5ede9248e1d062db675504b41c320954d99641/aiofiles-23.2.1.tar.gz", hash = "sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a", size = 32072 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/19/5af6804c4cc0fed83f47bff6e413a98a36618e7d40185cd36e69737f3b0e/aiofiles-23.2.1-py3-none-any.whl", hash = "sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107", size = 15727 }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, +] + +[[package]] +name = "antlr4-python3-runtime" +version = "4.9.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/38/7859ff46355f76f8d19459005ca000b6e7012f2f1ca597746cbcd1fbfe5e/antlr4-python3-runtime-4.9.3.tar.gz", hash = "sha256:f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b", size = 117034 } + +[[package]] +name = "anyio" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "sniffio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916 }, +] + +[[package]] +name = "certifi" +version = "2025.1.31" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", size = 194995 }, + { url = "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", size = 139471 }, + { url = "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", size = 149831 }, + { url = "https://files.pythonhosted.org/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", size = 142335 }, + { url = "https://files.pythonhosted.org/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", size = 143862 }, + { url = "https://files.pythonhosted.org/packages/c6/c7/32da20821cf387b759ad24627a9aca289d2822de929b8a41b6241767b461/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", size = 145673 }, + { url = "https://files.pythonhosted.org/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", size = 140211 }, + { url = "https://files.pythonhosted.org/packages/28/a3/a42e70d03cbdabc18997baf4f0227c73591a08041c149e710045c281f97b/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", size = 148039 }, + { url = "https://files.pythonhosted.org/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", size = 151939 }, + { url = "https://files.pythonhosted.org/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", size = 149075 }, + { url = "https://files.pythonhosted.org/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", size = 144340 }, + { url = "https://files.pythonhosted.org/packages/b5/b6/9674a4b7d4d99a0d2df9b215da766ee682718f88055751e1e5e753c82db0/charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", size = 95205 }, + { url = "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", size = 102441 }, + { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, + { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, + { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, + { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, + { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, + { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, + { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, + { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, + { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, + { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, + { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, + { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, + { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, + { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, + { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, + { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, + { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, + { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, + { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, + { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, + { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, + { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, + { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, + { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, + { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, + { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, + { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, +] + +[[package]] +name = "click" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "contourpy" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/b9/ede788a0b56fc5b071639d06c33cb893f68b1178938f3425debebe2dab78/contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445", size = 269636 }, + { url = "https://files.pythonhosted.org/packages/e6/75/3469f011d64b8bbfa04f709bfc23e1dd71be54d05b1b083be9f5b22750d1/contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773", size = 254636 }, + { url = "https://files.pythonhosted.org/packages/8d/2f/95adb8dae08ce0ebca4fd8e7ad653159565d9739128b2d5977806656fcd2/contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1", size = 313053 }, + { url = "https://files.pythonhosted.org/packages/c3/a6/8ccf97a50f31adfa36917707fe39c9a0cbc24b3bbb58185577f119736cc9/contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43", size = 352985 }, + { url = "https://files.pythonhosted.org/packages/1d/b6/7925ab9b77386143f39d9c3243fdd101621b4532eb126743201160ffa7e6/contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab", size = 323750 }, + { url = "https://files.pythonhosted.org/packages/c2/f3/20c5d1ef4f4748e52d60771b8560cf00b69d5c6368b5c2e9311bcfa2a08b/contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7", size = 326246 }, + { url = "https://files.pythonhosted.org/packages/8c/e5/9dae809e7e0b2d9d70c52b3d24cba134dd3dad979eb3e5e71f5df22ed1f5/contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83", size = 1308728 }, + { url = "https://files.pythonhosted.org/packages/e2/4a/0058ba34aeea35c0b442ae61a4f4d4ca84d6df8f91309bc2d43bb8dd248f/contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd", size = 1375762 }, + { url = "https://files.pythonhosted.org/packages/09/33/7174bdfc8b7767ef2c08ed81244762d93d5c579336fc0b51ca57b33d1b80/contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f", size = 178196 }, + { url = "https://files.pythonhosted.org/packages/5e/fe/4029038b4e1c4485cef18e480b0e2cd2d755448bb071eb9977caac80b77b/contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878", size = 222017 }, + { url = "https://files.pythonhosted.org/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", size = 271580 }, + { url = "https://files.pythonhosted.org/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", size = 255530 }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", size = 307688 }, + { url = "https://files.pythonhosted.org/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", size = 347331 }, + { url = "https://files.pythonhosted.org/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", size = 318963 }, + { url = "https://files.pythonhosted.org/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", size = 323681 }, + { url = "https://files.pythonhosted.org/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", size = 1308674 }, + { url = "https://files.pythonhosted.org/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", size = 1380480 }, + { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489 }, + { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042 }, + { url = "https://files.pythonhosted.org/packages/2e/61/5673f7e364b31e4e7ef6f61a4b5121c5f170f941895912f773d95270f3a2/contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb", size = 271630 }, + { url = "https://files.pythonhosted.org/packages/ff/66/a40badddd1223822c95798c55292844b7e871e50f6bfd9f158cb25e0bd39/contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08", size = 255670 }, + { url = "https://files.pythonhosted.org/packages/1e/c7/cf9fdee8200805c9bc3b148f49cb9482a4e3ea2719e772602a425c9b09f8/contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c", size = 306694 }, + { url = "https://files.pythonhosted.org/packages/dd/e7/ccb9bec80e1ba121efbffad7f38021021cda5be87532ec16fd96533bb2e0/contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f", size = 345986 }, + { url = "https://files.pythonhosted.org/packages/dc/49/ca13bb2da90391fa4219fdb23b078d6065ada886658ac7818e5441448b78/contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85", size = 318060 }, + { url = "https://files.pythonhosted.org/packages/c8/65/5245ce8c548a8422236c13ffcdcdada6a2a812c361e9e0c70548bb40b661/contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841", size = 322747 }, + { url = "https://files.pythonhosted.org/packages/72/30/669b8eb48e0a01c660ead3752a25b44fdb2e5ebc13a55782f639170772f9/contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422", size = 1308895 }, + { url = "https://files.pythonhosted.org/packages/05/5a/b569f4250decee6e8d54498be7bdf29021a4c256e77fe8138c8319ef8eb3/contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef", size = 1379098 }, + { url = "https://files.pythonhosted.org/packages/19/ba/b227c3886d120e60e41b28740ac3617b2f2b971b9f601c835661194579f1/contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f", size = 178535 }, + { url = "https://files.pythonhosted.org/packages/12/6e/2fed56cd47ca739b43e892707ae9a13790a486a3173be063681ca67d2262/contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9", size = 223096 }, + { url = "https://files.pythonhosted.org/packages/54/4c/e76fe2a03014a7c767d79ea35c86a747e9325537a8b7627e0e5b3ba266b4/contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f", size = 285090 }, + { url = "https://files.pythonhosted.org/packages/7b/e2/5aba47debd55d668e00baf9651b721e7733975dc9fc27264a62b0dd26eb8/contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739", size = 268643 }, + { url = "https://files.pythonhosted.org/packages/a1/37/cd45f1f051fe6230f751cc5cdd2728bb3a203f5619510ef11e732109593c/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823", size = 310443 }, + { url = "https://files.pythonhosted.org/packages/8b/a2/36ea6140c306c9ff6dd38e3bcec80b3b018474ef4d17eb68ceecd26675f4/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5", size = 349865 }, + { url = "https://files.pythonhosted.org/packages/95/b7/2fc76bc539693180488f7b6cc518da7acbbb9e3b931fd9280504128bf956/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532", size = 321162 }, + { url = "https://files.pythonhosted.org/packages/f4/10/76d4f778458b0aa83f96e59d65ece72a060bacb20cfbee46cf6cd5ceba41/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b", size = 327355 }, + { url = "https://files.pythonhosted.org/packages/43/a3/10cf483ea683f9f8ab096c24bad3cce20e0d1dd9a4baa0e2093c1c962d9d/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52", size = 1307935 }, + { url = "https://files.pythonhosted.org/packages/78/73/69dd9a024444489e22d86108e7b913f3528f56cfc312b5c5727a44188471/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd", size = 1372168 }, + { url = "https://files.pythonhosted.org/packages/0f/1b/96d586ccf1b1a9d2004dd519b25fbf104a11589abfd05484ff12199cca21/contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1", size = 189550 }, + { url = "https://files.pythonhosted.org/packages/b0/e6/6000d0094e8a5e32ad62591c8609e269febb6e4db83a1c75ff8868b42731/contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69", size = 238214 }, + { url = "https://files.pythonhosted.org/packages/ff/c0/91f1215d0d9f9f343e4773ba6c9b89e8c0cc7a64a6263f21139da639d848/contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0", size = 266807 }, + { url = "https://files.pythonhosted.org/packages/d4/79/6be7e90c955c0487e7712660d6cead01fa17bff98e0ea275737cc2bc8e71/contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5", size = 318729 }, + { url = "https://files.pythonhosted.org/packages/87/68/7f46fb537958e87427d98a4074bcde4b67a70b04900cfc5ce29bc2f556c1/contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5", size = 221791 }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321 }, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604 }, +] + +[[package]] +name = "fastapi" +version = "0.115.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f4/55/ae499352d82338331ca1e28c7f4a63bfd09479b16395dce38cf50a39e2c2/fastapi-0.115.12.tar.gz", hash = "sha256:1e2c2a2646905f9e83d32f04a3f86aff4a286669c6c950ca95b5fd68c2602681", size = 295236 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d", size = 95164 }, +] + +[[package]] +name = "ffmpy" +version = "0.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/66/5697a7421c418ccbfae87b7e6503b480070f7cb16c25c77201afc6246348/ffmpy-0.5.0.tar.gz", hash = "sha256:277e131f246d18e9dcfee9bb514c50749031c43582ce5ef82c57b51e3d3955c3", size = 5523 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/5d/65f40bd333463b3230b3a72d93873caaf49b0cbb5228598fafb75fcc5357/ffmpy-0.5.0-py3-none-any.whl", hash = "sha256:df3799cf5816daa56d4959a023630ee53c6768b66009dae6d131519ba4b80233", size = 6008 }, +] + +[[package]] +name = "filelock" +version = "3.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215 }, +] + +[[package]] +name = "fonttools" +version = "4.57.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/03/2d/a9a0b6e3a0cf6bd502e64fc16d894269011930cabfc89aee20d1635b1441/fonttools-4.57.0.tar.gz", hash = "sha256:727ece10e065be2f9dd239d15dd5d60a66e17eac11aea47d447f9f03fdbc42de", size = 3492448 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/1f/e67c99aa3c6d3d2f93d956627e62a57ae0d35dc42f26611ea2a91053f6d6/fonttools-4.57.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3871349303bdec958360eedb619169a779956503ffb4543bb3e6211e09b647c4", size = 2757392 }, + { url = "https://files.pythonhosted.org/packages/aa/f1/f75770d0ddc67db504850898d96d75adde238c35313409bfcd8db4e4a5fe/fonttools-4.57.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c59375e85126b15a90fcba3443eaac58f3073ba091f02410eaa286da9ad80ed8", size = 2285609 }, + { url = "https://files.pythonhosted.org/packages/f5/d3/bc34e4953cb204bae0c50b527307dce559b810e624a733351a654cfc318e/fonttools-4.57.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:967b65232e104f4b0f6370a62eb33089e00024f2ce143aecbf9755649421c683", size = 4873292 }, + { url = "https://files.pythonhosted.org/packages/41/b8/d5933559303a4ab18c799105f4c91ee0318cc95db4a2a09e300116625e7a/fonttools-4.57.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39acf68abdfc74e19de7485f8f7396fa4d2418efea239b7061d6ed6a2510c746", size = 4902503 }, + { url = "https://files.pythonhosted.org/packages/32/13/acb36bfaa316f481153ce78de1fa3926a8bad42162caa3b049e1afe2408b/fonttools-4.57.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d077f909f2343daf4495ba22bb0e23b62886e8ec7c109ee8234bdbd678cf344", size = 5077351 }, + { url = "https://files.pythonhosted.org/packages/b5/23/6d383a2ca83b7516d73975d8cca9d81a01acdcaa5e4db8579e4f3de78518/fonttools-4.57.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:46370ac47a1e91895d40e9ad48effbe8e9d9db1a4b80888095bc00e7beaa042f", size = 5275067 }, + { url = "https://files.pythonhosted.org/packages/bc/ca/31b8919c6da0198d5d522f1d26c980201378c087bdd733a359a1e7485769/fonttools-4.57.0-cp311-cp311-win32.whl", hash = "sha256:ca2aed95855506b7ae94e8f1f6217b7673c929e4f4f1217bcaa236253055cb36", size = 2158263 }, + { url = "https://files.pythonhosted.org/packages/13/4c/de2612ea2216eb45cfc8eb91a8501615dd87716feaf5f8fb65cbca576289/fonttools-4.57.0-cp311-cp311-win_amd64.whl", hash = "sha256:17168a4670bbe3775f3f3f72d23ee786bd965395381dfbb70111e25e81505b9d", size = 2204968 }, + { url = "https://files.pythonhosted.org/packages/cb/98/d4bc42d43392982eecaaca117d79845734d675219680cd43070bb001bc1f/fonttools-4.57.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:889e45e976c74abc7256d3064aa7c1295aa283c6bb19810b9f8b604dfe5c7f31", size = 2751824 }, + { url = "https://files.pythonhosted.org/packages/1a/62/7168030eeca3742fecf45f31e63b5ef48969fa230a672216b805f1d61548/fonttools-4.57.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0425c2e052a5f1516c94e5855dbda706ae5a768631e9fcc34e57d074d1b65b92", size = 2283072 }, + { url = "https://files.pythonhosted.org/packages/5d/82/121a26d9646f0986ddb35fbbaf58ef791c25b59ecb63ffea2aab0099044f/fonttools-4.57.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44c26a311be2ac130f40a96769264809d3b0cb297518669db437d1cc82974888", size = 4788020 }, + { url = "https://files.pythonhosted.org/packages/5b/26/e0f2fb662e022d565bbe280a3cfe6dafdaabf58889ff86fdef2d31ff1dde/fonttools-4.57.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c41ba992df5b8d680b89fd84c6a1f2aca2b9f1ae8a67400c8930cd4ea115f6", size = 4859096 }, + { url = "https://files.pythonhosted.org/packages/9e/44/9075e323347b1891cdece4b3f10a3b84a8f4c42a7684077429d9ce842056/fonttools-4.57.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ea1e9e43ca56b0c12440a7c689b1350066595bebcaa83baad05b8b2675129d98", size = 4964356 }, + { url = "https://files.pythonhosted.org/packages/48/28/caa8df32743462fb966be6de6a79d7f30393859636d7732e82efa09fbbb4/fonttools-4.57.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84fd56c78d431606332a0627c16e2a63d243d0d8b05521257d77c6529abe14d8", size = 5226546 }, + { url = "https://files.pythonhosted.org/packages/f6/46/95ab0f0d2e33c5b1a4fc1c0efe5e286ba9359602c0a9907adb1faca44175/fonttools-4.57.0-cp312-cp312-win32.whl", hash = "sha256:f4376819c1c778d59e0a31db5dc6ede854e9edf28bbfa5b756604727f7f800ac", size = 2146776 }, + { url = "https://files.pythonhosted.org/packages/06/5d/1be5424bb305880e1113631f49a55ea7c7da3a5fe02608ca7c16a03a21da/fonttools-4.57.0-cp312-cp312-win_amd64.whl", hash = "sha256:57e30241524879ea10cdf79c737037221f77cc126a8cdc8ff2c94d4a522504b9", size = 2193956 }, + { url = "https://files.pythonhosted.org/packages/e9/2f/11439f3af51e4bb75ac9598c29f8601aa501902dcedf034bdc41f47dd799/fonttools-4.57.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:408ce299696012d503b714778d89aa476f032414ae57e57b42e4b92363e0b8ef", size = 2739175 }, + { url = "https://files.pythonhosted.org/packages/25/52/677b55a4c0972dc3820c8dba20a29c358197a78229daa2ea219fdb19e5d5/fonttools-4.57.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bbceffc80aa02d9e8b99f2a7491ed8c4a783b2fc4020119dc405ca14fb5c758c", size = 2276583 }, + { url = "https://files.pythonhosted.org/packages/64/79/184555f8fa77b827b9460a4acdbbc0b5952bb6915332b84c615c3a236826/fonttools-4.57.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f022601f3ee9e1f6658ed6d184ce27fa5216cee5b82d279e0f0bde5deebece72", size = 4766437 }, + { url = "https://files.pythonhosted.org/packages/f8/ad/c25116352f456c0d1287545a7aa24e98987b6d99c5b0456c4bd14321f20f/fonttools-4.57.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dea5893b58d4637ffa925536462ba626f8a1b9ffbe2f5c272cdf2c6ebadb817", size = 4838431 }, + { url = "https://files.pythonhosted.org/packages/53/ae/398b2a833897297797a44f519c9af911c2136eb7aa27d3f1352c6d1129fa/fonttools-4.57.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dff02c5c8423a657c550b48231d0a48d7e2b2e131088e55983cfe74ccc2c7cc9", size = 4951011 }, + { url = "https://files.pythonhosted.org/packages/b7/5d/7cb31c4bc9ffb9a2bbe8b08f8f53bad94aeb158efad75da645b40b62cb73/fonttools-4.57.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:767604f244dc17c68d3e2dbf98e038d11a18abc078f2d0f84b6c24571d9c0b13", size = 5205679 }, + { url = "https://files.pythonhosted.org/packages/4c/e4/6934513ec2c4d3d69ca1bc3bd34d5c69dafcbf68c15388dd3bb062daf345/fonttools-4.57.0-cp313-cp313-win32.whl", hash = "sha256:8e2e12d0d862f43d51e5afb8b9751c77e6bec7d2dc00aad80641364e9df5b199", size = 2144833 }, + { url = "https://files.pythonhosted.org/packages/c4/0d/2177b7fdd23d017bcfb702fd41e47d4573766b9114da2fddbac20dcc4957/fonttools-4.57.0-cp313-cp313-win_amd64.whl", hash = "sha256:f1d6bc9c23356908db712d282acb3eebd4ae5ec6d8b696aa40342b1d84f8e9e3", size = 2190799 }, + { url = "https://files.pythonhosted.org/packages/90/27/45f8957c3132917f91aaa56b700bcfc2396be1253f685bd5c68529b6f610/fonttools-4.57.0-py3-none-any.whl", hash = "sha256:3122c604a675513c68bd24c6a8f9091f1c2376d18e8f5fe5a101746c81b3e98f", size = 1093605 }, +] + +[[package]] +name = "fsspec" +version = "2025.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/45/d8/8425e6ba5fcec61a1d16e41b1b71d2bf9344f1fe48012c2b48b9620feae5/fsspec-2025.3.2.tar.gz", hash = "sha256:e52c77ef398680bbd6a98c0e628fbc469491282981209907bbc8aea76a04fdc6", size = 299281 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/4b/e0cfc1a6f17e990f3e64b7d941ddc4acdc7b19d6edd51abf495f32b1a9e4/fsspec-2025.3.2-py3-none-any.whl", hash = "sha256:2daf8dc3d1dfa65b6aa37748d112773a7a08416f6c70d96b264c96476ecaf711", size = 194435 }, +] + +[[package]] +name = "gradio" +version = "5.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiofiles" }, + { name = "anyio" }, + { name = "fastapi" }, + { name = "ffmpy" }, + { name = "gradio-client" }, + { name = "httpx" }, + { name = "huggingface-hub" }, + { name = "jinja2" }, + { name = "markupsafe" }, + { name = "numpy" }, + { name = "orjson" }, + { name = "packaging" }, + { name = "pandas" }, + { name = "pillow" }, + { name = "pydantic" }, + { name = "pydub" }, + { name = "python-multipart" }, + { name = "pyyaml" }, + { name = "ruff", marker = "sys_platform != 'emscripten'" }, + { name = "semantic-version" }, + { name = "tomlkit" }, + { name = "typer", marker = "sys_platform != 'emscripten'" }, + { name = "typing-extensions" }, + { name = "urllib3", marker = "sys_platform == 'emscripten'" }, + { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7f/48/111e503700934d5d2f4ab9b593aff9890cd6af7c0a35a649edf593ec6b13/gradio-5.0.2.tar.gz", hash = "sha256:ba49bd8d58dd74302e019aa5c0cd8c351d534ec2ea9cbc83e944be7b2f3cc56c", size = 51975122 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/52/4834e55fd6aab3a7a33c5cd59fd46e45bca2e41118c153b33d6393cb2206/gradio-5.0.2-py3-none-any.whl", hash = "sha256:b9077078d643d0647d2edb03ef20c81561aaaccffab6050ac5a4f26c7f616ab3", size = 42309033 }, +] + +[[package]] +name = "gradio-client" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fsspec" }, + { name = "httpx" }, + { name = "huggingface-hub" }, + { name = "packaging" }, + { name = "typing-extensions" }, + { name = "websockets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a0/32/6225437199f88f20a8f36ad78681d9fc5be8cdf7519cbc852782ae379edb/gradio_client-1.4.0.tar.gz", hash = "sha256:bb24af01176774122f0c35e9a18f51047a22b457e6d667ba3cd7c7dfae17cd8d", size = 317874 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/05/8a55d7fc95792b58aef5ac2656ee6f8307629ddca747a5bfdfd8197c7114/gradio_client-1.4.0-py3-none-any.whl", hash = "sha256:6cd0f2c7b83fbab1db904e577c19bccc518dc7a2e8ea02cf3e13f8a9510d83f7", size = 319789 }, +] + +[[package]] +name = "h11" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, +] + +[[package]] +name = "httpcore" +version = "1.0.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/45/ad3e1b4d448f22c0cff4f5692f5ed0666658578e358b8d58a19846048059/httpcore-1.0.8.tar.gz", hash = "sha256:86e94505ed24ea06514883fd44d2bc02d90e77e7979c8eb71b90f41d364a1bad", size = 85385 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/8d/f052b1e336bb2c1fc7ed1aaed898aa570c0b61a09707b108979d9fc6e308/httpcore-1.0.8-py3-none-any.whl", hash = "sha256:5254cf149bcb5f75e9d1b2b9f729ea4a4b883d1ad7379fc632b727cec23674be", size = 78732 }, +] + +[[package]] +name = "httptools" +version = "0.6.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/9a/ce5e1f7e131522e6d3426e8e7a490b3a01f39a6696602e1c4f33f9e94277/httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c", size = 240639 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/26/bb526d4d14c2774fe07113ca1db7255737ffbb119315839af2065abfdac3/httptools-0.6.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f47f8ed67cc0ff862b84a1189831d1d33c963fb3ce1ee0c65d3b0cbe7b711069", size = 199029 }, + { url = "https://files.pythonhosted.org/packages/a6/17/3e0d3e9b901c732987a45f4f94d4e2c62b89a041d93db89eafb262afd8d5/httptools-0.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0614154d5454c21b6410fdf5262b4a3ddb0f53f1e1721cfd59d55f32138c578a", size = 103492 }, + { url = "https://files.pythonhosted.org/packages/b7/24/0fe235d7b69c42423c7698d086d4db96475f9b50b6ad26a718ef27a0bce6/httptools-0.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8787367fbdfccae38e35abf7641dafc5310310a5987b689f4c32cc8cc3ee975", size = 462891 }, + { url = "https://files.pythonhosted.org/packages/b1/2f/205d1f2a190b72da6ffb5f41a3736c26d6fa7871101212b15e9b5cd8f61d/httptools-0.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40b0f7fe4fd38e6a507bdb751db0379df1e99120c65fbdc8ee6c1d044897a636", size = 459788 }, + { url = "https://files.pythonhosted.org/packages/6e/4c/d09ce0eff09057a206a74575ae8f1e1e2f0364d20e2442224f9e6612c8b9/httptools-0.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40a5ec98d3f49904b9fe36827dcf1aadfef3b89e2bd05b0e35e94f97c2b14721", size = 433214 }, + { url = "https://files.pythonhosted.org/packages/3e/d2/84c9e23edbccc4a4c6f96a1b8d99dfd2350289e94f00e9ccc7aadde26fb5/httptools-0.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dacdd3d10ea1b4ca9df97a0a303cbacafc04b5cd375fa98732678151643d4988", size = 434120 }, + { url = "https://files.pythonhosted.org/packages/d0/46/4d8e7ba9581416de1c425b8264e2cadd201eb709ec1584c381f3e98f51c1/httptools-0.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:288cd628406cc53f9a541cfaf06041b4c71d751856bab45e3702191f931ccd17", size = 88565 }, + { url = "https://files.pythonhosted.org/packages/bb/0e/d0b71465c66b9185f90a091ab36389a7352985fe857e352801c39d6127c8/httptools-0.6.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:df017d6c780287d5c80601dafa31f17bddb170232d85c066604d8558683711a2", size = 200683 }, + { url = "https://files.pythonhosted.org/packages/e2/b8/412a9bb28d0a8988de3296e01efa0bd62068b33856cdda47fe1b5e890954/httptools-0.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:85071a1e8c2d051b507161f6c3e26155b5c790e4e28d7f236422dbacc2a9cc44", size = 104337 }, + { url = "https://files.pythonhosted.org/packages/9b/01/6fb20be3196ffdc8eeec4e653bc2a275eca7f36634c86302242c4fbb2760/httptools-0.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69422b7f458c5af875922cdb5bd586cc1f1033295aa9ff63ee196a87519ac8e1", size = 508796 }, + { url = "https://files.pythonhosted.org/packages/f7/d8/b644c44acc1368938317d76ac991c9bba1166311880bcc0ac297cb9d6bd7/httptools-0.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e603a3bff50db08cd578d54f07032ca1631450ceb972c2f834c2b860c28ea2", size = 510837 }, + { url = "https://files.pythonhosted.org/packages/52/d8/254d16a31d543073a0e57f1c329ca7378d8924e7e292eda72d0064987486/httptools-0.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec4f178901fa1834d4a060320d2f3abc5c9e39766953d038f1458cb885f47e81", size = 485289 }, + { url = "https://files.pythonhosted.org/packages/5f/3c/4aee161b4b7a971660b8be71a92c24d6c64372c1ab3ae7f366b3680df20f/httptools-0.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb89ecf8b290f2e293325c646a211ff1c2493222798bb80a530c5e7502494f", size = 489779 }, + { url = "https://files.pythonhosted.org/packages/12/b7/5cae71a8868e555f3f67a50ee7f673ce36eac970f029c0c5e9d584352961/httptools-0.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:db78cb9ca56b59b016e64b6031eda5653be0589dba2b1b43453f6e8b405a0970", size = 88634 }, + { url = "https://files.pythonhosted.org/packages/94/a3/9fe9ad23fd35f7de6b91eeb60848986058bd8b5a5c1e256f5860a160cc3e/httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660", size = 197214 }, + { url = "https://files.pythonhosted.org/packages/ea/d9/82d5e68bab783b632023f2fa31db20bebb4e89dfc4d2293945fd68484ee4/httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083", size = 102431 }, + { url = "https://files.pythonhosted.org/packages/96/c1/cb499655cbdbfb57b577734fde02f6fa0bbc3fe9fb4d87b742b512908dff/httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3", size = 473121 }, + { url = "https://files.pythonhosted.org/packages/af/71/ee32fd358f8a3bb199b03261f10921716990808a675d8160b5383487a317/httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071", size = 473805 }, + { url = "https://files.pythonhosted.org/packages/8a/0a/0d4df132bfca1507114198b766f1737d57580c9ad1cf93c1ff673e3387be/httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5", size = 448858 }, + { url = "https://files.pythonhosted.org/packages/1e/6a/787004fdef2cabea27bad1073bf6a33f2437b4dbd3b6fb4a9d71172b1c7c/httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0", size = 452042 }, + { url = "https://files.pythonhosted.org/packages/4d/dc/7decab5c404d1d2cdc1bb330b1bf70e83d6af0396fd4fc76fc60c0d522bf/httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8", size = 87682 }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, +] + +[[package]] +name = "huggingface-hub" +version = "0.30.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "fsspec" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/22/8eb91736b1dcb83d879bd49050a09df29a57cc5cd9f38e48a4b1c45ee890/huggingface_hub-0.30.2.tar.gz", hash = "sha256:9a7897c5b6fd9dad3168a794a8998d6378210f5b9688d0dfc180b1a228dc2466", size = 400868 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/27/1fb384a841e9661faad1c31cbfa62864f59632e876df5d795234da51c395/huggingface_hub-0.30.2-py3-none-any.whl", hash = "sha256:68ff05969927058cfa41df4f2155d4bb48f5f54f719dd0390103eefa9b191e28", size = 481433 }, +] + +[[package]] +name = "hydra-core" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "antlr4-python3-runtime" }, + { name = "omegaconf" }, + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/8e/07e42bc434a847154083b315779b0a81d567154504624e181caf2c71cd98/hydra-core-1.3.2.tar.gz", hash = "sha256:8a878ed67216997c3e9d88a8e72e7b4767e81af37afb4ea3334b269a4390a824", size = 3263494 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/50/e0edd38dcd63fb26a8547f13d28f7a008bc4a3fd4eb4ff030673f22ad41a/hydra_core-1.3.2-py3-none-any.whl", hash = "sha256:fa0238a9e31df3373b35b0bfb672c34cc92718d21f81311d8996a16de1141d8b", size = 154547 }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, +] + +[[package]] +name = "iopath" +version = "0.1.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "portalocker" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/73/b3d451dfc523756cf177d3ebb0af76dc7751b341c60e2a21871be400ae29/iopath-0.1.10.tar.gz", hash = "sha256:3311c16a4d9137223e20f141655759933e1eda24f8bff166af834af3c645ef01", size = 42226 } + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, +] + +[[package]] +name = "kiwisolver" +version = "1.4.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/59/7c91426a8ac292e1cdd53a63b6d9439abd573c875c3f92c146767dd33faf/kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", size = 97538 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/ed/c913ee28936c371418cb167b128066ffb20bbf37771eecc2c97edf8a6e4c/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84", size = 124635 }, + { url = "https://files.pythonhosted.org/packages/4c/45/4a7f896f7467aaf5f56ef093d1f329346f3b594e77c6a3c327b2d415f521/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561", size = 66717 }, + { url = "https://files.pythonhosted.org/packages/5f/b4/c12b3ac0852a3a68f94598d4c8d569f55361beef6159dce4e7b624160da2/kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7", size = 65413 }, + { url = "https://files.pythonhosted.org/packages/a9/98/1df4089b1ed23d83d410adfdc5947245c753bddfbe06541c4aae330e9e70/kiwisolver-1.4.8-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03", size = 1343994 }, + { url = "https://files.pythonhosted.org/packages/8d/bf/b4b169b050c8421a7c53ea1ea74e4ef9c335ee9013216c558a047f162d20/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954", size = 1434804 }, + { url = "https://files.pythonhosted.org/packages/66/5a/e13bd341fbcf73325ea60fdc8af752addf75c5079867af2e04cc41f34434/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79", size = 1450690 }, + { url = "https://files.pythonhosted.org/packages/9b/4f/5955dcb376ba4a830384cc6fab7d7547bd6759fe75a09564910e9e3bb8ea/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6", size = 1376839 }, + { url = "https://files.pythonhosted.org/packages/3a/97/5edbed69a9d0caa2e4aa616ae7df8127e10f6586940aa683a496c2c280b9/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0", size = 1435109 }, + { url = "https://files.pythonhosted.org/packages/13/fc/e756382cb64e556af6c1809a1bbb22c141bbc2445049f2da06b420fe52bf/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab", size = 2245269 }, + { url = "https://files.pythonhosted.org/packages/76/15/e59e45829d7f41c776d138245cabae6515cb4eb44b418f6d4109c478b481/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc", size = 2393468 }, + { url = "https://files.pythonhosted.org/packages/e9/39/483558c2a913ab8384d6e4b66a932406f87c95a6080112433da5ed668559/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25", size = 2355394 }, + { url = "https://files.pythonhosted.org/packages/01/aa/efad1fbca6570a161d29224f14b082960c7e08268a133fe5dc0f6906820e/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc", size = 2490901 }, + { url = "https://files.pythonhosted.org/packages/c9/4f/15988966ba46bcd5ab9d0c8296914436720dd67fca689ae1a75b4ec1c72f/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67", size = 2312306 }, + { url = "https://files.pythonhosted.org/packages/2d/27/bdf1c769c83f74d98cbc34483a972f221440703054894a37d174fba8aa68/kiwisolver-1.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34", size = 71966 }, + { url = "https://files.pythonhosted.org/packages/4a/c9/9642ea855604aeb2968a8e145fc662edf61db7632ad2e4fb92424be6b6c0/kiwisolver-1.4.8-cp311-cp311-win_arm64.whl", hash = "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2", size = 65311 }, + { url = "https://files.pythonhosted.org/packages/fc/aa/cea685c4ab647f349c3bc92d2daf7ae34c8e8cf405a6dcd3a497f58a2ac3/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502", size = 124152 }, + { url = "https://files.pythonhosted.org/packages/c5/0b/8db6d2e2452d60d5ebc4ce4b204feeb16176a851fd42462f66ade6808084/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31", size = 66555 }, + { url = "https://files.pythonhosted.org/packages/60/26/d6a0db6785dd35d3ba5bf2b2df0aedc5af089962c6eb2cbf67a15b81369e/kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb", size = 65067 }, + { url = "https://files.pythonhosted.org/packages/c9/ed/1d97f7e3561e09757a196231edccc1bcf59d55ddccefa2afc9c615abd8e0/kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f", size = 1378443 }, + { url = "https://files.pythonhosted.org/packages/29/61/39d30b99954e6b46f760e6289c12fede2ab96a254c443639052d1b573fbc/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc", size = 1472728 }, + { url = "https://files.pythonhosted.org/packages/0c/3e/804163b932f7603ef256e4a715e5843a9600802bb23a68b4e08c8c0ff61d/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a", size = 1478388 }, + { url = "https://files.pythonhosted.org/packages/8a/9e/60eaa75169a154700be74f875a4d9961b11ba048bef315fbe89cb6999056/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a", size = 1413849 }, + { url = "https://files.pythonhosted.org/packages/bc/b3/9458adb9472e61a998c8c4d95cfdfec91c73c53a375b30b1428310f923e4/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a", size = 1475533 }, + { url = "https://files.pythonhosted.org/packages/e4/7a/0a42d9571e35798de80aef4bb43a9b672aa7f8e58643d7bd1950398ffb0a/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3", size = 2268898 }, + { url = "https://files.pythonhosted.org/packages/d9/07/1255dc8d80271400126ed8db35a1795b1a2c098ac3a72645075d06fe5c5d/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b", size = 2425605 }, + { url = "https://files.pythonhosted.org/packages/84/df/5a3b4cf13780ef6f6942df67b138b03b7e79e9f1f08f57c49957d5867f6e/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4", size = 2375801 }, + { url = "https://files.pythonhosted.org/packages/8f/10/2348d068e8b0f635c8c86892788dac7a6b5c0cb12356620ab575775aad89/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d", size = 2520077 }, + { url = "https://files.pythonhosted.org/packages/32/d8/014b89fee5d4dce157d814303b0fce4d31385a2af4c41fed194b173b81ac/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8", size = 2338410 }, + { url = "https://files.pythonhosted.org/packages/bd/72/dfff0cc97f2a0776e1c9eb5bef1ddfd45f46246c6533b0191887a427bca5/kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50", size = 71853 }, + { url = "https://files.pythonhosted.org/packages/dc/85/220d13d914485c0948a00f0b9eb419efaf6da81b7d72e88ce2391f7aed8d/kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476", size = 65424 }, + { url = "https://files.pythonhosted.org/packages/79/b3/e62464a652f4f8cd9006e13d07abad844a47df1e6537f73ddfbf1bc997ec/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09", size = 124156 }, + { url = "https://files.pythonhosted.org/packages/8d/2d/f13d06998b546a2ad4f48607a146e045bbe48030774de29f90bdc573df15/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1", size = 66555 }, + { url = "https://files.pythonhosted.org/packages/59/e3/b8bd14b0a54998a9fd1e8da591c60998dc003618cb19a3f94cb233ec1511/kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c", size = 65071 }, + { url = "https://files.pythonhosted.org/packages/f0/1c/6c86f6d85ffe4d0ce04228d976f00674f1df5dc893bf2dd4f1928748f187/kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b", size = 1378053 }, + { url = "https://files.pythonhosted.org/packages/4e/b9/1c6e9f6dcb103ac5cf87cb695845f5fa71379021500153566d8a8a9fc291/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47", size = 1472278 }, + { url = "https://files.pythonhosted.org/packages/ee/81/aca1eb176de671f8bda479b11acdc42c132b61a2ac861c883907dde6debb/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16", size = 1478139 }, + { url = "https://files.pythonhosted.org/packages/49/f4/e081522473671c97b2687d380e9e4c26f748a86363ce5af48b4a28e48d06/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc", size = 1413517 }, + { url = "https://files.pythonhosted.org/packages/8f/e9/6a7d025d8da8c4931522922cd706105aa32b3291d1add8c5427cdcd66e63/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246", size = 1474952 }, + { url = "https://files.pythonhosted.org/packages/82/13/13fa685ae167bee5d94b415991c4fc7bb0a1b6ebea6e753a87044b209678/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794", size = 2269132 }, + { url = "https://files.pythonhosted.org/packages/ef/92/bb7c9395489b99a6cb41d502d3686bac692586db2045adc19e45ee64ed23/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b", size = 2425997 }, + { url = "https://files.pythonhosted.org/packages/ed/12/87f0e9271e2b63d35d0d8524954145837dd1a6c15b62a2d8c1ebe0f182b4/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3", size = 2376060 }, + { url = "https://files.pythonhosted.org/packages/02/6e/c8af39288edbce8bf0fa35dee427b082758a4b71e9c91ef18fa667782138/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957", size = 2520471 }, + { url = "https://files.pythonhosted.org/packages/13/78/df381bc7b26e535c91469f77f16adcd073beb3e2dd25042efd064af82323/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb", size = 2338793 }, + { url = "https://files.pythonhosted.org/packages/d0/dc/c1abe38c37c071d0fc71c9a474fd0b9ede05d42f5a458d584619cfd2371a/kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2", size = 71855 }, + { url = "https://files.pythonhosted.org/packages/a0/b6/21529d595b126ac298fdd90b705d87d4c5693de60023e0efcb4f387ed99e/kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30", size = 65430 }, + { url = "https://files.pythonhosted.org/packages/34/bd/b89380b7298e3af9b39f49334e3e2a4af0e04819789f04b43d560516c0c8/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c", size = 126294 }, + { url = "https://files.pythonhosted.org/packages/83/41/5857dc72e5e4148eaac5aa76e0703e594e4465f8ab7ec0fc60e3a9bb8fea/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc", size = 67736 }, + { url = "https://files.pythonhosted.org/packages/e1/d1/be059b8db56ac270489fb0b3297fd1e53d195ba76e9bbb30e5401fa6b759/kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712", size = 66194 }, + { url = "https://files.pythonhosted.org/packages/e1/83/4b73975f149819eb7dcf9299ed467eba068ecb16439a98990dcb12e63fdd/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e", size = 1465942 }, + { url = "https://files.pythonhosted.org/packages/c7/2c/30a5cdde5102958e602c07466bce058b9d7cb48734aa7a4327261ac8e002/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880", size = 1595341 }, + { url = "https://files.pythonhosted.org/packages/ff/9b/1e71db1c000385aa069704f5990574b8244cce854ecd83119c19e83c9586/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062", size = 1598455 }, + { url = "https://files.pythonhosted.org/packages/85/92/c8fec52ddf06231b31cbb779af77e99b8253cd96bd135250b9498144c78b/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7", size = 1522138 }, + { url = "https://files.pythonhosted.org/packages/0b/51/9eb7e2cd07a15d8bdd976f6190c0164f92ce1904e5c0c79198c4972926b7/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed", size = 1582857 }, + { url = "https://files.pythonhosted.org/packages/0f/95/c5a00387a5405e68ba32cc64af65ce881a39b98d73cc394b24143bebc5b8/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d", size = 2293129 }, + { url = "https://files.pythonhosted.org/packages/44/83/eeb7af7d706b8347548313fa3a3a15931f404533cc54fe01f39e830dd231/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165", size = 2421538 }, + { url = "https://files.pythonhosted.org/packages/05/f9/27e94c1b3eb29e6933b6986ffc5fa1177d2cd1f0c8efc5f02c91c9ac61de/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6", size = 2390661 }, + { url = "https://files.pythonhosted.org/packages/d9/d4/3c9735faa36ac591a4afcc2980d2691000506050b7a7e80bcfe44048daa7/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90", size = 2546710 }, + { url = "https://files.pythonhosted.org/packages/4c/fa/be89a49c640930180657482a74970cdcf6f7072c8d2471e1babe17a222dc/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85", size = 2349213 }, +] + +[[package]] +name = "lang-sam" +version = "0.2.1" +source = { editable = "." } +dependencies = [ + { name = "gradio" }, + { name = "litserve" }, + { name = "opencv-python-headless" }, + { name = "pydantic" }, + { name = "sam-2" }, + { name = "supervision" }, + { name = "torch" }, + { name = "torchvision" }, + { name = "transformers" }, + { name = "uvloop" }, +] + +[package.metadata] +requires-dist = [ + { name = "gradio", specifier = "==5.0.2" }, + { name = "litserve", specifier = "==0.2.3" }, + { name = "opencv-python-headless", specifier = "==4.10.0.84" }, + { name = "pydantic", specifier = ">=2.9.2" }, + { name = "sam-2", git = "https://github.com/facebookresearch/segment-anything-2?rev=c2ec8e14a185632b0a5d8b161928ceb50197eddc" }, + { name = "supervision", marker = "python_full_version > '3.10'", specifier = "==0.23.0" }, + { name = "torch", specifier = "==2.4.1" }, + { name = "torchvision", specifier = "==0.19.1" }, + { name = "transformers", specifier = "==4.44.2" }, + { name = "uvloop", specifier = "==0.20.0" }, +] + +[[package]] +name = "litserve" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fastapi" }, + { name = "httpx" }, + { name = "uvicorn", extra = ["standard"] }, +] +sdist = { url = "https://files.pythonhosted.org/packages/90/39/8ee9964f081b6f8e90a1f3c53dde764dd08232bfba65f27468d6fa7a15da/litserve-0.2.3.tar.gz", hash = "sha256:859ef36273f11150a7765cc40a3d3a2567f703131d9ad8bb54ef9d2f43996084", size = 38548 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/d5/312d33512b2542035e81e4aa971744b1b551e38f3b3f192b7eaeb233b167/litserve-0.2.3-py3-none-any.whl", hash = "sha256:40a6ea46178dc693d1b7e41160fc4e2b56d8d9cb874073d9bbee4bf6122dc8cb", size = 42262 }, +] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, +] + +[[package]] +name = "markupsafe" +version = "2.1.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/87/5b/aae44c6655f3801e81aa3eef09dbbf012431987ba564d7231722f68df02d/MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", size = 19384 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/e7/291e55127bb2ae67c64d66cef01432b5933859dfb7d6949daa721b89d0b3/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", size = 18219 }, + { url = "https://files.pythonhosted.org/packages/6b/cb/aed7a284c00dfa7c0682d14df85ad4955a350a21d2e3b06d8240497359bf/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", size = 14098 }, + { url = "https://files.pythonhosted.org/packages/1c/cf/35fe557e53709e93feb65575c93927942087e9b97213eabc3fe9d5b25a55/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", size = 29014 }, + { url = "https://files.pythonhosted.org/packages/97/18/c30da5e7a0e7f4603abfc6780574131221d9148f323752c2755d48abad30/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", size = 28220 }, + { url = "https://files.pythonhosted.org/packages/0c/40/2e73e7d532d030b1e41180807a80d564eda53babaf04d65e15c1cf897e40/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", size = 27756 }, + { url = "https://files.pythonhosted.org/packages/18/46/5dca760547e8c59c5311b332f70605d24c99d1303dd9a6e1fc3ed0d73561/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", size = 33988 }, + { url = "https://files.pythonhosted.org/packages/6d/c5/27febe918ac36397919cd4a67d5579cbbfa8da027fa1238af6285bb368ea/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", size = 32718 }, + { url = "https://files.pythonhosted.org/packages/f8/81/56e567126a2c2bc2684d6391332e357589a96a76cb9f8e5052d85cb0ead8/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", size = 33317 }, + { url = "https://files.pythonhosted.org/packages/00/0b/23f4b2470accb53285c613a3ab9ec19dc944eaf53592cb6d9e2af8aa24cc/MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", size = 16670 }, + { url = "https://files.pythonhosted.org/packages/b7/a2/c78a06a9ec6d04b3445a949615c4c7ed86a0b2eb68e44e7541b9d57067cc/MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", size = 17224 }, + { url = "https://files.pythonhosted.org/packages/53/bd/583bf3e4c8d6a321938c13f49d44024dbe5ed63e0a7ba127e454a66da974/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", size = 18215 }, + { url = "https://files.pythonhosted.org/packages/48/d6/e7cd795fc710292c3af3a06d80868ce4b02bfbbf370b7cee11d282815a2a/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", size = 14069 }, + { url = "https://files.pythonhosted.org/packages/51/b5/5d8ec796e2a08fc814a2c7d2584b55f889a55cf17dd1a90f2beb70744e5c/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", size = 29452 }, + { url = "https://files.pythonhosted.org/packages/0a/0d/2454f072fae3b5a137c119abf15465d1771319dfe9e4acbb31722a0fff91/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", size = 28462 }, + { url = "https://files.pythonhosted.org/packages/2d/75/fd6cb2e68780f72d47e6671840ca517bda5ef663d30ada7616b0462ad1e3/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", size = 27869 }, + { url = "https://files.pythonhosted.org/packages/b0/81/147c477391c2750e8fc7705829f7351cf1cd3be64406edcf900dc633feb2/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", size = 33906 }, + { url = "https://files.pythonhosted.org/packages/8b/ff/9a52b71839d7a256b563e85d11050e307121000dcebc97df120176b3ad93/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", size = 32296 }, + { url = "https://files.pythonhosted.org/packages/88/07/2dc76aa51b481eb96a4c3198894f38b480490e834479611a4053fbf08623/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", size = 33038 }, + { url = "https://files.pythonhosted.org/packages/96/0c/620c1fb3661858c0e37eb3cbffd8c6f732a67cd97296f725789679801b31/MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", size = 16572 }, + { url = "https://files.pythonhosted.org/packages/3f/14/c3554d512d5f9100a95e737502f4a2323a1959f6d0d01e0d0997b35f7b10/MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", size = 17127 }, +] + +[[package]] +name = "matplotlib" +version = "3.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/08/b89867ecea2e305f408fbb417139a8dd941ecf7b23a2e02157c36da546f0/matplotlib-3.10.1.tar.gz", hash = "sha256:e8d2d0e3881b129268585bf4765ad3ee73a4591d77b9a18c214ac7e3a79fb2ba", size = 36743335 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/14/a1b840075be247bb1834b22c1e1d558740b0f618fe3a823740181ca557a1/matplotlib-3.10.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:057206ff2d6ab82ff3e94ebd94463d084760ca682ed5f150817b859372ec4401", size = 8174669 }, + { url = "https://files.pythonhosted.org/packages/0a/e4/300b08e3e08f9c98b0d5635f42edabf2f7a1d634e64cb0318a71a44ff720/matplotlib-3.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a144867dd6bf8ba8cb5fc81a158b645037e11b3e5cf8a50bd5f9917cb863adfe", size = 8047996 }, + { url = "https://files.pythonhosted.org/packages/75/f9/8d99ff5a2498a5f1ccf919fb46fb945109623c6108216f10f96428f388bc/matplotlib-3.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56c5d9fcd9879aa8040f196a235e2dcbdf7dd03ab5b07c0696f80bc6cf04bedd", size = 8461612 }, + { url = "https://files.pythonhosted.org/packages/40/b8/53fa08a5eaf78d3a7213fd6da1feec4bae14a81d9805e567013811ff0e85/matplotlib-3.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f69dc9713e4ad2fb21a1c30e37bd445d496524257dfda40ff4a8efb3604ab5c", size = 8602258 }, + { url = "https://files.pythonhosted.org/packages/40/87/4397d2ce808467af86684a622dd112664553e81752ea8bf61bdd89d24a41/matplotlib-3.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4c59af3e8aca75d7744b68e8e78a669e91ccbcf1ac35d0102a7b1b46883f1dd7", size = 9408896 }, + { url = "https://files.pythonhosted.org/packages/d7/68/0d03098b3feb786cbd494df0aac15b571effda7f7cbdec267e8a8d398c16/matplotlib-3.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:11b65088c6f3dae784bc72e8d039a2580186285f87448babb9ddb2ad0082993a", size = 8061281 }, + { url = "https://files.pythonhosted.org/packages/7c/1d/5e0dc3b59c034e43de16f94deb68f4ad8a96b3ea00f4b37c160b7474928e/matplotlib-3.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:66e907a06e68cb6cfd652c193311d61a12b54f56809cafbed9736ce5ad92f107", size = 8175488 }, + { url = "https://files.pythonhosted.org/packages/7a/81/dae7e14042e74da658c3336ab9799128e09a1ee03964f2d89630b5d12106/matplotlib-3.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b4bb156abb8fa5e5b2b460196f7db7264fc6d62678c03457979e7d5254b7be", size = 8046264 }, + { url = "https://files.pythonhosted.org/packages/21/c4/22516775dcde10fc9c9571d155f90710761b028fc44f660508106c363c97/matplotlib-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1985ad3d97f51307a2cbfc801a930f120def19ba22864182dacef55277102ba6", size = 8452048 }, + { url = "https://files.pythonhosted.org/packages/63/23/c0615001f67ce7c96b3051d856baedc0c818a2ed84570b9bf9bde200f85d/matplotlib-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c96f2c2f825d1257e437a1482c5a2cf4fee15db4261bd6fc0750f81ba2b4ba3d", size = 8597111 }, + { url = "https://files.pythonhosted.org/packages/ca/c0/a07939a82aed77770514348f4568177d7dadab9787ebc618a616fe3d665e/matplotlib-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35e87384ee9e488d8dd5a2dd7baf471178d38b90618d8ea147aced4ab59c9bea", size = 9402771 }, + { url = "https://files.pythonhosted.org/packages/a6/b6/a9405484fb40746fdc6ae4502b16a9d6e53282ba5baaf9ebe2da579f68c4/matplotlib-3.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:cfd414bce89cc78a7e1d25202e979b3f1af799e416010a20ab2b5ebb3a02425c", size = 8063742 }, + { url = "https://files.pythonhosted.org/packages/60/73/6770ff5e5523d00f3bc584acb6031e29ee5c8adc2336b16cd1d003675fe0/matplotlib-3.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c42eee41e1b60fd83ee3292ed83a97a5f2a8239b10c26715d8a6172226988d7b", size = 8176112 }, + { url = "https://files.pythonhosted.org/packages/08/97/b0ca5da0ed54a3f6599c3ab568bdda65269bc27c21a2c97868c1625e4554/matplotlib-3.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4f0647b17b667ae745c13721602b540f7aadb2a32c5b96e924cd4fea5dcb90f1", size = 8046931 }, + { url = "https://files.pythonhosted.org/packages/df/9a/1acbdc3b165d4ce2dcd2b1a6d4ffb46a7220ceee960c922c3d50d8514067/matplotlib-3.10.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa3854b5f9473564ef40a41bc922be978fab217776e9ae1545c9b3a5cf2092a3", size = 8453422 }, + { url = "https://files.pythonhosted.org/packages/51/d0/2bc4368abf766203e548dc7ab57cf7e9c621f1a3c72b516cc7715347b179/matplotlib-3.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e496c01441be4c7d5f96d4e40f7fca06e20dcb40e44c8daa2e740e1757ad9e6", size = 8596819 }, + { url = "https://files.pythonhosted.org/packages/ab/1b/8b350f8a1746c37ab69dda7d7528d1fc696efb06db6ade9727b7887be16d/matplotlib-3.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5d45d3f5245be5b469843450617dcad9af75ca50568acf59997bed9311131a0b", size = 9402782 }, + { url = "https://files.pythonhosted.org/packages/89/06/f570373d24d93503988ba8d04f213a372fa1ce48381c5eb15da985728498/matplotlib-3.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:8e8e25b1209161d20dfe93037c8a7f7ca796ec9aa326e6e4588d8c4a5dd1e473", size = 8063812 }, + { url = "https://files.pythonhosted.org/packages/fc/e0/8c811a925b5a7ad75135f0e5af46408b78af88bbb02a1df775100ef9bfef/matplotlib-3.10.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:19b06241ad89c3ae9469e07d77efa87041eac65d78df4fcf9cac318028009b01", size = 8214021 }, + { url = "https://files.pythonhosted.org/packages/4a/34/319ec2139f68ba26da9d00fce2ff9f27679fb799a6c8e7358539801fd629/matplotlib-3.10.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01e63101ebb3014e6e9f80d9cf9ee361a8599ddca2c3e166c563628b39305dbb", size = 8090782 }, + { url = "https://files.pythonhosted.org/packages/77/ea/9812124ab9a99df5b2eec1110e9b2edc0b8f77039abf4c56e0a376e84a29/matplotlib-3.10.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f06bad951eea6422ac4e8bdebcf3a70c59ea0a03338c5d2b109f57b64eb3972", size = 8478901 }, + { url = "https://files.pythonhosted.org/packages/c9/db/b05bf463689134789b06dea85828f8ebe506fa1e37593f723b65b86c9582/matplotlib-3.10.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfb036f34873b46978f55e240cff7a239f6c4409eac62d8145bad3fc6ba5a3", size = 8613864 }, + { url = "https://files.pythonhosted.org/packages/c2/04/41ccec4409f3023a7576df3b5c025f1a8c8b81fbfe922ecfd837ac36e081/matplotlib-3.10.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dc6ab14a7ab3b4d813b88ba957fc05c79493a037f54e246162033591e770de6f", size = 9409487 }, + { url = "https://files.pythonhosted.org/packages/ac/c2/0d5aae823bdcc42cc99327ecdd4d28585e15ccd5218c453b7bcd827f3421/matplotlib-3.10.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bc411ebd5889a78dabbc457b3fa153203e22248bfa6eedc6797be5df0164dbf9", size = 8134832 }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, +] + +[[package]] +name = "mpmath" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198 }, +] + +[[package]] +name = "networkx" +version = "3.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263 }, +] + +[[package]] +name = "numpy" +version = "2.2.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/b2/ce4b867d8cd9c0ee84938ae1e6a6f7926ebf928c9090d036fc3c6a04f946/numpy-2.2.5.tar.gz", hash = "sha256:a9c0d994680cd991b1cb772e8b297340085466a6fe964bc9d4e80f5e2f43c291", size = 20273920 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/fb/e4e4c254ba40e8f0c78218f9e86304628c75b6900509b601c8433bdb5da7/numpy-2.2.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c42365005c7a6c42436a54d28c43fe0e01ca11eb2ac3cefe796c25a5f98e5e9b", size = 21256475 }, + { url = "https://files.pythonhosted.org/packages/81/32/dd1f7084f5c10b2caad778258fdaeedd7fbd8afcd2510672811e6138dfac/numpy-2.2.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:498815b96f67dc347e03b719ef49c772589fb74b8ee9ea2c37feae915ad6ebda", size = 14461474 }, + { url = "https://files.pythonhosted.org/packages/0e/65/937cdf238ef6ac54ff749c0f66d9ee2b03646034c205cea9b6c51f2f3ad1/numpy-2.2.5-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6411f744f7f20081b1b4e7112e0f4c9c5b08f94b9f086e6f0adf3645f85d3a4d", size = 5426875 }, + { url = "https://files.pythonhosted.org/packages/25/17/814515fdd545b07306eaee552b65c765035ea302d17de1b9cb50852d2452/numpy-2.2.5-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:9de6832228f617c9ef45d948ec1cd8949c482238d68b2477e6f642c33a7b0a54", size = 6969176 }, + { url = "https://files.pythonhosted.org/packages/e5/32/a66db7a5c8b5301ec329ab36d0ecca23f5e18907f43dbd593c8ec326d57c/numpy-2.2.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:369e0d4647c17c9363244f3468f2227d557a74b6781cb62ce57cf3ef5cc7c610", size = 14374850 }, + { url = "https://files.pythonhosted.org/packages/ad/c9/1bf6ada582eebcbe8978f5feb26584cd2b39f94ededeea034ca8f84af8c8/numpy-2.2.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:262d23f383170f99cd9191a7c85b9a50970fe9069b2f8ab5d786eca8a675d60b", size = 16430306 }, + { url = "https://files.pythonhosted.org/packages/6a/f0/3f741863f29e128f4fcfdb99253cc971406b402b4584663710ee07f5f7eb/numpy-2.2.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:aa70fdbdc3b169d69e8c59e65c07a1c9351ceb438e627f0fdcd471015cd956be", size = 15884767 }, + { url = "https://files.pythonhosted.org/packages/98/d9/4ccd8fd6410f7bf2d312cbc98892e0e43c2fcdd1deae293aeb0a93b18071/numpy-2.2.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37e32e985f03c06206582a7323ef926b4e78bdaa6915095ef08070471865b906", size = 18219515 }, + { url = "https://files.pythonhosted.org/packages/b1/56/783237243d4395c6dd741cf16eeb1a9035ee3d4310900e6b17e875d1b201/numpy-2.2.5-cp311-cp311-win32.whl", hash = "sha256:f5045039100ed58fa817a6227a356240ea1b9a1bc141018864c306c1a16d4175", size = 6607842 }, + { url = "https://files.pythonhosted.org/packages/98/89/0c93baaf0094bdaaaa0536fe61a27b1dce8a505fa262a865ec142208cfe9/numpy-2.2.5-cp311-cp311-win_amd64.whl", hash = "sha256:b13f04968b46ad705f7c8a80122a42ae8f620536ea38cf4bdd374302926424dd", size = 12949071 }, + { url = "https://files.pythonhosted.org/packages/e2/f7/1fd4ff108cd9d7ef929b8882692e23665dc9c23feecafbb9c6b80f4ec583/numpy-2.2.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ee461a4eaab4f165b68780a6a1af95fb23a29932be7569b9fab666c407969051", size = 20948633 }, + { url = "https://files.pythonhosted.org/packages/12/03/d443c278348371b20d830af155ff2079acad6a9e60279fac2b41dbbb73d8/numpy-2.2.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ec31367fd6a255dc8de4772bd1658c3e926d8e860a0b6e922b615e532d320ddc", size = 14176123 }, + { url = "https://files.pythonhosted.org/packages/2b/0b/5ca264641d0e7b14393313304da48b225d15d471250376f3fbdb1a2be603/numpy-2.2.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:47834cde750d3c9f4e52c6ca28a7361859fcaf52695c7dc3cc1a720b8922683e", size = 5163817 }, + { url = "https://files.pythonhosted.org/packages/04/b3/d522672b9e3d28e26e1613de7675b441bbd1eaca75db95680635dd158c67/numpy-2.2.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:2c1a1c6ccce4022383583a6ded7bbcda22fc635eb4eb1e0a053336425ed36dfa", size = 6698066 }, + { url = "https://files.pythonhosted.org/packages/a0/93/0f7a75c1ff02d4b76df35079676b3b2719fcdfb39abdf44c8b33f43ef37d/numpy-2.2.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d75f338f5f79ee23548b03d801d28a505198297534f62416391857ea0479571", size = 14087277 }, + { url = "https://files.pythonhosted.org/packages/b0/d9/7c338b923c53d431bc837b5b787052fef9ae68a56fe91e325aac0d48226e/numpy-2.2.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a801fef99668f309b88640e28d261991bfad9617c27beda4a3aec4f217ea073", size = 16135742 }, + { url = "https://files.pythonhosted.org/packages/2d/10/4dec9184a5d74ba9867c6f7d1e9f2e0fb5fe96ff2bf50bb6f342d64f2003/numpy-2.2.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:abe38cd8381245a7f49967a6010e77dbf3680bd3627c0fe4362dd693b404c7f8", size = 15581825 }, + { url = "https://files.pythonhosted.org/packages/80/1f/2b6fcd636e848053f5b57712a7d1880b1565eec35a637fdfd0a30d5e738d/numpy-2.2.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5a0ac90e46fdb5649ab6369d1ab6104bfe5854ab19b645bf5cda0127a13034ae", size = 17899600 }, + { url = "https://files.pythonhosted.org/packages/ec/87/36801f4dc2623d76a0a3835975524a84bd2b18fe0f8835d45c8eae2f9ff2/numpy-2.2.5-cp312-cp312-win32.whl", hash = "sha256:0cd48122a6b7eab8f06404805b1bd5856200e3ed6f8a1b9a194f9d9054631beb", size = 6312626 }, + { url = "https://files.pythonhosted.org/packages/8b/09/4ffb4d6cfe7ca6707336187951992bd8a8b9142cf345d87ab858d2d7636a/numpy-2.2.5-cp312-cp312-win_amd64.whl", hash = "sha256:ced69262a8278547e63409b2653b372bf4baff0870c57efa76c5703fd6543282", size = 12645715 }, + { url = "https://files.pythonhosted.org/packages/e2/a0/0aa7f0f4509a2e07bd7a509042967c2fab635690d4f48c6c7b3afd4f448c/numpy-2.2.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:059b51b658f4414fff78c6d7b1b4e18283ab5fa56d270ff212d5ba0c561846f4", size = 20935102 }, + { url = "https://files.pythonhosted.org/packages/7e/e4/a6a9f4537542912ec513185396fce52cdd45bdcf3e9d921ab02a93ca5aa9/numpy-2.2.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:47f9ed103af0bc63182609044b0490747e03bd20a67e391192dde119bf43d52f", size = 14191709 }, + { url = "https://files.pythonhosted.org/packages/be/65/72f3186b6050bbfe9c43cb81f9df59ae63603491d36179cf7a7c8d216758/numpy-2.2.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:261a1ef047751bb02f29dfe337230b5882b54521ca121fc7f62668133cb119c9", size = 5149173 }, + { url = "https://files.pythonhosted.org/packages/e5/e9/83e7a9432378dde5802651307ae5e9ea07bb72b416728202218cd4da2801/numpy-2.2.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4520caa3807c1ceb005d125a75e715567806fed67e315cea619d5ec6e75a4191", size = 6684502 }, + { url = "https://files.pythonhosted.org/packages/ea/27/b80da6c762394c8ee516b74c1f686fcd16c8f23b14de57ba0cad7349d1d2/numpy-2.2.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d14b17b9be5f9c9301f43d2e2a4886a33b53f4e6fdf9ca2f4cc60aeeee76372", size = 14084417 }, + { url = "https://files.pythonhosted.org/packages/aa/fc/ebfd32c3e124e6a1043e19c0ab0769818aa69050ce5589b63d05ff185526/numpy-2.2.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba321813a00e508d5421104464510cc962a6f791aa2fca1c97b1e65027da80d", size = 16133807 }, + { url = "https://files.pythonhosted.org/packages/bf/9b/4cc171a0acbe4666f7775cfd21d4eb6bb1d36d3a0431f48a73e9212d2278/numpy-2.2.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4cbdef3ddf777423060c6f81b5694bad2dc9675f110c4b2a60dc0181543fac7", size = 15575611 }, + { url = "https://files.pythonhosted.org/packages/a3/45/40f4135341850df48f8edcf949cf47b523c404b712774f8855a64c96ef29/numpy-2.2.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:54088a5a147ab71a8e7fdfd8c3601972751ded0739c6b696ad9cb0343e21ab73", size = 17895747 }, + { url = "https://files.pythonhosted.org/packages/f8/4c/b32a17a46f0ffbde8cc82df6d3daeaf4f552e346df143e1b188a701a8f09/numpy-2.2.5-cp313-cp313-win32.whl", hash = "sha256:c8b82a55ef86a2d8e81b63da85e55f5537d2157165be1cb2ce7cfa57b6aef38b", size = 6309594 }, + { url = "https://files.pythonhosted.org/packages/13/ae/72e6276feb9ef06787365b05915bfdb057d01fceb4a43cb80978e518d79b/numpy-2.2.5-cp313-cp313-win_amd64.whl", hash = "sha256:d8882a829fd779f0f43998e931c466802a77ca1ee0fe25a3abe50278616b1471", size = 12638356 }, + { url = "https://files.pythonhosted.org/packages/79/56/be8b85a9f2adb688e7ded6324e20149a03541d2b3297c3ffc1a73f46dedb/numpy-2.2.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:e8b025c351b9f0e8b5436cf28a07fa4ac0204d67b38f01433ac7f9b870fa38c6", size = 20963778 }, + { url = "https://files.pythonhosted.org/packages/ff/77/19c5e62d55bff507a18c3cdff82e94fe174957bad25860a991cac719d3ab/numpy-2.2.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8dfa94b6a4374e7851bbb6f35e6ded2120b752b063e6acdd3157e4d2bb922eba", size = 14207279 }, + { url = "https://files.pythonhosted.org/packages/75/22/aa11f22dc11ff4ffe4e849d9b63bbe8d4ac6d5fae85ddaa67dfe43be3e76/numpy-2.2.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:97c8425d4e26437e65e1d189d22dff4a079b747ff9c2788057bfb8114ce1e133", size = 5199247 }, + { url = "https://files.pythonhosted.org/packages/4f/6c/12d5e760fc62c08eded0394f62039f5a9857f758312bf01632a81d841459/numpy-2.2.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:352d330048c055ea6db701130abc48a21bec690a8d38f8284e00fab256dc1376", size = 6711087 }, + { url = "https://files.pythonhosted.org/packages/ef/94/ece8280cf4218b2bee5cec9567629e61e51b4be501e5c6840ceb593db945/numpy-2.2.5-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b4c0773b6ada798f51f0f8e30c054d32304ccc6e9c5d93d46cb26f3d385ab19", size = 14059964 }, + { url = "https://files.pythonhosted.org/packages/39/41/c5377dac0514aaeec69115830a39d905b1882819c8e65d97fc60e177e19e/numpy-2.2.5-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55f09e00d4dccd76b179c0f18a44f041e5332fd0e022886ba1c0bbf3ea4a18d0", size = 16121214 }, + { url = "https://files.pythonhosted.org/packages/db/54/3b9f89a943257bc8e187145c6bc0eb8e3d615655f7b14e9b490b053e8149/numpy-2.2.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:02f226baeefa68f7d579e213d0f3493496397d8f1cff5e2b222af274c86a552a", size = 15575788 }, + { url = "https://files.pythonhosted.org/packages/b1/c4/2e407e85df35b29f79945751b8f8e671057a13a376497d7fb2151ba0d290/numpy-2.2.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c26843fd58f65da9491165072da2cccc372530681de481ef670dcc8e27cfb066", size = 17893672 }, + { url = "https://files.pythonhosted.org/packages/29/7e/d0b44e129d038dba453f00d0e29ebd6eaf2f06055d72b95b9947998aca14/numpy-2.2.5-cp313-cp313t-win32.whl", hash = "sha256:1a161c2c79ab30fe4501d5a2bbfe8b162490757cf90b7f05be8b80bc02f7bb8e", size = 6377102 }, + { url = "https://files.pythonhosted.org/packages/63/be/b85e4aa4bf42c6502851b971f1c326d583fcc68227385f92089cf50a7b45/numpy-2.2.5-cp313-cp313t-win_amd64.whl", hash = "sha256:d403c84991b5ad291d3809bace5e85f4bbf44a04bdc9a88ed2bb1807b3360bb8", size = 12750096 }, +] + +[[package]] +name = "nvidia-cublas-cu12" +version = "12.1.3.1" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/6d/121efd7382d5b0284239f4ab1fc1590d86d34ed4a4a2fdb13b30ca8e5740/nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:ee53ccca76a6fc08fb9701aa95b6ceb242cdaab118c3bb152af4e579af792728", size = 410594774 }, +] + +[[package]] +name = "nvidia-cuda-cupti-cu12" +version = "12.1.105" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/00/6b218edd739ecfc60524e585ba8e6b00554dd908de2c9c66c1af3e44e18d/nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:e54fde3983165c624cb79254ae9818a456eb6e87a7fd4d56a2352c24ee542d7e", size = 14109015 }, +] + +[[package]] +name = "nvidia-cuda-nvrtc-cu12" +version = "12.1.105" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b6/9f/c64c03f49d6fbc56196664d05dba14e3a561038a81a638eeb47f4d4cfd48/nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:339b385f50c309763ca65456ec75e17bbefcbbf2893f462cb8b90584cd27a1c2", size = 23671734 }, +] + +[[package]] +name = "nvidia-cuda-runtime-cu12" +version = "12.1.105" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/d5/c68b1d2cdfcc59e72e8a5949a37ddb22ae6cade80cd4a57a84d4c8b55472/nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:6e258468ddf5796e25f1dc591a31029fa317d97a0a94ed93468fc86301d61e40", size = 823596 }, +] + +[[package]] +name = "nvidia-cudnn-cu12" +version = "9.1.0.70" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cublas-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/fd/713452cd72343f682b1c7b9321e23829f00b842ceaedcda96e742ea0b0b3/nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f", size = 664752741 }, +] + +[[package]] +name = "nvidia-cufft-cu12" +version = "11.0.2.54" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/94/eb540db023ce1d162e7bea9f8f5aa781d57c65aed513c33ee9a5123ead4d/nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl", hash = "sha256:794e3948a1aa71fd817c3775866943936774d1c14e7628c74f6f7417224cdf56", size = 121635161 }, +] + +[[package]] +name = "nvidia-curand-cu12" +version = "10.3.2.106" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/31/4890b1c9abc496303412947fc7dcea3d14861720642b49e8ceed89636705/nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:9d264c5036dde4e64f1de8c50ae753237c12e0b1348738169cd0f8a536c0e1e0", size = 56467784 }, +] + +[[package]] +name = "nvidia-cusolver-cu12" +version = "11.4.5.107" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cublas-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "nvidia-cusparse-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/1d/8de1e5c67099015c834315e333911273a8c6aaba78923dd1d1e25fc5f217/nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd", size = 124161928 }, +] + +[[package]] +name = "nvidia-cusparse-cu12" +version = "12.1.0.106" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/65/5b/cfaeebf25cd9fdec14338ccb16f6b2c4c7fa9163aefcf057d86b9cc248bb/nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c", size = 195958278 }, +] + +[[package]] +name = "nvidia-nccl-cu12" +version = "2.20.5" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/2a/0a131f572aa09f741c30ccd45a8e56316e8be8dfc7bc19bf0ab7cfef7b19/nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:057f6bf9685f75215d0c53bf3ac4a10b3e6578351de307abad9e18a99182af56", size = 176249402 }, +] + +[[package]] +name = "nvidia-nvjitlink-cu12" +version = "12.8.93" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/74/86a07f1d0f42998ca31312f998bd3b9a7eff7f52378f4f270c8679c77fb9/nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:81ff63371a7ebd6e6451970684f916be2eab07321b73c9d244dc2b4da7f73b88", size = 39254836 }, +] + +[[package]] +name = "nvidia-nvtx-cu12" +version = "12.1.105" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/d3/8057f0587683ed2fcd4dbfbdfdfa807b9160b809976099d36b8f60d08f03/nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5", size = 99138 }, +] + +[[package]] +name = "omegaconf" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "antlr4-python3-runtime" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/09/48/6388f1bb9da707110532cb70ec4d2822858ddfb44f1cdf1233c20a80ea4b/omegaconf-2.3.0.tar.gz", hash = "sha256:d5d4b6d29955cc50ad50c46dc269bcd92c6e00f5f90d23ab5fee7bfca4ba4cc7", size = 3298120 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/94/1843518e420fa3ed6919835845df698c7e27e183cb997394e4a670973a65/omegaconf-2.3.0-py3-none-any.whl", hash = "sha256:7b4df175cdb08ba400f45cae3bdcae7ba8365db4d165fc65fd04b050ab63b46b", size = 79500 }, +] + +[[package]] +name = "opencv-python-headless" +version = "4.10.0.84" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/7e/d20f68a5f1487adf19d74378d349932a386b1ece3be9be9915e5986db468/opencv-python-headless-4.10.0.84.tar.gz", hash = "sha256:f2017c6101d7c2ef8d7bc3b414c37ff7f54d64413a1847d89970b6b7069b4e1a", size = 95117755 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/9b/583c8d9259f6fc19413f83fd18dd8e6cbc8eefb0b4dc6da52dd151fe3272/opencv_python_headless-4.10.0.84-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:a4f4bcb07d8f8a7704d9c8564c224c8b064c63f430e95b61ac0bffaa374d330e", size = 54835657 }, + { url = "https://files.pythonhosted.org/packages/c0/7b/b4c67f5dad7a9a61c47f7a39e4050e8a4628bd64b3c3daaeb755d759f928/opencv_python_headless-4.10.0.84-cp37-abi3-macosx_12_0_x86_64.whl", hash = "sha256:5ae454ebac0eb0a0b932e3406370aaf4212e6a3fdb5038cc86c7aea15a6851da", size = 56475470 }, + { url = "https://files.pythonhosted.org/packages/91/61/f838ce2046f3ec3591ea59ea3549085e399525d3b4558c4ed60b55ed88c0/opencv_python_headless-4.10.0.84-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46071015ff9ab40fccd8a163da0ee14ce9846349f06c6c8c0f2870856ffa45db", size = 29329705 }, + { url = "https://files.pythonhosted.org/packages/d1/09/248f86a404567303cdf120e4a301f389b68e3b18e5c0cc428de327da609c/opencv_python_headless-4.10.0.84-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:377d08a7e48a1405b5e84afcbe4798464ce7ee17081c1c23619c8b398ff18295", size = 49858781 }, + { url = "https://files.pythonhosted.org/packages/30/c0/66f88d58500e990a9a0a5c06f98862edf1d0a3a430781218a8c193948438/opencv_python_headless-4.10.0.84-cp37-abi3-win32.whl", hash = "sha256:9092404b65458ed87ce932f613ffbb1106ed2c843577501e5768912360fc50ec", size = 28675298 }, + { url = "https://files.pythonhosted.org/packages/26/d0/22f68eb23eea053a31655960f133c0be9726c6a881547e6e9e7e2a946c4f/opencv_python_headless-4.10.0.84-cp37-abi3-win_amd64.whl", hash = "sha256:afcf28bd1209dd58810d33defb622b325d3cbe49dcd7a43a902982c33e5fad05", size = 38754031 }, +] + +[[package]] +name = "orjson" +version = "3.10.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/c7/03913cc4332174071950acf5b0735463e3f63760c80585ef369270c2b372/orjson-3.10.16.tar.gz", hash = "sha256:d2aaa5c495e11d17b9b93205f5fa196737ee3202f000aaebf028dc9a73750f10", size = 5410415 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/29/43f91a5512b5d2535594438eb41c5357865fd5e64dec745d90a588820c75/orjson-3.10.16-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:44fcbe1a1884f8bc9e2e863168b0f84230c3d634afe41c678637d2728ea8e739", size = 249180 }, + { url = "https://files.pythonhosted.org/packages/0c/36/2a72d55e266473c19a86d97b7363bb8bf558ab450f75205689a287d5ce61/orjson-3.10.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78177bf0a9d0192e0b34c3d78bcff7fe21d1b5d84aeb5ebdfe0dbe637b885225", size = 138510 }, + { url = "https://files.pythonhosted.org/packages/bb/ad/f86d6f55c1a68b57ff6ea7966bce5f4e5163f2e526ddb7db9fc3c2c8d1c4/orjson-3.10.16-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12824073a010a754bb27330cad21d6e9b98374f497f391b8707752b96f72e741", size = 132373 }, + { url = "https://files.pythonhosted.org/packages/5e/8b/d18f2711493a809f3082a88fda89342bc8e16767743b909cd3c34989fba3/orjson-3.10.16-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddd41007e56284e9867864aa2f29f3136bb1dd19a49ca43c0b4eda22a579cf53", size = 136773 }, + { url = "https://files.pythonhosted.org/packages/a1/dc/ce025f002f8e0749e3f057c4d773a4d4de32b7b4c1fc5a50b429e7532586/orjson-3.10.16-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0877c4d35de639645de83666458ca1f12560d9fa7aa9b25d8bb8f52f61627d14", size = 138029 }, + { url = "https://files.pythonhosted.org/packages/0e/1b/cf9df85852b91160029d9f26014230366a2b4deb8cc51fabe68e250a8c1a/orjson-3.10.16-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9a09a539e9cc3beead3e7107093b4ac176d015bec64f811afb5965fce077a03c", size = 142677 }, + { url = "https://files.pythonhosted.org/packages/92/18/5b1e1e995bffad49dc4311a0bdfd874bc6f135fd20f0e1f671adc2c9910e/orjson-3.10.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31b98bc9b40610fec971d9a4d67bb2ed02eec0a8ae35f8ccd2086320c28526ca", size = 132800 }, + { url = "https://files.pythonhosted.org/packages/d6/eb/467f25b580e942fcca1344adef40633b7f05ac44a65a63fc913f9a805d58/orjson-3.10.16-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0ce243f5a8739f3a18830bc62dc2e05b69a7545bafd3e3249f86668b2bcd8e50", size = 135451 }, + { url = "https://files.pythonhosted.org/packages/8d/4b/9d10888038975cb375982e9339d9495bac382d5c976c500b8d6f2c8e2e4e/orjson-3.10.16-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:64792c0025bae049b3074c6abe0cf06f23c8e9f5a445f4bab31dc5ca23dbf9e1", size = 412358 }, + { url = "https://files.pythonhosted.org/packages/3b/e2/cfbcfcc4fbe619e0ca9bdbbfccb2d62b540bbfe41e0ee77d44a628594f59/orjson-3.10.16-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ea53f7e68eec718b8e17e942f7ca56c6bd43562eb19db3f22d90d75e13f0431d", size = 152772 }, + { url = "https://files.pythonhosted.org/packages/b9/d6/627a1b00569be46173007c11dde3da4618c9bfe18409325b0e3e2a82fe29/orjson-3.10.16-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a741ba1a9488c92227711bde8c8c2b63d7d3816883268c808fbeada00400c164", size = 137225 }, + { url = "https://files.pythonhosted.org/packages/0a/7b/a73c67b505021af845b9f05c7c848793258ea141fa2058b52dd9b067c2b4/orjson-3.10.16-cp311-cp311-win32.whl", hash = "sha256:c7ed2c61bb8226384c3fdf1fb01c51b47b03e3f4536c985078cccc2fd19f1619", size = 141733 }, + { url = "https://files.pythonhosted.org/packages/f4/22/5e8217c48d68c0adbfb181e749d6a733761074e598b083c69a1383d18147/orjson-3.10.16-cp311-cp311-win_amd64.whl", hash = "sha256:cd67d8b3e0e56222a2e7b7f7da9031e30ecd1fe251c023340b9f12caca85ab60", size = 133784 }, + { url = "https://files.pythonhosted.org/packages/5d/15/67ce9d4c959c83f112542222ea3b9209c1d424231d71d74c4890ea0acd2b/orjson-3.10.16-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6d3444abbfa71ba21bb042caa4b062535b122248259fdb9deea567969140abca", size = 249325 }, + { url = "https://files.pythonhosted.org/packages/da/2c/1426b06f30a1b9ada74b6f512c1ddf9d2760f53f61cdb59efeb9ad342133/orjson-3.10.16-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:30245c08d818fdcaa48b7d5b81499b8cae09acabb216fe61ca619876b128e184", size = 133621 }, + { url = "https://files.pythonhosted.org/packages/9e/88/18d26130954bc73bee3be10f95371ea1dfb8679e0e2c46b0f6d8c6289402/orjson-3.10.16-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0ba1d0baa71bf7579a4ccdcf503e6f3098ef9542106a0eca82395898c8a500a", size = 138270 }, + { url = "https://files.pythonhosted.org/packages/4f/f9/6d8b64fcd58fae072e80ee7981be8ba0d7c26ace954e5cd1d027fc80518f/orjson-3.10.16-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb0beefa5ef3af8845f3a69ff2a4aa62529b5acec1cfe5f8a6b4141033fd46ef", size = 132346 }, + { url = "https://files.pythonhosted.org/packages/16/3f/2513fd5bc786f40cd12af569c23cae6381aeddbefeed2a98f0a666eb5d0d/orjson-3.10.16-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6daa0e1c9bf2e030e93c98394de94506f2a4d12e1e9dadd7c53d5e44d0f9628e", size = 136845 }, + { url = "https://files.pythonhosted.org/packages/6d/42/b0e7b36720f5ab722b48e8ccf06514d4f769358dd73c51abd8728ef58d0b/orjson-3.10.16-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9da9019afb21e02410ef600e56666652b73eb3e4d213a0ec919ff391a7dd52aa", size = 138078 }, + { url = "https://files.pythonhosted.org/packages/a3/a8/d220afb8a439604be74fc755dbc740bded5ed14745ca536b304ed32eb18a/orjson-3.10.16-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:daeb3a1ee17b69981d3aae30c3b4e786b0f8c9e6c71f2b48f1aef934f63f38f4", size = 142712 }, + { url = "https://files.pythonhosted.org/packages/8c/88/7e41e9883c00f84f92fe357a8371edae816d9d7ef39c67b5106960c20389/orjson-3.10.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80fed80eaf0e20a31942ae5d0728849862446512769692474be5e6b73123a23b", size = 133136 }, + { url = "https://files.pythonhosted.org/packages/e9/ca/61116095307ad0be828ea26093febaf59e38596d84a9c8d765c3c5e4934f/orjson-3.10.16-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73390ed838f03764540a7bdc4071fe0123914c2cc02fb6abf35182d5fd1b7a42", size = 135258 }, + { url = "https://files.pythonhosted.org/packages/dc/1b/09493cf7d801505f094c9295f79c98c1e0af2ac01c7ed8d25b30fcb19ada/orjson-3.10.16-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a22bba012a0c94ec02a7768953020ab0d3e2b884760f859176343a36c01adf87", size = 412326 }, + { url = "https://files.pythonhosted.org/packages/ea/02/125d7bbd7f7a500190ddc8ae5d2d3c39d87ed3ed28f5b37cfe76962c678d/orjson-3.10.16-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5385bbfdbc90ff5b2635b7e6bebf259652db00a92b5e3c45b616df75b9058e88", size = 152800 }, + { url = "https://files.pythonhosted.org/packages/f9/09/7658a9e3e793d5b3b00598023e0fb6935d0e7bbb8ff72311c5415a8ce677/orjson-3.10.16-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:02c6279016346e774dd92625d46c6c40db687b8a0d685aadb91e26e46cc33e1e", size = 137516 }, + { url = "https://files.pythonhosted.org/packages/29/87/32b7a4831e909d347278101a48d4cf9f3f25901b2295e7709df1651f65a1/orjson-3.10.16-cp312-cp312-win32.whl", hash = "sha256:7ca55097a11426db80f79378e873a8c51f4dde9ffc22de44850f9696b7eb0e8c", size = 141759 }, + { url = "https://files.pythonhosted.org/packages/35/ce/81a27e7b439b807bd393585271364cdddf50dc281fc57c4feef7ccb186a6/orjson-3.10.16-cp312-cp312-win_amd64.whl", hash = "sha256:86d127efdd3f9bf5f04809b70faca1e6836556ea3cc46e662b44dab3fe71f3d6", size = 133944 }, + { url = "https://files.pythonhosted.org/packages/87/b9/ff6aa28b8c86af9526160905593a2fe8d004ac7a5e592ee0b0ff71017511/orjson-3.10.16-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:148a97f7de811ba14bc6dbc4a433e0341ffd2cc285065199fb5f6a98013744bd", size = 249289 }, + { url = "https://files.pythonhosted.org/packages/6c/81/6d92a586149b52684ab8fd70f3623c91d0e6a692f30fd8c728916ab2263c/orjson-3.10.16-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:1d960c1bf0e734ea36d0adc880076de3846aaec45ffad29b78c7f1b7962516b8", size = 133640 }, + { url = "https://files.pythonhosted.org/packages/c2/88/b72443f4793d2e16039ab85d0026677932b15ab968595fb7149750d74134/orjson-3.10.16-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a318cd184d1269f68634464b12871386808dc8b7c27de8565234d25975a7a137", size = 138286 }, + { url = "https://files.pythonhosted.org/packages/c3/3c/72a22d4b28c076c4016d5a52bd644a8e4d849d3bb0373d9e377f9e3b2250/orjson-3.10.16-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df23f8df3ef9223d1d6748bea63fca55aae7da30a875700809c500a05975522b", size = 132307 }, + { url = "https://files.pythonhosted.org/packages/8a/a2/f1259561bdb6ad7061ff1b95dab082fe32758c4bc143ba8d3d70831f0a06/orjson-3.10.16-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b94dda8dd6d1378f1037d7f3f6b21db769ef911c4567cbaa962bb6dc5021cf90", size = 136739 }, + { url = "https://files.pythonhosted.org/packages/3d/af/c7583c4b34f33d8b8b90cfaab010ff18dd64e7074cc1e117a5f1eff20dcf/orjson-3.10.16-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f12970a26666a8775346003fd94347d03ccb98ab8aa063036818381acf5f523e", size = 138076 }, + { url = "https://files.pythonhosted.org/packages/d7/59/d7fc7fbdd3d4a64c2eae4fc7341a5aa39cf9549bd5e2d7f6d3c07f8b715b/orjson-3.10.16-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15a1431a245d856bd56e4d29ea0023eb4d2c8f71efe914beb3dee8ab3f0cd7fb", size = 142643 }, + { url = "https://files.pythonhosted.org/packages/92/0e/3bd8f2197d27601f16b4464ae948826da2bcf128af31230a9dbbad7ceb57/orjson-3.10.16-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c83655cfc247f399a222567d146524674a7b217af7ef8289c0ff53cfe8db09f0", size = 133168 }, + { url = "https://files.pythonhosted.org/packages/af/a8/351fd87b664b02f899f9144d2c3dc848b33ac04a5df05234cbfb9e2a7540/orjson-3.10.16-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fa59ae64cb6ddde8f09bdbf7baf933c4cd05734ad84dcf4e43b887eb24e37652", size = 135271 }, + { url = "https://files.pythonhosted.org/packages/ba/b0/a6d42a7d412d867c60c0337d95123517dd5a9370deea705ea1be0f89389e/orjson-3.10.16-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ca5426e5aacc2e9507d341bc169d8af9c3cbe88f4cd4c1cf2f87e8564730eb56", size = 412444 }, + { url = "https://files.pythonhosted.org/packages/79/ec/7572cd4e20863f60996f3f10bc0a6da64a6fd9c35954189a914cec0b7377/orjson-3.10.16-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6fd5da4edf98a400946cd3a195680de56f1e7575109b9acb9493331047157430", size = 152737 }, + { url = "https://files.pythonhosted.org/packages/a9/19/ceb9e8fed5403b2e76a8ac15f581b9d25780a3be3c9b3aa54b7777a210d5/orjson-3.10.16-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:980ecc7a53e567169282a5e0ff078393bac78320d44238da4e246d71a4e0e8f5", size = 137482 }, + { url = "https://files.pythonhosted.org/packages/1b/78/a78bb810f3786579dbbbd94768284cbe8f2fd65167cd7020260679665c17/orjson-3.10.16-cp313-cp313-win32.whl", hash = "sha256:28f79944dd006ac540a6465ebd5f8f45dfdf0948ff998eac7a908275b4c1add6", size = 141714 }, + { url = "https://files.pythonhosted.org/packages/81/9c/b66ce9245ff319df2c3278acd351a3f6145ef34b4a2d7f4b0f739368370f/orjson-3.10.16-cp313-cp313-win_amd64.whl", hash = "sha256:fe0a145e96d51971407cb8ba947e63ead2aa915db59d6631a355f5f2150b56b7", size = 133954 }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469 }, +] + +[[package]] +name = "pandas" +version = "2.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/44/d9502bf0ed197ba9bf1103c9867d5904ddcaf869e52329787fc54ed70cc8/pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039", size = 12602222 }, + { url = "https://files.pythonhosted.org/packages/52/11/9eac327a38834f162b8250aab32a6781339c69afe7574368fffe46387edf/pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd", size = 11321274 }, + { url = "https://files.pythonhosted.org/packages/45/fb/c4beeb084718598ba19aa9f5abbc8aed8b42f90930da861fcb1acdb54c3a/pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698", size = 15579836 }, + { url = "https://files.pythonhosted.org/packages/cd/5f/4dba1d39bb9c38d574a9a22548c540177f78ea47b32f99c0ff2ec499fac5/pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc", size = 13058505 }, + { url = "https://files.pythonhosted.org/packages/b9/57/708135b90391995361636634df1f1130d03ba456e95bcf576fada459115a/pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3", size = 16744420 }, + { url = "https://files.pythonhosted.org/packages/86/4a/03ed6b7ee323cf30404265c284cee9c65c56a212e0a08d9ee06984ba2240/pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32", size = 14440457 }, + { url = "https://files.pythonhosted.org/packages/ed/8c/87ddf1fcb55d11f9f847e3c69bb1c6f8e46e2f40ab1a2d2abadb2401b007/pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5", size = 11617166 }, + { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893 }, + { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475 }, + { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645 }, + { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445 }, + { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235 }, + { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756 }, + { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248 }, + { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643 }, + { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573 }, + { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085 }, + { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809 }, + { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316 }, + { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055 }, + { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175 }, + { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650 }, + { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177 }, + { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526 }, + { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013 }, + { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620 }, + { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 }, +] + +[[package]] +name = "pillow" +version = "10.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/74/ad3d526f3bf7b6d3f408b73fde271ec69dfac8b81341a318ce825f2b3812/pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06", size = 46555059 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/62/c9449f9c3043c37f73e7487ec4ef0c03eb9c9afc91a92b977a67b3c0bbc5/pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c", size = 3509265 }, + { url = "https://files.pythonhosted.org/packages/f4/5f/491dafc7bbf5a3cc1845dc0430872e8096eb9e2b6f8161509d124594ec2d/pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be", size = 3375655 }, + { url = "https://files.pythonhosted.org/packages/73/d5/c4011a76f4207a3c151134cd22a1415741e42fa5ddecec7c0182887deb3d/pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3", size = 4340304 }, + { url = "https://files.pythonhosted.org/packages/ac/10/c67e20445a707f7a610699bba4fe050583b688d8cd2d202572b257f46600/pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6", size = 4452804 }, + { url = "https://files.pythonhosted.org/packages/a9/83/6523837906d1da2b269dee787e31df3b0acb12e3d08f024965a3e7f64665/pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe", size = 4365126 }, + { url = "https://files.pythonhosted.org/packages/ba/e5/8c68ff608a4203085158cff5cc2a3c534ec384536d9438c405ed6370d080/pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319", size = 4533541 }, + { url = "https://files.pythonhosted.org/packages/f4/7c/01b8dbdca5bc6785573f4cee96e2358b0918b7b2c7b60d8b6f3abf87a070/pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d", size = 4471616 }, + { url = "https://files.pythonhosted.org/packages/c8/57/2899b82394a35a0fbfd352e290945440e3b3785655a03365c0ca8279f351/pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696", size = 4600802 }, + { url = "https://files.pythonhosted.org/packages/4d/d7/a44f193d4c26e58ee5d2d9db3d4854b2cfb5b5e08d360a5e03fe987c0086/pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496", size = 2235213 }, + { url = "https://files.pythonhosted.org/packages/c1/d0/5866318eec2b801cdb8c82abf190c8343d8a1cd8bf5a0c17444a6f268291/pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91", size = 2554498 }, + { url = "https://files.pythonhosted.org/packages/d4/c8/310ac16ac2b97e902d9eb438688de0d961660a87703ad1561fd3dfbd2aa0/pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22", size = 2243219 }, + { url = "https://files.pythonhosted.org/packages/05/cb/0353013dc30c02a8be34eb91d25e4e4cf594b59e5a55ea1128fde1e5f8ea/pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94", size = 3509350 }, + { url = "https://files.pythonhosted.org/packages/e7/cf/5c558a0f247e0bf9cec92bff9b46ae6474dd736f6d906315e60e4075f737/pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597", size = 3374980 }, + { url = "https://files.pythonhosted.org/packages/84/48/6e394b86369a4eb68b8a1382c78dc092245af517385c086c5094e3b34428/pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80", size = 4343799 }, + { url = "https://files.pythonhosted.org/packages/3b/f3/a8c6c11fa84b59b9df0cd5694492da8c039a24cd159f0f6918690105c3be/pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca", size = 4459973 }, + { url = "https://files.pythonhosted.org/packages/7d/1b/c14b4197b80150fb64453585247e6fb2e1d93761fa0fa9cf63b102fde822/pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef", size = 4370054 }, + { url = "https://files.pythonhosted.org/packages/55/77/40daddf677897a923d5d33329acd52a2144d54a9644f2a5422c028c6bf2d/pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a", size = 4539484 }, + { url = "https://files.pythonhosted.org/packages/40/54/90de3e4256b1207300fb2b1d7168dd912a2fb4b2401e439ba23c2b2cabde/pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b", size = 4477375 }, + { url = "https://files.pythonhosted.org/packages/13/24/1bfba52f44193860918ff7c93d03d95e3f8748ca1de3ceaf11157a14cf16/pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9", size = 4608773 }, + { url = "https://files.pythonhosted.org/packages/55/04/5e6de6e6120451ec0c24516c41dbaf80cce1b6451f96561235ef2429da2e/pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", size = 2235690 }, + { url = "https://files.pythonhosted.org/packages/74/0a/d4ce3c44bca8635bd29a2eab5aa181b654a734a29b263ca8efe013beea98/pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", size = 2554951 }, + { url = "https://files.pythonhosted.org/packages/b5/ca/184349ee40f2e92439be9b3502ae6cfc43ac4b50bc4fc6b3de7957563894/pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", size = 2243427 }, + { url = "https://files.pythonhosted.org/packages/c3/00/706cebe7c2c12a6318aabe5d354836f54adff7156fd9e1bd6c89f4ba0e98/pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", size = 3525685 }, + { url = "https://files.pythonhosted.org/packages/cf/76/f658cbfa49405e5ecbfb9ba42d07074ad9792031267e782d409fd8fe7c69/pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", size = 3374883 }, + { url = "https://files.pythonhosted.org/packages/46/2b/99c28c4379a85e65378211971c0b430d9c7234b1ec4d59b2668f6299e011/pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", size = 4339837 }, + { url = "https://files.pythonhosted.org/packages/f1/74/b1ec314f624c0c43711fdf0d8076f82d9d802afd58f1d62c2a86878e8615/pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", size = 4455562 }, + { url = "https://files.pythonhosted.org/packages/4a/2a/4b04157cb7b9c74372fa867096a1607e6fedad93a44deeff553ccd307868/pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", size = 4366761 }, + { url = "https://files.pythonhosted.org/packages/ac/7b/8f1d815c1a6a268fe90481232c98dd0e5fa8c75e341a75f060037bd5ceae/pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", size = 4536767 }, + { url = "https://files.pythonhosted.org/packages/e5/77/05fa64d1f45d12c22c314e7b97398ffb28ef2813a485465017b7978b3ce7/pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", size = 4477989 }, + { url = "https://files.pythonhosted.org/packages/12/63/b0397cfc2caae05c3fb2f4ed1b4fc4fc878f0243510a7a6034ca59726494/pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", size = 4610255 }, + { url = "https://files.pythonhosted.org/packages/7b/f9/cfaa5082ca9bc4a6de66ffe1c12c2d90bf09c309a5f52b27759a596900e7/pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", size = 2235603 }, + { url = "https://files.pythonhosted.org/packages/01/6a/30ff0eef6e0c0e71e55ded56a38d4859bf9d3634a94a88743897b5f96936/pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", size = 2554972 }, + { url = "https://files.pythonhosted.org/packages/48/2c/2e0a52890f269435eee38b21c8218e102c621fe8d8df8b9dd06fabf879ba/pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", size = 2243375 }, +] + +[[package]] +name = "portalocker" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pywin32", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/91/8bfe23e1f7f630f2061ef38b5225d9fda9068d6a30fcbc187951e678e630/portalocker-3.1.1.tar.gz", hash = "sha256:ec20f6dda2ad9ce89fa399a5f31f4f1495f515958f0cb7ca6543cef7bb5a749e", size = 43708 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/60/1974cfdd5bb770568ddc6f89f3e0df4cfdd1acffd5a609dff5e95f48c6e2/portalocker-3.1.1-py3-none-any.whl", hash = "sha256:80e984e24de292ff258a5bea0e4f3f778fff84c0ae1275dbaebc4658de4aacb3", size = 19661 }, +] + +[[package]] +name = "pydantic" +version = "2.11.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/10/2e/ca897f093ee6c5f3b0bee123ee4465c50e75431c3d5b6a3b44a47134e891/pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", size = 785513 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/1d/407b29780a289868ed696d1616f4aad49d6388e5a77f567dcd2629dcd7b8/pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f", size = 443591 }, +] + +[[package]] +name = "pydantic-core" +version = "2.33.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/17/19/ed6a078a5287aea7922de6841ef4c06157931622c89c2a47940837b5eecd/pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", size = 434395 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/7f/c6298830cb780c46b4f46bb24298d01019ffa4d21769f39b908cd14bbd50/pydantic_core-2.33.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6e966fc3caaf9f1d96b349b0341c70c8d6573bf1bac7261f7b0ba88f96c56c24", size = 2044224 }, + { url = "https://files.pythonhosted.org/packages/a8/65/6ab3a536776cad5343f625245bd38165d6663256ad43f3a200e5936afd6c/pydantic_core-2.33.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bfd0adeee563d59c598ceabddf2c92eec77abcb3f4a391b19aa7366170bd9e30", size = 1858845 }, + { url = "https://files.pythonhosted.org/packages/e9/15/9a22fd26ba5ee8c669d4b8c9c244238e940cd5d818649603ca81d1c69861/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91815221101ad3c6b507804178a7bb5cb7b2ead9ecd600041669c8d805ebd595", size = 1910029 }, + { url = "https://files.pythonhosted.org/packages/d5/33/8cb1a62818974045086f55f604044bf35b9342900318f9a2a029a1bec460/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9fea9c1869bb4742d174a57b4700c6dadea951df8b06de40c2fedb4f02931c2e", size = 1997784 }, + { url = "https://files.pythonhosted.org/packages/c0/ca/49958e4df7715c71773e1ea5be1c74544923d10319173264e6db122543f9/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d20eb4861329bb2484c021b9d9a977566ab16d84000a57e28061151c62b349a", size = 2141075 }, + { url = "https://files.pythonhosted.org/packages/7b/a6/0b3a167a9773c79ba834b959b4e18c3ae9216b8319bd8422792abc8a41b1/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb935c5591573ae3201640579f30128ccc10739b45663f93c06796854405505", size = 2745849 }, + { url = "https://files.pythonhosted.org/packages/0b/60/516484135173aa9e5861d7a0663dce82e4746d2e7f803627d8c25dfa5578/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c964fd24e6166420d18fb53996d8c9fd6eac9bf5ae3ec3d03015be4414ce497f", size = 2005794 }, + { url = "https://files.pythonhosted.org/packages/86/70/05b1eb77459ad47de00cf78ee003016da0cedf8b9170260488d7c21e9181/pydantic_core-2.33.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:681d65e9011f7392db5aa002b7423cc442d6a673c635668c227c6c8d0e5a4f77", size = 2123237 }, + { url = "https://files.pythonhosted.org/packages/c7/57/12667a1409c04ae7dc95d3b43158948eb0368e9c790be8b095cb60611459/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e100c52f7355a48413e2999bfb4e139d2977a904495441b374f3d4fb4a170961", size = 2086351 }, + { url = "https://files.pythonhosted.org/packages/57/61/cc6d1d1c1664b58fdd6ecc64c84366c34ec9b606aeb66cafab6f4088974c/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:048831bd363490be79acdd3232f74a0e9951b11b2b4cc058aeb72b22fdc3abe1", size = 2258914 }, + { url = "https://files.pythonhosted.org/packages/d1/0a/edb137176a1f5419b2ddee8bde6a0a548cfa3c74f657f63e56232df8de88/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bdc84017d28459c00db6f918a7272a5190bec3090058334e43a76afb279eac7c", size = 2257385 }, + { url = "https://files.pythonhosted.org/packages/26/3c/48ca982d50e4b0e1d9954919c887bdc1c2b462801bf408613ccc641b3daa/pydantic_core-2.33.1-cp311-cp311-win32.whl", hash = "sha256:32cd11c5914d1179df70406427097c7dcde19fddf1418c787540f4b730289896", size = 1923765 }, + { url = "https://files.pythonhosted.org/packages/33/cd/7ab70b99e5e21559f5de38a0928ea84e6f23fdef2b0d16a6feaf942b003c/pydantic_core-2.33.1-cp311-cp311-win_amd64.whl", hash = "sha256:2ea62419ba8c397e7da28a9170a16219d310d2cf4970dbc65c32faf20d828c83", size = 1950688 }, + { url = "https://files.pythonhosted.org/packages/4b/ae/db1fc237b82e2cacd379f63e3335748ab88b5adde98bf7544a1b1bd10a84/pydantic_core-2.33.1-cp311-cp311-win_arm64.whl", hash = "sha256:fc903512177361e868bc1f5b80ac8c8a6e05fcdd574a5fb5ffeac5a9982b9e89", size = 1908185 }, + { url = "https://files.pythonhosted.org/packages/c8/ce/3cb22b07c29938f97ff5f5bb27521f95e2ebec399b882392deb68d6c440e/pydantic_core-2.33.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8", size = 2026640 }, + { url = "https://files.pythonhosted.org/packages/19/78/f381d643b12378fee782a72126ec5d793081ef03791c28a0fd542a5bee64/pydantic_core-2.33.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498", size = 1852649 }, + { url = "https://files.pythonhosted.org/packages/9d/2b/98a37b80b15aac9eb2c6cfc6dbd35e5058a352891c5cce3a8472d77665a6/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939", size = 1892472 }, + { url = "https://files.pythonhosted.org/packages/4e/d4/3c59514e0f55a161004792b9ff3039da52448f43f5834f905abef9db6e4a/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d", size = 1977509 }, + { url = "https://files.pythonhosted.org/packages/a9/b6/c2c7946ef70576f79a25db59a576bce088bdc5952d1b93c9789b091df716/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e", size = 2128702 }, + { url = "https://files.pythonhosted.org/packages/88/fe/65a880f81e3f2a974312b61f82a03d85528f89a010ce21ad92f109d94deb/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3", size = 2679428 }, + { url = "https://files.pythonhosted.org/packages/6f/ff/4459e4146afd0462fb483bb98aa2436d69c484737feaceba1341615fb0ac/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d", size = 2008753 }, + { url = "https://files.pythonhosted.org/packages/7c/76/1c42e384e8d78452ededac8b583fe2550c84abfef83a0552e0e7478ccbc3/pydantic_core-2.33.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b", size = 2114849 }, + { url = "https://files.pythonhosted.org/packages/00/72/7d0cf05095c15f7ffe0eb78914b166d591c0eed72f294da68378da205101/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39", size = 2069541 }, + { url = "https://files.pythonhosted.org/packages/b3/69/94a514066bb7d8be499aa764926937409d2389c09be0b5107a970286ef81/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a", size = 2239225 }, + { url = "https://files.pythonhosted.org/packages/84/b0/e390071eadb44b41f4f54c3cef64d8bf5f9612c92686c9299eaa09e267e2/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db", size = 2248373 }, + { url = "https://files.pythonhosted.org/packages/d6/b2/288b3579ffc07e92af66e2f1a11be3b056fe1214aab314748461f21a31c3/pydantic_core-2.33.1-cp312-cp312-win32.whl", hash = "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda", size = 1907034 }, + { url = "https://files.pythonhosted.org/packages/02/28/58442ad1c22b5b6742b992ba9518420235adced665513868f99a1c2638a5/pydantic_core-2.33.1-cp312-cp312-win_amd64.whl", hash = "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4", size = 1956848 }, + { url = "https://files.pythonhosted.org/packages/a1/eb/f54809b51c7e2a1d9f439f158b8dd94359321abcc98767e16fc48ae5a77e/pydantic_core-2.33.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea", size = 1903986 }, + { url = "https://files.pythonhosted.org/packages/7a/24/eed3466a4308d79155f1cdd5c7432c80ddcc4530ba8623b79d5ced021641/pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", size = 2033551 }, + { url = "https://files.pythonhosted.org/packages/ab/14/df54b1a0bc9b6ded9b758b73139d2c11b4e8eb43e8ab9c5847c0a2913ada/pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", size = 1852785 }, + { url = "https://files.pythonhosted.org/packages/fa/96/e275f15ff3d34bb04b0125d9bc8848bf69f25d784d92a63676112451bfb9/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", size = 1897758 }, + { url = "https://files.pythonhosted.org/packages/b7/d8/96bc536e975b69e3a924b507d2a19aedbf50b24e08c80fb00e35f9baaed8/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", size = 1986109 }, + { url = "https://files.pythonhosted.org/packages/90/72/ab58e43ce7e900b88cb571ed057b2fcd0e95b708a2e0bed475b10130393e/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", size = 2129159 }, + { url = "https://files.pythonhosted.org/packages/dc/3f/52d85781406886c6870ac995ec0ba7ccc028b530b0798c9080531b409fdb/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", size = 2680222 }, + { url = "https://files.pythonhosted.org/packages/f4/56/6e2ef42f363a0eec0fd92f74a91e0ac48cd2e49b695aac1509ad81eee86a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", size = 2006980 }, + { url = "https://files.pythonhosted.org/packages/4c/c0/604536c4379cc78359f9ee0aa319f4aedf6b652ec2854953f5a14fc38c5a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", size = 2120840 }, + { url = "https://files.pythonhosted.org/packages/1f/46/9eb764814f508f0edfb291a0f75d10854d78113fa13900ce13729aaec3ae/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", size = 2072518 }, + { url = "https://files.pythonhosted.org/packages/42/e3/fb6b2a732b82d1666fa6bf53e3627867ea3131c5f39f98ce92141e3e3dc1/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", size = 2248025 }, + { url = "https://files.pythonhosted.org/packages/5c/9d/fbe8fe9d1aa4dac88723f10a921bc7418bd3378a567cb5e21193a3c48b43/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", size = 2254991 }, + { url = "https://files.pythonhosted.org/packages/aa/99/07e2237b8a66438d9b26482332cda99a9acccb58d284af7bc7c946a42fd3/pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", size = 1915262 }, + { url = "https://files.pythonhosted.org/packages/8a/f4/e457a7849beeed1e5defbcf5051c6f7b3c91a0624dd31543a64fc9adcf52/pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", size = 1956626 }, + { url = "https://files.pythonhosted.org/packages/20/d0/e8d567a7cff7b04e017ae164d98011f1e1894269fe8e90ea187a3cbfb562/pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", size = 1909590 }, + { url = "https://files.pythonhosted.org/packages/ef/fd/24ea4302d7a527d672c5be06e17df16aabfb4e9fdc6e0b345c21580f3d2a/pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", size = 1812963 }, + { url = "https://files.pythonhosted.org/packages/5f/95/4fbc2ecdeb5c1c53f1175a32d870250194eb2fdf6291b795ab08c8646d5d/pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", size = 1986896 }, + { url = "https://files.pythonhosted.org/packages/71/ae/fe31e7f4a62431222d8f65a3bd02e3fa7e6026d154a00818e6d30520ea77/pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", size = 1931810 }, + { url = "https://files.pythonhosted.org/packages/0b/76/1794e440c1801ed35415238d2c728f26cd12695df9057154ad768b7b991c/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3a371dc00282c4b84246509a5ddc808e61b9864aa1eae9ecc92bb1268b82db4a", size = 2042858 }, + { url = "https://files.pythonhosted.org/packages/73/b4/9cd7b081fb0b1b4f8150507cd59d27b275c3e22ad60b35cb19ea0977d9b9/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f59295ecc75a1788af8ba92f2e8c6eeaa5a94c22fc4d151e8d9638814f85c8fc", size = 1873745 }, + { url = "https://files.pythonhosted.org/packages/e1/d7/9ddb7575d4321e40d0363903c2576c8c0c3280ebea137777e5ab58d723e3/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08530b8ac922003033f399128505f513e30ca770527cc8bbacf75a84fcc2c74b", size = 1904188 }, + { url = "https://files.pythonhosted.org/packages/d1/a8/3194ccfe461bb08da19377ebec8cb4f13c9bd82e13baebc53c5c7c39a029/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae370459da6a5466978c0eacf90690cb57ec9d533f8e63e564ef3822bfa04fe", size = 2083479 }, + { url = "https://files.pythonhosted.org/packages/42/c7/84cb569555d7179ca0b3f838cef08f66f7089b54432f5b8599aac6e9533e/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e3de2777e3b9f4d603112f78006f4ae0acb936e95f06da6cb1a45fbad6bdb4b5", size = 2118415 }, + { url = "https://files.pythonhosted.org/packages/3b/67/72abb8c73e0837716afbb58a59cc9e3ae43d1aa8677f3b4bc72c16142716/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3a64e81e8cba118e108d7126362ea30e021291b7805d47e4896e52c791be2761", size = 2079623 }, + { url = "https://files.pythonhosted.org/packages/0b/cd/c59707e35a47ba4cbbf153c3f7c56420c58653b5801b055dc52cccc8e2dc/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:52928d8c1b6bda03cc6d811e8923dffc87a2d3c8b3bfd2ce16471c7147a24850", size = 2250175 }, + { url = "https://files.pythonhosted.org/packages/84/32/e4325a6676b0bed32d5b084566ec86ed7fd1e9bcbfc49c578b1755bde920/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1b30d92c9412beb5ac6b10a3eb7ef92ccb14e3f2a8d7732e2d739f58b3aa7544", size = 2254674 }, + { url = "https://files.pythonhosted.org/packages/12/6f/5596dc418f2e292ffc661d21931ab34591952e2843e7168ea5a52591f6ff/pydantic_core-2.33.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5", size = 2080951 }, +] + +[[package]] +name = "pydub" +version = "0.25.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/9a/e6bca0eed82db26562c73b5076539a4a08d3cffd19c3cc5913a3e61145fd/pydub-0.25.1.tar.gz", hash = "sha256:980a33ce9949cab2a569606b65674d748ecbca4f0796887fd6f46173a7b0d30f", size = 38326 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/53/d78dc063216e62fc55f6b2eebb447f6a4b0a59f55c8406376f76bf959b08/pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6", size = 32327 }, +] + +[[package]] +name = "pygments" +version = "2.19.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, +] + +[[package]] +name = "pyparsing" +version = "3.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/22/f1129e69d94ffff626bdb5c835506b3a5b4f3d070f17ea295e12c2c6f60f/pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be", size = 1088608 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120 }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, +] + +[[package]] +name = "python-dotenv" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256 }, +] + +[[package]] +name = "python-multipart" +version = "0.0.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546 }, +] + +[[package]] +name = "pytz" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225 }, +] + +[[package]] +name = "pywin32" +version = "310" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/b1/68aa2986129fb1011dabbe95f0136f44509afaf072b12b8f815905a39f33/pywin32-310-cp311-cp311-win32.whl", hash = "sha256:1e765f9564e83011a63321bb9d27ec456a0ed90d3732c4b2e312b855365ed8bd", size = 8784284 }, + { url = "https://files.pythonhosted.org/packages/b3/bd/d1592635992dd8db5bb8ace0551bc3a769de1ac8850200cfa517e72739fb/pywin32-310-cp311-cp311-win_amd64.whl", hash = "sha256:126298077a9d7c95c53823934f000599f66ec9296b09167810eb24875f32689c", size = 9520748 }, + { url = "https://files.pythonhosted.org/packages/90/b1/ac8b1ffce6603849eb45a91cf126c0fa5431f186c2e768bf56889c46f51c/pywin32-310-cp311-cp311-win_arm64.whl", hash = "sha256:19ec5fc9b1d51c4350be7bb00760ffce46e6c95eaf2f0b2f1150657b1a43c582", size = 8455941 }, + { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239 }, + { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839 }, + { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470 }, + { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384 }, + { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039 }, + { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152 }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612 }, + { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040 }, + { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829 }, + { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167 }, + { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952 }, + { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301 }, + { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638 }, + { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850 }, + { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980 }, + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, +] + +[[package]] +name = "regex" +version = "2024.11.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/58/7e4d9493a66c88a7da6d205768119f51af0f684fe7be7bac8328e217a52c/regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638", size = 482669 }, + { url = "https://files.pythonhosted.org/packages/34/4c/8f8e631fcdc2ff978609eaeef1d6994bf2f028b59d9ac67640ed051f1218/regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7", size = 287684 }, + { url = "https://files.pythonhosted.org/packages/c5/1b/f0e4d13e6adf866ce9b069e191f303a30ab1277e037037a365c3aad5cc9c/regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20", size = 284589 }, + { url = "https://files.pythonhosted.org/packages/25/4d/ab21047f446693887f25510887e6820b93f791992994f6498b0318904d4a/regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114", size = 792121 }, + { url = "https://files.pythonhosted.org/packages/45/ee/c867e15cd894985cb32b731d89576c41a4642a57850c162490ea34b78c3b/regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3", size = 831275 }, + { url = "https://files.pythonhosted.org/packages/b3/12/b0f480726cf1c60f6536fa5e1c95275a77624f3ac8fdccf79e6727499e28/regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f", size = 818257 }, + { url = "https://files.pythonhosted.org/packages/bf/ce/0d0e61429f603bac433910d99ef1a02ce45a8967ffbe3cbee48599e62d88/regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0", size = 792727 }, + { url = "https://files.pythonhosted.org/packages/e4/c1/243c83c53d4a419c1556f43777ccb552bccdf79d08fda3980e4e77dd9137/regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55", size = 780667 }, + { url = "https://files.pythonhosted.org/packages/c5/f4/75eb0dd4ce4b37f04928987f1d22547ddaf6c4bae697623c1b05da67a8aa/regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89", size = 776963 }, + { url = "https://files.pythonhosted.org/packages/16/5d/95c568574e630e141a69ff8a254c2f188b4398e813c40d49228c9bbd9875/regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d", size = 784700 }, + { url = "https://files.pythonhosted.org/packages/8e/b5/f8495c7917f15cc6fee1e7f395e324ec3e00ab3c665a7dc9d27562fd5290/regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34", size = 848592 }, + { url = "https://files.pythonhosted.org/packages/1c/80/6dd7118e8cb212c3c60b191b932dc57db93fb2e36fb9e0e92f72a5909af9/regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d", size = 852929 }, + { url = "https://files.pythonhosted.org/packages/11/9b/5a05d2040297d2d254baf95eeeb6df83554e5e1df03bc1a6687fc4ba1f66/regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45", size = 781213 }, + { url = "https://files.pythonhosted.org/packages/26/b7/b14e2440156ab39e0177506c08c18accaf2b8932e39fb092074de733d868/regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9", size = 261734 }, + { url = "https://files.pythonhosted.org/packages/80/32/763a6cc01d21fb3819227a1cc3f60fd251c13c37c27a73b8ff4315433a8e/regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60", size = 274052 }, + { url = "https://files.pythonhosted.org/packages/ba/30/9a87ce8336b172cc232a0db89a3af97929d06c11ceaa19d97d84fa90a8f8/regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a", size = 483781 }, + { url = "https://files.pythonhosted.org/packages/01/e8/00008ad4ff4be8b1844786ba6636035f7ef926db5686e4c0f98093612add/regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9", size = 288455 }, + { url = "https://files.pythonhosted.org/packages/60/85/cebcc0aff603ea0a201667b203f13ba75d9fc8668fab917ac5b2de3967bc/regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2", size = 284759 }, + { url = "https://files.pythonhosted.org/packages/94/2b/701a4b0585cb05472a4da28ee28fdfe155f3638f5e1ec92306d924e5faf0/regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4", size = 794976 }, + { url = "https://files.pythonhosted.org/packages/4b/bf/fa87e563bf5fee75db8915f7352e1887b1249126a1be4813837f5dbec965/regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577", size = 833077 }, + { url = "https://files.pythonhosted.org/packages/a1/56/7295e6bad94b047f4d0834e4779491b81216583c00c288252ef625c01d23/regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3", size = 823160 }, + { url = "https://files.pythonhosted.org/packages/fb/13/e3b075031a738c9598c51cfbc4c7879e26729c53aa9cca59211c44235314/regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e", size = 796896 }, + { url = "https://files.pythonhosted.org/packages/24/56/0b3f1b66d592be6efec23a795b37732682520b47c53da5a32c33ed7d84e3/regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe", size = 783997 }, + { url = "https://files.pythonhosted.org/packages/f9/a1/eb378dada8b91c0e4c5f08ffb56f25fcae47bf52ad18f9b2f33b83e6d498/regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e", size = 781725 }, + { url = "https://files.pythonhosted.org/packages/83/f2/033e7dec0cfd6dda93390089864732a3409246ffe8b042e9554afa9bff4e/regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29", size = 789481 }, + { url = "https://files.pythonhosted.org/packages/83/23/15d4552ea28990a74e7696780c438aadd73a20318c47e527b47a4a5a596d/regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39", size = 852896 }, + { url = "https://files.pythonhosted.org/packages/e3/39/ed4416bc90deedbfdada2568b2cb0bc1fdb98efe11f5378d9892b2a88f8f/regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51", size = 860138 }, + { url = "https://files.pythonhosted.org/packages/93/2d/dd56bb76bd8e95bbce684326302f287455b56242a4f9c61f1bc76e28360e/regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad", size = 787692 }, + { url = "https://files.pythonhosted.org/packages/0b/55/31877a249ab7a5156758246b9c59539abbeba22461b7d8adc9e8475ff73e/regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54", size = 262135 }, + { url = "https://files.pythonhosted.org/packages/38/ec/ad2d7de49a600cdb8dd78434a1aeffe28b9d6fc42eb36afab4a27ad23384/regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b", size = 273567 }, + { url = "https://files.pythonhosted.org/packages/90/73/bcb0e36614601016552fa9344544a3a2ae1809dc1401b100eab02e772e1f/regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84", size = 483525 }, + { url = "https://files.pythonhosted.org/packages/0f/3f/f1a082a46b31e25291d830b369b6b0c5576a6f7fb89d3053a354c24b8a83/regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4", size = 288324 }, + { url = "https://files.pythonhosted.org/packages/09/c9/4e68181a4a652fb3ef5099e077faf4fd2a694ea6e0f806a7737aff9e758a/regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0", size = 284617 }, + { url = "https://files.pythonhosted.org/packages/fc/fd/37868b75eaf63843165f1d2122ca6cb94bfc0271e4428cf58c0616786dce/regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0", size = 795023 }, + { url = "https://files.pythonhosted.org/packages/c4/7c/d4cd9c528502a3dedb5c13c146e7a7a539a3853dc20209c8e75d9ba9d1b2/regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7", size = 833072 }, + { url = "https://files.pythonhosted.org/packages/4f/db/46f563a08f969159c5a0f0e722260568425363bea43bb7ae370becb66a67/regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7", size = 823130 }, + { url = "https://files.pythonhosted.org/packages/db/60/1eeca2074f5b87df394fccaa432ae3fc06c9c9bfa97c5051aed70e6e00c2/regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c", size = 796857 }, + { url = "https://files.pythonhosted.org/packages/10/db/ac718a08fcee981554d2f7bb8402f1faa7e868c1345c16ab1ebec54b0d7b/regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3", size = 784006 }, + { url = "https://files.pythonhosted.org/packages/c2/41/7da3fe70216cea93144bf12da2b87367590bcf07db97604edeea55dac9ad/regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07", size = 781650 }, + { url = "https://files.pythonhosted.org/packages/a7/d5/880921ee4eec393a4752e6ab9f0fe28009435417c3102fc413f3fe81c4e5/regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e", size = 789545 }, + { url = "https://files.pythonhosted.org/packages/dc/96/53770115e507081122beca8899ab7f5ae28ae790bfcc82b5e38976df6a77/regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6", size = 853045 }, + { url = "https://files.pythonhosted.org/packages/31/d3/1372add5251cc2d44b451bd94f43b2ec78e15a6e82bff6a290ef9fd8f00a/regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4", size = 860182 }, + { url = "https://files.pythonhosted.org/packages/ed/e3/c446a64984ea9f69982ba1a69d4658d5014bc7a0ea468a07e1a1265db6e2/regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d", size = 787733 }, + { url = "https://files.pythonhosted.org/packages/2b/f1/e40c8373e3480e4f29f2692bd21b3e05f296d3afebc7e5dcf21b9756ca1c/regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff", size = 262122 }, + { url = "https://files.pythonhosted.org/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a", size = 273545 }, +] + +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, +] + +[[package]] +name = "rich" +version = "14.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229 }, +] + +[[package]] +name = "ruff" +version = "0.11.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/11/bcef6784c7e5d200b8a1f5c2ddf53e5da0efec37e6e5a44d163fb97e04ba/ruff-0.11.6.tar.gz", hash = "sha256:bec8bcc3ac228a45ccc811e45f7eb61b950dbf4cf31a67fa89352574b01c7d79", size = 4010053 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/1f/8848b625100ebcc8740c8bac5b5dd8ba97dd4ee210970e98832092c1635b/ruff-0.11.6-py3-none-linux_armv6l.whl", hash = "sha256:d84dcbe74cf9356d1bdb4a78cf74fd47c740bf7bdeb7529068f69b08272239a1", size = 10248105 }, + { url = "https://files.pythonhosted.org/packages/e0/47/c44036e70c6cc11e6ee24399c2a1e1f1e99be5152bd7dff0190e4b325b76/ruff-0.11.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9bc583628e1096148011a5d51ff3c836f51899e61112e03e5f2b1573a9b726de", size = 11001494 }, + { url = "https://files.pythonhosted.org/packages/ed/5b/170444061650202d84d316e8f112de02d092bff71fafe060d3542f5bc5df/ruff-0.11.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:f2959049faeb5ba5e3b378709e9d1bf0cab06528b306b9dd6ebd2a312127964a", size = 10352151 }, + { url = "https://files.pythonhosted.org/packages/ff/91/f02839fb3787c678e112c8865f2c3e87cfe1744dcc96ff9fc56cfb97dda2/ruff-0.11.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63c5d4e30d9d0de7fedbfb3e9e20d134b73a30c1e74b596f40f0629d5c28a193", size = 10541951 }, + { url = "https://files.pythonhosted.org/packages/9e/f3/c09933306096ff7a08abede3cc2534d6fcf5529ccd26504c16bf363989b5/ruff-0.11.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:26a4b9a4e1439f7d0a091c6763a100cef8fbdc10d68593df6f3cfa5abdd9246e", size = 10079195 }, + { url = "https://files.pythonhosted.org/packages/e0/0d/a87f8933fccbc0d8c653cfbf44bedda69c9582ba09210a309c066794e2ee/ruff-0.11.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b5edf270223dd622218256569636dc3e708c2cb989242262fe378609eccf1308", size = 11698918 }, + { url = "https://files.pythonhosted.org/packages/52/7d/8eac0bd083ea8a0b55b7e4628428203441ca68cd55e0b67c135a4bc6e309/ruff-0.11.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f55844e818206a9dd31ff27f91385afb538067e2dc0beb05f82c293ab84f7d55", size = 12319426 }, + { url = "https://files.pythonhosted.org/packages/c2/dc/d0c17d875662d0c86fadcf4ca014ab2001f867621b793d5d7eef01b9dcce/ruff-0.11.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d8f782286c5ff562e4e00344f954b9320026d8e3fae2ba9e6948443fafd9ffc", size = 11791012 }, + { url = "https://files.pythonhosted.org/packages/f9/f3/81a1aea17f1065449a72509fc7ccc3659cf93148b136ff2a8291c4bc3ef1/ruff-0.11.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:01c63ba219514271cee955cd0adc26a4083df1956d57847978383b0e50ffd7d2", size = 13949947 }, + { url = "https://files.pythonhosted.org/packages/61/9f/a3e34de425a668284e7024ee6fd41f452f6fa9d817f1f3495b46e5e3a407/ruff-0.11.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15adac20ef2ca296dd3d8e2bedc6202ea6de81c091a74661c3666e5c4c223ff6", size = 11471753 }, + { url = "https://files.pythonhosted.org/packages/df/c5/4a57a86d12542c0f6e2744f262257b2aa5a3783098ec14e40f3e4b3a354a/ruff-0.11.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4dd6b09e98144ad7aec026f5588e493c65057d1b387dd937d7787baa531d9bc2", size = 10417121 }, + { url = "https://files.pythonhosted.org/packages/58/3f/a3b4346dff07ef5b862e2ba06d98fcbf71f66f04cf01d375e871382b5e4b/ruff-0.11.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:45b2e1d6c0eed89c248d024ea95074d0e09988d8e7b1dad8d3ab9a67017a5b03", size = 10073829 }, + { url = "https://files.pythonhosted.org/packages/93/cc/7ed02e0b86a649216b845b3ac66ed55d8aa86f5898c5f1691797f408fcb9/ruff-0.11.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:bd40de4115b2ec4850302f1a1d8067f42e70b4990b68838ccb9ccd9f110c5e8b", size = 11076108 }, + { url = "https://files.pythonhosted.org/packages/39/5e/5b09840fef0eff1a6fa1dea6296c07d09c17cb6fb94ed5593aa591b50460/ruff-0.11.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:77cda2dfbac1ab73aef5e514c4cbfc4ec1fbef4b84a44c736cc26f61b3814cd9", size = 11512366 }, + { url = "https://files.pythonhosted.org/packages/6f/4c/1cd5a84a412d3626335ae69f5f9de2bb554eea0faf46deb1f0cb48534042/ruff-0.11.6-py3-none-win32.whl", hash = "sha256:5151a871554be3036cd6e51d0ec6eef56334d74dfe1702de717a995ee3d5b287", size = 10485900 }, + { url = "https://files.pythonhosted.org/packages/42/46/8997872bc44d43df986491c18d4418f1caff03bc47b7f381261d62c23442/ruff-0.11.6-py3-none-win_amd64.whl", hash = "sha256:cce85721d09c51f3b782c331b0abd07e9d7d5f775840379c640606d3159cae0e", size = 11558592 }, + { url = "https://files.pythonhosted.org/packages/d7/6a/65fecd51a9ca19e1477c3879a7fda24f8904174d1275b419422ac00f6eee/ruff-0.11.6-py3-none-win_arm64.whl", hash = "sha256:3567ba0d07fb170b1b48d944715e3294b77f5b7679e8ba258199a250383ccb79", size = 10682766 }, +] + +[[package]] +name = "safetensors" +version = "0.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/71/7e/2d5d6ee7b40c0682315367ec7475693d110f512922d582fef1bd4a63adc3/safetensors-0.5.3.tar.gz", hash = "sha256:b6b0d6ecacec39a4fdd99cc19f4576f5219ce858e6fd8dbe7609df0b8dc56965", size = 67210 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/ae/88f6c49dbd0cc4da0e08610019a3c78a7d390879a919411a410a1876d03a/safetensors-0.5.3-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd20eb133db8ed15b40110b7c00c6df51655a2998132193de2f75f72d99c7073", size = 436917 }, + { url = "https://files.pythonhosted.org/packages/b8/3b/11f1b4a2f5d2ab7da34ecc062b0bc301f2be024d110a6466726bec8c055c/safetensors-0.5.3-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:21d01c14ff6c415c485616b8b0bf961c46b3b343ca59110d38d744e577f9cce7", size = 418419 }, + { url = "https://files.pythonhosted.org/packages/5d/9a/add3e6fef267658075c5a41573c26d42d80c935cdc992384dfae435feaef/safetensors-0.5.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11bce6164887cd491ca75c2326a113ba934be596e22b28b1742ce27b1d076467", size = 459493 }, + { url = "https://files.pythonhosted.org/packages/df/5c/bf2cae92222513cc23b3ff85c4a1bb2811a2c3583ac0f8e8d502751de934/safetensors-0.5.3-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4a243be3590bc3301c821da7a18d87224ef35cbd3e5f5727e4e0728b8172411e", size = 472400 }, + { url = "https://files.pythonhosted.org/packages/58/11/7456afb740bd45782d0f4c8e8e1bb9e572f1bf82899fb6ace58af47b4282/safetensors-0.5.3-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8bd84b12b1670a6f8e50f01e28156422a2bc07fb16fc4e98bded13039d688a0d", size = 522891 }, + { url = "https://files.pythonhosted.org/packages/57/3d/fe73a9d2ace487e7285f6e157afee2383bd1ddb911b7cb44a55cf812eae3/safetensors-0.5.3-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:391ac8cab7c829452175f871fcaf414aa1e292b5448bd02620f675a7f3e7abb9", size = 537694 }, + { url = "https://files.pythonhosted.org/packages/a6/f8/dae3421624fcc87a89d42e1898a798bc7ff72c61f38973a65d60df8f124c/safetensors-0.5.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cead1fa41fc54b1e61089fa57452e8834f798cb1dc7a09ba3524f1eb08e0317a", size = 471642 }, + { url = "https://files.pythonhosted.org/packages/ce/20/1fbe16f9b815f6c5a672f5b760951e20e17e43f67f231428f871909a37f6/safetensors-0.5.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1077f3e94182d72618357b04b5ced540ceb71c8a813d3319f1aba448e68a770d", size = 502241 }, + { url = "https://files.pythonhosted.org/packages/5f/18/8e108846b506487aa4629fe4116b27db65c3dde922de2c8e0cc1133f3f29/safetensors-0.5.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:799021e78287bac619c7b3f3606730a22da4cda27759ddf55d37c8db7511c74b", size = 638001 }, + { url = "https://files.pythonhosted.org/packages/82/5a/c116111d8291af6c8c8a8b40628fe833b9db97d8141c2a82359d14d9e078/safetensors-0.5.3-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:df26da01aaac504334644e1b7642fa000bfec820e7cef83aeac4e355e03195ff", size = 734013 }, + { url = "https://files.pythonhosted.org/packages/7d/ff/41fcc4d3b7de837963622e8610d998710705bbde9a8a17221d85e5d0baad/safetensors-0.5.3-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:32c3ef2d7af8b9f52ff685ed0bc43913cdcde135089ae322ee576de93eae5135", size = 670687 }, + { url = "https://files.pythonhosted.org/packages/40/ad/2b113098e69c985a3d8fbda4b902778eae4a35b7d5188859b4a63d30c161/safetensors-0.5.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:37f1521be045e56fc2b54c606d4455573e717b2d887c579ee1dbba5f868ece04", size = 643147 }, + { url = "https://files.pythonhosted.org/packages/0a/0c/95aeb51d4246bd9a3242d3d8349c1112b4ee7611a4b40f0c5c93b05f001d/safetensors-0.5.3-cp38-abi3-win32.whl", hash = "sha256:cfc0ec0846dcf6763b0ed3d1846ff36008c6e7290683b61616c4b040f6a54ace", size = 296677 }, + { url = "https://files.pythonhosted.org/packages/69/e2/b011c38e5394c4c18fb5500778a55ec43ad6106126e74723ffaee246f56e/safetensors-0.5.3-cp38-abi3-win_amd64.whl", hash = "sha256:836cbbc320b47e80acd40e44c8682db0e8ad7123209f69b093def21ec7cafd11", size = 308878 }, +] + +[[package]] +name = "sam-2" +version = "1.0" +source = { git = "https://github.com/facebookresearch/segment-anything-2?rev=c2ec8e14a185632b0a5d8b161928ceb50197eddc#c2ec8e14a185632b0a5d8b161928ceb50197eddc" } +dependencies = [ + { name = "hydra-core" }, + { name = "iopath" }, + { name = "numpy" }, + { name = "pillow" }, + { name = "torch" }, + { name = "torchvision" }, + { name = "tqdm" }, +] + +[[package]] +name = "scipy" +version = "1.15.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/b9/31ba9cd990e626574baf93fbc1ac61cf9ed54faafd04c479117517661637/scipy-1.15.2.tar.gz", hash = "sha256:cd58a314d92838f7e6f755c8a2167ead4f27e1fd5c1251fd54289569ef3495ec", size = 59417316 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/1f/bf0a5f338bda7c35c08b4ed0df797e7bafe8a78a97275e9f439aceb46193/scipy-1.15.2-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:92233b2df6938147be6fa8824b8136f29a18f016ecde986666be5f4d686a91a4", size = 38703651 }, + { url = "https://files.pythonhosted.org/packages/de/54/db126aad3874601048c2c20ae3d8a433dbfd7ba8381551e6f62606d9bd8e/scipy-1.15.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:62ca1ff3eb513e09ed17a5736929429189adf16d2d740f44e53270cc800ecff1", size = 30102038 }, + { url = "https://files.pythonhosted.org/packages/61/d8/84da3fffefb6c7d5a16968fe5b9f24c98606b165bb801bb0b8bc3985200f/scipy-1.15.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4c6676490ad76d1c2894d77f976144b41bd1a4052107902238047fb6a473e971", size = 22375518 }, + { url = "https://files.pythonhosted.org/packages/44/78/25535a6e63d3b9c4c90147371aedb5d04c72f3aee3a34451f2dc27c0c07f/scipy-1.15.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a8bf5cb4a25046ac61d38f8d3c3426ec11ebc350246a4642f2f315fe95bda655", size = 25142523 }, + { url = "https://files.pythonhosted.org/packages/e0/22/4b4a26fe1cd9ed0bc2b2cb87b17d57e32ab72c346949eaf9288001f8aa8e/scipy-1.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a8e34cf4c188b6dd004654f88586d78f95639e48a25dfae9c5e34a6dc34547e", size = 35491547 }, + { url = "https://files.pythonhosted.org/packages/32/ea/564bacc26b676c06a00266a3f25fdfe91a9d9a2532ccea7ce6dd394541bc/scipy-1.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28a0d2c2075946346e4408b211240764759e0fabaeb08d871639b5f3b1aca8a0", size = 37634077 }, + { url = "https://files.pythonhosted.org/packages/43/c2/bfd4e60668897a303b0ffb7191e965a5da4056f0d98acfb6ba529678f0fb/scipy-1.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:42dabaaa798e987c425ed76062794e93a243be8f0f20fff6e7a89f4d61cb3d40", size = 37231657 }, + { url = "https://files.pythonhosted.org/packages/4a/75/5f13050bf4f84c931bcab4f4e83c212a36876c3c2244475db34e4b5fe1a6/scipy-1.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f5e296ec63c5da6ba6fa0343ea73fd51b8b3e1a300b0a8cae3ed4b1122c7462", size = 40035857 }, + { url = "https://files.pythonhosted.org/packages/b9/8b/7ec1832b09dbc88f3db411f8cdd47db04505c4b72c99b11c920a8f0479c3/scipy-1.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:597a0c7008b21c035831c39927406c6181bcf8f60a73f36219b69d010aa04737", size = 41217654 }, + { url = "https://files.pythonhosted.org/packages/4b/5d/3c78815cbab499610f26b5bae6aed33e227225a9fa5290008a733a64f6fc/scipy-1.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c4697a10da8f8765bb7c83e24a470da5797e37041edfd77fd95ba3811a47c4fd", size = 38756184 }, + { url = "https://files.pythonhosted.org/packages/37/20/3d04eb066b471b6e171827548b9ddb3c21c6bbea72a4d84fc5989933910b/scipy-1.15.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:869269b767d5ee7ea6991ed7e22b3ca1f22de73ab9a49c44bad338b725603301", size = 30163558 }, + { url = "https://files.pythonhosted.org/packages/a4/98/e5c964526c929ef1f795d4c343b2ff98634ad2051bd2bbadfef9e772e413/scipy-1.15.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bad78d580270a4d32470563ea86c6590b465cb98f83d760ff5b0990cb5518a93", size = 22437211 }, + { url = "https://files.pythonhosted.org/packages/1d/cd/1dc7371e29195ecbf5222f9afeedb210e0a75057d8afbd942aa6cf8c8eca/scipy-1.15.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:b09ae80010f52efddb15551025f9016c910296cf70adbf03ce2a8704f3a5ad20", size = 25232260 }, + { url = "https://files.pythonhosted.org/packages/f0/24/1a181a9e5050090e0b5138c5f496fee33293c342b788d02586bc410c6477/scipy-1.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a6fd6eac1ce74a9f77a7fc724080d507c5812d61e72bd5e4c489b042455865e", size = 35198095 }, + { url = "https://files.pythonhosted.org/packages/c0/53/eaada1a414c026673eb983f8b4a55fe5eb172725d33d62c1b21f63ff6ca4/scipy-1.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b871df1fe1a3ba85d90e22742b93584f8d2b8e6124f8372ab15c71b73e428b8", size = 37297371 }, + { url = "https://files.pythonhosted.org/packages/e9/06/0449b744892ed22b7e7b9a1994a866e64895363572677a316a9042af1fe5/scipy-1.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:03205d57a28e18dfd39f0377d5002725bf1f19a46f444108c29bdb246b6c8a11", size = 36872390 }, + { url = "https://files.pythonhosted.org/packages/6a/6f/a8ac3cfd9505ec695c1bc35edc034d13afbd2fc1882a7c6b473e280397bb/scipy-1.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:601881dfb761311045b03114c5fe718a12634e5608c3b403737ae463c9885d53", size = 39700276 }, + { url = "https://files.pythonhosted.org/packages/f5/6f/e6e5aff77ea2a48dd96808bb51d7450875af154ee7cbe72188afb0b37929/scipy-1.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:e7c68b6a43259ba0aab737237876e5c2c549a031ddb7abc28c7b47f22e202ded", size = 40942317 }, + { url = "https://files.pythonhosted.org/packages/53/40/09319f6e0f276ea2754196185f95cd191cb852288440ce035d5c3a931ea2/scipy-1.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01edfac9f0798ad6b46d9c4c9ca0e0ad23dbf0b1eb70e96adb9fa7f525eff0bf", size = 38717587 }, + { url = "https://files.pythonhosted.org/packages/fe/c3/2854f40ecd19585d65afaef601e5e1f8dbf6758b2f95b5ea93d38655a2c6/scipy-1.15.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:08b57a9336b8e79b305a143c3655cc5bdbe6d5ece3378578888d2afbb51c4e37", size = 30100266 }, + { url = "https://files.pythonhosted.org/packages/dd/b1/f9fe6e3c828cb5930b5fe74cb479de5f3d66d682fa8adb77249acaf545b8/scipy-1.15.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:54c462098484e7466362a9f1672d20888f724911a74c22ae35b61f9c5919183d", size = 22373768 }, + { url = "https://files.pythonhosted.org/packages/15/9d/a60db8c795700414c3f681908a2b911e031e024d93214f2d23c6dae174ab/scipy-1.15.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:cf72ff559a53a6a6d77bd8eefd12a17995ffa44ad86c77a5df96f533d4e6c6bb", size = 25154719 }, + { url = "https://files.pythonhosted.org/packages/37/3b/9bda92a85cd93f19f9ed90ade84aa1e51657e29988317fabdd44544f1dd4/scipy-1.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9de9d1416b3d9e7df9923ab23cd2fe714244af10b763975bea9e4f2e81cebd27", size = 35163195 }, + { url = "https://files.pythonhosted.org/packages/03/5a/fc34bf1aa14dc7c0e701691fa8685f3faec80e57d816615e3625f28feb43/scipy-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb530e4794fc8ea76a4a21ccb67dea33e5e0e60f07fc38a49e821e1eae3b71a0", size = 37255404 }, + { url = "https://files.pythonhosted.org/packages/4a/71/472eac45440cee134c8a180dbe4c01b3ec247e0338b7c759e6cd71f199a7/scipy-1.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5ea7ed46d437fc52350b028b1d44e002646e28f3e8ddc714011aaf87330f2f32", size = 36860011 }, + { url = "https://files.pythonhosted.org/packages/01/b3/21f890f4f42daf20e4d3aaa18182dddb9192771cd47445aaae2e318f6738/scipy-1.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:11e7ad32cf184b74380f43d3c0a706f49358b904fa7d5345f16ddf993609184d", size = 39657406 }, + { url = "https://files.pythonhosted.org/packages/0d/76/77cf2ac1f2a9cc00c073d49e1e16244e389dd88e2490c91d84e1e3e4d126/scipy-1.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:a5080a79dfb9b78b768cebf3c9dcbc7b665c5875793569f48bf0e2b1d7f68f6f", size = 40961243 }, + { url = "https://files.pythonhosted.org/packages/4c/4b/a57f8ddcf48e129e6054fa9899a2a86d1fc6b07a0e15c7eebff7ca94533f/scipy-1.15.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:447ce30cee6a9d5d1379087c9e474628dab3db4a67484be1b7dc3196bfb2fac9", size = 38870286 }, + { url = "https://files.pythonhosted.org/packages/0c/43/c304d69a56c91ad5f188c0714f6a97b9c1fed93128c691148621274a3a68/scipy-1.15.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c90ebe8aaa4397eaefa8455a8182b164a6cc1d59ad53f79943f266d99f68687f", size = 30141634 }, + { url = "https://files.pythonhosted.org/packages/44/1a/6c21b45d2548eb73be9b9bff421aaaa7e85e22c1f9b3bc44b23485dfce0a/scipy-1.15.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:def751dd08243934c884a3221156d63e15234a3155cf25978b0a668409d45eb6", size = 22415179 }, + { url = "https://files.pythonhosted.org/packages/74/4b/aefac4bba80ef815b64f55da06f62f92be5d03b467f2ce3668071799429a/scipy-1.15.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:302093e7dfb120e55515936cb55618ee0b895f8bcaf18ff81eca086c17bd80af", size = 25126412 }, + { url = "https://files.pythonhosted.org/packages/b1/53/1cbb148e6e8f1660aacd9f0a9dfa2b05e9ff1cb54b4386fe868477972ac2/scipy-1.15.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd5b77413e1855351cdde594eca99c1f4a588c2d63711388b6a1f1c01f62274", size = 34952867 }, + { url = "https://files.pythonhosted.org/packages/2c/23/e0eb7f31a9c13cf2dca083828b97992dd22f8184c6ce4fec5deec0c81fcf/scipy-1.15.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d0194c37037707b2afa7a2f2a924cf7bac3dc292d51b6a925e5fcb89bc5c776", size = 36890009 }, + { url = "https://files.pythonhosted.org/packages/03/f3/e699e19cabe96bbac5189c04aaa970718f0105cff03d458dc5e2b6bd1e8c/scipy-1.15.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:bae43364d600fdc3ac327db99659dcb79e6e7ecd279a75fe1266669d9a652828", size = 36545159 }, + { url = "https://files.pythonhosted.org/packages/af/f5/ab3838e56fe5cc22383d6fcf2336e48c8fe33e944b9037fbf6cbdf5a11f8/scipy-1.15.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f031846580d9acccd0044efd1a90e6f4df3a6e12b4b6bd694a7bc03a89892b28", size = 39136566 }, + { url = "https://files.pythonhosted.org/packages/0a/c8/b3f566db71461cabd4b2d5b39bcc24a7e1c119535c8361f81426be39bb47/scipy-1.15.2-cp313-cp313t-win_amd64.whl", hash = "sha256:fe8a9eb875d430d81755472c5ba75e84acc980e4a8f6204d402849234d3017db", size = 40477705 }, +] + +[[package]] +name = "semantic-version" +version = "2.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/31/f2289ce78b9b473d582568c234e104d2a342fd658cc288a7553d83bb8595/semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c", size = 52289 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/23/8146aad7d88f4fcb3a6218f41a60f6c2d4e3a72de72da1825dc7c8f7877c/semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177", size = 15552 }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, +] + +[[package]] +name = "starlette" +version = "0.46.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/20/08dfcd9c983f6a6f4a1000d934b9e6d626cff8d2eeb77a89a68eef20a2b7/starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5", size = 2580846 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037 }, +] + +[[package]] +name = "supervision" +version = "0.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "defusedxml" }, + { name = "matplotlib" }, + { name = "numpy" }, + { name = "opencv-python-headless" }, + { name = "pillow" }, + { name = "pyyaml" }, + { name = "scipy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/14/eee601cebe9e0e806ce891e711673c215e436d65517b7c6637ee31f00e86/supervision-0.23.0.tar.gz", hash = "sha256:635039616604f60d232dd00db9e3d149cf4df3d7817e59dddeb058ec51c04351", size = 131362 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/c5/3ddb1e235da4d809d41d34fb5d4435ba37c71764b4a2f91ce6a3d01d1730/supervision-0.23.0-py3-none-any.whl", hash = "sha256:63cc16558df5e5d4799426f3b81a4aadd4915b6ff3f70ea75cb8ef9933ddb93b", size = 151474 }, +] + +[[package]] +name = "sympy" +version = "1.13.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mpmath" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/11/8a/5a7fd6284fa8caac23a26c9ddf9c30485a48169344b4bd3b0f02fef1890f/sympy-1.13.3.tar.gz", hash = "sha256:b27fd2c6530e0ab39e275fc9b683895367e51d5da91baa8d3d64db2565fec4d9", size = 7533196 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/ff/c87e0622b1dadea79d2fb0b25ade9ed98954c9033722eb707053d310d4f3/sympy-1.13.3-py3-none-any.whl", hash = "sha256:54612cf55a62755ee71824ce692986f23c88ffa77207b30c1368eda4a7060f73", size = 6189483 }, +] + +[[package]] +name = "tokenizers" +version = "0.19.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/04/2071c150f374aab6d5e92aaec38d0f3c368d227dd9e0469a1f0966ac68d1/tokenizers-0.19.1.tar.gz", hash = "sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3", size = 321039 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/d6/6e1d728d765eb4102767f071bf7f6439ab10d7f4a975c9217db65715207a/tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059", size = 2533448 }, + { url = "https://files.pythonhosted.org/packages/90/79/d17a0f491d10817cd30f1121a07aa09c8e97a81114b116e473baf1577f09/tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14", size = 2440254 }, + { url = "https://files.pythonhosted.org/packages/c7/28/2d11c3ff94f9d42eceb2ea549a06e3f166fe391c5a025e5d96fac898a3ac/tokenizers-0.19.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594", size = 3684971 }, + { url = "https://files.pythonhosted.org/packages/36/c6/537f22b57e6003904d35d07962dbde2f2e9bdd791d0241da976a4c7f8194/tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc", size = 3568894 }, + { url = "https://files.pythonhosted.org/packages/af/ef/3c1deed14ec59b2c8e7e2fa27b2a53f7d101181277a43b89ab17d891ef2e/tokenizers-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2", size = 3426873 }, + { url = "https://files.pythonhosted.org/packages/06/db/c0320c4798ac6bd12d2ef895bec9d10d216a3b4d6fff10e9d68883ea7edc/tokenizers-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe", size = 3965050 }, + { url = "https://files.pythonhosted.org/packages/4c/8a/a166888d6cb14db55f5eb7ce0b1d4777d145aa27cbf4f945712cf6c29935/tokenizers-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d", size = 4047855 }, + { url = "https://files.pythonhosted.org/packages/a7/03/fb50fc03f86016b227a967c8d474f90230c885c0d18f78acdfda7a96ce56/tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa", size = 3608228 }, + { url = "https://files.pythonhosted.org/packages/5b/cd/0385e1026e1e03732fd398e964792a3a8433918b166748c82507e014d748/tokenizers-0.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6", size = 9633115 }, + { url = "https://files.pythonhosted.org/packages/25/50/8f8ad0bbdaf09d04b15e6502d1fa1c653754ed7e016e4ae009726aa1a4e4/tokenizers-0.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b", size = 9949062 }, + { url = "https://files.pythonhosted.org/packages/db/11/31be66710f1d14526f3588a441efadeb184e1e68458067007b20ead03c59/tokenizers-0.19.1-cp311-none-win32.whl", hash = "sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256", size = 2041039 }, + { url = "https://files.pythonhosted.org/packages/65/8e/6d7d72b28f22c422cff8beae10ac3c2e4376b9be721ef8167b7eecd1da62/tokenizers-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66", size = 2220386 }, + { url = "https://files.pythonhosted.org/packages/63/90/2890cd096898dcdb596ee172cde40c0f54a9cf43b0736aa260a5501252af/tokenizers-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:621d670e1b1c281a1c9698ed89451395d318802ff88d1fc1accff0867a06f153", size = 2530580 }, + { url = "https://files.pythonhosted.org/packages/74/d1/f4e1e950adb36675dfd8f9d0f4be644f3f3aaf22a5677a4f5c81282b662e/tokenizers-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d924204a3dbe50b75630bd16f821ebda6a5f729928df30f582fb5aade90c818a", size = 2436682 }, + { url = "https://files.pythonhosted.org/packages/ed/30/89b321a16c58d233e301ec15072c0d3ed5014825e72da98604cd3ab2fba1/tokenizers-0.19.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f3fefdc0446b1a1e6d81cd4c07088ac015665d2e812f6dbba4a06267d1a2c95", size = 3693494 }, + { url = "https://files.pythonhosted.org/packages/05/40/fa899f32de483500fbc78befd378fd7afba4270f17db707d1a78c0a4ddc3/tokenizers-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9620b78e0b2d52ef07b0d428323fb34e8ea1219c5eac98c2596311f20f1f9266", size = 3566541 }, + { url = "https://files.pythonhosted.org/packages/67/14/e7da32ae5fb4971830f1ef335932fae3fa57e76b537e852f146c850aefdf/tokenizers-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04ce49e82d100594715ac1b2ce87d1a36e61891a91de774755f743babcd0dd52", size = 3430792 }, + { url = "https://files.pythonhosted.org/packages/f2/4b/aae61bdb6ab584d2612170801703982ee0e35f8b6adacbeefe5a3b277621/tokenizers-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5c2ff13d157afe413bf7e25789879dd463e5a4abfb529a2d8f8473d8042e28f", size = 3962812 }, + { url = "https://files.pythonhosted.org/packages/0a/b6/f7b7ef89c4da7b20256e6eab23d3835f05d1ca8f451d31c16cbfe3cd9eb6/tokenizers-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3174c76efd9d08f836bfccaca7cfec3f4d1c0a4cf3acbc7236ad577cc423c840", size = 4024688 }, + { url = "https://files.pythonhosted.org/packages/80/54/12047a69f5b382d7ee72044dc89151a2dd0d13b2c9bdcc22654883704d31/tokenizers-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9d5b6c0e7a1e979bec10ff960fae925e947aab95619a6fdb4c1d8ff3708ce3", size = 3610961 }, + { url = "https://files.pythonhosted.org/packages/52/b7/1e8a913d18ac28feeda42d4d2d51781874398fb59cd1c1e2653a4b5742ed/tokenizers-0.19.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a179856d1caee06577220ebcfa332af046d576fb73454b8f4d4b0ba8324423ea", size = 9631367 }, + { url = "https://files.pythonhosted.org/packages/ac/3d/2284f6d99f8f21d09352b88b8cfefa24ab88468d962aeb0aa15c20d76b32/tokenizers-0.19.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:952b80dac1a6492170f8c2429bd11fcaa14377e097d12a1dbe0ef2fb2241e16c", size = 9950121 }, + { url = "https://files.pythonhosted.org/packages/2a/94/ec3369dbc9b7200c14c8c7a1a04c78b7a7398d0c001e1b7d1ffe30eb93a0/tokenizers-0.19.1-cp312-none-win32.whl", hash = "sha256:01d62812454c188306755c94755465505836fd616f75067abcae529c35edeb57", size = 2044069 }, + { url = "https://files.pythonhosted.org/packages/0c/97/80bff6937e0c67d30c0facacd4f0bcf4254e581aa4995c73cef8c8640e56/tokenizers-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:b70bfbe3a82d3e3fb2a5e9b22a39f8d1740c96c68b6ace0086b39074f08ab89a", size = 2214527 }, +] + +[[package]] +name = "tomlkit" +version = "0.12.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/9b/42f93f459cf03062c8b3aab812475f01456fd42e04b08bad69bcaedd15c8/tomlkit-0.12.0.tar.gz", hash = "sha256:01f0477981119c7d8ee0f67ebe0297a7c95b14cf9f4b102b45486deb77018716", size = 190497 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/4f/12207897848a653d03ebbf6775a29d949408ded5f99b2d87198bc5c93508/tomlkit-0.12.0-py3-none-any.whl", hash = "sha256:926f1f37a1587c7a4f6c7484dae538f1345d96d793d9adab5d3675957b1d0766", size = 37334 }, +] + +[[package]] +name = "torch" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "fsspec" }, + { name = "jinja2" }, + { name = "networkx" }, + { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "sympy" }, + { name = "triton", marker = "python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "typing-extensions" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/ea/4ab009e953bca6ff35ad75b8ab58c0923308636c182c145dc63084f7d136/torch-2.4.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:0b5f88afdfa05a335d80351e3cea57d38e578c8689f751d35e0ff36bce872113", size = 797111232 }, + { url = "https://files.pythonhosted.org/packages/8f/a1/b31f94b4631c1731261db9fdc9a749ef58facc3b76094a6fe974f611f239/torch-2.4.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:ef503165f2341942bfdf2bd520152f19540d0c0e34961232f134dc59ad435be8", size = 89719574 }, + { url = "https://files.pythonhosted.org/packages/5a/6a/775b93d6888c31f1f1fc457e4f5cc89f0984412d5dcdef792b8f2aa6e812/torch-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:092e7c2280c860eff762ac08c4bdcd53d701677851670695e0c22d6d345b269c", size = 199436128 }, + { url = "https://files.pythonhosted.org/packages/1f/34/c93873c37f93154d982172755f7e504fdbae6c760499303a3111ce6ce327/torch-2.4.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:ddddbd8b066e743934a4200b3d54267a46db02106876d21cf31f7da7a96f98ea", size = 62145176 }, + { url = "https://files.pythonhosted.org/packages/cc/df/5204a13a7a973c23c7ade615bafb1a3112b5d0ec258d8390f078fa4ab0f7/torch-2.4.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:fdc4fe11db3eb93c1115d3e973a27ac7c1a8318af8934ffa36b0370efe28e042", size = 797019590 }, + { url = "https://files.pythonhosted.org/packages/4f/16/d23a689e5ef8001ed2ace1a3a59f2fda842889b0c3f3877799089925282a/torch-2.4.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:18835374f599207a9e82c262153c20ddf42ea49bc76b6eadad8e5f49729f6e4d", size = 89613802 }, + { url = "https://files.pythonhosted.org/packages/a8/e0/ca8354dfb8d834a76da51b06e8248b70fc182bc163540507919124974bdf/torch-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:ebea70ff30544fc021d441ce6b219a88b67524f01170b1c538d7d3ebb5e7f56c", size = 199387694 }, + { url = "https://files.pythonhosted.org/packages/ac/30/8b6f77ea4ce84f015ee024b8dfef0dac289396254e8bfd493906d4cbb848/torch-2.4.1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:72b484d5b6cec1a735bf3fa5a1c4883d01748698c5e9cfdbeb4ffab7c7987e0d", size = 62123443 }, +] + +[[package]] +name = "torchvision" +version = "0.19.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pillow" }, + { name = "torch" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/66/f6/a2f07a3f5385b37c45b8e14448b8610a8618dfad18ea437cb23b4edc50c5/torchvision-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:40514282b4896d62765b8e26d7091c32e17c35817d00ec4be2362ea3ba3d1787", size = 1660235 }, + { url = "https://files.pythonhosted.org/packages/28/9d/40d1b943bbbd02a30d6b4f691d6de37a7e4c92f90bed0f8f47379e90eec6/torchvision-0.19.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:5a91be061ae5d6d5b95e833b93e57ca4d3c56c5a57444dd15da2e3e7fba96050", size = 7026152 }, + { url = "https://files.pythonhosted.org/packages/36/04/36e1d35b864f4a7c8f3056a427542b14b3bcdbc66edd36faadee109b86c5/torchvision-0.19.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d71a6a6fe3a5281ca3487d4c56ad4aad20ff70f82f1d7c79bcb6e7b0c2af00c8", size = 14072255 }, + { url = "https://files.pythonhosted.org/packages/f8/69/dc769cf54df8e828c0b8957b4521f35178f5bd4cc5b8fbe8a37ffd89a27c/torchvision-0.19.1-cp311-cp311-win_amd64.whl", hash = "sha256:70dea324174f5e9981b68e4b7cd524512c106ba64aedef560a86a0bbf2fbf62c", size = 1288330 }, + { url = "https://files.pythonhosted.org/packages/a4/d0/b1029ab95d9219cac2dfc0d835e9ab4cebb01f5cb6b48e736778020fb995/torchvision-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27ece277ff0f6cdc7fed0627279c632dcb2e58187da771eca24b0fbcf3f8590d", size = 1660230 }, + { url = "https://files.pythonhosted.org/packages/8b/34/fdd2d9e01228a069b28473a7c020bf1812c8ecab8565666feb247659ed30/torchvision-0.19.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:c659ff92a61f188a1a7baef2850f3c0b6c85685447453c03d0e645ba8f1dcc1c", size = 7026404 }, + { url = "https://files.pythonhosted.org/packages/da/b2/9da42d67dfc30d9e3b161f7a37f6c7eca86a80e6caef4a9aa11727faa4f5/torchvision-0.19.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:c07bf43c2a145d792ecd9d0503d6c73577147ece508d45600d8aac77e4cdfcf9", size = 14072022 }, + { url = "https://files.pythonhosted.org/packages/6b/b2/fd577e1622b43cdeb74782a60cea4909f88f471813c215ea7b4e7ea84a74/torchvision-0.19.1-cp312-cp312-win_amd64.whl", hash = "sha256:b4283d283675556bb0eae31d29996f53861b17cbdcdf3509e6bc050414ac9289", size = 1288328 }, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, +] + +[[package]] +name = "transformers" +version = "4.44.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "huggingface-hub" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "regex" }, + { name = "requests" }, + { name = "safetensors" }, + { name = "tokenizers" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/a3/81de49357a3c6ac4421d48d9662b53293838f217baf3f3bb9eb55f89fab6/transformers-4.44.2.tar.gz", hash = "sha256:36aa17cc92ee154058e426d951684a2dab48751b35b49437896f898931270826", size = 8110312 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/35/07c9879163b603f0e464b0f6e6e628a2340cfc7cdc5ca8e7d52d776710d4/transformers-4.44.2-py3-none-any.whl", hash = "sha256:1c02c65e7bfa5e52a634aff3da52138b583fc6f263c1f28d547dc144ba3d412d", size = 9465369 }, +] + +[[package]] +name = "triton" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/3e/a2f59384587eff6aeb7d37b6780de7fedd2214935e27520430ca9f5b7975/triton-3.0.0-1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5ce8520437c602fb633f1324cc3871c47bee3b67acf9756c1a66309b60e3216c", size = 209438883 }, + { url = "https://files.pythonhosted.org/packages/fe/7b/7757205dee3628f75e7991021d15cd1bd0c9b044ca9affe99b50879fc0e1/triton-3.0.0-1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:34e509deb77f1c067d8640725ef00c5cbfcb2052a1a3cb6a6d343841f92624eb", size = 209464695 }, +] + +[[package]] +name = "typer" +version = "0.15.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "rich" }, + { name = "shellingham" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/6f/3991f0f1c7fcb2df31aef28e0594d8d54b05393a0e4e34c65e475c2a5d41/typer-0.15.2.tar.gz", hash = "sha256:ab2fab47533a813c49fe1f16b1a370fd5819099c00b119e0633df65f22144ba5", size = 100711 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/fc/5b29fea8cee020515ca82cc68e3b8e1e34bb19a3535ad854cac9257b414c/typer-0.15.2-py3-none-any.whl", hash = "sha256:46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc", size = 45061 }, +] + +[[package]] +name = "typing-extensions" +version = "4.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806 }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125 }, +] + +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839 }, +] + +[[package]] +name = "urllib3" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680 }, +] + +[[package]] +name = "uvicorn" +version = "0.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a6/ae/9bbb19b9e1c450cf9ecaef06463e40234d98d95bf572fab11b4f19ae5ded/uvicorn-0.34.2.tar.gz", hash = "sha256:0e929828f6186353a80b58ea719861d2629d766293b6d19baf086ba31d4f3328", size = 76815 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/4b/4cef6ce21a2aaca9d852a6e84ef4f135d99fcd74fa75105e2fc0c8308acd/uvicorn-0.34.2-py3-none-any.whl", hash = "sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403", size = 62483 }, +] + +[package.optional-dependencies] +standard = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "httptools" }, + { name = "python-dotenv" }, + { name = "pyyaml" }, + { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, + { name = "watchfiles" }, + { name = "websockets" }, +] + +[[package]] +name = "uvloop" +version = "0.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/f1/dc9577455e011ad43d9379e836ee73f40b4f99c02946849a44f7ae64835e/uvloop-0.20.0.tar.gz", hash = "sha256:4603ca714a754fc8d9b197e325db25b2ea045385e8a3ad05d3463de725fdf469", size = 2329938 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/bf/45828beccf685b7ed9638d9b77ef382b470c6ca3b5bff78067e02ffd5663/uvloop-0.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e50289c101495e0d1bb0bfcb4a60adde56e32f4449a67216a1ab2750aa84f037", size = 1320593 }, + { url = "https://files.pythonhosted.org/packages/27/c0/3c24e50bee7802a2add96ca9f0d5eb0ebab07e0a5615539d38aeb89499b9/uvloop-0.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e237f9c1e8a00e7d9ddaa288e535dc337a39bcbf679f290aee9d26df9e72bce9", size = 736676 }, + { url = "https://files.pythonhosted.org/packages/83/ce/ffa3c72954eae36825acfafd2b6a9221d79abd2670c0d25e04d6ef4a2007/uvloop-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:746242cd703dc2b37f9d8b9f173749c15e9a918ddb021575a0205ec29a38d31e", size = 3494573 }, + { url = "https://files.pythonhosted.org/packages/46/6d/4caab3a36199ba52b98d519feccfcf48921d7a6649daf14a93c7e77497e9/uvloop-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82edbfd3df39fb3d108fc079ebc461330f7c2e33dbd002d146bf7c445ba6e756", size = 3489932 }, + { url = "https://files.pythonhosted.org/packages/e4/4f/49c51595bd794945c88613df88922c38076eae2d7653f4624aa6f4980b07/uvloop-0.20.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:80dc1b139516be2077b3e57ce1cb65bfed09149e1d175e0478e7a987863b68f0", size = 4185596 }, + { url = "https://files.pythonhosted.org/packages/b8/94/7e256731260d313f5049717d1c4582d52a3b132424c95e16954a50ab95d3/uvloop-0.20.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4f44af67bf39af25db4c1ac27e82e9665717f9c26af2369c404be865c8818dcf", size = 4185746 }, + { url = "https://files.pythonhosted.org/packages/2d/64/31cbd379d6e260ac8de3f672f904e924f09715c3f192b09f26cc8e9f574c/uvloop-0.20.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4b75f2950ddb6feed85336412b9a0c310a2edbcf4cf931aa5cfe29034829676d", size = 1324302 }, + { url = "https://files.pythonhosted.org/packages/1e/6b/9207e7177ff30f78299401f2e1163ea41130d4fd29bcdc6d12572c06b728/uvloop-0.20.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:77fbc69c287596880ecec2d4c7a62346bef08b6209749bf6ce8c22bbaca0239e", size = 738105 }, + { url = "https://files.pythonhosted.org/packages/c1/ba/b64b10f577519d875992dc07e2365899a1a4c0d28327059ce1e1bdfb6854/uvloop-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6462c95f48e2d8d4c993a2950cd3d31ab061864d1c226bbf0ee2f1a8f36674b9", size = 4090658 }, + { url = "https://files.pythonhosted.org/packages/0a/f8/5ceea6876154d926604f10c1dd896adf9bce6d55a55911364337b8a5ed8d/uvloop-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:649c33034979273fa71aa25d0fe120ad1777c551d8c4cd2c0c9851d88fcb13ab", size = 4173357 }, + { url = "https://files.pythonhosted.org/packages/18/b2/117ab6bfb18274753fbc319607bf06e216bd7eea8be81d5bac22c912d6a7/uvloop-0.20.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a609780e942d43a275a617c0839d85f95c334bad29c4c0918252085113285b5", size = 4029868 }, + { url = "https://files.pythonhosted.org/packages/6f/52/deb4be09060637ef4752adaa0b75bf770c20c823e8108705792f99cd4a6f/uvloop-0.20.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aea15c78e0d9ad6555ed201344ae36db5c63d428818b4b2a42842b3870127c00", size = 4115980 }, +] + +[[package]] +name = "watchfiles" +version = "1.0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/03/e2/8ed598c42057de7aa5d97c472254af4906ff0a59a66699d426fc9ef795d7/watchfiles-1.0.5.tar.gz", hash = "sha256:b7529b5dcc114679d43827d8c35a07c493ad6f083633d573d81c660abc5979e9", size = 94537 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/f4/41b591f59021786ef517e1cdc3b510383551846703e03f204827854a96f8/watchfiles-1.0.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:237f9be419e977a0f8f6b2e7b0475ababe78ff1ab06822df95d914a945eac827", size = 405336 }, + { url = "https://files.pythonhosted.org/packages/ae/06/93789c135be4d6d0e4f63e96eea56dc54050b243eacc28439a26482b5235/watchfiles-1.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0da39ff917af8b27a4bdc5a97ac577552a38aac0d260a859c1517ea3dc1a7c4", size = 395977 }, + { url = "https://files.pythonhosted.org/packages/d2/db/1cd89bd83728ca37054512d4d35ab69b5f12b8aa2ac9be3b0276b3bf06cc/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cfcb3952350e95603f232a7a15f6c5f86c5375e46f0bd4ae70d43e3e063c13d", size = 455232 }, + { url = "https://files.pythonhosted.org/packages/40/90/d8a4d44ffe960517e487c9c04f77b06b8abf05eb680bed71c82b5f2cad62/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68b2dddba7a4e6151384e252a5632efcaa9bc5d1c4b567f3cb621306b2ca9f63", size = 459151 }, + { url = "https://files.pythonhosted.org/packages/6c/da/267a1546f26465dead1719caaba3ce660657f83c9d9c052ba98fb8856e13/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95cf944fcfc394c5f9de794ce581914900f82ff1f855326f25ebcf24d5397418", size = 489054 }, + { url = "https://files.pythonhosted.org/packages/b1/31/33850dfd5c6efb6f27d2465cc4c6b27c5a6f5ed53c6fa63b7263cf5f60f6/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecf6cd9f83d7c023b1aba15d13f705ca7b7d38675c121f3cc4a6e25bd0857ee9", size = 523955 }, + { url = "https://files.pythonhosted.org/packages/09/84/b7d7b67856efb183a421f1416b44ca975cb2ea6c4544827955dfb01f7dc2/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:852de68acd6212cd6d33edf21e6f9e56e5d98c6add46f48244bd479d97c967c6", size = 502234 }, + { url = "https://files.pythonhosted.org/packages/71/87/6dc5ec6882a2254cfdd8b0718b684504e737273903b65d7338efaba08b52/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5730f3aa35e646103b53389d5bc77edfbf578ab6dab2e005142b5b80a35ef25", size = 454750 }, + { url = "https://files.pythonhosted.org/packages/3d/6c/3786c50213451a0ad15170d091570d4a6554976cf0df19878002fc96075a/watchfiles-1.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:18b3bd29954bc4abeeb4e9d9cf0b30227f0f206c86657674f544cb032296acd5", size = 631591 }, + { url = "https://files.pythonhosted.org/packages/1b/b3/1427425ade4e359a0deacce01a47a26024b2ccdb53098f9d64d497f6684c/watchfiles-1.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ba5552a1b07c8edbf197055bc9d518b8f0d98a1c6a73a293bc0726dce068ed01", size = 625370 }, + { url = "https://files.pythonhosted.org/packages/15/ba/f60e053b0b5b8145d682672024aa91370a29c5c921a88977eb565de34086/watchfiles-1.0.5-cp311-cp311-win32.whl", hash = "sha256:2f1fefb2e90e89959447bc0420fddd1e76f625784340d64a2f7d5983ef9ad246", size = 277791 }, + { url = "https://files.pythonhosted.org/packages/50/ed/7603c4e164225c12c0d4e8700b64bb00e01a6c4eeea372292a3856be33a4/watchfiles-1.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:b6e76ceb1dd18c8e29c73f47d41866972e891fc4cc7ba014f487def72c1cf096", size = 291622 }, + { url = "https://files.pythonhosted.org/packages/a2/c2/99bb7c96b4450e36877fde33690ded286ff555b5a5c1d925855d556968a1/watchfiles-1.0.5-cp311-cp311-win_arm64.whl", hash = "sha256:266710eb6fddc1f5e51843c70e3bebfb0f5e77cf4f27129278c70554104d19ed", size = 283699 }, + { url = "https://files.pythonhosted.org/packages/2a/8c/4f0b9bdb75a1bfbd9c78fad7d8854369283f74fe7cf03eb16be77054536d/watchfiles-1.0.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b5eb568c2aa6018e26da9e6c86f3ec3fd958cee7f0311b35c2630fa4217d17f2", size = 401511 }, + { url = "https://files.pythonhosted.org/packages/dc/4e/7e15825def77f8bd359b6d3f379f0c9dac4eb09dd4ddd58fd7d14127179c/watchfiles-1.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0a04059f4923ce4e856b4b4e5e783a70f49d9663d22a4c3b3298165996d1377f", size = 392715 }, + { url = "https://files.pythonhosted.org/packages/58/65/b72fb817518728e08de5840d5d38571466c1b4a3f724d190cec909ee6f3f/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e380c89983ce6e6fe2dd1e1921b9952fb4e6da882931abd1824c092ed495dec", size = 454138 }, + { url = "https://files.pythonhosted.org/packages/3e/a4/86833fd2ea2e50ae28989f5950b5c3f91022d67092bfec08f8300d8b347b/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fe43139b2c0fdc4a14d4f8d5b5d967f7a2777fd3d38ecf5b1ec669b0d7e43c21", size = 458592 }, + { url = "https://files.pythonhosted.org/packages/38/7e/42cb8df8be9a37e50dd3a818816501cf7a20d635d76d6bd65aae3dbbff68/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee0822ce1b8a14fe5a066f93edd20aada932acfe348bede8aa2149f1a4489512", size = 487532 }, + { url = "https://files.pythonhosted.org/packages/fc/fd/13d26721c85d7f3df6169d8b495fcac8ab0dc8f0945ebea8845de4681dab/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a0dbcb1c2d8f2ab6e0a81c6699b236932bd264d4cef1ac475858d16c403de74d", size = 522865 }, + { url = "https://files.pythonhosted.org/packages/a1/0d/7f9ae243c04e96c5455d111e21b09087d0eeaf9a1369e13a01c7d3d82478/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a2014a2b18ad3ca53b1f6c23f8cd94a18ce930c1837bd891262c182640eb40a6", size = 499887 }, + { url = "https://files.pythonhosted.org/packages/8e/0f/a257766998e26aca4b3acf2ae97dff04b57071e991a510857d3799247c67/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f6ae86d5cb647bf58f9f655fcf577f713915a5d69057a0371bc257e2553234", size = 454498 }, + { url = "https://files.pythonhosted.org/packages/81/79/8bf142575a03e0af9c3d5f8bcae911ee6683ae93a625d349d4ecf4c8f7df/watchfiles-1.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1a7bac2bde1d661fb31f4d4e8e539e178774b76db3c2c17c4bb3e960a5de07a2", size = 630663 }, + { url = "https://files.pythonhosted.org/packages/f1/80/abe2e79f610e45c63a70d271caea90c49bbf93eb00fa947fa9b803a1d51f/watchfiles-1.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ab626da2fc1ac277bbf752446470b367f84b50295264d2d313e28dc4405d663", size = 625410 }, + { url = "https://files.pythonhosted.org/packages/91/6f/bc7fbecb84a41a9069c2c6eb6319f7f7df113adf113e358c57fc1aff7ff5/watchfiles-1.0.5-cp312-cp312-win32.whl", hash = "sha256:9f4571a783914feda92018ef3901dab8caf5b029325b5fe4558c074582815249", size = 277965 }, + { url = "https://files.pythonhosted.org/packages/99/a5/bf1c297ea6649ec59e935ab311f63d8af5faa8f0b86993e3282b984263e3/watchfiles-1.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:360a398c3a19672cf93527f7e8d8b60d8275119c5d900f2e184d32483117a705", size = 291693 }, + { url = "https://files.pythonhosted.org/packages/7f/7b/fd01087cc21db5c47e5beae507b87965db341cce8a86f9eb12bf5219d4e0/watchfiles-1.0.5-cp312-cp312-win_arm64.whl", hash = "sha256:1a2902ede862969077b97523987c38db28abbe09fb19866e711485d9fbf0d417", size = 283287 }, + { url = "https://files.pythonhosted.org/packages/c7/62/435766874b704f39b2fecd8395a29042db2b5ec4005bd34523415e9bd2e0/watchfiles-1.0.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0b289572c33a0deae62daa57e44a25b99b783e5f7aed81b314232b3d3c81a11d", size = 401531 }, + { url = "https://files.pythonhosted.org/packages/6e/a6/e52a02c05411b9cb02823e6797ef9bbba0bfaf1bb627da1634d44d8af833/watchfiles-1.0.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a056c2f692d65bf1e99c41045e3bdcaea3cb9e6b5a53dcaf60a5f3bd95fc9763", size = 392417 }, + { url = "https://files.pythonhosted.org/packages/3f/53/c4af6819770455932144e0109d4854437769672d7ad897e76e8e1673435d/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9dca99744991fc9850d18015c4f0438865414e50069670f5f7eee08340d8b40", size = 453423 }, + { url = "https://files.pythonhosted.org/packages/cb/d1/8e88df58bbbf819b8bc5cfbacd3c79e01b40261cad0fc84d1e1ebd778a07/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:894342d61d355446d02cd3988a7326af344143eb33a2fd5d38482a92072d9563", size = 458185 }, + { url = "https://files.pythonhosted.org/packages/ff/70/fffaa11962dd5429e47e478a18736d4e42bec42404f5ee3b92ef1b87ad60/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab44e1580924d1ffd7b3938e02716d5ad190441965138b4aa1d1f31ea0877f04", size = 486696 }, + { url = "https://files.pythonhosted.org/packages/39/db/723c0328e8b3692d53eb273797d9a08be6ffb1d16f1c0ba2bdbdc2a3852c/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6f9367b132078b2ceb8d066ff6c93a970a18c3029cea37bfd7b2d3dd2e5db8f", size = 522327 }, + { url = "https://files.pythonhosted.org/packages/cd/05/9fccc43c50c39a76b68343484b9da7b12d42d0859c37c61aec018c967a32/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2e55a9b162e06e3f862fb61e399fe9f05d908d019d87bf5b496a04ef18a970a", size = 499741 }, + { url = "https://files.pythonhosted.org/packages/23/14/499e90c37fa518976782b10a18b18db9f55ea73ca14641615056f8194bb3/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0125f91f70e0732a9f8ee01e49515c35d38ba48db507a50c5bdcad9503af5827", size = 453995 }, + { url = "https://files.pythonhosted.org/packages/61/d9/f75d6840059320df5adecd2c687fbc18960a7f97b55c300d20f207d48aef/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:13bb21f8ba3248386337c9fa51c528868e6c34a707f729ab041c846d52a0c69a", size = 629693 }, + { url = "https://files.pythonhosted.org/packages/fc/17/180ca383f5061b61406477218c55d66ec118e6c0c51f02d8142895fcf0a9/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:839ebd0df4a18c5b3c1b890145b5a3f5f64063c2a0d02b13c76d78fe5de34936", size = 624677 }, + { url = "https://files.pythonhosted.org/packages/bf/15/714d6ef307f803f236d69ee9d421763707899d6298d9f3183e55e366d9af/watchfiles-1.0.5-cp313-cp313-win32.whl", hash = "sha256:4a8ec1e4e16e2d5bafc9ba82f7aaecfeec990ca7cd27e84fb6f191804ed2fcfc", size = 277804 }, + { url = "https://files.pythonhosted.org/packages/a8/b4/c57b99518fadf431f3ef47a610839e46e5f8abf9814f969859d1c65c02c7/watchfiles-1.0.5-cp313-cp313-win_amd64.whl", hash = "sha256:f436601594f15bf406518af922a89dcaab416568edb6f65c4e5bbbad1ea45c11", size = 291087 }, +] + +[[package]] +name = "websockets" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/62/7a7874b7285413c954a4cca3c11fd851f11b2fe5b4ae2d9bee4f6d9bdb10/websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b", size = 104994 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/73/9c1e168a2e7fdf26841dc98f5f5502e91dea47428da7690a08101f616169/websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4", size = 124047 }, + { url = "https://files.pythonhosted.org/packages/e4/2d/9a683359ad2ed11b2303a7a94800db19c61d33fa3bde271df09e99936022/websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f", size = 121282 }, + { url = "https://files.pythonhosted.org/packages/95/aa/75fa3b893142d6d98a48cb461169bd268141f2da8bfca97392d6462a02eb/websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3", size = 121325 }, + { url = "https://files.pythonhosted.org/packages/6e/a4/51a25e591d645df71ee0dc3a2c880b28e5514c00ce752f98a40a87abcd1e/websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c", size = 131502 }, + { url = "https://files.pythonhosted.org/packages/cd/ea/0ceeea4f5b87398fe2d9f5bcecfa00a1bcd542e2bfcac2f2e5dd612c4e9e/websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45", size = 130491 }, + { url = "https://files.pythonhosted.org/packages/e3/05/f52a60b66d9faf07a4f7d71dc056bffafe36a7e98c4eb5b78f04fe6e4e85/websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04", size = 130872 }, + { url = "https://files.pythonhosted.org/packages/ac/4e/c7361b2d7b964c40fea924d64881145164961fcd6c90b88b7e3ab2c4f431/websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447", size = 136318 }, + { url = "https://files.pythonhosted.org/packages/0a/31/337bf35ae5faeaf364c9cddec66681cdf51dc4414ee7a20f92a18e57880f/websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca", size = 135594 }, + { url = "https://files.pythonhosted.org/packages/95/aa/1ac767825c96f9d7e43c4c95683757d4ef28cf11fa47a69aca42428d3e3a/websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53", size = 136191 }, + { url = "https://files.pythonhosted.org/packages/28/4b/344ec5cfeb6bc417da097f8253607c3aed11d9a305fb58346f506bf556d8/websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402", size = 124453 }, + { url = "https://files.pythonhosted.org/packages/d1/40/6b169cd1957476374f51f4486a3e85003149e62a14e6b78a958c2222337a/websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b", size = 124971 }, + { url = "https://files.pythonhosted.org/packages/a9/6d/23cc898647c8a614a0d9ca703695dd04322fb5135096a20c2684b7c852b6/websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df", size = 124061 }, + { url = "https://files.pythonhosted.org/packages/39/34/364f30fdf1a375e4002a26ee3061138d1571dfda6421126127d379d13930/websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc", size = 121296 }, + { url = "https://files.pythonhosted.org/packages/2e/00/96ae1c9dcb3bc316ef683f2febd8c97dde9f254dc36c3afc65c7645f734c/websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b", size = 121326 }, + { url = "https://files.pythonhosted.org/packages/af/f1/bba1e64430685dd456c1a1fd6b0c791ae33104967b928aefeff261761e8d/websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb", size = 131807 }, + { url = "https://files.pythonhosted.org/packages/62/3b/98ee269712f37d892b93852ce07b3e6d7653160ca4c0d4f8c8663f8021f8/websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92", size = 130751 }, + { url = "https://files.pythonhosted.org/packages/f1/00/d6f01ca2b191f8b0808e4132ccd2e7691f0453cbd7d0f72330eb97453c3a/websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed", size = 131176 }, + { url = "https://files.pythonhosted.org/packages/af/9c/703ff3cd8109dcdee6152bae055d852ebaa7750117760ded697ab836cbcf/websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5", size = 136246 }, + { url = "https://files.pythonhosted.org/packages/0b/a5/1a38fb85a456b9dc874ec984f3ff34f6550eafd17a3da28753cd3c1628e8/websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2", size = 135466 }, + { url = "https://files.pythonhosted.org/packages/3c/98/1261f289dff7e65a38d59d2f591de6ed0a2580b729aebddec033c4d10881/websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113", size = 136083 }, + { url = "https://files.pythonhosted.org/packages/a9/1c/f68769fba63ccb9c13fe0a25b616bd5aebeef1c7ddebc2ccc32462fb784d/websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d", size = 124460 }, + { url = "https://files.pythonhosted.org/packages/20/52/8915f51f9aaef4e4361c89dd6cf69f72a0159f14e0d25026c81b6ad22525/websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f", size = 124985 }, + { url = "https://files.pythonhosted.org/packages/79/4d/9cc401e7b07e80532ebc8c8e993f42541534da9e9249c59ee0139dcb0352/websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e", size = 118370 }, +] diff --git a/data/sam_mask/mug/0/cup rack.jpg b/data/sam_mask/mug/0/cup rack.jpg deleted file mode 100644 index d648377..0000000 Binary files a/data/sam_mask/mug/0/cup rack.jpg and /dev/null differ diff --git a/data/sam_mask/mug/0/pink mug.jpg b/data/sam_mask/mug/0/pink mug.jpg deleted file mode 100644 index efe08b6..0000000 Binary files a/data/sam_mask/mug/0/pink mug.jpg and /dev/null differ diff --git a/data/sam_mask/mug/0/source.jpg b/data/sam_mask/mug/0/source.jpg deleted file mode 100644 index 3e86b81..0000000 Binary files a/data/sam_mask/mug/0/source.jpg and /dev/null differ diff --git a/data/sam_mask/mug/1/cup rack.jpg b/data/sam_mask/mug/1/cup rack.jpg deleted file mode 100644 index 7cb8e77..0000000 Binary files a/data/sam_mask/mug/1/cup rack.jpg and /dev/null differ diff --git a/data/sam_mask/mug/1/pink mug.jpg b/data/sam_mask/mug/1/pink mug.jpg deleted file mode 100644 index e4d083d..0000000 Binary files a/data/sam_mask/mug/1/pink mug.jpg and /dev/null differ diff --git a/data/sam_mask/mug/1/source.jpg b/data/sam_mask/mug/1/source.jpg deleted file mode 100644 index d70b5f0..0000000 Binary files a/data/sam_mask/mug/1/source.jpg and /dev/null differ diff --git a/data/sam_mask/mug/2/cup rack.jpg b/data/sam_mask/mug/2/cup rack.jpg deleted file mode 100644 index fe31cb4..0000000 Binary files a/data/sam_mask/mug/2/cup rack.jpg and /dev/null differ diff --git a/data/sam_mask/mug/2/pink mug.jpg b/data/sam_mask/mug/2/pink mug.jpg deleted file mode 100644 index a73477a..0000000 Binary files a/data/sam_mask/mug/2/pink mug.jpg and /dev/null differ diff --git a/data/sam_mask/mug/2/source.jpg b/data/sam_mask/mug/2/source.jpg deleted file mode 100644 index 9b386db..0000000 Binary files a/data/sam_mask/mug/2/source.jpg and /dev/null differ diff --git a/data/sam_mask/mug/check/cup rack_0.jpg b/data/sam_mask/mug/check/cup rack_0.jpg deleted file mode 100644 index dd1bde4..0000000 Binary files a/data/sam_mask/mug/check/cup rack_0.jpg and /dev/null differ diff --git a/data/sam_mask/mug/check/cup rack_1.jpg b/data/sam_mask/mug/check/cup rack_1.jpg deleted file mode 100644 index 1c389c9..0000000 Binary files a/data/sam_mask/mug/check/cup rack_1.jpg and /dev/null differ diff --git a/data/sam_mask/mug/check/cup rack_2.jpg b/data/sam_mask/mug/check/cup rack_2.jpg deleted file mode 100644 index 27a6967..0000000 Binary files a/data/sam_mask/mug/check/cup rack_2.jpg and /dev/null differ diff --git a/data/sam_mask/mug/check/pink mug_0.jpg b/data/sam_mask/mug/check/pink mug_0.jpg deleted file mode 100644 index dd1bde4..0000000 Binary files a/data/sam_mask/mug/check/pink mug_0.jpg and /dev/null differ diff --git a/data/sam_mask/mug/check/pink mug_1.jpg b/data/sam_mask/mug/check/pink mug_1.jpg deleted file mode 100644 index 1c389c9..0000000 Binary files a/data/sam_mask/mug/check/pink mug_1.jpg and /dev/null differ diff --git a/data/sam_mask/mug/check/pink mug_2.jpg b/data/sam_mask/mug/check/pink mug_2.jpg deleted file mode 100644 index 27a6967..0000000 Binary files a/data/sam_mask/mug/check/pink mug_2.jpg and /dev/null differ diff --git a/data/sam_mask/sauce/0/plate.jpg b/data/sam_mask/sauce/0/plate.jpg deleted file mode 100644 index 3c6a6dc..0000000 Binary files a/data/sam_mask/sauce/0/plate.jpg and /dev/null differ diff --git a/data/sam_mask/sauce/0/source.jpg b/data/sam_mask/sauce/0/source.jpg deleted file mode 100644 index afc2164..0000000 Binary files a/data/sam_mask/sauce/0/source.jpg and /dev/null differ diff --git a/data/sam_mask/sauce/1/plate.jpg b/data/sam_mask/sauce/1/plate.jpg deleted file mode 100644 index f23184a..0000000 Binary files a/data/sam_mask/sauce/1/plate.jpg and /dev/null differ diff --git a/data/sam_mask/sauce/1/source.jpg b/data/sam_mask/sauce/1/source.jpg deleted file mode 100644 index 69face6..0000000 Binary files a/data/sam_mask/sauce/1/source.jpg and /dev/null differ diff --git a/data/sam_mask/sauce/2/plate.jpg b/data/sam_mask/sauce/2/plate.jpg deleted file mode 100644 index b6b7641..0000000 Binary files a/data/sam_mask/sauce/2/plate.jpg and /dev/null differ diff --git a/data/sam_mask/sauce/2/source.jpg b/data/sam_mask/sauce/2/source.jpg deleted file mode 100644 index 38a85fd..0000000 Binary files a/data/sam_mask/sauce/2/source.jpg and /dev/null differ diff --git a/data/sam_mask/sauce/check/plate_0.jpg b/data/sam_mask/sauce/check/plate_0.jpg deleted file mode 100644 index e375fb9..0000000 Binary files a/data/sam_mask/sauce/check/plate_0.jpg and /dev/null differ diff --git a/data/sam_mask/sauce/check/plate_1.jpg b/data/sam_mask/sauce/check/plate_1.jpg deleted file mode 100644 index 1eb7615..0000000 Binary files a/data/sam_mask/sauce/check/plate_1.jpg and /dev/null differ diff --git a/data/sam_mask/sauce/check/plate_2.jpg b/data/sam_mask/sauce/check/plate_2.jpg deleted file mode 100644 index f1bfecf..0000000 Binary files a/data/sam_mask/sauce/check/plate_2.jpg and /dev/null differ diff --git a/demo_generation/USAGE.md b/demo_generation/USAGE.md new file mode 100644 index 0000000..85097d5 --- /dev/null +++ b/demo_generation/USAGE.md @@ -0,0 +1,71 @@ +auto_pipeline 使用说明 +===================== + +概述 +---- +`auto_pipeline.py` 是一个交互式小工具,用来把单个 HDF5 源轨迹导出为可视化帧、把首帧复制到 `data/sam_mask//0/` 供手动制作 SAM 掩码、等待人工准备掩码后再继续进行 gen_demo 等后续步骤。 + +快速上手(推荐) +---------------- +1. 进入脚本目录: + +```bash +cd /home/liaohaoran/code/DemoGen/demo_generation +``` + +2. 激活 `demogen` 环境(已在 `~/.bashrc` 中添加 `doge` 快捷): + +```bash +# 推荐:使用别名(已添加到 ~/.bashrc),在一个新的交互 shell 中运行: +doge +# 或者手动激活: +# conda activate demogen +``` + +3. 运行交互脚本: + +```bash +python3 auto_pipeline.py +``` + +脚本流程(简要) +---------------- +- 脚本会询问一个源 HDF5 的绝对路径(例如 `/path/to/episode0.hdf5`)。 +- 导出该 HDF5 中的 RGB 帧到 HDF5 同目录(文件名 `000000.jpg`, `000001.jpg`, ...)。 +- 将首帧复制到 `DemoGen/data/sam_mask//0/`,等待你在该目录下手动放置/编辑掩码文件(PNG/JPG)。脚本会在检测到掩码后继续。 +- 脚本会暂停,等待你准备好 `demogen` 的配置(config)并按回车继续。 +- 可在交互中提供用于运行 `gen_demo` 的命令,脚本会在该目录内执行该命令(注意:脚本不会自动修改你的 config)。 +- 运行完成后,脚本会尝试根据生成目录写 `loop_times.txt`,并可选择调用描述生成脚本。 + +注意事项 +-------- +- 掩码步骤为手动交互:当前脚本不再尝试自动运行 `get_mask.py`(用户可手动运行或在准备目录置入掩码文件)。 +- 若想恢复自动化 mask(需安装额外依赖,如 `lang_sam`),请确保 `demogen` 环境中已正确安装所有依赖。 +- 我已修复 `~/.bashrc` 中的语法错误;如遇到启动时的报错请先重新打开一个终端以加载修复后的配置。 + +示例(测试) +----------- +下面是在本仓库中用作快速测试的命令(示例文件 `test_dummy.h5` 已被本地用于验证): + +```bash +# 在仓库的 demo_generation 目录下运行(会交互) +python3 auto_pipeline.py +# 当脚本询问 HDF5 路径时,输入: +# /home/liaohaoran/code/DemoGen/demo_generation/test_dummy.h5 +# 然后按多次回车以接受默认值并跳过 gen_demo 步骤 +``` + +常见问题 +-------- +- Q: 为什么脚本检测到的掩码是首帧(jpg)? + A: 脚本只是检测目标目录内的图片文件以便给出提示。你可以覆盖该目录中的图片(用真实掩码文件替换)或手动放置掩码文件。 + +- Q: 我想脚本自动运行 `get_mask.py`,该怎么做? + A: 我可以把 `get_mask.py` 改为接收输入/输出路径参数,并把 `auto_pipeline.py` 加回自动化选项;但这要求目标环境已正确安装 `lang_sam` 及其依赖(可能包括大型依赖,如 PyTorch)。如果需要,我可以帮你实现并执行安装(安装可能较耗时)。 + +文件位置 +-------- +- 脚本:`demo_generation/auto_pipeline.py` +- 使用说明:`demo_generation/USAGE.md` + +如需我把这段说明合并回仓库根 README 或创建 PR,请告诉我。 \ No newline at end of file diff --git a/demo_generation/auto_pipeline.py b/demo_generation/auto_pipeline.py new file mode 100644 index 0000000..9277d18 --- /dev/null +++ b/demo_generation/auto_pipeline.py @@ -0,0 +1,458 @@ +#!/usr/bin/env python3 +""" +auto_pipeline.py +----------------- +这个脚本是一个交互式的管道(pipeline)框架,用来把单个 HDF5 轨迹文件: + +- 导出 RGB 帧(命名为 6 位零填充的 jpg,例如 `000000.jpg`) +- 将首帧复制到 `data/sam_mask//0/`(与仓库中 `get_mask.py` 的约定路径一致) +- 调用 SAM mask 生成脚本(`get_mask.py`),并在此处暂停以便人工编辑/放置配置 +- 运行 `gen_demo.py`(由用户提供具体命令)来生成增强后的 episode +- 根据生成结果写入 `loop_times.txt`,并可选调用描述/指令生成脚本 + +注意:该脚本较为保守,不会自动修改你的 config 或强制安装依赖;对于 SAM 部分若缺少 `lang_sam`,请先安装或手动准备 mask 文件。 + +使用方式: + cd DemoGen/demo_generation + python3 auto_pipeline.py + +脚本采用交互方式询问 HDF5 路径、get_mask.py 路径以及 gen_demo 的运行命令。 +""" + +import os +import shutil +import subprocess +import h5py +import io +import numpy as np +from PIL import Image +import cv2 +import time +import shutil + + +def save_rgb_frames_from_h5(h5_path, out_dir, camera_preference=('head_camera', 'left_camera', 'right_camera')): + """ + 从 HDF5 中寻找 RGB 帧并保存为 6 位零填充的 JPG 文件。 + + 针对常见的数据布局做了几种查找策略: + 1. 优先查找 `observation/['rgb']`(按传入的 camera_preference 顺序)。 + 2. 若未命中,则在 `observation` 下查找任何包含 `rgb` 的子 group。 + 3. 最后回退到顶层的 `rgb` / `images` / `frames` 等候选名称。 + + 参数: + h5_path: HDF5 路径 + out_dir: 输出目录(会被创建) + camera_preference: 优先使用的相机组名顺序 + + 返回:保存的文件路径列表(按帧序) + """ + os.makedirs(out_dir, exist_ok=True) + saved = [] + + with h5py.File(h5_path, 'r') as f: + rgb_ds = None + + # 优先在 observation 下查找 camera.rgb + if 'observation' in f: + obs = f['observation'] + for cam in camera_preference: + if cam in obs and 'rgb' in obs[cam]: + rgb_ds = obs[cam]['rgb'] + break + # 回退:找任何包含 rgb 的 group + if rgb_ds is None: + for name, item in obs.items(): + if isinstance(item, h5py.Group) and 'rgb' in item: + rgb_ds = item['rgb'] + break + + # 更后备的顶层候选项 + if rgb_ds is None: + for candidate in ('rgb', 'images', 'frames'): + if candidate in f: + rgb_ds = f[candidate] + break + + if rgb_ds is None: + raise RuntimeError('在 HDF5 中未找到 rgb 数据。期望路径示例:observation//rgb 或 顶层 rgb。') + + # 逐帧读取并保存为 JPG + n = rgb_ds.shape[0] + for i in range(n): + v = rgb_ds[i] + out_path = os.path.join(out_dir, f"{i:06d}.jpg") + + # 有些 HDF5 存储的是已经编码的 bytes(例如 jpeg bytes),有些则是 HxWxC 的 numpy 数组 + if isinstance(v, (bytes, bytearray, np.bytes_)) or (hasattr(v, 'tobytes') and getattr(v, 'dtype', None) is not None and v.dtype.kind == 'S'): + # 尝试作为二进制图像解码(参考 hdf52rgb_all.py) + try: + # 将可能的 bytes-like 对象转换为 bytes + b = bytes(v) + # 用 OpenCV 解码(得到 BGR),然后转换为 RGB 保存,确保通道顺序正确 + arr = np.frombuffer(b, dtype=np.uint8) + cv_img = cv2.imdecode(arr, cv2.IMREAD_COLOR) + if cv_img is None: + # fallback: 使用 PIL 直接解码 + img = Image.open(io.BytesIO(b)).convert('RGB') + img.save(out_path, quality=95) + else: + # 严格遵循 hdf52rgb_all.py:直接保存 OpenCV 解码结果(不做通道重排) + Image.fromarray(cv_img).save(out_path, quality=95) + except Exception: + # 退回到把 v 当作数组处理 + arr = np.asarray(v) + Image.fromarray(arr).convert('RGB').save(out_path, quality=95) + else: + arr = np.asarray(v) + # 如果元素是 bytes 字符串数组 + if arr.dtype.kind == 'S': + try: + b = arr.tobytes() + arr2 = np.frombuffer(b, dtype=np.uint8) + cv_img = cv2.imdecode(arr2, cv2.IMREAD_COLOR) + if cv_img is None: + Image.open(io.BytesIO(b)).convert('RGB').save(out_path, quality=95) + else: + # 严格遵循 hdf52rgb_all.py:直接保存 OpenCV 解码结果(不做通道重排) + Image.fromarray(cv_img).save(out_path, quality=95) + except Exception: + Image.fromarray(np.frombuffer(arr, dtype=np.uint8)).convert('RGB').save(out_path, quality=95) + else: + # 正常数组 HxWxC + if arr.ndim == 3: + Image.fromarray(arr.astype('uint8')).convert('RGB').save(out_path, quality=95) + else: + raise RuntimeError('无法识别的 rgb 帧格式(既不是编码 bytes 也不是 HxWxC 数组)') + + saved.append(out_path) + + return saved + + +def copy_first_frame_to_sam(saved_frames, h5_path): + """ + 将导出的首帧复制到仓库约定的 sam_mask 路径: + DemoGen/demo_generation/data/sam_mask//0/ + + 这样 `get_mask.py` 在默认行为下就能找到要处理的首帧。 + """ + base = os.path.splitext(os.path.basename(h5_path))[0] + dest_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'data', 'sam_mask', base, '0') + os.makedirs(dest_dir, exist_ok=True) + + if not saved_frames: + raise RuntimeError('没有可复制的帧,saved_frames 为空') + + shutil.copy2(saved_frames[0], os.path.join(dest_dir, os.path.basename(saved_frames[0]))) + return dest_dir + + +def run_get_mask_script(get_mask_py): + """ + 以子 shell 调用 `get_mask.py`。子 shell 会 `source ~/.bashrc`,以便可用 `doge` 等别名。 + + 返回值:脚本的返回码(0 表示成功) + """ + cmd = f"bash -lc 'source ~/.bashrc >/dev/null 2>&1; python3 {get_mask_py}'" + print('Running mask script:', cmd) + rc = subprocess.call(cmd, shell=True) + return rc + + +def write_looptimes_for_generated(gen_output_dir, out_loop_times_path): + """ + 遍历生成目录中的 `episode*.hdf5`,尝试读取 `loop_times` 并把它们写入一个单行的 `loop_times.txt` 文件(以空格分隔)。 + + 这是为了与上游使用 `loop_times.txt` 的流程兼容。 + """ + eps = sorted([p for p in os.listdir(gen_output_dir) if p.startswith('episode') and p.endswith('.hdf5')]) + loop_times = [] + + for ep in eps: + p = os.path.join(gen_output_dir, ep) + try: + with h5py.File(p, 'r') as f: + if 'loop_times' in f: + lt = f['loop_times'][:] + if np.isscalar(lt) or getattr(lt, 'shape', ()) == (): + loop_times.append(int(lt)) + else: + loop_times.append(int(lt[0])) + elif 'loop_times' in f.attrs: + loop_times.append(int(f.attrs['loop_times'])) + else: + loop_times.append(1) + except Exception: + # 任何读取失败都退回为 1,保证文件可写 + loop_times.append(1) + + with open(out_loop_times_path, 'w') as fh: + for lt in loop_times: + fh.write(f"{lt} ") + + return out_loop_times_path + + +def main(): + print('交互式 DemoGen 开始...') + + # 安全输入封装:捕获 Ctrl+C (KeyboardInterrupt) 并重新提示输入 + def safe_input(prompt=''): + while True: + try: + return input(prompt) + except KeyboardInterrupt: + # 首次 Ctrl+C:提示并等待 1 秒,在此期间若再次 Ctrl+C 则退出程序 + print('\n输入被中断(Ctrl+C)。若在 1 秒内再次按 Ctrl+C,则退出程序;或等待继续并重新输入...') + try: + time.sleep(1) + except KeyboardInterrupt: + print('\n检测到二次 Ctrl+C,退出程序') + raise + continue + except EOFError: + # 将 EOF (Ctrl+D) 视为空输入并返回空字符串 + print('\n检测到 EOF(Ctrl+D),视为空输入。') + return '' + + # 1) 询问 HDF5 路径 + h5_input = safe_input('请复制粘贴一条源 HDF5 文件的绝对路径(输入 skip 表示已完成此步并跳过;留空则退出):').strip() + if not h5_input: + print('已中止') + return + + frames = [] + frames_dir = None + if h5_input.lower() == 'skip': + # 跳过 HDF5 导出,询问用户是否已有导出帧目录 + frames_dir = safe_input('你选择跳过 HDF5 导出。如果你已有导出的帧,请输入帧目录绝对路径(输入 skip 则继续跳过帧相关步骤):').strip() + if frames_dir and frames_dir.lower() != 'skip': + if not os.path.exists(frames_dir): + print('指定的帧目录不存在:', frames_dir) + return + frames = sorted([os.path.join(frames_dir, f) for f in os.listdir(frames_dir) if f.lower().endswith(('.jpg', '.png', '.jpeg'))]) + if not frames: + print('在指定目录未找到图片文件,继续但没有可用帧') + else: + # frames_dir 为 skip 或为空,表示完全跳过帧相关的步骤 + frames = [] + # 询问用于后续写 loop_times 的 src_dir(默认取帧目录的父目录或当前目录) + if frames_dir: + default_src_dir = os.path.dirname(frames_dir) + else: + default_src_dir = os.getcwd() + src_dir = safe_input(f'请输入源数据根目录(用于写 loop_times,默认: {default_src_dir}):').strip() or default_src_dir + h5_path = None + else: + h5_path = h5_input + if not os.path.exists(h5_path): + print('未找到文件:', h5_path) + return + src_dir = os.path.dirname(h5_path) + + # 根据 h5 路径推断 task_name 与 idx + # 例如: /.../beat_block_hammer_loop/loop1-8-all/data/episode0.hdf5 + # task_name = basename(third ancestor) = beat_block_hammer_loop + # idx = episode number extracted from filename (episode0 -> 0) + def _infer_task_and_idx(path): + p0 = os.path.dirname(path) # parent (e.g., .../data) + p1 = os.path.dirname(p0) # e.g., .../loop1-8-all + p2 = os.path.dirname(p1) # e.g., .../beat_block_hammer_loop + task_name = os.path.basename(p2) or os.path.basename(p1) or 'unknown' + base = os.path.splitext(os.path.basename(path))[0] + import re + m = re.search(r'episode(\d+)', base) + if m: + idx = int(m.group(1)) + else: + # fallback: try to find any digits in the basename + m2 = re.search(r'(\d+)', base) + idx = int(m2.group(1)) if m2 else 0 + return task_name, idx + + task_name, idx = _infer_task_and_idx(h5_path) + # 可视化输出目录:DemoGen/data/sam_mask///vis_all + vis_out_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'data', 'sam_mask', task_name, str(idx), 'vis_all') + + # 2) 导出帧到 HDF5 同目录(避免额外路径管理) + # 2) 导出帧或使用已有帧 + print('正在将帧保存到可视化目录 (vis_all) 或使用已有帧...') + if h5_path: + try: + frames = save_rgb_frames_from_h5(h5_path, vis_out_dir) + print('逐帧rgb可视化已保存到:', vis_out_dir) + except Exception as e: + print('提取帧失败:', e) + return + else: + # h5 跳过的情况下,若 frames_dir 已设置则 frames 已被填充 + if not frames: + print('未使用 HDF5 也未提供帧目录,跳过与帧相关的步骤。') + + if frames: + print(f'已保存/找到帧数量: {len(frames)},首帧: {frames[0]}') + + # 3) 把首帧复制到 sam_mask 的约定目录,供 get_mask.py 使用 + # 3) 把首帧复制到 sam_mask 的约定目录,供 get_mask.py 使用 + sam_dest = None + copy_prompt = safe_input('准备复制首帧到 sam_mask 文件夹以便 get_mask.py 使用(按 Enter 执行;输入 skip 表示已完成并跳过此步):').strip() + if copy_prompt.lower() == 'skip': + print('已跳过复制首帧步骤。') + else: + if frames: + try: + sam_dest = copy_first_frame_to_sam(frames, h5_path if h5_path else frames[0]) + print('首帧已复制到', sam_dest) + except Exception as e: + print('复制首帧失败:', e) + # 继续,但 sam_dest 可能为 None + else: + # 没有可用帧 + provided = safe_input('当前没有可用帧,若你已手动复制首帧请输入该文件所在目录(或输入 skip 继续跳过):').strip() + if provided and provided.lower() != 'skip': + if os.path.exists(provided): + sam_dest = provided + else: + print('指定路径不存在:', provided) + sam_dest = None + else: + print('跳过复制首帧。') + + # 4) SAM mask 步骤:纯交互式,让用户在指定目录准备好掩码 + # 说明:脚本会把首帧复制到 sam_dest(由 copy_first_frame_to_sam 返回)。 + # 用户需在该目录中手动放置掩码文件(PNG/JPG),准备好后按回车继续。 + print('\n下一步:准备 SAM 掩码(mask)') + print('首帧已复制到:', sam_dest) + default_mask_dir = sam_dest + mask_input = safe_input(f'请输入准备掩码的目录路径(默认: {default_mask_dir};或输入 skip 表示掩码已准备好/跳过):').strip() + if mask_input.lower() == 'skip': + mask_dir = None + print('跳过掩码准备步骤。') + else: + mask_dir = mask_input or default_mask_dir + if mask_dir is None: + print('未指定掩码目录,继续但不会检测掩码文件。') + else: + if not os.path.exists(mask_dir): + print('指定的掩码目录不存在,已创建:', mask_dir) + os.makedirs(mask_dir, exist_ok=True) + print('请在该目录放置掩码文件(例如 PNG/JPG),准备好后按回车继续。目录:', mask_dir) + safe_input() + + # 检查掩码目录中是否存在掩码文件(png/jpg)以便提示用户 + mask_files = [] + try: + for fname in os.listdir(mask_dir): + if fname.lower().endswith(('.png', '.jpg', '.jpeg')): + mask_files.append(os.path.join(mask_dir, fname)) + except Exception: + mask_files = [] + + if mask_files: + print(f'检测到 {len(mask_files)} 个掩码文件(示例: {mask_files[0]})。') + else: + print('未检测到掩码文件。请确认你已将掩码放在目录中。') + + # 5) 暂停:让用户创建/调整 demogen 的 config 或其它手动必要文件 + cfg_input = safe_input('现在请为该源创建 demogen 配置并放置好,准备好后按回车继续(或输入 skip 表示已完成):').strip() + if cfg_input.lower() == 'skip': + print('跳过 demogen 配置准备步骤。') + + # 6) 运行 gen_demo:使用仓库自带的 `gen_demo.sh`,并引导用户输入参数以减少拼写错误 + print('\n现在将使用仓库中的 `gen_demo.sh` 脚本来运行生成。') + print('如果你更倾向于直接提供完整命令,也可以直接输入(留空则使用交互式参数)') + direct_cmd = safe_input('若要直接提供完整命令请粘贴到此(输入 skip 跳过 gen_demo;留空使用交互式参数):').strip() + demo_dir = os.path.dirname(__file__) + if direct_cmd.lower() == 'skip': + print('跳过 gen_demo 执行。') + elif direct_cmd: + full = f"bash -lc 'cd {demo_dir} && source ~/.bashrc >/dev/null 2>&1; {direct_cmd}'" + print('正在运行(直接命令):', full) + subprocess.call(full, shell=True) + else: + # 基于文件结构提供合理默认值 + default_task = task_name + default_range = 'test' + default_mode = 'random' + default_n = '40' + default_render = 'True' + + task = safe_input(f'任务名 `task`(对应仓库中 config 名称,默认: {default_task}):').strip() or default_task + gen_range = safe_input(f'生成范围 `gen_range`(例如: test,默认: {default_range}):').strip() or default_range + gen_mode = safe_input(f'生成模式 `gen_mode`(例如: random 或 grid,默认: {default_mode}):').strip() or default_mode + n_gen_per_source = safe_input(f'每源生成数量 `n_gen_per_source`(整数,默认: {default_n}):').strip() or default_n + render_video = safe_input(f'是否渲染视频 `render_video`(True/False,默认: {default_render}):').strip() or default_render + + # 最终命令使用仓库里的 `gen_demo.sh` wrapper + sh_cmd = f"sh gen_demo.sh {task} {gen_range} {gen_mode} {n_gen_per_source} {render_video}" + + # 优先使用 `conda run -n demogen` 来在指定 conda 环境中执行,避免找不到包 + # 如果系统 PATH 中找不到 conda,则回退到 eval/activate 的方式(会尝试 source ~/.bashrc) + if shutil.which('conda'): + print('检测到 `conda` 可用,使用 `conda run -n demogen` 执行命令。') + # 使用列表形式避免 shell 转义问题 + rc = subprocess.call(['conda', 'run', '-n', 'demogen', '--no-capture-output', 'bash', '-lc', sh_cmd]) + else: + full = f"bash -lc 'cd {demo_dir} && eval \"$(conda shell.bash hook)\" >/dev/null 2>&1 || true; source ~/.bashrc >/dev/null 2>&1; conda activate demogen >/dev/null 2>&1 && {sh_cmd}'" + print('未在 PATH 中找到 `conda`,尝试通过 source ~/.bashrc + conda activate 来激活环境。将要执行:', full) + rc = subprocess.call(full, shell=True) + + if rc != 0: + print(f'警告:gen_demo 执行返回非零退出码:{rc}。请在终端手动运行下面的命令以调试:') + if shutil.which('conda'): + print(f"conda run -n demogen bash -lc '{sh_cmd}'") + else: + print(f"cd {demo_dir} && eval \"$(conda shell.bash hook)\"; conda activate demogen; {sh_cmd}") + if rc != 0: + print(f'警告:gen_demo 脚本返回非零退出码:{rc}。如果是在未激活 conda 环境下运行,考虑手动运行:\n') + print(f' cd {demo_dir} && conda activate demogen && sh gen_demo.sh {task} {gen_range} {gen_mode} {n_gen_per_source} {render_video}') + + # 7) 后处理:尝试根据生成的 episode 写 loop_times.txt + gen_root = os.path.join(src_dir, 'datasets', 'generated') + gen_dirs = [] + if os.path.exists(gen_root): + gen_dirs = sorted([os.path.join(gen_root, d) for d in os.listdir(gen_root)], key=os.path.getmtime) + + if gen_dirs: + last = gen_dirs[-1] + if last.endswith('_episodes'): + ep_dir = last + else: + cand = [os.path.join(last, f) for f in os.listdir(last) if f.endswith('_episodes')] + ep_dir = cand[0] if cand else last + else: + ep_dir = os.path.join(src_dir, 'datasets', 'generated') + + # 7) 后处理:写 loop_times,可由用户跳过 + do_loops = safe_input(f'是否尝试写入 loop_times.txt(会在 {src_dir} 下写入;输入 skip 跳过,按回车执行):').strip() + if do_loops.lower() == 'skip': + print('跳过写入 loop_times.txt。') + else: + print('尝试根据以下生成的 episode 写入 loop_times.txt:', ep_dir) + loop_times_path = os.path.join(src_dir, 'loop_times.txt') + try: + write_looptimes_for_generated(ep_dir, loop_times_path) + print('已写入 loop_times 到', loop_times_path) + except Exception as e: + print('写入 loop_times 失败:', e) + + # 8) 可选:调用描述/指令生成脚本 + do_desc = safe_input('是否运行指令生成(会调用 description/gen_episode_instructions.sh)(输入 skip 跳过;输入 y 运行)?[y/N]:').strip().lower() + if do_desc == 'skip' or do_desc == 'n' or do_desc == '': + print('跳过指令生成步骤。') + elif do_desc == 'y': + task_name = safe_input('输入 task_name(用于描述脚本):').strip() + task_config = safe_input('输入 task_config(用于描述脚本):').strip() + language_num = safe_input('输入 language_num(例如:1):').strip() or '1' + # 说明:描述脚本位置相对于仓库结构,若你的实际路径不同,请手动调整 + desc_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'RoboTwin', 'description')) + cmd = f"bash -lc 'cd {desc_dir} && bash gen_episode_instructions.sh {task_name} {task_config} {language_num}'" + print('正在运行:', cmd) + subprocess.call(cmd, shell=True) + + print('管道执行完成。') + + +if __name__ == '__main__': + main() diff --git a/demo_generation/demo_generation/config/beat_block_hammer_loop1.yaml b/demo_generation/demo_generation/config/beat_block_hammer_loop1.yaml new file mode 100644 index 0000000..0671076 --- /dev/null +++ b/demo_generation/demo_generation/config/beat_block_hammer_loop1.yaml @@ -0,0 +1,48 @@ +_target_: demo_generation.demogen.DemoGen + +data_root: data + +source_name: beat_block_hammer_loop +task_n_object: 2 # 根据任务实际设置,这里是一个锤子和一个积木块 + +use_linear_interpolation: false +interpolate_step_size: 1 + +use_manual_parsing_frames: true +parsing_frames: + motion-1: 0 + skill-1: 8 + motion-2: 33 + skill-2: 37 + +mask_names: + object: hammer + target: block + +trans_range: + src: + object: [[0, 0, 0], [0, 0, 0]] + target: [[0, 0, 0], [0, 0, 0]] + test: + object: [[-0.10, -0.10, 0], [0.10, 0.10, 0]] + target: [[-0.10, -0.10, 0], [0.10, 0.10, 0]] + +generation: + range_name: test + n_gen_per_source: 16 + render_video: True + mode: grid + +# range_name 除了设置为 src,还可以设置为你自定义的标签,比如: + +# train:用于训练集的空间分布 +# test:用于测试集的空间分布 +# generalize、extrapolate:用于泛化或外推分布 +# custom1、custom2:任意自定义标签 +# 只要你在 trans_range 下定义了对应标签(如 trans_range.train),就可以在 range_name 里切换,实现不同空间分布的数据合成。例如: +# range_name: test +# trans_range: +# src: ... +# test: +# object: [[0.2, 0.2, 0], [0.3, 0.3, 0]] +# target: [[0.2, 0.2, 0], [0.3, 0.3, 0]] \ No newline at end of file diff --git a/demo_generation/demo_generation/config/beat_block_hammer_loop2.yaml b/demo_generation/demo_generation/config/beat_block_hammer_loop2.yaml new file mode 100644 index 0000000..b7cbb1d --- /dev/null +++ b/demo_generation/demo_generation/config/beat_block_hammer_loop2.yaml @@ -0,0 +1,49 @@ +_target_: demo_generation.demogen.DemoGen + +data_root: data + +source_name: beat_block_hammer_loop2 + +task_n_object: 2 # 根据任务实际设置,这里是一个锤子和一个积木块 + +use_linear_interpolation: false +interpolate_step_size: 1 + +use_manual_parsing_frames: true +parsing_frames: + motion-1: 0 + skill-1: 8 + motion-2: 29 + skill-2: 37 + +mask_names: + object: hammer + target: block + +trans_range: + src: + object: [[0, 0, 0], [0, 0, 0]] + target: [[0, 0, 0], [0, 0, 0]] + test: + object: [[-0.10, -0.10, 0], [0.10, 0.10, 0]] + target: [[-0.10, -0.10, 0], [0.10, 0.10, 0]] + +generation: + range_name: test + n_gen_per_source: 16 + render_video: True + mode: grid + +# range_name 除了设置为 src,还可以设置为你自定义的标签,比如: + +# train:用于训练集的空间分布 +# test:用于测试集的空间分布 +# generalize、extrapolate:用于泛化或外推分布 +# custom1、custom2:任意自定义标签 +# 只要你在 trans_range 下定义了对应标签(如 trans_range.train),就可以在 range_name 里切换,实现不同空间分布的数据合成。例如: +# range_name: test +# trans_range: +# src: ... +# test: +# object: [[0.2, 0.2, 0], [0.3, 0.3, 0]] +# target: [[0.2, 0.2, 0], [0.3, 0.3, 0]] \ No newline at end of file diff --git a/demo_generation/demo_generation/config/beat_block_hammer_loop3.yaml b/demo_generation/demo_generation/config/beat_block_hammer_loop3.yaml new file mode 100644 index 0000000..2a37f2f --- /dev/null +++ b/demo_generation/demo_generation/config/beat_block_hammer_loop3.yaml @@ -0,0 +1,49 @@ +_target_: demo_generation.demogen.DemoGen + +data_root: data + +source_name: beat_block_hammer_loop3 + +task_n_object: 2 # 根据任务实际设置,这里是一个锤子和一个积木块 + +use_linear_interpolation: false +interpolate_step_size: 1 + +use_manual_parsing_frames: true +parsing_frames: + motion-1: 0 + skill-1: 8 + motion-2: 25 + skill-2: 37 + +mask_names: + object: hammer + target: block + +trans_range: + src: + object: [[0, 0, 0], [0, 0, 0]] + target: [[0, 0, 0], [0, 0, 0]] + test: + object: [[-0.10, -0.10, 0], [0.10, 0.10, 0]] + target: [[-0.10, -0.10, 0], [0.10, 0.10, 0]] + +generation: + range_name: test + n_gen_per_source: 16 + render_video: True + mode: grid + +# range_name 除了设置为 src,还可以设置为你自定义的标签,比如: + +# train:用于训练集的空间分布 +# test:用于测试集的空间分布 +# generalize、extrapolate:用于泛化或外推分布 +# custom1、custom2:任意自定义标签 +# 只要你在 trans_range 下定义了对应标签(如 trans_range.train),就可以在 range_name 里切换,实现不同空间分布的数据合成。例如: +# range_name: test +# trans_range: +# src: ... +# test: +# object: [[0.2, 0.2, 0], [0.3, 0.3, 0]] +# target: [[0.2, 0.2, 0], [0.3, 0.3, 0]] \ No newline at end of file diff --git a/demo_generation/demo_generation/config/beat_block_hammer_loop4.yaml b/demo_generation/demo_generation/config/beat_block_hammer_loop4.yaml new file mode 100644 index 0000000..5916aa1 --- /dev/null +++ b/demo_generation/demo_generation/config/beat_block_hammer_loop4.yaml @@ -0,0 +1,49 @@ +_target_: demo_generation.demogen.DemoGen + +data_root: data + +source_name: beat_block_hammer_loop4 + +task_n_object: 2 # 根据任务实际设置,这里是一个锤子和一个积木块 + +use_linear_interpolation: false +interpolate_step_size: 1 + +use_manual_parsing_frames: true +parsing_frames: + motion-1: 0 + skill-1: 8 + motion-2: 30 + skill-2: 38 + +mask_names: + object: hammer + target: block + +trans_range: + src: + object: [[0, 0, 0], [0, 0, 0]] + target: [[0, 0, 0], [0, 0, 0]] + test: + object: [[-0.10, -0.10, 0], [0.10, 0.10, 0]] + target: [[-0.10, -0.10, 0], [0.10, 0.10, 0]] + +generation: + range_name: test + n_gen_per_source: 16 + render_video: True + mode: grid + +# range_name 除了设置为 src,还可以设置为你自定义的标签,比如: + +# train:用于训练集的空间分布 +# test:用于测试集的空间分布 +# generalize、extrapolate:用于泛化或外推分布 +# custom1、custom2:任意自定义标签 +# 只要你在 trans_range 下定义了对应标签(如 trans_range.train),就可以在 range_name 里切换,实现不同空间分布的数据合成。例如: +# range_name: test +# trans_range: +# src: ... +# test: +# object: [[0.2, 0.2, 0], [0.3, 0.3, 0]] +# target: [[0.2, 0.2, 0], [0.3, 0.3, 0]] \ No newline at end of file diff --git a/demo_generation/demo_generation/config/beat_block_hammer_loop5.yaml b/demo_generation/demo_generation/config/beat_block_hammer_loop5.yaml new file mode 100644 index 0000000..06435cf --- /dev/null +++ b/demo_generation/demo_generation/config/beat_block_hammer_loop5.yaml @@ -0,0 +1,49 @@ +_target_: demo_generation.demogen.DemoGen + +data_root: data + +source_name: beat_block_hammer_loop5 + +task_n_object: 2 # 根据任务实际设置,这里是一个锤子和一个积木块 + +use_linear_interpolation: false +interpolate_step_size: 1 + +use_manual_parsing_frames: true +parsing_frames: + motion-1: 0 + skill-1: 9 + motion-2: 30 + skill-2: 40 + +mask_names: + object: hammer + target: block + +trans_range: + src: + object: [[0, 0, 0], [0, 0, 0]] + target: [[0, 0, 0], [0, 0, 0]] + test: + object: [[-0.10, -0.10, 0], [0.10, 0.10, 0]] + target: [[-0.10, -0.10, 0], [0.10, 0.10, 0]] + +generation: + range_name: test + n_gen_per_source: 16 + render_video: True + mode: grid + +# range_name 除了设置为 src,还可以设置为你自定义的标签,比如: + +# train:用于训练集的空间分布 +# test:用于测试集的空间分布 +# generalize、extrapolate:用于泛化或外推分布 +# custom1、custom2:任意自定义标签 +# 只要你在 trans_range 下定义了对应标签(如 trans_range.train),就可以在 range_name 里切换,实现不同空间分布的数据合成。例如: +# range_name: test +# trans_range: +# src: ... +# test: +# object: [[0.2, 0.2, 0], [0.3, 0.3, 0]] +# target: [[0.2, 0.2, 0], [0.3, 0.3, 0]] \ No newline at end of file diff --git a/demo_generation/demo_generation/demogen.py b/demo_generation/demo_generation/demogen.py index 5f1097a..194d95d 100644 --- a/demo_generation/demo_generation/demogen.py +++ b/demo_generation/demo_generation/demogen.py @@ -1,5 +1,8 @@ # from re import T # from turtle import st +# 强制使用 Agg 后端,解决 FigureCanvasTkAgg 无 tstring_rgb 报错 +import matplotlib +matplotlib.use('Agg') from diffusion_policies.common.replay_buffer import ReplayBuffer # from regex import I # import pcd_visualizer @@ -40,15 +43,113 @@ def __init__(self, cfg): cprint("[NOTE] Rendering video is enabled. It takes ~10s to render a single generated trajectory.", "yellow") self.gen_mode = cfg.generation.mode - source_zarr = os.path.join(self.data_root, "datasets", "source", self.source_name + ".zarr") + source_dir = os.path.join(self.data_root, "datasets", "source") + source_zarr = os.path.join(source_dir, self.source_name + ".zarr") + # If exact path does not exist, try to fuzzy-match available zarr directories + if not os.path.exists(source_zarr): + try: + candidates = [d for d in os.listdir(source_dir) if self.source_name in d] + except Exception: + candidates = [] + if len(candidates) == 1: + matched = candidates[0] + source_zarr = os.path.join(source_dir, matched) + cprint(f"[INFO] source zarr not found at expected path. Using fuzzy match: {matched}", 'yellow') + elif len(candidates) > 1: + cprint(f"[ERROR] Multiple candidate zarrs found for source_name '{self.source_name}': {candidates}", 'red') + raise FileNotFoundError(f"Multiple candidate zarrs found for source_name '{self.source_name}': {candidates}") + else: + cprint(f"[ERROR] Source zarr not found: {source_zarr}", 'red') + # 如果是交互式 shell,让用户输入一个 HDF5 或 zarr 的绝对路径 + try: + import sys + if sys.stdin.isatty(): + user_path = input('未找到 source zarr。请输入 HDF5 (.h5/.hdf5) 或 zarr 目录的绝对路径,或直接回车放弃:').strip() + if not user_path: + raise FileNotFoundError(f"Source zarr not found: {source_zarr}") + if not os.path.exists(user_path): + cprint(f"[ERROR] 指定路径不存在: {user_path}", 'red') + raise FileNotFoundError(f"Specified path does not exist: {user_path}") + source_zarr = user_path + else: + raise FileNotFoundError(f"Source zarr not found: {source_zarr}") + except KeyboardInterrupt: + raise FileNotFoundError(f"Source zarr not found: {source_zarr}") + self._load_from_zarr(source_zarr) def _load_from_zarr(self, zarr_path): cprint(f"Loading data from {zarr_path}", "blue") - self.replay_buffer = ReplayBuffer.copy_from_path( - zarr_path, keys=['state', 'action', 'point_cloud']) + # Support both zarr and hdf5 files. If path ends with .hdf5 or .h5, + # read HDF5 and construct an in-memory ReplayBuffer-compatible dict. + if str(zarr_path).endswith('.hdf5') or str(zarr_path).endswith('.h5'): + try: + import h5py + except Exception: + raise RuntimeError('h5py is required to load .hdf5 files. Please install h5py in your environment.') + with h5py.File(os.path.expanduser(zarr_path), 'r') as f: + # Try multiple common names used across datasets/collectors + def _read_first(keys): + for k in keys: + if k in f: + try: + return f[k][:] + except Exception: + return None + return None + + # state can be 'agent_pos', 'state', or 'endpose' + state = _read_first(['agent_pos', 'state', 'endpose']) + if state is None: + raise KeyError('HDF5 file missing "agent_pos" or "state" or "endpose" dataset') + + # action can be 'action' or 'joint_action/vector' + action = _read_first(['action', 'joint_action/vector', 'joint_action/vector']) + if action is None: + # try to reconstruct an action if left/right arms exist + if 'joint_action' in f and isinstance(f['joint_action'], h5py.Group): + # try to concatenate available sub-datasets + parts = [] + for name in ['left_arm', 'left_gripper', 'right_arm', 'right_gripper', 'vector']: + if f['joint_action'].get(name) is not None: + parts.append(f['joint_action'][name][:]) + if parts: + try: + action = np.concatenate(parts, axis=-1) + except Exception: + action = None + if action is None: + raise KeyError('HDF5 file missing "action" or "joint_action/vector" dataset') + + # point cloud dataset names + point_cloud = _read_first(['point_cloud', 'pointcloud', 'pointCloud']) + if point_cloud is None: + raise KeyError('HDF5 file missing "point_cloud" or "pointcloud" dataset') + + if 'episode_ends' in f: + episode_ends = f['episode_ends'][:] + else: + # fallback: single episode covering entire length + episode_ends = np.array([state.shape[0]], dtype=np.int64) + + root = { + 'meta': { + 'episode_ends': episode_ends + }, + 'data': { + 'state': state, + 'action': action, + 'point_cloud': point_cloud + } + } + self.replay_buffer = ReplayBuffer(root=root) + else: + # assume zarr + self.replay_buffer = ReplayBuffer.copy_from_path( + zarr_path, keys=['state', 'action', 'point_cloud']) + self.n_source_episodes = self.replay_buffer.n_episodes - self.demo_name = zarr_path.split("/")[-1].split(".")[0] + self.demo_name = os.path.basename(zarr_path).split(".")[0] def generate_trans_vectors(self, trans_range, n_demos, mode="random"): """ @@ -103,6 +204,18 @@ def get_objects_pcd_from_sam_mask(self, pcd, demo_idx, object_or_target="object" mask = imageio.imread(os.path.join(self.data_root, f"sam_mask/{self.source_name}/{demo_idx}/{self.mask_names[object_or_target]}.jpg")) mask = mask > 128 filtered_pcd = restore_and_filter_pcd(pcd, mask) + # If filter removed all points, dump debug info for inspection and warn + if filtered_pcd.size == 0: + debug_dir = os.path.join(self.data_root, 'debug_masks', self.source_name, str(demo_idx)) + os.makedirs(debug_dir, exist_ok=True) + try: + # save original pcd and mask for inspection + np.save(os.path.join(debug_dir, f"{object_or_target}_pcd_original.npy"), pcd) + # save mask image (as uint8) if available + imageio.imwrite(os.path.join(debug_dir, f"{object_or_target}_mask.png"), (mask.astype(np.uint8) * 255)) + except Exception: + pass + cprint(f"[WARN] Filtered {object_or_target} point cloud is empty for demo {demo_idx}. Saved debug files to {debug_dir}", 'yellow') return filtered_pcd def generate_demo(self): @@ -113,7 +226,7 @@ def generate_demo(self): else: raise NotImplementedError - def parse_frames_two_stage(self, pcds, demo_idx, ee_poses, distance_mode="ee2pcd", threshold_1=0.15, threshold_2=0.235, threshold_3=0.275,): + def parse_frames_two_stage(self, pcds, demo_idx, ee_poses, distance_mode="ee2pcd", threshold_1=0.8375, threshold_2=0.3, threshold_3=0.8376): """ There are two ways to parse the frames of whole trajectory into object-centric segments: (1) Either by comparing the distance between the end-effector and the object point cloud, (2) Or by manually specifying the frames when `self.use_manual_parsing_frames = True`. @@ -123,10 +236,15 @@ def parse_frames_two_stage(self, pcds, demo_idx, ee_poses, distance_mode="ee2pcd frame_idx on the left top of the video. """ assert distance_mode in ["ee2pcd", "pcd2pcd"] - stage = 1 + skill_1_frame = 0 + motion_2_frame = 0 + skill_2_frame = 0 + stage = 1 # 1: to skill-1, 2: to motion-2, 3: to skill-2 for i in range(pcds.shape[0]): object_pcd = self.get_objects_pcd_from_sam_mask(pcds[i], demo_idx, "object") target_pcd = self.get_objects_pcd_from_sam_mask(pcds[i], demo_idx, "target") + # [DEBUG] 输出已去除 + # ...existing code... if stage == 1: if distance_mode == "ee2pcd": if self.average_distance_to_point_cloud(ee_poses[i], object_pcd) <= threshold_1: @@ -171,7 +289,6 @@ def parse_frames_two_stage(self, pcds, demo_idx, ee_poses, distance_mode="ee2pcd if self.chamfer_distance(ee_obj_pcd, target_pcd) <= threshold_3: skill_2_frame = i break - print(f"Stage 1: {skill_1_frame}, Pre-2: {motion_2_frame}, Stage 2: {skill_2_frame}") return skill_1_frame, motion_2_frame, skill_2_frame @@ -216,10 +333,15 @@ def check_fourth_power(arr): else: ee_poses = source_demo["state"][:, :3] skill_1_frame, motion_2_frame, skill_2_frame = self.parse_frames_two_stage(pcds, i, ee_poses) - # print(f"Skill-1: {skill_1_frame}, Motion-2: {motion_2_frame}, Skill-2: {skill_2_frame}") + print(f"Skill-1: {skill_1_frame}, Motion-2: {motion_2_frame}, Skill-2: {skill_2_frame}") pcd_obj = self.get_objects_pcd_from_sam_mask(pcds[0], i, "object") pcd_tar = self.get_objects_pcd_from_sam_mask(pcds[0], i, "target") + # If either object or target point cloud is empty after masking, skip this source demo + if pcd_obj is None or pcd_obj.shape[0] == 0 or pcd_tar is None or pcd_tar.shape[0] == 0: + cprint(f"[WARN] Skipping source demo {i} because object/target point cloud is empty after SAM mask.", 'yellow') + continue + obj_bbox = self.pcd_bbox(pcd_obj) tar_bbox = self.pcd_bbox(pcd_tar) @@ -558,52 +680,91 @@ def _examine_actions(self, demo_trajectory): print(f"inensity: {vfunc(intensity)}") def save_episodes(self, generated_episodes, save_dir): - os.makedirs(save_dir, exist_ok=True) - cprint(f"Saving data to {save_dir}", "green") - # self.replay_buffer.save_to_store(save_dir) - - zarr_root = zarr.group(save_dir) - zarr_data = zarr_root.create_group('data') - zarr_meta = zarr_root.create_group('meta') - state_arrays = np.concatenate([ep["state"] for ep in generated_episodes], axis=0) - point_cloud_arrays = np.concatenate([ep["point_cloud"] for ep in generated_episodes], axis=0) - action_arrays = np.concatenate([ep["action"] for ep in generated_episodes], axis=0) - episode_ends = [] - count = 0 - for ep in generated_episodes: - count += len(ep["state"]) - episode_ends.append(count) - episode_ends_arrays = np.array(episode_ends) - print(episode_ends_arrays) - - compressor = zarr.Blosc(cname='zstd', clevel=3, shuffle=1) - state_chunk_size = (100, state_arrays.shape[1]) - point_cloud_chunk_size = (100, point_cloud_arrays.shape[1], point_cloud_arrays.shape[2]) - action_chunk_size = (100, action_arrays.shape[1]) - zarr_data.create_dataset('agent_pos', data=state_arrays, chunks=state_chunk_size, dtype='float32', overwrite=True, compressor=compressor) - zarr_data.create_dataset('point_cloud', data=point_cloud_arrays, chunks=point_cloud_chunk_size, dtype='float32', overwrite=True, compressor=compressor) - zarr_data.create_dataset('action', data=action_arrays, chunks=action_chunk_size, dtype='float32', overwrite=True, compressor=compressor) - zarr_meta.create_dataset('episode_ends', data=episode_ends_arrays, dtype='int64', overwrite=True, compressor=compressor) - - cprint(f'-'*50, 'cyan') - # print shape - cprint(f'point_cloud shape: {point_cloud_arrays.shape}, range: [{np.min(point_cloud_arrays)}, {np.max(point_cloud_arrays)}]', 'green') - cprint(f'state shape: {state_arrays.shape}, range: [{np.min(state_arrays)}, {np.max(state_arrays)}]', 'green') - cprint(f'action shape: {action_arrays.shape}, range: [{np.min(action_arrays)}, {np.max(action_arrays)}]', 'green') - cprint(f'Saved zarr file to {save_dir}', 'green') - - # save to hdf5 + # Save each generated episode using HDF5 layout compatible with source data import h5py - save_dir = save_dir.replace('.zarr', '.hdf5') - with h5py.File(save_dir, 'w') as f: - f.create_dataset('agent_pos', data=state_arrays, compression='gzip') - f.create_dataset('point_cloud', data=point_cloud_arrays, compression='gzip') - f.create_dataset('action', data=action_arrays, compression='gzip') - f.create_dataset('episode_ends', data=episode_ends_arrays, compression='gzip') - cprint(f'Saved hdf5 file to {save_dir}', 'green') + base_dir = save_dir.replace('.zarr', '_episodes') + os.makedirs(base_dir, exist_ok=True) + cprint(f"Saving each episode to {base_dir}", "green") + # determine starting index by scanning existing files (so numbering is continuous) + import glob + existing = glob.glob(os.path.join(base_dir, 'episode*.hdf5')) + start_idx = 0 + if existing: + # parse existing indices like 'episode4.hdf5' or 'episode_4.hdf5' and continue after the max + try: + import re + nums = [] + for p in existing: + m = re.search(r'episode(?:_)?(\d+)\.hdf5$', os.path.basename(p)) + if m: + nums.append(int(m.group(1))) + if nums: + start_idx = max(nums) + 1 + else: + start_idx = len(existing) + except Exception: + start_idx = len(existing) + + for rel_idx, ep in enumerate(generated_episodes): + idx = start_idx + rel_idx + ep_agent_pos = np.array(ep["state"]) # shape: (T, state_dim) + ep_point_cloud = np.array(ep["point_cloud"]) # shape: (T, N, 6) + ep_action = np.array(ep["action"]) # shape: (T, action_dim) + T = ep_agent_pos.shape[0] + ep_episode_ends = np.array([T]) + ep_path = os.path.join(base_dir, f'episode{idx}.hdf5') + + # Create HDF5 with keys similar to source collector + with h5py.File(ep_path, 'w') as f: + # endpose / state + f.create_dataset('endpose', data=ep_agent_pos, compression='gzip') + + # joint_action group: prefer storing 'vector' to match source + ja_grp = f.create_group('joint_action') + try: + ja_grp.create_dataset('vector', data=ep_action, compression='gzip') + except Exception: + # fallback: store as plain dataset under joint_action + f.create_dataset('joint_action', data=ep_action, compression='gzip') + + # loop_counter and loop_times + loop_counter = np.arange(T, dtype=np.int64) + f.create_dataset('loop_counter', data=loop_counter, compression='gzip') + f.create_dataset('loop_times', data=np.array(T, dtype=np.int32)) + + # object_pos: placeholder (shape T x 7) + obj_grp = f.create_group('object_pos') + obj_grp.create_dataset('obj0', data=np.zeros((T, 7), dtype=np.float32), compression='gzip') + + # observation group placeholders for head/left/right cameras + obs_grp = f.create_group('observation') + for cam in ['head_camera', 'left_camera', 'right_camera']: + cg = obs_grp.create_group(cam) + # cam2world_gl: (T,4,4) + cg.create_dataset('cam2world_gl', data=np.zeros((T, 4, 4), dtype=np.float32), compression='gzip') + # depth: placeholder (T, H, W) use (240,320) as in source if available + try: + cg.create_dataset('depth', data=np.zeros((T, 240, 320), dtype=np.float64), compression='gzip') + except Exception: + # in case too large, create a tiny placeholder + cg.create_dataset('depth', data=np.zeros((T, 4, 4), dtype=np.float64), compression='gzip') + cg.create_dataset('extrinsic_cv', data=np.zeros((T, 3, 4), dtype=np.float32), compression='gzip') + cg.create_dataset('intrinsic_cv', data=np.zeros((T, 3, 3), dtype=np.float32), compression='gzip') + # rgb: store empty bytes per-frame as placeholder + dt = h5py.string_dtype(encoding='utf-8') + rgb_ds = cg.create_dataset('rgb', shape=(T,), dtype=dt) + rgb_ds[:] = ['' for _ in range(T)] + + # pointcloud: name matches source ('pointcloud') and shape (T, N, 6) + f.create_dataset('pointcloud', data=ep_point_cloud.astype(np.float32), compression='gzip') + + # episode_ends + f.create_dataset('episode_ends', data=ep_episode_ends, compression='gzip') + + cprint(f'Saved: {ep_path}', 'cyan') @staticmethod - def point_cloud_to_video(point_clouds, output_file, fps=15, elev=30, azim=45): + def point_cloud_to_video(point_clouds, output_file, fps=15, *args, **kwargs): """ Converts a sequence of point cloud frames into a video. @@ -611,8 +772,6 @@ def point_cloud_to_video(point_clouds, output_file, fps=15, elev=30, azim=45): point_clouds (list): A list of (N, 6) numpy arrays representing the point clouds. output_file (str): The path to the output video file. fps (int, optional): The frames per second of the output video. Defaults to 15. - elev (float, optional): The elevation angle (in degrees) for the 3D view. Defaults to 30. - azim (float, optional): The azimuth angle (in degrees) for the 3D view. Defaults to 45. """ fig = plt.figure(figsize=(8, 6), dpi=300) ax = fig.add_subplot(111, projection='3d') @@ -627,38 +786,30 @@ def point_cloud_to_video(point_clouds, output_file, fps=15, elev=30, azim=45): for frame, points in enumerate(point_clouds): ax.clear() - color = points[:, 3:] / 255 + color = points[:, 3:] ax.scatter(points[:, 0], points[:, 1], points[:, 2], c=color, marker='.') ax.set_box_aspect([1.6, 2.2, 1]) - # ax.set_box_aspect([1.6, 1.6, 1]) - # ax.set_aspect('equal') - ax.set_xlim(0.1, 0.8) - ax.set_ylim(-0.4, 0.6) - # ax.set_ylim(-0.3, 0.4) - ax.set_zlim(0.1, 0.4) - - x_ticks = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8] - y_ticks = [-0.4, -0.3, -0.2, -0.1, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6] - # y_ticks = [-0.3, -0.2, -0.1, 0, 0.1, 0.2, 0.3, 0.4] - z_ticks = [0.1, 0.2, 0.3, 0.4] + # 坐标轴范围与zarr可视化一致,直接用所有点的实际范围 + ax.set_xlim(np.min(all_points[:, 0]), np.max(all_points[:, 0])) + ax.set_ylim(np.min(all_points[:, 1]), np.max(all_points[:, 1])) + ax.set_zlim(np.min(all_points[:, 2]), np.max(all_points[:, 2])) + ax.tick_params(axis='both', which='major', labelsize=8) - ax.xaxis.set_major_locator(FixedLocator(x_ticks)) - ax.yaxis.set_major_locator(FixedLocator(y_ticks)) - ax.zaxis.set_major_locator(FixedLocator(z_ticks)) - - formatter = FormatStrFormatter('%.1f') + formatter = FormatStrFormatter('%.2f') ax.xaxis.set_major_formatter(formatter) ax.yaxis.set_major_formatter(formatter) ax.zaxis.set_major_formatter(formatter) - ax.view_init(elev=elev, azim=azim) + # 使用matplotlib默认视角,不设置elev和azim + # ax.view_init() # 可选:如需强制默认视角可加此行 ax.text2D(0.05, 0.95, f'Frame: {frame}', transform=ax.transAxes, fontsize=14, verticalalignment='top', bbox=dict(boxstyle='round', facecolor='white', alpha=0.7)) - + fig.canvas.draw() - img = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8) - img = img.reshape(fig.canvas.get_width_height()[::-1] + (3,)) + img = np.frombuffer(fig.canvas.buffer_rgba(), dtype=np.uint8) + img = img.reshape(fig.canvas.get_width_height()[::-1] + (4,)) + img = img[..., :3] # 只保留RGB通道 writer.append_data(img) writer.close() @@ -680,7 +831,23 @@ def pcd_divide(pcd, bbox_list): masks.append(np.logical_not(np.any(masks, axis=0))) for mask in masks: selected_pcds.append(pcd[mask]) - assert np.sum([len(p) for p in selected_pcds]) == pcd.shape[0] + total_selected = np.sum([len(p) for p in selected_pcds]) + if total_selected != pcd.shape[0]: + # Fallback: ensure no points are lost due to boundary conditions or boolean casting + cprint(f"[WARN] pcd_divide selected {total_selected} points but input has {pcd.shape[0]}. Adjusting masks to include remainder.", 'yellow') + # recompute masks but make them mutually exclusive: assign points to first matching bbox + masks = [] + assigned = np.zeros(pcd.shape[0], dtype=bool) + for bbox in bbox_list: + mask = np.all(pcd[:, :3] > bbox[0], axis=1) & np.all(pcd[:, :3] < bbox[1], axis=1) + # remove already assigned points to avoid double counting + mask = mask & (~assigned) + masks.append(mask) + assigned |= mask + # remainder (points not assigned to any bbox) + remainder = ~assigned + masks.append(remainder) + selected_pcds = [pcd[mask] for mask in masks] return selected_pcds @staticmethod @@ -742,7 +909,7 @@ def average_distance_to_point_cloud(target_point, point_cloud): return average_distance @staticmethod - def pcd_bbox(pcd, relax=True): + def pcd_bbox(pcd, relax=False): min_vals = np.min(pcd[:, :3], axis=0) max_vals = np.max(pcd[:, :3], axis=0) if relax: @@ -751,4 +918,3 @@ def pcd_bbox(pcd, relax=True): min_vals[2] = 0.0 return np.array([min_vals, max_vals]) - \ No newline at end of file diff --git a/demo_generation/demo_generation/mask_util.py b/demo_generation/demo_generation/mask_util.py index ee39042..80c0484 100644 --- a/demo_generation/demo_generation/mask_util.py +++ b/demo_generation/demo_generation/mask_util.py @@ -19,29 +19,44 @@ ori = R.from_quat(ROBOT2CAM_QUAT_INITIAL) * OFFSET_ORI_X * OFFSET_ORI_Y * OFFSET_ORI_Z ROBOT2CAM_QUAT = ori.as_quat() -robot2cam_mat = np.eye(4) -robot2cam_mat[:3, :3] = R.from_quat(ROBOT2CAM_QUAT).as_matrix() -robot2cam_mat[:3, 3] = ROBOT2CAM_POS +# 仿真环境 cam2world_gl 外参 +cam2world_gl = np.array([ + [1.0, 0.0, 0.0, -0.032], + [0.0, 0.8, -0.6, -0.45], + [0.0, 0.6, 0.8, 1.35], + [0.0, 0.0, 0.0, 1.0] +]) + +# 取逆得到 robot2cam_mat +def inverse_extrinsic_matrix(matrix): + R = matrix[:3, :3] + t = matrix[:3, 3] + R_inv = R.T + t_inv = -R_inv @ t + inv_matrix = np.eye(4) + inv_matrix[:3, :3] = R_inv + inv_matrix[:3, 3] = t_inv + return inv_matrix + +robot2cam_mat = inverse_extrinsic_matrix(cam2world_gl) -REALSENSE_SCALE = 0.0002500000118743628 -fx = 1354.796875 -fy = 1354.6197509765625 -cx = 986.0130004882812 -cy = 548.7333374023438 +REALSENSE_SCALE = 0.001 +# 新的 320x240 分辨率下的内参 +fx = 358.64218 +fy = 358.64218 +cx = 160.0 +cy = 120.0 intrinsic_matrix = np.array([ [fx, 0, cx], [ 0, fy, cy], [ 0, 0, 1] ]) - -T_link2viz = np.array([[0, 0, 1, 0], - [1, 0, 0, 0], - [0, 1, 0, 0], - [0, 0, 0, 1]]) +T_link2viz = np.eye(4) transform_realsense_util = np.array([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]]) +# 默认 image_size 改为 mask 分辨率 image_size = (1920, 1080) ############################################## @@ -61,26 +76,14 @@ def restore_original_pcd(transformed_points): xyz = transformed_points[:, :3] rgb = transformed_points[:, 3:] - robot2cam_extrinsic_matrix = np.eye(4) - robot2cam_extrinsic_matrix[:3, :3] = R.from_quat(ROBOT2CAM_QUAT).as_matrix() - robot2cam_extrinsic_matrix[:3, 3] = ROBOT2CAM_POS - - cam_T_robot = inverse_extrinsic_matrix(robot2cam_extrinsic_matrix) - viz_T_link = inverse_extrinsic_matrix(T_link2viz) - inverse_trans = inverse_extrinsic_matrix(transform_realsense_util) - - homogeneous_points = np.hstack((xyz, np.ones((xyz.shape[0], 1)))) - - restored_points = homogeneous_points.T - restored_points = cam_T_robot @ restored_points - restored_points = viz_T_link @ restored_points - restored_points = inverse_trans @ restored_points - restored_points = restored_points.T - - restored_xyz = restored_points[:, :3] - restored_xyz /= REALSENSE_SCALE - restored_points = np.hstack((restored_xyz, rgb)) - + # 先做相机外参逆变换 + points_hom = np.hstack((xyz, np.ones((xyz.shape[0], 1)))) + xyz_trans = (robot2cam_mat @ points_hom.T).T[:, :3] + # 再将 x 轴取反 + xyz_trans[:, 0] *= -1 + restored_points = np.hstack((xyz_trans, rgb)) + np.save('pcd_restore_debug.npy', restored_points) + print(f"[DEBUG] restore_original_pcd: saved to pcd_restore_debug.npy, shape: {restored_points.shape}, xyz min: {xyz_trans.min(axis=0)}, max: {xyz_trans.max(axis=0)}") return restored_points def project_points_to_image(point_cloud, K, R=np.eye(3), T=np.zeros(3)): @@ -96,30 +99,32 @@ def project_points_to_image(point_cloud, K, R=np.eye(3), T=np.zeros(3)): def filter_points_by_mask(points, mask, intrinsic_matrix, image_size): projected_points = project_points_to_image(points, intrinsic_matrix, R=np.eye(3), T=np.zeros(3)) - pixel_coords = np.floor(projected_points).astype(int) - + pixel_coords = np.floor(projected_points).astype(int) + # 调试:输出投影坐标和有效点统计 + print(f"[DEBUG] pixel_coords min: {pixel_coords.min(axis=0)}, max: {pixel_coords.max(axis=0)}") + print(f"[DEBUG] mask shape: {mask.shape}, image_size: {image_size}") valid_points = (pixel_coords[:, 0] >= 0) & (pixel_coords[:, 0] < image_size[0]) & \ (pixel_coords[:, 1] >= 0) & (pixel_coords[:, 1] < image_size[1]) - - mask_values = mask[pixel_coords[valid_points, 1], pixel_coords[valid_points, 0]] - + print(f"[DEBUG] valid_points count: {np.sum(valid_points)} / {len(points)}") + if np.sum(valid_points) > 0: + mask_values = mask[pixel_coords[valid_points, 1], pixel_coords[valid_points, 0]] + print(f"[DEBUG] mask_values True count: {np.sum(mask_values)} / {len(mask_values)}") + else: + mask_values = np.array([]) + print("[DEBUG] No valid points in mask range!") final_mask = np.zeros(len(points), dtype=bool) final_mask[valid_points] = mask_values - filtered_points = points[final_mask] - + print(f"[DEBUG] filtered_points shape: {filtered_points.shape}") return filtered_points def trans_pcd(points): - robot2cam_extrinsic_matrix = np.eye(4) - robot2cam_extrinsic_matrix[:3, :3] = R.from_quat(ROBOT2CAM_QUAT).as_matrix() - robot2cam_extrinsic_matrix[:3, 3] = ROBOT2CAM_POS - # scale + # 直接使用 robot2cam_mat 作为外参 points_xyz = points[..., :3] * REALSENSE_SCALE point_homogeneous = np.hstack((points_xyz, np.ones((points_xyz.shape[0], 1)))) point_homogeneous = transform_realsense_util @ point_homogeneous.T point_homogeneous = T_link2viz @ point_homogeneous - point_homogeneous = robot2cam_extrinsic_matrix @ point_homogeneous + point_homogeneous = robot2cam_mat @ point_homogeneous point_homogeneous = point_homogeneous.T point_xyz = point_homogeneous[..., :-1] @@ -128,7 +133,17 @@ def trans_pcd(points): return points def restore_and_filter_pcd(pcd_robot, mask, intrinsic_matrix=intrinsic_matrix, image_size=image_size): - pcd_cam = restore_original_pcd(pcd_robot) - filtered_points = filter_points_by_mask(pcd_cam, mask, intrinsic_matrix, image_size) - filtered_points = trans_pcd(filtered_points) - return filtered_points + # 只筛选首帧,其余帧直接返回原始点云 + if hasattr(restore_and_filter_pcd, 'frame_idx'): + restore_and_filter_pcd.frame_idx += 1 + else: + restore_and_filter_pcd.frame_idx = 0 + + if restore_and_filter_pcd.frame_idx == 0: + pcd_cam = restore_original_pcd(pcd_robot) + filtered_points = filter_points_by_mask(pcd_cam, mask, intrinsic_matrix, image_size) + filtered_points = trans_pcd(filtered_points) + return filtered_points + else: + # 非首帧直接返回原始点云(可根据实际需求调整) + return pcd_robot diff --git a/diffusion_policies/diffusion_policies/codecs/imagecodecs_numcodecs.py b/demo_generation/diffusion_policies/codecs/imagecodecs_numcodecs.py similarity index 100% rename from diffusion_policies/diffusion_policies/codecs/imagecodecs_numcodecs.py rename to demo_generation/diffusion_policies/codecs/imagecodecs_numcodecs.py diff --git a/diffusion_policies/diffusion_policies/common/checkpoint_util.py b/demo_generation/diffusion_policies/common/checkpoint_util.py similarity index 100% rename from diffusion_policies/diffusion_policies/common/checkpoint_util.py rename to demo_generation/diffusion_policies/common/checkpoint_util.py diff --git a/diffusion_policies/diffusion_policies/common/gpu_sampler.py b/demo_generation/diffusion_policies/common/gpu_sampler.py similarity index 100% rename from diffusion_policies/diffusion_policies/common/gpu_sampler.py rename to demo_generation/diffusion_policies/common/gpu_sampler.py diff --git a/diffusion_policies/diffusion_policies/common/json_logger.py b/demo_generation/diffusion_policies/common/json_logger.py similarity index 100% rename from diffusion_policies/diffusion_policies/common/json_logger.py rename to demo_generation/diffusion_policies/common/json_logger.py diff --git a/diffusion_policies/diffusion_policies/common/logger_util.py b/demo_generation/diffusion_policies/common/logger_util.py similarity index 100% rename from diffusion_policies/diffusion_policies/common/logger_util.py rename to demo_generation/diffusion_policies/common/logger_util.py diff --git a/diffusion_policies/diffusion_policies/common/model_util.py b/demo_generation/diffusion_policies/common/model_util.py similarity index 100% rename from diffusion_policies/diffusion_policies/common/model_util.py rename to demo_generation/diffusion_policies/common/model_util.py diff --git a/diffusion_policies/diffusion_policies/common/normalize_util.py b/demo_generation/diffusion_policies/common/normalize_util.py similarity index 100% rename from diffusion_policies/diffusion_policies/common/normalize_util.py rename to demo_generation/diffusion_policies/common/normalize_util.py diff --git a/diffusion_policies/diffusion_policies/common/pytorch_util.py b/demo_generation/diffusion_policies/common/pytorch_util.py similarity index 100% rename from diffusion_policies/diffusion_policies/common/pytorch_util.py rename to demo_generation/diffusion_policies/common/pytorch_util.py diff --git a/diffusion_policies/diffusion_policies/common/replay_buffer.py b/demo_generation/diffusion_policies/common/replay_buffer.py similarity index 100% rename from diffusion_policies/diffusion_policies/common/replay_buffer.py rename to demo_generation/diffusion_policies/common/replay_buffer.py diff --git a/diffusion_policies/diffusion_policies/common/robomimic_config_util.py b/demo_generation/diffusion_policies/common/robomimic_config_util.py similarity index 100% rename from diffusion_policies/diffusion_policies/common/robomimic_config_util.py rename to demo_generation/diffusion_policies/common/robomimic_config_util.py diff --git a/diffusion_policies/diffusion_policies/common/robomimic_util.py b/demo_generation/diffusion_policies/common/robomimic_util.py similarity index 100% rename from diffusion_policies/diffusion_policies/common/robomimic_util.py rename to demo_generation/diffusion_policies/common/robomimic_util.py diff --git a/diffusion_policies/diffusion_policies/common/sampler.py b/demo_generation/diffusion_policies/common/sampler.py similarity index 100% rename from diffusion_policies/diffusion_policies/common/sampler.py rename to demo_generation/diffusion_policies/common/sampler.py diff --git a/diffusion_policies/diffusion_policies/config/dp3.yaml b/demo_generation/diffusion_policies/config/dp3.yaml similarity index 100% rename from diffusion_policies/diffusion_policies/config/dp3.yaml rename to demo_generation/diffusion_policies/config/dp3.yaml diff --git a/diffusion_policies/diffusion_policies/config/dp_clip.yaml b/demo_generation/diffusion_policies/config/dp_clip.yaml similarity index 100% rename from diffusion_policies/diffusion_policies/config/dp_clip.yaml rename to demo_generation/diffusion_policies/config/dp_clip.yaml diff --git a/diffusion_policies/diffusion_policies/config/dp_dinov2.yaml b/demo_generation/diffusion_policies/config/dp_dinov2.yaml similarity index 100% rename from diffusion_policies/diffusion_policies/config/dp_dinov2.yaml rename to demo_generation/diffusion_policies/config/dp_dinov2.yaml diff --git a/diffusion_policies/diffusion_policies/config/dp_r3m.yaml b/demo_generation/diffusion_policies/config/dp_r3m.yaml similarity index 100% rename from diffusion_policies/diffusion_policies/config/dp_r3m.yaml rename to demo_generation/diffusion_policies/config/dp_r3m.yaml diff --git a/diffusion_policies/diffusion_policies/config/dp_resnet-in1k.yaml b/demo_generation/diffusion_policies/config/dp_resnet-in1k.yaml similarity index 100% rename from diffusion_policies/diffusion_policies/config/dp_resnet-in1k.yaml rename to demo_generation/diffusion_policies/config/dp_resnet-in1k.yaml diff --git a/diffusion_policies/diffusion_policies/config/dp_resnet-scratch.yaml b/demo_generation/diffusion_policies/config/dp_resnet-scratch.yaml similarity index 100% rename from diffusion_policies/diffusion_policies/config/dp_resnet-scratch.yaml rename to demo_generation/diffusion_policies/config/dp_resnet-scratch.yaml diff --git a/diffusion_policies/diffusion_policies/config/dp_vit-scratch.yaml b/demo_generation/diffusion_policies/config/dp_vit-scratch.yaml similarity index 100% rename from diffusion_policies/diffusion_policies/config/dp_vit-scratch.yaml rename to demo_generation/diffusion_policies/config/dp_vit-scratch.yaml diff --git a/diffusion_policies/diffusion_policies/config/idp3.yaml b/demo_generation/diffusion_policies/config/idp3.yaml similarity index 100% rename from diffusion_policies/diffusion_policies/config/idp3.yaml rename to demo_generation/diffusion_policies/config/idp3.yaml diff --git a/diffusion_policies/diffusion_policies/config/simple_dp3.yaml b/demo_generation/diffusion_policies/config/simple_dp3.yaml similarity index 100% rename from diffusion_policies/diffusion_policies/config/simple_dp3.yaml rename to demo_generation/diffusion_policies/config/simple_dp3.yaml diff --git a/diffusion_policies/diffusion_policies/config/task/galaxea.yaml b/demo_generation/diffusion_policies/config/task/galaxea.yaml similarity index 100% rename from diffusion_policies/diffusion_policies/config/task/galaxea.yaml rename to demo_generation/diffusion_policies/config/task/galaxea.yaml diff --git a/diffusion_policies/diffusion_policies/config/task/oyhand.yaml b/demo_generation/diffusion_policies/config/task/oyhand.yaml similarity index 100% rename from diffusion_policies/diffusion_policies/config/task/oyhand.yaml rename to demo_generation/diffusion_policies/config/task/oyhand.yaml diff --git a/demo_generation/diffusion_policies/dataset/__init__.py b/demo_generation/diffusion_policies/dataset/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/diffusion_policies/diffusion_policies/dataset/base_dataset.py b/demo_generation/diffusion_policies/dataset/base_dataset.py similarity index 100% rename from diffusion_policies/diffusion_policies/dataset/base_dataset.py rename to demo_generation/diffusion_policies/dataset/base_dataset.py diff --git a/diffusion_policies/diffusion_policies/dataset/galaxea_dataset.py b/demo_generation/diffusion_policies/dataset/galaxea_dataset.py similarity index 100% rename from diffusion_policies/diffusion_policies/dataset/galaxea_dataset.py rename to demo_generation/diffusion_policies/dataset/galaxea_dataset.py diff --git a/diffusion_policies/diffusion_policies/dataset/metaworld_image_dataset.py b/demo_generation/diffusion_policies/dataset/metaworld_image_dataset.py similarity index 100% rename from diffusion_policies/diffusion_policies/dataset/metaworld_image_dataset.py rename to demo_generation/diffusion_policies/dataset/metaworld_image_dataset.py diff --git a/diffusion_policies/diffusion_policies/dataset/metaworld_pointcloud_dataset.py b/demo_generation/diffusion_policies/dataset/metaworld_pointcloud_dataset.py similarity index 100% rename from diffusion_policies/diffusion_policies/dataset/metaworld_pointcloud_dataset.py rename to demo_generation/diffusion_policies/dataset/metaworld_pointcloud_dataset.py diff --git a/diffusion_policies/diffusion_policies/dataset/metaworld_state_dataset.py b/demo_generation/diffusion_policies/dataset/metaworld_state_dataset.py similarity index 100% rename from diffusion_policies/diffusion_policies/dataset/metaworld_state_dataset.py rename to demo_generation/diffusion_policies/dataset/metaworld_state_dataset.py diff --git a/diffusion_policies/diffusion_policies/dataset/panda_dataset.py b/demo_generation/diffusion_policies/dataset/panda_dataset.py similarity index 100% rename from diffusion_policies/diffusion_policies/dataset/panda_dataset.py rename to demo_generation/diffusion_policies/dataset/panda_dataset.py diff --git a/diffusion_policies/diffusion_policies/dataset/robosuite_pointcloud_dataset.py b/demo_generation/diffusion_policies/dataset/robosuite_pointcloud_dataset.py similarity index 100% rename from diffusion_policies/diffusion_policies/dataset/robosuite_pointcloud_dataset.py rename to demo_generation/diffusion_policies/dataset/robosuite_pointcloud_dataset.py diff --git a/diffusion_policies/diffusion_policies/env_runner/base_runner.py b/demo_generation/diffusion_policies/env_runner/base_runner.py similarity index 100% rename from diffusion_policies/diffusion_policies/env_runner/base_runner.py rename to demo_generation/diffusion_policies/env_runner/base_runner.py diff --git a/diffusion_policies/diffusion_policies/env_runner/blank_runner.py b/demo_generation/diffusion_policies/env_runner/blank_runner.py similarity index 100% rename from diffusion_policies/diffusion_policies/env_runner/blank_runner.py rename to demo_generation/diffusion_policies/env_runner/blank_runner.py diff --git a/diffusion_policies/diffusion_policies/env_runner/metaworld_runner.py b/demo_generation/diffusion_policies/env_runner/metaworld_runner.py similarity index 100% rename from diffusion_policies/diffusion_policies/env_runner/metaworld_runner.py rename to demo_generation/diffusion_policies/env_runner/metaworld_runner.py diff --git a/diffusion_policies/diffusion_policies/env_runner/robosuite_runner.py b/demo_generation/diffusion_policies/env_runner/robosuite_runner.py similarity index 100% rename from diffusion_policies/diffusion_policies/env_runner/robosuite_runner.py rename to demo_generation/diffusion_policies/env_runner/robosuite_runner.py diff --git a/diffusion_policies/diffusion_policies/gym_util/async_vector_env.py b/demo_generation/diffusion_policies/gym_util/async_vector_env.py similarity index 100% rename from diffusion_policies/diffusion_policies/gym_util/async_vector_env.py rename to demo_generation/diffusion_policies/gym_util/async_vector_env.py diff --git a/diffusion_policies/diffusion_policies/gym_util/mjpc_diffusion_wrapper.py b/demo_generation/diffusion_policies/gym_util/mjpc_diffusion_wrapper.py similarity index 100% rename from diffusion_policies/diffusion_policies/gym_util/mjpc_diffusion_wrapper.py rename to demo_generation/diffusion_policies/gym_util/mjpc_diffusion_wrapper.py diff --git a/diffusion_policies/diffusion_policies/gym_util/mjpc_wrapper.py b/demo_generation/diffusion_policies/gym_util/mjpc_wrapper.py similarity index 100% rename from diffusion_policies/diffusion_policies/gym_util/mjpc_wrapper.py rename to demo_generation/diffusion_policies/gym_util/mjpc_wrapper.py diff --git a/diffusion_policies/diffusion_policies/gym_util/mujoco_point_cloud.py b/demo_generation/diffusion_policies/gym_util/mujoco_point_cloud.py similarity index 100% rename from diffusion_policies/diffusion_policies/gym_util/mujoco_point_cloud.py rename to demo_generation/diffusion_policies/gym_util/mujoco_point_cloud.py diff --git a/diffusion_policies/diffusion_policies/gym_util/multistep_wrapper.py b/demo_generation/diffusion_policies/gym_util/multistep_wrapper.py similarity index 100% rename from diffusion_policies/diffusion_policies/gym_util/multistep_wrapper.py rename to demo_generation/diffusion_policies/gym_util/multistep_wrapper.py diff --git a/diffusion_policies/diffusion_policies/gym_util/multiview_video_recording_wrapper.py b/demo_generation/diffusion_policies/gym_util/multiview_video_recording_wrapper.py similarity index 100% rename from diffusion_policies/diffusion_policies/gym_util/multiview_video_recording_wrapper.py rename to demo_generation/diffusion_policies/gym_util/multiview_video_recording_wrapper.py diff --git a/diffusion_policies/diffusion_policies/gym_util/sync_vector_env.py b/demo_generation/diffusion_policies/gym_util/sync_vector_env.py similarity index 100% rename from diffusion_policies/diffusion_policies/gym_util/sync_vector_env.py rename to demo_generation/diffusion_policies/gym_util/sync_vector_env.py diff --git a/diffusion_policies/diffusion_policies/gym_util/video_recording_wrapper.py b/demo_generation/diffusion_policies/gym_util/video_recording_wrapper.py similarity index 100% rename from diffusion_policies/diffusion_policies/gym_util/video_recording_wrapper.py rename to demo_generation/diffusion_policies/gym_util/video_recording_wrapper.py diff --git a/diffusion_policies/diffusion_policies/gym_util/video_wrapper.py b/demo_generation/diffusion_policies/gym_util/video_wrapper.py similarity index 100% rename from diffusion_policies/diffusion_policies/gym_util/video_wrapper.py rename to demo_generation/diffusion_policies/gym_util/video_wrapper.py diff --git a/diffusion_policies/diffusion_policies/model_dp3/common/dict_of_tensor_mixin.py b/demo_generation/diffusion_policies/model_dp3/common/dict_of_tensor_mixin.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp3/common/dict_of_tensor_mixin.py rename to demo_generation/diffusion_policies/model_dp3/common/dict_of_tensor_mixin.py diff --git a/diffusion_policies/diffusion_policies/model_dp3/common/lr_scheduler.py b/demo_generation/diffusion_policies/model_dp3/common/lr_scheduler.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp3/common/lr_scheduler.py rename to demo_generation/diffusion_policies/model_dp3/common/lr_scheduler.py diff --git a/diffusion_policies/diffusion_policies/model_dp3/common/module_attr_mixin.py b/demo_generation/diffusion_policies/model_dp3/common/module_attr_mixin.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp3/common/module_attr_mixin.py rename to demo_generation/diffusion_policies/model_dp3/common/module_attr_mixin.py diff --git a/diffusion_policies/diffusion_policies/model_dp3/common/normalizer.py b/demo_generation/diffusion_policies/model_dp3/common/normalizer.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp3/common/normalizer.py rename to demo_generation/diffusion_policies/model_dp3/common/normalizer.py diff --git a/diffusion_policies/diffusion_policies/model_dp3/common/rotation_transformer.py b/demo_generation/diffusion_policies/model_dp3/common/rotation_transformer.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp3/common/rotation_transformer.py rename to demo_generation/diffusion_policies/model_dp3/common/rotation_transformer.py diff --git a/diffusion_policies/diffusion_policies/model_dp3/common/shape_util.py b/demo_generation/diffusion_policies/model_dp3/common/shape_util.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp3/common/shape_util.py rename to demo_generation/diffusion_policies/model_dp3/common/shape_util.py diff --git a/diffusion_policies/diffusion_policies/model_dp3/common/tensor_util.py b/demo_generation/diffusion_policies/model_dp3/common/tensor_util.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp3/common/tensor_util.py rename to demo_generation/diffusion_policies/model_dp3/common/tensor_util.py diff --git a/diffusion_policies/diffusion_policies/model_dp3/diffusion/conditional_unet1d.py b/demo_generation/diffusion_policies/model_dp3/diffusion/conditional_unet1d.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp3/diffusion/conditional_unet1d.py rename to demo_generation/diffusion_policies/model_dp3/diffusion/conditional_unet1d.py diff --git a/diffusion_policies/diffusion_policies/model_dp3/diffusion/conv1d_components.py b/demo_generation/diffusion_policies/model_dp3/diffusion/conv1d_components.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp3/diffusion/conv1d_components.py rename to demo_generation/diffusion_policies/model_dp3/diffusion/conv1d_components.py diff --git a/diffusion_policies/diffusion_policies/model_dp3/diffusion/ema_model.py b/demo_generation/diffusion_policies/model_dp3/diffusion/ema_model.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp3/diffusion/ema_model.py rename to demo_generation/diffusion_policies/model_dp3/diffusion/ema_model.py diff --git a/diffusion_policies/diffusion_policies/model_dp3/diffusion/mask_generator.py b/demo_generation/diffusion_policies/model_dp3/diffusion/mask_generator.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp3/diffusion/mask_generator.py rename to demo_generation/diffusion_policies/model_dp3/diffusion/mask_generator.py diff --git a/diffusion_policies/diffusion_policies/model_dp3/diffusion/positional_embedding.py b/demo_generation/diffusion_policies/model_dp3/diffusion/positional_embedding.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp3/diffusion/positional_embedding.py rename to demo_generation/diffusion_policies/model_dp3/diffusion/positional_embedding.py diff --git a/diffusion_policies/diffusion_policies/model_dp3/diffusion/simple_conditional_unet1d.py b/demo_generation/diffusion_policies/model_dp3/diffusion/simple_conditional_unet1d.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp3/diffusion/simple_conditional_unet1d.py rename to demo_generation/diffusion_policies/model_dp3/diffusion/simple_conditional_unet1d.py diff --git a/diffusion_policies/diffusion_policies/model_dp3/vision/crop_randomizer.py b/demo_generation/diffusion_policies/model_dp3/vision/crop_randomizer.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp3/vision/crop_randomizer.py rename to demo_generation/diffusion_policies/model_dp3/vision/crop_randomizer.py diff --git a/diffusion_policies/diffusion_policies/model_dp3/vision/model_getter.py b/demo_generation/diffusion_policies/model_dp3/vision/model_getter.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp3/vision/model_getter.py rename to demo_generation/diffusion_policies/model_dp3/vision/model_getter.py diff --git a/diffusion_policies/diffusion_policies/model_dp3/vision_3d/openpoints_encoder.py b/demo_generation/diffusion_policies/model_dp3/vision_3d/openpoints_encoder.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp3/vision_3d/openpoints_encoder.py rename to demo_generation/diffusion_policies/model_dp3/vision_3d/openpoints_encoder.py diff --git a/diffusion_policies/diffusion_policies/model_dp3/vision_3d/pointnet2_encoder.py b/demo_generation/diffusion_policies/model_dp3/vision_3d/pointnet2_encoder.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp3/vision_3d/pointnet2_encoder.py rename to demo_generation/diffusion_policies/model_dp3/vision_3d/pointnet2_encoder.py diff --git a/diffusion_policies/diffusion_policies/model_dp3/vision_3d/pointnet_extractor.py b/demo_generation/diffusion_policies/model_dp3/vision_3d/pointnet_extractor.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp3/vision_3d/pointnet_extractor.py rename to demo_generation/diffusion_policies/model_dp3/vision_3d/pointnet_extractor.py diff --git a/diffusion_policies/diffusion_policies/model_dp3/vision_3d/pointnet_origin.py b/demo_generation/diffusion_policies/model_dp3/vision_3d/pointnet_origin.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp3/vision_3d/pointnet_origin.py rename to demo_generation/diffusion_policies/model_dp3/vision_3d/pointnet_origin.py diff --git a/diffusion_policies/diffusion_policies/model_dp3/vision_3d/pointnext_encoder.py b/demo_generation/diffusion_policies/model_dp3/vision_3d/pointnext_encoder.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp3/vision_3d/pointnext_encoder.py rename to demo_generation/diffusion_policies/model_dp3/vision_3d/pointnext_encoder.py diff --git a/diffusion_policies/diffusion_policies/model_dp3/vision_3d/pointtransformer_encoder.py b/demo_generation/diffusion_policies/model_dp3/vision_3d/pointtransformer_encoder.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp3/vision_3d/pointtransformer_encoder.py rename to demo_generation/diffusion_policies/model_dp3/vision_3d/pointtransformer_encoder.py diff --git a/diffusion_policies/diffusion_policies/model_dp3/vision_3d/se3_aug.py b/demo_generation/diffusion_policies/model_dp3/vision_3d/se3_aug.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp3/vision_3d/se3_aug.py rename to demo_generation/diffusion_policies/model_dp3/vision_3d/se3_aug.py diff --git a/diffusion_policies/diffusion_policies/model_dp3/vision_3d/voxel_model.py b/demo_generation/diffusion_policies/model_dp3/vision_3d/voxel_model.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp3/vision_3d/voxel_model.py rename to demo_generation/diffusion_policies/model_dp3/vision_3d/voxel_model.py diff --git a/diffusion_policies/diffusion_policies/model_dp3/vision_3d/voxelcnn_encoder.py b/demo_generation/diffusion_policies/model_dp3/vision_3d/voxelcnn_encoder.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp3/vision_3d/voxelcnn_encoder.py rename to demo_generation/diffusion_policies/model_dp3/vision_3d/voxelcnn_encoder.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/bet/action_ae/__init__.py b/demo_generation/diffusion_policies/model_dp_umi/bet/action_ae/__init__.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/bet/action_ae/__init__.py rename to demo_generation/diffusion_policies/model_dp_umi/bet/action_ae/__init__.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/bet/action_ae/discretizers/k_means.py b/demo_generation/diffusion_policies/model_dp_umi/bet/action_ae/discretizers/k_means.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/bet/action_ae/discretizers/k_means.py rename to demo_generation/diffusion_policies/model_dp_umi/bet/action_ae/discretizers/k_means.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/bet/latent_generators/latent_generator.py b/demo_generation/diffusion_policies/model_dp_umi/bet/latent_generators/latent_generator.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/bet/latent_generators/latent_generator.py rename to demo_generation/diffusion_policies/model_dp_umi/bet/latent_generators/latent_generator.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/bet/latent_generators/mingpt.py b/demo_generation/diffusion_policies/model_dp_umi/bet/latent_generators/mingpt.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/bet/latent_generators/mingpt.py rename to demo_generation/diffusion_policies/model_dp_umi/bet/latent_generators/mingpt.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/bet/latent_generators/transformer.py b/demo_generation/diffusion_policies/model_dp_umi/bet/latent_generators/transformer.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/bet/latent_generators/transformer.py rename to demo_generation/diffusion_policies/model_dp_umi/bet/latent_generators/transformer.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/bet/libraries/loss_fn.py b/demo_generation/diffusion_policies/model_dp_umi/bet/libraries/loss_fn.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/bet/libraries/loss_fn.py rename to demo_generation/diffusion_policies/model_dp_umi/bet/libraries/loss_fn.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/bet/libraries/mingpt/LICENSE b/demo_generation/diffusion_policies/model_dp_umi/bet/libraries/mingpt/LICENSE similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/bet/libraries/mingpt/LICENSE rename to demo_generation/diffusion_policies/model_dp_umi/bet/libraries/mingpt/LICENSE diff --git a/demo_generation/diffusion_policies/model_dp_umi/bet/libraries/mingpt/__init__.py b/demo_generation/diffusion_policies/model_dp_umi/bet/libraries/mingpt/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/bet/libraries/mingpt/model.py b/demo_generation/diffusion_policies/model_dp_umi/bet/libraries/mingpt/model.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/bet/libraries/mingpt/model.py rename to demo_generation/diffusion_policies/model_dp_umi/bet/libraries/mingpt/model.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/bet/libraries/mingpt/trainer.py b/demo_generation/diffusion_policies/model_dp_umi/bet/libraries/mingpt/trainer.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/bet/libraries/mingpt/trainer.py rename to demo_generation/diffusion_policies/model_dp_umi/bet/libraries/mingpt/trainer.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/bet/libraries/mingpt/utils.py b/demo_generation/diffusion_policies/model_dp_umi/bet/libraries/mingpt/utils.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/bet/libraries/mingpt/utils.py rename to demo_generation/diffusion_policies/model_dp_umi/bet/libraries/mingpt/utils.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/bet/utils.py b/demo_generation/diffusion_policies/model_dp_umi/bet/utils.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/bet/utils.py rename to demo_generation/diffusion_policies/model_dp_umi/bet/utils.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/common/dict_of_tensor_mixin.py b/demo_generation/diffusion_policies/model_dp_umi/common/dict_of_tensor_mixin.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/common/dict_of_tensor_mixin.py rename to demo_generation/diffusion_policies/model_dp_umi/common/dict_of_tensor_mixin.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/common/lr_scheduler.py b/demo_generation/diffusion_policies/model_dp_umi/common/lr_scheduler.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/common/lr_scheduler.py rename to demo_generation/diffusion_policies/model_dp_umi/common/lr_scheduler.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/common/module_attr_mixin.py b/demo_generation/diffusion_policies/model_dp_umi/common/module_attr_mixin.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/common/module_attr_mixin.py rename to demo_generation/diffusion_policies/model_dp_umi/common/module_attr_mixin.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/common/normalizer.py b/demo_generation/diffusion_policies/model_dp_umi/common/normalizer.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/common/normalizer.py rename to demo_generation/diffusion_policies/model_dp_umi/common/normalizer.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/common/rotation_transformer.py b/demo_generation/diffusion_policies/model_dp_umi/common/rotation_transformer.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/common/rotation_transformer.py rename to demo_generation/diffusion_policies/model_dp_umi/common/rotation_transformer.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/common/shape_util.py b/demo_generation/diffusion_policies/model_dp_umi/common/shape_util.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/common/shape_util.py rename to demo_generation/diffusion_policies/model_dp_umi/common/shape_util.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/common/tensor_util.py b/demo_generation/diffusion_policies/model_dp_umi/common/tensor_util.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/common/tensor_util.py rename to demo_generation/diffusion_policies/model_dp_umi/common/tensor_util.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/diffusion/conditional_unet1d.py b/demo_generation/diffusion_policies/model_dp_umi/diffusion/conditional_unet1d.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/diffusion/conditional_unet1d.py rename to demo_generation/diffusion_policies/model_dp_umi/diffusion/conditional_unet1d.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/diffusion/conv1d_components.py b/demo_generation/diffusion_policies/model_dp_umi/diffusion/conv1d_components.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/diffusion/conv1d_components.py rename to demo_generation/diffusion_policies/model_dp_umi/diffusion/conv1d_components.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/diffusion/ema_model.py b/demo_generation/diffusion_policies/model_dp_umi/diffusion/ema_model.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/diffusion/ema_model.py rename to demo_generation/diffusion_policies/model_dp_umi/diffusion/ema_model.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/diffusion/mask_generator.py b/demo_generation/diffusion_policies/model_dp_umi/diffusion/mask_generator.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/diffusion/mask_generator.py rename to demo_generation/diffusion_policies/model_dp_umi/diffusion/mask_generator.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/diffusion/positional_embedding.py b/demo_generation/diffusion_policies/model_dp_umi/diffusion/positional_embedding.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/diffusion/positional_embedding.py rename to demo_generation/diffusion_policies/model_dp_umi/diffusion/positional_embedding.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/diffusion/transformer_for_action_diffusion.py b/demo_generation/diffusion_policies/model_dp_umi/diffusion/transformer_for_action_diffusion.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/diffusion/transformer_for_action_diffusion.py rename to demo_generation/diffusion_policies/model_dp_umi/diffusion/transformer_for_action_diffusion.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/diffusion/transformer_for_diffusion.py b/demo_generation/diffusion_policies/model_dp_umi/diffusion/transformer_for_diffusion.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/diffusion/transformer_for_diffusion.py rename to demo_generation/diffusion_policies/model_dp_umi/diffusion/transformer_for_diffusion.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/vision/crop_randomizer.py b/demo_generation/diffusion_policies/model_dp_umi/vision/crop_randomizer.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/vision/crop_randomizer.py rename to demo_generation/diffusion_policies/model_dp_umi/vision/crop_randomizer.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/vision/model_getter.py b/demo_generation/diffusion_policies/model_dp_umi/vision/model_getter.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/vision/model_getter.py rename to demo_generation/diffusion_policies/model_dp_umi/vision/model_getter.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/vision/multi_image_obs_encoder.py b/demo_generation/diffusion_policies/model_dp_umi/vision/multi_image_obs_encoder.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/vision/multi_image_obs_encoder.py rename to demo_generation/diffusion_policies/model_dp_umi/vision/multi_image_obs_encoder.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/vision/timm_obs_encoder.py b/demo_generation/diffusion_policies/model_dp_umi/vision/timm_obs_encoder.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/vision/timm_obs_encoder.py rename to demo_generation/diffusion_policies/model_dp_umi/vision/timm_obs_encoder.py diff --git a/diffusion_policies/diffusion_policies/model_dp_umi/vision/transformer_obs_encoder.py b/demo_generation/diffusion_policies/model_dp_umi/vision/transformer_obs_encoder.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_dp_umi/vision/transformer_obs_encoder.py rename to demo_generation/diffusion_policies/model_dp_umi/vision/transformer_obs_encoder.py diff --git a/diffusion_policies/diffusion_policies/model_idp3/common/dict_of_tensor_mixin.py b/demo_generation/diffusion_policies/model_idp3/common/dict_of_tensor_mixin.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_idp3/common/dict_of_tensor_mixin.py rename to demo_generation/diffusion_policies/model_idp3/common/dict_of_tensor_mixin.py diff --git a/diffusion_policies/diffusion_policies/model_idp3/common/lr_scheduler.py b/demo_generation/diffusion_policies/model_idp3/common/lr_scheduler.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_idp3/common/lr_scheduler.py rename to demo_generation/diffusion_policies/model_idp3/common/lr_scheduler.py diff --git a/diffusion_policies/diffusion_policies/model_idp3/common/module_attr_mixin.py b/demo_generation/diffusion_policies/model_idp3/common/module_attr_mixin.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_idp3/common/module_attr_mixin.py rename to demo_generation/diffusion_policies/model_idp3/common/module_attr_mixin.py diff --git a/diffusion_policies/diffusion_policies/model_idp3/common/normalizer.py b/demo_generation/diffusion_policies/model_idp3/common/normalizer.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_idp3/common/normalizer.py rename to demo_generation/diffusion_policies/model_idp3/common/normalizer.py diff --git a/diffusion_policies/diffusion_policies/model_idp3/common/shape_util.py b/demo_generation/diffusion_policies/model_idp3/common/shape_util.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_idp3/common/shape_util.py rename to demo_generation/diffusion_policies/model_idp3/common/shape_util.py diff --git a/diffusion_policies/diffusion_policies/model_idp3/common/tensor_util.py b/demo_generation/diffusion_policies/model_idp3/common/tensor_util.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_idp3/common/tensor_util.py rename to demo_generation/diffusion_policies/model_idp3/common/tensor_util.py diff --git a/diffusion_policies/diffusion_policies/model_idp3/diffusion/conditional_unet1d.py b/demo_generation/diffusion_policies/model_idp3/diffusion/conditional_unet1d.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_idp3/diffusion/conditional_unet1d.py rename to demo_generation/diffusion_policies/model_idp3/diffusion/conditional_unet1d.py diff --git a/diffusion_policies/diffusion_policies/model_idp3/diffusion/conv1d_components.py b/demo_generation/diffusion_policies/model_idp3/diffusion/conv1d_components.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_idp3/diffusion/conv1d_components.py rename to demo_generation/diffusion_policies/model_idp3/diffusion/conv1d_components.py diff --git a/diffusion_policies/diffusion_policies/model_idp3/diffusion/ema_model.py b/demo_generation/diffusion_policies/model_idp3/diffusion/ema_model.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_idp3/diffusion/ema_model.py rename to demo_generation/diffusion_policies/model_idp3/diffusion/ema_model.py diff --git a/diffusion_policies/diffusion_policies/model_idp3/diffusion/mask_generator.py b/demo_generation/diffusion_policies/model_idp3/diffusion/mask_generator.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_idp3/diffusion/mask_generator.py rename to demo_generation/diffusion_policies/model_idp3/diffusion/mask_generator.py diff --git a/diffusion_policies/diffusion_policies/model_idp3/diffusion/positional_embedding.py b/demo_generation/diffusion_policies/model_idp3/diffusion/positional_embedding.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_idp3/diffusion/positional_embedding.py rename to demo_generation/diffusion_policies/model_idp3/diffusion/positional_embedding.py diff --git a/diffusion_policies/diffusion_policies/model_idp3/vision/crop_randomizer.py b/demo_generation/diffusion_policies/model_idp3/vision/crop_randomizer.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_idp3/vision/crop_randomizer.py rename to demo_generation/diffusion_policies/model_idp3/vision/crop_randomizer.py diff --git a/diffusion_policies/diffusion_policies/model_idp3/vision/model_getter.py b/demo_generation/diffusion_policies/model_idp3/vision/model_getter.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_idp3/vision/model_getter.py rename to demo_generation/diffusion_policies/model_idp3/vision/model_getter.py diff --git a/diffusion_policies/diffusion_policies/model_idp3/vision/timm_obs_encoder.py b/demo_generation/diffusion_policies/model_idp3/vision/timm_obs_encoder.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_idp3/vision/timm_obs_encoder.py rename to demo_generation/diffusion_policies/model_idp3/vision/timm_obs_encoder.py diff --git a/diffusion_policies/diffusion_policies/model_idp3/vision_3d/multi_stage_pointnet.py b/demo_generation/diffusion_policies/model_idp3/vision_3d/multi_stage_pointnet.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_idp3/vision_3d/multi_stage_pointnet.py rename to demo_generation/diffusion_policies/model_idp3/vision_3d/multi_stage_pointnet.py diff --git a/diffusion_policies/diffusion_policies/model_idp3/vision_3d/point_process.py b/demo_generation/diffusion_policies/model_idp3/vision_3d/point_process.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_idp3/vision_3d/point_process.py rename to demo_generation/diffusion_policies/model_idp3/vision_3d/point_process.py diff --git a/diffusion_policies/diffusion_policies/model_idp3/vision_3d/pointnet_extractor.py b/demo_generation/diffusion_policies/model_idp3/vision_3d/pointnet_extractor.py similarity index 100% rename from diffusion_policies/diffusion_policies/model_idp3/vision_3d/pointnet_extractor.py rename to demo_generation/diffusion_policies/model_idp3/vision_3d/pointnet_extractor.py diff --git a/diffusion_policies/diffusion_policies/policy/base_image_policy.py b/demo_generation/diffusion_policies/policy/base_image_policy.py similarity index 100% rename from diffusion_policies/diffusion_policies/policy/base_image_policy.py rename to demo_generation/diffusion_policies/policy/base_image_policy.py diff --git a/diffusion_policies/diffusion_policies/policy/base_pointcloud_policy.py b/demo_generation/diffusion_policies/policy/base_pointcloud_policy.py similarity index 100% rename from diffusion_policies/diffusion_policies/policy/base_pointcloud_policy.py rename to demo_generation/diffusion_policies/policy/base_pointcloud_policy.py diff --git a/diffusion_policies/diffusion_policies/policy/diffusion_unet_hybrid_image_policy.py b/demo_generation/diffusion_policies/policy/diffusion_unet_hybrid_image_policy.py similarity index 100% rename from diffusion_policies/diffusion_policies/policy/diffusion_unet_hybrid_image_policy.py rename to demo_generation/diffusion_policies/policy/diffusion_unet_hybrid_image_policy.py diff --git a/diffusion_policies/diffusion_policies/policy/diffusion_unet_hybrid_pointcloud_policy.py b/demo_generation/diffusion_policies/policy/diffusion_unet_hybrid_pointcloud_policy.py similarity index 100% rename from diffusion_policies/diffusion_policies/policy/diffusion_unet_hybrid_pointcloud_policy.py rename to demo_generation/diffusion_policies/policy/diffusion_unet_hybrid_pointcloud_policy.py diff --git a/diffusion_policies/diffusion_policies/policy/diffusion_unet_hybrid_state_policy.py b/demo_generation/diffusion_policies/policy/diffusion_unet_hybrid_state_policy.py similarity index 100% rename from diffusion_policies/diffusion_policies/policy/diffusion_unet_hybrid_state_policy.py rename to demo_generation/diffusion_policies/policy/diffusion_unet_hybrid_state_policy.py diff --git a/diffusion_policies/diffusion_policies/policy/diffusion_unet_image_policy.py b/demo_generation/diffusion_policies/policy/diffusion_unet_image_policy.py similarity index 100% rename from diffusion_policies/diffusion_policies/policy/diffusion_unet_image_policy.py rename to demo_generation/diffusion_policies/policy/diffusion_unet_image_policy.py diff --git a/diffusion_policies/diffusion_policies/policy/diffusion_unet_timm_policy.py b/demo_generation/diffusion_policies/policy/diffusion_unet_timm_policy.py similarity index 100% rename from diffusion_policies/diffusion_policies/policy/diffusion_unet_timm_policy.py rename to demo_generation/diffusion_policies/policy/diffusion_unet_timm_policy.py diff --git a/diffusion_policies/diffusion_policies/policy/idp3.py b/demo_generation/diffusion_policies/policy/idp3.py similarity index 100% rename from diffusion_policies/diffusion_policies/policy/idp3.py rename to demo_generation/diffusion_policies/policy/idp3.py diff --git a/diffusion_policies/diffusion_policies/policy/simple_dp3.py b/demo_generation/diffusion_policies/policy/simple_dp3.py similarity index 100% rename from diffusion_policies/diffusion_policies/policy/simple_dp3.py rename to demo_generation/diffusion_policies/policy/simple_dp3.py diff --git a/diffusion_policies/diffusion_policies/workspace/base_workspace.py b/demo_generation/diffusion_policies/workspace/base_workspace.py similarity index 100% rename from diffusion_policies/diffusion_policies/workspace/base_workspace.py rename to demo_generation/diffusion_policies/workspace/base_workspace.py diff --git a/diffusion_policies/diffusion_policies/workspace/train_diffusion_unet_hybrid_pointcloud_workspace.py b/demo_generation/diffusion_policies/workspace/train_diffusion_unet_hybrid_pointcloud_workspace.py similarity index 100% rename from diffusion_policies/diffusion_policies/workspace/train_diffusion_unet_hybrid_pointcloud_workspace.py rename to demo_generation/diffusion_policies/workspace/train_diffusion_unet_hybrid_pointcloud_workspace.py diff --git a/diffusion_policies/diffusion_policies/workspace/train_diffusion_unet_image_workspace.py b/demo_generation/diffusion_policies/workspace/train_diffusion_unet_image_workspace.py similarity index 100% rename from diffusion_policies/diffusion_policies/workspace/train_diffusion_unet_image_workspace.py rename to demo_generation/diffusion_policies/workspace/train_diffusion_unet_image_workspace.py diff --git a/demo_generation/gen_demo.sh b/demo_generation/gen_demo.sh index fcfe301..f4588ed 100644 --- a/demo_generation/gen_demo.sh +++ b/demo_generation/gen_demo.sh @@ -6,10 +6,16 @@ render_video=${5} data_root=../data +# If user accidentally passes grid with 1 sample, fallback to random mode +if [ "${gen_mode}" = "grid" ] && [ "${n_gen_per_source}" = "1" ]; then + echo "Warning: grid mode requires n_gen_per_source to be a square (and >1). Switching to 'random' mode." + gen_mode="random" +fi + python -W ignore gen_demo.py --config-name=${task}.yaml \ - data_root=${data_root} \ - generation.range_name=${gen_range} \ - generation.mode=${gen_mode} \ - generation.n_gen_per_source=${n_gen_per_source} \ - generation.render_video=${render_video} + data_root=${data_root} \ + generation.range_name=${gen_range} \ + generation.mode=${gen_mode} \ + generation.n_gen_per_source=${n_gen_per_source} \ + generation.render_video=${render_video} \ No newline at end of file diff --git a/demo_generation/hdf52rgb.py b/demo_generation/hdf52rgb.py new file mode 100644 index 0000000..138179d --- /dev/null +++ b/demo_generation/hdf52rgb.py @@ -0,0 +1,37 @@ +import numpy as np +import h5py +import os +import cv2 + +def _decode_rgb_image(rgb_dataset): + """解码首帧RGB图像数据集""" + camera_bits = rgb_dataset[0] + camera_img = cv2.imdecode(np.frombuffer(camera_bits, np.uint8), cv2.IMREAD_COLOR) + return camera_img + +def save_first_rgb_frame_from_h5(h5_file_path, output_dir): + # 创建输出目录 + rgb_output_dir = os.path.join(output_dir, 'rgb') + os.makedirs(rgb_output_dir, exist_ok=True) + + # 打开h5文件 + with h5py.File(h5_file_path, 'r') as h5_file: + rgb_data = h5_file['observation/head_camera/rgb'] + # 解码首帧RGB图像 + rgb_frame = _decode_rgb_image(rgb_data) + # 保存首帧,文件名为000000.png + rgb_frame_path = os.path.join(rgb_output_dir, 'mask.jpg') + save_image(rgb_frame, rgb_frame_path) + +def save_image(image_array, file_path): + from PIL import Image + image = Image.fromarray(image_array) + image.save(file_path) + +def new_func(i): + h5_file_path = f'/home/lemonhdl/workspace/DemoGen/data/datasets/robotwin_ori/beat_block_hammer/loop1-8-all/data/episode{i}.hdf5' + output_dir = f'/home/lemonhdl/workspace/DemoGen/data/sam_mask/beat_block_hammer/block' + os.makedirs(output_dir, exist_ok=True) + save_first_rgb_frame_from_h5(h5_file_path, output_dir) + +new_func(i=0) # 示例调用,处理episode0.hdf5 diff --git a/demo_generation/hdf52rgb_all.py b/demo_generation/hdf52rgb_all.py new file mode 100644 index 0000000..026817e --- /dev/null +++ b/demo_generation/hdf52rgb_all.py @@ -0,0 +1,37 @@ +import numpy as np +import h5py +import os +import cv2 + +def _decode_rgb_image(camera_bits): + """解码单帧RGB图像数据""" + camera_img = cv2.imdecode(np.frombuffer(camera_bits, np.uint8), cv2.IMREAD_COLOR) + return camera_img + +def save_all_rgb_frames_from_h5(h5_file_path, output_dir): + # 创建输出目录 + rgb_output_dir = os.path.join(output_dir, 'rgb') + os.makedirs(rgb_output_dir, exist_ok=True) + + # 打开h5文件 + with h5py.File(h5_file_path, 'r') as h5_file: + rgb_data = h5_file['observation/head_camera/rgb'] + # 遍历所有帧 + for idx in range(len(rgb_data)): + camera_bits = rgb_data[idx] + rgb_frame = _decode_rgb_image(camera_bits) + rgb_frame_path = os.path.join(rgb_output_dir, f'{idx:06d}.jpg') + save_image(rgb_frame, rgb_frame_path) + +def save_image(image_array, file_path): + from PIL import Image + image = Image.fromarray(image_array) + image.save(file_path) + +def new_func(i): + h5_file_path = f'/home/lemonhdl/workspace/DemoGen/data/datasets/robotwin_ori/beat_block_hammer/loop1-8-all/data/episode0.hdf5' + output_dir = f'/home/lemonhdl/workspace/DemoGen/data/sam_mask/beat_block_hammer-loop1-single/vis_all' + os.makedirs(output_dir, exist_ok=True) + save_all_rgb_frames_from_h5(h5_file_path, output_dir) + +new_func(i=0) # 示例调用,处理episode0.hdf5 diff --git a/demo_generation/pcd_restore_debug.npy b/demo_generation/pcd_restore_debug.npy new file mode 100644 index 0000000..72ad2b6 Binary files /dev/null and b/demo_generation/pcd_restore_debug.npy differ diff --git a/demo_generation/run_gen_demo_bbhl.sh b/demo_generation/run_gen_demo_bbhl.sh new file mode 100644 index 0000000..c6473cb --- /dev/null +++ b/demo_generation/run_gen_demo_bbhl.sh @@ -0,0 +1,10 @@ +bash gen_demo.sh beat_block_hammer-loop1 test random 40 True +# bash gen_demo.sh beat_block_hammer-loop2 test random 40 True +# bash gen_demo.sh beat_block_hammer-loop3 test random 40 True +# bash gen_demo.sh beat_block_hammer-loop4 test random 40 True +# bash gen_demo.sh beat_block_hammer-loop5 test random 40 True +# bash gen_demo.sh beat_block_hammer-loop1 src random 1 True +# bash gen_demo.sh beat_block_hammer-loop2 src random 1 True +# bash gen_demo.sh beat_block_hammer-loop3 src random 1 True +# bash gen_demo.sh beat_block_hammer-loop4 src random 1 True +# bash gen_demo.sh beat_block_hammer-loop5 src random 1 True diff --git a/demo_generation/test_dummy.h5 b/demo_generation/test_dummy.h5 new file mode 100644 index 0000000..63ba1f3 Binary files /dev/null and b/demo_generation/test_dummy.h5 differ diff --git a/diffusion_policies/LICENSE b/diffusion_policies/LICENSE deleted file mode 100755 index 1e94ccd..0000000 --- a/diffusion_policies/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 Columbia Artificial Intelligence and Robotics Lab - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/diffusion_policies/MUJOCO_LOG.TXT b/diffusion_policies/MUJOCO_LOG.TXT deleted file mode 100755 index 8ed41cd..0000000 --- a/diffusion_policies/MUJOCO_LOG.TXT +++ /dev/null @@ -1,30 +0,0 @@ -Mon Sep 16 23:03:39 2024 -ERROR: GLEW initalization error: Missing GL version - -Mon Sep 16 23:06:58 2024 -ERROR: GLEW initalization error: Missing GL version - -Mon Sep 16 23:20:16 2024 -ERROR: GLEW initalization error: Missing GL version - -Tue Sep 17 13:34:07 2024 -ERROR: GLEW initalization error: Missing GL version - -Tue Sep 17 14:02:52 2024 -ERROR: GLEW initalization error: Missing GL version - -Tue Sep 17 14:03:33 2024 -ERROR: GLEW initalization error: Missing GL version - -Tue Sep 17 14:06:24 2024 -ERROR: GLEW initalization error: Missing GL version - -Tue Sep 17 14:07:33 2024 -ERROR: GLEW initalization error: Missing GL version - -Tue Sep 17 14:14:39 2024 -ERROR: GLEW initalization error: Missing GL version - -Tue Sep 17 14:39:19 2024 -ERROR: GLEW initalization error: Missing GL version - diff --git a/diffusion_policies/diffusion_policies/env/__init__.py b/diffusion_policies/diffusion_policies/env/__init__.py deleted file mode 100755 index 9823d0f..0000000 --- a/diffusion_policies/diffusion_policies/env/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ - -# from .adroit import AdroitEnv -# from .metaworld import MetaWorldEnv -# from .dexart import DexArtEnv - -# from .robosuite import Robosuite3DEnv - diff --git a/diffusion_policies/diffusion_policies/env/metaworld/__init__.py b/diffusion_policies/diffusion_policies/env/metaworld/__init__.py deleted file mode 100755 index 0976f55..0000000 --- a/diffusion_policies/diffusion_policies/env/metaworld/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .metaworld_wrapper import MetaWorldEnv \ No newline at end of file diff --git a/diffusion_policies/diffusion_policies/env/metaworld/metaworld_wrapper.py b/diffusion_policies/diffusion_policies/env/metaworld/metaworld_wrapper.py deleted file mode 100755 index 589127f..0000000 --- a/diffusion_policies/diffusion_policies/env/metaworld/metaworld_wrapper.py +++ /dev/null @@ -1,534 +0,0 @@ -import torch -import gym -import numpy as np -import matplotlib.pyplot as plt -import os -import metaworld -import cv2 - -from natsort import natsorted -from termcolor import cprint -from gym import spaces -from diffusion_policies.gym_util.mujoco_point_cloud import PointCloudGenerator -from diffusion_policies.gym_util.mjpc_wrapper import point_cloud_sampling - - -TASK_BOUDNS = { - # x_min, y_min, z_min, x_max, y_max, z_max (0.4) - 'default': [-1, 0.25, -0.001, 1, 1.3, 0.37], -} - -# TASK_BOUDNS = { -# # x_min, y_min, z_min, x_max, y_max, z_max (0.4) -# 'default': [-1, 0.35, -0.001, 1, 1.3, 0.3], -# } - - -# cam names: ('topview', 'corner', 'corner2', 'corner3', 'behindGripper', 'gripperPOV') -# WRIST_CAMERA_NAME = 'gripperPOV50' # wrist camera -WRIST_CAMERA_NAME = 'gripper435' # wrist camera -WRIST_2_CAMERA_NAME = 'gripper120' # wrist camera, other side -MAIN_CAMERA_NAME = 'front30' # third-person view, front435 -SIDE_CAMERA_NAME = 'corner' -IMG_SIZE = 224 -NUM_POINTS = 512 # 512 -DEPTH_CAMERA_NAME = 'depth' -DEPTH_IMG_SIZE = 224 -DEPTH_WIDTH = 120 -DEPTH_HEIGHT = 100 -N_SIM_STEPS = 5 # make EE movement more accurate -MAX_EP_LENGTH = 200 -COLLISION_THRESHOLD = 0.01 - - -class MetaWorldEnv(gym.Env): - metadata = {"render.modes": ["rgb_array"], "video.frames_per_second": 10} - - def __init__(self, task_name, device="cuda:0", - use_point_crop=True, - reset_mode="default", - image_obs_only=False, - state_obs_only=False - ): - # print("MetaWorldEnv init", reset_mode) - super(MetaWorldEnv, self).__init__() - - if '-v2' not in task_name: - task_name = task_name + '-v2-goal-observable' - - self.env = metaworld.envs.ALL_V2_ENVIRONMENTS_GOAL_OBSERVABLE[task_name]() - self.env._freeze_rand_vec = False # this is important for domain randomization - - self.cam_id = self.env.sim.model.camera_name2id(MAIN_CAMERA_NAME) - self.pc_offset = self.env.sim.model.cam_pos[self.cam_id] - self.pc_transform = self.env.sim.model.cam_mat0[self.cam_id].reshape(3, 3) - self.pc_scale = np.array([1, 1, 1]) - - # print("after super", reset_mode) - - self.reset_mode = reset_mode - self.env.reset_mode = reset_mode - self.image_obs_only = image_obs_only - self.state_obs_only = state_obs_only - - #################################################################### - # BUG: Delete this. Otherwise wrist camera observation will crash. - # !!! this is very important, otherwise the point cloud will be wrong. - # self.env.sim.model.vis.map.znear = 0.1 - # self.env.sim.model.vis.map.zfar = 1.5 - ##################################################################### - - self.device = device - self.device_id = int(device.split(":")[-1]) - - # self.device_id = 0 - # cprint("Using device 0 for env render", 'light_red') - - # set the device of mujoco simulation - - - self.image_size = IMG_SIZE - self.depth_image_size = DEPTH_IMG_SIZE - - self.pc_generator = PointCloudGenerator(sim=self.env.sim, cam_names=[DEPTH_CAMERA_NAME], img_width=DEPTH_WIDTH, img_height=DEPTH_HEIGHT) - self.use_point_crop = use_point_crop - # cprint("[MetaWorldEnv] use_point_crop: {}".format(self.use_point_crop), "cyan") - # self.num_points = num_points # 512 - self.num_points = NUM_POINTS - - x_min, y_min, z_min, x_max, y_max, z_max = TASK_BOUDNS['default'] - self.min_bound = [x_min, y_min, z_min] - self.max_bound = [x_max, y_max, z_max] - - - # self.episode_length = self.env.max_path_length # this is 500 - self.episode_length = self._max_episode_steps = MAX_EP_LENGTH - - - self.action_space = self.env.action_space - - # cprint("[MetaWorldEnv] action_space: {}".format(self.env.action_space.shape), "yellow") - - self.obs_sensor_dim = self.get_robot_state().shape[0] - - - - self.observation_space = spaces.Dict({ - 'main_img': spaces.Box( - low=0, - high=255, - shape=(3, self.image_size, self.image_size), - dtype=np.float32 - ), - 'wrist_img': spaces.Box( - low=0, - high=255, - shape=(3, self.image_size, self.image_size), - dtype=np.float32 - ), - 'wrist2_img': spaces.Box( - low=0, - high=255, - shape=(3, self.image_size, self.image_size), - dtype=np.float32 - ), - 'side_img': spaces.Box( - low=0, - high=255, - shape=(3, self.image_size, self.image_size), - dtype=np.float32 - ), - 'depth': spaces.Box( - low=0, - high=255, - shape=(self.depth_image_size, self.depth_image_size), - dtype=np.float32 - ), - 'agent_pos': spaces.Box( - low=-np.inf, - high=np.inf, - shape=(self.obs_sensor_dim,), - dtype=np.float32 - ), - 'point_cloud': spaces.Box( - low=-np.inf, - high=np.inf, - shape=(self.num_points, 3), - dtype=np.float32 - ), - 'full_state': spaces.Box( - low=-np.inf, - high=np.inf, - shape=(20, ), - dtype=np.float32 - ), - 'cheat_state': spaces.Box( - low=-np.inf, - high=np.inf, - shape=(10, ), - dtype=np.float32 - ), - }) - - @staticmethod - def cheat_state_extractor(raw_state): - ee = raw_state[:4] - object_pos = raw_state[4:7] - target_pos = raw_state[-3:] - return np.concatenate([ee, object_pos, target_pos]) - - def get_robot_state(self): - eef_pos = self.env.get_endeff_pos() - finger_right, finger_left = ( - self.env._get_site_pos('rightEndEffector'), - self.env._get_site_pos('leftEndEffector') - ) - # finger_gap = finger_right - finger_left - finger_gap = [finger_left[1] - finger_right[1]] - # print("finger_gap:", finger_gap) - # return np.concatenate([eef_pos, finger_right, finger_left]) - return np.concatenate([eef_pos, finger_gap]) - - def get_rgb(self): - # cam names: ('topview', 'corner', 'corner2', 'corner3', 'behindGripper', 'gripperPOV') - # os.system("unset LD_PRELOAD") - main_img = self.env.sim.render(width=self.image_size, height=self.image_size, camera_name=MAIN_CAMERA_NAME, device_id=self.device_id) - - - # main_img = self.env.sim.render(width=112, height=224, camera_name=MAIN_CAMERA_NAME, device_id=self.device_id) - # main_img = cv2.resize(main_img, (self.image_size, self.image_size)) - - wrist_img = self.env.sim.render(width=320, height=640, camera_name=WRIST_CAMERA_NAME, device_id=self.device_id) - wrist_img = cv2.resize(wrist_img, (self.image_size, self.image_size)) - # print(wrist_img.shape) - - - wrist2_img = self.env.sim.render(width=self.image_size, height=self.image_size, camera_name=WRIST_2_CAMERA_NAME, device_id=self.device_id) - # side_img = self.env.sim.render(width=self.image_size, height=self.image_size, camera_name=SIDE_CAMERA_NAME, device_id=self.device_id) - - side_img = self.env.sim.render(width=DEPTH_WIDTH, height=DEPTH_HEIGHT, camera_name=DEPTH_CAMERA_NAME, device_id=self.device_id) - side_img = cv2.resize(side_img, (self.image_size, self.image_size)) - - return main_img, wrist_img, wrist2_img, side_img - - def render_high_res(self, resolution=1024): - main_img = self.env.sim.render(width=resolution, height=resolution, camera_name=MAIN_CAMERA_NAME, device_id=self.device_id) - wrist_img = self.env.sim.render(width=resolution, height=resolution, camera_name=WRIST_CAMERA_NAME, device_id=self.device_id) - wrist2_img = self.env.sim.render(width=resolution, height=resolution, camera_name=WRIST_2_CAMERA_NAME, device_id=self.device_id) - side_img = self.env.sim.render(width=resolution, height=resolution, camera_name=SIDE_CAMERA_NAME, device_id=self.device_id) - return main_img, wrist_img, wrist2_img, side_img - - - def get_point_cloud(self, use_rgb=True): - point_cloud, depth = self.pc_generator.generateCroppedPointCloud(device_id=self.device_id) # raw point cloud, Nx3 - - - if not use_rgb: - point_cloud = point_cloud[..., :3] - - - # do transform, scale, offset, and crop - if self.pc_transform is not None: - point_cloud[:, :3] = point_cloud[:, :3] @ self.pc_transform.T - if self.pc_scale is not None: - point_cloud[:, :3] = point_cloud[:, :3] * self.pc_scale - - if self.pc_offset is not None: - point_cloud[:, :3] = point_cloud[:, :3] + self.pc_offset - # import pcd_visualizer; pcd_visualizer.visualize_pointcloud(point_cloud) - # import ipdb; ipdb.set_trace() - - # self.use_point_crop = False - if self.use_point_crop: - # if self.min_bound is not None: - # mask = np.all(point_cloud[:, :3] > self.min_bound, axis=1) - # point_cloud = point_cloud[mask] - # if self.max_bound is not None: - # mask = np.all(point_cloud[:, :3] < self.max_bound, axis=1) - # point_cloud = point_cloud[mask] - - point_cloud = point_cloud[ - (point_cloud[:, 0] >= self.min_bound[0]) & (point_cloud[:, 0] <= self.max_bound[0]) & - (point_cloud[:, 1] >= self.min_bound[1]) & (point_cloud[:, 1] <= self.max_bound[1]) & - (point_cloud[:, 2] >= self.min_bound[2]) & (point_cloud[:, 2] <= self.max_bound[2])] - - - # print("y_min before fps:", min(point_cloud[:, 1])) - - # import pcd_visualizer; pcd_visualizer.visualize_pointcloud(point_cloud) - # import ipdb; ipdb.set_trace() - - # fps_start = time.time() - point_cloud = point_cloud_sampling(point_cloud, self.num_points, 'fps', self.device) - - # print("pcd after fps:", point_cloud[:3]) - # print("y_min after fps:", min(point_cloud[:, 1])) - - - # print("FPS sampling time: ", time.time() - fps_start) - - # import pcd_visualizer; pcd_visualizer.visualize_pointcloud(point_cloud) - # import ipdb; ipdb.set_trace() - - depth = depth[::-1] # flip vertically - - return point_cloud, depth - - - def get_visual_obs(self): - robot_state = self.get_robot_state() - if not self.state_obs_only: - main_img, wrist_img, wrist2_img, side_img = self.get_rgb() - else: - main_img = np.zeros((3, self.image_size, self.image_size)) - wrist_img = np.zeros((3, self.image_size, self.image_size)) - wrist2_img = np.zeros((3, self.image_size, self.image_size)) - side_img = np.zeros((3, self.image_size, self.image_size)) - - if main_img.shape[0] != 3: # make channel first - main_img = main_img.transpose(2, 0, 1) - if wrist_img.shape[0] != 3: # make channel first - wrist_img = wrist_img.transpose(2, 0, 1) - if wrist2_img.shape[0] != 3: # make channel first - wrist2_img = wrist2_img.transpose(2, 0, 1) - if side_img.shape[0] != 3: # make channel first - side_img = side_img.transpose(2, 0, 1) - - - # print("finger gap", robot_state[7] - robot_state[4]) - - if not self.image_obs_only and not self.state_obs_only: - point_cloud, depth = self.get_point_cloud() - else: - point_cloud = np.zeros((self.num_points, 3)) - depth = np.zeros((self.depth_image_size, self.depth_image_size)) - - obs_dict = { - 'main_img': main_img, - 'wrist_img': wrist_img, - 'wrist2_img': wrist2_img, - 'side_img': side_img, - 'depth': depth, - 'agent_pos': robot_state, - 'point_cloud': point_cloud, - } - return obs_dict - - - def step(self, action: np.array): - - action = np.clip(action, -1, 1) - - # import ipdb; ipdb.set_trace() - - ee_pos_before = self.get_robot_state()[:3] - ee_pos_desire = ee_pos_before + action[:3] / 100 - vfunc = np.vectorize("{:.2e}".format) - # print("action scaled: ", vfunc(action[:3] / 100)) - # cprint(f"ee_pos_desire: {ee_pos_desire}", "light_blue") - - full_state, reward, done, env_info = self.env.step(action) - self.cur_step += 1 - # print("self.cur_step: ", self.cur_step) - - blank_action = action.copy() - blank_action[:3] = 0 - # print("blank_action: ", blank_action) - for _ in range(N_SIM_STEPS): - self.env.step(blank_action) - - ee_pos_after = self.get_robot_state()[:3] - mocap_target = self.env.data.mocap_pos - - mocap_pos_diff = mocap_target - ee_pos_after - # print(mocap_pos_diff) - - if mocap_pos_diff[0][-1] < - COLLISION_THRESHOLD: - # cprint(f"Collision occurs? mocap_pos_diff: {vfunc(mocap_pos_diff)}", 'red') - # cprint(f"mocap_target: {vfunc(mocap_target)}", 'blue') - env_info['collision'] = True - done = True - else: - env_info['collision'] = False - - - # print("ee_pos_after: ", ee_pos_after) - # ee_pos_diff = ee_pos_desire - ee_pos_after - - delta_action = ee_pos_after - ee_pos_desire - # cprint(f"mocap_pos_diff: {vfunc(mocap_pos_diff)}", 'red') - # cprint(f"delta_action: {vfunc(delta_action)}", "blue") - - obs_dict = self.get_visual_obs() - obs_dict['full_state'] = full_state - obs_dict['cheat_state'] = self.cheat_state_extractor(full_state) - - - done = done or self.cur_step >= self.episode_length - - return obs_dict, reward, done, env_info - - def reset(self, config_idx=None): - self.env.reset() - full_state = self.env.reset_model(config_idx) - # if config_idx is not None: - # # print("reset with config index: ", config_idx) - # full_state = self.env.reset_model_index(config_idx) # deterministic reset model with config index - # # print("env._target_pos before env.reset:", self.env.get_target_pos()) - # else: - # full_state = self.env.reset_model() - - if full_state is None: # handling skipped demo - return None - - # raw_obs = self.env.reset() - # print("env._target_pos after env.reset:", self.env.get_target_pos()) - self.cur_step = 0 - - # make the EE movement more accurate - for _ in range(N_SIM_STEPS * 5): - self.env.step(np.zeros(4)) - - obs_dict = self.get_visual_obs() - obs_dict['full_state'] = full_state - obs_dict['cheat_state'] = self.cheat_state_extractor(full_state) - - return obs_dict - - def reset_to_state(self, object_states): - return NotImplementedError - - def seed(self, seed=None): - # self.env.seed(seed) - pass - - def set_seed(self, seed=None): - # self.env.seed(seed) - pass - - def render(self, mode='rgb_array'): - main_img, wrist_img, wrist2_img, side_img = self.get_rgb() - return main_img, wrist_img, wrist2_img, side_img - - def close(self): - pass - - def get_target_pos(self): - return self.env._target_pos - - def get_object_pos(self): - return self.env.obj_init_pos - - def get_robot_bbox(self): - eef_pos = self.env.get_endeff_pos() - bbox = np.array([[eef_pos[0] - 0.068, eef_pos[1] - 0.065, eef_pos[2] - 0.06], - [eef_pos[0] + 0.068, eef_pos[1] + 0.065, eef_pos[2] + 10]]) - - return bbox - - @staticmethod - def pcd_clip(pcd, bbox): - """ - pcd: (n, 6) - bbox: (2, 3), [[x_min, y_min, z_min], [x_max, y_max, z_max]] - """ - points_inside = np.all(pcd[:, :3] > bbox[0], axis=1) & np.all(pcd[:, :3] < bbox[1], axis=1) - points_outside = np.logical_not(points_inside) - pcd_inside = pcd[points_inside] - pcd_outside = pcd[points_outside] - assert pcd_inside.shape[0] + pcd_outside.shape[0] == pcd.shape[0] - return pcd_inside, pcd_outside - - @staticmethod - def pcd_translate_inside_bbox(pcd, bbox, trans_vec): - """ - Translate the points inside the bbox with trans_vec, leaving other points unchanged - pcd: (n, 6) - bbox: (2, 3), [[x_min, y_min, z_min], [x_max, y_max, z_max]] - trans_vec (3,) - """ - pcd_inside, pcd_outside = MetaWorldEnv.pcd_clip(pcd, bbox) - pcd_inside[:, :3] += trans_vec - return np.concatenate([pcd_inside, pcd_outside], axis=0) - - @staticmethod - def pcd_translate_outside_bbox(pcd, bbox, trans_vec): - """ - Translate the points outside the bbox with trans_vec - pcd: (n, 6) - bbox: (2, 3), [[x_min, y_min, z_min], [x_max, y_max, z_max]] - trans_vec (3,) - """ - pcd_inside, pcd_outside = MetaWorldEnv.pcd_clip(pcd, bbox) - pcd_outside[:, :3] += trans_vec - return np.concatenate([pcd_inside, pcd_outside], axis=0) - - - -if __name__ == "__main__": - import argparse - parser = argparse.ArgumentParser() - parser.add_argument('--env', type=str, default='assembly') - args = parser.parse_args() - env_name = args.env - # env_name = args.env + '-v2' - - # env = MetaWorldEnv(env_name) - # from metaworld.policies import SawyerAssemblyV2Policy - # policy = SawyerAssemblyV2Policy() - - env = MetaWorldEnv("handle-press-side-spatial") - from metaworld.policies import SawyerHandlePressSideSpatialV2Policy - policy = SawyerHandlePressSideSpatialV2Policy() - - import pcd_visualizer - vis = pcd_visualizer.pcd_visualizer() - # def visualize_env(env, reset_mode): - # env.env.reset_mode = reset_mode - # obs = env.reset() - # rgb = env.get_rgb() - # plt.imsave(f"debug/{reset_mode}.png", rgb) - - # pcd, _ = env.get_point_cloud() - # vis.save_visualization_to_file(pcd, f"debug/{reset_mode}.html") - - # reset_modes = ["low", "high", "single"] - # for reset_mode in reset_modes: - # visualize_env(env, reset_mode) - - - target_pos = env.get_target_pos() - print("target_pos: ", target_pos) - - ee_pos = env.get_robot_state()[:3] - print("ee_pos: ", ee_pos) - - pcd, _ = env.get_point_cloud() - bbox_robot = env.get_robot_bbox() - - # trans_vec = np.array([0.1, 0.1, 0]) - - trans_vec = np.array([0., 0., 0]) - - # pcd_visualizer.visualize_pointcloud(pcd) - pcd_visualizer.visualize_pointcloud(env.pcd_translate_outside_bbox(pcd, bbox_robot, trans_vec)) - - - # print(pcd[0].shape) - - - - for i in range(10): - action = env.action_space.sample() - # action = policy.get_action(obs) - obs, reward, done, info = env.step(action) - env.get_point_cloud() - main_img, wrist_img = env.get_rgb() - plt.imsave("main_camera.png", main_img) - plt.imsave("wrist_camera.png", wrist_img) - # time.sleep(0.5) - print(i, reward, done) - if done: - break - env.close() - cprint("MetaWorld env successfully closed", "green") diff --git a/diffusion_policies/diffusion_policies/env/robosuite/__init__.py b/diffusion_policies/diffusion_policies/env/robosuite/__init__.py deleted file mode 100755 index 9be4a1f..0000000 --- a/diffusion_policies/diffusion_policies/env/robosuite/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .robosuite_wrapper import Robosuite3DEnv \ No newline at end of file diff --git a/diffusion_policies/diffusion_policies/env/robosuite/robosuite_wrapper.py b/diffusion_policies/diffusion_policies/env/robosuite/robosuite_wrapper.py deleted file mode 100755 index d9e1375..0000000 --- a/diffusion_policies/diffusion_policies/env/robosuite/robosuite_wrapper.py +++ /dev/null @@ -1,199 +0,0 @@ -import gym -from gym import spaces -import numpy as np -import matplotlib.pyplot as plt -import open3d as o3d -from scipy.spatial.transform import Rotation as R -from diffusion_policies.gym_util.mjpc_wrapper import point_cloud_sampling - -from robomimic.envs.env_robosuite import EnvRobosuite -import robomimic.utils.env_utils as EnvUtils -import robomimic.utils.obs_utils as ObsUtils -import robomimic.utils.file_utils as FileUtils -from robosuite.controllers import load_composite_controller_config -from pcd_visualizer import visualize_pointcloud - - -TASK_BOUDNS = { - # x_min, y_min, z_min, x_max, y_max, z_max - 'Coffee': [-0.4, -0.5, 0.810, 0.19, 0.5, 1.15], - 'Kitchen': [-0.5, -0.5, 0.912, 0.2, 0.5, 1.3], - 'HammerCleanup': [-0.4, -0.5, 0.91, 0.19, 0.5, 1.3], - # 'MugCleanup': [-0.4, -0.5, 0.91, 0.19, 0.5, 1.3], - 'ThreePieceAssembly': [-0.4, -0.5, 0.81, 0.36, 0.5, 1.3], -} - -SINGLE_CEMERA_NAME = { - 'Coffee': 'myfrontlow', - 'Kitchen': 'myfronthigh', - 'HammerCleanup': 'myfronthigh', - 'ThreePieceAssembly': 'myfrontlow', -} - -# MULTI_VIEW_CAMS = ['birdview', 'agentview', 'left', 'right', 'robot0_eye_in_hand'] -MULTI_VIEW_CAMS = ['left', 'right', 'agentview'] -SINGLE_VIEW_CAMS = ['myfront'] -MULTI_VIEW_NUM_POINTS = 1024 -SINGLE_VIEW_NUM_POINTS = 512 -USE_CROP = True -N_CONTROL_STEPS = 5 # 2 - - -class Robosuite3DEnv(gym.Env): - def __init__(self, source_demo_path, - multi_view=False, - cam_width=128, - cam_height=128, - render=False, - render_cam="myfront", - support_osc_control=False, - ): - if multi_view: - raise NotImplementedError("Multi-view not supported.") - else: - self.n_points = SINGLE_VIEW_NUM_POINTS - - - dummy_spec = dict(obs=dict(low_dim=["robot0_eef_pos"], rgb=[],),) - ObsUtils.initialize_obs_utils_with_obs_specs(obs_modality_specs=dummy_spec) - env_meta = FileUtils.get_env_metadata_from_dataset(source_demo_path) - print("EnvUtils.is_robosuite_env(env_meta)", EnvUtils.is_robosuite_env(env_meta)) - if not support_osc_control: - controller_config = load_composite_controller_config( - controller='WHOLE_BODY_MINK_IK', - robot="Panda", - ) - env_meta["env_kwargs"]["controller_configs"] = controller_config - - self.task_name = env_meta["env_name"].split("_")[0] - if self.task_name not in TASK_BOUDNS.keys(): - raise ValueError(f"Task {self.task_name} not supported.") - env_meta["env_name"] = self.task_name + "_D0" - - self.cam_width = cam_width - self.cam_height = cam_height - env_meta["env_kwargs"]["camera_heights"] = cam_height - env_meta["env_kwargs"]["camera_widths"] = cam_width - env_meta["env_kwargs"]["render_camera"] = render_cam - - - if multi_view: - self.cam_names = MULTI_VIEW_CAMS - self.n_points = MULTI_VIEW_NUM_POINTS - else: - self.cam_names = [SINGLE_CEMERA_NAME[self.task_name]] - env_meta["env_kwargs"]["camera_names"] = self.cam_names - - self.env = EnvUtils.create_env_from_metadata(env_meta=env_meta, render=render, - use_image_obs=True, use_depth_obs=True) - - self.action_space = spaces.Box(low=-np.inf, high=np.inf, shape=(7,), dtype=np.float32) - self.observation_space = spaces.Dict({ - "agent_pos": spaces.Box(low=-np.inf, high=np.inf, shape=(7,), dtype=np.float32), - "point_cloud": spaces.Box(low=-np.inf, high=np.inf, shape=(self.n_points, 6), dtype=np.float32), - }) - - @staticmethod - def _convert_state_quat_to_action_rotvec(state_quat): - """ - Handle confusing rotation transform. - - Args: - state_quat (np.array): 4-element quaternion representing the state - - Returns: - action_rotvec (np.array): 3-element rotation vector representing the action - """ - state_mat = R.from_quat(state_quat).as_matrix() - T = R.from_rotvec([0, 0, -1.5707]).as_matrix() - action_mat = state_mat @ T - return R.from_matrix(action_mat).as_rotvec() - - @staticmethod - def _pcd_crop(pcd, bounds): - mask = np.all(pcd[:, :3] > bounds[:3], axis=1) & np.all(pcd[:, :3] < bounds[3:], axis=1) - return pcd[mask] - - def process_obs_dict(self, obs_dict): - keys = obs_dict.keys() - # print("keys:", keys) - processed_obs = { - "agent_pos": np.zeros(7), - "point_cloud": np.zeros((self.n_points, 6)), - } - - # process robot state - robot_keys = ["robot0_eef_pos", "robot0_eef_quat", "robot0_gripper_qpos"] - if all([k in keys for k in robot_keys]): - pos = obs_dict["robot0_eef_pos"] - rot = self._convert_state_quat_to_action_rotvec(obs_dict["robot0_eef_quat"]) - gripper = obs_dict["robot0_gripper_qpos"][0] - obs_dict["robot0_gripper_qpos"][1] - robot_state = np.concatenate([pos, rot, [gripper]]) - processed_obs["agent_pos"] = robot_state - - # process point cloud - pcd_list = [] - for cam_name in self.cam_names: - rgb_name = cam_name + "_image" - depth_name = cam_name + "_depth" - if all([k in keys for k in [rgb_name, depth_name]]): - # print("cam_name:", cam_name) - rgb = obs_dict[rgb_name] - depth = obs_dict[depth_name] - pcd = self.get_pcd_from_rgbd(cam_name, rgb, depth) - pcd_list.append(pcd) - else: - break - if len(pcd_list) > 0: - pcd = np.concatenate(pcd_list, axis=0) - if USE_CROP: - pcd = self._pcd_crop(pcd, TASK_BOUDNS[self.task_name]) - pcd = point_cloud_sampling(pcd, self.n_points) - processed_obs["point_cloud"] = pcd - - # import pcd_visualizer - # pcd_visualizer.visualize_pointcloud(pcd) - - return processed_obs - - def get_pcd_from_rgbd(self, cam_name, rgb, depth): - def verticalFlip(img): - return np.flip(img, axis=0) - - def get_o3d_cammat(): - cam_mat = self.env.get_camera_intrinsic_matrix(cam_name, self.cam_width, self.cam_height) - cx = cam_mat[0,2] - fx = cam_mat[0,0] - cy = cam_mat[1,2] - fy = cam_mat[1,1] - return o3d.camera.PinholeCameraIntrinsic(self.cam_width, self.cam_height, fx, fy, cx, cy) - - rgb = verticalFlip(rgb) - depth = self.env.get_real_depth_map(verticalFlip(depth)) - o3d_cammat = get_o3d_cammat() - o3d_depth = o3d.geometry.Image(depth) - o3d_pcd = o3d.geometry.PointCloud.create_from_depth_image(o3d_depth, o3d_cammat) - world_T_cam = self.env.get_camera_extrinsic_matrix(cam_name) - o3d_pcd.transform(world_T_cam) - points = np.asarray(o3d_pcd.points) - colors = rgb.reshape(-1, 3) - pcd = np.concatenate([points, colors], axis=1) - return pcd - - def reset(self): - obs_dict = self.env.reset() - return self.process_obs_dict(obs_dict) - - def reset_to(self, state): - return self.env.reset_to(state) - - def step(self, action): - for _ in range(N_CONTROL_STEPS): - obs_dict, r, done, info = self.env.step(action) - return self.process_obs_dict(obs_dict), r, done, info - - def render(self, **kwargs): - return self.env.render(**kwargs) - - def check_success(self): - return self.env.env._check_success() \ No newline at end of file diff --git a/diffusion_policies/eval.py b/diffusion_policies/eval.py deleted file mode 100755 index d0a7762..0000000 --- a/diffusion_policies/eval.py +++ /dev/null @@ -1,37 +0,0 @@ -import sys -# use line-buffering for both stdout and stderr -sys.stdout = open(sys.stdout.fileno(), mode='w', buffering=1) -sys.stderr = open(sys.stderr.fileno(), mode='w', buffering=1) - -import hydra -from omegaconf import OmegaConf -import pathlib -from diffusion_policies.workspace.base_workspace import BaseWorkspace -import os -os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com' - -os.environ['WANDB_SILENT'] = "True" - -# allows arbitrary python code execution in configs using the ${eval:''} resolver -OmegaConf.register_new_resolver("eval", eval, replace=True) - - -@hydra.main( - version_base=None, - config_path=str(pathlib.Path(__file__).parent.joinpath( - 'diffusion_policies','config')) -) -def main(cfg: OmegaConf): - # resolve immediately so all the ${now:} resolvers - # will use the same time. - OmegaConf.resolve(cfg) - - # import ipdb; ipdb.set_trace() - # cfg.task.env_runner.eval_episodes = 100 - - cls = hydra.utils.get_class(cfg._target_) - workspace: BaseWorkspace = cls(cfg) - workspace.eval() - -if __name__ == "__main__": - main() diff --git a/diffusion_policies/setup.py b/diffusion_policies/setup.py deleted file mode 100755 index 2573cfa..0000000 --- a/diffusion_policies/setup.py +++ /dev/null @@ -1,6 +0,0 @@ -from setuptools import setup, find_packages - -setup( - name='diffusion_policies', - packages=find_packages(), -) diff --git a/diffusion_policies/train.py b/diffusion_policies/train.py deleted file mode 100755 index e91c3e8..0000000 --- a/diffusion_policies/train.py +++ /dev/null @@ -1,46 +0,0 @@ -""" -Usage: -Training: -python train.py --config-name=train_diffusion_lowdim_workspace -""" -import os -os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com' -from diffusion_policies.workspace.base_workspace import BaseWorkspace -import pathlib -from omegaconf import OmegaConf -import hydra -from termcolor import cprint - -import sys -# use line-buffering for both stdout and stderr -sys.stdout = open(sys.stdout.fileno(), mode='w', buffering=1) -sys.stderr = open(sys.stderr.fileno(), mode='w', buffering=1) - -os.environ['WANDB_SILENT'] = "True" - -# allow for detecting segmentation fault -# import faulthandler -# faulthandler.enable() -# cprint("[fault handler enabled]", "cyan") - -# allows arbitrary python code execution in configs using the ${eval:''} resolver -OmegaConf.register_new_resolver("eval", eval, replace=True) - - -@hydra.main( - version_base=None, - config_path=str(pathlib.Path(__file__).parent.joinpath( - 'diffusion_policies', 'config')) -) -def main(cfg: OmegaConf): - # resolve immediately so all the ${now:} resolvers - # will use the same time. - OmegaConf.resolve(cfg) - - cls = hydra.utils.get_class(cfg._target_) - workspace: BaseWorkspace = cls(cfg) - workspace.run() - - -if __name__ == "__main__": - main() diff --git a/diffusion_policies/train.sh b/diffusion_policies/train.sh deleted file mode 100755 index ce8d11e..0000000 --- a/diffusion_policies/train.sh +++ /dev/null @@ -1,22 +0,0 @@ -demo=${1} -algo=${2} -task=${3} -seed=${4} - -data_root=../data -exp_name=${demo}-${algo}-seed${seed} -run_dir=${data_root}/ckpts/${exp_name} - -zarr_path=${data_root}/datasets/demogen/${demo}.zarr - -export HYDRA_FULL_ERROR=1 -python -W ignore train.py --config-name=${algo}.yaml \ - task=${task} \ - hydra.run.dir=${run_dir} \ - training.debug=False \ - training.seed=${seed} \ - training.device="cuda:0" \ - exp_name=${exp_name} \ - logging.mode=offline \ - training.num_epochs=1 \ - task.dataset.zarr_path=${zarr_path} \ No newline at end of file diff --git a/pics/method.png b/pics/method.png deleted file mode 100644 index 8c78930..0000000 Binary files a/pics/method.png and /dev/null differ diff --git a/pics/teaser.png b/pics/teaser.png deleted file mode 100644 index d0bc25b..0000000 Binary files a/pics/teaser.png and /dev/null differ