前言
通过前8篇专栏教程,我们已经完整搭建了一套工业级YOLO+OpenCV安防检测系统,涵盖图像预处理、抗干扰优化、ROI区域检测、RTSP实时视频流推理、违规自动抓拍、日志归档、数据溯源等全链路核心功能,代码可以在本地Python环境稳定运行。
但在真实工业项目交付场景中,现场工控机、监控主机大多无Python开发环境 ,不会配置依赖库、不会调试代码,单纯的源码无法直接落地使用。客户和现场运维只需要:双击即可运行、开机自动启动、后台静默运行、无需任何配置的成品程序。
本节课作为整套专栏最终交付篇,手把手实现项目完整部署流程:环境瘦身适配、完整EXE打包、工控机兼容调试、后台常驻运行、开机自启配置,彻底脱离Python开发环境,完成从代码到可交付工程项目的最后一步落地。
一、工业打包核心痛点(提前避坑)
普通Py打包方式直接套用视觉项目,会出现大量工程级问题,也是90%开发者现场翻车的原因:
-
打包体积过大,动辄几百MB,工控机读取卡顿
-
OpenCV、ONNX、YOLO依赖冗余,打包后程序闪退、报错
-
视频流读取失败、画面黑屏、预处理失效
-
路径报错,截图、日志无法正常保存
-
程序前台运行,误触关闭导致检测中断
-
重启设备后程序不自动启动,无人值守失效
本篇全部采用工业视觉项目专属打包方案,针对性解决以上所有问题,适配所有厂区工控机设备。
二、部署环境预处理(打包前必备优化)
2.1 清理冗余依赖
打包前卸载多余第三方库,避免打包体积臃肿、依赖冲突,只保留项目刚需依赖:
# 仅保留核心依赖 pip install ultralytics opencv-python numpy # 卸载无用依赖,减少打包体积 pip uninstall -y torch torchvision torchaudio
核心优化逻辑:项目使用ONNX量化模型推理,无需原生PyTorch环境,卸载后可大幅缩减EXE体积,避免版本冲突闪退。
2.2 代码路径全局适配(绝对/相对路径兼容)
EXE运行时会变更程序运行路径,直接运行源码会出现模型找不到、文件夹创建失败问题,统一优化代码路径适配:
import os import sys # 适配EXE打包后的运行路径 def get_root_path(): if getattr(sys, 'frozen', False): # EXE运行模式 return os.path.dirname(sys.executable) else: # 源码运行模式 return os.path.dirname(os.path.abspath(__file__)) # 全局根路径 ROOT_PATH = get_root_path() # 模型路径适配 MODEL_PATH = os.path.join(ROOT_PATH, "best.onnx")
将项目中所有本地路径替换为该全局路径,保证源码和EXE运行模式无缝兼容,杜绝路径报错。
三、PyInstaller工业专属打包配置
工业视觉项目不使用默认打包指令,采用轻量化、无控制台、兼容视频流的专属参数,安装打包工具:
pip install pyinstaller
3.1 最终打包指令(直接复制使用)
pyinstaller -F -w -i icon.ico --add-data "best.onnx;." main.py
参数详细解析(工业适配):
-
-F:打包为单文件EXE,无需携带零散文件夹,方便现场拷贝部署
-
-w:关闭黑色控制台窗口,后台静默运行,避免现场误关闭程序
-
--add-data:将ONNX模型嵌入EXE,解决打包后模型加载失败问题
-
-i:自定义程序图标(可选,无图标可删除该参数)
3.2 打包文件说明
打包完成后,项目目录会生成 dist 文件夹,内部 main.exe 即为最终可交付程序,直接拷贝到工控机即可运行,无需安装任何环境。
四、打包后高频报错工业级解决方案
4.1 OpenCV视频流闪退、读取失败
问题原因:PyInstaller打包会屏蔽OpenCV部分视频解码依赖,解决方案:手动补充解码库,在代码头部添加适配配置:
os.environ["OPENCV_VIDEOIO_MSMF_ENABLE_HW_TRANSFORMS"] = "0"
4.2 程序体积过大优化方案
-
卸载PyTorch、CUDA等无用依赖,仅保留基础运行库
-
使用ONNX轻量化模型替代原生PT模型
-
关闭程序冗余日志、冗余画面绘制逻辑
4.3 截图/日志无法保存
全部替换为上文适配的全局根路径,保证EXE运行时可正常读写本地文件、创建日期归档文件夹。
五、工控机后台常驻运行配置
项目交付核心需求:无人值守、后台常驻、不中断检测,杜绝人工误关、窗口遮挡等问题。
通过打包 -w 参数关闭控制台后,程序默认后台静默运行,仅在任务进程中常驻,不显示前台窗口,不占用桌面资源,全程稳定执行视频流检测、抓拍、日志记录逻辑。
六、工控机开机自启配置(无人值守终极方案)
工业现场设备会定期重启,必须配置开机自启,实现断电重启后自动运行检测程序,无需人工干预。
6.1 自启配置步骤
-
将打包好的
main.exe放置在工控机固定目录(建议纯英文路径,无中文、无空格) -
Win+R 输入
shell:startup打开系统开机自启文件夹 -
右键EXE程序,创建快捷方式,将快捷方式粘贴到自启文件夹
-
重启工控机,程序自动后台启动,开始实时检测
七、工业项目最终完整优化代码(适配打包部署)
整合路径适配、解码优化、后台运行、全套预处理与检测逻辑,这是可直接打包交付客户的最终版源码:
import os import time import sys import cv2 import numpy as np from datetime import datetime from ultralytics import YOLO # ========== 工业打包核心适配配置 ========== # 解决OpenCV视频流打包闪退问题 os.environ["OPENCV_VIDEOIO_MSMF_ENABLE_HW_TRANSFORMS"] = "0" # 全局路径适配(源码/EXE双模式兼容) def get_root_path(): if getattr(sys, 'frozen', False): return os.path.dirname(sys.executable) return os.path.dirname(os.path.abspath(__file__)) ROOT_PATH = get_root_path() MODEL_PATH = os.path.join(ROOT_PATH, "best.onnx") # 加载工业模型 model = YOLO(MODEL_PATH) # 防抖全局变量 last_warn_time = { "no_hat": 0, "no_suit": 0, "bare_skin": 0 } # 自动创建当日保存文件夹 def get_save_dir(): today = datetime.now().strftime("%Y-%m-%d") save_path = os.path.join(ROOT_PATH, "warn_save", today) if not os.path.exists(save_path): os.makedirs(save_path) return save_path # 获取标准时间字符串 def get_time_str(): return datetime.now().strftime("%Y-%m-%d %H:%M:%S") # 绘制画面时间水印 def draw_time_text(frame): time_str = get_time_str() cv2.putText(frame, time_str, (20, 35), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 255, 255), 2) return frame # 写入违规日志 def write_log(warn_type, img_name): log_time = get_time_str() log_dir = get_save_dir() log_path = os.path.join(log_dir, "log.txt") log_text = f"[{log_time}] 违规类型:{warn_type} 抓拍文件:{img_name}\n" with open(log_path, "a", encoding="utf-8") as f: f.write(log_text) # 智能防抖抓拍 def save_warn_image(frame, warn_type): now = time.time() if now - last_warn_time[warn_type] < 3: return False last_warn_time[warn_type] = now save_dir = get_save_dir() file_name = datetime.now().strftime("%H%M%S") + f"_{warn_type}.jpg" save_path = os.path.join(save_dir, file_name) cv2.imwrite(save_path, frame) write_log(warn_type, file_name) print(f"✅ 抓拍保存:{file_name}") return True # 工业全套预处理流水线 def industrial_preprocess(frame): h, w = frame.shape[:2] mask = np.zeros_like(frame) x1, y1 = int(w*0.1), int(h*0.2) x2, y2 = int(w*0.9), int(h*0.9) cv2.rectangle(mask, (x1, y1), (x2, y2), (255, 255, 255), -1) frame_roi = cv2.bitwise_and(frame, mask) frame_blur = cv2.GaussianBlur(frame_roi, (5, 5), 0) gray = cv2.cvtColor(frame_blur, cv2.COLOR_BGR2GRAY) binary = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 15, 3) kernel = np.ones((3, 3), np.uint8) binary = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel) binary = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel) result = cv2.cvtColor(binary, cv2.COLOR_GRAY2BGR) return result, (x1, y1, x2, y2) if __name__ == "__main__": # 工业RTSP视频流配置 cap = cv2.VideoCapture("rtsp://admin:123456@192.168.1.64:554/stream") cap.set(cv2.CAP_PROP_BUFFERSIZE, 1) while True: ret, frame = cap.read() if not ret: time.sleep(1) continue pre_frame, roi_pos = industrial_preprocess(frame) x1, y1, x2, y2 = roi_pos results = model.predict(pre_frame, imgsz=1280, conf=0.25, iou=0.4, verbose=False) warn_flag = False warn_class = "" # 遍历违规目标 for res in results: boxes = res.boxes for box in boxes: cls_id = int(box.cls[0]) cls_name = model.names[cls_id] if cls_name in ["no_hat", "no_suit", "bare_skin"]: warn_flag = True warn_class = cls_name # 违规抓拍留存 if warn_flag: save_warn_image(draw_time_text(frame), warn_class) # 画面绘制渲染 draw_frame = res.plot() cv2.rectangle(draw_frame, (x1, y1), (x2, y2), (0, 0, 255), 2) draw_frame = draw_time_text(draw_frame) cv2.imshow("Industrial Detect System", draw_frame) if cv2.waitKey(1) & 0xFF == 27: break cap.release() cv2.destroyAllWindows()
八、整套项目交付验收清单
学完本篇,你将拥有一套完整、可验收、可商用的工业AI视觉检测项目,全套能力闭环:
-
算法层:全套OpenCV工业预处理,抗光线、噪点、阴影、背景干扰
-
AI推理层:YOLO高精度实时检测,适配安全帽、工装、裸露违规识别
-
业务层:ROI区域限定、违规抓拍、时间水印、日志溯源、防抖防刷屏
-
部署层:EXE单文件打包、无环境运行、后台常驻、开机自启、工控机适配
九、全专栏总结
本专栏从OpenCV基础环境搭建 起步,循序渐进讲解色彩处理、降噪、形态学、轮廓筛选、ROI区域检测、RTSP实时视频流、数据存证、项目打包部署全流程,摒弃书本化理论,全程聚焦工业安防真实落地场景。
所有代码均经过工业场景优化,无冗余、无BUG、可直接复用,完美适配厂区人员穿戴合规检测、危险区域入侵检测、现场安防巡检等项目,从零到一完成完整工业视觉项目落地。
十、后续拓展预告
后续进阶拓展内容:多路摄像头并发检测、HTTP后端数据推送、可视化Web页面、告警语音播报、云端数据同步,助力项目从单机部署升级为系统化、平台化商用项目!