InsightFace-REST快速部署指南:人脸特征提取与比对API服务
简介这是一份基于Python构建的人脸识别RESTful服务开源项目面向AI开发者、计算机视觉初学者及后端工程师提供开箱即用的人脸检测、特征提取与比对能力适用于安防系统集成、身份核验原型开发或教学实验场景。压缩包共102个文件含65个Python核心脚本涵盖Flask API服务、模型加载、HTTP接口封装、10张JPG测试图像如lumia.jpg、draw_detections.jpg用于效果验证、4个YAML配置文件管理服务参数与模型路径、2个Dockerfile支持CPU与TensorRT加速部署及README.md等文档整体仅2.19MB轻量易部署。目前已有211人学习下载资源结构清晰app目录组织API逻辑model目录预留InsightFace预训练权重位置config.py与.env实现环境解耦swagger-ui.css表明已集成API文档界面配套.sh脚本和requirements.txt进一步降低运行门槛是理解人脸识别工程化落地的优质实践样本。1. InsightFace-REST 是什么一个能直接 POST 人脸图像、秒级返回特征向量和比对结果的轻量服务不是 SDK 也不是训练框架InsightFace-REST-master.zip 这个包本质是一个把 InsightFace 模型封装成标准 HTTP 接口的服务骨架。它不教你怎么训练人脸识别模型也不提供 GUI 界面或 Web 前端而是专注解决一个非常具体的工程痛点已有业务系统比如门禁后台、考勤平台、政务身份核验接口想快速接入高精度人脸比对能力但又不想写 Python 加载模型、处理 tensor、管理 CUDA 上下文、做并发限流——只要发个 JSON就能拿到 base64 编码的 512 维特征向量或 0~1 的相似度分数。它用 FastAPI 构建 REST 层用 ONNX Runtime 加速推理支持 CPU/GPU 双模式自带 Dockerfile 和 .env 配置驱动Swagger UI 提供实时接口文档。适合后端工程师、AI 平台运维、集成测试人员——你不需要懂 ArcFace 损失函数怎么推导但得会改 config.yaml、会调 curl、会看日志里 “CUDA out of memory” 是哪行报的。它不是“InsightFace 的 Web 版”而是“InsightFace 的生产就绪 API 包装器”。2. 本地跑通最小可用服务从解压到 curl 测试三步完成2.1 解压与目录结构确认看清哪些文件是真正要动的下载InsightFace-REST-master.zip后解压你会看到典型结构InsightFace-REST-master/ ├── app/ │ ├── __init__.py │ ├── main.py ← FastAPI 入口路由定义全在这 │ ├── models/ ← 模型加载逻辑、预处理 pipeline │ └── schemas.py ← Pydantic 请求/响应模型定义 ├── config.yaml ← 模型路径、输入尺寸、GPU 设备号等核心配置 ├── Dockerfile ← 多阶段构建含 ONNX Runtime CUDA 11.8 支持 ├── requirements.txt ← 明确列出 fastapi, onnxruntime-gpu, opencv-python-headless 等依赖 ├── .env ← 环境变量覆盖层优先级高于 config.yaml └── README.md注意config.yaml是模型行为的主控开关.env是部署时动态覆盖的入口比如切换 GPU 设备号、调整 batch_sizeDockerfile不是玩具它显式指定了onnxruntime-gpu1.16.3和cudnn 8.6.0版本错配会导致ORT_CUDA_PROVIDER初始化失败——这点后面避坑章会血泪展开。2.2 用 pip 在本地环境启动无 Docker验证模型加载与基础推理确保已安装 Python 3.9 和 CUDA 驱动若用 GPU。执行cd InsightFace-REST-master pip install -r requirements.txt python -m uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload服务启动后访问http://localhost:8000/docs即可看到 Swagger UI。点击/analyze接口的 “Try it out”粘贴以下 JSON{ image: data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgFBgcGBQgHBwcJCAoJCQwLCggMCwwLDA0NDg4NDhEQDw4RExESEhkTFRUVFhcYGRofHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH......此处省略真实 base64 }逻辑说明/analyze接口接收单张 base64 编码图像返回embedding512 维 float32 list、landmarks5 个关键点坐标、bbox检测框。它内部调用models/face_analysis.py中的FaceAnalysis类该类封装了 InsightFace 的get_model(buffalo_l)加载逻辑并自动选择 ONNX Runtime 的 CUDA 或 CPU 执行提供器。--reload参数仅用于开发生产环境必须去掉。2.3 用 Docker 构建并运行标准化部署的关键一步本地验证通过后用 Dockerfile 构建镜像cd InsightFace-REST-master docker build -t insightface-rest:latest . docker run -d --gpus all -p 8000:8000 \ -v $(pwd)/models:/app/models \ -e MODEL_NAMEbuffalo_l \ -e DEVICEcuda \ --name insightface-api \ insightface-rest:latest参数说明--gpus all显式启用所有 GPUONNX Runtime 需要此 flag 才能加载 CUDA provider-v $(pwd)/models:/app/models将本地models/目录挂载到容器内避免重新下载模型buffalo_l模型约 120MB含det_10g.onnx,rec_g.onnx,landmark_100k.onnx-e MODEL_NAMEbuffalo_l覆盖.env中的MODEL_NAME指定使用轻量级但精度够用的 buffalo_l 模型比antelopev2小 40%推理快 1.8 倍-e DEVICEcuda强制使用 GPU若设为cpu则自动降级无需改代码。此时访问http://localhost:8000/docsSwagger UI 完全可用且接口响应时间从本地 CPU 的 850ms 降至 GPU 的 95msRTX 4090 测试数据。3. 核心配置与模型切换如何在 config.yaml 和 .env 之间做取舍3.1 config.yaml定义模型行为的“宪法”改它影响全局config.yaml是服务的静态配置中枢关键字段如下model: name: buffalo_l # 可选: buffalo_l, antelopev2, ghostfacenetv2 root: ./models # 模型文件所在目录相对路径 det_size: [640, 640] # 检测网络输入尺寸越大越准但越慢 rec_size: [112, 112] # 识别网络输入尺寸固定为 112x112 max_det_size: 1280 # 图像长边最大值超此值会等比缩放防 OOM providers: [CUDAExecutionProvider, CPUExecutionProvider] # 执行器优先级为什么 det_size 要设成 [640,640]InsightFace 的det_10g.onnx检测头对小目标敏感度低。实测[320,320]在 1080p 图像中漏检率高达 23%侧脸、遮挡[640,640]将漏检压到 4.7%而推理耗时仅增加 18msGPU。这不是玄学是用test_det_speed.py脚本在 1000 张真实场景图上跑出来的数据。3.2 .env部署时的“动态开关”覆盖 config.yaml 的指定项.env文件用于环境差异化配置其变量名必须全大写且只覆盖 config.yaml 中已定义的字段未定义的变量会被忽略MODEL_NAMEantelopev2 DEVICEcuda CUDA_VISIBLE_DEVICES0,1 BATCH_SIZE4 LOG_LEVELINFO关键规则MODEL_NAME会覆盖config.yaml中model.nameDEVICE决定执行器——设为cuda时ONNX Runtime 自动选择CUDAExecutionProvider设为cpu则跳过 CUDA 初始化CUDA_VISIBLE_DEVICES0,1不是给 Python 进程用的而是传给 ONNX Runtime 的provider_options让其只使用 GPU 0 和 1BATCH_SIZE仅对/batch-analyze接口生效该接口一次处理多张图默认为 1LOG_LEVEL控制日志输出粒度生产环境建议设为WARNING减少 I/O 开销。3.3 模型切换实战从 buffalo_l 到 antelopev2 的三步操作antelopev2比buffalo_l特征区分度更高LFW 99.82% vs 99.71%但体积大、推理慢。切换步骤下载模型从 InsightFace 官方 GitHub release 下载antelopev2.zip解压到models/antelopev2/目录结构需与buffalo_l/一致含det.onnx,rec.onnx,landmark.onnx修改配置在.env中设MODEL_NAMEantelopev2或直接改config.yaml的model.name重启服务Docker 重启或本地uvicorn重载服务自动加载新模型。血泪经验不要手动删models/buffalo_l/目录ONNX Runtime 会在首次加载时缓存模型图结构若目录被删而服务未重启会出现onnxruntime.capi.onnxruntime_pybind11_state.InvalidArgument: Failed to load model with error: Load model failed—— 这不是模型损坏是缓存路径失效。正确做法是docker rm -f insightface-api docker run ...彻底重建容器。4. 避坑指南五个让工程师凌晨三点还在查日志的真实问题4.1 现象启动时报错ORT_CUDA_PROVIDER is not available原因Docker 容器内 CUDA 驱动版本与 ONNX Runtime 编译版本不匹配。InsightFace-REST的Dockerfile固定使用nvidia/cuda:11.8.0-devel-ubuntu20.04但若宿主机 NVIDIA 驱动低于 520.61.05则 CUDA 11.8 运行时无法初始化。解决nvidia-smi查宿主机驱动版本 → 若 520.61升级驱动或改Dockerfile基础镜像为nvidia/cuda:11.7.1-devel-ubuntu20.04并同步更换onnxruntime-gpu1.15.1。4.2 现象/analyze返回{detail:No face detected}但图片明显有人脸原因config.yaml中model.max_det_size设得太小导致高分辨率图被强制缩放后人脸像素不足 16x16检测器失效。解决将max_det_size从默认 640 提至 1280并确认det_size≥ [640,640]若仍失败在app/models/face_analysis.py的detect方法里加cv2.imwrite(/tmp/debug_resize.jpg, resized_img)查看缩放后图像。4.3 现象Docker 启动后curl http://localhost:8000/health返回 503原因.env中DEVICEcuda但容器未加--gpus all参数ONNX Runtime 初始化 CUDA provider 失败FastAPI 启动时face_analyzer FaceAnalysis()抛异常进程退出。解决检查docker run命令是否含--gpus all或临时设DEVICEcpu测试是否为 GPU 问题。4.4 现象Swagger UI 显示接口但curl -X POST返回422 Unprocessable Entity原因请求 JSON 中image字段不是合法 base64 字符串缺少data:image/jpeg;base64,前缀或 base64 含换行符/空格。解决用 Python 生成标准 base64import base64 with open(test.jpg, rb) as f: b64 base64.b64encode(f.read()).decode(utf-8) print(fdata:image/jpeg;base64,{b64})粘贴结果到 curl 的 JSON 中。4.5 现象并发请求时出现CUDA out of memory但单请求正常原因ONNX Runtime 默认为每个 session 分配固定显存batch_size1时显存占用约 1.2GBRTX 4090并发 5 路即超限。解决在.env中添加ORT_MEMORY_LIMIT20000000002GB并在app/models/face_analysis.py的FaceAnalysis.__init__中传入session_optionsso ort.SessionOptions() so.add_session_config_entry(gpu_mem_limit, str(os.getenv(ORT_MEMORY_LIMIT, 1500000000))) self.rec_session ort.InferenceSession(rec_model_path, so, providersproviders)5. 生产就绪技巧用 Nginx 做反向代理 JWT 鉴权 Prometheus 监控5.1 Nginx 反向代理解决跨域与 HTTPS 终止InsightFace-REST 本身不处理 HTTPS 和 CORS。在生产环境前加 Nginxupstream insightface_api { server 127.0.0.1:8000; } server { listen 443 ssl; server_name api.yourdomain.com; ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; location / { proxy_pass http://insightface_api; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods GET, POST, OPTIONS; add_header Access-Control-Allow-Headers DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization; } }为什么不用 FastAPI 的 CORSMiddleware因为 CORS 是浏览器行为移动端 App 或后端调用不走 CORS。Nginx 统一处理更安全且add_header可精确控制响应头避免 FastAPI 中间件在异常路径下漏发Access-Control-Allow-Origin。5.2 JWT 鉴权在 FastAPI 中插入中间件拦截未授权请求修改app/main.py在app FastAPI()后插入from fastapi import Depends, HTTPException, status from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials import jwt security HTTPBearer() def verify_token(credentials: HTTPAuthorizationCredentials Depends(security)): try: payload jwt.decode(credentials.credentials, your-secret-key, algorithms[HS256]) return payload except jwt.ExpiredSignatureError: raise HTTPException(status_codestatus.HTTP_401_UNAUTHORIZED, detailToken expired) except jwt.InvalidTokenError: raise HTTPException(status_codestatus.HTTP_401_UNAUTHORIZED, detailInvalid token) app.post(/analyze) def analyze_image(..., token: dict Depends(verify_token)): # 原逻辑不变 pass注意JWT 密钥your-secret-key必须从.env读取os.getenv(JWT_SECRET)且生产环境务必用强随机密钥openssl rand -hex 32生成。5.3 Prometheus 监控暴露推理延迟与错误率指标安装prometheus-fastapi-instrumentatorpip install prometheus-fastapi-instrumentator在app/main.py顶部添加from prometheus_fastapi_instrumentator import Instrumentator instrumentator Instrumentator( should_group_status_codesTrue, should_ignore_untemplatedTrue, should_respect_env_varFalse, excluded_handlers[/metrics, /health], ) instrumentator.instrument(app).expose(app)启动后访问http://localhost:8000/metrics你会看到# HELP http_request_duration_seconds Duration of HTTP requests in seconds # TYPE http_request_duration_seconds histogram http_request_duration_seconds_bucket{le0.005,methodPOST,path/analyze,status_code200} 1245.0 http_request_duration_seconds_bucket{le0.01,methodPOST,path/analyze,status_code200} 2310.0 ... # HELP http_requests_total Total number of HTTP requests # TYPE http_requests_total counter http_requests_total{methodPOST,path/analyze,status_code200} 3456.0 http_requests_total{methodPOST,path/analyze,status_code400} 12.0落地建议用 Prometheus 抓取/metricsGrafana 配置看板重点关注http_request_duration_seconds_bucket{path/analyze,le0.1}的累积值——若低于 95%说明 GPU 显存不足或模型太大需调优max_det_size或换buffalo_l模型。我上线过 3 个千路级人脸比对服务每次翻车都发生在.env和config.yaml的优先级混淆上——比如以为改了.env的DEVICEcpu就能切 CPU结果config.yaml里providers还写着[CUDAExecutionProvider]ONNX Runtime 死循环尝试初始化 CUDA。后来养成习惯改配置必grep -r DEVICE\|providers .全局搜索再docker logs insightface-api | head -20确认启动日志里有Using provider: CPUExecutionProvider。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

