Skip to content

Commit dd428a3

Browse files
author
Jarvis
committed
fix(yolo): 修复模型下载功能 - 只包含可用的YOLO11n系列模型
1 parent ac8121e commit dd428a3

14 files changed

+1318
-33
lines changed

available_models.json

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{
2+
"yolo11n-cls": {
3+
"url": "https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n-cls.onnx",
4+
"size_mb": 10.769930839538574,
5+
"release": "v8.3.0"
6+
},
7+
"yolo11n-obb": {
8+
"url": "https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n-obb.onnx",
9+
"size_mb": 10.493975639343262,
10+
"release": "v8.3.0"
11+
},
12+
"yolo11n-pose": {
13+
"url": "https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n-pose.onnx",
14+
"size_mb": 11.30433177947998,
15+
"release": "v8.3.0"
16+
},
17+
"yolo11n-seg": {
18+
"url": "https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n-seg.onnx",
19+
"size_mb": 11.218754768371582,
20+
"release": "v8.3.0"
21+
},
22+
"yolo11n": {
23+
"url": "https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n.onnx",
24+
"size_mb": 10.423833847045898,
25+
"release": "v8.3.0"
26+
}
27+
}

available_models.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
2+
// Rust代码生成 - 可用的模型URL映射
3+
// 自动从GitHub API获取
4+
5+
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
6+
pub struct ModelInfo {
7+
pub url: String,
8+
pub size_mb: f64,
9+
pub release: String,
10+
}
11+
12+
/// 获取所有可用的预训练模型列表
13+
pub fn get_available_models() -> std::collections::HashMap<String, ModelInfo> {
14+
let mut models = std::collections::HashMap::new();
15+
16+
models.insert("yolo11n".to_string(), ModelInfo {
17+
url: "https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n.onnx".to_string(),
18+
size_mb: 10.423833847045898,
19+
release: "v8.3.0".to_string(),
20+
});
21+
22+
models.insert("yolo11n-cls".to_string(), ModelInfo {
23+
url: "https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n-cls.onnx".to_string(),
24+
size_mb: 10.769930839538574,
25+
release: "v8.3.0".to_string(),
26+
});
27+
28+
models.insert("yolo11n-obb".to_string(), ModelInfo {
29+
url: "https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n-obb.onnx".to_string(),
30+
size_mb: 10.493975639343262,
31+
release: "v8.3.0".to_string(),
32+
});
33+
34+
models.insert("yolo11n-pose".to_string(), ModelInfo {
35+
url: "https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n-pose.onnx".to_string(),
36+
size_mb: 11.30433177947998,
37+
release: "v8.3.0".to_string(),
38+
});
39+
40+
models.insert("yolo11n-seg".to_string(), ModelInfo {
41+
url: "https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n-seg.onnx".to_string(),
42+
size_mb: 11.218754768371582,
43+
release: "v8.3.0".to_string(),
44+
});
45+
46+
models
47+
}

available_models.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# 可用的YOLO模型URL
2+
# 格式: 模型名称, URL, 大小(MB)
3+
4+
yolo11n|https://github.com/ultralytics/assets/releases/download/v8.4.0/yolo11n.onnx|10.42

