ultralytics 8.0.64__tar.gz → 8.0.66__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 (129) hide show
  1. {ultralytics-8.0.64/ultralytics.egg-info → ultralytics-8.0.66}/PKG-INFO +27 -2
  2. {ultralytics-8.0.64 → ultralytics-8.0.66}/README.md +26 -1
  3. {ultralytics-8.0.64 → ultralytics-8.0.66}/README.zh-CN.md +22 -0
  4. {ultralytics-8.0.64 → ultralytics-8.0.66}/tests/test_cli.py +16 -0
  5. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/__init__.py +1 -1
  6. ultralytics-8.0.66/ultralytics/datasets/coco-pose.yaml +38 -0
  7. ultralytics-8.0.66/ultralytics/datasets/coco8-pose.yaml +25 -0
  8. ultralytics-8.0.66/ultralytics/models/v8/yolov8-pose-p6.yaml +57 -0
  9. ultralytics-8.0.66/ultralytics/models/v8/yolov8-pose.yaml +47 -0
  10. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/nn/autobackend.py +7 -2
  11. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/nn/modules.py +33 -2
  12. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/nn/tasks.py +24 -7
  13. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/tracker/track.py +2 -3
  14. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/cfg/__init__.py +4 -4
  15. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/cfg/default.yaml +2 -0
  16. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/data/augment.py +24 -19
  17. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/data/build.py +4 -4
  18. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/data/dataset.py +9 -3
  19. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/data/utils.py +110 -34
  20. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/engine/exporter.py +9 -7
  21. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/engine/model.py +5 -4
  22. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/engine/predictor.py +1 -0
  23. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/engine/results.py +70 -56
  24. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/utils/benchmarks.py +4 -2
  25. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/utils/downloads.py +3 -3
  26. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/utils/instance.py +1 -1
  27. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/utils/loss.py +14 -0
  28. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/utils/metrics.py +111 -13
  29. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/utils/ops.py +30 -50
  30. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/utils/plotting.py +79 -4
  31. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/utils/torch_utils.py +11 -9
  32. ultralytics-8.0.66/ultralytics/yolo/v8/__init__.py +5 -0
  33. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/v8/detect/train.py +1 -1
  34. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/v8/detect/val.py +2 -2
  35. ultralytics-8.0.66/ultralytics/yolo/v8/pose/__init__.py +7 -0
  36. ultralytics-8.0.66/ultralytics/yolo/v8/pose/predict.py +103 -0
  37. ultralytics-8.0.66/ultralytics/yolo/v8/pose/train.py +170 -0
  38. ultralytics-8.0.66/ultralytics/yolo/v8/pose/val.py +213 -0
  39. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/v8/segment/val.py +3 -4
  40. {ultralytics-8.0.64 → ultralytics-8.0.66/ultralytics.egg-info}/PKG-INFO +27 -2
  41. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics.egg-info/SOURCES.txt +8 -0
  42. ultralytics-8.0.64/ultralytics/yolo/v8/__init__.py +0 -5
  43. {ultralytics-8.0.64 → ultralytics-8.0.66}/CONTRIBUTING.md +0 -0
  44. {ultralytics-8.0.64 → ultralytics-8.0.66}/LICENSE +0 -0
  45. {ultralytics-8.0.64 → ultralytics-8.0.66}/MANIFEST.in +0 -0
  46. {ultralytics-8.0.64 → ultralytics-8.0.66}/requirements.txt +0 -0
  47. {ultralytics-8.0.64 → ultralytics-8.0.66}/setup.cfg +0 -0
  48. {ultralytics-8.0.64 → ultralytics-8.0.66}/setup.py +0 -0
  49. {ultralytics-8.0.64 → ultralytics-8.0.66}/tests/test_engine.py +0 -0
  50. {ultralytics-8.0.64 → ultralytics-8.0.66}/tests/test_python.py +0 -0
  51. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/assets/bus.jpg +0 -0
  52. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/assets/zidane.jpg +0 -0
  53. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/datasets/Argoverse.yaml +0 -0
  54. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/datasets/GlobalWheat2020.yaml +0 -0
  55. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/datasets/ImageNet.yaml +0 -0
  56. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/datasets/Objects365.yaml +0 -0
  57. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/datasets/SKU-110K.yaml +0 -0
  58. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/datasets/VOC.yaml +0 -0
  59. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/datasets/VisDrone.yaml +0 -0
  60. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/datasets/coco.yaml +0 -0
  61. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/datasets/coco128-seg.yaml +0 -0
  62. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/datasets/coco128.yaml +0 -0
  63. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/datasets/coco8-seg.yaml +0 -0
  64. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/datasets/coco8.yaml +0 -0
  65. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/datasets/xView.yaml +0 -0
  66. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/hub/__init__.py +0 -0
  67. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/hub/auth.py +0 -0
  68. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/hub/session.py +0 -0
  69. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/hub/utils.py +0 -0
  70. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/models/v3/yolov3-spp.yaml +0 -0
  71. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/models/v3/yolov3-tiny.yaml +0 -0
  72. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/models/v3/yolov3.yaml +0 -0
  73. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/models/v5/yolov5-p6.yaml +0 -0
  74. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/models/v5/yolov5.yaml +0 -0
  75. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/models/v8/yolov8-cls.yaml +0 -0
  76. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/models/v8/yolov8-p2.yaml +0 -0
  77. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/models/v8/yolov8-p6.yaml +0 -0
  78. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/models/v8/yolov8-seg.yaml +0 -0
  79. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/models/v8/yolov8.yaml +0 -0
  80. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/nn/__init__.py +0 -0
  81. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/nn/autoshape.py +0 -0
  82. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/tracker/__init__.py +0 -0
  83. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/tracker/cfg/botsort.yaml +0 -0
  84. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/tracker/cfg/bytetrack.yaml +0 -0
  85. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/tracker/trackers/__init__.py +0 -0
  86. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/tracker/trackers/basetrack.py +0 -0
  87. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/tracker/trackers/bot_sort.py +0 -0
  88. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/tracker/trackers/byte_tracker.py +0 -0
  89. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/tracker/utils/__init__.py +0 -0
  90. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/tracker/utils/gmc.py +0 -0
  91. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/tracker/utils/kalman_filter.py +0 -0
  92. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/tracker/utils/matching.py +0 -0
  93. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/__init__.py +0 -0
  94. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/data/__init__.py +0 -0
  95. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/data/base.py +0 -0
  96. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/data/dataloaders/__init__.py +0 -0
  97. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/data/dataloaders/stream_loaders.py +0 -0
  98. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/data/dataloaders/v5augmentations.py +0 -0
  99. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/data/dataloaders/v5loader.py +0 -0
  100. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/data/dataset_wrappers.py +0 -0
  101. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/engine/__init__.py +0 -0
  102. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/engine/trainer.py +0 -0
  103. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/engine/validator.py +0 -0
  104. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/utils/__init__.py +0 -0
  105. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/utils/autobatch.py +0 -0
  106. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/utils/callbacks/__init__.py +0 -0
  107. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/utils/callbacks/base.py +0 -0
  108. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/utils/callbacks/clearml.py +0 -0
  109. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/utils/callbacks/comet.py +0 -0
  110. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/utils/callbacks/hub.py +0 -0
  111. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/utils/callbacks/mlflow.py +0 -0
  112. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/utils/callbacks/tensorboard.py +0 -0
  113. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/utils/checks.py +0 -0
  114. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/utils/dist.py +0 -0
  115. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/utils/files.py +0 -0
  116. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/utils/tal.py +0 -0
  117. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/v8/classify/__init__.py +0 -0
  118. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/v8/classify/predict.py +0 -0
  119. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/v8/classify/train.py +0 -0
  120. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/v8/classify/val.py +0 -0
  121. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/v8/detect/__init__.py +0 -0
  122. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/v8/detect/predict.py +0 -0
  123. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/v8/segment/__init__.py +0 -0
  124. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/v8/segment/predict.py +0 -0
  125. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics/yolo/v8/segment/train.py +0 -0
  126. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics.egg-info/dependency_links.txt +0 -0
  127. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics.egg-info/entry_points.txt +0 -0
  128. {ultralytics-8.0.64 → ultralytics-8.0.66}/ultralytics.egg-info/requires.txt +0 -0
  129. {ultralytics-8.0.64 → ultralytics-8.0.66}/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.64
