ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于YOLOv8的火灾智能检测系统设计与实现:从PyTorch训练到TaoToken统一API接入

基于YOLOv8的火灾智能检测系统设计与实现:从PyTorch训练到TaoToken统一API接入 1. 火灾检测从训练到上线卡点到底在哪YOLOv8 火灾智能检测系统说到底是把计算机视觉里的目标检测能力落到一个能实时看画面、能报警、能被别的程序调用的服务上。它适合两类人一类是做深度学习课程设计或毕业设计的同学需要一套从 PyTorch 训练到界面演示的完整链路另一类是做安防、园区、仓储场景的工程同学想把火焰识别接进已有系统而不是只跑一个 demo 截图。我见过太多项目死在“训练完就结束”这一步。模型在验证集上 mAP 挺好看但真要给前端或移动端调用时问题全冒出来了权重怎么导出、推理服务怎么封装、接口鉴权怎么做、多路摄像头怎么并发、报警逻辑放前端还是后端。更现实的是很多同学本地没有稳定可用的模型调用通道想加一个“大模型二次确认火情”的能力结果卡在 Key 申请和接口适配上一拖就是好几天。这篇就按真实落地顺序走一遍先用 PyTorch Ultralytics 训练 YOLOv8 火灾检测模型导出推理权重再把推理封装成可调用服务最后演示怎么通过 TaoToken 的统一 Key/API 通道接入模型能力让“检测到火焰后再做一次语义确认”这件事变得可复制。官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 需要看文档和 Key 的可以直接过去。核心检索词先明确YOLOv8 火灾检测、深度学习火灾智能检测系统、PyTorch 训练、计算机视觉、模型服务化接入。下面每一步都给可复制的配置和脚本不玩虚的。2. 训练前把数据和环境理顺别急着跑 train2.1 数据集目录与划分脚本YOLOv8 要求的数据集结构是 images/labels 分离train/val 分开。很多人直接把所有图丢进一个文件夹训练时找不到标签报No labels found。正确结构长这样fire_dataset/ ├── train/ │ ├── images/ │ └── labels/ ├── valid/ │ ├── images/ │ └── labels/ └── fire.yaml如果你手上只有一份 all_train可以用下面这个脚本按频率抽一部分到 valid。它做的是复制加删除原文件跑之前先备份import shutil import os def handle(src_detect_dir, dst_detect_dir, freq10): src_images os.path.join(src_detect_dir, images) src_labels os.path.join(src_detect_dir, labels) dst_images os.path.join(dst_detect_dir, images) dst_labels os.path.join(dst_detect_dir, labels) os.makedirs(dst_images, exist_okTrue) os.makedirs(dst_labels, exist_okTrue) filenames os.listdir(src_images) print(total images:, len(filenames)) for i, filename in enumerate(filenames): if i % freq ! 0: continue name os.path.splitext(filename)[0] src_img os.path.join(src_images, name .jpg) src_lbl os.path.join(src_labels, name .txt) dst_img os.path.join(dst_images, name .jpg) dst_lbl os.path.join(dst_labels, name .txt) try: shutil.copyfile(src_img, dst_img) shutil.copyfile(src_lbl, dst_lbl) os.remove(src_img) os.remove(src_lbl) except Exception as e: print(copy failed:, e, src_img) if __name__ __main__: handle( src_detect_dirr./fire_dataset/all_train/train, dst_detect_dirr./fire_dataset/all_train/valid, freq10 )划分比例建议 8:2 或 9:1。火灾样本里正样本本来就少验证集别抽太多否则训练集不够模型学。2.2 fire.yaml 配置path: ./fire_dataset train: train/images val: valid/images names: 0: fire类别只有一个 fire。如果你还想区分烟雾可以加1: smoke但标签要重新标别指望模型自己学会。2.3 环境依赖pip install ultralytics8.2.0 pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu pip install opencv-python PyQt6 PySide6CPU 训练慢但火灾检测数据集通常几千张yolov8n 在 CPU 上跑 100 轮也能出结果。有 GPU 就把 torch 换成对应 CUDA 版本。3. 训练配置与推理服务封装附可复制片段3.1 训练脚本from ultralytics import YOLO data_path ./fire.yaml model YOLO(./yolov8n.pt) model.train( datadata_path, epochs300, imgsz640, batch8, devicecpu, workers0, patience30, resumeFalse, projectruns/detect, namefire_train ) print(训练完成)几个参数说明patience30表示 30 轮没提升就早停省时间batch按显存调CPU 上 8 比较稳resumeTrue只在中断续训时用第一次训练别开。训练完权重在runs/detect/fire_train/weights/best.pt。这个文件就是后面服务化的核心。3.2 推理服务封装把 YOLO 推理包成一个 HTTP 服务前端、摄像头程序、其他系统都能调。用 FastAPI 最省事# server.py from fastapi import FastAPI, UploadFile, File from ultralytics import YOLO import numpy as np import cv2 app FastAPI() model YOLO(./runs/detect/fire_train/weights/best.pt) app.post(/detect) async def detect(file: UploadFile File(...)): content await file.read() img cv2.imdecode(np.frombuffer(content, np.uint8), cv2.IMREAD_COLOR) results model(img, conf0.25, iou0.7) boxes results[0].boxes detections [] for box in boxes: xmin, ymin, xmax, ymax box.xyxy[0].cpu().numpy().astype(int).tolist() conf float(box.conf[0].cpu().numpy()) detections.append({ label: fire, conf: round(conf, 3), bbox: [xmin, ymin, xmax, ymax] }) return { count: len(detections), inference_ms: round(results[0].speed[inference], 2), detections: detections }启动uvicorn server:app --host 0.0.0.0 --port 8000测试curl -X POST http://127.0.0.1:8000/detect -F filetest_fire.jpg返回 JSON 里带检测框和置信度前端拿到就能画框。3.3 TaoToken 统一接入配置火灾检测有个现实问题YOLO 会把红色灯光、晚霞误判成火。加一层大模型语义确认能显著降误报。TaoToken 提供统一 Key/API 通道把模型调用收敛到一个入口不用每个模型单独配 Key。配置文件建议放config/settings.json路径和字段名保持下面这样方便直接复制{ taotoken: { base_url: https://taotoken.net/api, api_key: sk-your-taotoken-key, model_id: claude-3-5-sonnet, timeout: 30 }, yolo: { weights: ./runs/detect/fire_train/weights/best.pt, conf: 0.25, iou: 0.7 } }三件套必须写全Base URL 用https://taotoken.net/apiKey 在控制台生成Model ID 按你选的模型填。缺任何一个都会在调用时报鉴权或模型不存在。Python 里读取并调用import json import requests with open(config/settings.json, r, encodingutf-8) as f: cfg json.load(f) def confirm_fire(image_path): url f{cfg[taotoken][base_url]}/v1/chat/completions headers { Authorization: fBearer {cfg[taotoken][api_key]}, Content-Type: application/json } payload { model: cfg[taotoken][model_id], messages: [ { role: user, content: 判断这张图是否为真实火灾场景只回答发生火情 或 未检测到火情 } ] } resp requests.post(url, headersheaders, jsonpayload, timeoutcfg[taotoken][timeout]) return resp.json()Key 在 https://taotoken.net/api-keys 生成接入文档在 https://taotoken.net/doc 。需要长期跑编码或 Agent 任务的可以看 Coding Planhttps://taotoken.net/coding-plan 。4. 验证请求与成功结果把检测效果跑出来4.1 本地推理验证先不接服务直接用脚本验证权重能不能用from ultralytics import YOLO model YOLO(./runs/detect/fire_train/weights/best.pt) results model(./test_fire.jpg, conf0.25, iou0.7, saveTrue) print(检测到目标数:, len(results[0].boxes)) print(推理耗时:, results[0].speed[inference], ms)成功时终端会打印目标数和耗时结果图存在runs/detect/predict/下火焰位置有红色框。4.2 服务接口验证服务起来后用 curl 或 Postman 发一张图curl -X POST http://127.0.0.1:8000/detect -F filetest_fire.jpg正常返回{ count: 1, inference_ms: 42.3, detections: [ {label: fire, conf: 0.87, bbox: [120, 80, 340, 300]} ] }count大于 0 说明检测到火焰conf是置信度bbox是框的坐标。前端拿到这个 JSON 就能画框、触发报警。4.3 TaoToken 调用验证用模型对话页面先确认 Key 能用https://taotoken.net/model-chat 。发一条测试消息能正常返回就说明通道没问题。然后在代码里跑confirm_fire返回内容包含“发生火情”或“未检测到火情”即成功。4.4 端到端测试动作准备三张图一张真实火焰、一张红色灯光、一张普通场景。依次过 YOLO 检测和 TaoToken 确认。真实火焰应该 YOLO 检出且模型确认“发生火情”红色灯光可能 YOLO 误检但模型确认“未检测到火情”这就是二次确认的价值。5. 常见报错排查这些坑我都踩过5.1 401 Unauthorized调用 TaoToken 接口返回 401九成是 Key 没带对或格式错了。检查Authorization头是不是Bearer sk-xxx中间有空格。Key 别硬编码在代码里放配置文件或环境变量。如果 Key 泄露了去控制台重新生成。5.2 local proxy failed这个报错通常是本地网络配置问题不是接口本身的问题。检查系统代理设置确认请求能正常发出。如果你在公司网络里可能需要找运维确认出口策略。代码里可以显式设置proxies{}排除环境变量干扰resp requests.post(url, headersheaders, jsonpayload, timeout30, proxies{})5.3 reading choices 报错解析响应时出现reading choices相关错误说明返回结构和你预期的不一样。先打印完整响应print(resp.status_code) print(resp.text)常见原因是模型 ID 写错或者接口路径不对。Base URL 是https://taotoken.net/apichat 接口路径是/v1/chat/completions别拼错。5.4 OAuth 相关报错如果你用的是需要 OAuth 的客户端比如某些 IDE 插件报 OAuth 失败通常是回调地址或 token 过期。重新走一遍授权流程确认客户端配置里的 Base URL 和 Key 是最新的。Claude Code 接入可以参考 https://taotoken.net/claude-code-anthropic 。5.5 YOLO 相关报错No labels found检查 labels 目录和 images 目录文件名是否一一对应CUDA out of memory把 batch 调小或换 CPUModuleNotFoundError: No module named ultralytics确认 pip 装在了当前虚拟环境。5.6 打包后资源路径失效PyInstaller 打包后报找不到模型文件用动态路径import os base os.path.dirname(os.path.abspath(__file__)) weights os.path.join(base, weights, best.pt)spec 文件里 datas 要把权重目录带上datas[(weights, weights), (config, config)]6. 接入之后怎么用给几条实在建议模型跑通只是起点。真实场景里摄像头帧率、网络延迟、报警去重都得考虑。我自己的做法是YOLO 负责快速筛置信度低于 0.5 的直接丢高于 0.5 的再送 TaoToken 做语义确认两次都通过才触发报警。这样误报率能压下来也不会因为每帧都调大模型把响应拖慢。另外报警逻辑别写死在界面里。把检测结果写成事件推到一个队列报警模块单独消费后面加短信、钉钉、声光报警都好扩展。权重文件记得版本管理每次训练完存一份带日期的副本出问题能回滚。需要看模型列表和接口详情的从文档进https://taotoken.net/doc 。控制台在 https://taotoken.net/console Key 管理在 https://taotoken.net/api-keys 。先把一条完整链路跑通再谈优化。
返回列表