关于
本项目是一个基于Streamlit的Web应用程序,旨在通过YOLOv8实现实时安全装备检测。该应用程序能够检测图像中的头盔、反光衣和其他安全装备,确保工作场所的安全合规性。以下是对该项目的详细介绍:
项目背景
在许多工业和建筑领域,确保员工佩戴适当的安全装备是至关重要的。这不仅有助于保护员工免受潜在的伤害,还能确保企业遵守相关法律法规。然而,传统的安全检查方法往往依赖于人工目测,效率低下且容易出错。为了解决这一问题,我们开发了这个基于YOLOv8的实时安全装备检测系统,利用先进的计算机视觉技术自动化这一过程。
技术栈
- Streamlit:Streamlit是一个开源Python库,用于快速构建数据科学和机器学习Web应用程序。它提供了简洁的API,使得开发者可以轻松地将复杂的模型和数据可视化集成到Web界面中。
- YOLOv8:YOLO(You Only Look Once)是一种高效的实时目标检测算法。YOLOv8是该系列的最新版本,具有更高的精度和更快的推理速度。我们在本项目中使用YOLOv8进行安全装备的检测。
- OpenCV:OpenCV是一个开源计算机视觉库,提供了丰富的图像处理和视频分析功能。我们在项目中使用OpenCV进行图像预处理和后处理。
- Pillow:Pillow是一个Python Imaging Library(PIL)的分支,用于处理图像文件。我们在项目中使用Pillow将图像转换为适合YOLOv8输入的格式。
功能介绍
- 实时检测:用户可以通过上传图像或选择摄像头流来启动实时检测。应用程序会自动检测图像中的头盔、反光衣和其他安全装备,并在图像中标注出检测结果。
- 多类别检测:YOLOv8模型经过训练,可以识别多种类型的安全装备,包括但不限于头盔、反光衣、安全鞋等。每种装备都会被标注不同的颜色,以便用户一目了然。
- 结果可视化:检测结果会在图像上以边界框的形式显示,并附带类别标签和置信度分数。用户可以通过这些信息判断员工是否正确佩戴了安全装备。
- 导出报告:应用程序支持将检测结果导出为CSV文件,方便用户进行进一步的数据分析和记录。导出的报告包括检测时间、图像路径、检测到的装备类型及其位置等信息。
- 用户界面:Streamlit提供的用户界面简洁明了,用户可以通过简单的操作完成图像上传、实时检测和结果查看。此外,应用程序还提供了详细的帮助文档和示例,帮助用户快速上手。
使用步骤
-
安装依赖:首先,确保你的环境中已经安装了Python。然后,使用以下命令安装项目所需的依赖包:
pip install streamlit opencv-python ultralytics pillow
-
运行应用程序:克隆项目仓库,进入项目目录,运行以下命令启动应用程序:
streamlit run app.py
-
上传图像:在启动的应用程序中,点击“Upload Image”按钮,选择你要检测的图像文件。应用程序会立即显示检测结果。
-
实时检测:如果需要进行实时检测,点击“Start Camera”按钮,应用程序会启动摄像头并开始实时检测。检测结果会实时显示在界面上。
-
导出报告:检测完成后,点击“Export Report”按钮,应用程序会生成一个包含检测结果的CSV文件,用户可以下载并保存。
项目优势
- 高效性:YOLOv8的高性能使得应用程序能够在实时视频流中快速准确地检测安全装备,大大提高了工作效率。
- 准确性:经过精心训练的模型能够准确识别多种类型的安全装备,减少了误检和漏检的可能性。
- 易用性:Streamlit提供的简洁用户界面使得应用程序易于使用,无需复杂的配置和操作。
- 灵活性:应用程序支持多种输入方式,包括图像文件和摄像头流,满足不同场景的需求。
未来展望
- 多平台支持:计划将应用程序扩展到移动设备,使其可以在iOS和Android平台上运行,进一步提高便携性和实用性。
- 实时报警:增加实时报警功能,当检测到员工未佩戴安全装备时,系统可以立即发出警报,提醒相关人员采取措施。
- 多语言支持:为了满足国际用户的需求,计划添加多语言支持,使应用程序能够在全球范围内使用。
重要代码
app.py
import os
os.environ["STREAMLIT_WATCH_FILE"] = "none"
import torch
import streamlit as st
import settings
import helper
from PIL import Image
import tempfile
import os
from helper import download_model
torch.classes.__path__ = []
MODEL_URL = ""
download_model(MODEL_URL, settings.MODEL_PATH)
model = helper.load_model(settings.MODEL_PATH)
st.set_page_config(page_title="YOLOv8 Detection", page_icon="⛑️", layout="wide")
st.title("🦺👷♂️Universal Safety Detection👷♂️🦺 ")
# Sidebar
st.sidebar.header("Configuration")
confidence = st.sidebar.slider("Confidence Threshold", 0.1, 1.0, 0.4)
source_type = st.sidebar.radio("Select Source", settings.SOURCES_LIST)
detect_button = st.sidebar.button("Run Detection")
# Load model
model = helper.load_model(settings.MODEL_PATH)
# Image
if source_type == settings.SOURCES_LIST[0]:
uploaded_images = st.sidebar.file_uploader("Upload Images", type=["jpg", "jpeg", "png"], accept_multiple_files=True)
if uploaded_images and detect_button:
for i, image_file in enumerate(uploaded_images, start=1):
st.subheader(f"Image {i}")
col1, col2 = st.columns(2)
image = Image.open(image_file)
with col1:
st.image(image, caption="Original", use_container_width=True)
with col2:
results = helper.predict_image(model, image, confidence)
plotted, counts = helper.plot_boxes(results)
st.image(plotted, caption="Detected", use_container_width=True)
with st.expander("Results"):
if counts:
for cls, count in counts.items():
st.write(f"**{cls}:** {count}")
else:
st.write("No objects detected.")
# Video
if source_type == settings.SOURCES_LIST[1]:
uploaded_video = st.sidebar.file_uploader("Upload Video", type=["mp4", "avi", "mov"])
if uploaded_video and detect_button:
with tempfile.NamedTemporaryFile(delete=False, suffix=".mp4") as temp:
temp.write(uploaded_video.read())
video_path = temp.name
st.video(uploaded_video)
st.write("Processing Video...")
# Process the video using the helper function
output_path = helper.process_video(model, video_path, confidence)
if os.path.exists(output_path):
st.success(f"Detection Completed! Video saved to: {output_path}")
st.video(output_path)
else:
st.error("Error processing video.")
# Webcam
if source_type == settings.SOURCES_LIST[2]:
if detect_button:
st.info("Starting Webcam... Click Stop Webcam to end.")
helper.process_webcam(model, confidence)
elif source_type == settings.WEBCAM:
if "run" not in st.session_state:
st.session_state["run"] = False
通过这个基于YOLOv8的实时安全装备检测系统,我们希望能够为企业提供一种高效、准确、易用的工具,确保工作场所的安全合规性,减少事故发生的风险,保护员工的生命安全。