3
+ Version: 8.0.66
4
4
  Summary: Ultralytics YOLOv8
5
5
  Home-page: https://github.com/ultralytics/ultralytics
6
6
  Author: Ultralytics
@@ -146,7 +146,10 @@ YOLOv8 [Python Docs](https://docs.ultralytics.com/usage/python) for more example
146
146
 
147
147
  ## <div align="center">Models</div>
148
148
 
149
- All YOLOv8 pretrained models are available here. Detect, Segment and Pose models are pretrained on the [COCO](https://github.com/ultralytics/ultralytics/blob/main/ultralytics/datasets/coco.yaml) dataset, while Classify models are pretrained on the [ImageNet](https://github.com/ultralytics/ultralytics/blob/main/ultralytics/datasets/ImageNet.yaml) dataset.
149
+ All YOLOv8 pretrained models are available here. Detect, Segment and Pose models are pretrained on
150
+ the [COCO](https://github.com/ultralytics/ultralytics/blob/main/ultralytics/datasets/coco.yaml) dataset, while Classify
151
+ models are pretrained on
152
+ the [ImageNet](https://github.com/ultralytics/ultralytics/blob/main/ultralytics/datasets/ImageNet.yaml) dataset.
150
153
 
151
154
  [Models](https://github.com/ultralytics/ultralytics/tree/main/ultralytics/models) download automatically from the latest
152
155
  Ultralytics [release](https://github.com/ultralytics/assets/releases) on first use.
@@ -211,6 +214,28 @@ See [Classification Docs](https://docs.ultralytics.com/tasks/classify/) for usag
211
214
 
212
215
  </details>
213
216
 
217
+ <details><summary>Pose</summary>
218
+
219
+ See [Pose Docs](https://docs.ultralytics.com/tasks/) for usage examples with these models.
220
+
221
+ | Model | size<br><sup>(pixels) | mAP<sup>box<br>50-95 | mAP<sup>pose<br>50-95 | Speed<br><sup>CPU ONNX<br>(ms) | Speed<br><sup>A100 TensorRT<br>(ms) | params<br><sup>(M) | FLOPs<br><sup>(B) |
222
+ | ---------------------------------------------------------------------------------------------------- | --------------------- | -------------------- | --------------------- | ------------------------------ | ----------------------------------- | ------------------ | ----------------- |
223
+ | [YOLOv8n-pose](https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8n-pose.pt) | 640 | - | 49.7 | - | - | 3.3 | 9.2 |
224
+ | [YOLOv8s-pose](https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8s-pose.pt) | 640 | - | 59.2 | - | - | 11.6 | 30.2 |
225
+ | [YOLOv8m-pose](https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8m-pose.pt) | 640 | - | 63.6 | - | - | 26.4 | 81.0 |
226
+ | [YOLOv8l-pose](https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8l-pose.pt) | 640 | - | 67.0 | - | - | 44.4 | 168.6 |
227
+ | [YOLOv8x-pose](https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8x-pose.pt) | 640 | - | 68.9 | - | - | 69.4 | 263.2 |
228
+ | [YOLOv8x-pose-p6](https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8x-pose-p6.pt) | 1280 | - | 71.5 | - | - | 99.1 | 1066.4 |
229
+
230
+ - **mAP<sup>val</sup>** values are for single-model single-scale on [COCO Keypoints val2017](http://cocodataset.org)
231
+ dataset.
232
+ <br>Reproduce by `yolo val pose data=coco-pose.yaml device=0`
233
+ - **Speed** averaged over COCO val images using an [Amazon EC2 P4d](https://aws.amazon.com/ec2/instance-types/p4/)
234
+ instance.
235
+ <br>Reproduce by `yolo val pose data=coco8-pose.yaml batch=1 device=0|cpu`
236
+
237
+ </details>
238
+
214
239
  ## <div align="center">Integrations</div>
215
240
 
216
241
  <br>
@@ -109,7 +109,10 @@ YOLOv8 [Python Docs](https://docs.ultralytics.com/usage/python) for more example
109
109
 
110
110
  ## <div align="center">Models</div>
111
111
 
112
- All YOLOv8 pretrained models are available here. Detect, Segment and Pose models are pretrained on the [COCO](https://github.com/ultralytics/ultralytics/blob/main/ultralytics/datasets/coco.yaml) dataset, while Classify models are pretrained on the [ImageNet](https://github.com/ultralytics/ultralytics/blob/main/ultralytics/datasets/ImageNet.yaml) dataset.
112
+ All YOLOv8 pretrained models are available here. Detect, Segment and Pose models are pretrained on
113
+ the [COCO](https://github.com/ultralytics/ultralytics/blob/main/ultralytics/datasets/coco.yaml) dataset, while Classify
114
+ models are pretrained on
115
+ the [ImageNet](https://github.com/ultralytics/ultralytics/blob/main/ultralytics/datasets/ImageNet.yaml) dataset.
113
116
 
114
117
  [Models](https://github.com/ultralytics/ultralytics/tree/main/ultralytics/models) download automatically from the latest
115
118
  Ultralytics [release](https://github.com/ultralytics/assets/releases) on first use.
@@ -174,6 +177,28 @@ See [Classification Docs](https://docs.ultralytics.com/tasks/classify/) for usag
174
177
 
175
178
  </details>
176
179
 
180
+ <details><summary>Pose</summary>
181
+
182
+ See [Pose Docs](https://docs.ultralytics.com/tasks/) for usage examples with these models.
183
+
184
+ | Model | size<br><sup>(pixels) | mAP<sup>box<br>50-95 | mAP<sup>pose<br>50-95 | Speed<br><sup>CPU ONNX<br>(ms) | Speed<br><sup>A100 TensorRT<br>(ms) | params<br><sup>(M) | FLOPs<br><sup>(B) |
185
+ | ---------------------------------------------------------------------------------------------------- | --------------------- | -------------------- | --------------------- | ------------------------------ | ----------------------------------- | ------------------ | ----------------- |
186
+ | [YOLOv8n-pose](https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8n-pose.pt) | 640 | - | 49.7 | - | - | 3.3 | 9.2 |
187
+ | [YOLOv8s-pose](https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8s-pose.pt) | 640 | - | 59.2 | - | - | 11.6 | 30.2 |
188
+ | [YOLOv8m-pose](https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8m-pose.pt) | 640 | - | 63.6 | - | - | 26.4 | 81.0 |
189
+ | [YOLOv8l-pose](https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8l-pose.pt) | 640 | - | 67.0 | - | - | 44.4 | 168.6 |
190
+ | [YOLOv8x-pose](https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8x-pose.pt) | 640 | - | 68.9 | - | - | 69.4 | 263.2 |
191
+ | [YOLOv8x-pose-p6](https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8x-pose-p6.pt) | 1280 | - | 71.5 | - | - | 99.1 | 1066.4 |
192
+
193
+ - **mAP<sup>val</sup>** values are for single-model single-scale on [COCO Keypoints val2017](http://cocodataset.org)
194
+ dataset.
195
+ <br>Reproduce by `yolo val pose data=coco-pose.yaml device=0`
196
+ - **Speed** averaged over COCO val images using an [Amazon EC2 P4d](https://aws.amazon.com/ec2/instance-types/p4/)
197
+ instance.
198
+ <br>Reproduce by `yolo val pose data=coco8-pose.yaml batch=1 device=0|cpu`
199
+
200
+ </details>
201
+
177
202
  ## <div align="center">Integrations</div>
178
203
 
179
204
  <br>
@@ -163,6 +163,28 @@ Ultralytics [发布页](https://github.com/ultralytics/ultralytics/releases) 自
163
163
 
164
164
  </details>
165
165
 
166
+ <details><summary>Pose</summary>
167
+
168
+ See [Pose Docs](https://docs.ultralytics.com/tasks/) for usage examples with these models.
169
+
170
+ | Model | size<br><sup>(pixels) | mAP<sup>box<br>50-95 | mAP<sup>pose<br>50-95 | Speed<br><sup>CPU ONNX<br>(ms) | Speed<br><sup>A100 TensorRT<br>(ms) | params<br><sup>(M) | FLOPs<br><sup>(B) |
171
+ | ---------------------------------------------------------------------------------------------------- | --------------------- | -------------------- | --------------------- | ------------------------------ | ----------------------------------- | ------------------ | ----------------- |
172
+ | [YOLOv8n-pose](https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8n-pose.pt) | 640 | - | 49.7 | - | - | 3.3 | 9.2 |
173
+ | [YOLOv8s-pose](https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8s-pose.pt) | 640 | - | 59.2 | - | - | 11.6 | 30.2 |
174
+ | [YOLOv8m-pose](https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8m-pose.pt) | 640 | - | 63.6 | - | - | 26.4 | 81.0 |
175
+ | [YOLOv8l-pose](https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8l-pose.pt) | 640 | - | 67.0 | - | - | 44.4 | 168.6 |
176
+ | [YOLOv8x-pose](https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8x-pose.pt) | 640 | - | 68.9 | - | - | 69.4 | 263.2 |
177
+ | [YOLOv8x-pose-p6](https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8x-pose-p6.pt) | 1280 | - | 71.5 | - | - | 99.1 | 1066.4 |
178
+
179
+ - **mAP<sup>val</sup>** values are for single-model single-scale on [COCO Keypoints val2017](http://cocodataset.org)
180
+ dataset.
181
+ <br>Reproduce by `yolo val pose data=coco-pose.yaml device=0`
182
+ - **Speed** averaged over COCO val images using an [Amazon EC2 P4d](https://aws.amazon.com/ec2/instance-types/p4/)
183
+ instance.
184
+ <br>Reproduce by `yolo val pose data=coco8-pose.yaml batch=1 device=0|cpu`
185
+
186
+ </details>
187
+
166
188
  ## <div align="center">模块集成</div>
167
189
 
168
190
  <br>
@@ -33,6 +33,10 @@ def test_train_cls():
33
33
  run(f'yolo train classify model={CFG}-cls.yaml data=imagenet10 imgsz=32 epochs=1')
34
34
 
35
35
 
36
+ def test_train_pose():
37
+ run(f'yolo train pose model={CFG}-pose.yaml data=coco8-pose.yaml imgsz=32 epochs=1')
38
+
39
+
36
40
  # Val checks -----------------------------------------------------------------------------------------------------------
37
41
  def test_val_detect():
38
42
  run(f'yolo val detect model={MODEL}.pt data=coco8.yaml imgsz=32')
@@ -46,6 +50,10 @@ def test_val_classify():
46
50
  run(f'yolo val classify model={MODEL}-cls.pt data=imagenet10 imgsz=32')
47
51
 
48
52
 
53
+ def test_val_pose():
54
+ run(f'yolo val pose model={MODEL}-pose.pt data=coco8-pose.yaml imgsz=32')
55
+
56
+
49
57
  # Predict checks -------------------------------------------------------------------------------------------------------
50
58
  def test_predict_detect():
51
59
  run(f"yolo predict model={MODEL}.pt source={ROOT / 'assets'} imgsz=32 save save_crop save_txt")
@@ -63,6 +71,10 @@ def test_predict_classify():
63
71
  run(f"yolo predict model={MODEL}-cls.pt source={ROOT / 'assets'} imgsz=32 save save_txt")
64
72
 
65
73
 
74
+ def test_predict_pose():
75
+ run(f"yolo predict model={MODEL}-pose.pt source={ROOT / 'assets'} imgsz=32 save save_txt")
76
+
77
+
66
78
  # Export checks --------------------------------------------------------------------------------------------------------
67
79
  def test_export_detect_torchscript():
68
80
  run(f'yolo export model={MODEL}.pt format=torchscript')
@@ -76,6 +88,10 @@ def test_export_classify_torchscript():
76
88
  run(f'yolo export model={MODEL}-cls.pt format=torchscript')
77
89
 
78
90
 
91
+ def test_export_classify_pose():
92
+ run(f'yolo export model={MODEL}-pose.pt format=torchscript')
93
+
94
+
79
95
  def test_export_detect_edgetpu(enabled=False):
80
96
  if enabled and LINUX:
81
97
  run(f'yolo export model={MODEL}.pt format=edgetpu')
@@ -1,6 +1,6 @@
1
1
  # Ultralytics YOLO 🚀, GPL-3.0 license
2
2
 
3
- __version__ = '8.0.64'
3
+ __version__ = '8.0.66'
4
4
 
5
5
  from ultralytics.hub import start
6
6
  from ultralytics.yolo.engine.model import YOLO
@@ -0,0 +1,38 @@
1
+ # Ultralytics YOLO 🚀, GPL-3.0 license
2
+ # COCO 2017 dataset http://cocodataset.org by Microsoft
3
+ # Example usage: yolo train data=coco-pose.yaml
4
+ # parent
5
+ # ├── ultralytics
6
+ # └── datasets
7
+ # └── coco-pose ← downloads here (20.1 GB)
8
+
9
+
10
+ # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
11
+ path: ../datasets/coco-pose # dataset root dir
12
+ train: train2017.txt # train images (relative to 'path') 118287 images
13
+ val: val2017.txt # val images (relative to 'path') 5000 images
14
+ test: test-dev2017.txt # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794
15
+
16
+ # Keypoints
17
+ kpt_shape: [17, 3] # number of keypoints, number of dims (2 for x,y or 3 for x,y,visible)
18
+ flip_idx: [0, 2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, 16, 15]
19
+
20
+ # Classes
21
+ names:
22
+ 0: person
23
+
24
+ # Download script/URL (optional)
25
+ download: |
26
+ from ultralytics.yolo.utils.downloads import download
27
+ from pathlib import Path
28
+
29
+ # Download labels
30
+ dir = Path(yaml['path']) # dataset root dir
31
+ url = 'https://github.com/ultralytics/yolov5/releases/download/v1.0/'
32
+ urls = [url + 'coco2017labels-pose.zip'] # labels
33
+ download(urls, dir=dir.parent)
34
+ # Download data
35
+ urls = ['http://images.cocodataset.org/zips/train2017.zip', # 19G, 118k images
36
+ 'http://images.cocodataset.org/zips/val2017.zip', # 1G, 5k images
37
+ 'http://images.cocodataset.org/zips/test2017.zip'] # 7G, 41k images (optional)
38
+ download(urls, dir=dir / 'images', threads=3)
@@ -0,0 +1,25 @@
1
+ # Ultralytics YOLO 🚀, GPL-3.0 license
2
+ # COCO8-pose dataset (first 8 images from COCO train2017) by Ultralytics
3
+ # Example usage: yolo train data=coco8-pose.yaml
4
+ # parent
5
+ # ├── ultralytics
6
+ # └── datasets
7
+ # └── coco8-pose ← downloads here (1 MB)
8
+
9
+
10
+ # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
11
+ path: ../datasets/coco8-pose # dataset root dir
12
+ train: images/train # train images (relative to 'path') 4 images
13
+ val: images/val # val images (relative to 'path') 4 images
14
+ test: # test images (optional)
15
+
16
+ # Keypoints
17
+ kpt_shape: [17, 3] # number of keypoints, number of dims (2 for x,y or 3 for x,y,visible)
18
+ flip_idx: [0, 2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, 16, 15]
19
+
20
+ # Classes
21
+ names:
22
+ 0: person
23
+
24
+ # Download script/URL (optional)
25
+ download: https://ultralytics.com/assets/coco8-pose.zip
@@ -0,0 +1,57 @@
1
+ # Ultralytics YOLO 🚀, GPL-3.0 license
2
+ # YOLOv8 object detection model with P3-P6 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect
3
+
4
+ # Parameters
5
+ nc: 1 # number of classes
6
+ kpt_shape: [17, 3] # number of keypoints, number of dims (2 for x,y or 3 for x,y,visible)
7
+ scales: # model compound scaling constants, i.e. 'model=yolov8n-p6.yaml' will call yolov8-p6.yaml with scale 'n'
8
+ # [depth, width, max_channels]
9
+ n: [0.33, 0.25, 1024]
10
+ s: [0.33, 0.50, 1024]
11
+ m: [0.67, 0.75, 768]
12
+ l: [1.00, 1.00, 512]
13
+ x: [1.00, 1.25, 512]
14
+
15
+ # YOLOv8.0x6 backbone
16
+ backbone:
17
+ # [from, repeats, module, args]
18
+ - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
19
+ - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
20
+ - [-1, 3, C2f, [128, True]]
21
+ - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
22
+ - [-1, 6, C2f, [256, True]]
23
+ - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
24
+ - [-1, 6, C2f, [512, True]]
25
+ - [-1, 1, Conv, [768, 3, 2]] # 7-P5/32
26
+ - [-1, 3, C2f, [768, True]]
27
+ - [-1, 1, Conv, [1024, 3, 2]] # 9-P6/64
28
+ - [-1, 3, C2f, [1024, True]]
29
+ - [-1, 1, SPPF, [1024, 5]] # 11
30
+
31
+ # YOLOv8.0x6 head
32
+ head:
33
+ - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
34
+ - [[-1, 8], 1, Concat, [1]] # cat backbone P5
35
+ - [-1, 3, C2, [768, False]] # 14
36
+
37
+ - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
38
+ - [[-1, 6], 1, Concat, [1]] # cat backbone P4
39
+ - [-1, 3, C2, [512, False]] # 17
40
+
41
+ - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
42
+ - [[-1, 4], 1, Concat, [1]] # cat backbone P3
43
+ - [-1, 3, C2, [256, False]] # 20 (P3/8-small)
44
+
45
+ - [-1, 1, Conv, [256, 3, 2]]
46
+ - [[-1, 17], 1, Concat, [1]] # cat head P4
47
+ - [-1, 3, C2, [512, False]] # 23 (P4/16-medium)
48
+
49
+ - [-1, 1, Conv, [512, 3, 2]]
50
+ - [[-1, 14], 1, Concat, [1]] # cat head P5
51
+ - [-1, 3, C2, [768, False]] # 26 (P5/32-large)
52
+
53
+ - [-1, 1, Conv, [768, 3, 2]]
54
+ - [[-1, 11], 1, Concat, [1]] # cat head P6
55
+ - [-1, 3, C2, [1024, False]] # 29 (P6/64-xlarge)
56
+
57
+ - [[20, 23, 26, 29], 1, Pose, [nc, kpt_shape]] # Pose(P3, P4, P5, P6)
@@ -0,0 +1,47 @@
1
+ # Ultralytics YOLO 🚀, GPL-3.0 license
2
+ # YOLOv8-pose keypoints/pose estimation model. For Usage examples see https://docs.ultralytics.com/tasks/pose
3
+
4
+ # Parameters
5
+ nc: 1 # number of classes
6
+ kpt_shape: [17, 3] # number of keypoints, number of dims (2 for x,y or 3 for x,y,visible)
7
+ scales: # model compound scaling constants, i.e. 'model=yolov8n-pose.yaml' will call yolov8-pose.yaml with scale 'n'
8
+ # [depth, width, max_channels]
9
+ n: [0.33, 0.25, 1024]
10
+ s: [0.33, 0.50, 1024]
11
+ m: [0.67, 0.75, 768]
12
+ l: [1.00, 1.00, 512]
13
+ x: [1.00, 1.25, 512]
14
+
15
+ # YOLOv8.0n backbone
16
+ backbone:
17
+ # [from, repeats, module, args]
18
+ - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
19
+ - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
20
+ - [-1, 3, C2f, [128, True]]
21
+ - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
22
+ - [-1, 6, C2f, [256, True]]
23
+ - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
24
+ - [-1, 6, C2f, [512, True]]
25
+ - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
26
+ - [-1, 3, C2f, [1024, True]]
27
+ - [-1, 1, SPPF, [1024, 5]] # 9
28
+
29
+ # YOLOv8.0n head
30
+ head:
31
+ - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
32
+ - [[-1, 6], 1, Concat, [1]] # cat backbone P4
33
+ - [-1, 3, C2f, [512]] # 12
34
+
35
+ - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
36
+ - [[-1, 4], 1, Concat, [1]] # cat backbone P3
37
+ - [-1, 3, C2f, [256]] # 15 (P3/8-small)
38
+
39
+ - [-1, 1, Conv, [256, 3, 2]]
40
+ - [[-1, 12], 1, Concat, [1]] # cat head P4
41
+ - [-1, 3, C2f, [512]] # 18 (P4/16-medium)
42
+
43
+ - [-1, 1, Conv, [512, 3, 2]]
44
+ - [[-1, 9], 1, Concat, [1]] # cat head P5
45
+ - [-1, 3, C2f, [1024]] # 21 (P5/32-large)
46
+
47
+ - [[15, 18, 21], 1, Pose, [nc, kpt_shape]] # Pose(P3, P4, P5)
@@ -91,8 +91,10 @@ class AutoBackend(nn.Module):
91
91
  if nn_module:
92
92
  model = weights.to(device)
93
93
  model = model.fuse(verbose=verbose) if fuse else model
94
- names = model.module.names if hasattr(model, 'module') else model.names # get class names
94
+ if hasattr(model, 'kpt_shape'):
95
+ kpt_shape = model.kpt_shape # pose-only
95
96
  stride = max(int(model.stride.max()), 32) # model stride
97
+ names = model.module.names if hasattr(model, 'module') else model.names # get class names
96
98
  model.half() if fp16 else model.float()
97
99
  self.model = model # explicitly assign for to(), cpu(), cuda(), half()
98
100
  pt = True
@@ -102,6 +104,8 @@ class AutoBackend(nn.Module):
102
104
  device=device,
103
105
  inplace=True,
104
106
  fuse=fuse)
107
+ if hasattr(model, 'kpt_shape'):
108
+ kpt_shape = model.kpt_shape # pose-only
105
109
  stride = max(int(model.stride.max()), 32) # model stride
106
110
  names = model.module.names if hasattr(model, 'module') else model.names # get class names
107
111
  model.half() if fp16 else model.float()
@@ -268,13 +272,14 @@ class AutoBackend(nn.Module):
268
272
  for k, v in metadata.items():
269
273
  if k in ('stride', 'batch'):
270
274
  metadata[k] = int(v)
271
- elif k in ('imgsz', 'names') and isinstance(v, str):
275
+ elif k in ('imgsz', 'names', 'kpt_shape') and isinstance(v, str):
272
276
  metadata[k] = eval(v)
273
277
  stride = metadata['stride']
274
278
  task = metadata['task']
275
279
  batch = metadata['batch']
276
280
  imgsz = metadata['imgsz']
277
281
  names = metadata['names']
282
+ kpt_shape = metadata.get('kpt_shape')
278
283
  elif not (pt or triton or nn_module):
279
284
  LOGGER.warning(f"WARNING ⚠️ Metadata not found for 'model={weights}'")
280
285
 
@@ -378,7 +378,9 @@ class Ensemble(nn.ModuleList):
378
378
  return y, None # inference, train output
379
379
 
380
380
 
381
- # heads
381
+ # Model heads below ----------------------------------------------------------------------------------------------------
382
+
383
+
382
384
  class Detect(nn.Module):
383
385
  # YOLOv8 Detect head for detection models
384
386
  dynamic = False # force grid reconstruction
@@ -394,7 +396,6 @@ class Detect(nn.Module):
394
396
  self.reg_max = 16 # DFL channels (ch[0] // 16 to scale 4/8/12/16/20 for n/s/m/l/x)
395
397
  self.no = nc + self.reg_max * 4 # number of outputs per anchor
396
398
  self.stride = torch.zeros(self.nl) # strides computed during build
397
-
398
399
  c2, c3 = max((16, ch[0] // 4, self.reg_max * 4)), max(ch[0], self.nc) # channels
399
400
  self.cv2 = nn.ModuleList(
400
401
  nn.Sequential(Conv(x, c2, 3), Conv(c2, c2, 3), nn.Conv2d(c2, 4 * self.reg_max, 1)) for x in ch)
@@ -454,6 +455,36 @@ class Segment(Detect):
454
455
  return (torch.cat([x, mc], 1), p) if self.export else (torch.cat([x[0], mc], 1), (x[1], mc, p))
455
456
 
456
457
 
458
+ class Pose(Detect):
459
+ # YOLOv8 Pose head for keypoints models
460
+ def __init__(self, nc=80, kpt_shape=(17, 3), ch=()):
461
+ super().__init__(nc, ch)
462
+ self.kpt_shape = kpt_shape # number of keypoints, number of dims (2 for x,y or 3 for x,y,visible)
463
+ self.nk = kpt_shape[0] * kpt_shape[1] # number of keypoints total
464
+ self.detect = Detect.forward
465
+
466
+ c4 = max(ch[0] // 4, self.nk)
467
+ self.cv4 = nn.ModuleList(nn.Sequential(Conv(x, c4, 3), Conv(c4, c4, 3), nn.Conv2d(c4, self.nk, 1)) for x in ch)
468
+
469
+ def forward(self, x):
470
+ bs = x[0].shape[0] # batch size
471
+ kpt = torch.cat([self.cv4[i](x[i]).view(bs, self.nk, -1) for i in range(self.nl)], -1) # (bs, 17*3, h*w)
472
+ x = self.detect(self, x)
473
+ if self.training:
474
+ return x, kpt
475
+ pred_kpt = self.kpts_decode(kpt)
476
+ return torch.cat([x, pred_kpt], 1) if self.export else (torch.cat([x[0], pred_kpt], 1), (x[1], kpt))
477
+
478
+ def kpts_decode(self, kpts):
479
+ ndim = self.kpt_shape[1]
480
+ y = kpts.clone()
481
+ if ndim == 3:
482
+ y[:, 2::3].sigmoid_() # inplace sigmoid
483
+ y[:, 0::ndim] = (y[:, 0::ndim] * 2.0 + (self.anchors[0] - 0.5)) * self.strides
484
+ y[:, 1::ndim] = (y[:, 1::ndim] * 2.0 + (self.anchors[1] - 0.5)) * self.strides
485
+ return y
486
+
487
+
457
488
  class Classify(nn.Module):
458
489
  # YOLOv8 classification head, i.e. x(b,c1,20,20) to x(b,c2)
459
490
  def __init__(self, c1, c2, k=1, s=1, p=None, g=1): # ch_in, ch_out, kernel, stride, padding, groups
@@ -10,7 +10,7 @@ import torch.nn as nn
10
10
 
11
11
  from ultralytics.nn.modules import (C1, C2, C3, C3TR, SPP, SPPF, Bottleneck, BottleneckCSP, C2f, C3Ghost, C3x, Classify,
12
12
  Concat, Conv, ConvTranspose, Detect, DWConv, DWConvTranspose2d, Ensemble, Focus,
13
- GhostBottleneck, GhostConv, Segment)
13
+ GhostBottleneck, GhostConv, Pose, Segment)
14
14
  from ultralytics.yolo.utils import DEFAULT_CFG_DICT, DEFAULT_CFG_KEYS, LOGGER, colorstr, emojis, yaml_load
15
15
  from ultralytics.yolo.utils.checks import check_requirements, check_suffix, check_yaml
16
16
  from ultralytics.yolo.utils.torch_utils import (fuse_conv_and_bn, fuse_deconv_and_bn, initialize_weights,
@@ -183,10 +183,10 @@ class DetectionModel(BaseModel):
183
183
 
184
184
  # Build strides
185
185
  m = self.model[-1] # Detect()
186
- if isinstance(m, (Detect, Segment)):
186
+ if isinstance(m, (Detect, Segment, Pose)):
187
187
  s = 256 # 2x min stride
188
188
  m.inplace = self.inplace
189
- forward = lambda x: self.forward(x)[0] if isinstance(m, Segment) else self.forward(x)
189
+ forward = lambda x: self.forward(x)[0] if isinstance(m, (Segment, Pose)) else self.forward(x)
190
190
  m.stride = torch.tensor([s / x.shape[-2] for x in forward(torch.zeros(1, ch, s, s))]) # forward
191
191
  self.stride = m.stride
192
192
  m.bias_init() # only run once
@@ -242,12 +242,23 @@ class DetectionModel(BaseModel):
242
242
  class SegmentationModel(DetectionModel):
243
243
  # YOLOv8 segmentation model
244
244
  def __init__(self, cfg='yolov8n-seg.yaml', ch=3, nc=None, verbose=True):
245
- super().__init__(cfg, ch, nc, verbose)
245
+ super().__init__(cfg=cfg, ch=ch, nc=nc, verbose=verbose)
246
246
 
247
247
  def _forward_augment(self, x):
248
248
  raise NotImplementedError(emojis('WARNING ⚠️ SegmentationModel has not supported augment inference yet!'))
249
249
 
250
250
 
251
+ class PoseModel(DetectionModel):
252
+ # YOLOv8 pose model
253
+ def __init__(self, cfg='yolov8n-pose.yaml', ch=3, nc=None, data_kpt_shape=(None, None), verbose=True):
254
+ if not isinstance(cfg, dict):
255
+ cfg = yaml_model_load(cfg) # load model YAML
256
+ if any(data_kpt_shape) and list(data_kpt_shape) != list(cfg['kpt_shape']):
257
+ LOGGER.info(f"Overriding model.yaml kpt_shape={cfg['kpt_shape']} with kpt_shape={data_kpt_shape}")
258
+ cfg['kpt_shape'] = data_kpt_shape
259
+ super().__init__(cfg=cfg, ch=ch, nc=nc, verbose=verbose)
260
+
261
+
251
262
  class ClassificationModel(BaseModel):
252
263
  # YOLOv8 classification model
253
264
  def __init__(self,
@@ -425,7 +436,7 @@ def parse_model(d, ch, verbose=True): # model_dict, input_channels(3)
425
436
  # Args
426
437
  max_channels = float('inf')
427
438
  nc, act, scales = (d.get(x) for x in ('nc', 'act', 'scales'))
428
- depth, width = (d.get(x, 1.0) for x in ('depth_multiple', 'width_multiple'))
439
+ depth, width, kpt_shape = (d.get(x, 1.0) for x in ('depth_multiple', 'width_multiple', 'kpt_shape'))
429
440
  if scales:
430
441
  scale = d.get('scale')
431
442
  if not scale:
@@ -464,7 +475,7 @@ def parse_model(d, ch, verbose=True): # model_dict, input_channels(3)
464
475
  args = [ch[f]]
465
476
  elif m is Concat:
466
477
  c2 = sum(ch[x] for x in f)
467
- elif m in (Detect, Segment):
478
+ elif m in (Detect, Segment, Pose):
468
479
  args.append([ch[x] for x in f])
469
480
  if m is Segment:
470
481
  args[2] = make_divisible(min(args[2], max_channels) * width, 8)
@@ -543,6 +554,8 @@ def guess_model_task(model):
543
554
  return 'detect'
544
555
  if m == 'segment':
545
556
  return 'segment'
557
+ if m == 'pose':
558
+ return 'pose'
546
559
 
547
560
  # Guess from model cfg
548
561
  if isinstance(model, dict):
@@ -565,6 +578,8 @@ def guess_model_task(model):
565
578
  return 'segment'
566
579
  elif isinstance(m, Classify):
567
580
  return 'classify'
581
+ elif isinstance(m, Pose):
582
+ return 'pose'
568
583
 
569
584
  # Guess from model filename
570
585
  if isinstance(model, (str, Path)):
@@ -573,10 +588,12 @@ def guess_model_task(model):
573
588
  return 'segment'
574
589
  elif '-cls' in model.stem or 'classify' in model.parts:
575
590
  return 'classify'
591
+ elif '-pose' in model.stem or 'pose' in model.parts:
592
+ return 'pose'
576
593
  elif 'detect' in model.parts:
577
594
  return 'detect'
578
595
 
579
596
  # Unable to determine task from model
580
597
  LOGGER.warning("WARNING ⚠️ Unable to automatically guess model task, assuming 'task=detect'. "
581
- "Explicitly define task for your model, i.e. 'task=detect', 'task=segment' or 'task=classify'.")
598
+ "Explicitly define task for your model, i.e. 'task=detect', 'segment', 'classify', or 'pose'.")
582
599
  return 'detect' # assume detect
@@ -33,10 +33,9 @@ def on_predict_postprocess_end(predictor):
33
33
  tracks = predictor.trackers[i].update(det, im0s[i])
34
34
  if len(tracks) == 0:
35
35
  continue
36
+ idx = tracks[:, -1].tolist()
37
+ predictor.results[i] = predictor.results[i][idx]
36
38
  predictor.results[i].update(boxes=torch.as_tensor(tracks[:, :-1]))
37
- if predictor.results[i].masks is not None:
38
- idx = tracks[:, -1].tolist()
39
- predictor.results[i].masks = predictor.results[i].masks[idx]
40
39
 
41
40
 
42
41
  def register_tracker(model):
@@ -18,13 +18,13 @@ TASKS = 'detect', 'segment', 'classify', 'pose'
18
18
  TASK2DATA = {
19
19
  'detect': 'coco128.yaml',
20
20
  'segment': 'coco128-seg.yaml',
21
- 'pose': 'coco128-pose.yaml',
22
- 'classify': 'imagenet100'}
21
+ 'classify': 'imagenet100',
22
+ 'pose': 'coco128-pose.yaml'}
23
23
  TASK2MODEL = {
24
24
  'detect': 'yolov8n.pt',
25
25
  'segment': 'yolov8n-seg.pt',
26
- 'pose': 'yolov8n-pose.yaml',
27
- 'classify': 'yolov8n-cls.pt'} # temp
26
+ 'classify': 'yolov8n-cls.pt',
27
+ 'pose': 'yolov8n-pose.yaml'}
28
28
 
29
29
  CLI_HELP_MSG = \
30
30
  f"""
@@ -88,6 +88,8 @@ warmup_bias_lr: 0.1 # warmup initial bias lr
88
88
  box: 7.5 # box loss gain
89
89
  cls: 0.5 # cls loss gain (scale with pixels)
90
90
  dfl: 1.5 # dfl loss gain
91
+ pose: 12.0 # pose loss gain
92
+ kobj: 1.0 # keypoint obj loss gain
91
93
  fl_gamma: 0.0 # focal loss gamma (efficientDet default gamma=1.5)
92
94
  label_smoothing: 0.0 # label smoothing (fraction)
93
95
  nbs: 64 # nominal batch size