dgenerate-ultralytics-headless 8.4.6__py3-none-any.whl → 8.4.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. {dgenerate_ultralytics_headless-8.4.6.dist-info → dgenerate_ultralytics_headless-8.4.8.dist-info}/METADATA +3 -3
  2. {dgenerate_ultralytics_headless-8.4.6.dist-info → dgenerate_ultralytics_headless-8.4.8.dist-info}/RECORD +37 -36
  3. {dgenerate_ultralytics_headless-8.4.6.dist-info → dgenerate_ultralytics_headless-8.4.8.dist-info}/WHEEL +1 -1
  4. tests/test_cli.py +10 -3
  5. tests/test_exports.py +64 -43
  6. tests/test_python.py +40 -11
  7. ultralytics/__init__.py +1 -1
  8. ultralytics/cfg/__init__.py +5 -4
  9. ultralytics/cfg/datasets/coco12-formats.yaml +101 -0
  10. ultralytics/cfg/default.yaml +2 -1
  11. ultralytics/data/augment.py +8 -0
  12. ultralytics/data/converter.py +32 -9
  13. ultralytics/data/utils.py +2 -2
  14. ultralytics/engine/exporter.py +10 -6
  15. ultralytics/engine/predictor.py +5 -0
  16. ultralytics/engine/trainer.py +6 -4
  17. ultralytics/engine/tuner.py +2 -2
  18. ultralytics/engine/validator.py +5 -0
  19. ultralytics/models/sam/predict.py +2 -2
  20. ultralytics/models/yolo/classify/train.py +14 -1
  21. ultralytics/models/yolo/detect/train.py +8 -4
  22. ultralytics/models/yolo/pose/train.py +2 -1
  23. ultralytics/models/yolo/world/train_world.py +21 -1
  24. ultralytics/models/yolo/yoloe/train.py +1 -2
  25. ultralytics/nn/autobackend.py +1 -1
  26. ultralytics/nn/modules/head.py +13 -2
  27. ultralytics/nn/tasks.py +18 -0
  28. ultralytics/solutions/security_alarm.py +1 -1
  29. ultralytics/utils/benchmarks.py +3 -9
  30. ultralytics/utils/callbacks/wb.py +6 -1
  31. ultralytics/utils/loss.py +18 -9
  32. ultralytics/utils/patches.py +42 -0
  33. ultralytics/utils/tal.py +15 -5
  34. ultralytics/utils/torch_utils.py +1 -1
  35. {dgenerate_ultralytics_headless-8.4.6.dist-info → dgenerate_ultralytics_headless-8.4.8.dist-info}/entry_points.txt +0 -0
  36. {dgenerate_ultralytics_headless-8.4.6.dist-info → dgenerate_ultralytics_headless-8.4.8.dist-info}/licenses/LICENSE +0 -0
  37. {dgenerate_ultralytics_headless-8.4.6.dist-info → dgenerate_ultralytics_headless-8.4.8.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dgenerate-ultralytics-headless
3
- Version: 8.4.6
3
+ Version: 8.4.8
4
4
  Summary: Automatically built Ultralytics package with python-opencv-headless dependency instead of python-opencv
5
5
  Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
6
6
  Maintainer-email: Ultralytics <hello@ultralytics.com>
@@ -39,8 +39,8 @@ Requires-Dist: pillow>=7.1.2
39
39
  Requires-Dist: pyyaml>=5.3.1
40
40
  Requires-Dist: requests>=2.23.0
41
41
  Requires-Dist: scipy>=1.4.1
42
- Requires-Dist: torch>=1.8.0
43
- Requires-Dist: torch!=2.4.0,>=1.8.0; sys_platform == "win32"
42
+ Requires-Dist: torch<2.10,>=1.8.0
43
+ Requires-Dist: torch!=2.4.0,<2.10,>=1.8.0; sys_platform == "win32"
44
44
  Requires-Dist: torchvision>=0.9.0
45
45
  Requires-Dist: psutil>=5.8.0
46
46
  Requires-Dist: polars>=0.20.0
@@ -1,19 +1,19 @@
1
- dgenerate_ultralytics_headless-8.4.6.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
1
+ dgenerate_ultralytics_headless-8.4.8.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
2
2
  tests/__init__.py,sha256=hfUXxYLJB3846OCzWV94ZKEZsi8vq9Pqrdd2mMgjjck,804
3
3
  tests/conftest.py,sha256=rlKyDuOC_3ptXrWS8Q19bNEGOupUmYXHj3nB6o1GBGY,2318
4
- tests/test_cli.py,sha256=GhIFHi-_WIJpDgoGNRi0DnjbfwP1wHbklBMnkCM-P_4,5464
4
+ tests/test_cli.py,sha256=-OrAcZlcJ07UPagjSOlR8qXP5gNFHaTYcW3paOTURAE,5725
5
5
  tests/test_cuda.py,sha256=2TBe-ZkecMOGPWLdHcbsAjH3m9c5SQJ2KeyICgS0aeo,8426
6
6
  tests/test_engine.py,sha256=ufSn3X4kL_Lpn2O25jKAfw_9QwHTMRjP9shDdpgBqnY,5740
7
- tests/test_exports.py,sha256=Toy4u-4bsoyAbzNhc9kbMuKqvMKywZxNj5jlFNTzFWs,14670
7
+ tests/test_exports.py,sha256=pZZJBN2uM5QdQMjnjIC-xZkKPOBbnnX8b5d5q90otl4,15651
8
8
  tests/test_integrations.py,sha256=FjvTGjXm3bvYHK3_obgObhC5SzHCTzw4aOJV9Hh08jQ,6220
9
- tests/test_python.py,sha256=np6on3Sa0NNi5pquvilekjKxxedAJMpLOQEthGaIalQ,29284
9
+ tests/test_python.py,sha256=BTyRn29boDKu4n0v1_5D3_7wvADs077NU9RFdTZktHo,30774
10
10
  tests/test_solutions.py,sha256=1tRlM72YciE42Nk9v83gsXOD5RSx9GSWVsKGhH7-HxE,14122
11
- ultralytics/__init__.py,sha256=yZzEzew7ii7HxNyAM12U7UZkIlXh8J_cphVWSfLxRug,1300
11
+ ultralytics/__init__.py,sha256=jfmOTtuFV9ofd_zpWZoaGtHeh3SmmK1zHx1iu3QnbI4,1300
12
12
  ultralytics/py.typed,sha256=la67KBlbjXN-_-DfGNcdOcjYumVpKG_Tkw-8n5dnGB4,8
13
13
  ultralytics/assets/bus.jpg,sha256=wCAZxJecGR63Od3ZRERe9Aja1Weayrb9Ug751DS_vGM,137419
14
14
  ultralytics/assets/zidane.jpg,sha256=Ftc4aeMmen1O0A3o6GCDO9FlfBslLpTAw0gnetx7bts,50427
15
- ultralytics/cfg/__init__.py,sha256=_LkOX0ZG8AlWr_NG2KW7E8SQ7DqVeD_vSiYUd2EKXA4,40288
16
- ultralytics/cfg/default.yaml,sha256=E__q2msvK9XCQngf0YFLpueCer_1tRcMJM0p3ahBdbA,9015
15
+ ultralytics/cfg/__init__.py,sha256=bpSqIVZLUmwiI-3n4915oBTBgpGTsGmuaTkSXygAXt4,40231
16
+ ultralytics/cfg/default.yaml,sha256=2eH6bsCK10V68o2Y3B2kCOnhXvQ64A_2HmrDYP71dKw,9149
17
17
  ultralytics/cfg/datasets/Argoverse.yaml,sha256=QGpdh3Hj5dFrvbsaE_8rAVj9BO4XpKTB7uhXaTTnE-o,3364
18
18
  ultralytics/cfg/datasets/DOTAv1.5.yaml,sha256=KE7VC-ZMDSei1pLPm-pdk_ZAMRU_gLwGgtIQNbwp6dA,1212
19
19
  ultralytics/cfg/datasets/DOTAv1.yaml,sha256=DUmBEfvdlCRH2t9aqhc3uk55sOXWWsY9v6RVYaELeTA,1182
@@ -30,6 +30,7 @@ ultralytics/cfg/datasets/brain-tumor.yaml,sha256=qrxPO_t9wxbn2kHFwP3vGTzSWj2ELTL
30
30
  ultralytics/cfg/datasets/carparts-seg.yaml,sha256=A4e9hM1unTY2jjZIXGiKSarF6R-Ad9R99t57OgRJ37w,1253
31
31
  ultralytics/cfg/datasets/coco-pose.yaml,sha256=rl1Pcnn8Hmst-Ian0-HvP6WQ2PKZxr1AjBEA406vwWw,1928
32
32
  ultralytics/cfg/datasets/coco.yaml,sha256=woUMk6L3G3DMQDcThIKouZMcjTI5vP9XUdEVrzYGL50,2584
33
+ ultralytics/cfg/datasets/coco12-formats.yaml,sha256=Zd-41pX4PEUVIehyE4829QK_fUxiyZ79JVQSH-1UJVM,1953
33
34
  ultralytics/cfg/datasets/coco128-seg.yaml,sha256=JsXu197vJX1YRuFvbEjsXyv4LUWIET-ruWZ9KqX6hYk,1986
34
35
  ultralytics/cfg/datasets/coco128.yaml,sha256=ok_dzaBUzSd0DWfe531GT_uYTEoF5mIQcgoMHZyIVIA,1965
35
36
  ultralytics/cfg/datasets/coco8-grayscale.yaml,sha256=8v6G6mOzZHQNdQM1YwdTBW_lsWWkLRnAimwZBHKtJg8,1961
@@ -119,27 +120,27 @@ ultralytics/cfg/trackers/botsort.yaml,sha256=tRxC-qT4Wz0mLn5x7ZEwrqgGKrmTDVY7gMg
119
120
  ultralytics/cfg/trackers/bytetrack.yaml,sha256=7LS1ObP5u7BUFcmeY6L2m3bRuPUktnpJspFKd_ElVWc,908
120
121
  ultralytics/data/__init__.py,sha256=ToR8zl0JhBHy42ZvV7zIwO_F3lbi5oNlGQNPK3dlddU,644
121
122
  ultralytics/data/annotator.py,sha256=iu1En-LzlR4RyR3ocftthnAog_peQHV9ForPRo_QcX8,2985
122
- ultralytics/data/augment.py,sha256=4xtggkuysYcbK5pYwNuAaoCzshb5wwD9KN6_pP4uSFU,128003
123
+ ultralytics/data/augment.py,sha256=XR52_BEmwFOrdMxEVRypm_kz6ROkTBgVped05R2xZWs,128566
123
124
  ultralytics/data/base.py,sha256=pMs8yJOmAFPXdgfLCDtUemSvkPNDzxReP-fWzkNtonc,19723
124
125
  ultralytics/data/build.py,sha256=s-tkSZPf3OfQyfXPXB9XxdW_gIcU6Xy_u21ekSgTnRo,17205
125
- ultralytics/data/converter.py,sha256=KUFVQuesnABjm7nW90kxQ6WeYavbo7AC7ZtfuxGvPE4,33107
126
+ ultralytics/data/converter.py,sha256=4SwrEKzsdKK3YcoCcEhu0_UmFyaUuQEVPIWENFxlAC4,34520
126
127
  ultralytics/data/dataset.py,sha256=r_BZy4FwMZ-dYkaJiz1E3jr2pI6dn7V3hZwf2RM9_RQ,36536
127
128
  ultralytics/data/loaders.py,sha256=BQbhgjiLCGcRBPkGVG9Hr1jeNfG1nuZD3jstiWb7zS8,31889
128
129
  ultralytics/data/split.py,sha256=HpR0ltf5oN1DpZstavFbBFC1YdpGPaATXxDOcAMwOqc,5101
129
130
  ultralytics/data/split_dota.py,sha256=Qp9vGB2lzb5fQOrpNupKc8KN9ulqZoco9d4gRcx7JZk,12873
130
- ultralytics/data/utils.py,sha256=WkMWje6JTEA-ndOO1PBuDlklD9GEPgH9K1_cLBMqbIQ,36824
131
+ ultralytics/data/utils.py,sha256=QfypAt0fGCfb5PGw9o9Za-xnH5MUVTsETk-_ZBhtLko,36818
131
132
  ultralytics/data/scripts/download_weights.sh,sha256=0y8XtZxOru7dVThXDFUXLHBuICgOIqZNUwpyL4Rh6lg,595
132
133
  ultralytics/data/scripts/get_coco.sh,sha256=UuJpJeo3qQpTHVINeOpmP0NYmg8PhEFE3A8J3jKrnPw,1768
133
134
  ultralytics/data/scripts/get_coco128.sh,sha256=qmRQl_hOKrsdHrTrnyQuFIH01oDz3lfaz138OgGfLt8,650
134
135
  ultralytics/data/scripts/get_imagenet.sh,sha256=hr42H16bM47iT27rgS7MpEo-GeOZAYUQXgr0B2cwn48,1705
135
136
  ultralytics/engine/__init__.py,sha256=lm6MckFYCPTbqIoX7w0s_daxdjNeBeKW6DXppv1-QUM,70
136
- ultralytics/engine/exporter.py,sha256=n_DtRhD0jT9sTFb8oQ_TYdQYTQJbsQzwqdISwR-mQY4,73330
137
+ ultralytics/engine/exporter.py,sha256=y76PH93ULLplU8YvKh2reDJ9QWXjCkQRlusD6p9-NPg,73566
137
138
  ultralytics/engine/model.py,sha256=euDHUy7J5vVBvS_d-KbGZd_0BP5bF6Y3cTQ7VXtwZ4k,53210
138
- ultralytics/engine/predictor.py,sha256=tXrHSTHJ-rDQ3lrPW9P5_ei_ewTwbY2sji6MExybJ28,22838
139
+ ultralytics/engine/predictor.py,sha256=x3xzVlfj92HgLdxPvoKFKpyzp1wSsNVCahpbO5sse80,23102
139
140
  ultralytics/engine/results.py,sha256=Lg-Ke8TU6qaxu0wQtOH26unORj4FRYxd8RL0VxV74Zw,68333
140
- ultralytics/engine/trainer.py,sha256=lvYPaEkaGXuGnH8j19aMIB2BML3b0LhEqt-HyZ_I6nU,47219
141
- ultralytics/engine/tuner.py,sha256=F4fyQaC5_GT74TULRO0VhzTv2S_a54cZDc3FjFoqaHE,21840
142
- ultralytics/engine/validator.py,sha256=DiKsygbNJdRdwXoKoYOJA6bP_T7vMW3Syj_Qc_l7xTM,17761
141
+ ultralytics/engine/trainer.py,sha256=xjWm1ar-ua7nVOcRoAwjNVUH-QWPYAFRqCg6jB6PiG8,47250
142
+ ultralytics/engine/tuner.py,sha256=RDiEWqADVutVDXRHvZIes8QqLUFnffXFXkXk4clfEuQ,21881
143
+ ultralytics/engine/validator.py,sha256=BoQ8mc-OLdAKCaS6ikL0MJf2LQVkNP1oN44ZCqkOx-g,18045
143
144
  ultralytics/hub/__init__.py,sha256=Z0K_E00jzQh90b18q3IDChwVmTvyIYp6C00sCV-n2F8,6709
144
145
  ultralytics/hub/auth.py,sha256=ANzCeZA7lUzTWc_sFHbDuuyBh1jLl2sTpHkoUbIkFYE,6254
145
146
  ultralytics/hub/session.py,sha256=OzBXAL9R135gRDdfNYUqyiSrxOyaiMFCVYSZua99sF0,18364
@@ -165,7 +166,7 @@ ultralytics/models/sam/amg.py,sha256=aYvJ7jQMkTR3X9KV7SHi3qP3yNchQggWNUurTRZwxQg
165
166
  ultralytics/models/sam/build.py,sha256=rEaFXA4R1nyutSonIenRKcuNtO1FgEojnkcayo0FTP4,12867
166
167
  ultralytics/models/sam/build_sam3.py,sha256=Gg_LiqNrCDTYaDWrob05vj-ln2AhkfMa5KkKhyk5wdE,11976
167
168
  ultralytics/models/sam/model.py,sha256=cOawDSkFqJPbt3455aTZ8tjaoWshFWFHQGGqxzsL_QQ,7372
168
- ultralytics/models/sam/predict.py,sha256=Y6JEP3WGAF1gzTg8Z4eCgdtPFFbexSEA75F7zd8Cp_c,203689
169
+ ultralytics/models/sam/predict.py,sha256=k4eTU3g7ihvAn-moBpzR4ox1GUlOEHVQDzywbnheFFM,203651
169
170
  ultralytics/models/sam/modules/__init__.py,sha256=lm6MckFYCPTbqIoX7w0s_daxdjNeBeKW6DXppv1-QUM,70
170
171
  ultralytics/models/sam/modules/blocks.py,sha256=ZU2aY4h6fmosj5pZ5EOEuO1O8Cl8UYeH11eOxkqCt8M,44570
171
172
  ultralytics/models/sam/modules/decoders.py,sha256=G4li37ahUe5rTTNTKibWMsAoz6G3R18rI8OPvfunVX8,25045
@@ -193,11 +194,11 @@ ultralytics/models/yolo/__init__.py,sha256=YD407NDDiyjo0x_MR6usJaTpePKPgsfBUYehl
193
194
  ultralytics/models/yolo/model.py,sha256=HXkglzJQqW1x7MJaKavI5aasA-0lSH21Xcv_dac3SFU,18504
194
195
  ultralytics/models/yolo/classify/__init__.py,sha256=9--HVaNOfI1K7rn_rRqclL8FUAnpfeBrRqEQIaQw2xM,383
195
196
  ultralytics/models/yolo/classify/predict.py,sha256=HCStYkSqeg32SNTWfr4FDCkUMQ4wnKqceUK3T995us4,4137
196
- ultralytics/models/yolo/classify/train.py,sha256=41ZxaIJkzkRxfgq6VffFX5Xfsrm9tNv3i3bdtUPAocE,8958
197
+ ultralytics/models/yolo/classify/train.py,sha256=xPlpioQFPeH32Frhy9ZbbGV_wcpn9hPB4EB4N0Kw-DE,9614
197
198
  ultralytics/models/yolo/classify/val.py,sha256=akH2P3nff4oiZtV2toKB3Z9HIbsVcwsb1uvDwhamszw,10503
198
199
  ultralytics/models/yolo/detect/__init__.py,sha256=GIRsLYR-kT4JJx7lh4ZZAFGBZj0aebokuU0A7JbjDVA,257
199
200
  ultralytics/models/yolo/detect/predict.py,sha256=2nxlMyw_zVKq1aeJFRTgb4EGL2vOFq4pLT9tArHBfF8,5385
200
- ultralytics/models/yolo/detect/train.py,sha256=ffM3ULnR9Kbw_1yBq2I6BWa7V124lfQtU0_C_GHhwRI,10519
201
+ ultralytics/models/yolo/detect/train.py,sha256=N6Sdjnue9-bpnBMP5KGwsH9BFgjL23N9kDaHiXTBj9c,10757
201
202
  ultralytics/models/yolo/detect/val.py,sha256=54AOR6r3istE0pILJ1v4xzPdv7UcvtTEZ6E5OGj3Jgc,22818
202
203
  ultralytics/models/yolo/obb/__init__.py,sha256=tQmpG8wVHsajWkZdmD6cjGohJ4ki64iSXQT8JY_dydo,221
203
204
  ultralytics/models/yolo/obb/predict.py,sha256=I7hWDr1zuy2WuwGom9uzXqomfr7qVMWb7iRl18xdTYw,2577
@@ -205,7 +206,7 @@ ultralytics/models/yolo/obb/train.py,sha256=HEDdPiP-yBbrUQWllcD1rc3gGrbzQmT6RBMT
205
206
  ultralytics/models/yolo/obb/val.py,sha256=qYNe7ZcW3rhTLYPw15OeGfBaqaa_f1ADs4FF21h32e4,14513
206
207
  ultralytics/models/yolo/pose/__init__.py,sha256=_9OFLj19XwvJHBRxQtVW5CV7rvJ_3hDPE97miit0sPc,227
207
208
  ultralytics/models/yolo/pose/predict.py,sha256=6EW9palcAoWX-gu5ROQvO6AxBSm719934hhqF-9OGjM,3118
208
- ultralytics/models/yolo/pose/train.py,sha256=IlmsFlb0TsWZVy6PL3Trr_aXfwwGMBKAHyxnP7VPp_g,4747
209
+ ultralytics/models/yolo/pose/train.py,sha256=pXYpkPU3SmPqw_gVONUFsikhlO4aw-j6Ry17ep5SlqI,4816
209
210
  ultralytics/models/yolo/pose/val.py,sha256=0luDccEPb_lUMjzaBb5VMsh9RdXVAbxb3Br57VKWNdc,12004
210
211
  ultralytics/models/yolo/segment/__init__.py,sha256=3IThhZ1wlkY9FvmWm9cE-5-ZyE6F1FgzAtQ6jOOFzzw,275
211
212
  ultralytics/models/yolo/segment/predict.py,sha256=zLhmSTVEnaUumIX9SbjZH09kr2VrNdYWEss7FvseVuY,5428
@@ -213,21 +214,21 @@ ultralytics/models/yolo/segment/train.py,sha256=nS3qrT7Y3swCwjGZzeDQ2EunC9ilMsOi
213
214
  ultralytics/models/yolo/segment/val.py,sha256=AvPS4rhV2PFpi0yixUfJhdczXctmZQSKgTjh7qVH0To,13204
214
215
  ultralytics/models/yolo/world/__init__.py,sha256=nlh8I6t8hMGz_vZg8QSlsUW1R-2eKvn9CGUoPPQEGhA,131
215
216
  ultralytics/models/yolo/world/train.py,sha256=80kswko6Zu7peXPBhXcfrTo5HO3Rg8C_cu4vPBQlk7M,7906
216
- ultralytics/models/yolo/world/train_world.py,sha256=5Jj4gzEwDJtz37bEahL6Lf4xp-c1xiYjGKeg_w7Esns,8723
217
+ ultralytics/models/yolo/world/train_world.py,sha256=se78I38c7rC2W76Fe0cg9axsK3JixMOafM1PpPZf1cE,9437
217
218
  ultralytics/models/yolo/yoloe/__init__.py,sha256=zaZo1_ommaxNv7mD7xpdSomNF4s8mpOcCVTXspg0ncY,760
218
219
  ultralytics/models/yolo/yoloe/predict.py,sha256=zeu_whH4e2SIWXV8MmJ1NNzoM_cNsiI2kOTjlAhV4qg,7065
219
- ultralytics/models/yolo/yoloe/train.py,sha256=99iSHQs--5VU_s82Q4w-fAJmyT5-y0TykTul8bo4xFo,13303
220
+ ultralytics/models/yolo/yoloe/train.py,sha256=q7K1fiqKrpbjfrrd3F3FiVMPtQAVuVzQinIh0i1yz1g,13284
220
221
  ultralytics/models/yolo/yoloe/train_seg.py,sha256=rV2Jnbuh6vvBMaupaZK_aRXBMevO0XhN2VUR43ZwlIY,5285
221
222
  ultralytics/models/yolo/yoloe/val.py,sha256=utUFWeFKRFWZrPr1y3A8ztbTwdoWMYqzlwBN7CQ0tCA,9418
222
223
  ultralytics/nn/__init__.py,sha256=538LZPUKKvc3JCMgiQ4VLGqRN2ZAaVLFcQbeNNHFkEA,545
223
- ultralytics/nn/autobackend.py,sha256=MLS68iMNv6U0HyBK8nGjcyLOyImYIGEjP4398KqOkV0,45068
224
- ultralytics/nn/tasks.py,sha256=PmlYScI7qTRCmYRR90Mw1QnqeRzvY0ojAMrgStBr11g,72010
224
+ ultralytics/nn/autobackend.py,sha256=c3FzMw-0h5wEoxg0-n7rMWrIcR6C1WTNjF1AUpW07rM,45079
225
+ ultralytics/nn/tasks.py,sha256=xclS6E6OIBDurrDscTVmVafvmd8JOIiagIT4iEGwD4M,72588
225
226
  ultralytics/nn/text_model.py,sha256=c--WzxjFEDb7p95u3YGcSsJLjj91zFNqXshij8Evrwg,15291
226
227
  ultralytics/nn/modules/__init__.py,sha256=9KyQBxpomp5uJJ1PvMGuOFs2pR3NpqZcFHJlM6Q56c0,3322
227
228
  ultralytics/nn/modules/activation.py,sha256=J6n-CJKFK0YbhwcRDqm9zEJM9pSAEycj5quQss_3x6E,2219
228
229
  ultralytics/nn/modules/block.py,sha256=9d1eelj3uRnf-HWTHYTjsBqLSpMCrwBQuX52MjeapN4,74499
229
230
  ultralytics/nn/modules/conv.py,sha256=9WUlBzHD-wLgz0riLyttzASLIqBtXPK6Jk5EdyIiGCM,21100
230
- ultralytics/nn/modules/head.py,sha256=eJvXtr_ONGqQVdtsUpJtslplgVblti5sMxP9nkoSa0Y,78057
231
+ ultralytics/nn/modules/head.py,sha256=yeXKv9P6gxC7Zkvdu7ndQ8H7WDKnnoJ9yYyV6FkpUcY,78487
231
232
  ultralytics/nn/modules/transformer.py,sha256=lAjTH-U8IkBp_1cXSOOFSus9tJf-s8WISKKcXPB84CM,31972
232
233
  ultralytics/nn/modules/utils.py,sha256=EyhENse_RESlXjLHAJWvV07_tq1MVMmfzXgPR1fiT9w,6066
233
234
  ultralytics/optim/__init__.py,sha256=Sl3Dx2eiaJd_u4VbmqcBqWWDF8FHnO5W0nBEL8_M_C4,130
@@ -245,7 +246,7 @@ ultralytics/solutions/object_cropper.py,sha256=WRbrfXAR5aD6PQBqJ-BvcVaiaqta_9YeT
245
246
  ultralytics/solutions/parking_management.py,sha256=Q0fEFKlv6dKKWuw_4jmWaeHQVXGppzuU7Vr_HqVYqHM,13770
246
247
  ultralytics/solutions/queue_management.py,sha256=NlVX6PMEaffjoZjfQrVyayaDUdtc0JF8GzTQrZFjpCg,4371
247
248
  ultralytics/solutions/region_counter.py,sha256=IAvlFwEYoNftDzfBbdo5MzLwcuidOHW9oTGyRCDzMRc,6025
248
- ultralytics/solutions/security_alarm.py,sha256=QjUIVBWcy094VTcOkk_zOq3BmKKOeIaHpVi_QMWo_3Q,6293
249
+ ultralytics/solutions/security_alarm.py,sha256=ep53mA6h5a4pzPmVgoxBmRRgv6u9RDC7lG1H7Ipjko0,6293
249
250
  ultralytics/solutions/similarity_search.py,sha256=Q2FOBUtEokegiJHlfDbPP0bKxr5F-sHN3-IvskDoe00,9644
250
251
  ultralytics/solutions/solutions.py,sha256=ktLwDhC0y4k2FbNd0sk7Y8GcEvBu9wL3rXyFGwlbnIQ,36984
251
252
  ultralytics/solutions/speed_estimation.py,sha256=WrZECxKAq6P4QpeTbhkp3-Rqjnox7tdR25fUxzozlpU,5861
@@ -265,7 +266,7 @@ ultralytics/trackers/utils/matching.py,sha256=x6uZOIx0O9oVmAcfY6tYMTJQE2cDTUlRR6
265
266
  ultralytics/utils/__init__.py,sha256=XLEK_pvptzNWhJaO8x0MWghREIyEDei0LOGnUnmU1Kg,55145
266
267
  ultralytics/utils/autobatch.py,sha256=jiE4m_--H9UkXFDm_FqzcZk_hSTCGpS72XdVEKgZwAo,5114
267
268
  ultralytics/utils/autodevice.py,sha256=rXlPuo-iX-vZ4BabmMGEGh9Uxpau4R7Zlt1KCo9Xfyc,8892
268
- ultralytics/utils/benchmarks.py,sha256=f4RykrjO1oEBxrTbH6qM_9vMxYKXO9F0ruFcM4xKF7A,32293
269
+ ultralytics/utils/benchmarks.py,sha256=y3aZ05qQhS2C3WI-iPeByOfmcaLLfXabsEufvXIv8lI,31819
269
270
  ultralytics/utils/checks.py,sha256=NWc0J-Nk4qHSVEXFDWfJkI7IjTNHFXajKjsSodDroBk,39411
270
271
  ultralytics/utils/cpu.py,sha256=OksKOlX93AsbSsFuoYvLXRXgpkOibrZSwQyW6lipt4Q,3493
271
272
  ultralytics/utils/dist.py,sha256=sktf2a_uh-vLg6piQyiuRJ5JcMggFYmhS8Wepnb88WM,4220
@@ -276,14 +277,14 @@ ultralytics/utils/files.py,sha256=u7pjz13wgkLSBfe_beeZrzar32_gaJWoIVa3nvY3mh8,81
276
277
  ultralytics/utils/git.py,sha256=UdqeIiiEzg1qkerAZrg5YtTYPuJYwrpxW9N_6Pq6s8U,5501
277
278
  ultralytics/utils/instance.py,sha256=11mhefvTI9ftMqSirXuiViAi0Fxlo6v84qvNxfRNUoE,18862
278
279
  ultralytics/utils/logger.py,sha256=T5iaNnaqbCvx_FZf1dhVkr5FVxyxb4vO17t4SJfCIhg,19132
279
- ultralytics/utils/loss.py,sha256=pb4NIzG-vz9MvH4EfdPc6hKFAnEIe6E4dhUZPtTXPHc,56559
280
+ ultralytics/utils/loss.py,sha256=7Z-CDlgsRldDart8j7ZjKot7TSj57IIwGj8C6QjTLx0,57003
280
281
  ultralytics/utils/metrics.py,sha256=puMGn1LfVIlDvx5K7US4RtK8HYW6cRl9OznfV0nUPvk,69261
281
282
  ultralytics/utils/nms.py,sha256=zv1rOzMF6WU8Kdk41VzNf1H1EMt_vZHcbDFbg3mnN2o,14248
282
283
  ultralytics/utils/ops.py,sha256=4xqb7kwrAWm8c_zxOWP5JoXozgsA1Slk2s4XFwmEZCs,26089
283
- ultralytics/utils/patches.py,sha256=mD3slAMAhcezzP42_fOWmacNMU6zXB68Br4_EBCyIjs,7117
284
+ ultralytics/utils/patches.py,sha256=yXkznJNo3M74gvvzWmHoZYbWFu-KnO3KK4usbmey8H0,8521
284
285
  ultralytics/utils/plotting.py,sha256=_iXs4gs8tzMSgiKxCriD4un-MJkOsC3lGSy0wn7qZGk,48433
285
- ultralytics/utils/tal.py,sha256=vfcfSy78zdtHbGzlvo5UDx-sCwHLRdGBqDO3CX7ZiR0,24182
286
- ultralytics/utils/torch_utils.py,sha256=dHvLaQopIOr9NcIWkLWPX36f5OAFR4thcqm379Zayfc,40278
286
+ ultralytics/utils/tal.py,sha256=9BSRgsYj0Llq7r5vOzkXDKUjfoTZsxiH92U09c6DtoU,24540
287
+ ultralytics/utils/torch_utils.py,sha256=W6OX8p3fI44gF0TUdPTLV5NZlTE03YdwDbcZXy_e05k,40279
287
288
  ultralytics/utils/tqdm.py,sha256=f2W608Qpvgu6tFi28qylaZpcRv3IX8wTGY_8lgicaqY,16343
288
289
  ultralytics/utils/triton.py,sha256=BQu3CD3OlT76d1OtmnX5slQU37VC1kzRvEtfI2saIQA,5211
289
290
  ultralytics/utils/tuner.py,sha256=nRMmnyp0B0gVJzAXcpCxQUnwXjVp0WNiSJwxyR2xvQM,7303
@@ -298,13 +299,13 @@ ultralytics/utils/callbacks/neptune.py,sha256=_vt3cMwDHCR-LyT3KtRikGpj6AG11oQ-sk
298
299
  ultralytics/utils/callbacks/platform.py,sha256=Utc9X3SDEGcvyQLaujQs3IA8UpFvmJcQC6HmLnTV4XA,16202
299
300
  ultralytics/utils/callbacks/raytune.py,sha256=Y0dFyNZVRuFovSh7nkgUIHTQL3xIXOACElgHuYbg_5I,1278
300
301
  ultralytics/utils/callbacks/tensorboard.py,sha256=K7b6KtC7rimfzqFu-NDZ_55Tbd7eC6TckqQdTNPuQ6U,5039
301
- ultralytics/utils/callbacks/wb.py,sha256=ghmL3gigOa-z_F54-TzMraKw9MAaYX-Wk4H8dLoRvX8,7705
302
+ ultralytics/utils/callbacks/wb.py,sha256=ci6lYVRneKTRC5CL6FRf9_iOYznwU74p9_fV3s9AbfQ,7907
302
303
  ultralytics/utils/export/__init__.py,sha256=Cfh-PwVfTF_lwPp-Ss4wiX4z8Sm1XRPklsqdFfmTZ30,333
303
304
  ultralytics/utils/export/engine.py,sha256=QoXPqnmQn6W5TOUAygOtCG63R9ExDG4-Df6X6W-_Mzo,10470
304
305
  ultralytics/utils/export/imx.py,sha256=VnMDO7c8ezBs91UDoLg9rR0oY8Uc7FujKpbdGxrzV18,13744
305
306
  ultralytics/utils/export/tensorflow.py,sha256=xHEcEM3_VeYctyqkJCpgkqcNie1M8xLqcFKr6uANEEQ,9951
306
- dgenerate_ultralytics_headless-8.4.6.dist-info/METADATA,sha256=e-O8HW66l7oBMQeck4HfTphGSArmeqC3dzfVLU5PI9g,40069
307
- dgenerate_ultralytics_headless-8.4.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
308
- dgenerate_ultralytics_headless-8.4.6.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
309
- dgenerate_ultralytics_headless-8.4.6.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
310
- dgenerate_ultralytics_headless-8.4.6.dist-info/RECORD,,
307
+ dgenerate_ultralytics_headless-8.4.8.dist-info/METADATA,sha256=L2XFEFB-0AoqDdGUp11R4vVL-fjDOCuk02BqvFYu6qY,40081
308
+ dgenerate_ultralytics_headless-8.4.8.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
309
+ dgenerate_ultralytics_headless-8.4.8.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
310
+ dgenerate_ultralytics_headless-8.4.8.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
311
+ dgenerate_ultralytics_headless-8.4.8.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
tests/test_cli.py CHANGED
@@ -34,19 +34,26 @@ def test_train(task: str, model: str, data: str) -> None:
34
34
  @pytest.mark.parametrize("task,model,data", TASK_MODEL_DATA)
35
35
  def test_val(task: str, model: str, data: str) -> None:
36
36
  """Test YOLO validation process for specified task, model, and data using a shell command."""
37
- run(f"yolo val {task} model={model} data={data} imgsz=32 save_txt save_json visualize")
37
+ for end2end in {False, True}:
38
+ run(
39
+ f"yolo val {task} model={model} data={data} imgsz=32 save_txt save_json visualize end2end={end2end} max_det=100 agnostic_nms"
40
+ )
38
41
 
39
42
 
40
43
  @pytest.mark.parametrize("task,model,data", TASK_MODEL_DATA)
41
44
  def test_predict(task: str, model: str, data: str) -> None:
42
45
  """Test YOLO prediction on provided sample assets for specified task and model."""
43
- run(f"yolo {task} predict model={model} source={ASSETS} imgsz=32 save save_crop save_txt visualize")
46
+ for end2end in {False, True}:
47
+ run(
48
+ f"yolo {task} predict model={model} source={ASSETS} imgsz=32 save save_crop save_txt visualize end2end={end2end} max_det=100"
49
+ )
44
50
 
45
51
 
46
52
  @pytest.mark.parametrize("model", MODELS)
47
53
  def test_export(model: str) -> None:
48
54
  """Test exporting a YOLO model to TorchScript format."""
49
- run(f"yolo export model={model} format=torchscript imgsz=32")
55
+ for end2end in {False, True}:
56
+ run(f"yolo export model={model} format=torchscript imgsz=32 end2end={end2end} max_det=100")
50
57
 
51
58
 
52
59
  @pytest.mark.skipif(not TORCH_1_11, reason="RTDETR requires torch>=1.11")
tests/test_exports.py CHANGED
@@ -16,38 +16,42 @@ from ultralytics.utils import ARM64, IS_RASPBERRYPI, LINUX, MACOS, MACOS_VERSION
16
16
  from ultralytics.utils.torch_utils import TORCH_1_10, TORCH_1_11, TORCH_1_13, TORCH_2_0, TORCH_2_1, TORCH_2_8, TORCH_2_9
17
17
 
18
18
 
19
- def test_export_torchscript():
19
+ @pytest.mark.parametrize("end2end", [False, True])
20
+ def test_export_torchscript(end2end):
20
21
  """Test YOLO model export to TorchScript format for compatibility and correctness."""
21
- file = YOLO(MODEL).export(format="torchscript", optimize=False, imgsz=32)
22
+ file = YOLO(MODEL).export(format="torchscript", optimize=False, imgsz=32, end2end=end2end)
22
23
  YOLO(file)(SOURCE, imgsz=32) # exported model inference
23
24
 
24
25
 
25
- def test_export_onnx():
26
+ @pytest.mark.parametrize("end2end", [False, True])
27
+ def test_export_onnx(end2end):
26
28
  """Test YOLO model export to ONNX format with dynamic axes."""
27
- file = YOLO(MODEL).export(format="onnx", dynamic=True, imgsz=32)
29
+ file = YOLO(MODEL).export(format="onnx", dynamic=True, imgsz=32, end2end=end2end)
28
30
  YOLO(file)(SOURCE, imgsz=32) # exported model inference
29
31
 
30
32
 
31
33
  @pytest.mark.skipif(not TORCH_2_1, reason="OpenVINO requires torch>=2.1")
32
- def test_export_openvino():
34
+ @pytest.mark.parametrize("end2end", [False, True])
35
+ def test_export_openvino(end2end):
33
36
  """Test YOLO export to OpenVINO format for model inference compatibility."""
34
- file = YOLO(MODEL).export(format="openvino", imgsz=32)
37
+ file = YOLO(MODEL).export(format="openvino", imgsz=32, end2end=end2end)
35
38
  YOLO(file)(SOURCE, imgsz=32) # exported model inference
36
39
 
37
40
 
38
41
  @pytest.mark.slow
39
42
  @pytest.mark.skipif(not TORCH_2_1, reason="OpenVINO requires torch>=2.1")
40
43
  @pytest.mark.parametrize(
41
- "task, dynamic, int8, half, batch, nms",
44
+ "task, dynamic, int8, half, batch, nms, end2end",
42
45
  [ # generate all combinations except for exclusion cases
43
- (task, dynamic, int8, half, batch, nms)
44
- for task, dynamic, int8, half, batch, nms in product(
45
- TASKS, [True, False], [True, False], [True, False], [1, 2], [True, False]
46
+ (task, dynamic, int8, half, batch, nms, end2end)
47
+ for task, dynamic, int8, half, batch, nms, end2end in product(
48
+ TASKS, [True, False], [True, False], [True, False], [1, 2], [True, False], [True]
46
49
  )
47
- if not ((int8 and half) or (task == "classify" and nms))
50
+ if not ((int8 and half) or (task == "classify" and nms) or (end2end and nms))
48
51
  ],
49
52
  )
50
- def test_export_openvino_matrix(task, dynamic, int8, half, batch, nms):
53
+ # disable end2end=False test for now due to github runner OOM during openvino tests
54
+ def test_export_openvino_matrix(task, dynamic, int8, half, batch, nms, end2end):
51
55
  """Test YOLO model export to OpenVINO under various configuration matrix conditions."""
52
56
  file = YOLO(TASK2MODEL[task]).export(
53
57
  format="openvino",
@@ -58,6 +62,7 @@ def test_export_openvino_matrix(task, dynamic, int8, half, batch, nms):
58
62
  batch=batch,
59
63
  data=TASK2DATA[task],
60
64
  nms=nms,
65
+ end2end=end2end,
61
66
  )
62
67
  if WINDOWS:
63
68
  # Use unique filenames due to Windows file permissions bug possibly due to latent threaded use
@@ -70,19 +75,27 @@ def test_export_openvino_matrix(task, dynamic, int8, half, batch, nms):
70
75
 
71
76
  @pytest.mark.slow
72
77
  @pytest.mark.parametrize(
73
- "task, dynamic, int8, half, batch, simplify, nms",
78
+ "task, dynamic, int8, half, batch, simplify, nms, end2end",
74
79
  [ # generate all combinations except for exclusion cases
75
- (task, dynamic, int8, half, batch, simplify, nms)
76
- for task, dynamic, int8, half, batch, simplify, nms in product(
77
- TASKS, [True, False], [False], [False], [1, 2], [True, False], [True, False]
80
+ (task, dynamic, int8, half, batch, simplify, nms, end2end)
81
+ for task, dynamic, int8, half, batch, simplify, nms, end2end in product(
82
+ TASKS, [True, False], [False], [False], [1, 2], [True, False], [True, False], [True, False]
78
83
  )
79
- if not ((int8 and half) or (task == "classify" and nms) or (nms and not TORCH_1_13))
84
+ if not ((int8 and half) or (task == "classify" and nms) or (nms and not TORCH_1_13) or (end2end and nms))
80
85
  ],
81
86
  )
82
- def test_export_onnx_matrix(task, dynamic, int8, half, batch, simplify, nms):
87
+ def test_export_onnx_matrix(task, dynamic, int8, half, batch, simplify, nms, end2end):
83
88
  """Test YOLO export to ONNX format with various configurations and parameters."""
84
89
  file = YOLO(TASK2MODEL[task]).export(
85
- format="onnx", imgsz=32, dynamic=dynamic, int8=int8, half=half, batch=batch, simplify=simplify, nms=nms
90
+ format="onnx",
91
+ imgsz=32,
92
+ dynamic=dynamic,
93
+ int8=int8,
94
+ half=half,
95
+ batch=batch,
96
+ simplify=simplify,
97
+ nms=nms,
98
+ end2end=end2end,
86
99
  )
87
100
  YOLO(file)([SOURCE] * batch, imgsz=64 if dynamic else 32) # exported model inference
88
101
  Path(file).unlink() # cleanup
@@ -90,19 +103,19 @@ def test_export_onnx_matrix(task, dynamic, int8, half, batch, simplify, nms):
90
103
 
91
104
  @pytest.mark.slow
92
105
  @pytest.mark.parametrize(
93
- "task, dynamic, int8, half, batch, nms",
106
+ "task, dynamic, int8, half, batch, nms, end2end",
94
107
  [ # generate all combinations except for exclusion cases
95
- (task, dynamic, int8, half, batch, nms)
96
- for task, dynamic, int8, half, batch, nms in product(
97
- TASKS, [False, True], [False], [False, True], [1, 2], [True, False]
108
+ (task, dynamic, int8, half, batch, nms, end2end)
109
+ for task, dynamic, int8, half, batch, nms, end2end in product(
110
+ TASKS, [False, True], [False], [False, True], [1, 2], [True, False], [True, False]
98
111
  )
99
- if not (task == "classify" and nms)
112
+ if not ((task == "classify" and nms) or (end2end and nms))
100
113
  ],
101
114
  )
102
- def test_export_torchscript_matrix(task, dynamic, int8, half, batch, nms):
115
+ def test_export_torchscript_matrix(task, dynamic, int8, half, batch, nms, end2end):
103
116
  """Test YOLO model export to TorchScript format under varied configurations."""
104
117
  file = YOLO(TASK2MODEL[task]).export(
105
- format="torchscript", imgsz=32, dynamic=dynamic, int8=int8, half=half, batch=batch, nms=nms
118
+ format="torchscript", imgsz=32, dynamic=dynamic, int8=int8, half=half, batch=batch, nms=nms, end2end=end2end
106
119
  )
107
120
  YOLO(file)([SOURCE] * batch, imgsz=64 if dynamic else 32) # exported model inference
108
121
  Path(file).unlink() # cleanup
@@ -116,19 +129,20 @@ def test_export_torchscript_matrix(task, dynamic, int8, half, batch, nms):
116
129
  MACOS and MACOS_VERSION and MACOS_VERSION >= "15", reason="CoreML YOLO26 matrix test crashes on macOS 15+"
117
130
  )
118
131
  @pytest.mark.parametrize(
119
- "task, dynamic, int8, half, nms, batch",
132
+ "task, dynamic, int8, half, nms, batch, end2end",
120
133
  [ # generate all combinations except for exclusion cases
121
- (task, dynamic, int8, half, nms, batch)
122
- for task, dynamic, int8, half, nms, batch in product(
123
- TASKS, [True, False], [True, False], [True, False], [True, False], [1]
134
+ (task, dynamic, int8, half, nms, batch, end2end)
135
+ for task, dynamic, int8, half, nms, batch, end2end in product(
136
+ TASKS, [True, False], [True, False], [True, False], [True, False], [1], [True, False]
124
137
  )
125
138
  if not (int8 and half)
126
139
  and not (task != "detect" and nms)
127
140
  and not (dynamic and nms)
128
141
  and not (task == "classify" and dynamic)
142
+ and not (end2end and nms)
129
143
  ],
130
144
  )
131
- def test_export_coreml_matrix(task, dynamic, int8, half, nms, batch):
145
+ def test_export_coreml_matrix(task, dynamic, int8, half, nms, batch, end2end):
132
146
  """Test YOLO export to CoreML format with various parameter configurations."""
133
147
  file = YOLO(TASK2MODEL[task]).export(
134
148
  format="coreml",
@@ -138,6 +152,7 @@ def test_export_coreml_matrix(task, dynamic, int8, half, nms, batch):
138
152
  half=half,
139
153
  batch=batch,
140
154
  nms=nms,
155
+ end2end=end2end,
141
156
  )
142
157
  YOLO(file)([SOURCE] * batch, imgsz=32) # exported model inference
143
158
  shutil.rmtree(file) # cleanup
@@ -152,19 +167,25 @@ def test_export_coreml_matrix(task, dynamic, int8, half, nms, batch):
152
167
  reason="Test disabled as TF suffers from install conflicts on Windows, macOS and Raspberry Pi",
153
168
  )
154
169
  @pytest.mark.parametrize(
155
- "task, dynamic, int8, half, batch, nms",
170
+ "task, dynamic, int8, half, batch, nms, end2end",
156
171
  [ # generate all combinations except for exclusion cases
157
- (task, dynamic, int8, half, batch, nms)
158
- for task, dynamic, int8, half, batch, nms in product(
159
- TASKS, [False], [True, False], [True, False], [1], [True, False]
172
+ (task, dynamic, int8, half, batch, nms, end2end)
173
+ for task, dynamic, int8, half, batch, nms, end2end in product(
174
+ TASKS, [False], [True, False], [True, False], [1], [True, False], [True, False]
175
+ )
176
+ if not (
177
+ (int8 and half)
178
+ or (task == "classify" and nms)
179
+ or (ARM64 and nms)
180
+ or (nms and not TORCH_1_13)
181
+ or (end2end and nms)
160
182
  )
161
- if not ((int8 and half) or (task == "classify" and nms) or (ARM64 and nms) or (nms and not TORCH_1_13))
162
183
  ],
163
184
  )
164
- def test_export_tflite_matrix(task, dynamic, int8, half, batch, nms):
185
+ def test_export_tflite_matrix(task, dynamic, int8, half, batch, nms, end2end):
165
186
  """Test YOLO export to TFLite format considering various export configurations."""
166
187
  file = YOLO(TASK2MODEL[task]).export(
167
- format="tflite", imgsz=32, dynamic=dynamic, int8=int8, half=half, batch=batch, nms=nms
188
+ format="tflite", imgsz=32, dynamic=dynamic, int8=int8, half=half, batch=batch, nms=nms, end2end=end2end
168
189
  )
169
190
  YOLO(file)([SOURCE] * batch, imgsz=32) # exported model inference
170
191
  Path(file).unlink() # cleanup
@@ -225,16 +246,16 @@ def test_export_mnn():
225
246
  @pytest.mark.slow
226
247
  @pytest.mark.skipif(not TORCH_1_10, reason="MNN export requires torch>=1.10")
227
248
  @pytest.mark.parametrize(
228
- "task, int8, half, batch",
249
+ "task, int8, half, batch, end2end",
229
250
  [ # generate all combinations except for exclusion cases
230
- (task, int8, half, batch)
231
- for task, int8, half, batch in product(TASKS, [True, False], [True, False], [1, 2])
251
+ (task, int8, half, batch, end2end)
252
+ for task, int8, half, batch, end2end in product(TASKS, [True, False], [True, False], [1, 2], [True, False])
232
253
  if not (int8 and half)
233
254
  ],
234
255
  )
235
- def test_export_mnn_matrix(task, int8, half, batch):
256
+ def test_export_mnn_matrix(task, int8, half, batch, end2end):
236
257
  """Test YOLO export to MNN format considering various export configurations."""
237
- file = YOLO(TASK2MODEL[task]).export(format="mnn", imgsz=32, int8=int8, half=half, batch=batch)
258
+ file = YOLO(TASK2MODEL[task]).export(format="mnn", imgsz=32, int8=int8, half=half, batch=batch, end2end=end2end)
238
259
  YOLO(file)([SOURCE] * batch, imgsz=32) # exported model inference
239
260
  Path(file).unlink() # cleanup
240
261
 
tests/test_python.py CHANGED
@@ -159,6 +159,30 @@ def test_predict_gray_and_4ch(tmp_path):
159
159
  f.unlink() # cleanup
160
160
 
161
161
 
162
+ @pytest.mark.slow
163
+ @pytest.mark.skipif(not ONLINE, reason="environment is offline")
164
+ def test_predict_all_image_formats():
165
+ """Test YOLO prediction all 12 image formats (AVIF, BMP, DNG, HEIC, JP2, JPEG, JPG, MPO, PNG, TIF, TIFF, WebP)."""
166
+ # Download dataset if needed
167
+ data = check_det_dataset("coco12-formats.yaml")
168
+ dataset_path = Path(data["path"])
169
+
170
+ # Collect all images from train and val
171
+ expected = {"avif", "bmp", "dng", "heic", "jp2", "jpeg", "jpg", "mpo", "png", "tif", "tiff", "webp"}
172
+ images = [im for im in (dataset_path / "images" / "train").glob("*.*") if im.suffix.lower().lstrip(".") in expected]
173
+ images += [im for im in (dataset_path / "images" / "val").glob("*.*") if im.suffix.lower().lstrip(".") in expected]
174
+ assert len(images) == 12, f"Expected 12 images, found {len(images)}"
175
+
176
+ # Verify all format extensions are represented
177
+ extensions = {img.suffix.lower().lstrip(".") for img in images}
178
+ assert extensions == expected, f"Missing formats: {expected - extensions}"
179
+
180
+ # Run inference on all images
181
+ model = YOLO(MODEL)
182
+ results = model(images, imgsz=32)
183
+ assert len(results) == 12, f"Expected 12 results, got {len(results)}"
184
+
185
+
162
186
  @pytest.mark.slow
163
187
  @pytest.mark.skipif(not ONLINE, reason="environment is offline")
164
188
  @pytest.mark.skipif(is_github_action_running(), reason="No auth https://github.com/JuanBindez/pytubefix/issues/166")
@@ -209,11 +233,12 @@ def test_val(task: str, weight: str, data: str) -> None:
209
233
  metrics.confusion_matrix.to_json()
210
234
 
211
235
 
236
+ @pytest.mark.skipif(not ONLINE, reason="environment is offline")
212
237
  @pytest.mark.skipif(IS_JETSON or IS_RASPBERRYPI, reason="Edge devices not intended for training")
213
238
  def test_train_scratch():
214
- """Test training the YOLO model from scratch using the provided configuration."""
239
+ """Test training the YOLO model from scratch on 12 different image types in the COCO12-Formats dataset."""
215
240
  model = YOLO(CFG)
216
- model.train(data="coco8.yaml", epochs=2, imgsz=32, cache="disk", batch=-1, close_mosaic=1, name="model")
241
+ model.train(data="coco12-formats.yaml", epochs=2, imgsz=32, cache="disk", batch=-1, close_mosaic=1, name="model")
217
242
  model(SOURCE)
218
243
 
219
244
 
@@ -672,7 +697,7 @@ def test_yolo_world():
672
697
  checks.IS_PYTHON_3_8 and LINUX and ARM64,
673
698
  reason="YOLOE with CLIP is not supported in Python 3.8 and aarch64 Linux",
674
699
  )
675
- def test_yoloe():
700
+ def test_yoloe(tmp_path):
676
701
  """Test YOLOE models with MobileClip support."""
677
702
  # Predict
678
703
  # text-prompts
@@ -714,14 +739,18 @@ def test_yoloe():
714
739
  imgsz=32,
715
740
  )
716
741
  # Train, from scratch
717
- model = YOLOE("yoloe-11s-seg.yaml")
718
- model.train(
719
- data=dict(train=dict(yolo_data=["coco128-seg.yaml"]), val=dict(yolo_data=["coco128-seg.yaml"])),
720
- epochs=1,
721
- close_mosaic=1,
722
- trainer=YOLOESegTrainerFromScratch,
723
- imgsz=32,
724
- )
742
+ data_dict = dict(train=dict(yolo_data=["coco128-seg.yaml"]), val=dict(yolo_data=["coco128-seg.yaml"]))
743
+ data_yaml = tmp_path / "yoloe-data.yaml"
744
+ YAML.save(data=data_dict, file=data_yaml)
745
+ for data in [data_dict, data_yaml]:
746
+ model = YOLOE("yoloe-11s-seg.yaml")
747
+ model.train(
748
+ data=data,
749
+ epochs=1,
750
+ close_mosaic=1,
751
+ trainer=YOLOESegTrainerFromScratch,
752
+ imgsz=32,
753
+ )
725
754
 
726
755
  # prompt-free
727
756
  # predict
ultralytics/__init__.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
- __version__ = "8.4.6"
3
+ __version__ = "8.4.8"
4
4
 
5
5
  import importlib
6
6
  import os
@@ -238,6 +238,7 @@ CFG_BOOL_KEYS = frozenset(
238
238
  "simplify",
239
239
  "nms",
240
240
  "profile",
241
+ "end2end",
241
242
  }
242
243
  )
243
244
 
@@ -401,16 +402,16 @@ def get_save_dir(args: SimpleNamespace, name: str | None = None) -> Path:
401
402
  >>> args = SimpleNamespace(project="my_project", task="detect", mode="train", exist_ok=True)
402
403
  >>> save_dir = get_save_dir(args)
403
404
  >>> print(save_dir)
404
- my_project/detect/train
405
+ runs/detect/my_project/train
405
406
  """
406
407
  if getattr(args, "save_dir", None):
407
408
  save_dir = args.save_dir
408
409
  else:
409
410
  from ultralytics.utils.files import increment_path
410
411
 
411
- runs = (ROOT.parent / "tests/tmp/runs" if TESTS_RUNNING else RUNS_DIR) / args.task
412
- nested = args.project and len(Path(args.project).parts) > 1 # e.g. "user/project" or "org\repo"
413
- project = runs / args.project if nested else args.project or runs
412
+ project = args.project or ""
413
+ if not Path(project).is_absolute():
414
+ project = (ROOT.parent / "tests/tmp/runs" if TESTS_RUNNING else RUNS_DIR) / args.task / project
414
415
  name = name or args.name or f"{args.mode}"
415
416
  save_dir = increment_path(Path(project) / name, exist_ok=args.exist_ok if RANK in {-1, 0} else True)
416
417