cv-suite 0.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (309) hide show
  1. cv_suite-0.0.1.dist-info/METADATA +115 -0
  2. cv_suite-0.0.1.dist-info/RECORD +309 -0
  3. cv_suite-0.0.1.dist-info/WHEEL +5 -0
  4. cv_suite-0.0.1.dist-info/entry_points.txt +2 -0
  5. cv_suite-0.0.1.dist-info/licenses/LICENSE +21 -0
  6. cv_suite-0.0.1.dist-info/top_level.txt +1 -0
  7. cvsuite/__init__.py +1 -0
  8. cvsuite/branch_cli.py +158 -0
  9. cvsuite/classify/__init__.py +1 -0
  10. cvsuite/classify/cli.py +119 -0
  11. cvsuite/classify/core/__init__.py +1 -0
  12. cvsuite/classify/core/io.py +637 -0
  13. cvsuite/classify/output/__init__.py +1 -0
  14. cvsuite/classify/output/commands/__init__.py +1 -0
  15. cvsuite/classify/output/commands/to_class_dir.py +108 -0
  16. cvsuite/classify/tests/__init__.py +1 -0
  17. cvsuite/classify/tests/test_output_stats.py +88 -0
  18. cvsuite/classify/tests/test_run_command.py +928 -0
  19. cvsuite/classify/transform/__init__.py +1 -0
  20. cvsuite/classify/transform/commands/__init__.py +1 -0
  21. cvsuite/classify/transform/commands/infer.py +15 -0
  22. cvsuite/classify/transform/commands/sample.py +15 -0
  23. cvsuite/classify/transform/core/__init__.py +1 -0
  24. cvsuite/classify/transform/core/infer.py +80 -0
  25. cvsuite/classify/transform/core/sample.py +199 -0
  26. cvsuite/cli.py +61 -0
  27. cvsuite/common/__init__.py +1 -0
  28. cvsuite/common/cache/__init__.py +1 -0
  29. cvsuite/common/cache/commands/__init__.py +1 -0
  30. cvsuite/common/cache/commands/list.py +121 -0
  31. cvsuite/common/cache/commands/path.py +30 -0
  32. cvsuite/common/cache/commands/purge.py +87 -0
  33. cvsuite/common/cache/core.py +255 -0
  34. cvsuite/common/cli.py +12 -0
  35. cvsuite/common/core/__init__.py +58 -0
  36. cvsuite/common/core/enums.py +43 -0
  37. cvsuite/common/core/records.py +144 -0
  38. cvsuite/common/core/types.py +235 -0
  39. cvsuite/common/core/utils.py +144 -0
  40. cvsuite/common/fm/__init__.py +5 -0
  41. cvsuite/common/fm/core/__init__.py +34 -0
  42. cvsuite/common/fm/core/export.py +11 -0
  43. cvsuite/common/fm/core/paths.py +256 -0
  44. cvsuite/common/fm/core/prompt_utils.py +89 -0
  45. cvsuite/common/fm/core/runner.py +575 -0
  46. cvsuite/common/fm/core/sam3_patch.py +88 -0
  47. cvsuite/common/fm/core/utils.py +898 -0
  48. cvsuite/common/fm/providers/__init__.py +41 -0
  49. cvsuite/common/fm/providers/_template.py +79 -0
  50. cvsuite/common/fm/providers/api/__init__.py +1 -0
  51. cvsuite/common/fm/providers/api/openrouter_common.py +103 -0
  52. cvsuite/common/fm/providers/api/openrouter_gen.py +230 -0
  53. cvsuite/common/fm/providers/api/openrouter_vlm.py +108 -0
  54. cvsuite/common/fm/providers/base.py +857 -0
  55. cvsuite/common/fm/providers/bases/__init__.py +58 -0
  56. cvsuite/common/fm/providers/bases/classification.py +92 -0
  57. cvsuite/common/fm/providers/bases/create.py +196 -0
  58. cvsuite/common/fm/providers/bases/diffusion.py +594 -0
  59. cvsuite/common/fm/providers/bases/edit.py +201 -0
  60. cvsuite/common/fm/providers/bases/edit_custom.py +566 -0
  61. cvsuite/common/fm/providers/bases/gen.py +350 -0
  62. cvsuite/common/fm/providers/bases/ground.py +141 -0
  63. cvsuite/common/fm/providers/bases/ocr.py +101 -0
  64. cvsuite/common/fm/providers/bases/qwen_image.py +131 -0
  65. cvsuite/common/fm/providers/bases/record_image.py +100 -0
  66. cvsuite/common/fm/providers/bases/vlm.py +504 -0
  67. cvsuite/common/fm/providers/classify/__init__.py +1 -0
  68. cvsuite/common/fm/providers/classify/clip.py +264 -0
  69. cvsuite/common/fm/providers/classify/deep_orientation.py +259 -0
  70. cvsuite/common/fm/providers/classify/siglip2.py +261 -0
  71. cvsuite/common/fm/providers/create/__init__.py +1 -0
  72. cvsuite/common/fm/providers/create/flux.py +54 -0
  73. cvsuite/common/fm/providers/create/qwen_image.py +61 -0
  74. cvsuite/common/fm/providers/create/sana.py +49 -0
  75. cvsuite/common/fm/providers/create/stable_diffusion.py +71 -0
  76. cvsuite/common/fm/providers/edit/__init__.py +1 -0
  77. cvsuite/common/fm/providers/edit/dim_edit.py +1205 -0
  78. cvsuite/common/fm/providers/edit/flux2_klein.py +50 -0
  79. cvsuite/common/fm/providers/edit/instruct_pix2pix.py +68 -0
  80. cvsuite/common/fm/providers/edit/ovis_u1_3b.py +44 -0
  81. cvsuite/common/fm/providers/edit/qwen_image_edit.py +60 -0
  82. cvsuite/common/fm/providers/edit/step1x_edit.py +48 -0
  83. cvsuite/common/fm/providers/ground/__init__.py +1 -0
  84. cvsuite/common/fm/providers/ground/gdino.py +224 -0
  85. cvsuite/common/fm/providers/ground/gsam.py +408 -0
  86. cvsuite/common/fm/providers/ground/llmdet.py +288 -0
  87. cvsuite/common/fm/providers/ground/locate_anything.py +424 -0
  88. cvsuite/common/fm/providers/ground/rex_omni.py +297 -0
  89. cvsuite/common/fm/providers/ground/sam3.py +468 -0
  90. cvsuite/common/fm/providers/ground/yolo_e.py +358 -0
  91. cvsuite/common/fm/providers/ocr/__init__.py +1 -0
  92. cvsuite/common/fm/providers/ocr/paddleocr.py +235 -0
  93. cvsuite/common/fm/providers/registry.py +321 -0
  94. cvsuite/common/fm/providers/setup_venv/blip.sh +33 -0
  95. cvsuite/common/fm/providers/setup_venv/clip.sh +25 -0
  96. cvsuite/common/fm/providers/setup_venv/cogvlm.sh +33 -0
  97. cvsuite/common/fm/providers/setup_venv/deep_orientation.sh +23 -0
  98. cvsuite/common/fm/providers/setup_venv/dim_edit.sh +72 -0
  99. cvsuite/common/fm/providers/setup_venv/flux.sh +51 -0
  100. cvsuite/common/fm/providers/setup_venv/flux2_klein.sh +51 -0
  101. cvsuite/common/fm/providers/setup_venv/gdino.sh +24 -0
  102. cvsuite/common/fm/providers/setup_venv/gsam.sh +48 -0
  103. cvsuite/common/fm/providers/setup_venv/instruct_pix2pix.sh +51 -0
  104. cvsuite/common/fm/providers/setup_venv/internvl.sh +33 -0
  105. cvsuite/common/fm/providers/setup_venv/llava.sh +33 -0
  106. cvsuite/common/fm/providers/setup_venv/llmdet.sh +40 -0
  107. cvsuite/common/fm/providers/setup_venv/locate_anything.sh +47 -0
  108. cvsuite/common/fm/providers/setup_venv/minicpm_v.sh +34 -0
  109. cvsuite/common/fm/providers/setup_venv/ovis_u1_3b.sh +49 -0
  110. cvsuite/common/fm/providers/setup_venv/paddleocr.sh +57 -0
  111. cvsuite/common/fm/providers/setup_venv/paligemma.sh +33 -0
  112. cvsuite/common/fm/providers/setup_venv/qwen.sh +33 -0
  113. cvsuite/common/fm/providers/setup_venv/qwen_image.sh +51 -0
  114. cvsuite/common/fm/providers/setup_venv/qwen_image_edit.sh +51 -0
  115. cvsuite/common/fm/providers/setup_venv/rex_omni.sh +27 -0
  116. cvsuite/common/fm/providers/setup_venv/sam3.sh +63 -0
  117. cvsuite/common/fm/providers/setup_venv/sana.sh +48 -0
  118. cvsuite/common/fm/providers/setup_venv/siglip2.sh +25 -0
  119. cvsuite/common/fm/providers/setup_venv/stable_diffusion.sh +51 -0
  120. cvsuite/common/fm/providers/setup_venv/step1x_edit.sh +48 -0
  121. cvsuite/common/fm/providers/setup_venv/yolo_e.sh +24 -0
  122. cvsuite/common/fm/providers/vlm/__init__.py +1 -0
  123. cvsuite/common/fm/providers/vlm/blip.py +154 -0
  124. cvsuite/common/fm/providers/vlm/cogvlm.py +189 -0
  125. cvsuite/common/fm/providers/vlm/internvl.py +839 -0
  126. cvsuite/common/fm/providers/vlm/llava.py +170 -0
  127. cvsuite/common/fm/providers/vlm/minicpm_v.py +319 -0
  128. cvsuite/common/fm/providers/vlm/paligemma.py +173 -0
  129. cvsuite/common/fm/providers/vlm/qwen.py +203 -0
  130. cvsuite/common/io/__init__.py +27 -0
  131. cvsuite/common/io/class_dir.py +535 -0
  132. cvsuite/common/io/coco.py +471 -0
  133. cvsuite/common/io/common.py +385 -0
  134. cvsuite/common/io/flat.py +60 -0
  135. cvsuite/common/io/flat_vlm_json.py +230 -0
  136. cvsuite/common/io/labelme.py +490 -0
  137. cvsuite/common/io/router.py +166 -0
  138. cvsuite/common/io/semseg_mask.py +110 -0
  139. cvsuite/common/io/shards_vlm.py +250 -0
  140. cvsuite/common/io/vqa_style.py +467 -0
  141. cvsuite/common/io/yolo.py +667 -0
  142. cvsuite/common/stats/__init__.py +20 -0
  143. cvsuite/common/stats/attach.py +11 -0
  144. cvsuite/common/stats/builders.py +213 -0
  145. cvsuite/common/stats/utils.py +168 -0
  146. cvsuite/common/tests/__init__.py +1 -0
  147. cvsuite/common/tests/test_base_model.py +240 -0
  148. cvsuite/common/tests/test_cache_commands.py +164 -0
  149. cvsuite/common/tests/test_contracts.py +37 -0
  150. cvsuite/common/tests/test_device_utils.py +475 -0
  151. cvsuite/common/tests/test_fm_hub_share.py +223 -0
  152. cvsuite/common/tests/test_fm_model_bases.py +450 -0
  153. cvsuite/common/tests/test_fm_paths.py +176 -0
  154. cvsuite/common/tests/test_fm_prompt_utils.py +49 -0
  155. cvsuite/common/tests/test_gen_model.py +152 -0
  156. cvsuite/common/tests/test_gen_wrappers.py +799 -0
  157. cvsuite/common/tests/test_grounding_wrappers.py +1331 -0
  158. cvsuite/common/tests/test_internvl_model.py +904 -0
  159. cvsuite/common/tests/test_minicpm_v_model.py +350 -0
  160. cvsuite/common/tests/test_model_specs.py +43 -0
  161. cvsuite/common/tests/test_openrouter_providers.py +134 -0
  162. cvsuite/common/tests/test_paddleocr_model.py +81 -0
  163. cvsuite/common/tests/test_qwen_model.py +404 -0
  164. cvsuite/common/tests/test_runner.py +851 -0
  165. cvsuite/common/tests/test_siglip2_model.py +19 -0
  166. cvsuite/common/tests/test_stats.py +163 -0
  167. cvsuite/gen/__init__.py +1 -0
  168. cvsuite/gen/cli.py +111 -0
  169. cvsuite/gen/core/__init__.py +22 -0
  170. cvsuite/gen/core/batch.py +275 -0
  171. cvsuite/gen/core/router.py +16 -0
  172. cvsuite/gen/output/__init__.py +1 -0
  173. cvsuite/gen/output/commands/__init__.py +1 -0
  174. cvsuite/gen/output/commands/to_dst.py +183 -0
  175. cvsuite/gen/tests/__init__.py +1 -0
  176. cvsuite/gen/tests/test_commands.py +1024 -0
  177. cvsuite/gen/tests/test_output_stats.py +45 -0
  178. cvsuite/gen/transform/__init__.py +1 -0
  179. cvsuite/gen/transform/commands/__init__.py +1 -0
  180. cvsuite/gen/transform/commands/create.py +47 -0
  181. cvsuite/gen/transform/commands/edit.py +58 -0
  182. cvsuite/gen/transform/core/__init__.py +3 -0
  183. cvsuite/gen/transform/core/runtime.py +199 -0
  184. cvsuite/label/__init__.py +1 -0
  185. cvsuite/label/cli.py +183 -0
  186. cvsuite/label/core/annotate/__init__.py +16 -0
  187. cvsuite/label/core/annotate/letterbox.py +39 -0
  188. cvsuite/label/core/annotate/overlay.py +316 -0
  189. cvsuite/label/core/annotate/preview.py +134 -0
  190. cvsuite/label/core/annotate/utils.py +17 -0
  191. cvsuite/label/core/audit.py +86 -0
  192. cvsuite/label/core/crops.py +117 -0
  193. cvsuite/label/core/router.py +260 -0
  194. cvsuite/label/core/schema.py +136 -0
  195. cvsuite/label/output/__init__.py +1 -0
  196. cvsuite/label/output/commands/__init__.py +1 -0
  197. cvsuite/label/output/commands/audit.py +45 -0
  198. cvsuite/label/output/commands/inspect.py +54 -0
  199. cvsuite/label/output/commands/to_coco.py +71 -0
  200. cvsuite/label/output/commands/to_labelme.py +49 -0
  201. cvsuite/label/output/commands/to_results.py +99 -0
  202. cvsuite/label/output/commands/to_yolo.py +105 -0
  203. cvsuite/label/output/common.py +68 -0
  204. cvsuite/label/tests/test_cli.py +298 -0
  205. cvsuite/label/tests/test_filter_transform.py +217 -0
  206. cvsuite/label/tests/test_full_manual.py +226 -0
  207. cvsuite/label/tests/test_ground_transform.py +756 -0
  208. cvsuite/label/tests/test_label_commands.py +1037 -0
  209. cvsuite/label/tests/test_multisrc.py +356 -0
  210. cvsuite/label/tests/test_output_stats.py +59 -0
  211. cvsuite/label/tests/test_preview.py +58 -0
  212. cvsuite/label/tests/test_sample_transform.py +87 -0
  213. cvsuite/label/tests/test_to_coco.py +70 -0
  214. cvsuite/label/tests/test_yolo_layouts.py +34 -0
  215. cvsuite/label/transform/filter/__init__.py +2 -0
  216. cvsuite/label/transform/filter/commands/__init__.py +2 -0
  217. cvsuite/label/transform/filter/commands/apply.py +118 -0
  218. cvsuite/label/transform/filter/commands/logistic_opt.py +191 -0
  219. cvsuite/label/transform/filter/commands/run.py +30 -0
  220. cvsuite/label/transform/filter/commands/threshold.py +40 -0
  221. cvsuite/label/transform/filter/core/__init__.py +42 -0
  222. cvsuite/label/transform/filter/core/config.py +142 -0
  223. cvsuite/label/transform/filter/core/features.py +207 -0
  224. cvsuite/label/transform/filter/core/filters.py +376 -0
  225. cvsuite/label/transform/filter/core/optimizer.py +480 -0
  226. cvsuite/label/transform/filter/core/records.py +220 -0
  227. cvsuite/label/transform/filter/core/types.py +86 -0
  228. cvsuite/label/transform/filter/core/utils.py +107 -0
  229. cvsuite/label/transform/filter/core/utils_optimizer.py +777 -0
  230. cvsuite/label/transform/ground/__init__.py +1 -0
  231. cvsuite/label/transform/ground/commands/__init__.py +1 -0
  232. cvsuite/label/transform/ground/commands/run.py +137 -0
  233. cvsuite/label/transform/ground/core.py +543 -0
  234. cvsuite/label/transform/ocr/__init__.py +1 -0
  235. cvsuite/label/transform/ocr/commands/__init__.py +1 -0
  236. cvsuite/label/transform/ocr/commands/run.py +45 -0
  237. cvsuite/label/transform/ops/__init__.py +1 -0
  238. cvsuite/label/transform/ops/commands/__init__.py +1 -0
  239. cvsuite/label/transform/ops/commands/crop_dets.py +46 -0
  240. cvsuite/label/transform/ops/commands/inverse_crop_dets.py +20 -0
  241. cvsuite/label/transform/ops/commands/make_negatives.py +109 -0
  242. cvsuite/label/transform/ops/commands/rebox.py +51 -0
  243. cvsuite/label/transform/ops/commands/run.py +32 -0
  244. cvsuite/label/transform/ops/core/crop_dets.py +698 -0
  245. cvsuite/label/transform/ops/core/inverse_crop_dets.py +448 -0
  246. cvsuite/label/transform/ops/core/negatives.py +53 -0
  247. cvsuite/label/transform/ops/core/rebox.py +29 -0
  248. cvsuite/label/transform/sample/__init__.py +1 -0
  249. cvsuite/label/transform/sample/commands/__init__.py +1 -0
  250. cvsuite/label/transform/sample/commands/run.py +71 -0
  251. cvsuite/prep/__init__.py +1 -0
  252. cvsuite/prep/cli.py +42 -0
  253. cvsuite/prep/commands/arrange.py +144 -0
  254. cvsuite/prep/commands/orient.py +91 -0
  255. cvsuite/prep/commands/process.py +171 -0
  256. cvsuite/prep/commands/sample.py +84 -0
  257. cvsuite/prep/core/actions.py +62 -0
  258. cvsuite/prep/core/arrange/core.py +39 -0
  259. cvsuite/prep/core/arrange/ops.py +260 -0
  260. cvsuite/prep/core/config.py +81 -0
  261. cvsuite/prep/core/fs.py +119 -0
  262. cvsuite/prep/core/logging.py +17 -0
  263. cvsuite/prep/core/manifest.py +46 -0
  264. cvsuite/prep/core/orient/clip.py +62 -0
  265. cvsuite/prep/core/orient/core.py +328 -0
  266. cvsuite/prep/core/orient/deep_orientation.py +102 -0
  267. cvsuite/prep/core/process/core.py +116 -0
  268. cvsuite/prep/core/process/ops.py +168 -0
  269. cvsuite/prep/core/process/vsample.py +132 -0
  270. cvsuite/prep/core/sample/core.py +154 -0
  271. cvsuite/prep/tests/__init__.py +1 -0
  272. cvsuite/prep/tests/manual_flow.py +136 -0
  273. cvsuite/prep/tests/test_fs.py +50 -0
  274. cvsuite/prep/tests/test_incremental_arrange_process.py +237 -0
  275. cvsuite/prep/tests/test_orient_command.py +162 -0
  276. cvsuite/prep/tests/test_sample_command.py +113 -0
  277. cvsuite/tests/__init__.py +1 -0
  278. cvsuite/tests/test_cli_structure.py +258 -0
  279. cvsuite/vlm/__init__.py +1 -0
  280. cvsuite/vlm/cli.py +160 -0
  281. cvsuite/vlm/core/__init__.py +5 -0
  282. cvsuite/vlm/core/adapters/__init__.py +8 -0
  283. cvsuite/vlm/core/adapters/flat_json_io.py +153 -0
  284. cvsuite/vlm/core/adapters/images_io.py +38 -0
  285. cvsuite/vlm/core/adapters/shards_io.py +220 -0
  286. cvsuite/vlm/core/adapters/vqa_style_io.py +460 -0
  287. cvsuite/vlm/core/inspect.py +133 -0
  288. cvsuite/vlm/core/io.py +332 -0
  289. cvsuite/vlm/core/router.py +61 -0
  290. cvsuite/vlm/output/__init__.py +1 -0
  291. cvsuite/vlm/output/commands/__init__.py +1 -0
  292. cvsuite/vlm/output/commands/inspect.py +21 -0
  293. cvsuite/vlm/output/commands/to_json.py +55 -0
  294. cvsuite/vlm/output/commands/to_shards.py +66 -0
  295. cvsuite/vlm/output/commands/to_vqa_style.py +55 -0
  296. cvsuite/vlm/output/common.py +110 -0
  297. cvsuite/vlm/tests/__init__.py +2 -0
  298. cvsuite/vlm/tests/test_commands.py +756 -0
  299. cvsuite/vlm/tests/test_map_answers.py +166 -0
  300. cvsuite/vlm/tests/test_output_stats.py +50 -0
  301. cvsuite/vlm/transform/__init__.py +1 -0
  302. cvsuite/vlm/transform/commands/__init__.py +1 -0
  303. cvsuite/vlm/transform/commands/ask.py +17 -0
  304. cvsuite/vlm/transform/commands/caption.py +16 -0
  305. cvsuite/vlm/transform/commands/map_answers.py +23 -0
  306. cvsuite/vlm/transform/commands/vqa.py +17 -0
  307. cvsuite/vlm/transform/core/__init__.py +1 -0
  308. cvsuite/vlm/transform/core/map_answers.py +355 -0
  309. cvsuite/vlm/transform/core/runtime.py +393 -0
@@ -0,0 +1,115 @@
1
+ Metadata-Version: 2.4
2
+ Name: cv-suite
3
+ Version: 0.0.1
4
+ Summary: Unified computer vision toolkit with shared FM runtime and branch-owned I/O.
5
+ Author-email: Pedro Tonso <ptonso@gmail.com>
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/ptonso/cv-suite
8
+ Project-URL: Repository, https://github.com/ptonso/cv-suite
9
+ Project-URL: Issues, https://github.com/ptonso/cv-suite/issues
10
+ Keywords: computer-vision,dataset,annotation,foundation-models,cli,yolo,coco
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Intended Audience :: Science/Research
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Topic :: Scientific/Engineering :: Image Processing
19
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
20
+ Requires-Python: >=3.10
21
+ Description-Content-Type: text/markdown
22
+ License-File: LICENSE
23
+ Requires-Dist: numpy>=1.23
24
+ Requires-Dist: pillow>=9.5
25
+ Requires-Dist: imagehash>=4.3
26
+ Requires-Dist: opencv-python>=4.8
27
+ Requires-Dist: pyyaml>=6.0
28
+ Requires-Dist: tqdm>=4.66
29
+ Provides-Extra: dev
30
+ Requires-Dist: pytest>=7.4; extra == "dev"
31
+ Requires-Dist: pytest-cov>=4.1; extra == "dev"
32
+ Requires-Dist: ruff>=0.6; extra == "dev"
33
+ Requires-Dist: mypy>=1.7; extra == "dev"
34
+ Dynamic: license-file
35
+
36
+ # cvsuite
37
+
38
+ `cvsuite` is a computer vision toolkit for reproducible, filesystem-to-filesystem dataset work, organized around one CLI:
39
+
40
+ ```bash
41
+ cvsuite <branch> <src> [transform] <output>
42
+ ```
43
+
44
+ Convert between annotation formats (YOLO, COCO, LabelMe, class folders, segmentation masks, VQA manifests). Auto-label raw images from a text prompt with foundation grounding models such as SAM 3 or Grounding DINO. Caption them or answer questions about them with vision-language models. Sort them into class folders with zero-shot classifiers. Read text off them with OCR. Generate and edit images with diffusion models. Then do the unglamorous half of the job: unzip and flatten a dump of files, drop exact and near-duplicates, fix orientation, normalize size and format, and draw a balanced sample for training.
45
+
46
+ ```bash
47
+ cvsuite label ./dataset-yolo to-coco ./dataset-coco
48
+ cvsuite label ./images ground --provider gsam --prompt "fire, smoke" to-coco ./labeled
49
+ cvsuite vlm ./images caption --provider qwen to-json ./captions
50
+ cvsuite class ./images infer --provider clip --prompt "good,bad" to-class-dir ./sorted
51
+ cvsuite gen create --provider flux --prompt "a red fox in the snow" to-dst ./fox.png
52
+ cvsuite prep arrange ./dump ./clean --unzip --exact-dedup --rename-seq
53
+ ```
54
+
55
+ More in the [cookbook](https://github.com/ptonso/cv-suite/blob/main/docs/cookbook.md).
56
+
57
+ You point a branch at a source, optionally run a transform, and materialize a destination layout. There is deliberately no universal "convert anything to anything" command.
58
+
59
+ ## How it works
60
+
61
+ ```mermaid
62
+ flowchart LR
63
+ SRC["source<br/>yolo · coco · labelme<br/>images · shards · …"] --> TOOL
64
+
65
+ TOOL{"pick a tool<br/>label · class · vlm · gen"} -->|ingest| DS["VisionDataset"]
66
+
67
+ DS --> TF["one transform<br/>sample · ground · ocr<br/>infer · caption · vqa"]
68
+ TF -->|"chain runs to stack"| DS
69
+
70
+ DS -->|output command| DST["destination<br/>yolo · coco · class-dir<br/>json · shards · …"]
71
+ ```
72
+
73
+ Whichever tool you pick, the spine is the same: the source is ingested into a shared `VisionDataset`, transforms mutate that dataset, and an output command materializes it. What differs per tool is the ingest heuristics, which transforms exist, and the export rules.
74
+
75
+ Each run applies at most one transform, so you stack them by chaining runs: the destination of one becomes the source of the next. FM-backed transforms (`ground`, `ocr`, `infer`, `caption`, `vqa`, and the `gen` actions) hand the dataset to an isolated provider subprocess that mutates records in place. `cvsuite prep` is the exception to all of this, since it works directly on folders and never builds a dataset.
76
+
77
+ ## Branches
78
+
79
+ | Branch | Purpose |
80
+ |---|---|
81
+ | `cvsuite label` | annotated datasets: YOLO / COCO / LabelMe / image-only ingest, `sample` / `ground` / `ocr` / `ops` / `filter` transforms, export to any label format |
82
+ | `cvsuite class` | class-directory datasets: `infer` with zero-shot classifiers, class-aware `sample`, export via `to-class-dir` |
83
+ | `cvsuite vlm` | vision-language datasets: `caption` / `ask` / `vqa` / `map-answers`, export to flat JSON / shards / VQA-style |
84
+ | `cvsuite gen` | text-to-image and image-edit generation, materialized via `to-dst` |
85
+ | `cvsuite prep` | raw image folder cleanup: `arrange` / `process` / `sample` / `orient`, file-first |
86
+ | `cvsuite common` | shared operations: FM cache paths, inspection, and purge |
87
+
88
+ ## Install
89
+
90
+ ```bash
91
+ pip install cv-suite
92
+ ```
93
+
94
+ Or from source:
95
+
96
+ ```bash
97
+ git clone https://github.com/ptonso/cv-suite
98
+ pip install -e ./cv-suite
99
+ ```
100
+
101
+ The base install ships the CLI and the I/O layer. Foundation-model backends run in isolated per-model virtualenvs provisioned on first use. See [`docs/getting-started.md`](https://github.com/ptonso/cv-suite/blob/main/docs/getting-started.md).
102
+
103
+ ## Documentation
104
+
105
+ - [`docs/`](https://github.com/ptonso/cv-suite/tree/main/docs) contains the guides: the [mental model](https://github.com/ptonso/cv-suite/blob/main/docs/index.md), [getting started](https://github.com/ptonso/cv-suite/blob/main/docs/getting-started.md), and a [cookbook](https://github.com/ptonso/cv-suite/blob/main/docs/cookbook.md) of common workflows.
106
+ - [`specs/`](https://github.com/ptonso/cv-suite/tree/main/specs) is the technical source of truth: architecture, the dataset contract, per-branch behavior, business decisions, and the guardrails that must not break.
107
+
108
+ ## Names
109
+
110
+ - PyPI distribution: `cv-suite`
111
+ - import package and CLI: `cvsuite`
112
+
113
+ ## License
114
+
115
+ MIT. See [LICENSE](https://github.com/ptonso/cv-suite/blob/main/LICENSE).
@@ -0,0 +1,309 @@
1
+ cv_suite-0.0.1.dist-info/licenses/LICENSE,sha256=hWMh-9H0A6_sGpcwJLhJNoCacQ1OYCiumEt5GqpEAVg,1068
2
+ cvsuite/__init__.py,sha256=Ym-lVqOa3SpJ-DFlVT8eJSqtjltT-hROKz--rSMbjzA,28
3
+ cvsuite/branch_cli.py,sha256=6_iXCeS_NrBBC2IwwLCuUUM2AQPrWXbZjnEQTSGeqQE,5457
4
+ cvsuite/cli.py,sha256=6WjgWhCK1PBJ6yhicwfue5DdlODcoG2ZxEZ2SOnDG8M,1674
5
+ cvsuite/classify/__init__.py,sha256=A5ni2X3WQqqIRNyHTK1RwujENSiewJ_Fq8VqeRG88Mg,52
6
+ cvsuite/classify/cli.py,sha256=mWv7zTCb0-o7lyjXDclDQouG9vNj93mnuSJ33PzQJFA,4845
7
+ cvsuite/classify/core/__init__.py,sha256=Y0X--33UEjE_VTidUGJaA9hNHejmv6rip2oN81IcVaE,35
8
+ cvsuite/classify/core/io.py,sha256=9vuAKwV8NrUCeVHB4Um6v46gJlAFA8lQOnCfwJKTMz0,22170
9
+ cvsuite/classify/output/__init__.py,sha256=5UXGrKNCSSuD7r65q9vFgTxD0cBu87rEf4xEXVJgNZA,45
10
+ cvsuite/classify/output/commands/__init__.py,sha256=dkw7XiZBwu60NNDsgW2FPkj5C0bY6Yq2hb7gf8iysLs,54
11
+ cvsuite/classify/output/commands/to_class_dir.py,sha256=8p02z9sM4gGIJU8Zq2xpDXtvxK2rb23diNUvqJsSwjY,4833
12
+ cvsuite/classify/tests/__init__.py,sha256=pq26_5wyo9rJVk_IsT8nhCBl-tUUHtQW392P-lNWqJE,29
13
+ cvsuite/classify/tests/test_output_stats.py,sha256=MIvAbLdvH7-Di3ZUlEooIHawIHriJJQ7TBrCvCvv8bw,2824
14
+ cvsuite/classify/tests/test_run_command.py,sha256=rllzzD74RqWaaReIPL4iofbLMC2t4fH9j73XpBMZ6o4,29368
15
+ cvsuite/classify/transform/__init__.py,sha256=UNZ88Ll5EdvD8iJ_80mXA0aoclKb1N4ikN2nBPyPwVk,40
16
+ cvsuite/classify/transform/commands/__init__.py,sha256=2ZtAyJmXgAAJ6mM3F3NjFj0U3H439p6ojHvVBCw8Oz0,59
17
+ cvsuite/classify/transform/commands/infer.py,sha256=5Ih5asUzNYPHi1QZb6XXMxjBKHEgx76sy7P1HAHSmCU,318
18
+ cvsuite/classify/transform/commands/sample.py,sha256=7z3J-LQVIT696oGjjtjFPfKasKhj4ic_RtrSCFrCQx8,358
19
+ cvsuite/classify/transform/core/__init__.py,sha256=0nONsZqL3lFnR55cbeDqWxVcUCg1xywX5U9fWts2EXQ,44
20
+ cvsuite/classify/transform/core/infer.py,sha256=OVFo4Ed-YTRYWl61PxeOV1Bg0EJEWdVud7bhbHWtKU0,3321
21
+ cvsuite/classify/transform/core/sample.py,sha256=EHz-iz0diTC1Kum_gHJ63sFCYIn7uOjefP7QR6doGVE,7274
22
+ cvsuite/common/__init__.py,sha256=imfgxc2OVQ04I_vVPAIWPNCnUC8PzdTNvD9NyuDg1DU,39
23
+ cvsuite/common/cli.py,sha256=sgZRRXaAPoSCWtPokqd-0W1LSQ3gjaWwKFs0AQpcKoc,361
24
+ cvsuite/common/cache/__init__.py,sha256=5btli2EH5RwEfS7rjZ9RPRnKndDJJls_hki05o5dDqw,50
25
+ cvsuite/common/cache/core.py,sha256=yf4xSSSAqku3CnIz13wLEhB5esO8D_fiOsk1InAY_mk,7843
26
+ cvsuite/common/cache/commands/__init__.py,sha256=sCs10VGnDeIIinwcy-Ce4FfonVbhKPnsFd_xFgX3hlc,55
27
+ cvsuite/common/cache/commands/list.py,sha256=y2ddfqAN0uU4sWGEJK4H30GgPx05FsrRNndMik3iKsM,4586
28
+ cvsuite/common/cache/commands/path.py,sha256=wiBU57VJzqKKR8ve9u4IB8AWgU5oSgMDyxy1k2JbK14,1017
29
+ cvsuite/common/cache/commands/purge.py,sha256=KuE1NO-BBJIr3f3cACufsMrANyb02-xd_aD4hF5cLIg,3442
30
+ cvsuite/common/core/__init__.py,sha256=1Jzn5ywa12ynMCAa8mNjiczVGxU6qWpM6c1YBp3l-tU,1098
31
+ cvsuite/common/core/enums.py,sha256=PQg3MhDoC3p5XpqYOIJ282q9t-gpLK7NTWN8ErUMc6E,1190
32
+ cvsuite/common/core/records.py,sha256=phdCc33SvIG2x4yU83ED0wiQq95oGZyz1joFWqjABBs,4530
33
+ cvsuite/common/core/types.py,sha256=vOLTmgUcwqY4GF-DdgbT0DYjpOmkWv-7K1nt5xGNmyA,5767
34
+ cvsuite/common/core/utils.py,sha256=-lvAftu61ard8iq1NJgwWfS3wsfAsGw9B1n5Zqsq8gw,4685
35
+ cvsuite/common/fm/__init__.py,sha256=ub8WRIoKJ7ziPa0q-aQdeWJy0DjPTh4tCJt-mtksJpw,120
36
+ cvsuite/common/fm/core/__init__.py,sha256=tyekVE-pn3An780xzd4MU043dpRHEf1uE9RduOQKyQM,861
37
+ cvsuite/common/fm/core/export.py,sha256=Xmttxh_zNtdD8KkwJWtQ3ApdvQGzWxTpW-CZweV-Ny0,249
38
+ cvsuite/common/fm/core/paths.py,sha256=lKG36Wiijhx_s60DS31uIBhTSq3ntuMZJgD376uQZqY,8343
39
+ cvsuite/common/fm/core/prompt_utils.py,sha256=t99gvAVQ3IToOJcrUcOM9ZCaFcLzm6ies8T40ewvaPU,3060
40
+ cvsuite/common/fm/core/runner.py,sha256=vTcpxzs34hIYLsp8VL6iu5cURp6DkGKQhDLQNtf0cbY,22062
41
+ cvsuite/common/fm/core/sam3_patch.py,sha256=MxyIDu9Lj2MJ6om5plY1kQyA7POP7Xgv8YKmEE2xQH8,3442
42
+ cvsuite/common/fm/core/utils.py,sha256=GmZtIFUuzn7C1EWkby0qvGHtJd8qs178YgO6JyXWmzM,31168
43
+ cvsuite/common/fm/providers/__init__.py,sha256=RXZQ8BsuGWLMdFS8mn0dlc73P_7KVvSLO7DQOAsL8NE,1022
44
+ cvsuite/common/fm/providers/_template.py,sha256=woDYM7gz-Fgtj31c0W5DDKU9A9d9i2q3f1Zi0D7-GJ4,3298
45
+ cvsuite/common/fm/providers/base.py,sha256=_GiudSw7nJc32Qgux6kg5Bp29RvAVdy8ay9OFI_hz74,35973
46
+ cvsuite/common/fm/providers/registry.py,sha256=0XcPcgOOnxhRC3CdEsJmpqDdxrvoT13gvJq7Jre6aZI,11829
47
+ cvsuite/common/fm/providers/api/__init__.py,sha256=xat7wuh72-tGIY-EN4TfdOu3svNor0pNhnN6QXKjKS4,31
48
+ cvsuite/common/fm/providers/api/openrouter_common.py,sha256=EKhDye91hoNNjPZ1Oh651pdMZ_aqTEWPNT0pDsHSvXs,3406
49
+ cvsuite/common/fm/providers/api/openrouter_gen.py,sha256=VDfWAF5josMYM1975yEesiOLPS3pUe4Lgaq74v_kyLU,8162
50
+ cvsuite/common/fm/providers/api/openrouter_vlm.py,sha256=h--aDw769pdInRmV29j_bEDA6anbKVI8DPthN7Rzpu0,3450
51
+ cvsuite/common/fm/providers/bases/__init__.py,sha256=tZiWbRW7yAOr9zS_G_1gRvjuYGB4KTpAlf8OjFrE5M4,2887
52
+ cvsuite/common/fm/providers/bases/classification.py,sha256=H0Z_VDNylx81MAN3ejj_EgQ8p4QKhl0nsvbpwagwF7I,3462
53
+ cvsuite/common/fm/providers/bases/create.py,sha256=lU6kcs3gNnMuPtHwUC3201OA4A5N5cEghA6CB_mbfi8,7108
54
+ cvsuite/common/fm/providers/bases/diffusion.py,sha256=2f1Hvt3rsqlkL_8lce4hp6nEaOT_YED7xfrD-Z5ZkPw,24460
55
+ cvsuite/common/fm/providers/bases/edit.py,sha256=QHn43oifcUxgQkARp3WpmIhpw4npi3TL5rLo9mHlbxQ,7484
56
+ cvsuite/common/fm/providers/bases/edit_custom.py,sha256=L6G3LJnQJ-eomEmRUr_A7PNkLFJ6toBQRfRVDDgZPCk,25782
57
+ cvsuite/common/fm/providers/bases/gen.py,sha256=ajuDCdmC8ZGvC-GDO0yggnlWxa0yWMTuDi0ChsBsFkU,12406
58
+ cvsuite/common/fm/providers/bases/ground.py,sha256=sS8O2TKzCXQ8TuXDejCdH22mddaN-f-Aim769lHkmsM,4323
59
+ cvsuite/common/fm/providers/bases/ocr.py,sha256=hNn_PcSoDBqMVJTbTHZ8kwlQ4ojRPbG5QQ-4vNjJMlU,3190
60
+ cvsuite/common/fm/providers/bases/qwen_image.py,sha256=Dcj2QkrUealouXPZb7sjQDWXgdOG4fUHgtEL3ImAjLE,5817
61
+ cvsuite/common/fm/providers/bases/record_image.py,sha256=QoDtlFEDdDiJ-EYq8ym5D0KWZBRZaZja3WwUsjoYHaU,3012
62
+ cvsuite/common/fm/providers/bases/vlm.py,sha256=JtmIErbHT9t8nNbD_Tm36aRO0JqrJWtDR3IgEuQV7t0,17974
63
+ cvsuite/common/fm/providers/classify/__init__.py,sha256=d1ZsHB6fe4LQOGqFJL2OK4y1rjiuQgguBWG3d1yNRdg,34
64
+ cvsuite/common/fm/providers/classify/clip.py,sha256=ICOCAwWheZafsYqK7umfvrtBvqKjgI3kEczakdV6gw8,9100
65
+ cvsuite/common/fm/providers/classify/deep_orientation.py,sha256=hMcR-RfrIB4aB0hoHSX7Na0G1VzoJ1NHqI6xWl-FyRM,8881
66
+ cvsuite/common/fm/providers/classify/siglip2.py,sha256=pdNSXChdYXezJK95L2xvV8XBavnT216710N1TpV_48E,9268
67
+ cvsuite/common/fm/providers/create/__init__.py,sha256=1LBpw2ozmAHpuf8A-SOGXzFEuggjKfIGxaLoxyI7WGo,37
68
+ cvsuite/common/fm/providers/create/flux.py,sha256=xWwOWeQWHgMbMxrPfhE5v4vLW3A4d1Rb663owm_XSgM,1721
69
+ cvsuite/common/fm/providers/create/qwen_image.py,sha256=1JJoeXKY220Y0BOHom4QXhjhhkXfa1v2thaF4_CM1iY,2139
70
+ cvsuite/common/fm/providers/create/sana.py,sha256=AVvb0pwrVvw0vBRjxJNPQhd44QzO5iJ3vlGdunjSU1U,1510
71
+ cvsuite/common/fm/providers/create/stable_diffusion.py,sha256=Jhig8Om0YW7yzC4w3bVPFRKpLgFvTx6Mz8zRw6JEoXY,2464
72
+ cvsuite/common/fm/providers/edit/__init__.py,sha256=GAZBtN_Pwuifb-hYNem3jaMGLQrXMS0yCtC4f-r2tyo,35
73
+ cvsuite/common/fm/providers/edit/dim_edit.py,sha256=8UmsZ-TsVRpQWhlpHiGXiQ0_xUY_xDye1ax5BydViss,49699
74
+ cvsuite/common/fm/providers/edit/flux2_klein.py,sha256=KFe8YAW-jzy6k3kIF_xbI07TA2i3vTYWxHyGKLAmue8,1605
75
+ cvsuite/common/fm/providers/edit/instruct_pix2pix.py,sha256=NxMYCZUycZh2MhCCMaBOGIvCk0g79EfFO_Up0ApX1Go,2454
76
+ cvsuite/common/fm/providers/edit/ovis_u1_3b.py,sha256=3wRy8UQomhLJFy1I-p6glCIDX47GHrYC5mTnYNmX6Wg,1362
77
+ cvsuite/common/fm/providers/edit/qwen_image_edit.py,sha256=gGHl0iyU3SWhHIO-eN0aiqbRq0NCEj7r1MUf9SxSN7Y,2131
78
+ cvsuite/common/fm/providers/edit/step1x_edit.py,sha256=DeyoWwMBEM45JMS7Dt24MJ_r3loG2xQ1RMWHYROVNqw,1436
79
+ cvsuite/common/fm/providers/ground/__init__.py,sha256=Shm5gU08wxAAA2JVMB8bwdmYFdaOXaKTbsiJ2PV22Vw,29
80
+ cvsuite/common/fm/providers/ground/gdino.py,sha256=JnG_kwpJhsQ2xsp0NqsoIdwyNusJxSNECUTHYOBh6Sw,7714
81
+ cvsuite/common/fm/providers/ground/gsam.py,sha256=iIlvHDWWwyCElI7WT6DDF7S8t0FyJca0fFTKoWPfxQk,15838
82
+ cvsuite/common/fm/providers/ground/llmdet.py,sha256=NGoGqDIpqqlwV4o6hoyLzLD4Y32xzA0IyX5LcOPLMoo,10045
83
+ cvsuite/common/fm/providers/ground/locate_anything.py,sha256=ELj1Mu9gsve0JSCXESEZEvGmo5Hdy6mBEfW4o0FF3ZA,15944
84
+ cvsuite/common/fm/providers/ground/rex_omni.py,sha256=zvDDfyPchJ7_eQewdXnw8Y0-fmLonziou-aEyyznYXQ,11059
85
+ cvsuite/common/fm/providers/ground/sam3.py,sha256=RdiLEx8HFG4tZcc8f5Fr8UdtTmL2g9Cb4wfEKXVmD8A,19711
86
+ cvsuite/common/fm/providers/ground/yolo_e.py,sha256=kBvQCnvYzH4AHFvQtyTe4ff58JEiLSWZvz6rjV7toRQ,12292
87
+ cvsuite/common/fm/providers/ocr/__init__.py,sha256=Yi_VHEwXRLjyJloZjYh6TD0LItFNa1HI_geBWoxu_xA,23
88
+ cvsuite/common/fm/providers/ocr/paddleocr.py,sha256=0tJa4Nhw0Jv7XNqdpF5amXu7-lfSKuWQ0VKbXJEoSzw,8273
89
+ cvsuite/common/fm/providers/setup_venv/blip.sh,sha256=LxpwCMPJMSGBcCiy4pvYjBpAHsE-iQe52q3x9S0LjMo,1056
90
+ cvsuite/common/fm/providers/setup_venv/clip.sh,sha256=8gONjo4AaNGM7bGl14MIHsmVhVypEZJbzmGHgAvVrkM,734
91
+ cvsuite/common/fm/providers/setup_venv/cogvlm.sh,sha256=LxpwCMPJMSGBcCiy4pvYjBpAHsE-iQe52q3x9S0LjMo,1056
92
+ cvsuite/common/fm/providers/setup_venv/deep_orientation.sh,sha256=TEI0IcPTLcUNzd-zOgGOY_TmzDQQxYmuGwR474kqlDk,724
93
+ cvsuite/common/fm/providers/setup_venv/dim_edit.sh,sha256=CxFmkiWJQV5X08ubH793QUvOw6mfRJ6jyHHxSiDJoTM,1773
94
+ cvsuite/common/fm/providers/setup_venv/flux.sh,sha256=CDTiu6tvX0sptAWG9kx6aF_LhdLhQ4k2FPXULIVgOxg,1417
95
+ cvsuite/common/fm/providers/setup_venv/flux2_klein.sh,sha256=k57RMHVBocFGOtASYUJhb_8jTS3fxsHoCKPzkgq3sQM,1390
96
+ cvsuite/common/fm/providers/setup_venv/gdino.sh,sha256=MMpqO4LuY3x-sSEpZqbNjrbqWcsjzuMZmjdvswwkfGE,853
97
+ cvsuite/common/fm/providers/setup_venv/gsam.sh,sha256=Aksp9PyfUKvLGxyr3Z13iG85aGH7TMdZp_EEcUnWSnI,1563
98
+ cvsuite/common/fm/providers/setup_venv/instruct_pix2pix.sh,sha256=CDTiu6tvX0sptAWG9kx6aF_LhdLhQ4k2FPXULIVgOxg,1417
99
+ cvsuite/common/fm/providers/setup_venv/internvl.sh,sha256=Tj_82XVVoLLCPYQ1ZknuEMtLTLorQbxgkCeAyyoU0j0,1079
100
+ cvsuite/common/fm/providers/setup_venv/llava.sh,sha256=LxpwCMPJMSGBcCiy4pvYjBpAHsE-iQe52q3x9S0LjMo,1056
101
+ cvsuite/common/fm/providers/setup_venv/llmdet.sh,sha256=E4a5vnPAnEbiYIkY-Yj-bAJAeJK_1_23TnAz-svrwEY,1080
102
+ cvsuite/common/fm/providers/setup_venv/locate_anything.sh,sha256=qZmGXdjcmH6fgx-MoaEvQPj5hFUELPy1A_qG1UQXasg,1269
103
+ cvsuite/common/fm/providers/setup_venv/minicpm_v.sh,sha256=VLBIzN6ySby-l4cqgDkify38ueQOnuhd7LFEDcQih70,1141
104
+ cvsuite/common/fm/providers/setup_venv/ovis_u1_3b.sh,sha256=jitVp4qbZgp_bCQQXKTFYkTltxayR2iqtlFLFpDDkOY,1344
105
+ cvsuite/common/fm/providers/setup_venv/paddleocr.sh,sha256=tXfOHPaON2jBk21ohAgexWgrxI5Hq6ukdjrhXRUrx-E,2337
106
+ cvsuite/common/fm/providers/setup_venv/paligemma.sh,sha256=LxpwCMPJMSGBcCiy4pvYjBpAHsE-iQe52q3x9S0LjMo,1056
107
+ cvsuite/common/fm/providers/setup_venv/qwen.sh,sha256=BAjS1qlNDaIOAtglTOIvGpdnZEnSfUSDYA8fRyyc-V0,1049
108
+ cvsuite/common/fm/providers/setup_venv/qwen_image.sh,sha256=CDTiu6tvX0sptAWG9kx6aF_LhdLhQ4k2FPXULIVgOxg,1417
109
+ cvsuite/common/fm/providers/setup_venv/qwen_image_edit.sh,sha256=CDTiu6tvX0sptAWG9kx6aF_LhdLhQ4k2FPXULIVgOxg,1417
110
+ cvsuite/common/fm/providers/setup_venv/rex_omni.sh,sha256=Z36c37J9RMMoJq-IWnQmrrSfmC2eUKhoPsRli1B0S2E,1077
111
+ cvsuite/common/fm/providers/setup_venv/sam3.sh,sha256=kEErDJWzvOsygKwQ1bB7ydSD-193NODMw2Lo2BJE1jk,2142
112
+ cvsuite/common/fm/providers/setup_venv/sana.sh,sha256=56zOiwlgXuSCw1nFlEKjiEfYTbvdde_36cRlGET1NMI,1321
113
+ cvsuite/common/fm/providers/setup_venv/siglip2.sh,sha256=G_SOiWCJaD8W8iTnwQnq6fRnDF-qFhdk6JhXcVzPhq8,826
114
+ cvsuite/common/fm/providers/setup_venv/stable_diffusion.sh,sha256=CDTiu6tvX0sptAWG9kx6aF_LhdLhQ4k2FPXULIVgOxg,1417
115
+ cvsuite/common/fm/providers/setup_venv/step1x_edit.sh,sha256=56zOiwlgXuSCw1nFlEKjiEfYTbvdde_36cRlGET1NMI,1321
116
+ cvsuite/common/fm/providers/setup_venv/yolo_e.sh,sha256=6GUZsUrWFSSKpBQtGXDlPO_cYi9cgCCEVKI2gTvdwtk,859
117
+ cvsuite/common/fm/providers/vlm/__init__.py,sha256=3HNFOiS-Z_dfcfKi4q_GR7oAAnyhtkSDWJwZh0DLLRM,35
118
+ cvsuite/common/fm/providers/vlm/blip.py,sha256=XgsGOtMJpBVFdywKc-83wVoWyKrCrTDd4LPquP5LsrI,5442
119
+ cvsuite/common/fm/providers/vlm/cogvlm.py,sha256=bmPsaP02ldAvcfnzPnLzB4yCIpnrjii_yBEI8xEpReU,6536
120
+ cvsuite/common/fm/providers/vlm/internvl.py,sha256=O5Wjkou7hMzcjNdaa5ffWKXL2_Qo4Q5k2Ob7LnLr_w8,32183
121
+ cvsuite/common/fm/providers/vlm/llava.py,sha256=qDWnN-Ln_1uibHwi41_W36XDOPJiaKtte8iqCcG5lYI,5695
122
+ cvsuite/common/fm/providers/vlm/minicpm_v.py,sha256=47mEDS1rXOny0KjmAhJkybFUNCjXHhCH3o6eThkfFGE,11080
123
+ cvsuite/common/fm/providers/vlm/paligemma.py,sha256=g7zNge9xkp4SpXn0iam1V3aA8YaU131DmFpDnA5nkUE,5620
124
+ cvsuite/common/fm/providers/vlm/qwen.py,sha256=-DbwicZkZN1pYpahFkN0e-JDyBg1UuQpMNg5ACl6GFo,6683
125
+ cvsuite/common/io/__init__.py,sha256=mgJyLDt6CgCpPFOcVOd_qKtWnX-imi9SoXlHV-ZE0LU,708
126
+ cvsuite/common/io/class_dir.py,sha256=zbmJIol5g1Q2Zse3ifP4C2SK-bP5_gCF2RWzDOFTUSI,21627
127
+ cvsuite/common/io/coco.py,sha256=At1oSHo-PW2fHU4iLFJoAwX8HsRcxLaye0Ee9EK6CD8,20776
128
+ cvsuite/common/io/common.py,sha256=Zdj-r38ikjibj-JPO_dpy3c6WXjs597Yp_VNVfQ_tuw,12157
129
+ cvsuite/common/io/flat.py,sha256=RiwI-mDHoRWOAPYkFdyOLVeywaYwM_Jf5EXGP1kMGxk,2238
130
+ cvsuite/common/io/flat_vlm_json.py,sha256=t5aR1DnWUNoTfB4lqyGfACd6rYD1dWYRWPOFHiX0SB4,9636
131
+ cvsuite/common/io/labelme.py,sha256=ceV_6cpOyx3OGpQgjw5_ooVrxAd9dRr2KIUKFKnvhwY,23220
132
+ cvsuite/common/io/router.py,sha256=wyODN3Q2uFGxclUHMduCUjl49NqVV3lHGyBgKqT50ps,5470
133
+ cvsuite/common/io/semseg_mask.py,sha256=pC7ZRlEyEdXSe2gm2JM6YEgyfLGeIo8yvMLVf1JWC7A,4177
134
+ cvsuite/common/io/shards_vlm.py,sha256=mEL4F_Wq_DRnCU8D66AcULEsVE2XV0TiM4fUX0K6oB8,10756
135
+ cvsuite/common/io/vqa_style.py,sha256=cyFTM1GZLq0M5IjTUw-ElF7kOsgJIadUp7N7CiZ_-2I,20516
136
+ cvsuite/common/io/yolo.py,sha256=rWwvqIO8YH_bIH8zqvsxetOenWi2XOaWBK0dRRo6OEU,26945
137
+ cvsuite/common/stats/__init__.py,sha256=0a3WK4nnpLk0kv06UvRFAhMP0S4tJwVA3rYahO-I0CA,502
138
+ cvsuite/common/stats/attach.py,sha256=-21nlSc6jh85dOaH2u83_78wdug9ySt5Cu9CzaR_4m8,281
139
+ cvsuite/common/stats/builders.py,sha256=Fmegzo2Zp3tlYk4yHJVfotsx9IniX6jr4SR5PFtenxc,7988
140
+ cvsuite/common/stats/utils.py,sha256=jSxoMEtzOXum_RikLqjuMxkRLsdIfxRs6jJfUF8MaIY,5082
141
+ cvsuite/common/tests/__init__.py,sha256=EpzmwpXL99v3cQrogJsJbno-d0RwdAUQqiyomqvGmHQ,26
142
+ cvsuite/common/tests/test_base_model.py,sha256=gag-lT-IXyrOzicc1RCI_jZAFFgYnwFHRqZ7ctIM4q0,8339
143
+ cvsuite/common/tests/test_cache_commands.py,sha256=DcW45PTmawjBY53nFD5w3GxwdPEudn48i2MCEHiCJxY,6370
144
+ cvsuite/common/tests/test_contracts.py,sha256=68yD6EZh6PNEE5-cJk1z4NIYCQmrpTqXINpNLpC0j8w,1251
145
+ cvsuite/common/tests/test_device_utils.py,sha256=vanx0YgBLOdfbxYblrPz6402CgKu2_F9DrMlbhGqbik,19378
146
+ cvsuite/common/tests/test_fm_hub_share.py,sha256=57sM8B5BM-rf-TnySjdu6wpCwBuMFqoCGaSUx-ELHyo,8315
147
+ cvsuite/common/tests/test_fm_model_bases.py,sha256=TTHQvJMpf_ILAj3nhUiW84BFskSkBEm2N6ZsgxHSIaw,16390
148
+ cvsuite/common/tests/test_fm_paths.py,sha256=C4n7FDU6cNtbL9qpemrUS2X1JXbDoiTk0ZH0sVFxlaM,7387
149
+ cvsuite/common/tests/test_fm_prompt_utils.py,sha256=jnYCehoOq0WgJ_NdNcQ1_FQOtjxR2_VUQNlSIl4x8AY,1335
150
+ cvsuite/common/tests/test_gen_model.py,sha256=PxBuuIC-YqNwz-feNhTbF4yl0Ae1Nen9ALCn8Bj_Tyo,5940
151
+ cvsuite/common/tests/test_gen_wrappers.py,sha256=oqa6YIeQeqYhaAXMD4O6NZ8TLDhuGFMz3rAL6r5Te8o,31795
152
+ cvsuite/common/tests/test_grounding_wrappers.py,sha256=mQGte9yZA563pacD4eDeE6dDKg9uCNpb__j8UP-Lw0o,54733
153
+ cvsuite/common/tests/test_internvl_model.py,sha256=dYqGGy_GTj3PXeSLxBvcfoTiIUp90zMA-D628-vZHrk,35322
154
+ cvsuite/common/tests/test_minicpm_v_model.py,sha256=2_oU3E0O41R-AgLQ_RfLuqcDIFdq-I2SbFMv0hhCv6E,13317
155
+ cvsuite/common/tests/test_model_specs.py,sha256=ap7Z1q51imZaYPfugs0V0INVLK9TIZNveE71PZv1BB8,1920
156
+ cvsuite/common/tests/test_openrouter_providers.py,sha256=GLJzKCIlINn6ll2D_Fv5CmkEdd6PgfZ-D191wz7bf_Y,4597
157
+ cvsuite/common/tests/test_paddleocr_model.py,sha256=xcdoGN7qy8J-E8_btJkY8LKv0aDw1_3zBoDjeMrd5NA,2354
158
+ cvsuite/common/tests/test_qwen_model.py,sha256=NNQ_shZi7uK3EKkwpsLq1E1zJxP4KNbUwthuVPpOJXk,15792
159
+ cvsuite/common/tests/test_runner.py,sha256=Qs1y0E_YB17jHyevuXbGmilSSzdPF1rQGQg8SJgYQiM,33404
160
+ cvsuite/common/tests/test_siglip2_model.py,sha256=w4Jq3kz51zdZdmHx5T8vYPGtfpQ3mbAx0HABpiLwLkE,737
161
+ cvsuite/common/tests/test_stats.py,sha256=I9mOvNmIkCgrbs1X9wDQzpjSLvU-1qG7kFeGf0pLMHA,6671
162
+ cvsuite/gen/__init__.py,sha256=CHz6Rbyy_njz1GxLs09OQ5Y7IziIEaSKEsZIzWevWuI,56
163
+ cvsuite/gen/cli.py,sha256=b_gBJ-XNwxJkQRvD1bmEIQj9eUR7HSvPWWVrzIZgvi4,4172
164
+ cvsuite/gen/core/__init__.py,sha256=hGu13MF2s84NSuo8pylFMgSPXVo-_7myDL0bGVbDrWc,439
165
+ cvsuite/gen/core/batch.py,sha256=k2vuxmEITj5aphXlkt6gJuwzR1faWwtj_nQB4iq7Cus,9993
166
+ cvsuite/gen/core/router.py,sha256=XB2kFlay9eNTMyQ7o9S2cL3xL98mAW6qsO-CrZQJRgk,450
167
+ cvsuite/gen/output/__init__.py,sha256=SlAAvszathnT9stf4x3MIUFtF63yWBVO4LKj_fpyWUY,26
168
+ cvsuite/gen/output/commands/__init__.py,sha256=v5kSfLHPBRn-1DtP3aHHdCuimExSTzgk6F2sn2IOufk,34
169
+ cvsuite/gen/output/commands/to_dst.py,sha256=RNsfOa7RA9yYKqUYsBsrxPODJAjOAgRA5r7z7Uke_Gg,6494
170
+ cvsuite/gen/tests/__init__.py,sha256=4-XETmua5qx8cJLmxmh0La8Ud64Vs0FV4xfAl9LS52k,32
171
+ cvsuite/gen/tests/test_commands.py,sha256=lREkKiZG9T3ZAm_gCtVGEEKIQvy04K8gICpWkTFqugg,37734
172
+ cvsuite/gen/tests/test_output_stats.py,sha256=aiG5eBngKvh1xsqDeBcMCgkMHyUSdQwjqUOf2zSf1yg,1511
173
+ cvsuite/gen/transform/__init__.py,sha256=26X99DFS1Xu-iUfaV5R0Je02_tR8nxWZYZ8vbIke6eQ,29
174
+ cvsuite/gen/transform/commands/__init__.py,sha256=etDBI-zAAlYx1DGI0UExNMN_mhfbbQdwHlD2OlKKvfQ,34
175
+ cvsuite/gen/transform/commands/create.py,sha256=dz_Mu9_O6ciESPbSy0uuB02whN3oRzx_lkBIFmp-SQ8,1713
176
+ cvsuite/gen/transform/commands/edit.py,sha256=hs1zF91ZcF3nvlL5gtPB8imUN2jtWqmiArJ8kv6g3rQ,2404
177
+ cvsuite/gen/transform/core/__init__.py,sha256=6gNODtnr19zG1k22Mp4oXwD3OLsv7ho-2TAMv9FjKpQ,216
178
+ cvsuite/gen/transform/core/runtime.py,sha256=jymWlEZaEtX-xWO6-Eq5R9tCCP1YHtCSfY7PS1yvAHM,8595
179
+ cvsuite/label/__init__.py,sha256=SDhzSzaKBz2_w_j8ubbrHvJSM8Bth5BH9yqLHRNIjV4,20
180
+ cvsuite/label/cli.py,sha256=oTjxsM_pL7wa8ECGmlv_0tMuBH9VxhFsCipdXzPHnis,6942
181
+ cvsuite/label/core/audit.py,sha256=CIxDCK3Xqi1fgK_HBixSJ1HFo4Z9WRZz19Lqd_ucteo,2663
182
+ cvsuite/label/core/crops.py,sha256=4gTn4sfTY123wpYmOGxn0QC8bk20SS65v6iVxR_r0kE,3418
183
+ cvsuite/label/core/router.py,sha256=blqKMIhfKEbmtGS4QYbcM24fFzxjq9Cng9Z-gIDxVac,8763
184
+ cvsuite/label/core/schema.py,sha256=3WWbYZokQWMtIRLU959cNsJLqRsdjpkipRclNNekAXE,4158
185
+ cvsuite/label/core/annotate/__init__.py,sha256=mUIkxv0lInhhvdhYR0CVmdHfeMmM_FSVMjLGQTP9mkU,419
186
+ cvsuite/label/core/annotate/letterbox.py,sha256=8kDCbvHo-Z9MsMtFTtnLk0NUkFHZmop_Pi5JvD2yf5A,1351
187
+ cvsuite/label/core/annotate/overlay.py,sha256=eRUEhmaD3qyIYacbNQbESa0QTgQNmx61IVuGPy6-A4I,9872
188
+ cvsuite/label/core/annotate/preview.py,sha256=fepTzAJiC9Knp-85XJoxPMIDmHs4NkQopXyMPBTTYMI,3486
189
+ cvsuite/label/core/annotate/utils.py,sha256=5XeLyuGtnQa1qFzYA5OHcYw0q9_zgiCM7icesx4alZg,540
190
+ cvsuite/label/output/__init__.py,sha256=bfetAhTHDCP5W4gVy0WekVnthUMIT_V6WhafW0Oo4pk,29
191
+ cvsuite/label/output/common.py,sha256=JgaWjfwXS54LHC8S5RmAn2dKwqNJfAbSMzUwc7uoA_U,1904
192
+ cvsuite/label/output/commands/__init__.py,sha256=gO-T02jVCbpcQreRa0txb-J_WKV-KFuH7VkAB5K50xQ,36
193
+ cvsuite/label/output/commands/audit.py,sha256=2IlYGq4kgTqQomLcJqQ6cjvs2ET44BpEwLr1RllpwWc,1748
194
+ cvsuite/label/output/commands/inspect.py,sha256=vi45lbMJ9r0xxa3O5rn3YCTSwqVYXo2aznmL3fuhKv4,2151
195
+ cvsuite/label/output/commands/to_coco.py,sha256=rL9Pj-BN46RjmKR7fOMX0o9GqvjDhjtlz8E2IwgmL94,2706
196
+ cvsuite/label/output/commands/to_labelme.py,sha256=hdY9DRcZ_JhylSu29z1qovXn6YXgwVtiF_gW4GnXZRg,1870
197
+ cvsuite/label/output/commands/to_results.py,sha256=YOCN5Z1e51AYW-wayxCpUmtvCg2_9hNJo8j8dAUY2WU,4334
198
+ cvsuite/label/output/commands/to_yolo.py,sha256=-yGc9slwsIjgePmtqsx_HjJOl1185bvpZfwQh5B4OPc,3510
199
+ cvsuite/label/tests/test_cli.py,sha256=NnXkCw23E_c1mMB6KZnEn9hNJgvhU5g0y2zhiO1HERo,9327
200
+ cvsuite/label/tests/test_filter_transform.py,sha256=cL0180e7DM2WRcxi9hXsXCj1xBDFtgpdkrPin9Zet_I,6636
201
+ cvsuite/label/tests/test_full_manual.py,sha256=2TQB8LmIf_h8tXpitpB2lvwSfFL43nofcW57IlcbYf0,8111
202
+ cvsuite/label/tests/test_ground_transform.py,sha256=529CLRcr6pesJ38tXkq0pTsdYLEQiWsfyrmqu21jd_c,27985
203
+ cvsuite/label/tests/test_label_commands.py,sha256=vXfyKda_B9OynShn0R2MEkCj8LEl2jIzUkPwSnmZqq4,38248
204
+ cvsuite/label/tests/test_multisrc.py,sha256=Cd4SL3NfHp9-bxKatATl5vVvRogMKMggXLd6RpotBxM,11213
205
+ cvsuite/label/tests/test_output_stats.py,sha256=5l7ExIL3dc3cE6d7z3dgDAhqU3gSJpILuY5TTpU3pNI,1877
206
+ cvsuite/label/tests/test_preview.py,sha256=-tq3f80qqVo9NznUP6_bKNxxWS1lYAroBcvK2RahD_k,1740
207
+ cvsuite/label/tests/test_sample_transform.py,sha256=g2K5_yDlIaC-Z9cy0Tpl1rZkPLMU0vTZcUwjE_vESoY,3074
208
+ cvsuite/label/tests/test_to_coco.py,sha256=g_lGfdNqAJ33-ObdmgrCoIk-uSbCCSkgA1MH6vIlaoE,2331
209
+ cvsuite/label/tests/test_yolo_layouts.py,sha256=21_MwEajuheuEkw9aZxmPKBKRSppqBzrxNlfjLeATIY,1251
210
+ cvsuite/label/transform/filter/__init__.py,sha256=i7jvoEYQQSFOQ-W4o8MxoIereocQTvOXLnbEZcPev9A,74
211
+ cvsuite/label/transform/filter/commands/__init__.py,sha256=4v-ukkZmkIblbENSOLjSnpheaRHcvTxafttSxQ6cRzQ,42
212
+ cvsuite/label/transform/filter/commands/apply.py,sha256=AboX0dPgau8lMQoa9UiK9B7jS6IOYks-CNw9LoGq0Xw,4582
213
+ cvsuite/label/transform/filter/commands/logistic_opt.py,sha256=0AheJnvFhC-295GurnfgYVm58AuN_2e2T0U0ZH-gfZo,7519
214
+ cvsuite/label/transform/filter/commands/run.py,sha256=mhGs_DL8xF9D7RI4LARAW-Uo60e7Rx56RCC-xCthQLM,967
215
+ cvsuite/label/transform/filter/commands/threshold.py,sha256=5U-0GnLib3nVwfcEyto-Ua0nUIOgf88lYimrYy7TrYw,1347
216
+ cvsuite/label/transform/filter/core/__init__.py,sha256=PLvXO0cqWQlvOM9p947SuM8-smusQeZ-P6HEvwFFWPI,995
217
+ cvsuite/label/transform/filter/core/config.py,sha256=BluK-dMD6SHKwZNHO_DZt9oRJHTY1Cvf4KDxKw131Xo,4930
218
+ cvsuite/label/transform/filter/core/features.py,sha256=PdWbWScFiRJF5oMi-CraAPT0VQsehzoIP_XunCwSOj4,7913
219
+ cvsuite/label/transform/filter/core/filters.py,sha256=kZMg0JxcOgx3U8DLNsNJz-oklDd_C1aYWyEUoMoGWbo,14329
220
+ cvsuite/label/transform/filter/core/optimizer.py,sha256=xdaTM2O_xt4m32kwFytjD3-OWN_wLGSxsIwfFbUXO8w,18287
221
+ cvsuite/label/transform/filter/core/records.py,sha256=R2AjFUC8J3rGlHqJ6mSk44EjJ2Hll7Rq1Kqb1rUtib0,7706
222
+ cvsuite/label/transform/filter/core/types.py,sha256=aHjstEkb6Br5X5Jtihml39J2PFKkAO2POzNeYUdrn1E,2804
223
+ cvsuite/label/transform/filter/core/utils.py,sha256=Mxuncw2ejTcjLKHWrVhflpTc61kdypkPxTfMA7D7lgw,3549
224
+ cvsuite/label/transform/filter/core/utils_optimizer.py,sha256=raAwu6PavRKi0OzeMw9tzFdvO5J-5KwpSwR8np_ptwg,31552
225
+ cvsuite/label/transform/ground/__init__.py,sha256=Tan9uCLt-2a1LkmH65_7kcWcfdKHe_fa1wEdXHuhfJo,48
226
+ cvsuite/label/transform/ground/core.py,sha256=AQX5O-lQHKyRAOK6nF6O_kEHxDS6nuxGh7hWpyyCJLw,18052
227
+ cvsuite/label/transform/ground/commands/__init__.py,sha256=CZCDXW8D6UvMu2nNOJVDsnhGt-WYBE7B9HkB_GPa_kU,33
228
+ cvsuite/label/transform/ground/commands/run.py,sha256=Ok94iyiYMIBDAbQW6FT2maltjUoG0CTQICtnQpdZvfA,5421
229
+ cvsuite/label/transform/ocr/__init__.py,sha256=JLWp--Oo09X9QQz_XNY4lb2kiAvIFtQIZERUabTGmFs,42
230
+ cvsuite/label/transform/ocr/commands/__init__.py,sha256=qY8MAaHzQDAghz79MjIFTRs-8Oq6mT7LprVn3QL6BPU,30
231
+ cvsuite/label/transform/ocr/commands/run.py,sha256=fin7IFyOQ88cIQmL_ZPq2m0IkffDbm6s---OfP280i4,1889
232
+ cvsuite/label/transform/ops/__init__.py,sha256=opAVqrKUVUWX6Jl5YYi-txS6tK1x1yb3g7zPeH1O268,83
233
+ cvsuite/label/transform/ops/commands/__init__.py,sha256=cvk0Nz3Y_SkfAQ-4EIqAaEOhCwEHKF4NXRnZbCgUfB0,79
234
+ cvsuite/label/transform/ops/commands/crop_dets.py,sha256=gG5RfDn6gZqNNzFuudBMSwek8XaSi-T0WIYGvJ4nHd4,1478
235
+ cvsuite/label/transform/ops/commands/inverse_crop_dets.py,sha256=gWfgyT5OVIp-sRUxh9agoGnWEM5sZZ7wFsxQAJRSfRg,687
236
+ cvsuite/label/transform/ops/commands/make_negatives.py,sha256=idM3DorxG0HduA-s4Y2vzL2m3WF1Sv2zgs2KdXgdDmU,3374
237
+ cvsuite/label/transform/ops/commands/rebox.py,sha256=ilKkgdDezDNPsu1X1Zug_mkzDHUi0NN6Snp6T79YYoU,1677
238
+ cvsuite/label/transform/ops/commands/run.py,sha256=lbhpDm_CthgGKQezLC3cDmhk3TGv6Srp7lEXTqD8yAg,1063
239
+ cvsuite/label/transform/ops/core/crop_dets.py,sha256=NNnO4rS-QMyBrG-Q9c0HOEKmEdZ9r9cbmBviss25uK0,22099
240
+ cvsuite/label/transform/ops/core/inverse_crop_dets.py,sha256=GTzo6UWd5fVhLC6h190ZH-oWQefjaEM0YVxIZgjw9tg,16297
241
+ cvsuite/label/transform/ops/core/negatives.py,sha256=u1vLM-V7kEG7GoLSTbhLb_1sjdhBhNjh5BImzzRtOM4,2016
242
+ cvsuite/label/transform/ops/core/rebox.py,sha256=4RcNkB6AgbPDMUF8hRMJpxIlh3KQjdtMNjoDfZGjooU,820
243
+ cvsuite/label/transform/sample/__init__.py,sha256=G0trdQpe-V9JjOnuXSA41gRpQazvj0u4Xk37Why1Y5Y,49
244
+ cvsuite/label/transform/sample/commands/__init__.py,sha256=SezOe0M-vqGS11ixwXtInAzAjHck55AONzveKrGg8Gk,39
245
+ cvsuite/label/transform/sample/commands/run.py,sha256=vgynWAaodYSIs8gz4I5-O62lQ34KTtC4nOgBFTsvgz0,2276
246
+ cvsuite/prep/__init__.py,sha256=gSzIsJ75uYDjSUjFpjsx9HDOx598nRHdOJkxP-XKZY4,26
247
+ cvsuite/prep/cli.py,sha256=xak-4RnNjlna7OIhU19_CeTaV-VJtdvfabBKYU29EDo,1537
248
+ cvsuite/prep/commands/arrange.py,sha256=lm6-mw6gac1mi2cnoPlDjnRcQjO2tRCKPJcNBWPQfLk,4414
249
+ cvsuite/prep/commands/orient.py,sha256=pL5X4yK-HZbcLQ6zOr2FUAkioL-0j8OmyNqux2VVeiU,2853
250
+ cvsuite/prep/commands/process.py,sha256=f6bV7MMhTqLJ62SWp6bCfOMIsSFTBNV-zNoF12P-bSM,5389
251
+ cvsuite/prep/commands/sample.py,sha256=etfD9K8_N6rzjy_4HjUnnJRLy8wo3rOzs-rUwC_nZx4,2688
252
+ cvsuite/prep/core/actions.py,sha256=yYhE2GFMG4MqCb2_AGKzZ4yoM2rqyXg-iMAcuXnDFok,1788
253
+ cvsuite/prep/core/config.py,sha256=sWYovARNgI8ywMXXqFsI5hGHlr10JcREY9f7a9vdueY,1910
254
+ cvsuite/prep/core/fs.py,sha256=pem2DaDwXBPiOrQvq7I3xautDPzPGiO1_ro6oZYg-wM,3098
255
+ cvsuite/prep/core/logging.py,sha256=cbpOwyhQO3oKOG6ORpiMBhwfySWfYm24qsEx5jzXH0c,322
256
+ cvsuite/prep/core/manifest.py,sha256=C4Twzqn0aYuf6DERY1Un7wJuuk8j0F_UsFEJBLlk5UQ,1369
257
+ cvsuite/prep/core/arrange/core.py,sha256=TuVoLWQjgf_9XRkD31F8IB-IchEp0LpSkT0GnPzmu5g,1651
258
+ cvsuite/prep/core/arrange/ops.py,sha256=Ebm2zkKYh1GE9ial-Oywtfl_EjUFCNZj3jMrigzwFbY,8359
259
+ cvsuite/prep/core/orient/clip.py,sha256=AG9Rtzy4YUQH2X4seq20d65R8jMgXQSYBYn88N0moMs,2138
260
+ cvsuite/prep/core/orient/core.py,sha256=CWqmvDVazKaKLDGJO6FPoUDtBMGa1XMY9MAmeIyRn2Q,9925
261
+ cvsuite/prep/core/orient/deep_orientation.py,sha256=JFE8Cc6jkoNEQI81SoO8Alah33RKedaA-y1Jrqi-Zog,3298
262
+ cvsuite/prep/core/process/core.py,sha256=Ec2DgErk3QPnMLtavsMZXEqUTFs5Gv27fhoH2PB6rFc,4299
263
+ cvsuite/prep/core/process/ops.py,sha256=MJY44cbSPwiSVjyMQ_qv6YtnHAqk6oNYTBlWU1QbIHM,6346
264
+ cvsuite/prep/core/process/vsample.py,sha256=6BR_w-8b1bFbqtYwaqHVqoXWFnY_Yz9BDrZAg9UKhjE,4910
265
+ cvsuite/prep/core/sample/core.py,sha256=h2011QZoZv-ybofxeNcm_-3m5qU9GohJRg-ohjp3XAM,5459
266
+ cvsuite/prep/tests/__init__.py,sha256=zsfa7CZ36aSULa7hnpukDVhQ7FDsNJ0Haohdx0xiuDM,66
267
+ cvsuite/prep/tests/manual_flow.py,sha256=yDNysLNnSa5XR8lCqJhE7g_i9lLNzeYgNjlPJq7KsYE,4134
268
+ cvsuite/prep/tests/test_fs.py,sha256=qQODFODBY97rZjzPfhIPqQC-vk7lG4sn_yculOstjsE,1626
269
+ cvsuite/prep/tests/test_incremental_arrange_process.py,sha256=RaxwZCb9SogxjGOO50VFqpk2Va9qwJ4ttHETyBLHhzU,7603
270
+ cvsuite/prep/tests/test_orient_command.py,sha256=HohUPi9lf_OZjYdbzvSPC34bitnNLeWPrqUHomDlTx8,5678
271
+ cvsuite/prep/tests/test_sample_command.py,sha256=JAfEKXWSYMllZur2OImVTjchBL6SUe7D5qX1XAWqj9k,3919
272
+ cvsuite/tests/__init__.py,sha256=v5mLADVIwwbhZjD0WIAdSEh37Q8B8WcnSMVCRxeDYsg,31
273
+ cvsuite/tests/test_cli_structure.py,sha256=bhw7JjMPs2brkPTuUcTt6Bb8Zpk7FafIkdFGpI7-qcw,10404
274
+ cvsuite/vlm/__init__.py,sha256=jagYfnNAq1uIgdopiti_ihOyEvT3OGKa2Nl801m7x6k,60
275
+ cvsuite/vlm/cli.py,sha256=Y76P0MwgwtRZ5OWyHMFVkNfRFqW9jvlwS_bUFvC1_E0,6436
276
+ cvsuite/vlm/core/__init__.py,sha256=OnfnDDYyGRvrsbdPG1D15E7KKNGgf5hbvTsKG48mk78,115
277
+ cvsuite/vlm/core/inspect.py,sha256=HJw9zOANPT3QuKoPXnjGr7gLo1s77NzoIG-GyOsBtGE,4479
278
+ cvsuite/vlm/core/io.py,sha256=uC-gnpdQ5-4isLD2iNhhGrvsbXAwQjktdCNXt7mE18Y,10724
279
+ cvsuite/vlm/core/router.py,sha256=Nn8mMGp6Ftzjwf2ORG5r6f64Jb9va6PZ8ZO37WMhIsg,2050
280
+ cvsuite/vlm/core/adapters/__init__.py,sha256=dVVhZ7i4xpFox1hXg0Lz7tqzfPO4FLARby50bfUgyw8,250
281
+ cvsuite/vlm/core/adapters/flat_json_io.py,sha256=Q8vSTrsBQVk3fZHA37y4TjRZTlJI6kWsIcY0vZY1q1c,6350
282
+ cvsuite/vlm/core/adapters/images_io.py,sha256=qhNLND9J4NTu8bpcFo8FPLm7qqWBQBwqaERAplRB9sI,1444
283
+ cvsuite/vlm/core/adapters/shards_io.py,sha256=29RkSbgF0rLhb0bBUwxSY8uQsy_H8PWKl4feIgCQFeA,9424
284
+ cvsuite/vlm/core/adapters/vqa_style_io.py,sha256=G3mEWjw27y6xzkW0g2eo-bVPrLMrXysio30ZSSZcJLs,19596
285
+ cvsuite/vlm/output/__init__.py,sha256=VlIzDViW2a74sKYRsjwRI7mMgHvZZAuLkGaFjOBv26U,43
286
+ cvsuite/vlm/output/common.py,sha256=Vfb1eSGUKpo7lAd-LeOyPeAEFkMrJFpggxA1nflbc20,3790
287
+ cvsuite/vlm/output/commands/__init__.py,sha256=E0Rt8-HwgkXoN-ltYejBZpxodDsirjINXXwhQCVhHio,52
288
+ cvsuite/vlm/output/commands/inspect.py,sha256=VQvsOeo2PBQ9wqjPu-mAmwNsWvbD8kQ1qFdnIv6aK24,865
289
+ cvsuite/vlm/output/commands/to_json.py,sha256=zTQQzIi064fgRdS-0zUn5gHjKZacELYjB4I1355hyzY,2009
290
+ cvsuite/vlm/output/commands/to_shards.py,sha256=SKbNMIp0QRgIpTUj6ggekftc0JIwJfxA0nMDwg2ABz4,2508
291
+ cvsuite/vlm/output/commands/to_vqa_style.py,sha256=ku-2L-yqikJ7U6f46Ynk1jEoqcSSu4bIzIc5_2R_5Oo,2023
292
+ cvsuite/vlm/tests/__init__.py,sha256=7kKc0oYgTsY3z0nVBcID3NQfWAzSaENaJzNbMk2X9Js,25
293
+ cvsuite/vlm/tests/test_commands.py,sha256=Tv0co2O_ca-bd9hzrM2fp_s7m-Z3dy3TmpvKekcyzJk,26793
294
+ cvsuite/vlm/tests/test_map_answers.py,sha256=8oC5-ERmZ0VKV4tc3ToyKJMMg8F0qIbZu9S-dmMP4WA,7037
295
+ cvsuite/vlm/tests/test_output_stats.py,sha256=6nLzPxnF2bDQ4z5zVrqprG7YgwRs_v7dB1y5lBXEIk0,1731
296
+ cvsuite/vlm/transform/__init__.py,sha256=axvv1DheHxz5PIkNnmtRR7rls_zNumgv2GnMzJQQErQ,38
297
+ cvsuite/vlm/transform/commands/__init__.py,sha256=OT1yYNjhsS7oU96PO7MJd7Mdig-bPgO80y0Ij5C_dk0,57
298
+ cvsuite/vlm/transform/commands/ask.py,sha256=EXXSCHnc1fXijX9FT8cjqeMKpMbEe-P6aFzvz1g9p0o,529
299
+ cvsuite/vlm/transform/commands/caption.py,sha256=WYbsqAHJv7tNDbbxE8K7A4G6PKPt8SalShk9eQPpPdI,402
300
+ cvsuite/vlm/transform/commands/map_answers.py,sha256=WINTvYxGiPAPWhvBLhZaEFTXRtjMXuGSVozL0rUMK-I,754
301
+ cvsuite/vlm/transform/commands/vqa.py,sha256=gLtoCrjvlu6QgyzbKiSxCcNXMf9Vg-m-bcBn3jxU5h8,464
302
+ cvsuite/vlm/transform/core/__init__.py,sha256=QmfkG7zMy4stqbHNwtYvLwtUzH8-FPdN5UWn6lBuGog,39
303
+ cvsuite/vlm/transform/core/map_answers.py,sha256=zxcREdS2cflzHwITd6WHB9itbDasu-EJgOGg3WEUbQU,12695
304
+ cvsuite/vlm/transform/core/runtime.py,sha256=MV0fgEOFOyrzongim57UiON55hiZBTwJR86edPvP54c,15273
305
+ cv_suite-0.0.1.dist-info/METADATA,sha256=ekCdic5KMYG73R7B5g4Jc7trgkCH6Q8qxT6QvGh1Kpk,5962
306
+ cv_suite-0.0.1.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
307
+ cv_suite-0.0.1.dist-info/entry_points.txt,sha256=KKEHq1Y0eU71PL9k6Ycd3wQ1E66ve_tZyvGEEBptaV4,45
308
+ cv_suite-0.0.1.dist-info/top_level.txt,sha256=vq8sK4uFs7Zj4p2FmS0mfXSQKXGilyy1Qsy3E9P0cJ0,8
309
+ cv_suite-0.0.1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ cvsuite = cvsuite.cli:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Pedro Tonso
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ cvsuite
cvsuite/__init__.py ADDED
@@ -0,0 +1 @@
1
+ """Vision tools package."""
cvsuite/branch_cli.py ADDED
@@ -0,0 +1,158 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ import importlib
5
+ import os
6
+ import pkgutil
7
+ from dataclasses import dataclass
8
+ from pathlib import Path
9
+ from typing import Any, Iterable
10
+
11
+ from cvsuite.common.core import VisionDataset
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class CommandSpec:
16
+ cli_name: str
17
+ import_path: str
18
+ rel_parts: tuple[str, ...]
19
+
20
+
21
+ def _package_root(package_name: str) -> Path:
22
+ pkg = importlib.import_module(package_name)
23
+ if hasattr(pkg, "__file__") and pkg.__file__ is not None:
24
+ return Path(pkg.__file__).resolve().parent
25
+ return Path(next(iter(pkg.__path__))).resolve()
26
+
27
+
28
+ def _iter_commands_dirs(root: Path) -> Iterable[Path]:
29
+ for dirpath, dirnames, _filenames in os.walk(root):
30
+ dirnames[:] = [name for name in dirnames if name not in {"venv", "__pycache__"}]
31
+ current = Path(dirpath)
32
+ if current.name == "commands":
33
+ yield current
34
+
35
+
36
+ def discover_commands(package_name: str) -> list[CommandSpec]:
37
+ root = _package_root(package_name)
38
+ discovered: dict[str, CommandSpec] = {}
39
+ for commands_dir in sorted(_iter_commands_dirs(root)):
40
+ rel_dir = commands_dir.relative_to(root)
41
+ rel_parts = tuple(rel_dir.parts[:-1])
42
+ import_base = ".".join([package_name, *rel_dir.parts])
43
+ for mod in pkgutil.iter_modules([str(commands_dir)]):
44
+ if mod.ispkg:
45
+ continue
46
+ cli_parts = [part.replace("_", "-") for part in rel_parts]
47
+ cli_parts.append(mod.name.replace("_", "-"))
48
+ cli_name = "-".join(part for part in cli_parts if part)
49
+ discovered[cli_name] = CommandSpec(
50
+ cli_name=cli_name,
51
+ import_path=f"{import_base}.{mod.name}",
52
+ rel_parts=rel_parts,
53
+ )
54
+ return [discovered[name] for name in sorted(discovered)]
55
+
56
+
57
+ def build_generic_parser(package_name: str, prog: str, description: str) -> tuple[argparse.ArgumentParser, list[CommandSpec]]:
58
+ parser = argparse.ArgumentParser(prog=prog, description=description)
59
+ specs = discover_commands(package_name)
60
+ if not specs:
61
+ return parser, specs
62
+
63
+ subparsers = parser.add_subparsers(dest="command", metavar="COMMAND", required=True)
64
+ for spec in specs:
65
+ module = importlib.import_module(spec.import_path)
66
+ help_text = (module.__doc__ or "").strip()
67
+ subparser = subparsers.add_parser(spec.cli_name, help=help_text, description=help_text)
68
+ attach = getattr(module, "attach", None)
69
+ if attach is not None:
70
+ attach(subparser)
71
+ subparser.set_defaults(_run=getattr(module, "run", None))
72
+ return parser, specs
73
+
74
+
75
+ def result_to_exit_code(result: Any) -> int:
76
+ if result is None or isinstance(result, VisionDataset):
77
+ return 0
78
+ return int(result)
79
+
80
+
81
+ def run_generic_branch(package_name: str, prog: str, description: str, argv: list[str] | None = None) -> int:
82
+ parser, specs = build_generic_parser(package_name, prog=prog, description=description)
83
+ if not specs:
84
+ parser.parse_args(argv)
85
+ parser.print_help()
86
+ return 0
87
+
88
+ args = parser.parse_args(argv)
89
+ func = getattr(args, "_run", None)
90
+ if func is None:
91
+ parser.error("No command selected.")
92
+ result = func(args)
93
+ return result_to_exit_code(result)
94
+
95
+
96
+ # ---------------------------------------------------------------------------
97
+ # Shared pipeline CLI helpers (used by classify, label, vlm, gen)
98
+ # ---------------------------------------------------------------------------
99
+
100
+ def build_parser(module: Any, prog: str) -> argparse.ArgumentParser:
101
+ parser = argparse.ArgumentParser(
102
+ prog=prog,
103
+ description=(module.__doc__ or "").strip(),
104
+ formatter_class=argparse.RawDescriptionHelpFormatter,
105
+ )
106
+ attach = getattr(module, "attach", None)
107
+ if attach is not None:
108
+ attach(parser)
109
+ return parser
110
+
111
+
112
+ def parse_help(parser: argparse.ArgumentParser, argv: list[str]) -> int:
113
+ try:
114
+ parser.parse_args(argv)
115
+ except SystemExit as exc:
116
+ if exc.code == 0:
117
+ return 0
118
+ raise
119
+ return 0
120
+
121
+
122
+ def split_rest(
123
+ rest: list[str],
124
+ commands: dict[str, Any],
125
+ transform_commands: dict[str, Any],
126
+ ) -> tuple[str | None, list[str], str | None, list[str]]:
127
+ if not rest:
128
+ return None, [], None, []
129
+ command_index = next((i for i, t in enumerate(rest) if t in commands), None)
130
+ if command_index is None:
131
+ return None, [], None, rest
132
+ transform_name: str | None = None
133
+ transform_args: list[str] = []
134
+ if command_index > 0:
135
+ if rest[0] not in transform_commands:
136
+ return None, [], None, rest
137
+ transform_name = rest[0]
138
+ transform_args = rest[1:command_index]
139
+ return transform_name, transform_args, rest[command_index], rest[command_index + 1:]
140
+
141
+
142
+ def apply_transform_output_hints(
143
+ prog: str,
144
+ transform_name: str | None,
145
+ parsed_transform: argparse.Namespace | None,
146
+ command_name: str,
147
+ parsed_command: argparse.Namespace,
148
+ ) -> None:
149
+ if transform_name != "sample" or parsed_transform is None:
150
+ return
151
+ if not getattr(parsed_transform, "hardlink", False):
152
+ return
153
+ if not hasattr(parsed_command, "hardlink"):
154
+ raise SystemExit(
155
+ f"`{prog} sample --hardlink` can't be used with `{command_name}` because "
156
+ "that output command does not support `--hardlink`."
157
+ )
158
+ setattr(parsed_command, "hardlink", True)
@@ -0,0 +1 @@
1
+ """Class dataset pipeline for ``cvsuite class``."""