Python 通过 Shadowsocks SOCKS5 代理发送请求
核心原理 Python 不能直接解析 Shadowsocks 协议。标准做法是: Python ↓ SOCKS5 sslocal (本地 1080 端口) ↓ Shadowsocks 协议 远端 SS 服务器 ↓ 明文 目标网站先用 Shadowsocks 客户端在本地起一个 SOCKS5 代理,Python 通过这个代理访问外网。 方法一:requests[socks](推荐) 安装: pip install requests[socks]使用: import requestsproxies = { "http": "socks5://127.0.0.1:1080", "https": "socks5://127.0.0.1:1080" }r = requests.get( "https://httpbin.org/ip", proxies=proxies, timeout=10 )print(r.json())socks5:// 使用远端 DNS 解析;如果想让本地 DNS 解析,换成 socks5h://。 方法二:PySocks 全局劫持 安装: pip install pysocks设置全局默认代理,之后所有 socket 连接都走 SOCKS5: import socket import sockssocks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 1080) socket.socket = socks.socksocketimport requestsr = requests.get("https://httpbin.org/ip") print(r.json())适合需要代理所有网络调用(requests、httpx、urllib 等)的场景,但会影响进程内所有 socket,慎用。 方法三:环境变量 export ALL_PROXY=socks5://127.0.0.1:1080 export HTTPS_PROXY=socks5://127.0.0.1:1080 export HTTP_PROXY=socks5://127.0.0.1:1080或者在 Python 代码里设置: import osos.environ["ALL_PROXY"] = "socks5://127.0.0.1:1080"import requestsr = requests.get("https://httpbin.org/ip") print(r.json())requests 会自动读取 HTTP_PROXY / HTTPS_PROXY / ALL_PROXY 环境变量。 在代码里启动 sslocal 如果想让 Python 程序自己管理 Shadowsocks 子进程: import subprocess import time import requestsproc = subprocess.Popen([ "sslocal", "-s", "服务器IP", "-p", "8388", "-k", "密码", "-m", "aes-256-gcm", "-l", "1080" ], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)time.sleep(1) # 等待 sslocal 就绪proxies = { "http": "socks5://127.0.0.1:1080", "https": "socks5://127.0.0.1:1080" }try: r = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=10) print(r.json()) finally: proc.terminate()sslocal 来自 shadowsocks-libev 或 shadowsocks-rust 包,需要提前安装。 验证代理是否生效 import requestsproxies = { "http": "socks5://127.0.0.1:1080", "https": "socks5://127.0.0.1:1080" }r = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=10) print(r.json()) # 返回的 origin IP 应为代理服务器 IP,不是本机 IP
目标检测辅助标注:GroundingDINO、SAM2 与 Florence-2 实用指南
为什么需要辅助标注 手动标注几万张图片耗时数周,且容易出现漏标和错标。开放词汇检测(Open-Vocabulary Detection)模型可以:输入文字描述的类别 直接输出检测框 人工只做最终校验流程: 原始图片 ↓ GroundingDINO(文字→检测框) ↓ 人工检查 + 修正 ↓ YOLO 训练GroundingDINO:文字驱动检测 不需要预先训练,直接用类别名称描述来检测: from groundingdino.util.inference import load_model, load_image, predictmodel = load_model("groundingdino_swint_ogc.pth", "config.py") image_source, image = load_image("image.jpg")boxes, logits, phrases = predict( model=model, image=image, caption="car . truck . person . traffic light", box_threshold=0.35, text_threshold=0.25 )caption 用英文句点分隔类别,box_threshold 控制检测置信度。返回的 boxes 是归一化的 (cx, cy, w, h) 格式,可直接转为 YOLO 标签。 3060Ti 8G 可运行:GroundingDINO-SwinT(轻量,速度快) GroundingDINO-SwinB(更准,显存要求更高)SAM2:检测框转 Mask SAM2(Segment Anything Model 2)在 GroundingDINO 输出的框基础上生成精确分割轮廓: from sam2.build_sam import build_sam2 from sam2.sam2_image_predictor import SAM2ImagePredictorsam2 = build_sam2("sam2_hiera_small.pt", device="cuda") predictor = SAM2ImagePredictor(sam2)predictor.set_image(image_np)# 用 GroundingDINO 的框作为 prompt masks, scores, _ = predictor.predict( box=boxes_xyxy, # [x1, y1, x2, y2] multimask_output=False )组合效果: GroundingDINO(框)+ SAM2(Mask)= 实例分割标注适合标注车辆、行人等需要精确轮廓的场景。 Florence-2:一键生成多种格式 微软的 Florence-2 是视觉语言模型,支持多种任务: from transformers import AutoProcessor, AutoModelForCausalLMmodel = AutoModelForCausalLM.from_pretrained("microsoft/Florence-2-large") processor = AutoProcessor.from_pretrained("microsoft/Florence-2-large")# 开放词汇检测 inputs = processor( text="<OPEN_VOCABULARY_DETECTION>car", images=image, return_tensors="pt" ) outputs = model.generate(**inputs) result = processor.decode(outputs[0], skip_special_tokens=False)支持的任务标签:<OD> — 通用目标检测 <CAPTION> — 图像描述 <OPEN_VOCABULARY_DETECTION>类别 — 指定类别检测 <OCR> — 文字识别Qwen2.5-VL:标注质量审核 GroundingDINO 标注后,用 Qwen2.5-VL 批量审核: # 伪代码示例 for image, label in dataset: response = qwen_vl.chat( image=image, question="图中的标注框是否正确?是否有漏标?" ) if "错误" in response or "漏标" in response: flag_for_review(image)批量过滤低质量标注,减少人工检查量。 推荐工具:X-AnyLabeling X-AnyLabeling 是集成了上述模型的图形化标注工具: pip install x-anylabeling x-anylabeling内置 GroundingDINO、SAM2、YOLO 等模型,支持:点击即分割 批量自动预标注 导出 YOLO、COCO、VOC 格式标注流程建议 1. 用 GroundingDINO 批量预标注(自动化) 2. X-AnyLabeling 打开,批量审查明显错误 3. SAM2 对需要 Mask 的目标细化边界 4. Qwen2.5-VL 辅助审核复杂场景 5. 导出 YOLO 格式,开始训练第一轮训出小模型后,用模型自身的预测结果辅助后续标注,形成正向循环(主动学习)。
RTX 3060 Ti 能跑哪些 AI 模型:LLM、OCR、YOLO 全景
RTX 3060 Ti(8GB 显存)是个甜点卡,覆盖了 LLM 推理、YOLO 训练、OCR、图像生成等主要本地 AI 场景。 LLM 大语言模型 流畅运行(推荐) 量化后直接跑,速度可接受:模型 4bit 显存Qwen3-4B 2~3 GBQwen3-8B(4bit) 4~6 GBLlama 3.2 3B 2~3 GBGemma 3 4B 2~3 GB勉强可用Qwen3-14B(需要部分层卸载到 CPU) Llama 3.1 8B(长上下文时速度明显下降)不推荐Qwen3-32B、DeepSeek-R1 原版、70B 级模型——需要 24GB+ 显存或多卡。工具推荐:Ollama(最简单)、LM Studio(有 GUI)、vLLM(高吞吐推理)。 OCR工具 适用场景PaddleOCR / PP-OCRv5 中文、表格、票据,CPU 也能跑Surya 复杂文档,精度高EasyOCR 部署最简单Qwen2.5-VL-7B 复杂界面截图,可输出结构化 JSON对于包含布局和表格的文档,PaddleX 的 PP-StructureV3 可以直接输出 HTML 或 Excel。 YOLO + OCR 组合是工业自动化常见方案: 截图 → YOLO 找目标框 → PaddleOCR 读文字 → 业务逻辑这比直接上 VL 大模型快几十倍。 YOLO 训练型号 状态YOLOv8n / YOLO11n 完全没问题YOLOv8s / YOLO11s 完全没问题YOLOv8m / YOLO11m 可以,batch 调小YOLOv8l / YOLOv8x 较吃力,batch=1~2 或降图片尺寸自动标注:GroundingDINO + SAM2 GroundingSAM2 是最强的自动标注组合: 文字提示("car", "person") → GroundingDINO 找框 → SAM2 生成分割轮廓 → 自动生成标注文件优点:开放词汇检测,不需要重新训练类别。 各模型比较:模型 支持任意类别 自动标注质量GroundingSAM2 ✅ ⭐⭐⭐⭐⭐⭐GroundingDINO SwinB-QInt8 ✅ ⭐⭐⭐⭐⭐GroundingDINO SwinT-QInt8 ✅ ⭐⭐⭐⭐DEIMv2-DINOv3(COCO) ❌ 只支持训练类别 ⭐⭐⭐如果数据量很大(几万张),先用 SwinT 批量跑,再人工抽查修正。 多模态 VLMQwen2.5-VL-7B:图片问答、OCR、表格识别、UI 截图分析 Qwen2.5-VL-3B:更轻量,3060Ti 跑很轻松 MiniCPM-V 4.5:轻量多模态用途:图片问答、自动生成标注描述、分析网页截图。 图像生成Stable Diffusion 1.5 / SDXL(低分辨率):512×512 很舒服 FLUX.1-dev:需要量化版,显存刚好够用语音Whisper:视频转字幕,中文效果强 CosyVoice / GPT-SoVITS:语音克隆,几秒样本就能复刻声线IndexedDB 中提取图片 如果标注数据存在浏览器 IndexedDB 里,可以用控制台导出: const req = indexedDB.open("数据库名");req.onsuccess = () => { const db = req.result; const store = db.transaction("Video2DImage", "readonly").objectStore("Video2DImage"); store.getAll().onsuccess = e => { e.target.result.forEach((item, i) => { const blob = item.image || item.data || item.blob; if (!blob) return; const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = `${i}.jpg`; a.click(); setTimeout(() => URL.revokeObjectURL(url), 1000); }); }; };数量很多时建议用 JSZip 打包成 zip 后统一下载,避免浏览器拦截大量弹窗。 推荐配置(32GB 内存 + 3060Ti) Qwen3-8B → 代码助手、日常问答 Qwen2.5-VL-7B → 看图、OCR、标注辅助 Whisper large → 语音转文字 GroundingDINO + SAM2 → 自动标注 YOLO11s → 目标检测训练这套组合基本把 8GB 显存榨干,覆盖开发、标注、OCR、视觉分析全场景。
RTX 3060 Ti(8 GB)能跑哪些 AI 模型:LLM / VLM / YOLO 一览
RTX 3060 Ti 是老一代甜品卡(8 GB 显存 / 4864 CUDA 核心),本地跑 AI 到底能到什么程度?这里按类型拆开说,方便对号入座。 LLM 大语言模型 流畅运行(4bit 量化)模型 4bit 显存 3060 Ti 体验Qwen3 4B / Gemma 3 4B 2–3 GB 极快,长上下文也稳Llama 3.2 3B 2 GB 极快Qwen3 8B / Llama 3.1 8B 4–5 GB 舒服,20+ tok/s跑 8B 级别是最好的性价比——推理速度快、显存留够上下文、日常问答 / 代码补全都能用。 勉强能跑Qwen3 14B(4bit):显存刚好 8 GB 附近,需要部分层卸载到 CPU Llama 3.1 8B + 长上下文(32K+):KV cache 会顶到 6 GB+工具用 Ollama / LM Studio 会自动做 CPU 卸载,速度下降到 5-8 tok/s。 别指望Qwen3 32B、DeepSeek-R1 原版、Llama 3 70B 这些至少要 24 GB 显存 + 大量系统内存,多卡才舒服代码模型 3060 Ti 本地跑:Qwen3-Coder-8B(4bit) DeepSeek-Coder-V2-Lite(16B MoE 但激活参数少)Python / JS / Vue / PHP 补全够用,但和 Claude / GPT-4 差距还是明显。作为离线补全 + 隐私备份合适,做核心开发工具不推荐。 多模态(VL)模型 看图说话、OCR、UI 截图分析:Qwen2.5-VL 3B / 7B:3060 Ti 主力选择 MiniCPM-V 4.5:中文 OCR 强,端侧优化好 InternVL 2.5 4B用途:图片问答 表格图 → 结构化数据 UI 截图定位元素(配合自动化) PDF / 扫描件 OCRYOLO 训练 完全无压力YOLOv8n / YOLOv8s YOLO11n / YOLO11s YOLOv5s640×640 输入 + batch 16-32,一张 3060 Ti 单卡跑几千张数据集,几个小时收敛。 可以训练YOLOv8m / YOLO11m要压 batch 到 8 或者降图片尺寸。 吃力YOLOv8l / YOLOv8x:batch 1-2、图片 640 以下,能训但很慢 SAM / DINO 类分割模型:训练基本没戏,推理够呛Stable Diffusion / 文生图SD 1.5(512×512):几秒一张,舒服 SDXL / SDXL Turbo(1024×1024):能跑,但慢,需要开 --medvram Flux 1:显存不够,直接放弃配合 ControlNet、LoRA 会显著吃显存,SDXL + ControlNet 已经很紧。 OCR 跑 OCR 反而对显存要求低:PaddleOCR PP-OCRv5:中文强、CPU 也能跑,GPU 加速几百 QPS RapidOCR:更轻量,ONNX 部署 DocOwl / MinerU:文档结构化,需要 4-6 GB推荐的实用组合 一台 3060 Ti + 32 GB 内存的机器,日常跑这套刚刚好:用途 模型 工具日常聊天 / 代码 Qwen3-8B-Instruct (Q4) Ollama / LM Studio看图 / OCR Qwen2.5-VL 7B vLLM / LM Studio目标检测训练 YOLO11s Ultralytics出图 SD 1.5 + ControlNet ComfyUI / A1111转写字幕 Whisper Small / Medium faster-whisper八九不离十能覆盖个人开发者需求。 Ollama 一键跑 # 装 Ollama curl -fsSL https://ollama.com/install.sh | sh# 拉模型 ollama pull qwen3:8b ollama pull qwen2.5-vl:7b# 跑 ollama run qwen3:8bOllama 会自动挑合适量化、自动 GPU/CPU 分配、不用你操心。 一句话总结 3060 Ti 8GB 甜蜜点是 7B~8B 量化 LLM + 中等 YOLO 训练 + SD 1.5。想跑 14B+ 或 SDXL 就得砍上下文 / 出图速度。真要玩大模型,二手 3090 / 4090 才是更好投资。
Python from __future__ import annotations 详解:延迟求值与前向引用
它解决什么问题 Python 在解析函数签名时会立即对类型注解求值。如果类还没定义完就引用了自身,会抛 NameError: class Node: def __init__(self, next: Node = None): # NameError: name 'Node' is not defined self.next = next加上这一行就能解决: from __future__ import annotationsclass Node: def __init__(self, next: Node = None): # 正常 self.next = next原理是让 Python 把所有注解保存为字符串,不再立即解析。 核心效果 from __future__ import annotationsclass User: passdef get_user() -> User: return User()print(get_user.__annotations__) # {'return': 'User'} ← 字符串,不是 <class '__main__.User'>没有这行时,__annotations__ 里存的是实际类对象;有了这行,全部变成字符串,运行时不解析。 解决循环引用 from __future__ import annotationsclass A: def test(self, b: B) -> None: passclass B: def test(self, a: A) -> None: pass不加的话,定义 A 时 B 还不存在,报 NameError。 常见使用场景 FastAPI / Pydantic 模型互相引用: from __future__ import annotations from pydantic import BaseModelclass Article: author: Authorclass Author: articles: list[Article]SQLAlchemy ORM 关系: from __future__ import annotations from sqlalchemy.orm import Mapped, relationshipclass User(Base): posts: Mapped[list[Post]] = relationship()class Post(Base): user: Mapped[User] = relationship()这是 FastAPI、Pydantic、SQLAlchemy 等库的文件开头几乎都有这行的原因。 运行时获取实际类型 如果需要在运行时把字符串注解解析回真实类型,用 typing.get_type_hints(): from __future__ import annotations import typingclass Foo: def bar(self) -> Foo: return selfhints = typing.get_type_hints(Foo.bar) print(hints) # {'return': <class '__main__.Foo'>}get_type_hints() 会在运行时把字符串注解解析成真实类型。 Python 版本说明from __future__ import annotations 来自 PEP 563,Python 3.7 引入 PEP 563 原本计划在 Python 3.10 成为默认行为,后来推迟,至今(Python 3.12+)仍需显式导入 Python 3.10 引入了 X | Y 联合类型语法,可以写 int | None 代替 Optional[int],但前向引用问题 from __future__ import annotations 仍是最简洁的解法一行导入,让注解写法更自由,是现代 Python 项目的常见约定。