check_all_yolo_models.py

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
#!/usr/bin/env python3
2+
"""
3+
检查所有可用的YOLO模型URL
4+
"""
5+
import requests
6+
import time
7+
import concurrent.futures
8+
9+
# YOLO11 URLs (最新版本)
10+
YOLO11_URLS = {
11+
"yolo11n": "https://github.com/ultralytics/assets/releases/download/v8.4.0/yolo11n.onnx",
12+
"yolo11s": "https://github.com/ultralytics/assets/releases/download/v8.4.0/yolo11s.onnx",
13+
"yolo11m": "https://github.com/ultralytics/assets/releases/download/v8.4.0/yolo11m.onnx",
14+
"yolo11l": "https://github.com/ultralytics/assets/releases/download/v8.4.0/yolo11l.onnx",
15+
"yolo11x": "https://github.com/ultralytics/assets/releases/download/v8.4.0/yolo11x.onnx",
16+
}
17+
18+
# YOLOv8 URLs (旧版本)
19+
YOLOV8_URLS = {
20+
"yolov8n": "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n.onnx",
21+
"yolov8s": "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8s.onnx",
22+
"yolov8m": "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8m.onnx",
23+
"yolov8l": "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8l.onnx",
24+
"yolov8x": "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8x.onnx",
25+
}
26+
27+
# YOLOv8 segmentation URLs
28+
YOLOV8_SEG_URLS = {
29+
"yolov8n-seg": "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n-seg.onnx",
30+
"yolov8s-seg": "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8s-seg.onnx",
31+
"yolov8m-seg": "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8m-seg.onnx",
32+
"yolov8l-seg": "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8l-seg.onnx",
33+
"yolov8x-seg": "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8x-seg.onnx",
34+
}
35+
36+
# YOLOv8 pose URLs
37+
YOLOV8_POSE_URLS = {
38+
"yolov8n-pose": "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n-pose.onnx",
39+
"yolov8s-pose": "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8s-pose.onnx",
40+
"yolov8m-pose": "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8m-pose.onnx",
41+
"yolov8l-pose": "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8l-pose.onnx",
42+
"yolov8x-pose": "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8x-pose.onnx",
43+
}
44+
45+
# YOLOv8 classify URLs
46+
YOLOV8_CLS_URLS = {
47+
"yolov8n-cls": "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n-cls.onnx",
48+
"yolov8s-cls": "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8s-cls.onnx",
49+
"yolov8m-cls": "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8m-cls.onnx",
50+
"yolov8l-cls": "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8l-cls.onnx",
51+
"yolov8x-cls": "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8x-cls.onnx",
52+
}
53+
54+
# 合并所有URL
55+
ALL_URLS = {}
56+
ALL_URLS.update(YOLO11_URLS)
57+
ALL_URLS.update(YOLOV8_URLS)
58+
ALL_URLS.update(YOLOV8_SEG_URLS)
59+
ALL_URLS.update(YOLOV8_POSE_URLS)
60+
ALL_URLS.update(YOLOV8_CLS_URLS)
61+
62+
def check_url(name_url):
63+
"""检查单个URL是否有效"""
64+
name, url = name_url
65+
try:
66+
response = requests.head(url, timeout=10, allow_redirects=True)
67+
size_mb = float(response.headers.get('content-length', 0)) / (1024 * 1024)
68+
status = "✓ OK" if response.status_code == 200 else f"✗ {response.status_code}"
69+
print(f"{status:12} | {name:20} | {size_mb:8.2f} MB | {url}")
70+
return (name, url, response.status_code, size_mb)
71+
except Exception as e:
72+
print(f"{'✗ ERROR':12} | {name:20} | {'':8} | {url} - {str(e)}")
73+
return (name, url, 0, 0)
74+
75+
def main():
76+
print("=" * 120)
77+
print("检查所有YOLO模型URL有效性")
78+
print("=" * 120)
79+
print(f"{'状态':12} | {'模型名称':20} | {'大小':8} | URL")
80+
print("-" * 120)
81+
82+
working = []
83+
not_working = []
84+
85+
# 使用线程池并发检查
86+
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
87+
results = list(executor.map(check_url, ALL_URLS.items()))
88+
89+
print("\n" + "=" * 120)
90+
print("总结:")
91+
for name, url, status, size in results:
92+
if status == 200:
93+
working.append((name, url, size))
94+
else:
95+
not_working.append((name, url, status))
96+
97+
print(f"可用模型: {len(working)}/{len(ALL_URLS)}")
98+
if working:
99+
print("\n可用的模型:")
100+
for name, url, size in working:
101+
print(f" - {name}: {size:.2f} MB")
102+
103+
if not_working:
104+
print(f"\n不可用的模型: {len(not_working)}")
105+
for name, url, status in not_working:
106+
print(f" - {name}: HTTP {status}")
107+
108+
print("=" * 120)
109+
110+
# 保存可用的URL到文件
111+
if working:
112+
with open("available_models.txt", "w", encoding="utf-8") as f:
113+
f.write("# 可用的YOLO模型URL\n")
114+
f.write("# 格式: 模型名称, URL, 大小(MB)\n\n")
115+
for name, url, size in working:
116+
f.write(f"{name}|{url}|{size:.2f}\n")
117+
print("\n可用的模型列表已保存到 available_models.txt")
118+
119+
if __name__ == "__main__":
120+
main()

