【YOLO系列】基于YOLOv8/v11/v26+flask+fastdmin开发的目标检测系统
基于YOLOFlaskFastAdmin打造通用目标检测系统一套代码适配所有YOLO检测项目——图片、视频、摄像头全覆盖还带完整后台管理。前言目标检测是计算机视觉领域的热门方向但许多开发者都会遇到同一个痛点训练好的YOLO模型如何快速落地成一个可用的系统如何让非技术人员也能方便地使用、管理和查看检测记录本文介绍的系统正是为了解决这些问题而设计。基于YOLO Flask FastAdmin技术栈实现了一个通用性极强的目标检测平台。你只需要在后端配置好不同的模型权重前端改个名字就能瞬间将“车辆检测系统”变成“水果检测系统”或“缺陷检测系统”。下面我们一起来看看这个系统的完整功能。一、系统架构概览系统的技术选型非常清晰前端FastAdmin —— 基于ThinkPHPBootstrap的后台管理框架快速搭建美观的管理界面。后端Flask —— 提供RESTful API接口负责调用YOLO模型进行推理。检测核心YOLO系列YOLOv5/v8/v9等均可适配。用户通过前端上传图片/视频Flask接口接收后调用YOLO处理再将结果返回前端展示。所有检测记录、用户管理、统计分析都集成在FastAdmin后台中。[插图系统登录界面]二、通用性设计一套系统N种场景这套系统最大的亮点在于通用性。当你训练好一个新的YOLO模型比如用于检测苹果、香蕉、橙子只需要将模型权重文件放入Flask后端指定目录。在前端后台修改系统名称例如将“车辆检测系统”改为“水果检测系统”。刷新页面 —— 整个界面标题、图标、描述都会同步更新检测逻辑自动适配新模型。不需要修改任何前端代码不需要重启服务。真正做到了“一次开发到处复用”。[插图系统名称修改前后对比图]左侧为车辆检测系统界面右侧为水果检测系统界面三、用户与权限管理系统内置了完善的管理员账户体系。管理员可以创建、删除用户账号设置不同用户的权限如只能检测不能查看记录等其他用户使用自己的账号登录后同样可以使用全部检测功能各自的检测记录相互隔离或按需求共享。[插图用户管理页面截图]四、检测模块详解检测模块是整个系统的核心支持三种输入方式图片检测、视频检测、摄像头实时检测。1. 图片检测操作流程非常简单点击上传按钮选择一张本地图片。点击“开始检测”。图片通过HTTP请求发送到Flask后端YOLO模型进行推理。检测结果带边界框和标签的图片返回前端并显示。右侧面板会同步展示检测到的目标类别、数量、置信度等信息。[插图图片检测界面]实际测试中上传一张包含多个物体的图片系统能快速准确地框出所有目标效果令人满意。2. 视频检测视频检测功能更为强大。上传一个MP4/AVI等格式的视频文件后后端会逐帧处理并将带有检测框的结果视频返回前端。视频播放器支持进度条拖拽你可以随意拖动查看每一帧的检测情况。更智能的是右侧的“类别分布”面板会统计视频中出现的所有目标类别及其数量。你可以点击任意类别进行筛选—— 比如只勾选“person”那么拖动进度条时视频画面上只会显示“person”的检测框其他类别框会被隐藏。这对于分析特定目标的出现规律非常实用。[插图视频检测界面 类别筛选面板]3. 摄像头实时检测系统会自动检测电脑上可用的摄像头设备你可以在下拉菜单中选择想要使用的摄像头例如内置摄像头或外接USB摄像头。点击“开启检测”后实时视频流会逐帧送入YOLO模型进行推理画面中实时显示检测框。检测过程中点击“保存快照”按钮当前帧的检测结果图片会被保存到系统记录中。五、检测记录与详情管理所有检测操作图片、视频、摄像头快照都会被自动记录下来存放在“检测记录”模块中。每条记录包含检测时间检测类型图片/视频/摄像头检测到的所有目标统计原始文件缩略图操作按钮查看详情、删除等点击“查看详情”可以进入一个专门的详情页里面展示检测结果大图/视频以及该次检测的完整JSON数据边界框坐标、类别、置信度等。[插图检测记录列表页]之前通过图片检测和摄像头快照保存的图片都会整齐地列在这里方便回溯。六、分析总览系统运行仪表盘“分析总览”模块是给管理员看的全局统计面板。这里展示了整个系统的使用情况时间趋势图按日/周/月统计检测次数可以看出系统在什么时间段最活跃。目标检测排行榜所有检测中各类目标被识别到的总次数例如“car”出现了1200次“person”出现了800次。检测记录汇总总检测次数、涉及用户数、模型调用成功率等指标。通过这些数据管理员可以了解系统的使用热度也可以为后续模型优化提供方向比如某种目标频繁被误检说明该类别需要增加训练样本。[插图分析总览仪表盘]八、如何获取与部署博客简介可以找到我或点我找我到Flask后端接口代码importosimportuuidimporttimeimportthreadingfromflaskimportFlask,request,jsonify,Responseimportcv2importnumpyasnpfromdetectorimportYOLODetectorfromutilsimportsave_uploaded_file,draw_bboxesfromtasksimportprocess_video_async,task_statusfromconfigimportConfig appFlask(__name__)app.config.from_object(Config)detectorYOLODetector()# 全局单例# 创建所需文件夹os.makedirs(Config.UPLOAD_FOLDER,exist_okTrue)os.makedirs(Config.STATIC_FOLDER,exist_okTrue)# ---------- 图片识别 ----------app.route(/api/detect/image,methods[POST])defdetect_image():iffilenotinrequest.files:returnjsonify({success:False,message:No file part}),400filerequest.files[file]iffile.filename:returnjsonify({success:False,message:No selected file}),400extfile.filename.rsplit(.,1)[1].lower()ifextnotinapp.config[ALLOWED_EXTENSIONS]:returnjsonify({success:False,message:Invalid image format}),400# 保存原始图片src_pathsave_uploaded_file(file,Config.UPLOAD_FOLDER,prefiximg_)imgcv2.imread(src_path)ifimgisNone:os.remove(src_path)returnjsonify({success:False,message:Cannot read image}),400# 检测detectionsdetector.detect(img)# 画框并保存annotateddraw_bboxes(img,detections)out_filenamefannotated_{uuid.uuid4().hex}.jpgout_pathos.path.join(uploads/detection/results,out_filename)cv2.imwrite(out_path,annotated)# 清理临时文件os.remove(src_path)print({success:True,data:{detections:[{frame_id:0,objects:detections}],image_url:out_path}})returnjsonify({success:True,data:{detections:[{frame_id:0,objects:detections}],image_url:out_path}})# ---------- 摄像头帧检测 ----------app.route(/detection/api/camera_frame,methods[POST])defdetect_camera_frame():timestampint(time.time())ifframenotinrequest.files:returnjsonify({code:0,msg:请上传帧图片文件,time:timestamp,data:{}})frame_filerequest.files[frame]ifframe_file.filename:returnjsonify({code:0,msg:请上传帧图片文件,time:timestamp,data:{}})# 解析 confidence 参数confidence_strrequest.form.get(confidence,0.25)try:confidence_thresholdfloat(confidence_str)ifnot(0.0confidence_threshold1.0):raiseValueError()except(ValueError,TypeError):returnjsonify({code:0,msg:confidence 参数格式错误应为0~1之间的浮点数,time:timestamp,data:{}})# 读取图片img_bytesnp.frombuffer(frame_file.read(),dtypenp.uint8)imgcv2.imdecode(img_bytes,cv2.IMREAD_COLOR)ifimgisNone:returnjsonify({code:0,msg:无法解析图片请确认上传的是有效的JPEG图片,time:timestamp,data:{}})# 检测start_timetime.time()all_detectionsdetector.detect(img)inference_timetime.time()-start_time# 按 confidence 阈值过滤filtered_objects[{label:d[label],confidence:round(d[confidence],4),bbox:d[bbox]}fordinall_detectionsifd[confidence]confidence_threshold]returnjsonify({code:1,msg:检测完成,time:timestamp,data:{objects:filtered_objects,count:len(filtered_objects),inference_time:round(inference_time,3)}})# ---------- 视频识别异步----------app.route(/detection/api/video,methods[POST])defdetect_video():iffilenotinrequest.files:returnjsonify({code:0,message:No file part}),400filerequest.files[file]iffile.filename:returnjsonify({code:0,message:No selected file}),400extfile.filename.rsplit(.,1)[1].lower()ifextnotin[mp4,avi,mov]:returnjsonify({code:0,message:Invalid video format}),400task_iduuid.uuid1().hexvideo_pathsave_uploaded_file(file,Config.UPLOAD_FOLDER,prefixfvideo_{task_id}_)# 启动后台线程处理视频threadthreading.Thread(targetprocess_video_async,args(task_id,video_path))thread.daemonTruethread.start()returnjsonify({code:1,data:{task_id:task_id,log_id:1}})app.route(/detection/api/task,methods[GET])defget_task_status():task_idrequest.args.get(task_id)ifnottask_id:returnjsonify({code:0,message:Missing task_id}),400resulttask_status(task_id)returnjsonify({code:1,data:result})# ---------- 监控流MJPEG 方式----------app.route(/api/monitor/stream)defmonitor_stream():stream_urlrequest.args.get(url,0)defgenerate():capcv2.VideoCapture(stream_url)whileTrue:success,framecap.read()ifnotsuccess:breakdetectionsdetector.detect(frame)annotateddraw_bboxes(frame,detections)ret,jpegcv2.imencode(.jpg,annotated)yield(b--frame\r\nbContent-Type: image/jpeg\r\n\r\njpeg.tobytes()b\r\n)cap.release()returnResponse(generate(),mimetypemultipart/x-mixed-replace; boundaryframe)if__name____main__:app.run(host0.0.0.0,port5000,debugTrue)FastAdmin YOLO 目标检测系统系统简介本系统是一套基于 FastAdmin 前端框架与 Flask YOLO 深度学习模型构建的智能目标检测平台。系统集成图片检测、视频检测、摄像头实时检测等多种识别能力适用于安防监控、工业质检、智能零售、车辆识别等多种应用场景。用户可通过 FastAdmin 管理后台轻松上传图片或视频获取可视化检测结果。技术栈后端技术说明Flask轻量级 Python Web 框架提供 RESTful API 接口YOLOv8/v11/v26Ultralytics 开源的目标检测模型支持多种场景下的物体识别OpenCV计算机视觉库用于图像/视频处理及检测结果可视化NumPy数值计算库处理图像数据ThreadingPython 多线程支持视频异步处理前端技术说明FastAdmin基于 ThinkPHP Bootstrap 的后台管理框架HTML5 JavaScript页面交互与 AJAX 请求jQuery简化 DOM 操作与异步通信部署技术说明Python 3.x后端运行环境FFmpeg视频处理可选系统功能1. 图片检测支持上传 JPG、PNG、JPEG 格式图片自动识别图中物体并返回类别、置信度、位置坐标返回标注后的图片可视化展示检测框2. 视频检测异步处理支持 MP4、AVI、MOV 格式视频上传后台异步逐帧检测不阻塞前端操作支持进度查询实时反馈处理状态生成带检测框的标注视频3. 摄像头实时检测支持本地摄像头及 RTSP 网络摄像头单帧图片快速检测适合与前端视频流配合使用可调节置信度阈值过滤低质量检测结果返回推理耗时便于性能评估4. 监控流识别MJPEG 实时视频流输出每帧自动检测并绘制边界框前端通过 img 标签直接展示无需额外插件系统特点高精度目标检测采用 YOLO 系列深度学习模型支持 80 类物体识别可配置置信度阈值默认 0.5和 IOU 阈值默认 0.45支持模型热切换可根据场景选择不同精度的模型异步处理机制视频检测采用后台线程处理不占用 HTTP 请求周期支持多任务并发处理用户可同时提交多个视频检测任务进度实时查询便于用户了解处理状态灵活的部署方式前后端分离架构Flask API 可独立部署支持 CPU/GPU 切换部署适配不同硬件环境提供 MJPEG 流接口支持与第三方监控系统集成简单易用的管理界面集成于 FastAdmin 后台无需单独开发管理界面支持文件上传、进度查看、结果展示一体化操作检测结果以表格和可视化图片/视频形式呈现目录结构flask-detection/ ├── app.py # Flask 主应用定义所有 API 接口 ├── detector.py # YOLO 检测器封装单例模式 ├── tasks.py # 视频异步处理任务 ├── utils.py # 工具函数文件保存、绘制边框 ├── config.py # 配置文件 ├── uploads/ # 上传文件目录 ├── static/ # 静态资源目录 └── yolo*.pt # YOLO 模型文件