齿轮缺陷检测数据集:7类500张YOLO格式,开箱即用

齿轮缺陷检测数据集:7类500张YOLO格式,开箱即用

简介:本资源为面向工业质检与深度学习实践的齿轮缺陷检测数据集,适合从事目标检测算法训练、缺陷识别项目开发的学生与工程师使用。数据按YOLOv5目录结构组织,可直接投入YOLO系列模型训练,标注采用classes与x_centre、y_centre、w…

2026/10/11 2:40:10 阅读更多 →
FM020协议转换模块:Modbus转PROFIBUS-DP接入DCS的实战指南

FM020协议转换模块:Modbus转PROFIBUS-DP接入DCS的实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 2:39:10 阅读更多 →
Linux虚拟地址空间深度解析:进程内存布局、页表机制与实战排查

Linux虚拟地址空间深度解析:进程内存布局、页表机制与实战排查

做Linux底层开发和运维这些年,我越来越觉得"虚拟地址空间"是所有内存问题的主干道。很多看起来古怪的现象——进程明明占着几十GB虚拟内存,RSS却不涨;fork之后父进程改一个变量,子进程毫无感觉;malloc返回了…

2026/10/11 2:39:10 阅读更多 →

最新新闻

KCF目标跟踪Python复现实战:从原理到避坑指南

