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.
- {dgenerate_ultralytics_headless-8.4.6.dist-info → dgenerate_ultralytics_headless-8.4.8.dist-info}/METADATA +3 -3
- {dgenerate_ultralytics_headless-8.4.6.dist-info → dgenerate_ultralytics_headless-8.4.8.dist-info}/RECORD +37 -36
- {dgenerate_ultralytics_headless-8.4.6.dist-info → dgenerate_ultralytics_headless-8.4.8.dist-info}/WHEEL +1 -1
- tests/test_cli.py +10 -3
- tests/test_exports.py +64 -43
- tests/test_python.py +40 -11
- ultralytics/__init__.py +1 -1
- ultralytics/cfg/__init__.py +5 -4
- ultralytics/cfg/datasets/coco12-formats.yaml +101 -0
- ultralytics/cfg/default.yaml +2 -1
- ultralytics/data/augment.py +8 -0
- ultralytics/data/converter.py +32 -9
- ultralytics/data/utils.py +2 -2
- ultralytics/engine/exporter.py +10 -6
- ultralytics/engine/predictor.py +5 -0
- ultralytics/engine/trainer.py +6 -4
- 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 +8 -4
- 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 +1 -1
- 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/callbacks/wb.py +6 -1
- ultralytics/utils/loss.py +18 -9
- ultralytics/utils/patches.py +42 -0
- ultralytics/utils/tal.py +15 -5
- ultralytics/utils/torch_utils.py +1 -1
- {dgenerate_ultralytics_headless-8.4.6.dist-info → dgenerate_ultralytics_headless-8.4.8.dist-info}/entry_points.txt +0 -0
- {dgenerate_ultralytics_headless-8.4.6.dist-info → dgenerate_ultralytics_headless-8.4.8.dist-info}/licenses/LICENSE +0 -0
- {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.
|
|
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
|
|
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.
|
|
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
|
|
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=
|
|
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=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=
|
|
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
|
|
@@ -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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
139
|
+
ultralytics/engine/predictor.py,sha256=x3xzVlfj92HgLdxPvoKFKpyzp1wSsNVCahpbO5sse80,23102
|
|
139
140
|
ultralytics/engine/results.py,sha256=Lg-Ke8TU6qaxu0wQtOH26unORj4FRYxd8RL0VxV74Zw,68333
|
|
140
|
-
ultralytics/engine/trainer.py,sha256=
|
|
141
|
-
ultralytics/engine/tuner.py,sha256=
|
|
142
|
-
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
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
224
|
-
ultralytics/nn/tasks.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
286
|
-
ultralytics/utils/torch_utils.py,sha256=
|
|
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=
|
|
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.
|
|
307
|
-
dgenerate_ultralytics_headless-8.4.
|
|
308
|
-
dgenerate_ultralytics_headless-8.4.
|
|
309
|
-
dgenerate_ultralytics_headless-8.4.
|
|
310
|
-
dgenerate_ultralytics_headless-8.4.
|
|
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,,
|
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_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
|
@@ -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
|
|
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="
|
|
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
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
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
ultralytics/cfg/__init__.py
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
412
|
-
|
|
413
|
-
|
|
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
|
|