基于Flask构建YOLOv8检测结果转发API的工程实践在计算机视觉项目的实际落地过程中我们常常需要将检测结果传递给其他硬件设备。传统做法是直接修改YOLOv8的源代码但这种硬编码方式存在诸多弊端代码难以维护、跨平台部署困难、通信方式单一。本文将介绍一种更优雅的解决方案——使用Flask构建轻量级API服务层实现检测结果与各类硬件设备的灵活对接。1. 为什么需要解耦YOLOv8与硬件通信直接修改YOLOv8核心代码如plotting.py来实现串口通信看似简单实则埋下了不少隐患代码污染在视觉算法代码中混入硬件通信逻辑破坏了代码的单一职责原则维护困难每次YOLOv8版本更新都需要重新修改和测试通信代码扩展性差通信方式被固定为串口难以适应网络、MQTT等其他协议需求部署复杂需要所有运行环境都具备相同的串口配置相比之下API中间层方案具有明显优势架构清晰YOLOv8只负责检测通信由独立服务处理协议灵活可同时支持串口、Socket、HTTP、MQTT等多种通信方式部署简便API服务可独立部署在任何设备上调试方便可通过Postman等工具直接测试接口2. 系统架构设计我们的解决方案采用微服务架构将系统分为三个独立模块YOLOv8检测模块 → Flask API服务 → 硬件设备(单片机/树莓派等)2.1 组件交互流程YOLOv8完成目标检测后将结果以HTTP POST请求发送到本地Flask服务Flask服务接收JSON格式的检测结果根据配置选择合适的通信方式转发数据硬件设备接收并处理数据2.2 通信方式对比通信方式适用场景优点缺点串口通信短距离直连设备简单可靠、低延迟距离短、速率低Socket局域网内设备灵活、支持多客户端需要网络配置MQTT物联网设备支持发布订阅模式需要broker服务器HTTP通用Web服务标准化、跨平台开销较大3. Flask API服务实现下面我们实现核心的API转发服务代码采用Python 3.8和Flask 2.0。3.1 基础服务搭建首先安装所需依赖pip install flask flask-cors pyserial paho-mqtt创建主服务文件app.pyfrom flask import Flask, request, jsonify import serial import socket import paho.mqtt.client as mqtt app Flask(__name__) # 通信方式配置 COMM_METHOD serial # 可选: serial/socket/mqtt/http # 初始化串口 ser serial.Serial(COM6, 9600, timeout1) if COMM_METHOD serial else None app.route(/api/detections, methods[POST]) def handle_detections(): data request.json if not data or objects not in data: return jsonify({error: Invalid data format}), 400 # 转发检测结果 forward_detections(data[objects]) return jsonify({status: success}) def forward_detections(objects): 根据配置转发检测结果 if COMM_METHOD serial: for obj in objects: ser.write(f{obj[label]},{obj[x]},{obj[y]}\n.encode()) elif COMM_METHOD socket: # Socket转发实现 pass # 其他通信方式实现... if __name__ __main__: app.run(host0.0.0.0, port5000)3.2 YOLOv8集成改造修改YOLOv8的检测代码将结果发送到API服务而非直接操作硬件import requests from ultralytics import YOLO model YOLO(yolov8n.pt) def send_to_api(detections): 将检测结果发送到Flask API objects [{ label: det.names[int(cls)], conf: float(conf), x: float(xyxy[0]), y: float(xyxy[1]) } for *xyxy, conf, cls in detections] try: requests.post(http://localhost:5000/api/detections, json{objects: objects}, timeout0.5) except requests.exceptions.RequestException: pass # 网络错误处理 results model(source0, showTrue, streamTrue) # 摄像头输入 for result in results: send_to_api(result.boxes)4. 多通信方式实现细节4.1 串口通信增强实现基础串口通信存在数据丢失风险我们需要增加以下改进数据校验添加CRC校验位错误重试失败后自动重发队列缓冲避免数据拥堵改进后的串口处理代码import crc8 from queue import Queue from threading import Thread serial_queue Queue(maxsize100) def serial_worker(): while True: data serial_queue.get() crc crc8.crc8() crc.update(data.encode()) packet f{data}|{crc.hexdigest()}\n for _ in range(3): # 最多重试3次 try: ser.write(packet.encode()) break except serial.SerialException: time.sleep(0.1) serial_queue.task_done() Thread(targetserial_worker, daemonTrue).start() def forward_detections(objects): for obj in objects: data f{obj[label]},{obj[x]},{obj[y]} serial_queue.put(data)4.2 Socket通信实现对于需要网络通信的场景我们可以实现TCP Socket转发import socket sock socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((192.168.1.100, 8080)) # 目标设备IP和端口 def forward_via_socket(objects): for obj in objects: data f{obj[label]},{obj[x]},{obj[y]}\n.encode() sock.sendall(data)4.3 MQTT物联网集成对于物联网场景MQTT是更好的选择mqtt_client mqtt.Client() mqtt_client.connect(mqtt.broker.com, 1883) def forward_via_mqtt(objects): for obj in objects: payload json.dumps(obj) mqtt_client.publish(yolo/detections, payload)5. 性能优化与生产部署5.1 性能瓶颈分析在实测中我们发现主要性能瓶颈来自HTTP API请求的序列化开销检测结果的高频发送导致的网络拥堵串口通信的低速特性5.2 优化策略批量发送将多个检测结果打包发送# 修改send_to_api函数 def send_to_api(detections): objects [...] if len(objects) 0: requests.post(http://localhost:5000/api/detections, json{objects: objects}, timeout0.5)异步处理使用多线程避免阻塞检测流程from concurrent.futures import ThreadPoolExecutor executor ThreadPoolExecutor(max_workers2) def async_send(objects): try: requests.post(http://localhost:5000/api/detections, json{objects: objects}, timeout0.5) except: pass executor.submit(async_send, objects)5.3 生产环境部署建议使用Gunicorn提升Flask服务并发能力gunicorn -w 4 -b :5000 app:app配置Nginx反向代理提供负载均衡和HTTPS支持实现服务监控使用Supervisor管理进程日志记录记录所有转发操作以便调试6. 实际应用案例6.1 智能垃圾分类系统通过YOLOv8识别垃圾类型后API服务将分类指令发送给单片机控制机械臂可回收物 → 蓝色垃圾桶有害垃圾 → 红色垃圾桶厨余垃圾 → 绿色垃圾桶其他垃圾 → 黑色垃圾桶6.2 工业质检流水线检测到产品缺陷时API服务通过多种方式同时通知串口信号触发报警灯MQTT消息通知中控系统Socket消息记录缺陷位置6.3 智能停车场系统车牌识别结果通过API服务转发本地显示屏显示识别结果云端数据库记录车辆进出微信推送停车费通知
网站建设
高端定制
企业官网