|
| 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() |
0 commit comments