ultralytics 8.0.205__tar.gz → 8.0.207__tar.gz

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.

Potentially problematic release.


This version of ultralytics might be problematic. Click here for more details.

Files changed (179) hide show
  1. {ultralytics-8.0.205/ultralytics.egg-info → ultralytics-8.0.207}/PKG-INFO +1 -1
  2. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/__init__.py +1 -1
  3. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/engine/exporter.py +10 -13
  4. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/engine/model.py +2 -5
  5. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/engine/trainer.py +16 -18
  6. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/trackers/track.py +3 -3
  7. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/__init__.py +2 -4
  8. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/checks.py +25 -0
  9. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/downloads.py +5 -1
  10. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/ops.py +4 -4
  11. {ultralytics-8.0.205 → ultralytics-8.0.207/ultralytics.egg-info}/PKG-INFO +1 -1
  12. {ultralytics-8.0.205 → ultralytics-8.0.207}/CONTRIBUTING.md +0 -0
  13. {ultralytics-8.0.205 → ultralytics-8.0.207}/LICENSE +0 -0
  14. {ultralytics-8.0.205 → ultralytics-8.0.207}/MANIFEST.in +0 -0
  15. {ultralytics-8.0.205 → ultralytics-8.0.207}/README.md +0 -0
  16. {ultralytics-8.0.205 → ultralytics-8.0.207}/README.zh-CN.md +0 -0
  17. {ultralytics-8.0.205 → ultralytics-8.0.207}/requirements.txt +0 -0
  18. {ultralytics-8.0.205 → ultralytics-8.0.207}/setup.cfg +0 -0
  19. {ultralytics-8.0.205 → ultralytics-8.0.207}/setup.py +0 -0
  20. {ultralytics-8.0.205 → ultralytics-8.0.207}/tests/conftest.py +0 -0
  21. {ultralytics-8.0.205 → ultralytics-8.0.207}/tests/test_cli.py +0 -0
  22. {ultralytics-8.0.205 → ultralytics-8.0.207}/tests/test_cuda.py +0 -0
  23. {ultralytics-8.0.205 → ultralytics-8.0.207}/tests/test_engine.py +0 -0
  24. {ultralytics-8.0.205 → ultralytics-8.0.207}/tests/test_integrations.py +0 -0
  25. {ultralytics-8.0.205 → ultralytics-8.0.207}/tests/test_python.py +0 -0
  26. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/assets/bus.jpg +0 -0
  27. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/assets/zidane.jpg +0 -0
  28. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/__init__.py +0 -0
  29. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  30. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/datasets/DOTAv2.yaml +0 -0
  31. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  32. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  33. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/datasets/Objects365.yaml +0 -0
  34. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  35. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/datasets/VOC.yaml +0 -0
  36. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/datasets/VisDrone.yaml +0 -0
  37. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/datasets/coco-pose.yaml +0 -0
  38. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/datasets/coco.yaml +0 -0
  39. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  40. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  41. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  42. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  43. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  44. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  45. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  46. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/datasets/xView.yaml +0 -0
  47. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/default.yaml +0 -0
  48. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  49. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  50. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  51. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  52. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  53. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  54. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  55. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  56. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  57. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  58. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  59. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  60. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  61. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  62. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  63. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  64. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  65. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  66. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  67. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/data/__init__.py +0 -0
  68. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/data/annotator.py +0 -0
  69. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/data/augment.py +0 -0
  70. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/data/base.py +0 -0
  71. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/data/build.py +0 -0
  72. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/data/converter.py +0 -0
  73. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/data/dataset.py +0 -0
  74. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/data/loaders.py +0 -0
  75. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/data/utils.py +0 -0
  76. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/engine/__init__.py +0 -0
  77. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/engine/predictor.py +0 -0
  78. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/engine/results.py +0 -0
  79. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/engine/tuner.py +0 -0
  80. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/engine/validator.py +0 -0
  81. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/hub/__init__.py +0 -0
  82. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/hub/auth.py +0 -0
  83. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/hub/session.py +0 -0
  84. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/hub/utils.py +0 -0
  85. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/__init__.py +0 -0
  86. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/fastsam/__init__.py +0 -0
  87. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/fastsam/model.py +0 -0
  88. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/fastsam/predict.py +0 -0
  89. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/fastsam/prompt.py +0 -0
  90. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/fastsam/utils.py +0 -0
  91. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/fastsam/val.py +0 -0
  92. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/nas/__init__.py +0 -0
  93. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/nas/model.py +0 -0
  94. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/nas/predict.py +0 -0
  95. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/nas/val.py +0 -0
  96. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/rtdetr/__init__.py +0 -0
  97. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/rtdetr/model.py +0 -0
  98. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/rtdetr/predict.py +0 -0
  99. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/rtdetr/train.py +0 -0
  100. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/rtdetr/val.py +0 -0
  101. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/sam/__init__.py +0 -0
  102. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/sam/amg.py +0 -0
  103. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/sam/build.py +0 -0
  104. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/sam/model.py +0 -0
  105. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/sam/modules/__init__.py +0 -0
  106. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/sam/modules/decoders.py +0 -0
  107. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/sam/modules/encoders.py +0 -0
  108. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/sam/modules/sam.py +0 -0
  109. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  110. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/sam/modules/transformer.py +0 -0
  111. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/sam/predict.py +0 -0
  112. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/utils/__init__.py +0 -0
  113. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/utils/loss.py +0 -0
  114. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/utils/ops.py +0 -0
  115. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/yolo/__init__.py +0 -0
  116. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/yolo/classify/__init__.py +0 -0
  117. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/yolo/classify/predict.py +0 -0
  118. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/yolo/classify/train.py +0 -0
  119. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/yolo/classify/val.py +0 -0
  120. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/yolo/detect/__init__.py +0 -0
  121. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/yolo/detect/predict.py +0 -0
  122. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/yolo/detect/train.py +0 -0
  123. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/yolo/detect/val.py +0 -0
  124. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/yolo/model.py +0 -0
  125. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/yolo/pose/__init__.py +0 -0
  126. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/yolo/pose/predict.py +0 -0
  127. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/yolo/pose/train.py +0 -0
  128. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/yolo/pose/val.py +0 -0
  129. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/yolo/segment/__init__.py +0 -0
  130. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/yolo/segment/predict.py +0 -0
  131. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/yolo/segment/train.py +0 -0
  132. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/models/yolo/segment/val.py +0 -0
  133. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/nn/__init__.py +0 -0
  134. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/nn/autobackend.py +0 -0
  135. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/nn/modules/__init__.py +0 -0
  136. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/nn/modules/block.py +0 -0
  137. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/nn/modules/conv.py +0 -0
  138. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/nn/modules/head.py +0 -0
  139. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/nn/modules/transformer.py +0 -0
  140. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/nn/modules/utils.py +0 -0
  141. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/nn/tasks.py +0 -0
  142. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/trackers/__init__.py +0 -0
  143. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/trackers/basetrack.py +0 -0
  144. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/trackers/bot_sort.py +0 -0
  145. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/trackers/byte_tracker.py +0 -0
  146. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/trackers/utils/__init__.py +0 -0
  147. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/trackers/utils/gmc.py +0 -0
  148. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  149. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/trackers/utils/matching.py +0 -0
  150. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/autobatch.py +0 -0
  151. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/benchmarks.py +0 -0
  152. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/callbacks/__init__.py +0 -0
  153. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/callbacks/base.py +0 -0
  154. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/callbacks/clearml.py +0 -0
  155. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/callbacks/comet.py +0 -0
  156. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/callbacks/dvc.py +0 -0
  157. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/callbacks/hub.py +0 -0
  158. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/callbacks/mlflow.py +0 -0
  159. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/callbacks/neptune.py +0 -0
  160. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/callbacks/raytune.py +0 -0
  161. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  162. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/callbacks/wb.py +0 -0
  163. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/dist.py +0 -0
  164. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/errors.py +0 -0
  165. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/files.py +0 -0
  166. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/instance.py +0 -0
  167. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/loss.py +0 -0
  168. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/metrics.py +0 -0
  169. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/patches.py +0 -0
  170. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/plotting.py +0 -0
  171. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/tal.py +0 -0
  172. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/torch_utils.py +0 -0
  173. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/triton.py +0 -0
  174. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics/utils/tuner.py +0 -0
  175. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics.egg-info/SOURCES.txt +0 -0
  176. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics.egg-info/dependency_links.txt +0 -0
  177. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics.egg-info/entry_points.txt +0 -0
  178. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics.egg-info/requires.txt +0 -0
  179. {ultralytics-8.0.205 → ultralytics-8.0.207}/ultralytics.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ultralytics
3
- Version: 8.0.205
3
+ Version: 8.0.207
4
4
  Summary: Ultralytics YOLOv8 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Home-page: https://github.com/ultralytics/ultralytics
6
6
  Author: Ultralytics
@@ -1,6 +1,6 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
2
 
3
- __version__ = '8.0.205'
3
+ __version__ = '8.0.207'
4
4
 
5
5
  from ultralytics.models import RTDETR, SAM, YOLO
6
6
  from ultralytics.models.fastsam import FastSAM
@@ -69,7 +69,7 @@ from ultralytics.nn.modules import C2f, Detect, RTDETRDecoder
69
69
  from ultralytics.nn.tasks import DetectionModel, SegmentationModel
70
70
  from ultralytics.utils import (ARM64, DEFAULT_CFG, LINUX, LOGGER, MACOS, ROOT, WINDOWS, __version__, callbacks,
71
71
  colorstr, get_default_args, yaml_save)
72
- from ultralytics.utils.checks import check_imgsz, check_requirements, check_version
72
+ from ultralytics.utils.checks import check_imgsz, check_is_path_safe, check_requirements, check_version
73
73
  from ultralytics.utils.downloads import attempt_download_asset, get_github_assets
74
74
  from ultralytics.utils.files import file_size, spaces_in_path
75
75
  from ultralytics.utils.ops import Profile
@@ -450,12 +450,9 @@ class Exporter:
450
450
  f = Path(str(self.file).replace(self.file.suffix, f'_ncnn_model{os.sep}'))
451
451
  f_ts = self.file.with_suffix('.torchscript')
452
452
 
453
- pnnx_filename = 'pnnx.exe' if WINDOWS else 'pnnx'
454
- if Path(pnnx_filename).is_file():
455
- pnnx = pnnx_filename
456
- elif (ROOT / pnnx_filename).is_file():
457
- pnnx = ROOT / pnnx_filename
458
- else:
453
+ name = Path('pnnx.exe' if WINDOWS else 'pnnx') # PNNX filename
454
+ pnnx = name if name.is_file() else ROOT / name
455
+ if not pnnx.is_file():
459
456
  LOGGER.warning(
460
457
  f'{prefix} WARNING ⚠️ PNNX not found. Attempting to download binary file from '
461
458
  'https://github.com/pnnx/pnnx/.\nNote PNNX Binary file must be placed in current working directory '
@@ -465,12 +462,12 @@ class Exporter:
465
462
  asset = [x for x in assets if system in x][0] if assets else \
466
463
  f'https://github.com/pnnx/pnnx/releases/download/20230816/pnnx-20230816-{system}.zip' # fallback
467
464
  asset = attempt_download_asset(asset, repo='pnnx/pnnx', release='latest')
468
- unzip_dir = Path(asset).with_suffix('')
469
- pnnx = ROOT / pnnx_filename # new location
470
- (unzip_dir / pnnx_filename).rename(pnnx) # move binary to ROOT
471
- shutil.rmtree(unzip_dir) # delete unzip dir
472
- Path(asset).unlink() # delete zip
473
- pnnx.chmod(0o777) # set read, write, and execute permissions for everyone
465
+ if check_is_path_safe(Path.cwd(), asset): # avoid path traversal security vulnerability
466
+ unzip_dir = Path(asset).with_suffix('')
467
+ (unzip_dir / name).rename(pnnx) # move binary to ROOT
468
+ shutil.rmtree(unzip_dir) # delete unzip dir
469
+ Path(asset).unlink() # delete zip
470
+ pnnx.chmod(0o777) # set read, write, and execute permissions for everyone
474
471
 
475
472
  ncnn_args = [
476
473
  f'ncnnparam={f / "model.ncnn.param"}',
@@ -9,7 +9,6 @@ from ultralytics.cfg import TASK2DATA, get_cfg, get_save_dir
9
9
  from ultralytics.hub.utils import HUB_WEB_ROOT
10
10
  from ultralytics.nn.tasks import attempt_load_one_weight, guess_model_task, nn, yaml_model_load
11
11
  from ultralytics.utils import ASSETS, DEFAULT_CFG_DICT, LOGGER, RANK, callbacks, checks, emojis, yaml_load
12
- from ultralytics.utils.downloads import GITHUB_ASSETS_STEMS
13
12
 
14
13
 
15
14
  class Model(nn.Module):
@@ -88,10 +87,8 @@ class Model(nn.Module):
88
87
  return
89
88
 
90
89
  # Load or create new YOLO model
91
- suffix = Path(model).suffix
92
- if not suffix and Path(model).stem in GITHUB_ASSETS_STEMS:
93
- model, suffix = Path(model).with_suffix('.pt'), '.pt' # add suffix, i.e. yolov8n -> yolov8n.pt
94
- if suffix in ('.yaml', '.yml'):
90
+ model = checks.check_model_file_from_stem(model) # add suffix, i.e. yolov8n -> yolov8n.pt
91
+ if Path(model).suffix in ('.yaml', '.yml'):
95
92
  self._new(model, task)
96
93
  else:
97
94
  self._load(model, task)
@@ -19,8 +19,6 @@ import numpy as np
19
19
  import torch
20
20
  from torch import distributed as dist
21
21
  from torch import nn, optim
22
- from torch.cuda import amp
23
- from torch.nn.parallel import DistributedDataParallel as DDP
24
22
 
25
23
  from ultralytics.cfg import get_cfg, get_save_dir
26
24
  from ultralytics.data.utils import check_cls_dataset, check_det_dataset
@@ -28,7 +26,7 @@ from ultralytics.nn.tasks import attempt_load_one_weight, attempt_load_weights
28
26
  from ultralytics.utils import (DEFAULT_CFG, LOGGER, RANK, TQDM, __version__, callbacks, clean_url, colorstr, emojis,
29
27
  yaml_save)
30
28
  from ultralytics.utils.autobatch import check_train_batch_size
31
- from ultralytics.utils.checks import check_amp, check_file, check_imgsz, print_args
29
+ from ultralytics.utils.checks import check_amp, check_file, check_imgsz, check_model_file_from_stem, print_args
32
30
  from ultralytics.utils.dist import ddp_cleanup, generate_ddp_command
33
31
  from ultralytics.utils.files import get_latest_run
34
32
  from ultralytics.utils.torch_utils import (EarlyStopping, ModelEMA, de_parallel, init_seeds, one_cycle, select_device,
@@ -43,7 +41,6 @@ class BaseTrainer:
43
41
 
44
42
  Attributes:
45
43
  args (SimpleNamespace): Configuration for the trainer.
46
- check_resume (method): Method to check if training should be resumed from a saved checkpoint.
47
44
  validator (BaseValidator): Validator instance.
48
45
  model (nn.Module): Model instance.
49
46
  callbacks (defaultdict): Dictionary of callbacks.
@@ -62,6 +59,7 @@ class BaseTrainer:
62
59
  trainset (torch.utils.data.Dataset): Training dataset.
63
60
  testset (torch.utils.data.Dataset): Testing dataset.
64
61
  ema (nn.Module): EMA (Exponential Moving Average) of the model.
62
+ resume (bool): Resume training from a checkpoint.
65
63
  lf (nn.Module): Loss function.
66
64
  scheduler (torch.optim.lr_scheduler._LRScheduler): Learning rate scheduler.
67
65
  best_fitness (float): The best fitness value achieved.
@@ -84,7 +82,6 @@ class BaseTrainer:
84
82
  self.check_resume(overrides)
85
83
  self.device = select_device(self.args.device, self.args.batch)
86
84
  self.validator = None
87
- self.model = None
88
85
  self.metrics = None
89
86
  self.plots = {}
90
87
  init_seeds(self.args.seed + 1 + RANK, deterministic=self.args.deterministic)
@@ -111,7 +108,7 @@ class BaseTrainer:
111
108
  self.args.workers = 0 # faster CPU training as time dominated by inference, not dataloading
112
109
 
113
110
  # Model and Dataset
114
- self.model = self.args.model
111
+ self.model = check_model_file_from_stem(self.args.model) # add suffix, i.e. yolov8n -> yolov8n.pt
115
112
  try:
116
113
  if self.args.task == 'classify':
117
114
  self.data = check_cls_dataset(self.args.data)
@@ -124,6 +121,7 @@ class BaseTrainer:
124
121
 
125
122
  self.trainset, self.testset = self.get_dataset(self.data)
126
123
  self.ema = None
124
+ self.resume = False
127
125
 
128
126
  # Optimization utils init
129
127
  self.lf = None
@@ -236,9 +234,9 @@ class BaseTrainer:
236
234
  if RANK > -1 and world_size > 1: # DDP
237
235
  dist.broadcast(self.amp, src=0) # broadcast the tensor from rank 0 to all other ranks (returns None)
238
236
  self.amp = bool(self.amp) # as boolean
239
- self.scaler = amp.GradScaler(enabled=self.amp)
237
+ self.scaler = torch.cuda.amp.GradScaler(enabled=self.amp)
240
238
  if world_size > 1:
241
- self.model = DDP(self.model, device_ids=[RANK])
239
+ self.model = nn.parallel.DistributedDataParallel(self.model, device_ids=[RANK])
242
240
 
243
241
  # Check imgsz
244
242
  gs = max(int(self.model.stride.max() if hasattr(self.model, 'stride') else 32), 32) # grid size (max stride)
@@ -311,11 +309,7 @@ class BaseTrainer:
311
309
  pbar = enumerate(self.train_loader)
312
310
  # Update dataloader attributes (optional)
313
311
  if epoch == (self.epochs - self.args.close_mosaic):
314
- LOGGER.info('Closing dataloader mosaic')
315
- if hasattr(self.train_loader.dataset, 'mosaic'):
316
- self.train_loader.dataset.mosaic = False
317
- if hasattr(self.train_loader.dataset, 'close_mosaic'):
318
- self.train_loader.dataset.close_mosaic(hyp=self.args)
312
+ self._close_dataloader_mosaic()
319
313
  self.train_loader.reset()
320
314
 
321
315
  if RANK in (-1, 0):
@@ -395,7 +389,7 @@ class BaseTrainer:
395
389
  self.epoch_time = tnow - self.epoch_time_start
396
390
  self.epoch_time_start = tnow
397
391
  self.run_callbacks('on_fit_epoch_end')
398
- torch.cuda.empty_cache() # clears GPU vRAM at end of epoch, can help with out of memory errors
392
+ torch.cuda.empty_cache() # clear GPU memory at end of epoch, may help reduce CUDA out of memory errors
399
393
 
400
394
  # Early Stopping
401
395
  if RANK != -1: # if DDP training
@@ -613,11 +607,15 @@ class BaseTrainer:
613
607
  self.best_fitness = best_fitness
614
608
  self.start_epoch = start_epoch
615
609
  if start_epoch > (self.epochs - self.args.close_mosaic):
610
+ self._close_dataloader_mosaic()
611
+
612
+ def _close_dataloader_mosaic(self):
613
+ """Update dataloaders to stop using mosaic augmentation."""
614
+ if hasattr(self.train_loader.dataset, 'mosaic'):
615
+ self.train_loader.dataset.mosaic = False
616
+ if hasattr(self.train_loader.dataset, 'close_mosaic'):
616
617
  LOGGER.info('Closing dataloader mosaic')
617
- if hasattr(self.train_loader.dataset, 'mosaic'):
618
- self.train_loader.dataset.mosaic = False
619
- if hasattr(self.train_loader.dataset, 'close_mosaic'):
620
- self.train_loader.dataset.close_mosaic(hyp=self.args)
618
+ self.train_loader.dataset.close_mosaic(hyp=self.args)
621
619
 
622
620
  def build_optimizer(self, model, name='auto', lr=0.001, momentum=0.9, decay=1e-5, iterations=1e5):
623
621
  """
@@ -38,13 +38,13 @@ def on_predict_start(predictor, persist=False):
38
38
  predictor.trackers = trackers
39
39
 
40
40
 
41
- def on_predict_postprocess_end(predictor):
41
+ def on_predict_postprocess_end(predictor, persist=False):
42
42
  """Postprocess detected boxes and update with object tracking."""
43
43
  bs = predictor.dataset.bs
44
44
  path, im0s = predictor.batch[:2]
45
45
 
46
46
  for i in range(bs):
47
- if predictor.vid_path[i] != str(predictor.save_dir / Path(path[i]).name): # new video
47
+ if not persist and predictor.vid_path[i] != str(predictor.save_dir / Path(path[i]).name): # new video
48
48
  predictor.trackers[i].reset()
49
49
 
50
50
  det = predictor.results[i].boxes.cpu().numpy()
@@ -67,4 +67,4 @@ def register_tracker(model, persist):
67
67
  persist (bool): Whether to persist the trackers if they already exist.
68
68
  """
69
69
  model.add_callback('on_predict_start', partial(on_predict_start, persist=persist))
70
- model.add_callback('on_predict_postprocess_end', on_predict_postprocess_end)
70
+ model.add_callback('on_predict_postprocess_end', partial(on_predict_postprocess_end, persist=persist))
@@ -270,6 +270,8 @@ set_logging(LOGGING_NAME, verbose=VERBOSE) # run before defining LOGGER
270
270
  LOGGER = logging.getLogger(LOGGING_NAME) # define globally (used in train.py, val.py, detect.py, etc.)
271
271
  if WINDOWS: # emoji-safe logging
272
272
  LOGGER.addFilter(EmojiFilter())
273
+ for logger in 'sentry_sdk', 'urllib3.connectionpool':
274
+ logging.getLogger(logger).setLevel(logging.CRITICAL)
273
275
 
274
276
 
275
277
  class ThreadingLocked:
@@ -819,10 +821,6 @@ def set_sentry():
819
821
  ignore_errors=[KeyboardInterrupt, FileNotFoundError])
820
822
  sentry_sdk.set_user({'id': SETTINGS['uuid']}) # SHA-256 anonymized UUID hash
821
823
 
822
- # Disable all sentry logging
823
- for logger in 'sentry_sdk', 'sentry_sdk.errors':
824
- logging.getLogger(logger).setLevel(logging.CRITICAL)
825
-
826
824
 
827
825
  class SettingsManager(dict):
828
826
  """
@@ -426,6 +426,14 @@ def check_yolov5u_filename(file: str, verbose: bool = True):
426
426
  return file
427
427
 
428
428
 
429
+ def check_model_file_from_stem(model='yolov8n'):
430
+ """Return a model filename from a valid model stem."""
431
+ if model and not Path(model).suffix and Path(model).stem in downloads.GITHUB_ASSETS_STEMS:
432
+ return Path(model).with_suffix('.pt') # add suffix, i.e. yolov8n -> yolov8n.pt
433
+ else:
434
+ return model
435
+
436
+
429
437
  def check_file(file, suffix='', download=True, hard=True):
430
438
  """Search/download file (if necessary) and return path."""
431
439
  check_suffix(file, suffix) # optional
@@ -455,6 +463,23 @@ def check_yaml(file, suffix=('.yaml', '.yml'), hard=True):
455
463
  return check_file(file, suffix, hard=hard)
456
464
 
457
465
 
466
+ def check_is_path_safe(basedir, path):
467
+ """
468
+ Check if the resolved path is under the intended directory to prevent path traversal.
469
+
470
+ Args:
471
+ basedir (Path | str): The intended directory.
472
+ path (Path | str): The path to check.
473
+
474
+ Returns:
475
+ (bool): True if the path is safe, False otherwise.
476
+ """
477
+ base_dir_resolved = Path(basedir).resolve()
478
+ path_resolved = Path(path).resolve()
479
+
480
+ return path_resolved.is_file() and path_resolved.parts[:len(base_dir_resolved.parts)] == base_dir_resolved.parts
481
+
482
+
458
483
  def check_imshow(warn=False):
459
484
  """Check if environment supports image displays."""
460
485
  try:
@@ -159,7 +159,11 @@ def unzip_file(file, path=None, exclude=('.DS_Store', '__MACOSX'), exist_ok=Fals
159
159
  return path
160
160
 
161
161
  for f in TQDM(files, desc=f'Unzipping {file} to {Path(path).resolve()}...', unit='file', disable=not progress):
162
- zipObj.extract(f, path=extract_path)
162
+ # Ensure the file is within the extract_path to avoid path traversal security vulnerability
163
+ if '..' in Path(f).parts:
164
+ LOGGER.warning(f'Potentially insecure file path: {f}, skipping extraction.')
165
+ continue
166
+ zipObj.extract(f, extract_path)
163
167
 
164
168
  return path # return unzip dir
165
169
 
@@ -324,8 +324,8 @@ def scale_image(masks, im0_shape, ratio_pad=None):
324
324
  else:
325
325
  gain = ratio_pad[0][0]
326
326
  pad = ratio_pad[1]
327
- top, left = int(pad[1]), int(pad[0]) # y, x
328
- bottom, right = int(im1_shape[0] - pad[1]), int(im1_shape[1] - pad[0])
327
+ top, left = (int(round(pad[1] - 0.1)), int(round(pad[0] - 0.1))) # y, x
328
+ bottom, right = (int(round(im1_shape[0] - pad[1] + 0.1)), int(round(im1_shape[1] - pad[0] + 0.1)))
329
329
 
330
330
  if len(masks.shape) < 2:
331
331
  raise ValueError(f'"len of masks shape" should be 2 or 3, but got {len(masks.shape)}')
@@ -704,8 +704,8 @@ def scale_masks(masks, shape, padding=True):
704
704
  if padding:
705
705
  pad[0] /= 2
706
706
  pad[1] /= 2
707
- top, left = (int(pad[1]), int(pad[0])) if padding else (0, 0) # y, x
708
- bottom, right = (int(mh - pad[1]), int(mw - pad[0]))
707
+ top, left = (int(round(pad[1] - 0.1)), int(round(pad[0] - 0.1))) if padding else (0, 0) # y, x
708
+ bottom, right = (int(round(mh - pad[1] + 0.1)), int(round(mw - pad[0] + 0.1)))
709
709
  masks = masks[..., top:bottom, left:right]
710
710
 
711
711
  masks = F.interpolate(masks, shape, mode='bilinear', align_corners=False) # NCHW
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ultralytics
3
- Version: 8.0.205
3
+ Version: 8.0.207
4
4
  Summary: Ultralytics YOLOv8 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Home-page: https://github.com/ultralytics/ultralytics
6
6
  Author: Ultralytics
File without changes
File without changes
File without changes
File without changes
File without changes