ultralytics 8.3.212__tar.gz → 8.3.213__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.
Files changed (288) hide show
  1. {ultralytics-8.3.212 → ultralytics-8.3.213}/PKG-INFO +1 -1
  2. {ultralytics-8.3.212 → ultralytics-8.3.213}/tests/test_engine.py +19 -0
  3. {ultralytics-8.3.212 → ultralytics-8.3.213}/tests/test_python.py +3 -0
  4. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/__init__.py +1 -1
  5. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/Objects365.yaml +19 -15
  6. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/VOC.yaml +4 -5
  7. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/VisDrone.yaml +5 -5
  8. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/coco-pose.yaml +3 -2
  9. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/coco.yaml +2 -2
  10. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/lvis.yaml +2 -2
  11. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/engine/trainer.py +51 -10
  12. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics.egg-info/PKG-INFO +1 -1
  13. {ultralytics-8.3.212 → ultralytics-8.3.213}/LICENSE +0 -0
  14. {ultralytics-8.3.212 → ultralytics-8.3.213}/README.md +0 -0
  15. {ultralytics-8.3.212 → ultralytics-8.3.213}/pyproject.toml +0 -0
  16. {ultralytics-8.3.212 → ultralytics-8.3.213}/setup.cfg +0 -0
  17. {ultralytics-8.3.212 → ultralytics-8.3.213}/tests/__init__.py +0 -0
  18. {ultralytics-8.3.212 → ultralytics-8.3.213}/tests/conftest.py +0 -0
  19. {ultralytics-8.3.212 → ultralytics-8.3.213}/tests/test_cli.py +0 -0
  20. {ultralytics-8.3.212 → ultralytics-8.3.213}/tests/test_cuda.py +0 -0
  21. {ultralytics-8.3.212 → ultralytics-8.3.213}/tests/test_exports.py +0 -0
  22. {ultralytics-8.3.212 → ultralytics-8.3.213}/tests/test_integrations.py +0 -0
  23. {ultralytics-8.3.212 → ultralytics-8.3.213}/tests/test_solutions.py +0 -0
  24. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/assets/bus.jpg +0 -0
  25. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/assets/zidane.jpg +0 -0
  26. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/__init__.py +0 -0
  27. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/Argoverse.yaml +0 -0
  28. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/DOTAv1.5.yaml +0 -0
  29. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/DOTAv1.yaml +0 -0
  30. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/GlobalWheat2020.yaml +0 -0
  31. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/HomeObjects-3K.yaml +0 -0
  32. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/ImageNet.yaml +0 -0
  33. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/SKU-110K.yaml +0 -0
  34. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/african-wildlife.yaml +0 -0
  35. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/brain-tumor.yaml +0 -0
  36. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/carparts-seg.yaml +0 -0
  37. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/coco128-seg.yaml +0 -0
  38. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/coco128.yaml +0 -0
  39. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/coco8-grayscale.yaml +0 -0
  40. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/coco8-multispectral.yaml +0 -0
  41. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/coco8-pose.yaml +0 -0
  42. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/coco8-seg.yaml +0 -0
  43. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/coco8.yaml +0 -0
  44. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/construction-ppe.yaml +0 -0
  45. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/crack-seg.yaml +0 -0
  46. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/dog-pose.yaml +0 -0
  47. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/dota8-multispectral.yaml +0 -0
  48. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/dota8.yaml +0 -0
  49. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/hand-keypoints.yaml +0 -0
  50. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/medical-pills.yaml +0 -0
  51. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/open-images-v7.yaml +0 -0
  52. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/package-seg.yaml +0 -0
  53. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/signature.yaml +0 -0
  54. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/tiger-pose.yaml +0 -0
  55. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/datasets/xView.yaml +0 -0
  56. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/default.yaml +0 -0
  57. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +0 -0
  58. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/11/yolo11-cls.yaml +0 -0
  59. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/11/yolo11-obb.yaml +0 -0
  60. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/11/yolo11-pose.yaml +0 -0
  61. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/11/yolo11-seg.yaml +0 -0
  62. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/11/yolo11.yaml +0 -0
  63. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/11/yoloe-11-seg.yaml +0 -0
  64. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/11/yoloe-11.yaml +0 -0
  65. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/12/yolo12-cls.yaml +0 -0
  66. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/12/yolo12-obb.yaml +0 -0
  67. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/12/yolo12-pose.yaml +0 -0
  68. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/12/yolo12-seg.yaml +0 -0
  69. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/12/yolo12.yaml +0 -0
  70. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +0 -0
  71. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +0 -0
  72. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +0 -0
  73. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +0 -0
  74. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v10/yolov10b.yaml +0 -0
  75. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v10/yolov10l.yaml +0 -0
  76. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v10/yolov10m.yaml +0 -0
  77. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v10/yolov10n.yaml +0 -0
  78. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v10/yolov10s.yaml +0 -0
  79. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v10/yolov10x.yaml +0 -0
  80. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v3/yolov3-spp.yaml +0 -0
  81. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v3/yolov3-tiny.yaml +0 -0
  82. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v3/yolov3.yaml +0 -0
  83. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v5/yolov5-p6.yaml +0 -0
  84. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v5/yolov5.yaml +0 -0
  85. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v6/yolov6.yaml +0 -0
  86. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v8/yoloe-v8-seg.yaml +0 -0
  87. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v8/yoloe-v8.yaml +0 -0
  88. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +0 -0
  89. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +0 -0
  90. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v8/yolov8-cls.yaml +0 -0
  91. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +0 -0
  92. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +0 -0
  93. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v8/yolov8-ghost.yaml +0 -0
  94. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v8/yolov8-obb.yaml +0 -0
  95. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v8/yolov8-p2.yaml +0 -0
  96. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v8/yolov8-p6.yaml +0 -0
  97. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +0 -0
  98. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v8/yolov8-pose.yaml +0 -0
  99. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +0 -0
  100. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +0 -0
  101. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v8/yolov8-seg.yaml +0 -0
  102. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v8/yolov8-world.yaml +0 -0
  103. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v8/yolov8-worldv2.yaml +0 -0
  104. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v8/yolov8.yaml +0 -0
  105. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v9/yolov9c-seg.yaml +0 -0
  106. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v9/yolov9c.yaml +0 -0
  107. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v9/yolov9e-seg.yaml +0 -0
  108. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v9/yolov9e.yaml +0 -0
  109. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v9/yolov9m.yaml +0 -0
  110. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v9/yolov9s.yaml +0 -0
  111. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/models/v9/yolov9t.yaml +0 -0
  112. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/trackers/botsort.yaml +0 -0
  113. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/cfg/trackers/bytetrack.yaml +0 -0
  114. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/data/__init__.py +0 -0
  115. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/data/annotator.py +0 -0
  116. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/data/augment.py +0 -0
  117. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/data/base.py +0 -0
  118. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/data/build.py +0 -0
  119. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/data/converter.py +0 -0
  120. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/data/dataset.py +0 -0
  121. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/data/loaders.py +0 -0
  122. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/data/scripts/download_weights.sh +0 -0
  123. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/data/scripts/get_coco.sh +0 -0
  124. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/data/scripts/get_coco128.sh +0 -0
  125. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/data/scripts/get_imagenet.sh +0 -0
  126. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/data/split.py +0 -0
  127. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/data/split_dota.py +0 -0
  128. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/data/utils.py +0 -0
  129. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/engine/__init__.py +0 -0
  130. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/engine/exporter.py +0 -0
  131. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/engine/model.py +0 -0
  132. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/engine/predictor.py +0 -0
  133. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/engine/results.py +0 -0
  134. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/engine/tuner.py +0 -0
  135. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/engine/validator.py +0 -0
  136. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/hub/__init__.py +0 -0
  137. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/hub/auth.py +0 -0
  138. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/hub/google/__init__.py +0 -0
  139. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/hub/session.py +0 -0
  140. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/hub/utils.py +0 -0
  141. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/__init__.py +0 -0
  142. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/fastsam/__init__.py +0 -0
  143. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/fastsam/model.py +0 -0
  144. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/fastsam/predict.py +0 -0
  145. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/fastsam/utils.py +0 -0
  146. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/fastsam/val.py +0 -0
  147. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/nas/__init__.py +0 -0
  148. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/nas/model.py +0 -0
  149. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/nas/predict.py +0 -0
  150. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/nas/val.py +0 -0
  151. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/rtdetr/__init__.py +0 -0
  152. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/rtdetr/model.py +0 -0
  153. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/rtdetr/predict.py +0 -0
  154. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/rtdetr/train.py +0 -0
  155. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/rtdetr/val.py +0 -0
  156. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/sam/__init__.py +0 -0
  157. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/sam/amg.py +0 -0
  158. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/sam/build.py +0 -0
  159. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/sam/model.py +0 -0
  160. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/sam/modules/__init__.py +0 -0
  161. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/sam/modules/blocks.py +0 -0
  162. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/sam/modules/decoders.py +0 -0
  163. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/sam/modules/encoders.py +0 -0
  164. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/sam/modules/memory_attention.py +0 -0
  165. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/sam/modules/sam.py +0 -0
  166. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/sam/modules/tiny_encoder.py +0 -0
  167. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/sam/modules/transformer.py +0 -0
  168. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/sam/modules/utils.py +0 -0
  169. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/sam/predict.py +0 -0
  170. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/utils/__init__.py +0 -0
  171. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/utils/loss.py +0 -0
  172. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/utils/ops.py +0 -0
  173. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/__init__.py +0 -0
  174. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/classify/__init__.py +0 -0
  175. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/classify/predict.py +0 -0
  176. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/classify/train.py +0 -0
  177. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/classify/val.py +0 -0
  178. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/detect/__init__.py +0 -0
  179. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/detect/predict.py +0 -0
  180. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/detect/train.py +0 -0
  181. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/detect/val.py +0 -0
  182. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/model.py +0 -0
  183. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/obb/__init__.py +0 -0
  184. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/obb/predict.py +0 -0
  185. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/obb/train.py +0 -0
  186. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/obb/val.py +0 -0
  187. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/pose/__init__.py +0 -0
  188. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/pose/predict.py +0 -0
  189. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/pose/train.py +0 -0
  190. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/pose/val.py +0 -0
  191. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/segment/__init__.py +0 -0
  192. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/segment/predict.py +0 -0
  193. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/segment/train.py +0 -0
  194. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/segment/val.py +0 -0
  195. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/world/__init__.py +0 -0
  196. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/world/train.py +0 -0
  197. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/world/train_world.py +0 -0
  198. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/yoloe/__init__.py +0 -0
  199. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/yoloe/predict.py +0 -0
  200. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/yoloe/train.py +0 -0
  201. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/yoloe/train_seg.py +0 -0
  202. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/models/yolo/yoloe/val.py +0 -0
  203. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/nn/__init__.py +0 -0
  204. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/nn/autobackend.py +0 -0
  205. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/nn/modules/__init__.py +0 -0
  206. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/nn/modules/activation.py +0 -0
  207. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/nn/modules/block.py +0 -0
  208. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/nn/modules/conv.py +0 -0
  209. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/nn/modules/head.py +0 -0
  210. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/nn/modules/transformer.py +0 -0
  211. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/nn/modules/utils.py +0 -0
  212. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/nn/tasks.py +0 -0
  213. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/nn/text_model.py +0 -0
  214. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/py.typed +0 -0
  215. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/solutions/__init__.py +0 -0
  216. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/solutions/ai_gym.py +0 -0
  217. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/solutions/analytics.py +0 -0
  218. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/solutions/config.py +0 -0
  219. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/solutions/distance_calculation.py +0 -0
  220. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/solutions/heatmap.py +0 -0
  221. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/solutions/instance_segmentation.py +0 -0
  222. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/solutions/object_blurrer.py +0 -0
  223. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/solutions/object_counter.py +0 -0
  224. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/solutions/object_cropper.py +0 -0
  225. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/solutions/parking_management.py +0 -0
  226. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/solutions/queue_management.py +0 -0
  227. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/solutions/region_counter.py +0 -0
  228. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/solutions/security_alarm.py +0 -0
  229. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/solutions/similarity_search.py +0 -0
  230. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/solutions/solutions.py +0 -0
  231. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/solutions/speed_estimation.py +0 -0
  232. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/solutions/streamlit_inference.py +0 -0
  233. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/solutions/templates/similarity-search.html +0 -0
  234. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/solutions/trackzone.py +0 -0
  235. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/solutions/vision_eye.py +0 -0
  236. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/trackers/__init__.py +0 -0
  237. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/trackers/basetrack.py +0 -0
  238. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/trackers/bot_sort.py +0 -0
  239. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/trackers/byte_tracker.py +0 -0
  240. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/trackers/track.py +0 -0
  241. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/trackers/utils/__init__.py +0 -0
  242. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/trackers/utils/gmc.py +0 -0
  243. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/trackers/utils/kalman_filter.py +0 -0
  244. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/trackers/utils/matching.py +0 -0
  245. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/__init__.py +0 -0
  246. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/autobatch.py +0 -0
  247. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/autodevice.py +0 -0
  248. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/benchmarks.py +0 -0
  249. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/callbacks/__init__.py +0 -0
  250. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/callbacks/base.py +0 -0
  251. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/callbacks/clearml.py +0 -0
  252. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/callbacks/comet.py +0 -0
  253. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/callbacks/dvc.py +0 -0
  254. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/callbacks/hub.py +0 -0
  255. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/callbacks/mlflow.py +0 -0
  256. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/callbacks/neptune.py +0 -0
  257. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/callbacks/platform.py +0 -0
  258. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/callbacks/raytune.py +0 -0
  259. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/callbacks/tensorboard.py +0 -0
  260. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/callbacks/wb.py +0 -0
  261. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/checks.py +0 -0
  262. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/cpu.py +0 -0
  263. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/dist.py +0 -0
  264. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/downloads.py +0 -0
  265. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/errors.py +0 -0
  266. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/events.py +0 -0
  267. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/export/__init__.py +0 -0
  268. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/export/imx.py +0 -0
  269. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/files.py +0 -0
  270. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/git.py +0 -0
  271. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/instance.py +0 -0
  272. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/logger.py +0 -0
  273. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/loss.py +0 -0
  274. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/metrics.py +0 -0
  275. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/nms.py +0 -0
  276. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/ops.py +0 -0
  277. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/patches.py +0 -0
  278. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/plotting.py +0 -0
  279. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/tal.py +0 -0
  280. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/torch_utils.py +0 -0
  281. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/tqdm.py +0 -0
  282. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/triton.py +0 -0
  283. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics/utils/tuner.py +0 -0
  284. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics.egg-info/SOURCES.txt +0 -0
  285. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics.egg-info/dependency_links.txt +0 -0
  286. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics.egg-info/entry_points.txt +0 -0
  287. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics.egg-info/requires.txt +0 -0
  288. {ultralytics-8.3.212 → ultralytics-8.3.213}/ultralytics.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ultralytics