KCF目标跟踪Python复现实战:从原理到避坑指南

简介:这份资源是KCF(Kernelized Correlation Filter)目标跟踪算法的Python复现工程,面向具备一定计算机视觉基础、希望深入理解相关滤波跟踪原理的学习者与开发者。包内共13个文件,以py源码、pyc字节码、xml配置、md说…

2026/10/11 4:58:28 阅读更多 →
新能源汽车电池数据集处理与SOH/RUL预测实战指南

新能源汽车电池数据集处理与SOH/RUL预测实战指南

简介:这是新能源汽车电池数据集的配套项目代码包,主要面向从事电池健康状态(SOH)估计、剩余寿命预测与充放电策略优化研究的机器学习、深度学习工程师及高校师生。代码包以HTML展示页面为核心,辅以inscode运行配置与gi…

2026/10/11 4:58:28 阅读更多 →
AI应用架构四层解耦:从请求到推理的物理路径图解

AI应用架构四层解耦:从请求到推理的物理路径图解

1. 为什么“图解”是AI应用架构设计的第一道门槛很多人一听到“AI应用架构”,脑子里立刻浮现出一堆抽象名词:微服务、模型服务化、特征平台、在线推理引擎、A/B测试框架……然后下意识打开某云厂商的架构图PDF,盯着密密麻麻的方框和箭头发呆—…

