wandb 0.22.1__py3-none-win_arm64.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 (919) hide show
  1. package_readme.md +97 -0
  2. wandb/__init__.py +248 -0
  3. wandb/__init__.pyi +1230 -0
  4. wandb/__main__.py +3 -0
  5. wandb/_analytics.py +65 -0
  6. wandb/_iterutils.py +73 -0
  7. wandb/_pydantic/__init__.py +30 -0
  8. wandb/_pydantic/base.py +108 -0
  9. wandb/_pydantic/field_types.py +29 -0
  10. wandb/_pydantic/utils.py +80 -0
  11. wandb/_pydantic/v1_compat.py +301 -0
  12. wandb/_strutils.py +40 -0
  13. wandb/agents/__init__.py +0 -0
  14. wandb/agents/pyagent.py +386 -0
  15. wandb/analytics/__init__.py +3 -0
  16. wandb/analytics/sentry.py +267 -0
  17. wandb/apis/__init__.py +50 -0
  18. wandb/apis/attrs.py +52 -0
  19. wandb/apis/importers/__init__.py +1 -0
  20. wandb/apis/importers/internals/internal.py +375 -0
  21. wandb/apis/importers/internals/protocols.py +103 -0
  22. wandb/apis/importers/internals/util.py +78 -0
  23. wandb/apis/importers/mlflow.py +254 -0
  24. wandb/apis/importers/validation.py +108 -0
  25. wandb/apis/importers/wandb.py +1608 -0
  26. wandb/apis/internal.py +241 -0
  27. wandb/apis/normalize.py +83 -0
  28. wandb/apis/paginator.py +138 -0
  29. wandb/apis/public/__init__.py +78 -0
  30. wandb/apis/public/api.py +2513 -0
  31. wandb/apis/public/artifacts.py +1050 -0
  32. wandb/apis/public/automations.py +86 -0
  33. wandb/apis/public/const.py +6 -0
  34. wandb/apis/public/files.py +411 -0
  35. wandb/apis/public/history.py +203 -0
  36. wandb/apis/public/integrations.py +203 -0
  37. wandb/apis/public/jobs.py +744 -0
  38. wandb/apis/public/projects.py +278 -0
  39. wandb/apis/public/query_generator.py +179 -0
  40. wandb/apis/public/registries/__init__.py +7 -0
  41. wandb/apis/public/registries/_freezable_list.py +176 -0
  42. wandb/apis/public/registries/_utils.py +139 -0
  43. wandb/apis/public/registries/registries_search.py +353 -0
  44. wandb/apis/public/registries/registry.py +370 -0
  45. wandb/apis/public/reports.py +597 -0
  46. wandb/apis/public/runs.py +1438 -0
  47. wandb/apis/public/sweeps.py +441 -0
  48. wandb/apis/public/teams.py +237 -0
  49. wandb/apis/public/users.py +179 -0
  50. wandb/apis/public/utils.py +211 -0
  51. wandb/apis/reports/__init__.py +1 -0
  52. wandb/apis/reports/v1/__init__.py +8 -0
  53. wandb/apis/reports/v2/__init__.py +8 -0
  54. wandb/apis/workspaces/__init__.py +8 -0
  55. wandb/automations/__init__.py +73 -0
  56. wandb/automations/_filters/__init__.py +40 -0
  57. wandb/automations/_filters/expressions.py +182 -0
  58. wandb/automations/_filters/operators.py +259 -0
  59. wandb/automations/_filters/run_metrics.py +330 -0
  60. wandb/automations/_generated/__init__.py +104 -0
  61. wandb/automations/_generated/create_automation.py +17 -0
  62. wandb/automations/_generated/create_generic_webhook_integration.py +37 -0
  63. wandb/automations/_generated/delete_automation.py +15 -0
  64. wandb/automations/_generated/enums.py +35 -0
  65. wandb/automations/_generated/fragments.py +293 -0
  66. wandb/automations/_generated/generic_webhook_integrations_by_entity.py +22 -0
  67. wandb/automations/_generated/get_automations.py +24 -0
  68. wandb/automations/_generated/get_automations_by_entity.py +26 -0
  69. wandb/automations/_generated/input_types.py +104 -0
  70. wandb/automations/_generated/integrations_by_entity.py +22 -0
  71. wandb/automations/_generated/operations.py +647 -0
  72. wandb/automations/_generated/slack_integrations_by_entity.py +22 -0
  73. wandb/automations/_generated/update_automation.py +17 -0
  74. wandb/automations/_utils.py +235 -0
  75. wandb/automations/_validators.py +185 -0
  76. wandb/automations/actions.py +220 -0
  77. wandb/automations/automations.py +85 -0
  78. wandb/automations/events.py +284 -0
  79. wandb/automations/integrations.py +45 -0
  80. wandb/automations/scopes.py +78 -0
  81. wandb/beta/workflows.py +324 -0
  82. wandb/bin/gpu_stats.exe +0 -0
  83. wandb/bin/wandb-core +0 -0
  84. wandb/cli/__init__.py +0 -0
  85. wandb/cli/beta.py +93 -0
  86. wandb/cli/beta_sync.py +224 -0
  87. wandb/cli/cli.py +2883 -0
  88. wandb/data_types.py +66 -0
  89. wandb/docker/__init__.py +290 -0
  90. wandb/docker/names.py +40 -0
  91. wandb/docker/wandb-entrypoint.sh +33 -0
  92. wandb/env.py +535 -0
  93. wandb/errors/__init__.py +17 -0
  94. wandb/errors/errors.py +40 -0
  95. wandb/errors/links.py +73 -0
  96. wandb/errors/term.py +415 -0
  97. wandb/errors/util.py +57 -0
  98. wandb/errors/warnings.py +2 -0
  99. wandb/filesync/__init__.py +0 -0
  100. wandb/filesync/dir_watcher.py +404 -0
  101. wandb/filesync/stats.py +100 -0
  102. wandb/filesync/step_checksum.py +142 -0
  103. wandb/filesync/step_prepare.py +179 -0
  104. wandb/filesync/step_upload.py +287 -0
  105. wandb/filesync/upload_job.py +142 -0
  106. wandb/integration/__init__.py +0 -0
  107. wandb/integration/catboost/__init__.py +5 -0
  108. wandb/integration/catboost/catboost.py +182 -0
  109. wandb/integration/cohere/__init__.py +3 -0
  110. wandb/integration/cohere/cohere.py +21 -0
  111. wandb/integration/cohere/resolver.py +347 -0
  112. wandb/integration/diffusers/__init__.py +3 -0
  113. wandb/integration/diffusers/autologger.py +76 -0
  114. wandb/integration/diffusers/pipeline_resolver.py +50 -0
  115. wandb/integration/diffusers/resolvers/__init__.py +9 -0
  116. wandb/integration/diffusers/resolvers/multimodal.py +881 -0
  117. wandb/integration/diffusers/resolvers/utils.py +102 -0
  118. wandb/integration/dspy/__init__.py +5 -0
  119. wandb/integration/dspy/dspy.py +422 -0
  120. wandb/integration/fastai/__init__.py +243 -0
  121. wandb/integration/gym/__init__.py +98 -0
  122. wandb/integration/huggingface/__init__.py +3 -0
  123. wandb/integration/huggingface/huggingface.py +18 -0
  124. wandb/integration/huggingface/resolver.py +213 -0
  125. wandb/integration/keras/__init__.py +11 -0
  126. wandb/integration/keras/callbacks/__init__.py +5 -0
  127. wandb/integration/keras/callbacks/metrics_logger.py +129 -0
  128. wandb/integration/keras/callbacks/model_checkpoint.py +188 -0
  129. wandb/integration/keras/callbacks/tables_builder.py +228 -0
  130. wandb/integration/keras/keras.py +1086 -0
  131. wandb/integration/kfp/__init__.py +6 -0
  132. wandb/integration/kfp/helpers.py +28 -0
  133. wandb/integration/kfp/kfp_patch.py +335 -0
  134. wandb/integration/kfp/wandb_logging.py +182 -0
  135. wandb/integration/langchain/__init__.py +3 -0
  136. wandb/integration/langchain/wandb_tracer.py +49 -0
  137. wandb/integration/lightgbm/__init__.py +239 -0
  138. wandb/integration/lightning/__init__.py +0 -0
  139. wandb/integration/lightning/fabric/__init__.py +3 -0
  140. wandb/integration/lightning/fabric/logger.py +763 -0
  141. wandb/integration/metaflow/__init__.py +9 -0
  142. wandb/integration/metaflow/data_pandas.py +74 -0
  143. wandb/integration/metaflow/data_pytorch.py +75 -0
  144. wandb/integration/metaflow/data_sklearn.py +76 -0
  145. wandb/integration/metaflow/errors.py +13 -0
  146. wandb/integration/metaflow/metaflow.py +327 -0
  147. wandb/integration/openai/__init__.py +3 -0
  148. wandb/integration/openai/fine_tuning.py +480 -0
  149. wandb/integration/openai/openai.py +22 -0
  150. wandb/integration/openai/resolver.py +240 -0
  151. wandb/integration/prodigy/__init__.py +3 -0
  152. wandb/integration/prodigy/prodigy.py +291 -0
  153. wandb/integration/sacred/__init__.py +117 -0
  154. wandb/integration/sagemaker/__init__.py +14 -0
  155. wandb/integration/sagemaker/auth.py +29 -0
  156. wandb/integration/sagemaker/config.py +58 -0
  157. wandb/integration/sagemaker/files.py +2 -0
  158. wandb/integration/sagemaker/resources.py +63 -0
  159. wandb/integration/sb3/__init__.py +3 -0
  160. wandb/integration/sb3/sb3.py +147 -0
  161. wandb/integration/sklearn/__init__.py +37 -0
  162. wandb/integration/sklearn/calculate/__init__.py +32 -0
  163. wandb/integration/sklearn/calculate/calibration_curves.py +125 -0
  164. wandb/integration/sklearn/calculate/class_proportions.py +68 -0
  165. wandb/integration/sklearn/calculate/confusion_matrix.py +93 -0
  166. wandb/integration/sklearn/calculate/decision_boundaries.py +40 -0
  167. wandb/integration/sklearn/calculate/elbow_curve.py +55 -0
  168. wandb/integration/sklearn/calculate/feature_importances.py +67 -0
  169. wandb/integration/sklearn/calculate/learning_curve.py +64 -0
  170. wandb/integration/sklearn/calculate/outlier_candidates.py +69 -0
  171. wandb/integration/sklearn/calculate/residuals.py +86 -0
  172. wandb/integration/sklearn/calculate/silhouette.py +118 -0
  173. wandb/integration/sklearn/calculate/summary_metrics.py +62 -0
  174. wandb/integration/sklearn/plot/__init__.py +35 -0
  175. wandb/integration/sklearn/plot/classifier.py +329 -0
  176. wandb/integration/sklearn/plot/clusterer.py +146 -0
  177. wandb/integration/sklearn/plot/regressor.py +121 -0
  178. wandb/integration/sklearn/plot/shared.py +91 -0
  179. wandb/integration/sklearn/utils.py +184 -0
  180. wandb/integration/tensorboard/__init__.py +10 -0
  181. wandb/integration/tensorboard/log.py +351 -0
  182. wandb/integration/tensorboard/monkeypatch.py +186 -0
  183. wandb/integration/tensorflow/__init__.py +5 -0
  184. wandb/integration/tensorflow/estimator_hook.py +54 -0
  185. wandb/integration/torch/__init__.py +0 -0
  186. wandb/integration/torch/wandb_torch.py +554 -0
  187. wandb/integration/ultralytics/__init__.py +11 -0
  188. wandb/integration/ultralytics/bbox_utils.py +215 -0
  189. wandb/integration/ultralytics/callback.py +528 -0
  190. wandb/integration/ultralytics/classification_utils.py +83 -0
  191. wandb/integration/ultralytics/mask_utils.py +202 -0
  192. wandb/integration/ultralytics/pose_utils.py +103 -0
  193. wandb/integration/weave/__init__.py +6 -0
  194. wandb/integration/weave/interface.py +49 -0
  195. wandb/integration/weave/weave.py +118 -0
  196. wandb/integration/xgboost/__init__.py +11 -0
  197. wandb/integration/xgboost/xgboost.py +189 -0
  198. wandb/integration/yolov8/__init__.py +0 -0
  199. wandb/integration/yolov8/yolov8.py +284 -0
  200. wandb/jupyter.py +538 -0
  201. wandb/mpmain/__init__.py +0 -0
  202. wandb/mpmain/__main__.py +1 -0
  203. wandb/old/__init__.py +0 -0
  204. wandb/old/core.py +53 -0
  205. wandb/old/settings.py +176 -0
  206. wandb/old/summary.py +438 -0
  207. wandb/plot/__init__.py +30 -0
  208. wandb/plot/bar.py +71 -0
  209. wandb/plot/confusion_matrix.py +185 -0
  210. wandb/plot/custom_chart.py +147 -0
  211. wandb/plot/histogram.py +66 -0
  212. wandb/plot/line.py +75 -0
  213. wandb/plot/line_series.py +173 -0
  214. wandb/plot/pr_curve.py +186 -0
  215. wandb/plot/roc_curve.py +163 -0
  216. wandb/plot/scatter.py +66 -0
  217. wandb/plot/utils.py +184 -0
  218. wandb/plot/viz.py +41 -0
  219. wandb/proto/__init__.py +0 -0
  220. wandb/proto/v3/__init__.py +0 -0
  221. wandb/proto/v3/wandb_base_pb2.py +55 -0
  222. wandb/proto/v3/wandb_internal_pb2.py +1738 -0
  223. wandb/proto/v3/wandb_server_pb2.py +209 -0
  224. wandb/proto/v3/wandb_settings_pb2.py +122 -0
  225. wandb/proto/v3/wandb_sync_pb2.py +100 -0
  226. wandb/proto/v3/wandb_telemetry_pb2.py +106 -0
  227. wandb/proto/v4/__init__.py +0 -0
  228. wandb/proto/v4/wandb_base_pb2.py +30 -0
  229. wandb/proto/v4/wandb_internal_pb2.py +384 -0
  230. wandb/proto/v4/wandb_server_pb2.py +64 -0
  231. wandb/proto/v4/wandb_settings_pb2.py +47 -0
  232. wandb/proto/v4/wandb_sync_pb2.py +42 -0
  233. wandb/proto/v4/wandb_telemetry_pb2.py +41 -0
  234. wandb/proto/v5/wandb_base_pb2.py +31 -0
  235. wandb/proto/v5/wandb_internal_pb2.py +385 -0
  236. wandb/proto/v5/wandb_server_pb2.py +65 -0
  237. wandb/proto/v5/wandb_settings_pb2.py +48 -0
  238. wandb/proto/v5/wandb_sync_pb2.py +43 -0
  239. wandb/proto/v5/wandb_telemetry_pb2.py +42 -0
  240. wandb/proto/v6/wandb_base_pb2.py +41 -0
  241. wandb/proto/v6/wandb_internal_pb2.py +395 -0
  242. wandb/proto/v6/wandb_server_pb2.py +75 -0
  243. wandb/proto/v6/wandb_settings_pb2.py +58 -0
  244. wandb/proto/v6/wandb_sync_pb2.py +53 -0
  245. wandb/proto/v6/wandb_telemetry_pb2.py +52 -0
  246. wandb/proto/wandb_base_pb2.py +12 -0
  247. wandb/proto/wandb_deprecated.py +59 -0
  248. wandb/proto/wandb_generate_deprecated.py +30 -0
  249. wandb/proto/wandb_generate_proto.py +50 -0
  250. wandb/proto/wandb_internal_pb2.py +18 -0
  251. wandb/proto/wandb_server_pb2.py +12 -0
  252. wandb/proto/wandb_settings_pb2.py +12 -0
  253. wandb/proto/wandb_sync_pb2.py +12 -0
  254. wandb/proto/wandb_telemetry_pb2.py +12 -0
  255. wandb/py.typed +0 -0
  256. wandb/sdk/__init__.py +37 -0
  257. wandb/sdk/artifacts/__init__.py +0 -0
  258. wandb/sdk/artifacts/_factories.py +22 -0
  259. wandb/sdk/artifacts/_generated/__init__.py +208 -0
  260. wandb/sdk/artifacts/_generated/add_aliases.py +21 -0
  261. wandb/sdk/artifacts/_generated/artifact_by_id.py +17 -0
  262. wandb/sdk/artifacts/_generated/artifact_by_name.py +22 -0
  263. wandb/sdk/artifacts/_generated/artifact_collection_membership_file_urls.py +43 -0
  264. wandb/sdk/artifacts/_generated/artifact_collection_membership_files.py +43 -0
  265. wandb/sdk/artifacts/_generated/artifact_created_by.py +47 -0
  266. wandb/sdk/artifacts/_generated/artifact_file_urls.py +22 -0
  267. wandb/sdk/artifacts/_generated/artifact_type.py +31 -0
  268. wandb/sdk/artifacts/_generated/artifact_used_by.py +43 -0
  269. wandb/sdk/artifacts/_generated/artifact_version_files.py +36 -0
  270. wandb/sdk/artifacts/_generated/artifact_via_membership_by_name.py +26 -0
  271. wandb/sdk/artifacts/_generated/create_artifact_collection_tag_assignments.py +36 -0
  272. wandb/sdk/artifacts/_generated/delete_aliases.py +21 -0
  273. wandb/sdk/artifacts/_generated/delete_artifact.py +28 -0
  274. wandb/sdk/artifacts/_generated/delete_artifact_collection_tag_assignments.py +25 -0
  275. wandb/sdk/artifacts/_generated/delete_artifact_portfolio.py +35 -0
  276. wandb/sdk/artifacts/_generated/delete_artifact_sequence.py +35 -0
  277. wandb/sdk/artifacts/_generated/enums.py +22 -0
  278. wandb/sdk/artifacts/_generated/fetch_artifact_manifest.py +38 -0
  279. wandb/sdk/artifacts/_generated/fetch_linked_artifacts.py +67 -0
  280. wandb/sdk/artifacts/_generated/fetch_registries.py +32 -0
  281. wandb/sdk/artifacts/_generated/fragments.py +524 -0
  282. wandb/sdk/artifacts/_generated/input_types.py +46 -0
  283. wandb/sdk/artifacts/_generated/link_artifact.py +27 -0
  284. wandb/sdk/artifacts/_generated/move_artifact_collection.py +35 -0
  285. wandb/sdk/artifacts/_generated/operations.py +1253 -0
  286. wandb/sdk/artifacts/_generated/project_artifact_collection.py +101 -0
  287. wandb/sdk/artifacts/_generated/project_artifact_collections.py +33 -0
  288. wandb/sdk/artifacts/_generated/project_artifact_type.py +24 -0
  289. wandb/sdk/artifacts/_generated/project_artifact_types.py +24 -0
  290. wandb/sdk/artifacts/_generated/project_artifacts.py +42 -0
  291. wandb/sdk/artifacts/_generated/registry_collections.py +34 -0
  292. wandb/sdk/artifacts/_generated/registry_versions.py +34 -0
  293. wandb/sdk/artifacts/_generated/run_input_artifacts.py +31 -0
  294. wandb/sdk/artifacts/_generated/run_output_artifacts.py +31 -0
  295. wandb/sdk/artifacts/_generated/type_info.py +19 -0
  296. wandb/sdk/artifacts/_generated/unlink_artifact.py +25 -0
  297. wandb/sdk/artifacts/_generated/update_artifact.py +26 -0
  298. wandb/sdk/artifacts/_generated/update_artifact_portfolio.py +35 -0
  299. wandb/sdk/artifacts/_generated/update_artifact_sequence.py +35 -0
  300. wandb/sdk/artifacts/_gqlutils.py +47 -0
  301. wandb/sdk/artifacts/_internal_artifact.py +54 -0
  302. wandb/sdk/artifacts/_models/__init__.py +4 -0
  303. wandb/sdk/artifacts/_models/base_model.py +20 -0
  304. wandb/sdk/artifacts/_validators.py +338 -0
  305. wandb/sdk/artifacts/artifact.py +2683 -0
  306. wandb/sdk/artifacts/artifact_download_logger.py +45 -0
  307. wandb/sdk/artifacts/artifact_file_cache.py +256 -0
  308. wandb/sdk/artifacts/artifact_instance_cache.py +17 -0
  309. wandb/sdk/artifacts/artifact_manifest.py +76 -0
  310. wandb/sdk/artifacts/artifact_manifest_entry.py +315 -0
  311. wandb/sdk/artifacts/artifact_manifests/__init__.py +0 -0
  312. wandb/sdk/artifacts/artifact_manifests/artifact_manifest_v1.py +94 -0
  313. wandb/sdk/artifacts/artifact_saver.py +277 -0
  314. wandb/sdk/artifacts/artifact_state.py +13 -0
  315. wandb/sdk/artifacts/artifact_ttl.py +9 -0
  316. wandb/sdk/artifacts/exceptions.py +72 -0
  317. wandb/sdk/artifacts/staging.py +27 -0
  318. wandb/sdk/artifacts/storage_handler.py +62 -0
  319. wandb/sdk/artifacts/storage_handlers/__init__.py +0 -0
  320. wandb/sdk/artifacts/storage_handlers/azure_handler.py +214 -0
  321. wandb/sdk/artifacts/storage_handlers/gcs_handler.py +224 -0
  322. wandb/sdk/artifacts/storage_handlers/http_handler.py +112 -0
  323. wandb/sdk/artifacts/storage_handlers/local_file_handler.py +142 -0
  324. wandb/sdk/artifacts/storage_handlers/multi_handler.py +56 -0
  325. wandb/sdk/artifacts/storage_handlers/s3_handler.py +340 -0
  326. wandb/sdk/artifacts/storage_handlers/tracking_handler.py +68 -0
  327. wandb/sdk/artifacts/storage_handlers/wb_artifact_handler.py +131 -0
  328. wandb/sdk/artifacts/storage_handlers/wb_local_artifact_handler.py +74 -0
  329. wandb/sdk/artifacts/storage_layout.py +8 -0
  330. wandb/sdk/artifacts/storage_policies/__init__.py +4 -0
  331. wandb/sdk/artifacts/storage_policies/_factories.py +63 -0
  332. wandb/sdk/artifacts/storage_policies/register.py +1 -0
  333. wandb/sdk/artifacts/storage_policies/wandb_storage_policy.py +525 -0
  334. wandb/sdk/artifacts/storage_policy.py +75 -0
  335. wandb/sdk/backend/__init__.py +0 -0
  336. wandb/sdk/backend/backend.py +57 -0
  337. wandb/sdk/data_types/__init__.py +0 -0
  338. wandb/sdk/data_types/_dtypes.py +914 -0
  339. wandb/sdk/data_types/_private.py +10 -0
  340. wandb/sdk/data_types/audio.py +208 -0
  341. wandb/sdk/data_types/base_types/__init__.py +0 -0
  342. wandb/sdk/data_types/base_types/json_metadata.py +55 -0
  343. wandb/sdk/data_types/base_types/media.py +339 -0
  344. wandb/sdk/data_types/base_types/wb_value.py +295 -0
  345. wandb/sdk/data_types/bokeh.py +91 -0
  346. wandb/sdk/data_types/graph.py +439 -0
  347. wandb/sdk/data_types/helper_types/__init__.py +0 -0
  348. wandb/sdk/data_types/helper_types/bounding_boxes_2d.py +327 -0
  349. wandb/sdk/data_types/helper_types/classes.py +159 -0
  350. wandb/sdk/data_types/helper_types/image_mask.py +251 -0
  351. wandb/sdk/data_types/histogram.py +107 -0
  352. wandb/sdk/data_types/html.py +165 -0
  353. wandb/sdk/data_types/image.py +985 -0
  354. wandb/sdk/data_types/molecule.py +250 -0
  355. wandb/sdk/data_types/object_3d.py +495 -0
  356. wandb/sdk/data_types/plotly.py +95 -0
  357. wandb/sdk/data_types/saved_model.py +435 -0
  358. wandb/sdk/data_types/table.py +1468 -0
  359. wandb/sdk/data_types/table_decorators.py +108 -0
  360. wandb/sdk/data_types/trace_tree.py +440 -0
  361. wandb/sdk/data_types/utils.py +260 -0
  362. wandb/sdk/data_types/video.py +303 -0
  363. wandb/sdk/integration_utils/__init__.py +0 -0
  364. wandb/sdk/integration_utils/auto_logging.py +232 -0
  365. wandb/sdk/integration_utils/data_logging.py +475 -0
  366. wandb/sdk/interface/__init__.py +0 -0
  367. wandb/sdk/interface/constants.py +4 -0
  368. wandb/sdk/interface/interface.py +1093 -0
  369. wandb/sdk/interface/interface_queue.py +50 -0
  370. wandb/sdk/interface/interface_shared.py +473 -0
  371. wandb/sdk/interface/interface_sock.py +55 -0
  372. wandb/sdk/interface/summary_record.py +67 -0
  373. wandb/sdk/internal/__init__.py +0 -0
  374. wandb/sdk/internal/_generated/__init__.py +5 -0
  375. wandb/sdk/internal/_generated/enums.py +4 -0
  376. wandb/sdk/internal/_generated/input_types.py +4 -0
  377. wandb/sdk/internal/_generated/operations.py +15 -0
  378. wandb/sdk/internal/_generated/server_features_query.py +27 -0
  379. wandb/sdk/internal/context.py +89 -0
  380. wandb/sdk/internal/datastore.py +293 -0
  381. wandb/sdk/internal/file_pusher.py +177 -0
  382. wandb/sdk/internal/file_stream.py +686 -0
  383. wandb/sdk/internal/handler.py +854 -0
  384. wandb/sdk/internal/incremental_table_util.py +53 -0
  385. wandb/sdk/internal/internal_api.py +4723 -0
  386. wandb/sdk/internal/job_builder.py +639 -0
  387. wandb/sdk/internal/profiler.py +79 -0
  388. wandb/sdk/internal/progress.py +77 -0
  389. wandb/sdk/internal/run.py +27 -0
  390. wandb/sdk/internal/sample.py +70 -0
  391. wandb/sdk/internal/sender.py +1692 -0
  392. wandb/sdk/internal/sender_config.py +203 -0
  393. wandb/sdk/internal/settings_static.py +40 -0
  394. wandb/sdk/internal/tb_watcher.py +519 -0
  395. wandb/sdk/internal/thread_local_settings.py +18 -0
  396. wandb/sdk/launch/__init__.py +15 -0
  397. wandb/sdk/launch/_launch.py +331 -0
  398. wandb/sdk/launch/_launch_add.py +255 -0
  399. wandb/sdk/launch/_project_spec.py +565 -0
  400. wandb/sdk/launch/agent/__init__.py +5 -0
  401. wandb/sdk/launch/agent/agent.py +931 -0
  402. wandb/sdk/launch/agent/config.py +296 -0
  403. wandb/sdk/launch/agent/job_status_tracker.py +55 -0
  404. wandb/sdk/launch/agent/run_queue_item_file_saver.py +39 -0
  405. wandb/sdk/launch/builder/__init__.py +0 -0
  406. wandb/sdk/launch/builder/abstract.py +156 -0
  407. wandb/sdk/launch/builder/build.py +296 -0
  408. wandb/sdk/launch/builder/context_manager.py +235 -0
  409. wandb/sdk/launch/builder/docker_builder.py +177 -0
  410. wandb/sdk/launch/builder/kaniko_builder.py +595 -0
  411. wandb/sdk/launch/builder/noop.py +58 -0
  412. wandb/sdk/launch/builder/templates/_wandb_bootstrap.py +188 -0
  413. wandb/sdk/launch/builder/templates/dockerfile.py +92 -0
  414. wandb/sdk/launch/create_job.py +541 -0
  415. wandb/sdk/launch/environment/abstract.py +29 -0
  416. wandb/sdk/launch/environment/aws_environment.py +322 -0
  417. wandb/sdk/launch/environment/azure_environment.py +105 -0
  418. wandb/sdk/launch/environment/gcp_environment.py +334 -0
  419. wandb/sdk/launch/environment/local_environment.py +65 -0
  420. wandb/sdk/launch/errors.py +13 -0
  421. wandb/sdk/launch/git_reference.py +109 -0
  422. wandb/sdk/launch/inputs/files.py +148 -0
  423. wandb/sdk/launch/inputs/internal.py +315 -0
  424. wandb/sdk/launch/inputs/manage.py +113 -0
  425. wandb/sdk/launch/inputs/schema.py +70 -0
  426. wandb/sdk/launch/loader.py +249 -0
  427. wandb/sdk/launch/registry/abstract.py +48 -0
  428. wandb/sdk/launch/registry/anon.py +29 -0
  429. wandb/sdk/launch/registry/azure_container_registry.py +124 -0
  430. wandb/sdk/launch/registry/elastic_container_registry.py +192 -0
  431. wandb/sdk/launch/registry/google_artifact_registry.py +219 -0
  432. wandb/sdk/launch/registry/local_registry.py +65 -0
  433. wandb/sdk/launch/runner/__init__.py +0 -0
  434. wandb/sdk/launch/runner/abstract.py +185 -0
  435. wandb/sdk/launch/runner/kubernetes_monitor.py +473 -0
  436. wandb/sdk/launch/runner/kubernetes_runner.py +1290 -0
  437. wandb/sdk/launch/runner/local_container.py +301 -0
  438. wandb/sdk/launch/runner/local_process.py +78 -0
  439. wandb/sdk/launch/runner/sagemaker_runner.py +424 -0
  440. wandb/sdk/launch/runner/vertex_runner.py +225 -0
  441. wandb/sdk/launch/sweeps/__init__.py +37 -0
  442. wandb/sdk/launch/sweeps/scheduler.py +739 -0
  443. wandb/sdk/launch/sweeps/scheduler_sweep.py +90 -0
  444. wandb/sdk/launch/sweeps/utils.py +324 -0
  445. wandb/sdk/launch/utils.py +827 -0
  446. wandb/sdk/launch/wandb_reference.py +138 -0
  447. wandb/sdk/lib/__init__.py +5 -0
  448. wandb/sdk/lib/apikey.py +334 -0
  449. wandb/sdk/lib/asyncio_compat.py +278 -0
  450. wandb/sdk/lib/asyncio_manager.py +252 -0
  451. wandb/sdk/lib/capped_dict.py +26 -0
  452. wandb/sdk/lib/config_util.py +101 -0
  453. wandb/sdk/lib/console_capture.py +219 -0
  454. wandb/sdk/lib/credentials.py +141 -0
  455. wandb/sdk/lib/deprecate.py +27 -0
  456. wandb/sdk/lib/disabled.py +30 -0
  457. wandb/sdk/lib/exit_hooks.py +54 -0
  458. wandb/sdk/lib/file_stream_utils.py +118 -0
  459. wandb/sdk/lib/filenames.py +64 -0
  460. wandb/sdk/lib/filesystem.py +372 -0
  461. wandb/sdk/lib/fsm.py +165 -0
  462. wandb/sdk/lib/gitlib.py +240 -0
  463. wandb/sdk/lib/gql_request.py +76 -0
  464. wandb/sdk/lib/handler_util.py +21 -0
  465. wandb/sdk/lib/hashutil.py +106 -0
  466. wandb/sdk/lib/import_hooks.py +275 -0
  467. wandb/sdk/lib/interrupt.py +37 -0
  468. wandb/sdk/lib/ipython.py +126 -0
  469. wandb/sdk/lib/json_util.py +75 -0
  470. wandb/sdk/lib/lazyloader.py +63 -0
  471. wandb/sdk/lib/module.py +72 -0
  472. wandb/sdk/lib/paths.py +108 -0
  473. wandb/sdk/lib/preinit.py +42 -0
  474. wandb/sdk/lib/printer.py +567 -0
  475. wandb/sdk/lib/printer_asyncio.py +48 -0
  476. wandb/sdk/lib/progress.py +325 -0
  477. wandb/sdk/lib/proto_util.py +90 -0
  478. wandb/sdk/lib/redirect.py +876 -0
  479. wandb/sdk/lib/retry.py +395 -0
  480. wandb/sdk/lib/run_moment.py +82 -0
  481. wandb/sdk/lib/runid.py +12 -0
  482. wandb/sdk/lib/server.py +58 -0
  483. wandb/sdk/lib/service/ipc_support.py +13 -0
  484. wandb/sdk/lib/service/service_client.py +102 -0
  485. wandb/sdk/lib/service/service_connection.py +238 -0
  486. wandb/sdk/lib/service/service_port_file.py +105 -0
  487. wandb/sdk/lib/service/service_process.py +111 -0
  488. wandb/sdk/lib/service/service_token.py +181 -0
  489. wandb/sdk/lib/sparkline.py +44 -0
  490. wandb/sdk/lib/telemetry.py +100 -0
  491. wandb/sdk/lib/timed_input.py +133 -0
  492. wandb/sdk/lib/timer.py +19 -0
  493. wandb/sdk/lib/wb_logging.py +161 -0
  494. wandb/sdk/mailbox/__init__.py +23 -0
  495. wandb/sdk/mailbox/mailbox.py +143 -0
  496. wandb/sdk/mailbox/mailbox_handle.py +134 -0
  497. wandb/sdk/mailbox/response_handle.py +99 -0
  498. wandb/sdk/mailbox/wait_with_progress.py +100 -0
  499. wandb/sdk/projects/_generated/__init__.py +26 -0
  500. wandb/sdk/projects/_generated/delete_project.py +22 -0
  501. wandb/sdk/projects/_generated/enums.py +4 -0
  502. wandb/sdk/projects/_generated/fetch_registry.py +22 -0
  503. wandb/sdk/projects/_generated/fragments.py +41 -0
  504. wandb/sdk/projects/_generated/input_types.py +13 -0
  505. wandb/sdk/projects/_generated/operations.py +88 -0
  506. wandb/sdk/projects/_generated/rename_project.py +27 -0
  507. wandb/sdk/projects/_generated/upsert_registry_project.py +27 -0
  508. wandb/sdk/verify/__init__.py +0 -0
  509. wandb/sdk/verify/verify.py +555 -0
  510. wandb/sdk/wandb_alerts.py +12 -0
  511. wandb/sdk/wandb_config.py +323 -0
  512. wandb/sdk/wandb_helper.py +54 -0
  513. wandb/sdk/wandb_init.py +1601 -0
  514. wandb/sdk/wandb_login.py +358 -0
  515. wandb/sdk/wandb_metric.py +112 -0
  516. wandb/sdk/wandb_require.py +88 -0
  517. wandb/sdk/wandb_require_helpers.py +44 -0
  518. wandb/sdk/wandb_run.py +4102 -0
  519. wandb/sdk/wandb_settings.py +2197 -0
  520. wandb/sdk/wandb_setup.py +560 -0
  521. wandb/sdk/wandb_summary.py +150 -0
  522. wandb/sdk/wandb_sweep.py +120 -0
  523. wandb/sdk/wandb_sync.py +71 -0
  524. wandb/sdk/wandb_watch.py +146 -0
  525. wandb/sklearn.py +35 -0
  526. wandb/sync/__init__.py +3 -0
  527. wandb/sync/sync.py +457 -0
  528. wandb/trigger.py +29 -0
  529. wandb/util.py +2040 -0
  530. wandb/vendor/__init__.py +0 -0
  531. wandb/vendor/gql-0.2.0/setup.py +40 -0
  532. wandb/vendor/gql-0.2.0/tests/__init__.py +0 -0
  533. wandb/vendor/gql-0.2.0/tests/starwars/__init__.py +0 -0
  534. wandb/vendor/gql-0.2.0/tests/starwars/fixtures.py +96 -0
  535. wandb/vendor/gql-0.2.0/tests/starwars/schema.py +146 -0
  536. wandb/vendor/gql-0.2.0/tests/starwars/test_dsl.py +293 -0
  537. wandb/vendor/gql-0.2.0/tests/starwars/test_query.py +355 -0
  538. wandb/vendor/gql-0.2.0/tests/starwars/test_validation.py +171 -0
  539. wandb/vendor/gql-0.2.0/tests/test_client.py +31 -0
  540. wandb/vendor/gql-0.2.0/tests/test_transport.py +89 -0
  541. wandb/vendor/gql-0.2.0/wandb_gql/__init__.py +4 -0
  542. wandb/vendor/gql-0.2.0/wandb_gql/client.py +75 -0
  543. wandb/vendor/gql-0.2.0/wandb_gql/dsl.py +152 -0
  544. wandb/vendor/gql-0.2.0/wandb_gql/gql.py +10 -0
  545. wandb/vendor/gql-0.2.0/wandb_gql/transport/__init__.py +0 -0
  546. wandb/vendor/gql-0.2.0/wandb_gql/transport/http.py +6 -0
  547. wandb/vendor/gql-0.2.0/wandb_gql/transport/local_schema.py +15 -0
  548. wandb/vendor/gql-0.2.0/wandb_gql/transport/requests.py +46 -0
  549. wandb/vendor/gql-0.2.0/wandb_gql/utils.py +21 -0
  550. wandb/vendor/graphql-core-1.1/setup.py +86 -0
  551. wandb/vendor/graphql-core-1.1/wandb_graphql/__init__.py +287 -0
  552. wandb/vendor/graphql-core-1.1/wandb_graphql/error/__init__.py +6 -0
  553. wandb/vendor/graphql-core-1.1/wandb_graphql/error/base.py +42 -0
  554. wandb/vendor/graphql-core-1.1/wandb_graphql/error/format_error.py +11 -0
  555. wandb/vendor/graphql-core-1.1/wandb_graphql/error/located_error.py +29 -0
  556. wandb/vendor/graphql-core-1.1/wandb_graphql/error/syntax_error.py +36 -0
  557. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/__init__.py +26 -0
  558. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/base.py +311 -0
  559. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executor.py +398 -0
  560. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/__init__.py +0 -0
  561. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/asyncio.py +53 -0
  562. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/gevent.py +22 -0
  563. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/process.py +32 -0
  564. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/sync.py +7 -0
  565. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/thread.py +35 -0
  566. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/utils.py +6 -0
  567. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/__init__.py +0 -0
  568. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/executor.py +66 -0
  569. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/fragment.py +252 -0
  570. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/resolver.py +151 -0
  571. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/utils.py +7 -0
  572. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/middleware.py +57 -0
  573. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/values.py +145 -0
  574. wandb/vendor/graphql-core-1.1/wandb_graphql/graphql.py +60 -0
  575. wandb/vendor/graphql-core-1.1/wandb_graphql/language/__init__.py +0 -0
  576. wandb/vendor/graphql-core-1.1/wandb_graphql/language/ast.py +1349 -0
  577. wandb/vendor/graphql-core-1.1/wandb_graphql/language/base.py +19 -0
  578. wandb/vendor/graphql-core-1.1/wandb_graphql/language/lexer.py +435 -0
  579. wandb/vendor/graphql-core-1.1/wandb_graphql/language/location.py +30 -0
  580. wandb/vendor/graphql-core-1.1/wandb_graphql/language/parser.py +779 -0
  581. wandb/vendor/graphql-core-1.1/wandb_graphql/language/printer.py +193 -0
  582. wandb/vendor/graphql-core-1.1/wandb_graphql/language/source.py +18 -0
  583. wandb/vendor/graphql-core-1.1/wandb_graphql/language/visitor.py +222 -0
  584. wandb/vendor/graphql-core-1.1/wandb_graphql/language/visitor_meta.py +82 -0
  585. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/__init__.py +0 -0
  586. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/cached_property.py +17 -0
  587. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/contain_subset.py +28 -0
  588. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/default_ordered_dict.py +40 -0
  589. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/ordereddict.py +8 -0
  590. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/pair_set.py +43 -0
  591. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/version.py +78 -0
  592. wandb/vendor/graphql-core-1.1/wandb_graphql/type/__init__.py +67 -0
  593. wandb/vendor/graphql-core-1.1/wandb_graphql/type/definition.py +619 -0
  594. wandb/vendor/graphql-core-1.1/wandb_graphql/type/directives.py +132 -0
  595. wandb/vendor/graphql-core-1.1/wandb_graphql/type/introspection.py +440 -0
  596. wandb/vendor/graphql-core-1.1/wandb_graphql/type/scalars.py +131 -0
  597. wandb/vendor/graphql-core-1.1/wandb_graphql/type/schema.py +100 -0
  598. wandb/vendor/graphql-core-1.1/wandb_graphql/type/typemap.py +145 -0
  599. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/__init__.py +0 -0
  600. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/assert_valid_name.py +9 -0
  601. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_from_value.py +65 -0
  602. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_to_code.py +49 -0
  603. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_to_dict.py +24 -0
  604. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/base.py +75 -0
  605. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/build_ast_schema.py +291 -0
  606. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/build_client_schema.py +250 -0
  607. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/concat_ast.py +9 -0
  608. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/extend_schema.py +357 -0
  609. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/get_field_def.py +27 -0
  610. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/get_operation_ast.py +21 -0
  611. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/introspection_query.py +90 -0
  612. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/is_valid_literal_value.py +67 -0
  613. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/is_valid_value.py +66 -0
  614. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/quoted_or_list.py +21 -0
  615. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/schema_printer.py +168 -0
  616. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/suggestion_list.py +56 -0
  617. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_comparators.py +69 -0
  618. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_from_ast.py +21 -0
  619. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_info.py +149 -0
  620. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/value_from_ast.py +69 -0
  621. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/__init__.py +4 -0
  622. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/__init__.py +79 -0
  623. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/arguments_of_correct_type.py +24 -0
  624. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/base.py +8 -0
  625. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/default_values_of_correct_type.py +44 -0
  626. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/fields_on_correct_type.py +113 -0
  627. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/fragments_on_composite_types.py +33 -0
  628. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_argument_names.py +70 -0
  629. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_directives.py +97 -0
  630. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_fragment_names.py +19 -0
  631. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_type_names.py +43 -0
  632. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/lone_anonymous_operation.py +23 -0
  633. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_fragment_cycles.py +59 -0
  634. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_undefined_variables.py +36 -0
  635. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_unused_fragments.py +38 -0
  636. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_unused_variables.py +37 -0
  637. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/overlapping_fields_can_be_merged.py +529 -0
  638. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/possible_fragment_spreads.py +44 -0
  639. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/provided_non_null_arguments.py +46 -0
  640. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/scalar_leafs.py +33 -0
  641. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_argument_names.py +32 -0
  642. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_fragment_names.py +28 -0
  643. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_input_field_names.py +33 -0
  644. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_operation_names.py +31 -0
  645. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_variable_names.py +27 -0
  646. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/variables_are_input_types.py +21 -0
  647. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/variables_in_allowed_position.py +53 -0
  648. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/validation.py +158 -0
  649. wandb/vendor/promise-2.3.0/conftest.py +30 -0
  650. wandb/vendor/promise-2.3.0/setup.py +64 -0
  651. wandb/vendor/promise-2.3.0/tests/__init__.py +0 -0
  652. wandb/vendor/promise-2.3.0/tests/conftest.py +8 -0
  653. wandb/vendor/promise-2.3.0/tests/test_awaitable.py +32 -0
  654. wandb/vendor/promise-2.3.0/tests/test_awaitable_35.py +47 -0
  655. wandb/vendor/promise-2.3.0/tests/test_benchmark.py +116 -0
  656. wandb/vendor/promise-2.3.0/tests/test_complex_threads.py +23 -0
  657. wandb/vendor/promise-2.3.0/tests/test_dataloader.py +452 -0
  658. wandb/vendor/promise-2.3.0/tests/test_dataloader_awaitable_35.py +99 -0
  659. wandb/vendor/promise-2.3.0/tests/test_dataloader_extra.py +65 -0
  660. wandb/vendor/promise-2.3.0/tests/test_extra.py +670 -0
  661. wandb/vendor/promise-2.3.0/tests/test_issues.py +132 -0
  662. wandb/vendor/promise-2.3.0/tests/test_promise_list.py +70 -0
  663. wandb/vendor/promise-2.3.0/tests/test_spec.py +584 -0
  664. wandb/vendor/promise-2.3.0/tests/test_thread_safety.py +115 -0
  665. wandb/vendor/promise-2.3.0/tests/utils.py +3 -0
  666. wandb/vendor/promise-2.3.0/wandb_promise/__init__.py +38 -0
  667. wandb/vendor/promise-2.3.0/wandb_promise/async_.py +135 -0
  668. wandb/vendor/promise-2.3.0/wandb_promise/compat.py +32 -0
  669. wandb/vendor/promise-2.3.0/wandb_promise/dataloader.py +326 -0
  670. wandb/vendor/promise-2.3.0/wandb_promise/iterate_promise.py +12 -0
  671. wandb/vendor/promise-2.3.0/wandb_promise/promise.py +848 -0
  672. wandb/vendor/promise-2.3.0/wandb_promise/promise_list.py +151 -0
  673. wandb/vendor/promise-2.3.0/wandb_promise/pyutils/__init__.py +0 -0
  674. wandb/vendor/promise-2.3.0/wandb_promise/pyutils/version.py +83 -0
  675. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/__init__.py +0 -0
  676. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/asyncio.py +22 -0
  677. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/gevent.py +21 -0
  678. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/immediate.py +27 -0
  679. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/thread.py +18 -0
  680. wandb/vendor/promise-2.3.0/wandb_promise/utils.py +56 -0
  681. wandb/vendor/pygments/__init__.py +90 -0
  682. wandb/vendor/pygments/cmdline.py +568 -0
  683. wandb/vendor/pygments/console.py +74 -0
  684. wandb/vendor/pygments/filter.py +74 -0
  685. wandb/vendor/pygments/filters/__init__.py +350 -0
  686. wandb/vendor/pygments/formatter.py +95 -0
  687. wandb/vendor/pygments/formatters/__init__.py +153 -0
  688. wandb/vendor/pygments/formatters/_mapping.py +85 -0
  689. wandb/vendor/pygments/formatters/bbcode.py +109 -0
  690. wandb/vendor/pygments/formatters/html.py +851 -0
  691. wandb/vendor/pygments/formatters/img.py +600 -0
  692. wandb/vendor/pygments/formatters/irc.py +182 -0
  693. wandb/vendor/pygments/formatters/latex.py +482 -0
  694. wandb/vendor/pygments/formatters/other.py +160 -0
  695. wandb/vendor/pygments/formatters/rtf.py +147 -0
  696. wandb/vendor/pygments/formatters/svg.py +153 -0
  697. wandb/vendor/pygments/formatters/terminal.py +136 -0
  698. wandb/vendor/pygments/formatters/terminal256.py +309 -0
  699. wandb/vendor/pygments/lexer.py +871 -0
  700. wandb/vendor/pygments/lexers/__init__.py +329 -0
  701. wandb/vendor/pygments/lexers/_asy_builtins.py +1645 -0
  702. wandb/vendor/pygments/lexers/_cl_builtins.py +232 -0
  703. wandb/vendor/pygments/lexers/_cocoa_builtins.py +72 -0
  704. wandb/vendor/pygments/lexers/_csound_builtins.py +1346 -0
  705. wandb/vendor/pygments/lexers/_lasso_builtins.py +5327 -0
  706. wandb/vendor/pygments/lexers/_lua_builtins.py +295 -0
  707. wandb/vendor/pygments/lexers/_mapping.py +500 -0
  708. wandb/vendor/pygments/lexers/_mql_builtins.py +1172 -0
  709. wandb/vendor/pygments/lexers/_openedge_builtins.py +2547 -0
  710. wandb/vendor/pygments/lexers/_php_builtins.py +4756 -0
  711. wandb/vendor/pygments/lexers/_postgres_builtins.py +621 -0
  712. wandb/vendor/pygments/lexers/_scilab_builtins.py +3094 -0
  713. wandb/vendor/pygments/lexers/_sourcemod_builtins.py +1163 -0
  714. wandb/vendor/pygments/lexers/_stan_builtins.py +532 -0
  715. wandb/vendor/pygments/lexers/_stata_builtins.py +419 -0
  716. wandb/vendor/pygments/lexers/_tsql_builtins.py +1004 -0
  717. wandb/vendor/pygments/lexers/_vim_builtins.py +1939 -0
  718. wandb/vendor/pygments/lexers/actionscript.py +240 -0
  719. wandb/vendor/pygments/lexers/agile.py +24 -0
  720. wandb/vendor/pygments/lexers/algebra.py +221 -0
  721. wandb/vendor/pygments/lexers/ambient.py +76 -0
  722. wandb/vendor/pygments/lexers/ampl.py +87 -0
  723. wandb/vendor/pygments/lexers/apl.py +101 -0
  724. wandb/vendor/pygments/lexers/archetype.py +318 -0
  725. wandb/vendor/pygments/lexers/asm.py +641 -0
  726. wandb/vendor/pygments/lexers/automation.py +374 -0
  727. wandb/vendor/pygments/lexers/basic.py +500 -0
  728. wandb/vendor/pygments/lexers/bibtex.py +160 -0
  729. wandb/vendor/pygments/lexers/business.py +612 -0
  730. wandb/vendor/pygments/lexers/c_cpp.py +252 -0
  731. wandb/vendor/pygments/lexers/c_like.py +541 -0
  732. wandb/vendor/pygments/lexers/capnproto.py +78 -0
  733. wandb/vendor/pygments/lexers/chapel.py +102 -0
  734. wandb/vendor/pygments/lexers/clean.py +288 -0
  735. wandb/vendor/pygments/lexers/compiled.py +34 -0
  736. wandb/vendor/pygments/lexers/configs.py +833 -0
  737. wandb/vendor/pygments/lexers/console.py +114 -0
  738. wandb/vendor/pygments/lexers/crystal.py +393 -0
  739. wandb/vendor/pygments/lexers/csound.py +366 -0
  740. wandb/vendor/pygments/lexers/css.py +689 -0
  741. wandb/vendor/pygments/lexers/d.py +251 -0
  742. wandb/vendor/pygments/lexers/dalvik.py +125 -0
  743. wandb/vendor/pygments/lexers/data.py +555 -0
  744. wandb/vendor/pygments/lexers/diff.py +165 -0
  745. wandb/vendor/pygments/lexers/dotnet.py +691 -0
  746. wandb/vendor/pygments/lexers/dsls.py +878 -0
  747. wandb/vendor/pygments/lexers/dylan.py +289 -0
  748. wandb/vendor/pygments/lexers/ecl.py +125 -0
  749. wandb/vendor/pygments/lexers/eiffel.py +65 -0
  750. wandb/vendor/pygments/lexers/elm.py +121 -0
  751. wandb/vendor/pygments/lexers/erlang.py +533 -0
  752. wandb/vendor/pygments/lexers/esoteric.py +277 -0
  753. wandb/vendor/pygments/lexers/ezhil.py +69 -0
  754. wandb/vendor/pygments/lexers/factor.py +344 -0
  755. wandb/vendor/pygments/lexers/fantom.py +250 -0
  756. wandb/vendor/pygments/lexers/felix.py +273 -0
  757. wandb/vendor/pygments/lexers/forth.py +177 -0
  758. wandb/vendor/pygments/lexers/fortran.py +205 -0
  759. wandb/vendor/pygments/lexers/foxpro.py +428 -0
  760. wandb/vendor/pygments/lexers/functional.py +21 -0
  761. wandb/vendor/pygments/lexers/go.py +101 -0
  762. wandb/vendor/pygments/lexers/grammar_notation.py +213 -0
  763. wandb/vendor/pygments/lexers/graph.py +80 -0
  764. wandb/vendor/pygments/lexers/graphics.py +553 -0
  765. wandb/vendor/pygments/lexers/haskell.py +843 -0
  766. wandb/vendor/pygments/lexers/haxe.py +936 -0
  767. wandb/vendor/pygments/lexers/hdl.py +382 -0
  768. wandb/vendor/pygments/lexers/hexdump.py +103 -0
  769. wandb/vendor/pygments/lexers/html.py +602 -0
  770. wandb/vendor/pygments/lexers/idl.py +270 -0
  771. wandb/vendor/pygments/lexers/igor.py +288 -0
  772. wandb/vendor/pygments/lexers/inferno.py +96 -0
  773. wandb/vendor/pygments/lexers/installers.py +322 -0
  774. wandb/vendor/pygments/lexers/int_fiction.py +1343 -0
  775. wandb/vendor/pygments/lexers/iolang.py +63 -0
  776. wandb/vendor/pygments/lexers/j.py +146 -0
  777. wandb/vendor/pygments/lexers/javascript.py +1525 -0
  778. wandb/vendor/pygments/lexers/julia.py +333 -0
  779. wandb/vendor/pygments/lexers/jvm.py +1573 -0
  780. wandb/vendor/pygments/lexers/lisp.py +2621 -0
  781. wandb/vendor/pygments/lexers/make.py +202 -0
  782. wandb/vendor/pygments/lexers/markup.py +595 -0
  783. wandb/vendor/pygments/lexers/math.py +21 -0
  784. wandb/vendor/pygments/lexers/matlab.py +663 -0
  785. wandb/vendor/pygments/lexers/ml.py +769 -0
  786. wandb/vendor/pygments/lexers/modeling.py +358 -0
  787. wandb/vendor/pygments/lexers/modula2.py +1561 -0
  788. wandb/vendor/pygments/lexers/monte.py +204 -0
  789. wandb/vendor/pygments/lexers/ncl.py +894 -0
  790. wandb/vendor/pygments/lexers/nimrod.py +159 -0
  791. wandb/vendor/pygments/lexers/nit.py +64 -0
  792. wandb/vendor/pygments/lexers/nix.py +136 -0
  793. wandb/vendor/pygments/lexers/oberon.py +105 -0
  794. wandb/vendor/pygments/lexers/objective.py +504 -0
  795. wandb/vendor/pygments/lexers/ooc.py +85 -0
  796. wandb/vendor/pygments/lexers/other.py +41 -0
  797. wandb/vendor/pygments/lexers/parasail.py +79 -0
  798. wandb/vendor/pygments/lexers/parsers.py +835 -0
  799. wandb/vendor/pygments/lexers/pascal.py +644 -0
  800. wandb/vendor/pygments/lexers/pawn.py +199 -0
  801. wandb/vendor/pygments/lexers/perl.py +620 -0
  802. wandb/vendor/pygments/lexers/php.py +267 -0
  803. wandb/vendor/pygments/lexers/praat.py +294 -0
  804. wandb/vendor/pygments/lexers/prolog.py +306 -0
  805. wandb/vendor/pygments/lexers/python.py +939 -0
  806. wandb/vendor/pygments/lexers/qvt.py +152 -0
  807. wandb/vendor/pygments/lexers/r.py +453 -0
  808. wandb/vendor/pygments/lexers/rdf.py +270 -0
  809. wandb/vendor/pygments/lexers/rebol.py +431 -0
  810. wandb/vendor/pygments/lexers/resource.py +85 -0
  811. wandb/vendor/pygments/lexers/rnc.py +67 -0
  812. wandb/vendor/pygments/lexers/roboconf.py +82 -0
  813. wandb/vendor/pygments/lexers/robotframework.py +560 -0
  814. wandb/vendor/pygments/lexers/ruby.py +519 -0
  815. wandb/vendor/pygments/lexers/rust.py +220 -0
  816. wandb/vendor/pygments/lexers/sas.py +228 -0
  817. wandb/vendor/pygments/lexers/scripting.py +1222 -0
  818. wandb/vendor/pygments/lexers/shell.py +794 -0
  819. wandb/vendor/pygments/lexers/smalltalk.py +195 -0
  820. wandb/vendor/pygments/lexers/smv.py +79 -0
  821. wandb/vendor/pygments/lexers/snobol.py +83 -0
  822. wandb/vendor/pygments/lexers/special.py +103 -0
  823. wandb/vendor/pygments/lexers/sql.py +681 -0
  824. wandb/vendor/pygments/lexers/stata.py +108 -0
  825. wandb/vendor/pygments/lexers/supercollider.py +90 -0
  826. wandb/vendor/pygments/lexers/tcl.py +145 -0
  827. wandb/vendor/pygments/lexers/templates.py +2283 -0
  828. wandb/vendor/pygments/lexers/testing.py +207 -0
  829. wandb/vendor/pygments/lexers/text.py +25 -0
  830. wandb/vendor/pygments/lexers/textedit.py +169 -0
  831. wandb/vendor/pygments/lexers/textfmts.py +297 -0
  832. wandb/vendor/pygments/lexers/theorem.py +458 -0
  833. wandb/vendor/pygments/lexers/trafficscript.py +54 -0
  834. wandb/vendor/pygments/lexers/typoscript.py +226 -0
  835. wandb/vendor/pygments/lexers/urbi.py +133 -0
  836. wandb/vendor/pygments/lexers/varnish.py +190 -0
  837. wandb/vendor/pygments/lexers/verification.py +111 -0
  838. wandb/vendor/pygments/lexers/web.py +24 -0
  839. wandb/vendor/pygments/lexers/webmisc.py +988 -0
  840. wandb/vendor/pygments/lexers/whiley.py +116 -0
  841. wandb/vendor/pygments/lexers/x10.py +69 -0
  842. wandb/vendor/pygments/modeline.py +44 -0
  843. wandb/vendor/pygments/plugin.py +68 -0
  844. wandb/vendor/pygments/regexopt.py +92 -0
  845. wandb/vendor/pygments/scanner.py +105 -0
  846. wandb/vendor/pygments/sphinxext.py +158 -0
  847. wandb/vendor/pygments/style.py +155 -0
  848. wandb/vendor/pygments/styles/__init__.py +80 -0
  849. wandb/vendor/pygments/styles/abap.py +29 -0
  850. wandb/vendor/pygments/styles/algol.py +63 -0
  851. wandb/vendor/pygments/styles/algol_nu.py +63 -0
  852. wandb/vendor/pygments/styles/arduino.py +98 -0
  853. wandb/vendor/pygments/styles/autumn.py +65 -0
  854. wandb/vendor/pygments/styles/borland.py +51 -0
  855. wandb/vendor/pygments/styles/bw.py +49 -0
  856. wandb/vendor/pygments/styles/colorful.py +81 -0
  857. wandb/vendor/pygments/styles/default.py +73 -0
  858. wandb/vendor/pygments/styles/emacs.py +72 -0
  859. wandb/vendor/pygments/styles/friendly.py +72 -0
  860. wandb/vendor/pygments/styles/fruity.py +42 -0
  861. wandb/vendor/pygments/styles/igor.py +29 -0
  862. wandb/vendor/pygments/styles/lovelace.py +97 -0
  863. wandb/vendor/pygments/styles/manni.py +75 -0
  864. wandb/vendor/pygments/styles/monokai.py +106 -0
  865. wandb/vendor/pygments/styles/murphy.py +80 -0
  866. wandb/vendor/pygments/styles/native.py +65 -0
  867. wandb/vendor/pygments/styles/paraiso_dark.py +125 -0
  868. wandb/vendor/pygments/styles/paraiso_light.py +125 -0
  869. wandb/vendor/pygments/styles/pastie.py +75 -0
  870. wandb/vendor/pygments/styles/perldoc.py +69 -0
  871. wandb/vendor/pygments/styles/rainbow_dash.py +89 -0
  872. wandb/vendor/pygments/styles/rrt.py +33 -0
  873. wandb/vendor/pygments/styles/sas.py +44 -0
  874. wandb/vendor/pygments/styles/stata.py +40 -0
  875. wandb/vendor/pygments/styles/tango.py +141 -0
  876. wandb/vendor/pygments/styles/trac.py +63 -0
  877. wandb/vendor/pygments/styles/vim.py +63 -0
  878. wandb/vendor/pygments/styles/vs.py +38 -0
  879. wandb/vendor/pygments/styles/xcode.py +51 -0
  880. wandb/vendor/pygments/token.py +213 -0
  881. wandb/vendor/pygments/unistring.py +217 -0
  882. wandb/vendor/pygments/util.py +388 -0
  883. wandb/vendor/watchdog_0_9_0/wandb_watchdog/__init__.py +17 -0
  884. wandb/vendor/watchdog_0_9_0/wandb_watchdog/events.py +615 -0
  885. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/__init__.py +98 -0
  886. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/api.py +369 -0
  887. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/fsevents.py +172 -0
  888. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/fsevents2.py +239 -0
  889. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify.py +218 -0
  890. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify_buffer.py +81 -0
  891. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify_c.py +575 -0
  892. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/kqueue.py +730 -0
  893. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/polling.py +145 -0
  894. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/read_directory_changes.py +133 -0
  895. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/winapi.py +348 -0
  896. wandb/vendor/watchdog_0_9_0/wandb_watchdog/patterns.py +265 -0
  897. wandb/vendor/watchdog_0_9_0/wandb_watchdog/tricks/__init__.py +174 -0
  898. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/__init__.py +151 -0
  899. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/bricks.py +249 -0
  900. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/compat.py +29 -0
  901. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/decorators.py +198 -0
  902. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/delayed_queue.py +88 -0
  903. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/dirsnapshot.py +293 -0
  904. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/echo.py +157 -0
  905. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/event_backport.py +41 -0
  906. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/importlib2.py +40 -0
  907. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/platform.py +57 -0
  908. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/unicode_paths.py +64 -0
  909. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/win32stat.py +123 -0
  910. wandb/vendor/watchdog_0_9_0/wandb_watchdog/version.py +28 -0
  911. wandb/vendor/watchdog_0_9_0/wandb_watchdog/watchmedo.py +577 -0
  912. wandb/wandb_agent.py +611 -0
  913. wandb/wandb_controller.py +719 -0
  914. wandb/wandb_run.py +8 -0
  915. wandb-0.22.1.dist-info/METADATA +223 -0
  916. wandb-0.22.1.dist-info/RECORD +919 -0
  917. wandb-0.22.1.dist-info/WHEEL +4 -0
  918. wandb-0.22.1.dist-info/entry_points.txt +3 -0
  919. wandb-0.22.1.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,985 @@
1
+ import hashlib
2
+ import logging
3
+ import os
4
+ import pathlib
5
+ from io import BytesIO
6
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Sequence, Type, Union, cast
7
+ from urllib import parse
8
+
9
+ from packaging.version import parse as parse_version
10
+
11
+ import wandb
12
+ from wandb import util
13
+ from wandb.sdk.lib import hashutil, runid
14
+ from wandb.sdk.lib.paths import LogicalPath
15
+
16
+ from . import _dtypes
17
+ from ._private import MEDIA_TMP
18
+ from .base_types.media import BatchableMedia, Media
19
+ from .helper_types.bounding_boxes_2d import BoundingBoxes2D
20
+ from .helper_types.classes import Classes
21
+ from .helper_types.image_mask import ImageMask
22
+
23
+ if TYPE_CHECKING: # pragma: no cover
24
+ import matplotlib # type: ignore
25
+ import numpy as np
26
+ import torch # type: ignore
27
+ from PIL.Image import Image as PILImage
28
+
29
+ from wandb.sdk.artifacts.artifact import Artifact
30
+
31
+ ImageDataType = Union[
32
+ "matplotlib.artist.Artist", "PILImage", "TorchTensorType", "np.ndarray"
33
+ ]
34
+ ImageDataOrPathType = Union[str, pathlib.Path, "Image", ImageDataType]
35
+ TorchTensorType = Union["torch.Tensor", "torch.Variable"]
36
+
37
+
38
+ def _warn_on_invalid_data_range(
39
+ data: "np.ndarray",
40
+ normalize: bool = True,
41
+ ) -> None:
42
+ if not normalize:
43
+ return
44
+
45
+ np = util.get_module(
46
+ "numpy",
47
+ required="wandb.Image requires numpy if not supplying PIL Images: pip install numpy",
48
+ )
49
+
50
+ if np.min(data) < 0 or np.max(data) > 255:
51
+ wandb.termwarn(
52
+ "Data passed to `wandb.Image` should consist of values in the range [0, 255], "
53
+ "image data will be normalized to this range, "
54
+ "but behavior will be removed in a future version of wandb.",
55
+ repeat=False,
56
+ )
57
+
58
+
59
+ def _guess_and_rescale_to_0_255(data: "np.ndarray") -> "np.ndarray":
60
+ """Guess the image's format and rescale its values to the range [0, 255].
61
+
62
+ This is an unfortunate design flaw carried forward for backward
63
+ compatibility. A better design would have been to document the expected
64
+ data format and not mangle the data provided by the user.
65
+
66
+ If given data in the range [0, 1], we multiply all values by 255
67
+ and round down to get integers.
68
+
69
+ If given data in the range [-1, 1], we rescale it by mapping -1 to 0 and
70
+ 1 to 255, then round down to get integers.
71
+
72
+ We clip and round all other data.
73
+ """
74
+ try:
75
+ import numpy as np
76
+ except ImportError:
77
+ raise wandb.Error(
78
+ "wandb.Image requires numpy if not supplying PIL images: pip install numpy"
79
+ ) from None
80
+
81
+ data_min: float = data.min()
82
+ data_max: float = data.max()
83
+
84
+ if 0 <= data_min and data_max <= 1:
85
+ return (data * 255).astype(np.uint8)
86
+
87
+ elif -1 <= data_min and data_max <= 1:
88
+ return (255 * 0.5 * (data + 1)).astype(np.uint8)
89
+
90
+ else:
91
+ return data.clip(0, 255).astype(np.uint8)
92
+
93
+
94
+ def _convert_to_uint8(data: "np.ndarray") -> "np.ndarray":
95
+ np = util.get_module(
96
+ "numpy",
97
+ required="wandb.Image requires numpy if not supplying PIL Images: pip install numpy",
98
+ )
99
+ return data.astype(np.uint8)
100
+
101
+
102
+ def _server_accepts_image_filenames(run: "wandb.Run") -> bool:
103
+ if run.offline:
104
+ return True
105
+
106
+ # Newer versions of wandb accept large image filenames arrays
107
+ # but older versions would have issues with this.
108
+ max_cli_version = util._get_max_cli_version()
109
+ if max_cli_version is None:
110
+ return False
111
+
112
+ accepts_image_filenames: bool = parse_version(max_cli_version) >= parse_version(
113
+ "0.12.10"
114
+ )
115
+ return accepts_image_filenames
116
+
117
+
118
+ def _server_accepts_artifact_path(run: "wandb.Run") -> bool:
119
+ if run.offline:
120
+ return False
121
+
122
+ max_cli_version = util._get_max_cli_version()
123
+ if max_cli_version is None:
124
+ return False
125
+
126
+ return parse_version(max_cli_version) >= parse_version("0.12.14")
127
+
128
+
129
+ class Image(BatchableMedia):
130
+ """A class for logging images to W&B."""
131
+
132
+ MAX_ITEMS = 108
133
+
134
+ # PIL limit
135
+ MAX_DIMENSION = 65500
136
+
137
+ _log_type = "image-file"
138
+
139
+ format: Optional[str]
140
+ _grouping: Optional[int]
141
+ _caption: Optional[str]
142
+ _width: Optional[int]
143
+ _height: Optional[int]
144
+ _image: Optional["PILImage"]
145
+ _classes: Optional["Classes"]
146
+ _boxes: Optional[Dict[str, "BoundingBoxes2D"]]
147
+ _masks: Optional[Dict[str, "ImageMask"]]
148
+ _file_type: Optional[str]
149
+
150
+ def __init__(
151
+ self,
152
+ data_or_path: "ImageDataOrPathType",
153
+ mode: Optional[str] = None,
154
+ caption: Optional[str] = None,
155
+ grouping: Optional[int] = None,
156
+ classes: Optional[Union["Classes", Sequence[dict]]] = None,
157
+ boxes: Optional[Union[Dict[str, "BoundingBoxes2D"], Dict[str, dict]]] = None,
158
+ masks: Optional[Union[Dict[str, "ImageMask"], Dict[str, dict]]] = None,
159
+ file_type: Optional[str] = None,
160
+ normalize: bool = True,
161
+ ) -> None:
162
+ """Initialize a `wandb.Image` object.
163
+
164
+ This class handles various image data formats and automatically normalizes
165
+ pixel values to the range [0, 255] when needed, ensuring compatibility
166
+ with the W&B backend.
167
+
168
+ * Data in range [0, 1] is multiplied by 255 and converted to uint8
169
+ * Data in range [-1, 1] is rescaled from [-1, 1] to [0, 255] by mapping
170
+ -1 to 0 and 1 to 255, then converted to uint8
171
+ * Data outside [-1, 1] but not in [0, 255] is clipped to [0, 255] and
172
+ converted to uint8 (with a warning if values fall outside [0, 255])
173
+ * Data already in [0, 255] is converted to uint8 without modification
174
+
175
+ Args:
176
+ data_or_path: Accepts NumPy array/pytorch tensor of image data,
177
+ a PIL image object, or a path to an image file. If a NumPy
178
+ array or pytorch tensor is provided,
179
+ the image data will be saved to the given file type.
180
+ If the values are not in the range [0, 255] or all values are in the range [0, 1],
181
+ the image pixel values will be normalized to the range [0, 255]
182
+ unless `normalize` is set to `False`.
183
+ - pytorch tensor should be in the format (channel, height, width)
184
+ - NumPy array should be in the format (height, width, channel)
185
+ mode: The PIL mode for an image. Most common are "L", "RGB",
186
+ "RGBA". Full explanation at https://pillow.readthedocs.io/en/stable/handbook/concepts.html#modes
187
+ caption: Label for display of image.
188
+ grouping: The grouping number for the image.
189
+ classes: A list of class information for the image,
190
+ used for labeling bounding boxes, and image masks.
191
+ boxes: A dictionary containing bounding box information for the image.
192
+ see https://docs.wandb.ai/ref/python/data-types/boundingboxes2d/
193
+ masks: A dictionary containing mask information for the image.
194
+ see https://docs.wandb.ai/ref/python/data-types/imagemask/
195
+ file_type: The file type to save the image as.
196
+ This parameter has no effect if `data_or_path` is a path to an image file.
197
+ normalize: If `True`, normalize the image pixel values to fall within the range of [0, 255].
198
+ Normalize is only applied if `data_or_path` is a numpy array or pytorch tensor.
199
+
200
+ Examples:
201
+ Create a wandb.Image from a numpy array
202
+
203
+ ```python
204
+ import numpy as np
205
+ import wandb
206
+
207
+ with wandb.init() as run:
208
+ examples = []
209
+ for i in range(3):
210
+ pixels = np.random.randint(low=0, high=256, size=(100, 100, 3))
211
+ image = wandb.Image(pixels, caption=f"random field {i}")
212
+ examples.append(image)
213
+ run.log({"examples": examples})
214
+ ```
215
+
216
+ Create a wandb.Image from a PILImage
217
+
218
+ ```python
219
+ import numpy as np
220
+ from PIL import Image as PILImage
221
+ import wandb
222
+
223
+ with wandb.init() as run:
224
+ examples = []
225
+ for i in range(3):
226
+ pixels = np.random.randint(
227
+ low=0, high=256, size=(100, 100, 3), dtype=np.uint8
228
+ )
229
+ pil_image = PILImage.fromarray(pixels, mode="RGB")
230
+ image = wandb.Image(pil_image, caption=f"random field {i}")
231
+ examples.append(image)
232
+ run.log({"examples": examples})
233
+ ```
234
+
235
+ Log .jpg rather than .png (default)
236
+
237
+ ```python
238
+ import numpy as np
239
+ import wandb
240
+
241
+ with wandb.init() as run:
242
+ examples = []
243
+ for i in range(3):
244
+ pixels = np.random.randint(low=0, high=256, size=(100, 100, 3))
245
+ image = wandb.Image(
246
+ pixels, caption=f"random field {i}", file_type="jpg"
247
+ )
248
+ examples.append(image)
249
+ run.log({"examples": examples})
250
+ ```
251
+ """
252
+ super().__init__(caption=caption)
253
+ # TODO: We should remove grouping, it's a terrible name and I don't
254
+ # think anyone uses it.
255
+
256
+ self._grouping = None
257
+ self._width = None
258
+ self._height = None
259
+ self._image = None
260
+ self._classes = None
261
+ self._boxes = None
262
+ self._masks = None
263
+ self._file_type = None
264
+
265
+ # Allows the user to pass an Image object as the first parameter and have a perfect copy,
266
+ # only overriding additional metadata passed in. If this pattern is compelling, we can generalize.
267
+ if isinstance(data_or_path, Image):
268
+ self._initialize_from_wbimage(data_or_path)
269
+ elif isinstance(data_or_path, (str, pathlib.Path)):
270
+ data_or_path = str(data_or_path)
271
+
272
+ if self.path_is_reference(data_or_path):
273
+ self._initialize_from_reference(data_or_path)
274
+ else:
275
+ self._initialize_from_path(data_or_path)
276
+ else:
277
+ self._initialize_from_data(data_or_path, mode, file_type, normalize)
278
+ self._set_initialization_meta(
279
+ grouping, caption, classes, boxes, masks, file_type
280
+ )
281
+
282
+ def _set_initialization_meta(
283
+ self,
284
+ grouping: Optional[int] = None,
285
+ caption: Optional[str] = None,
286
+ classes: Optional[Union["Classes", Sequence[dict]]] = None,
287
+ boxes: Optional[Union[Dict[str, "BoundingBoxes2D"], Dict[str, dict]]] = None,
288
+ masks: Optional[Union[Dict[str, "ImageMask"], Dict[str, dict]]] = None,
289
+ file_type: Optional[str] = None,
290
+ ) -> None:
291
+ if grouping is not None:
292
+ self._grouping = grouping
293
+
294
+ total_classes = {}
295
+
296
+ if boxes:
297
+ if not isinstance(boxes, dict):
298
+ raise ValueError('Images "boxes" argument must be a dictionary')
299
+ boxes_final: Dict[str, BoundingBoxes2D] = {}
300
+ for key in boxes:
301
+ box_item = boxes[key]
302
+ if isinstance(box_item, BoundingBoxes2D):
303
+ boxes_final[key] = box_item
304
+ elif isinstance(box_item, dict):
305
+ # TODO: Consider injecting top-level classes if user-provided is empty
306
+ boxes_final[key] = BoundingBoxes2D(box_item, key)
307
+ total_classes.update(boxes_final[key]._class_labels)
308
+ self._boxes = boxes_final
309
+
310
+ if masks:
311
+ if not isinstance(masks, dict):
312
+ raise ValueError('Images "masks" argument must be a dictionary')
313
+ masks_final: Dict[str, ImageMask] = {}
314
+ for key in masks:
315
+ mask_item = masks[key]
316
+ if isinstance(mask_item, ImageMask):
317
+ masks_final[key] = mask_item
318
+ elif isinstance(mask_item, dict):
319
+ # TODO: Consider injecting top-level classes if user-provided is empty
320
+ masks_final[key] = ImageMask(mask_item, key)
321
+ if hasattr(masks_final[key], "_val"):
322
+ total_classes.update(masks_final[key]._val["class_labels"])
323
+ self._masks = masks_final
324
+
325
+ if classes is not None:
326
+ if isinstance(classes, Classes):
327
+ total_classes.update(
328
+ {val["id"]: val["name"] for val in classes._class_set}
329
+ )
330
+ else:
331
+ total_classes.update({val["id"]: val["name"] for val in classes})
332
+
333
+ if len(total_classes.keys()) > 0:
334
+ self._classes = Classes(
335
+ [
336
+ {"id": key, "name": total_classes[key]}
337
+ for key in total_classes.keys()
338
+ ]
339
+ )
340
+ if self.image is not None:
341
+ self._width, self._height = self.image.size
342
+ self._free_ram()
343
+
344
+ def _initialize_from_wbimage(self, wbimage: "Image") -> None:
345
+ self._grouping = wbimage._grouping
346
+ self._caption = wbimage._caption
347
+ self._width = wbimage._width
348
+ self._height = wbimage._height
349
+ self._image = wbimage._image
350
+ self._classes = wbimage._classes
351
+ self._path = wbimage._path
352
+ self._is_tmp = wbimage._is_tmp
353
+ self._extension = wbimage._extension
354
+ self._sha256 = wbimage._sha256
355
+ self._size = wbimage._size
356
+ self.format = wbimage.format
357
+ self._file_type = wbimage._file_type
358
+ self._artifact_source = wbimage._artifact_source
359
+ self._artifact_target = wbimage._artifact_target
360
+
361
+ # We do not want to implicitly copy boxes or masks, just the image-related data.
362
+ # self._boxes = wbimage._boxes
363
+ # self._masks = wbimage._masks
364
+
365
+ def _initialize_from_path(self, path: str) -> None:
366
+ pil_image = util.get_module(
367
+ "PIL.Image",
368
+ required='wandb.Image needs the PIL package. To get it, run "pip install pillow".',
369
+ )
370
+ self._set_file(path, is_tmp=False)
371
+ self._image = pil_image.open(path)
372
+ assert self._image is not None
373
+ self._image.load()
374
+ ext = os.path.splitext(path)[1][1:]
375
+ self.format = ext
376
+
377
+ def _initialize_from_reference(self, path: str) -> None:
378
+ self._path = path
379
+ self._is_tmp = False
380
+ self._sha256 = hashlib.sha256(path.encode("utf-8")).hexdigest()
381
+ path = parse.urlparse(path).path
382
+ ext = path.split("/")[-1].split(".")[-1]
383
+ self.format = ext
384
+
385
+ def _initialize_from_data(
386
+ self,
387
+ data: "ImageDataType",
388
+ mode: Optional[str] = None,
389
+ file_type: Optional[str] = None,
390
+ normalize: bool = True,
391
+ ) -> None:
392
+ pil_image = util.get_module(
393
+ "PIL.Image",
394
+ required='wandb.Image needs the PIL package. To get it, run "pip install pillow".',
395
+ )
396
+
397
+ accepted_formats = ["png", "jpg", "jpeg", "bmp"]
398
+ self.format = file_type or "png"
399
+
400
+ if self.format not in accepted_formats:
401
+ raise ValueError(f"file_type must be one of {accepted_formats}")
402
+
403
+ tmp_path = os.path.join(MEDIA_TMP.name, runid.generate_id() + "." + self.format)
404
+
405
+ if util.is_matplotlib_typename(util.get_full_typename(data)):
406
+ buf = BytesIO()
407
+ util.ensure_matplotlib_figure(data).savefig(buf, format=self.format)
408
+ self._image = pil_image.open(buf)
409
+ elif isinstance(data, pil_image.Image):
410
+ self._image = data
411
+ elif util.is_pytorch_tensor_typename(util.get_full_typename(data)):
412
+ if hasattr(data, "requires_grad") and data.requires_grad:
413
+ data = data.detach() # type: ignore
414
+ if hasattr(data, "dtype") and str(data.dtype) == "torch.uint8":
415
+ data = data.to(float) # type: ignore [union-attr]
416
+ mode = mode or self.guess_mode(data, file_type)
417
+ data = data.permute(1, 2, 0).cpu().numpy() # type: ignore [union-attr]
418
+
419
+ _warn_on_invalid_data_range(data, normalize)
420
+
421
+ data = _guess_and_rescale_to_0_255(data) if normalize else data # type: ignore [arg-type]
422
+ data = _convert_to_uint8(data)
423
+
424
+ if data.ndim > 2:
425
+ data = data.squeeze()
426
+
427
+ self._image = pil_image.fromarray(
428
+ data,
429
+ mode=mode,
430
+ )
431
+ else:
432
+ if hasattr(data, "numpy"): # TF data eager tensors
433
+ data = data.numpy()
434
+ if data.ndim > 2: # type: ignore [union-attr]
435
+ # get rid of trivial dimensions as a convenience
436
+ data = data.squeeze() # type: ignore [union-attr]
437
+
438
+ _warn_on_invalid_data_range(data, normalize) # type: ignore [arg-type]
439
+
440
+ mode = mode or self.guess_mode(data, file_type)
441
+ data = _guess_and_rescale_to_0_255(data) if normalize else data # type: ignore [arg-type]
442
+ data = _convert_to_uint8(data) # type: ignore [arg-type]
443
+ self._image = pil_image.fromarray(
444
+ data,
445
+ mode=mode,
446
+ )
447
+
448
+ assert self._image is not None
449
+ self._image.save(tmp_path, transparency=None)
450
+ self._set_file(tmp_path, is_tmp=True)
451
+
452
+ @classmethod
453
+ def from_json(
454
+ cls: Type["Image"], json_obj: dict, source_artifact: "Artifact"
455
+ ) -> "Image":
456
+ """Factory method to create an Audio object from a JSON object.
457
+
458
+ "<!-- lazydoc-ignore-classmethod: internal -->
459
+ """
460
+ classes: Optional[Classes] = None
461
+ if json_obj.get("classes") is not None:
462
+ value = source_artifact.get(json_obj["classes"]["path"])
463
+ assert isinstance(value, (type(None), Classes))
464
+ classes = value
465
+
466
+ masks = json_obj.get("masks")
467
+ _masks: Optional[Dict[str, ImageMask]] = None
468
+ if masks:
469
+ _masks = {}
470
+ for key in masks:
471
+ _masks[key] = ImageMask.from_json(masks[key], source_artifact)
472
+ _masks[key]._set_artifact_source(source_artifact)
473
+ _masks[key]._key = key
474
+
475
+ boxes = json_obj.get("boxes")
476
+ _boxes: Optional[Dict[str, BoundingBoxes2D]] = None
477
+ if boxes:
478
+ _boxes = {}
479
+ for key in boxes:
480
+ _boxes[key] = BoundingBoxes2D.from_json(boxes[key], source_artifact)
481
+ _boxes[key]._key = key
482
+
483
+ return cls(
484
+ source_artifact.get_entry(json_obj["path"]).download(),
485
+ caption=json_obj.get("caption"),
486
+ grouping=json_obj.get("grouping"),
487
+ classes=classes,
488
+ boxes=_boxes,
489
+ masks=_masks,
490
+ )
491
+
492
+ @classmethod
493
+ def get_media_subdir(cls: Type["Image"]) -> str:
494
+ """Get media subdirectory.
495
+
496
+ "<!-- lazydoc-ignore-classmethod: internal -->
497
+ """
498
+ return os.path.join("media", "images")
499
+
500
+ def bind_to_run(
501
+ self,
502
+ run: "wandb.Run",
503
+ key: Union[int, str],
504
+ step: Union[int, str],
505
+ id_: Optional[Union[int, str]] = None,
506
+ ignore_copy_err: Optional[bool] = None,
507
+ ) -> None:
508
+ """Bind this object to a run.
509
+
510
+ <!-- lazydoc-ignore: internal -->
511
+ """
512
+ # For Images, we are going to avoid copying the image file to the run.
513
+ # We should make this common functionality for all media types, but that
514
+ # requires a broader UI refactor. This model can easily be moved to the
515
+ # higher level Media class, but that will require every UI surface area
516
+ # that depends on the `path` to be able to instead consume
517
+ # `artifact_path`. I (Tim) think the media panel makes up most of this
518
+ # space, but there are also custom charts, and maybe others. Let's
519
+ # commit to getting all that fixed up before moving this to the top
520
+ # level Media class.
521
+ if self.path_is_reference(self._path):
522
+ raise ValueError(
523
+ "Image media created by a reference to external storage cannot currently be added to a run"
524
+ )
525
+
526
+ if (
527
+ not _server_accepts_artifact_path(run)
528
+ or self._get_artifact_entry_ref_url() is None
529
+ ):
530
+ super().bind_to_run(run, key, step, id_, ignore_copy_err=ignore_copy_err)
531
+ if self._boxes is not None:
532
+ for i, k in enumerate(self._boxes):
533
+ id_ = f"{id_}{i}" if id_ is not None else None
534
+ self._boxes[k].bind_to_run(
535
+ run, key, step, id_, ignore_copy_err=ignore_copy_err
536
+ )
537
+
538
+ if self._masks is not None:
539
+ for i, k in enumerate(self._masks):
540
+ id_ = f"{id_}{i}" if id_ is not None else None
541
+ self._masks[k].bind_to_run(
542
+ run, key, step, id_, ignore_copy_err=ignore_copy_err
543
+ )
544
+
545
+ def to_json(self, run_or_artifact: Union["wandb.Run", "Artifact"]) -> dict:
546
+ """Returns the JSON representation expected by the backend.
547
+
548
+ <!-- lazydoc-ignore: internal -->
549
+ """
550
+ json_dict = super().to_json(run_or_artifact)
551
+ json_dict["_type"] = Image._log_type
552
+ json_dict["format"] = self.format
553
+
554
+ if self._width is not None:
555
+ json_dict["width"] = self._width
556
+ if self._height is not None:
557
+ json_dict["height"] = self._height
558
+ if self._grouping:
559
+ json_dict["grouping"] = self._grouping
560
+
561
+ if isinstance(run_or_artifact, wandb.Artifact):
562
+ artifact = run_or_artifact
563
+ if (
564
+ self._masks is not None or self._boxes is not None
565
+ ) and self._classes is None:
566
+ raise ValueError(
567
+ "classes must be passed to wandb.Image which have masks or bounding boxes when adding to artifacts"
568
+ )
569
+
570
+ if self._classes is not None:
571
+ class_id = hashutil._md5(
572
+ str(self._classes._class_set).encode("utf-8")
573
+ ).hexdigest()
574
+ class_name = os.path.join(
575
+ "media",
576
+ "classes",
577
+ class_id + "_cls",
578
+ )
579
+ classes_entry = artifact.add(self._classes, class_name)
580
+ json_dict["classes"] = {
581
+ "type": "classes-file",
582
+ "path": classes_entry.path,
583
+ "digest": classes_entry.digest,
584
+ }
585
+
586
+ elif not isinstance(run_or_artifact, wandb.Run):
587
+ raise TypeError("to_json accepts wandb.Run or wandb_artifact.Artifact")
588
+
589
+ if self._boxes:
590
+ json_dict["boxes"] = {
591
+ k: box.to_json(run_or_artifact) for (k, box) in self._boxes.items()
592
+ }
593
+ if self._masks:
594
+ json_dict["masks"] = {
595
+ k: mask.to_json(run_or_artifact) for (k, mask) in self._masks.items()
596
+ }
597
+ return json_dict
598
+
599
+ def guess_mode(
600
+ self,
601
+ data: Union["np.ndarray", "torch.Tensor"],
602
+ file_type: Optional[str] = None,
603
+ ) -> str:
604
+ """Guess what type of image the np.array is representing.
605
+
606
+ <!-- lazydoc-ignore: internal -->
607
+ """
608
+ # TODO: do we want to support dimensions being at the beginning of the array?
609
+ ndims = data.ndim
610
+ if util.is_pytorch_tensor_typename(util.get_full_typename(data)):
611
+ # Torch tenors typically have the channels dimension first
612
+ num_channels = data.shape[0]
613
+ else:
614
+ num_channels = data.shape[-1]
615
+
616
+ if ndims == 2 or num_channels == 1:
617
+ return "L"
618
+ elif num_channels == 3:
619
+ return "RGB"
620
+ elif num_channels == 4:
621
+ if file_type in ["jpg", "jpeg"]:
622
+ wandb.termwarn(
623
+ "JPEG format does not support transparency. "
624
+ "Ignoring alpha channel.",
625
+ repeat=False,
626
+ )
627
+ return "RGB"
628
+ else:
629
+ return "RGBA"
630
+ else:
631
+ raise ValueError(
632
+ f"Un-supported shape for image conversion {list(data.shape)}"
633
+ )
634
+
635
+ @classmethod
636
+ def seq_to_json(
637
+ cls: Type["Image"],
638
+ seq: Sequence["BatchableMedia"],
639
+ run: "wandb.Run",
640
+ key: str,
641
+ step: Union[int, str],
642
+ ) -> dict:
643
+ """Convert a sequence of Image objects to a JSON representation.
644
+
645
+ "<!-- lazydoc-ignore-classmethod: internal -->
646
+ """
647
+ if TYPE_CHECKING:
648
+ seq = cast(Sequence["Image"], seq)
649
+
650
+ jsons = [obj.to_json(run) for obj in seq]
651
+
652
+ media_dir = cls.get_media_subdir()
653
+
654
+ for obj in jsons:
655
+ expected = LogicalPath(media_dir)
656
+ if "path" in obj and not obj["path"].startswith(expected):
657
+ raise ValueError(
658
+ "Files in an array of Image's must be in the {} directory, not {}".format(
659
+ cls.get_media_subdir(), obj["path"]
660
+ )
661
+ )
662
+
663
+ num_images_to_log = len(seq)
664
+ width, height = seq[0].image.size # type: ignore
665
+ format = jsons[0]["format"]
666
+
667
+ def size_equals_image(image: "Image") -> bool:
668
+ img_width, img_height = image.image.size # type: ignore
669
+ return img_width == width and img_height == height
670
+
671
+ sizes_match = all(size_equals_image(img) for img in seq)
672
+ if not sizes_match:
673
+ logging.warning(
674
+ "Images sizes do not match. This will causes images to be display incorrectly in the UI."
675
+ )
676
+
677
+ meta = {
678
+ "_type": "images/separated",
679
+ "width": width,
680
+ "height": height,
681
+ "format": format,
682
+ "count": num_images_to_log,
683
+ }
684
+ if _server_accepts_image_filenames(run):
685
+ meta["filenames"] = [
686
+ obj.get("path", obj.get("artifact_path")) for obj in jsons
687
+ ]
688
+ else:
689
+ wandb.termwarn(
690
+ "Unable to log image array filenames. In some cases, this can prevent images from being "
691
+ "viewed in the UI. Please upgrade your wandb server",
692
+ repeat=False,
693
+ )
694
+
695
+ captions = Image.all_captions(seq)
696
+
697
+ if captions:
698
+ meta["captions"] = captions
699
+
700
+ all_masks = Image.all_masks(seq, run, key, step)
701
+
702
+ if all_masks:
703
+ meta["all_masks"] = all_masks
704
+
705
+ all_boxes = Image.all_boxes(seq, run, key, step)
706
+
707
+ if all_boxes:
708
+ meta["all_boxes"] = all_boxes
709
+
710
+ return meta
711
+
712
+ @classmethod
713
+ def all_masks(
714
+ cls: Type["Image"],
715
+ images: Sequence["Image"],
716
+ run: "wandb.Run",
717
+ run_key: str,
718
+ step: Union[int, str],
719
+ ) -> Union[List[Optional[dict]], bool]:
720
+ """Collect all masks from a list of images.
721
+
722
+ "<!-- lazydoc-ignore-classmethod: internal -->
723
+ """
724
+ all_mask_groups: List[Optional[dict]] = []
725
+ for image in images:
726
+ if image._masks:
727
+ mask_group = {}
728
+ for k in image._masks:
729
+ mask = image._masks[k]
730
+ mask_group[k] = mask.to_json(run)
731
+ all_mask_groups.append(mask_group)
732
+ else:
733
+ all_mask_groups.append(None)
734
+ if all_mask_groups and not all(x is None for x in all_mask_groups):
735
+ return all_mask_groups
736
+ else:
737
+ return False
738
+
739
+ @classmethod
740
+ def all_boxes(
741
+ cls: Type["Image"],
742
+ images: Sequence["Image"],
743
+ run: "wandb.Run",
744
+ run_key: str,
745
+ step: Union[int, str],
746
+ ) -> Union[List[Optional[dict]], bool]:
747
+ """Collect all boxes from a list of images.
748
+
749
+ "<!-- lazydoc-ignore-classmethod: internal -->
750
+ """
751
+ all_box_groups: List[Optional[dict]] = []
752
+ for image in images:
753
+ if image._boxes:
754
+ box_group = {}
755
+ for k in image._boxes:
756
+ box = image._boxes[k]
757
+ box_group[k] = box.to_json(run)
758
+ all_box_groups.append(box_group)
759
+ else:
760
+ all_box_groups.append(None)
761
+ if all_box_groups and not all(x is None for x in all_box_groups):
762
+ return all_box_groups
763
+ else:
764
+ return False
765
+
766
+ @classmethod
767
+ def all_captions(
768
+ cls: Type["Image"], images: Sequence["Media"]
769
+ ) -> Union[bool, Sequence[Optional[str]]]:
770
+ """Get captions from a list of images.
771
+
772
+ "<!-- lazydoc-ignore-classmethod: internal -->
773
+ """
774
+ return cls.captions(images)
775
+
776
+ def __ne__(self, other: object) -> bool:
777
+ return not self.__eq__(other)
778
+
779
+ def __eq__(self, other: object) -> bool:
780
+ if not isinstance(other, Image):
781
+ return False
782
+ else:
783
+ if self.path_is_reference(self._path) and self.path_is_reference(
784
+ other._path
785
+ ):
786
+ return self._path == other._path
787
+ self_image = self.image
788
+ other_image = other.image
789
+ if self_image is not None:
790
+ self_image = list(self_image.getdata()) # type: ignore
791
+ if other_image is not None:
792
+ other_image = list(other_image.getdata()) # type: ignore
793
+
794
+ return (
795
+ self._grouping == other._grouping
796
+ and self._caption == other._caption
797
+ and self._width == other._width
798
+ and self._height == other._height
799
+ and self_image == other_image
800
+ and self._classes == other._classes
801
+ )
802
+
803
+ def to_data_array(self) -> List[Any]:
804
+ """Convert to data array.
805
+
806
+ <!-- lazydoc-ignore: internal -->
807
+ """
808
+ res = []
809
+ if self.image is not None:
810
+ data = list(self.image.getdata())
811
+ for i in range(self.image.height):
812
+ res.append(data[i * self.image.width : (i + 1) * self.image.width])
813
+ self._free_ram()
814
+ return res
815
+
816
+ def _free_ram(self) -> None:
817
+ if self._path is not None:
818
+ self._image = None
819
+
820
+ @property
821
+ def image(self) -> Optional["PILImage"]:
822
+ if self._image is None:
823
+ if self._path is not None and not self.path_is_reference(self._path):
824
+ pil_image = util.get_module(
825
+ "PIL.Image",
826
+ required='wandb.Image needs the PIL package. To get it, run "pip install pillow".',
827
+ )
828
+ self._image = pil_image.open(self._path)
829
+ self._image.load()
830
+ return self._image
831
+
832
+
833
+ # Custom dtypes for typing system
834
+ class _ImageFileType(_dtypes.Type):
835
+ name = "image-file"
836
+ legacy_names = ["wandb.Image"]
837
+ types = [Image]
838
+
839
+ def __init__(
840
+ self,
841
+ box_layers=None,
842
+ box_score_keys=None,
843
+ mask_layers=None,
844
+ class_map=None,
845
+ **kwargs,
846
+ ):
847
+ box_layers = box_layers or {}
848
+ box_score_keys = box_score_keys or []
849
+ mask_layers = mask_layers or {}
850
+ class_map = class_map or {}
851
+
852
+ if isinstance(box_layers, _dtypes.ConstType):
853
+ box_layers = box_layers._params["val"]
854
+ if not isinstance(box_layers, dict):
855
+ raise TypeError("box_layers must be a dict")
856
+ else:
857
+ box_layers = _dtypes.ConstType(
858
+ {layer_key: set(box_layers[layer_key]) for layer_key in box_layers}
859
+ )
860
+
861
+ if isinstance(mask_layers, _dtypes.ConstType):
862
+ mask_layers = mask_layers._params["val"]
863
+ if not isinstance(mask_layers, dict):
864
+ raise TypeError("mask_layers must be a dict")
865
+ else:
866
+ mask_layers = _dtypes.ConstType(
867
+ {layer_key: set(mask_layers[layer_key]) for layer_key in mask_layers}
868
+ )
869
+
870
+ if isinstance(box_score_keys, _dtypes.ConstType):
871
+ box_score_keys = box_score_keys._params["val"]
872
+ if not isinstance(box_score_keys, list) and not isinstance(box_score_keys, set):
873
+ raise TypeError("box_score_keys must be a list or a set")
874
+ else:
875
+ box_score_keys = _dtypes.ConstType(set(box_score_keys))
876
+
877
+ if isinstance(class_map, _dtypes.ConstType):
878
+ class_map = class_map._params["val"]
879
+ if not isinstance(class_map, dict):
880
+ raise TypeError("class_map must be a dict")
881
+ else:
882
+ class_map = _dtypes.ConstType(class_map)
883
+
884
+ self.params.update(
885
+ {
886
+ "box_layers": box_layers,
887
+ "box_score_keys": box_score_keys,
888
+ "mask_layers": mask_layers,
889
+ "class_map": class_map,
890
+ }
891
+ )
892
+
893
+ def assign_type(self, wb_type=None):
894
+ if isinstance(wb_type, _ImageFileType):
895
+ box_layers_self = self.params["box_layers"].params["val"] or {}
896
+ box_score_keys_self = self.params["box_score_keys"].params["val"] or []
897
+ mask_layers_self = self.params["mask_layers"].params["val"] or {}
898
+ class_map_self = self.params["class_map"].params["val"] or {}
899
+
900
+ box_layers_other = wb_type.params["box_layers"].params["val"] or {}
901
+ box_score_keys_other = wb_type.params["box_score_keys"].params["val"] or []
902
+ mask_layers_other = wb_type.params["mask_layers"].params["val"] or {}
903
+ class_map_other = wb_type.params["class_map"].params["val"] or {}
904
+
905
+ # Merge the class_ids from each set of box_layers
906
+ box_layers = {
907
+ str(key): set(
908
+ list(box_layers_self.get(key, []))
909
+ + list(box_layers_other.get(key, []))
910
+ )
911
+ for key in set(
912
+ list(box_layers_self.keys()) + list(box_layers_other.keys())
913
+ )
914
+ }
915
+
916
+ # Merge the class_ids from each set of mask_layers
917
+ mask_layers = {
918
+ str(key): set(
919
+ list(mask_layers_self.get(key, []))
920
+ + list(mask_layers_other.get(key, []))
921
+ )
922
+ for key in set(
923
+ list(mask_layers_self.keys()) + list(mask_layers_other.keys())
924
+ )
925
+ }
926
+
927
+ # Merge the box score keys
928
+ box_score_keys = set(list(box_score_keys_self) + list(box_score_keys_other))
929
+
930
+ # Merge the class_map
931
+ class_map = {
932
+ str(key): class_map_self.get(key, class_map_other.get(key, None))
933
+ for key in set(
934
+ list(class_map_self.keys()) + list(class_map_other.keys())
935
+ )
936
+ }
937
+
938
+ return _ImageFileType(box_layers, box_score_keys, mask_layers, class_map)
939
+
940
+ return _dtypes.InvalidType()
941
+
942
+ @classmethod
943
+ def from_obj(cls, py_obj):
944
+ if not isinstance(py_obj, Image):
945
+ raise TypeError("py_obj must be a wandb.Image")
946
+ else:
947
+ if hasattr(py_obj, "_boxes") and py_obj._boxes:
948
+ box_layers = {
949
+ str(key): set(py_obj._boxes[key]._class_labels.keys())
950
+ for key in py_obj._boxes.keys()
951
+ }
952
+ box_score_keys = {
953
+ key
954
+ for val in py_obj._boxes.values()
955
+ for box in val._val
956
+ for key in box.get("scores", {}).keys()
957
+ }
958
+
959
+ else:
960
+ box_layers = {}
961
+ box_score_keys = set()
962
+
963
+ if hasattr(py_obj, "_masks") and py_obj._masks:
964
+ mask_layers = {
965
+ str(key): set(
966
+ py_obj._masks[key]._val["class_labels"].keys()
967
+ if hasattr(py_obj._masks[key], "_val")
968
+ else []
969
+ )
970
+ for key in py_obj._masks.keys()
971
+ }
972
+ else:
973
+ mask_layers = {}
974
+
975
+ if hasattr(py_obj, "_classes") and py_obj._classes:
976
+ class_set = {
977
+ str(item["id"]): item["name"] for item in py_obj._classes._class_set
978
+ }
979
+ else:
980
+ class_set = {}
981
+
982
+ return cls(box_layers, box_score_keys, mask_layers, class_set)
983
+
984
+
985
+ _dtypes.TypeRegistry.add(_ImageFileType)