3
- Version: 8.3.212
3
+ Version: 8.3.213
4
4
  Summary: Ultralytics YOLO 🚀 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
6
6
  Maintainer-email: Ultralytics <hello@ultralytics.com>
@@ -3,6 +3,8 @@
3
3
  import sys
4
4
  from unittest import mock
5
5
 
6
+ import torch
7
+
6
8
  from tests import MODEL
7
9
  from ultralytics import YOLO
8
10
  from ultralytics.cfg import get_cfg
@@ -136,3 +138,20 @@ def test_classify():
136
138
  assert test_func in pred.callbacks["on_predict_start"], "callback test failed"
137
139
  result = pred(source=ASSETS, model=trainer.best)
138
140
  assert len(result), "predictor test failed"
141
+
142
+
143
+ def test_nan_recovery():
144
+ """Test NaN loss detection and recovery during training."""
145
+ nan_injected = [False]
146
+
147
+ def inject_nan(trainer):
148
+ """Inject NaN into loss during batch processing to test recovery mechanism."""
149
+ if trainer.epoch == 1 and trainer.tloss is not None and not nan_injected[0]:
150
+ trainer.tloss *= torch.tensor(float("nan"))
151
+ nan_injected[0] = True
152
+
153
+ overrides = {"data": "coco8.yaml", "model": "yolo11n.yaml", "imgsz": 32, "epochs": 3}
154
+ trainer = detect.DetectionTrainer(overrides=overrides)
155
+ trainer.add_callback("on_train_batch_end", inject_nan)
156
+ trainer.train()
157
+ assert nan_injected[0], "NaN injection failed"
@@ -23,6 +23,8 @@ from ultralytics.utils import (
23
23
  ASSETS_URL,
24
24
  DEFAULT_CFG,
25
25
  DEFAULT_CFG_PATH,
26
+ IS_JETSON,
27
+ IS_RASPBERRYPI,
26
28
  LINUX,
27
29
  LOGGER,
28
30
  ONLINE,
@@ -217,6 +219,7 @@ def test_val(task: str, weight: str, data: str) -> None:
217
219
  metrics.confusion_matrix.to_json()
218
220
 
219
221
 
222
+ @pytest.mark.skipif(IS_JETSON or IS_RASPBERRYPI, reason="Edge devices not intended for training")
220
223
  def test_train_scratch():
221
224
  """Test training the YOLO model from scratch using the provided configuration."""
222
225
  model = YOLO(CFG)
@@ -1,6 +1,6 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
- __version__ = "8.3.212"
3
+ __version__ = "8.3.213"
4
4
 
5
5
  import importlib
6
6
  import os
@@ -384,6 +384,7 @@ names:
384
384
 
385
385
  # Download script/URL (optional) ---------------------------------------------------------------------------------------
386
386
  download: |
387
+ from concurrent.futures import ThreadPoolExecutor
387
388
  from pathlib import Path
388
389
 
389
390
  import numpy as np
@@ -396,31 +397,28 @@ download: |
396
397
  check_requirements("faster-coco-eval")
397
398
  from faster_coco_eval import COCO
398
399
 
399
- # Make Directories
400
- dir = Path(yaml["path"]) # dataset root dir
401
- for p in "images", "labels":
402
- (dir / p).mkdir(parents=True, exist_ok=True)
403
- for q in "train", "val":
404
- (dir / p / q).mkdir(parents=True, exist_ok=True)
405
-
406
400
  # Train, Val Splits
401
+ dir = Path(yaml["path"])
407
402
  for split, patches in [("train", 50 + 1), ("val", 43 + 1)]:
408
403
  print(f"Processing {split} in {patches} patches ...")
409
404
  images, labels = dir / "images" / split, dir / "labels" / split
405
+ images.mkdir(parents=True, exist_ok=True)
406
+ labels.mkdir(parents=True, exist_ok=True)
410
407
 
411
408
  # Download
412
409
  url = f"https://dorc.ks3-cn-beijing.ksyun.com/data-set/2020Objects365%E6%95%B0%E6%8D%AE%E9%9B%86/{split}/"
413
410
  if split == "train":
414
411
  download([f"{url}zhiyuan_objv2_{split}.tar.gz"], dir=dir) # annotations json
415
- download([f"{url}patch{i}.tar.gz" for i in range(patches)], dir=images, curl=True, threads=8)
412
+ download([f"{url}patch{i}.tar.gz" for i in range(patches)], dir=images, threads=17) # 51 patches / 17 threads = 3
416
413
  elif split == "val":
417
414
  download([f"{url}zhiyuan_objv2_{split}.json"], dir=dir) # annotations json
418
- download([f"{url}images/v1/patch{i}.tar.gz" for i in range(15 + 1)], dir=images, curl=True, threads=8)
419
- download([f"{url}images/v2/patch{i}.tar.gz" for i in range(16, patches)], dir=images, curl=True, threads=8)
415
+ download([f"{url}images/v1/patch{i}.tar.gz" for i in range(15 + 1)], dir=images, threads=16)
416
+ download([f"{url}images/v2/patch{i}.tar.gz" for i in range(16, patches)], dir=images, threads=16)
420
417
 
421
418
  # Move
422
- for f in TQDM(images.rglob("*.jpg"), desc=f"Moving {split} images"):
423
- f.rename(images / f.name) # move to /images/{split}
419
+ files = list(images.rglob("*.jpg"))
420
+ with ThreadPoolExecutor(max_workers=16) as executor:
421
+ list(TQDM(executor.map(lambda f: f.rename(images / f.name), files), total=len(files), desc=f"Moving {split} images"))
424
422
 
425
423
  # Labels
426
424
  coco = COCO(dir / f"zhiyuan_objv2_{split}.json")
@@ -428,10 +426,12 @@ download: |
428
426
  for cid, cat in enumerate(names):
429
427
  catIds = coco.getCatIds(catNms=[cat])
430
428
  imgIds = coco.getImgIds(catIds=catIds)
431
- for im in TQDM(coco.loadImgs(imgIds), desc=f"Class {cid + 1}/{len(names)} {cat}"):
432
- width, height = im["width"], im["height"]
433
- path = Path(im["file_name"]) # image filename
429
+
430
+ def process_annotation(im):
431
+ """Process and write annotations for a single image."""
434
432
  try:
433
+ width, height = im["width"], im["height"]
434
+ path = Path(im["file_name"])
435
435
  with open(labels / path.with_suffix(".txt").name, "a", encoding="utf-8") as file:
436
436
  annIds = coco.getAnnIds(imgIds=im["id"], catIds=catIds, iscrowd=None)
437
437
  for a in coco.loadAnns(annIds):
@@ -441,3 +441,7 @@ download: |
441
441
  file.write(f"{cid} {x:.5f} {y:.5f} {w:.5f} {h:.5f}\n")
442
442
  except Exception as e:
443
443
  print(e)
444
+
445
+ images_list = coco.loadImgs(imgIds)
446
+ with ThreadPoolExecutor(max_workers=16) as executor:
447
+ list(TQDM(executor.map(process_annotation, images_list), total=len(images_list), desc=f"Class {cid + 1}/{len(names)} {cat}"))
@@ -49,7 +49,7 @@ download: |
49
49
  from pathlib import Path
50
50
 
51
51
  from ultralytics.utils.downloads import download
52
- from ultralytics.utils import TQDM
52
+ from ultralytics.utils import ASSETS_URL, TQDM
53
53
 
54
54
  def convert_label(path, lb_path, year, image_id):
55
55
  """Converts XML annotations from VOC format to YOLO format by extracting bounding boxes and class IDs."""
@@ -79,11 +79,10 @@ download: |
79
79
 
80
80
  # Download
81
81
  dir = Path(yaml["path"]) # dataset root dir
82
- url = "https://github.com/ultralytics/assets/releases/download/v0.0.0/"
83
82
  urls = [
84
- f"{url}VOCtrainval_06-Nov-2007.zip", # 446MB, 5012 images
85
- f"{url}VOCtest_06-Nov-2007.zip", # 438MB, 4953 images
86
- f"{url}VOCtrainval_11-May-2012.zip", # 1.95GB, 17126 images
83
+ f"{ASSETS_URL}/VOCtrainval_06-Nov-2007.zip", # 446MB, 5012 images
84
+ f"{ASSETS_URL}/VOCtest_06-Nov-2007.zip", # 438MB, 4953 images
85
+ f"{ASSETS_URL}/VOCtrainval_11-May-2012.zip", # 1.95GB, 17126 images
87
86
  ]
88
87
  download(urls, dir=dir / "images", threads=3, exist_ok=True) # download and unzip over existing (required)
89
88
 
@@ -34,7 +34,7 @@ download: |
34
34
  import shutil
35
35
 
36
36
  from ultralytics.utils.downloads import download
37
- from ultralytics.utils import TQDM
37
+ from ultralytics.utils import ASSETS_URL, TQDM
38
38
 
39
39
 
40
40
  def visdrone2yolo(dir, split, source_name=None):
@@ -73,10 +73,10 @@ download: |
73
73
  # Download (ignores test-challenge split)
74
74
  dir = Path(yaml["path"]) # dataset root dir
75
75
  urls = [
76
- "https://github.com/ultralytics/assets/releases/download/v0.0.0/VisDrone2019-DET-train.zip",
77
- "https://github.com/ultralytics/assets/releases/download/v0.0.0/VisDrone2019-DET-val.zip",
78
- "https://github.com/ultralytics/assets/releases/download/v0.0.0/VisDrone2019-DET-test-dev.zip",
79
- # "https://github.com/ultralytics/assets/releases/download/v0.0.0/VisDrone2019-DET-test-challenge.zip",
76
+ f"{ASSETS_URL}/VisDrone2019-DET-train.zip",
77
+ f"{ASSETS_URL}/VisDrone2019-DET-val.zip",
78
+ f"{ASSETS_URL}/VisDrone2019-DET-test-dev.zip",
79
+ # f"{ASSETS_URL}/VisDrone2019-DET-test-challenge.zip",
80
80
  ]
81
81
  download(urls, dir=dir, threads=4)
82
82
 
@@ -26,12 +26,13 @@ names:
26
26
  download: |
27
27
  from pathlib import Path
28
28
 
29
+ from ultralytics.utils import ASSETS_URL
29
30
  from ultralytics.utils.downloads import download
30
31
 
31
32
  # Download labels
32
33
  dir = Path(yaml["path"]) # dataset root dir
33
- url = "https://github.com/ultralytics/assets/releases/download/v0.0.0/"
34
- urls = [f"{url}coco2017labels-pose.zip"]
34
+
35
+ urls = [f"{ASSETS_URL}/coco2017labels-pose.zip"]
35
36
  download(urls, dir=dir.parent)
36
37
  # Download data
37
38
  urls = [
@@ -101,13 +101,13 @@ names:
101
101
  download: |
102
102
  from pathlib import Path
103
103
 
104
+ from ultralytics.utils import ASSETS_URL
104
105
  from ultralytics.utils.downloads import download
105
106
 
106
107
  # Download labels
107
108
  segments = True # segment or box labels
108
109
  dir = Path(yaml["path"]) # dataset root dir
109
- url = "https://github.com/ultralytics/assets/releases/download/v0.0.0/"
110
- urls = [url + ("coco2017labels-segments.zip" if segments else "coco2017labels.zip")] # labels
110
+ urls = [ASSETS_URL + ("/coco2017labels-segments.zip" if segments else "/coco2017labels.zip")] # labels
111
111
  download(urls, dir=dir.parent)
112
112
  # Download data
113
113
  urls = [
@@ -1223,12 +1223,12 @@ names:
1223
1223
  download: |
1224
1224
  from pathlib import Path
1225
1225
 
1226
+ from ultralytics.utils import ASSETS_URL
1226
1227
  from ultralytics.utils.downloads import download
1227
1228
 
1228
1229
  # Download labels
1229
1230
  dir = Path(yaml["path"]) # dataset root dir
1230
- url = "https://github.com/ultralytics/assets/releases/download/v0.0.0/"
1231
- urls = [f"{url}lvis-labels-segments.zip"]
1231
+ urls = [f"{ASSETS_URL}/lvis-labels-segments.zip"]
1232
1232
  download(urls, dir=dir.parent)
1233
1233
 
1234
1234
  # Download data
@@ -171,6 +171,7 @@ class BaseTrainer:
171
171
  self.loss_names = ["Loss"]
172
172
  self.csv = self.save_dir / "results.csv"
173
173
  self.plot_idx = [0, 1, 2]
174
+ self.nan_recovery_attempts = 0
174
175
 
175
176
  # Callbacks
176
177
  self.callbacks = _callbacks or callbacks.get_default_callbacks()
@@ -458,6 +459,7 @@ class BaseTrainer:
458
459
  self.run_callbacks("on_train_batch_end")
459
460
 
460
461
  self.lr = {f"lr/pg{ir}": x["lr"] for ir, x in enumerate(self.optimizer.param_groups)} # for loggers
462
+
461
463
  self.run_callbacks("on_train_epoch_end")
462
464
  if RANK in {-1, 0}:
463
465
  final_epoch = epoch + 1 >= self.epochs
@@ -467,6 +469,13 @@ class BaseTrainer:
467
469
  if self.args.val or final_epoch or self.stopper.possible_stop or self.stop:
468
470
  self._clear_memory(threshold=0.5) # prevent VRAM spike
469
471
  self.metrics, self.fitness = self.validate()
472
+
473
+ # NaN recovery
474
+ if self._handle_nan_recovery(epoch):
475
+ continue
476
+
477
+ self.nan_recovery_attempts = 0
478
+ if RANK in {-1, 0}:
470
479
  self.save_metrics(metrics={**self.label_loss_items(self.tloss), **self.metrics, **self.lr})
471
480
  self.stop |= self.stopper(epoch + 1, self.fitness) or final_epoch
472
481
  if self.args.time:
@@ -804,20 +813,52 @@ class BaseTrainer:
804
813
  ) from e
805
814
  self.resume = resume
806
815
 
807
- def resume_training(self, ckpt):
808
- """Resume YOLO training from given epoch and best fitness."""
809
- if ckpt is None or not self.resume:
810
- return
811
- best_fitness = 0.0
812
- start_epoch = ckpt.get("epoch", -1) + 1
816
+ def _load_checkpoint_state(self, ckpt):
817
+ """Load optimizer, scaler, EMA, and best_fitness from checkpoint."""
813
818
  if ckpt.get("optimizer") is not None:
814
- self.optimizer.load_state_dict(ckpt["optimizer"]) # optimizer
815
- best_fitness = ckpt["best_fitness"]
819
+ self.optimizer.load_state_dict(ckpt["optimizer"])
816
820
  if ckpt.get("scaler") is not None:
817
821
  self.scaler.load_state_dict(ckpt["scaler"])
818
822
  if self.ema and ckpt.get("ema"):
819
- self.ema.ema.load_state_dict(ckpt["ema"].float().state_dict()) # EMA
823
+ self.ema.ema.load_state_dict(ckpt["ema"].float().state_dict())
820
824
  self.ema.updates = ckpt["updates"]
825
+ self.best_fitness = ckpt.get("best_fitness", 0.0)
826
+
827
+ def _handle_nan_recovery(self, epoch):
828
+ """Detect and recover from NaN/Inf loss or fitness collapse by loading last checkpoint."""
829
+ loss_nan = self.tloss is not None and not torch.isfinite(self.tloss).all()
830
+ fitness_nan = self.fitness is not None and not np.isfinite(self.fitness)
831
+ fitness_collapse = self.best_fitness and self.best_fitness > 0 and self.fitness == 0
832
+ corrupted = RANK in {-1, 0} and (loss_nan or fitness_nan or fitness_collapse)
833
+ reason = "Loss NaN/Inf" if loss_nan else "Fitness NaN/Inf" if fitness_nan else "Fitness collapse"
834
+ if RANK != -1: # DDP: broadcast to all ranks
835
+ broadcast_list = [corrupted if RANK == 0 else None]
836
+ dist.broadcast_object_list(broadcast_list, 0)
837
+ corrupted = broadcast_list[0]
838
+ if not corrupted:
839
+ return False
840
+ if epoch == self.start_epoch or not self.last.exists():
841
+ LOGGER.warning(f"{reason} detected but can not recover from last.pt...")
842
+ return False # Cannot recover on first epoch, let training continue
843
+ self.nan_recovery_attempts += 1
844
+ if self.nan_recovery_attempts > 3:
845
+ raise RuntimeError(f"Training failed: NaN persisted for {self.nan_recovery_attempts} epochs")
846
+ LOGGER.warning(f"{reason} detected (attempt {self.nan_recovery_attempts}/3), recovering from last.pt...")
847
+ _, ckpt = load_checkpoint(self.last)
848
+ ema_state = ckpt["ema"].float().state_dict()
849
+ if not all(torch.isfinite(v).all() for v in ema_state.values() if isinstance(v, torch.Tensor)):
850
+ raise RuntimeError(f"Checkpoint {self.last} is corrupted with NaN/Inf weights")
851
+ unwrap_model(self.model).load_state_dict(ema_state) # Load EMA weights into model
852
+ self._load_checkpoint_state(ckpt) # Load optimizer/scaler/EMA/best_fitness
853
+ del ckpt, ema_state
854
+ self.scheduler.last_epoch = epoch - 1
855
+ return True
856
+
857
+ def resume_training(self, ckpt):
858
+ """Resume YOLO training from given epoch and best fitness."""
859
+ if ckpt is None or not self.resume:
860
+ return
861
+ start_epoch = ckpt.get("epoch", -1) + 1
821
862
  assert start_epoch > 0, (
822
863
  f"{self.args.model} training to {self.epochs} epochs is finished, nothing to resume.\n"
823
864
  f"Start a new training without resuming, i.e. 'yolo train model={self.args.model}'"
@@ -828,7 +869,7 @@ class BaseTrainer:
828
869
  f"{self.model} has been trained for {ckpt['epoch']} epochs. Fine-tuning for {self.epochs} more epochs."
829
870
  )
830
871
  self.epochs += ckpt["epoch"] # finetune additional epochs
831
- self.best_fitness = best_fitness
872
+ self._load_checkpoint_state(ckpt)
832
873
  self.start_epoch = start_epoch
833
874
  if start_epoch > (self.epochs - self.args.close_mosaic):
834
875
  self._close_dataloader_mosaic()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ultralytics
3
- Version: 8.3.212
3
+ Version: 8.3.213
4
4
  Summary: Ultralytics YOLO 🚀 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
6
6
  Maintainer-email: Ultralytics <hello@ultralytics.com>
File without changes
File without changes
File without changes