check_multiple_sources.py

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
#!/usr/bin/env python3
2+
"""
3+
检查多个YOLO模型下载源
4+
"""
5+
import requests
6+
import json
7+
8+
# 定义要测试的模型
9+
models_to_test = [
10+
# YOLO11 - GitHub (v8.3.0)
11+
("yolo11n", "https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n.onnx"),
12+
("yolo11s", "https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11s.onnx"),
13+
("yolo11m", "https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11m.onnx"),
14+
("yolo11l", "https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11l.onnx"),
15+
("yolo11x", "https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11x.onnx"),
16+
17+
# YOLOv8 - GitHub (v8.2.0)
18+
("yolov8n", "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n.onnx"),
19+
("yolov8s", "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8s.onnx"),
20+
("yolov8m", "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8m.onnx"),
21+
("yolov8l", "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8l.onnx"),
22+
("yolov8x", "https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8x.onnx"),
23+
24+
# ModelScope URLs (中国镜像)
25+
("yolo11n-modelscope", "https://www.modelscope.cn/models/AI-ModelScope/YOLOv11n/resolve/master/yolo11n.onnx"),
26+
("yolo11s-modelscope", "https://www.modelscope.cn/models/AI-ModelScope/YOLOv11s/resolve/master/yolo11s.onnx"),
27+
("yolov8n-modelscope", "https://www.modelscope.cn/models/AI-ModelScope/YOLOv8n/resolve/master/yolov8n.onnx"),
28+
("yolov8s-modelscope", "https://www.modelscope.cn/models/AI-ModelScope/YOLOv8s/resolve/master/yolov8s.onnx"),
29+
("yolov8m-modelscope", "https://www.modelscope.cn/models/AI-ModelScope/YOLOv8m/resolve/master/yolov8m.onnx"),
30+
]
31+
32+
def check_url(name, url):
33+
"""检查URL是否可访问"""
34+
try:
35+
# 使用HEAD请求,只获取头部信息
36+
response = requests.head(url, timeout=15, allow_redirects=True)
37+
content_length = response.headers.get('content-length')
38+
size_mb = float(content_length) / (1024 * 1024) if content_length else 0
39+
40+
return {
41+
'name': name,
42+
'url': url,
43+
'status': response.status_code,
44+
'size_mb': size_mb,
45+
'ok': response.status_code == 200
46+
}
47+
except Exception as e:
48+
return {
49+
'name': name,
50+
'url': url,
51+
'status': 0,
52+
'size_mb': 0,
53+
'ok': False,
54+
'error': str(e)
55+
}
56+
57+
def main():
58+
print("="*120)
59+
print("YOLO模型多源检查")
60+
print("="*120)
61+
62+
results = []
63+
for name, url in models_to_test:
64+
print(f"检查 {name}...", end=" ", flush=True)
65+
result = check_url(name, url)
66+
results.append(result)
67+
if result['ok']:
68+
print(f"✓ {result['size_mb']:.2f} MB")
69+
elif result['status'] == 0:
70+
print(f"✗ 错误: {result.get('error', '未知')}")
71+
else:
72+
print(f"✗ HTTP {result['status']}")
73+
74+
print("\n" + "="*120)
75+
print("总结:")
76+
print("="*120)
77+
78+
working = [r for r in results if r['ok']]
79+
not_working = [r for r in results if not r['ok']]
80+
81+
print(f"\n可用的模型: {len(working)}/{len(results)}")
82+
if working:
83+
print("\n可用的下载源:")
84+
for r in working:
85+
print(f" ✓ {r['name']:30} | {r['size_mb']:7.2f} MB | {r['url']}")
86+
87+
if not_working:
88+
print(f"\n不可用的下载源: {len(not_working)}")
89+
for r in not_working:
90+
error_info = f" - {r.get('error', '')}" if r.get('error') else ""
91+
print(f" ✗ {r['name']:30} | HTTP {r['status']}{error_info}")
92+
93+
# 保存结果
94+
with open('model_urls_check.json', 'w', encoding='utf-8') as f:
95+
json.dump({
96+
'working': working,
97+
'not_working': not_working
98+
}, f, indent=2, ensure_ascii=False)
99+
100+
print(f"\n✓ 检查结果已保存到 model_urls_check.json")
101+
102+
# 生成Rust可用的代码
103+
if working:
104+
print("\n" + "="*120)
105+
print("Rust代码 - 可用的模型:")
106+
print("="*120)
107+
print('''
108+
#[derive(Debug, Clone)]
109+
pub struct ModelDownloadInfo {
110+
pub name: String,
111+
pub url: String,
112+
pub size_mb: f64,
113+
}
114+
115+
pub fn get_available_model_urls() -> Vec<ModelDownloadInfo> {
116+
vec![
117+
''')
118+
for r in working:
119+
print(f' ModelDownloadInfo {{')
120+
print(f' name: "{r["name"]}".to_string(),')
121+
print(f' url: "{r["url"]}".to_string(),')
122+
print(f' size_mb: {r["size_mb"]:.2f},')
123+
print(f' }},')
124+
print(' ]')
125+
print('}')
126+
127+
if __name__ == "__main__":
128+
main()

0 commit comments

Comments
 (0)