dgenerate-ultralytics-headless 8.4.7__py3-none-any.whl → 8.4.9__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.
- {dgenerate_ultralytics_headless-8.4.7.dist-info → dgenerate_ultralytics_headless-8.4.9.dist-info}/METADATA +3 -3
- {dgenerate_ultralytics_headless-8.4.7.dist-info → dgenerate_ultralytics_headless-8.4.9.dist-info}/RECORD +36 -36
- {dgenerate_ultralytics_headless-8.4.7.dist-info → dgenerate_ultralytics_headless-8.4.9.dist-info}/WHEEL +1 -1
- tests/test_cli.py +10 -3
- tests/test_cuda.py +1 -1
- tests/test_exports.py +64 -43
- tests/test_python.py +16 -12
- ultralytics/__init__.py +1 -1
- ultralytics/cfg/__init__.py +1 -0
- ultralytics/cfg/default.yaml +1 -0
- ultralytics/data/augment.py +2 -2
- ultralytics/data/converter.py +11 -0
- ultralytics/engine/exporter.py +13 -16
- ultralytics/engine/predictor.py +5 -0
- ultralytics/engine/trainer.py +3 -3
- ultralytics/engine/tuner.py +2 -2
- ultralytics/engine/validator.py +5 -0
- ultralytics/models/sam/predict.py +2 -2
- ultralytics/models/yolo/classify/train.py +14 -1
- ultralytics/models/yolo/detect/train.py +4 -2
- ultralytics/models/yolo/pose/train.py +2 -1
- ultralytics/models/yolo/world/train_world.py +21 -1
- ultralytics/models/yolo/yoloe/train.py +1 -2
- ultralytics/nn/autobackend.py +22 -6
- ultralytics/nn/modules/head.py +13 -2
- ultralytics/nn/tasks.py +18 -0
- ultralytics/solutions/security_alarm.py +1 -1
- ultralytics/utils/benchmarks.py +3 -9
- ultralytics/utils/checks.py +18 -3
- ultralytics/utils/dist.py +9 -3
- ultralytics/utils/loss.py +4 -5
- ultralytics/utils/tal.py +15 -5
- ultralytics/utils/torch_utils.py +2 -1
- {dgenerate_ultralytics_headless-8.4.7.dist-info → dgenerate_ultralytics_headless-8.4.9.dist-info}/entry_points.txt +0 -0
- {dgenerate_ultralytics_headless-8.4.7.dist-info → dgenerate_ultralytics_headless-8.4.9.dist-info}/licenses/LICENSE +0 -0
- {dgenerate_ultralytics_headless-8.4.7.dist-info → dgenerate_ultralytics_headless-8.4.9.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.
|
|
3
|
+
Version: 8.4.9
|
|
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
|
|
43
|
-
Requires-Dist: torch!=2.4.0
|
|
42
|
+
Requires-Dist: torch>=1.8.0
|
|
43
|
+
Requires-Dist: torch!=2.4.0,>=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.
|
|
1
|
+
dgenerate_ultralytics_headless-8.4.9.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
|
|
5
|
-
tests/test_cuda.py,sha256=
|
|
4
|
+
tests/test_cli.py,sha256=-OrAcZlcJ07UPagjSOlR8qXP5gNFHaTYcW3paOTURAE,5725
|
|
5
|
+
tests/test_cuda.py,sha256=V0dPXBinxDOlFA4NDlD2HuYM41KBhLAdt06adEDeP20,8440
|
|
6
6
|
tests/test_engine.py,sha256=ufSn3X4kL_Lpn2O25jKAfw_9QwHTMRjP9shDdpgBqnY,5740
|
|
7
|
-
tests/test_exports.py,sha256=
|
|
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=
|
|
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=
|
|
11
|
+
ultralytics/__init__.py,sha256=QNUx0fvpKV5GANkIcj2VFs06MxGldr-UqD2L3aJngao,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=
|
|
16
|
-
ultralytics/cfg/default.yaml,sha256=
|
|
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
|
|
@@ -120,10 +120,10 @@ ultralytics/cfg/trackers/botsort.yaml,sha256=tRxC-qT4Wz0mLn5x7ZEwrqgGKrmTDVY7gMg
|
|
|
120
120
|
ultralytics/cfg/trackers/bytetrack.yaml,sha256=7LS1ObP5u7BUFcmeY6L2m3bRuPUktnpJspFKd_ElVWc,908
|
|
121
121
|
ultralytics/data/__init__.py,sha256=ToR8zl0JhBHy42ZvV7zIwO_F3lbi5oNlGQNPK3dlddU,644
|
|
122
122
|
ultralytics/data/annotator.py,sha256=iu1En-LzlR4RyR3ocftthnAog_peQHV9ForPRo_QcX8,2985
|
|
123
|
-
ultralytics/data/augment.py,sha256=
|
|
123
|
+
ultralytics/data/augment.py,sha256=z11SV8ikxHN59_ebvX_45dXH7iX1f8RG1MtANfdFK5E,128562
|
|
124
124
|
ultralytics/data/base.py,sha256=pMs8yJOmAFPXdgfLCDtUemSvkPNDzxReP-fWzkNtonc,19723
|
|
125
125
|
ultralytics/data/build.py,sha256=s-tkSZPf3OfQyfXPXB9XxdW_gIcU6Xy_u21ekSgTnRo,17205
|
|
126
|
-
ultralytics/data/converter.py,sha256=
|
|
126
|
+
ultralytics/data/converter.py,sha256=4SwrEKzsdKK3YcoCcEhu0_UmFyaUuQEVPIWENFxlAC4,34520
|
|
127
127
|
ultralytics/data/dataset.py,sha256=r_BZy4FwMZ-dYkaJiz1E3jr2pI6dn7V3hZwf2RM9_RQ,36536
|
|
128
128
|
ultralytics/data/loaders.py,sha256=BQbhgjiLCGcRBPkGVG9Hr1jeNfG1nuZD3jstiWb7zS8,31889
|
|
129
129
|
ultralytics/data/split.py,sha256=HpR0ltf5oN1DpZstavFbBFC1YdpGPaATXxDOcAMwOqc,5101
|
|
@@ -134,13 +134,13 @@ ultralytics/data/scripts/get_coco.sh,sha256=UuJpJeo3qQpTHVINeOpmP0NYmg8PhEFE3A8J
|
|
|
134
134
|
ultralytics/data/scripts/get_coco128.sh,sha256=qmRQl_hOKrsdHrTrnyQuFIH01oDz3lfaz138OgGfLt8,650
|
|
135
135
|
ultralytics/data/scripts/get_imagenet.sh,sha256=hr42H16bM47iT27rgS7MpEo-GeOZAYUQXgr0B2cwn48,1705
|
|
136
136
|
ultralytics/engine/__init__.py,sha256=lm6MckFYCPTbqIoX7w0s_daxdjNeBeKW6DXppv1-QUM,70
|
|
137
|
-
ultralytics/engine/exporter.py,sha256=
|
|
137
|
+
ultralytics/engine/exporter.py,sha256=FUG4OyzjSNWlMu__q81YLCM1ZtIObWynsbZgIEtN_FA,73168
|
|
138
138
|
ultralytics/engine/model.py,sha256=euDHUy7J5vVBvS_d-KbGZd_0BP5bF6Y3cTQ7VXtwZ4k,53210
|
|
139
|
-
ultralytics/engine/predictor.py,sha256=
|
|
139
|
+
ultralytics/engine/predictor.py,sha256=x3xzVlfj92HgLdxPvoKFKpyzp1wSsNVCahpbO5sse80,23102
|
|
140
140
|
ultralytics/engine/results.py,sha256=Lg-Ke8TU6qaxu0wQtOH26unORj4FRYxd8RL0VxV74Zw,68333
|
|
141
|
-
ultralytics/engine/trainer.py,sha256=
|
|
142
|
-
ultralytics/engine/tuner.py,sha256=
|
|
143
|
-
ultralytics/engine/validator.py,sha256=
|
|
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
|
|
144
144
|
ultralytics/hub/__init__.py,sha256=Z0K_E00jzQh90b18q3IDChwVmTvyIYp6C00sCV-n2F8,6709
|
|
145
145
|
ultralytics/hub/auth.py,sha256=ANzCeZA7lUzTWc_sFHbDuuyBh1jLl2sTpHkoUbIkFYE,6254
|
|
146
146
|
ultralytics/hub/session.py,sha256=OzBXAL9R135gRDdfNYUqyiSrxOyaiMFCVYSZua99sF0,18364
|
|
@@ -166,7 +166,7 @@ ultralytics/models/sam/amg.py,sha256=aYvJ7jQMkTR3X9KV7SHi3qP3yNchQggWNUurTRZwxQg
|
|
|
166
166
|
ultralytics/models/sam/build.py,sha256=rEaFXA4R1nyutSonIenRKcuNtO1FgEojnkcayo0FTP4,12867
|
|
167
167
|
ultralytics/models/sam/build_sam3.py,sha256=Gg_LiqNrCDTYaDWrob05vj-ln2AhkfMa5KkKhyk5wdE,11976
|
|
168
168
|
ultralytics/models/sam/model.py,sha256=cOawDSkFqJPbt3455aTZ8tjaoWshFWFHQGGqxzsL_QQ,7372
|
|
169
|
-
ultralytics/models/sam/predict.py,sha256=
|
|
169
|
+
ultralytics/models/sam/predict.py,sha256=k4eTU3g7ihvAn-moBpzR4ox1GUlOEHVQDzywbnheFFM,203651
|
|
170
170
|
ultralytics/models/sam/modules/__init__.py,sha256=lm6MckFYCPTbqIoX7w0s_daxdjNeBeKW6DXppv1-QUM,70
|
|
171
171
|
ultralytics/models/sam/modules/blocks.py,sha256=ZU2aY4h6fmosj5pZ5EOEuO1O8Cl8UYeH11eOxkqCt8M,44570
|
|
172
172
|
ultralytics/models/sam/modules/decoders.py,sha256=G4li37ahUe5rTTNTKibWMsAoz6G3R18rI8OPvfunVX8,25045
|
|
@@ -194,11 +194,11 @@ ultralytics/models/yolo/__init__.py,sha256=YD407NDDiyjo0x_MR6usJaTpePKPgsfBUYehl
|
|
|
194
194
|
ultralytics/models/yolo/model.py,sha256=HXkglzJQqW1x7MJaKavI5aasA-0lSH21Xcv_dac3SFU,18504
|
|
195
195
|
ultralytics/models/yolo/classify/__init__.py,sha256=9--HVaNOfI1K7rn_rRqclL8FUAnpfeBrRqEQIaQw2xM,383
|
|
196
196
|
ultralytics/models/yolo/classify/predict.py,sha256=HCStYkSqeg32SNTWfr4FDCkUMQ4wnKqceUK3T995us4,4137
|
|
197
|
-
ultralytics/models/yolo/classify/train.py,sha256=
|
|
197
|
+
ultralytics/models/yolo/classify/train.py,sha256=xPlpioQFPeH32Frhy9ZbbGV_wcpn9hPB4EB4N0Kw-DE,9614
|
|
198
198
|
ultralytics/models/yolo/classify/val.py,sha256=akH2P3nff4oiZtV2toKB3Z9HIbsVcwsb1uvDwhamszw,10503
|
|
199
199
|
ultralytics/models/yolo/detect/__init__.py,sha256=GIRsLYR-kT4JJx7lh4ZZAFGBZj0aebokuU0A7JbjDVA,257
|
|
200
200
|
ultralytics/models/yolo/detect/predict.py,sha256=2nxlMyw_zVKq1aeJFRTgb4EGL2vOFq4pLT9tArHBfF8,5385
|
|
201
|
-
ultralytics/models/yolo/detect/train.py,sha256=
|
|
201
|
+
ultralytics/models/yolo/detect/train.py,sha256=9JwTYi6M33cGhmAmdl099Bjrjb7woqu7fJSJgoivubk,10736
|
|
202
202
|
ultralytics/models/yolo/detect/val.py,sha256=54AOR6r3istE0pILJ1v4xzPdv7UcvtTEZ6E5OGj3Jgc,22818
|
|
203
203
|
ultralytics/models/yolo/obb/__init__.py,sha256=tQmpG8wVHsajWkZdmD6cjGohJ4ki64iSXQT8JY_dydo,221
|
|
204
204
|
ultralytics/models/yolo/obb/predict.py,sha256=I7hWDr1zuy2WuwGom9uzXqomfr7qVMWb7iRl18xdTYw,2577
|
|
@@ -206,7 +206,7 @@ ultralytics/models/yolo/obb/train.py,sha256=HEDdPiP-yBbrUQWllcD1rc3gGrbzQmT6RBMT
|
|
|
206
206
|
ultralytics/models/yolo/obb/val.py,sha256=qYNe7ZcW3rhTLYPw15OeGfBaqaa_f1ADs4FF21h32e4,14513
|
|
207
207
|
ultralytics/models/yolo/pose/__init__.py,sha256=_9OFLj19XwvJHBRxQtVW5CV7rvJ_3hDPE97miit0sPc,227
|
|
208
208
|
ultralytics/models/yolo/pose/predict.py,sha256=6EW9palcAoWX-gu5ROQvO6AxBSm719934hhqF-9OGjM,3118
|
|
209
|
-
ultralytics/models/yolo/pose/train.py,sha256=
|
|
209
|
+
ultralytics/models/yolo/pose/train.py,sha256=pXYpkPU3SmPqw_gVONUFsikhlO4aw-j6Ry17ep5SlqI,4816
|
|
210
210
|
ultralytics/models/yolo/pose/val.py,sha256=0luDccEPb_lUMjzaBb5VMsh9RdXVAbxb3Br57VKWNdc,12004
|
|
211
211
|
ultralytics/models/yolo/segment/__init__.py,sha256=3IThhZ1wlkY9FvmWm9cE-5-ZyE6F1FgzAtQ6jOOFzzw,275
|
|
212
212
|
ultralytics/models/yolo/segment/predict.py,sha256=zLhmSTVEnaUumIX9SbjZH09kr2VrNdYWEss7FvseVuY,5428
|
|
@@ -214,21 +214,21 @@ ultralytics/models/yolo/segment/train.py,sha256=nS3qrT7Y3swCwjGZzeDQ2EunC9ilMsOi
|
|
|
214
214
|
ultralytics/models/yolo/segment/val.py,sha256=AvPS4rhV2PFpi0yixUfJhdczXctmZQSKgTjh7qVH0To,13204
|
|
215
215
|
ultralytics/models/yolo/world/__init__.py,sha256=nlh8I6t8hMGz_vZg8QSlsUW1R-2eKvn9CGUoPPQEGhA,131
|
|
216
216
|
ultralytics/models/yolo/world/train.py,sha256=80kswko6Zu7peXPBhXcfrTo5HO3Rg8C_cu4vPBQlk7M,7906
|
|
217
|
-
ultralytics/models/yolo/world/train_world.py,sha256=
|
|
217
|
+
ultralytics/models/yolo/world/train_world.py,sha256=se78I38c7rC2W76Fe0cg9axsK3JixMOafM1PpPZf1cE,9437
|
|
218
218
|
ultralytics/models/yolo/yoloe/__init__.py,sha256=zaZo1_ommaxNv7mD7xpdSomNF4s8mpOcCVTXspg0ncY,760
|
|
219
219
|
ultralytics/models/yolo/yoloe/predict.py,sha256=zeu_whH4e2SIWXV8MmJ1NNzoM_cNsiI2kOTjlAhV4qg,7065
|
|
220
|
-
ultralytics/models/yolo/yoloe/train.py,sha256=
|
|
220
|
+
ultralytics/models/yolo/yoloe/train.py,sha256=q7K1fiqKrpbjfrrd3F3FiVMPtQAVuVzQinIh0i1yz1g,13284
|
|
221
221
|
ultralytics/models/yolo/yoloe/train_seg.py,sha256=rV2Jnbuh6vvBMaupaZK_aRXBMevO0XhN2VUR43ZwlIY,5285
|
|
222
222
|
ultralytics/models/yolo/yoloe/val.py,sha256=utUFWeFKRFWZrPr1y3A8ztbTwdoWMYqzlwBN7CQ0tCA,9418
|
|
223
223
|
ultralytics/nn/__init__.py,sha256=538LZPUKKvc3JCMgiQ4VLGqRN2ZAaVLFcQbeNNHFkEA,545
|
|
224
|
-
ultralytics/nn/autobackend.py,sha256=
|
|
225
|
-
ultralytics/nn/tasks.py,sha256=
|
|
224
|
+
ultralytics/nn/autobackend.py,sha256=gqFej3DueyHWQ6Fy3HuUIVGGy8_iYkKkvklapmzLKH0,44939
|
|
225
|
+
ultralytics/nn/tasks.py,sha256=xclS6E6OIBDurrDscTVmVafvmd8JOIiagIT4iEGwD4M,72588
|
|
226
226
|
ultralytics/nn/text_model.py,sha256=c--WzxjFEDb7p95u3YGcSsJLjj91zFNqXshij8Evrwg,15291
|
|
227
227
|
ultralytics/nn/modules/__init__.py,sha256=9KyQBxpomp5uJJ1PvMGuOFs2pR3NpqZcFHJlM6Q56c0,3322
|
|
228
228
|
ultralytics/nn/modules/activation.py,sha256=J6n-CJKFK0YbhwcRDqm9zEJM9pSAEycj5quQss_3x6E,2219
|
|
229
229
|
ultralytics/nn/modules/block.py,sha256=9d1eelj3uRnf-HWTHYTjsBqLSpMCrwBQuX52MjeapN4,74499
|
|
230
230
|
ultralytics/nn/modules/conv.py,sha256=9WUlBzHD-wLgz0riLyttzASLIqBtXPK6Jk5EdyIiGCM,21100
|
|
231
|
-
ultralytics/nn/modules/head.py,sha256=
|
|
231
|
+
ultralytics/nn/modules/head.py,sha256=yeXKv9P6gxC7Zkvdu7ndQ8H7WDKnnoJ9yYyV6FkpUcY,78487
|
|
232
232
|
ultralytics/nn/modules/transformer.py,sha256=lAjTH-U8IkBp_1cXSOOFSus9tJf-s8WISKKcXPB84CM,31972
|
|
233
233
|
ultralytics/nn/modules/utils.py,sha256=EyhENse_RESlXjLHAJWvV07_tq1MVMmfzXgPR1fiT9w,6066
|
|
234
234
|
ultralytics/optim/__init__.py,sha256=Sl3Dx2eiaJd_u4VbmqcBqWWDF8FHnO5W0nBEL8_M_C4,130
|
|
@@ -246,7 +246,7 @@ ultralytics/solutions/object_cropper.py,sha256=WRbrfXAR5aD6PQBqJ-BvcVaiaqta_9YeT
|
|
|
246
246
|
ultralytics/solutions/parking_management.py,sha256=Q0fEFKlv6dKKWuw_4jmWaeHQVXGppzuU7Vr_HqVYqHM,13770
|
|
247
247
|
ultralytics/solutions/queue_management.py,sha256=NlVX6PMEaffjoZjfQrVyayaDUdtc0JF8GzTQrZFjpCg,4371
|
|
248
248
|
ultralytics/solutions/region_counter.py,sha256=IAvlFwEYoNftDzfBbdo5MzLwcuidOHW9oTGyRCDzMRc,6025
|
|
249
|
-
ultralytics/solutions/security_alarm.py,sha256=
|
|
249
|
+
ultralytics/solutions/security_alarm.py,sha256=ep53mA6h5a4pzPmVgoxBmRRgv6u9RDC7lG1H7Ipjko0,6293
|
|
250
250
|
ultralytics/solutions/similarity_search.py,sha256=Q2FOBUtEokegiJHlfDbPP0bKxr5F-sHN3-IvskDoe00,9644
|
|
251
251
|
ultralytics/solutions/solutions.py,sha256=ktLwDhC0y4k2FbNd0sk7Y8GcEvBu9wL3rXyFGwlbnIQ,36984
|
|
252
252
|
ultralytics/solutions/speed_estimation.py,sha256=WrZECxKAq6P4QpeTbhkp3-Rqjnox7tdR25fUxzozlpU,5861
|
|
@@ -266,10 +266,10 @@ ultralytics/trackers/utils/matching.py,sha256=x6uZOIx0O9oVmAcfY6tYMTJQE2cDTUlRR6
|
|
|
266
266
|
ultralytics/utils/__init__.py,sha256=XLEK_pvptzNWhJaO8x0MWghREIyEDei0LOGnUnmU1Kg,55145
|
|
267
267
|
ultralytics/utils/autobatch.py,sha256=jiE4m_--H9UkXFDm_FqzcZk_hSTCGpS72XdVEKgZwAo,5114
|
|
268
268
|
ultralytics/utils/autodevice.py,sha256=rXlPuo-iX-vZ4BabmMGEGh9Uxpau4R7Zlt1KCo9Xfyc,8892
|
|
269
|
-
ultralytics/utils/benchmarks.py,sha256=
|
|
270
|
-
ultralytics/utils/checks.py,sha256=
|
|
269
|
+
ultralytics/utils/benchmarks.py,sha256=y3aZ05qQhS2C3WI-iPeByOfmcaLLfXabsEufvXIv8lI,31819
|
|
270
|
+
ultralytics/utils/checks.py,sha256=_jGD-bdHafqcnrGmZOKiSwiKEL-DtyWsj21shdQxEeg,40198
|
|
271
271
|
ultralytics/utils/cpu.py,sha256=OksKOlX93AsbSsFuoYvLXRXgpkOibrZSwQyW6lipt4Q,3493
|
|
272
|
-
ultralytics/utils/dist.py,sha256=
|
|
272
|
+
ultralytics/utils/dist.py,sha256=GpdZLU3VQomg_dbHNMbzIgat-Y409plwcZJN5nF3YrU,4447
|
|
273
273
|
ultralytics/utils/downloads.py,sha256=TWXkYwR5hEpVMWL6fbjdywDmZe02WhyL_8YuLVce-uM,23069
|
|
274
274
|
ultralytics/utils/errors.py,sha256=dUZcTWpbJJHqEuWHM6IbeoJJ4TzA_yHBP8E7tEEpBVs,1388
|
|
275
275
|
ultralytics/utils/events.py,sha256=6vqs_iSxoXIhQ804sOjApNZmXwNW9FUFtjaHPY8ta10,4665
|
|
@@ -277,14 +277,14 @@ ultralytics/utils/files.py,sha256=u7pjz13wgkLSBfe_beeZrzar32_gaJWoIVa3nvY3mh8,81
|
|
|
277
277
|
ultralytics/utils/git.py,sha256=UdqeIiiEzg1qkerAZrg5YtTYPuJYwrpxW9N_6Pq6s8U,5501
|
|
278
278
|
ultralytics/utils/instance.py,sha256=11mhefvTI9ftMqSirXuiViAi0Fxlo6v84qvNxfRNUoE,18862
|
|
279
279
|
ultralytics/utils/logger.py,sha256=T5iaNnaqbCvx_FZf1dhVkr5FVxyxb4vO17t4SJfCIhg,19132
|
|
280
|
-
ultralytics/utils/loss.py,sha256=
|
|
280
|
+
ultralytics/utils/loss.py,sha256=7Z-CDlgsRldDart8j7ZjKot7TSj57IIwGj8C6QjTLx0,57003
|
|
281
281
|
ultralytics/utils/metrics.py,sha256=puMGn1LfVIlDvx5K7US4RtK8HYW6cRl9OznfV0nUPvk,69261
|
|
282
282
|
ultralytics/utils/nms.py,sha256=zv1rOzMF6WU8Kdk41VzNf1H1EMt_vZHcbDFbg3mnN2o,14248
|
|
283
283
|
ultralytics/utils/ops.py,sha256=4xqb7kwrAWm8c_zxOWP5JoXozgsA1Slk2s4XFwmEZCs,26089
|
|
284
284
|
ultralytics/utils/patches.py,sha256=yXkznJNo3M74gvvzWmHoZYbWFu-KnO3KK4usbmey8H0,8521
|
|
285
285
|
ultralytics/utils/plotting.py,sha256=_iXs4gs8tzMSgiKxCriD4un-MJkOsC3lGSy0wn7qZGk,48433
|
|
286
|
-
ultralytics/utils/tal.py,sha256=
|
|
287
|
-
ultralytics/utils/torch_utils.py,sha256=
|
|
286
|
+
ultralytics/utils/tal.py,sha256=9BSRgsYj0Llq7r5vOzkXDKUjfoTZsxiH92U09c6DtoU,24540
|
|
287
|
+
ultralytics/utils/torch_utils.py,sha256=H0ykzePdr55qPndFS9VVQCFH-fovbpK_uVBz4ooLvM8,40331
|
|
288
288
|
ultralytics/utils/tqdm.py,sha256=f2W608Qpvgu6tFi28qylaZpcRv3IX8wTGY_8lgicaqY,16343
|
|
289
289
|
ultralytics/utils/triton.py,sha256=BQu3CD3OlT76d1OtmnX5slQU37VC1kzRvEtfI2saIQA,5211
|
|
290
290
|
ultralytics/utils/tuner.py,sha256=nRMmnyp0B0gVJzAXcpCxQUnwXjVp0WNiSJwxyR2xvQM,7303
|
|
@@ -304,8 +304,8 @@ ultralytics/utils/export/__init__.py,sha256=Cfh-PwVfTF_lwPp-Ss4wiX4z8Sm1XRPklsqd
|
|
|
304
304
|
ultralytics/utils/export/engine.py,sha256=QoXPqnmQn6W5TOUAygOtCG63R9ExDG4-Df6X6W-_Mzo,10470
|
|
305
305
|
ultralytics/utils/export/imx.py,sha256=VnMDO7c8ezBs91UDoLg9rR0oY8Uc7FujKpbdGxrzV18,13744
|
|
306
306
|
ultralytics/utils/export/tensorflow.py,sha256=xHEcEM3_VeYctyqkJCpgkqcNie1M8xLqcFKr6uANEEQ,9951
|
|
307
|
-
dgenerate_ultralytics_headless-8.4.
|
|
308
|
-
dgenerate_ultralytics_headless-8.4.
|
|
309
|
-
dgenerate_ultralytics_headless-8.4.
|
|
310
|
-
dgenerate_ultralytics_headless-8.4.
|
|
311
|
-
dgenerate_ultralytics_headless-8.4.
|
|
307
|
+
dgenerate_ultralytics_headless-8.4.9.dist-info/METADATA,sha256=kAJE1cZEObznKjZJn5IN5Ua_F_j2CMdnT60gjk_238Q,40069
|
|
308
|
+
dgenerate_ultralytics_headless-8.4.9.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
309
|
+
dgenerate_ultralytics_headless-8.4.9.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
|
|
310
|
+
dgenerate_ultralytics_headless-8.4.9.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
|
|
311
|
+
dgenerate_ultralytics_headless-8.4.9.dist-info/RECORD,,
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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_cuda.py
CHANGED
|
@@ -120,7 +120,7 @@ def test_train():
|
|
|
120
120
|
device = tuple(DEVICES) if len(DEVICES) > 1 else DEVICES[0]
|
|
121
121
|
# NVIDIA Jetson only has one GPU and therefore skipping checks
|
|
122
122
|
if not IS_JETSON:
|
|
123
|
-
results = YOLO(MODEL).train(data="coco8.yaml", imgsz=64, epochs=1, device=device, batch=15)
|
|
123
|
+
results = YOLO(MODEL).train(data="coco8.yaml", imgsz=64, epochs=1, device=device, batch=15, compile=True)
|
|
124
124
|
results = YOLO(MODEL).train(data="coco128.yaml", imgsz=64, epochs=1, device=device, batch=15, val=False)
|
|
125
125
|
visible = eval(os.environ["CUDA_VISIBLE_DEVICES"])
|
|
126
126
|
assert visible == device, f"Passed GPUs '{device}', but used GPUs '{visible}'"
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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",
|
|
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
|
@@ -168,13 +168,13 @@ def test_predict_all_image_formats():
|
|
|
168
168
|
dataset_path = Path(data["path"])
|
|
169
169
|
|
|
170
170
|
# Collect all images from train and val
|
|
171
|
-
|
|
172
|
-
images
|
|
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]
|
|
173
174
|
assert len(images) == 12, f"Expected 12 images, found {len(images)}"
|
|
174
175
|
|
|
175
176
|
# Verify all format extensions are represented
|
|
176
177
|
extensions = {img.suffix.lower().lstrip(".") for img in images}
|
|
177
|
-
expected = {"avif", "bmp", "dng", "heic", "jp2", "jpeg", "jpg", "mpo", "png", "tif", "tiff", "webp"}
|
|
178
178
|
assert extensions == expected, f"Missing formats: {expected - extensions}"
|
|
179
179
|
|
|
180
180
|
# Run inference on all images
|
|
@@ -697,7 +697,7 @@ def test_yolo_world():
|
|
|
697
697
|
checks.IS_PYTHON_3_8 and LINUX and ARM64,
|
|
698
698
|
reason="YOLOE with CLIP is not supported in Python 3.8 and aarch64 Linux",
|
|
699
699
|
)
|
|
700
|
-
def test_yoloe():
|
|
700
|
+
def test_yoloe(tmp_path):
|
|
701
701
|
"""Test YOLOE models with MobileClip support."""
|
|
702
702
|
# Predict
|
|
703
703
|
# text-prompts
|
|
@@ -739,14 +739,18 @@ def test_yoloe():
|
|
|
739
739
|
imgsz=32,
|
|
740
740
|
)
|
|
741
741
|
# Train, from scratch
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
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
|
+
)
|
|
750
754
|
|
|
751
755
|
# prompt-free
|
|
752
756
|
# predict
|
ultralytics/__init__.py
CHANGED
ultralytics/cfg/__init__.py
CHANGED
ultralytics/cfg/default.yaml
CHANGED
|
@@ -56,6 +56,7 @@ max_det: 300 # (int) maximum number of detections per image
|
|
|
56
56
|
half: False # (bool) use half precision (FP16) if supported
|
|
57
57
|
dnn: False # (bool) use OpenCV DNN for ONNX inference
|
|
58
58
|
plots: True # (bool) save plots and images during train/val
|
|
59
|
+
end2end: # (bool, optional) whether to use end2end head(YOLO26, YOLOv10) for predict/val/export
|
|
59
60
|
|
|
60
61
|
# Predict settings -----------------------------------------------------------------------------------------------------
|
|
61
62
|
source: # (str, optional) path/dir/URL/stream for images or videos; e.g. 'ultralytics/assets' or '0' for webcam
|
ultralytics/data/augment.py
CHANGED
|
@@ -1745,7 +1745,7 @@ class CopyPaste(BaseMixTransform):
|
|
|
1745
1745
|
instances.convert_bbox(format="xyxy")
|
|
1746
1746
|
instances.denormalize(w, h)
|
|
1747
1747
|
|
|
1748
|
-
im_new = np.zeros(im.shape, np.uint8)
|
|
1748
|
+
im_new = np.zeros(im.shape[:2], np.uint8)
|
|
1749
1749
|
instances2 = labels2.pop("instances", None)
|
|
1750
1750
|
if instances2 is None:
|
|
1751
1751
|
instances2 = deepcopy(instances)
|
|
@@ -1758,7 +1758,7 @@ class CopyPaste(BaseMixTransform):
|
|
|
1758
1758
|
for j in indexes[: round(self.p * n)]:
|
|
1759
1759
|
cls = np.concatenate((cls, labels2.get("cls", cls)[[j]]), axis=0)
|
|
1760
1760
|
instances = Instances.concatenate((instances, instances2[[j]]), axis=0)
|
|
1761
|
-
cv2.drawContours(im_new, instances2.segments[[j]].astype(np.int32), -1,
|
|
1761
|
+
cv2.drawContours(im_new, instances2.segments[[j]].astype(np.int32), -1, 1, cv2.FILLED)
|
|
1762
1762
|
|
|
1763
1763
|
result = labels2.get("img", cv2.flip(im, 1)) # augment segments
|
|
1764
1764
|
if result.ndim == 2: # cv2.flip would eliminate the last dimension for grayscale images
|
ultralytics/data/converter.py
CHANGED
|
@@ -796,6 +796,17 @@ async def convert_ndjson_to_yolo(ndjson_path: str | Path, output_path: str | Pat
|
|
|
796
796
|
# Check if this is a classification dataset
|
|
797
797
|
is_classification = dataset_record.get("task") == "classify"
|
|
798
798
|
class_names = {int(k): v for k, v in dataset_record.get("class_names", {}).items()}
|
|
799
|
+
len(class_names)
|
|
800
|
+
|
|
801
|
+
# Validate required fields before downloading images
|
|
802
|
+
task = dataset_record.get("task", "detect")
|
|
803
|
+
if not is_classification:
|
|
804
|
+
if "train" not in splits:
|
|
805
|
+
raise ValueError(f"Dataset missing required 'train' split. Found splits: {sorted(splits)}")
|
|
806
|
+
if "val" not in splits and "test" not in splits:
|
|
807
|
+
raise ValueError(f"Dataset missing required 'val' split. Found splits: {sorted(splits)}")
|
|
808
|
+
if task == "pose" and "kpt_shape" not in dataset_record:
|
|
809
|
+
raise ValueError("Pose dataset missing required 'kpt_shape'. See https://docs.ultralytics.com/datasets/pose/")
|
|
799
810
|
|
|
800
811
|
# Create base directories
|
|
801
812
|
dataset_dir.mkdir(parents=True, exist_ok=True)
|