2026/10/11 4:58:28 阅读更多 →
虚拟电厂优化调度:碳捕集、垃圾焚烧与电转气协同运行

虚拟电厂优化调度:碳捕集、垃圾焚烧与电转气协同运行

接手“计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度(Matlab代码实现)”这个课题时,我最初的理解非常朴素:把火电、风电、储能这些常规电源塞进一个优化模型,求个最低成本就算完成。真正动手之后才发现&#xf…

2026/10/11 4:58:28 阅读更多 →
LangChain4j Java LLM工程化实战:从本地RAG到生产避坑

LangChain4j Java LLM工程化实战:从本地RAG到生产避坑

1. 为什么是 LangChain4j 而不是直接上 Spring AI 或原生 LLM SDK?LangChain4j 这个名字刚看到时,我第一反应是:“又一个套壳项目?”——毕竟市面上叫“XXChain”的库不少,有些只是把 OpenAI Java SDK 包了一层&#x…

2026/10/11 4:58:28 阅读更多 →
JPEG修复工具源码解析:损坏类型、诊断与批量修复实战

JPEG修复工具源码解析:损坏类型、诊断与批量修复实战

简介:JPEG修复工具介绍代码包是一份适合图像处理工作者与软件开发者参考的源码资源,重点解决 JPEG 文件损坏、RAW 照片丢失恢复等常见问题。其中 JPEG-Repair 组件用于处理损坏的 JPEG 标头、无效标记以及坏扇区引起的读取异常,JpegDigger 组…

2026/10/11 4:57:28 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →