使用Stream实现Web应用,使用YOLOv8模型对图像进行目标检测为例。

Streamlit是一个开源的Python框架,专门设计用于快速构建和共享数据应用程序。它使数据科学家和机器学习工程师能够通过编写简单的Python脚本,轻松创建美观、功能强大的Web应用程序,而无需具备前端开发的经验。
其他框架或web应用可以看下面两篇博客介绍
1.使用gradio库实现Web应用,允许用户上传图像,并使用YOLOv8模型对图像进行目标检测。
2.python常用Web框架介绍

以下是Streamlit的一些关键特性和功能:

  1. 简单易用

    • 只需几行代码即可创建一个应用程序。
    • 不需要HTML、CSS或JavaScript知识。
  2. 实时更新

    • 应用程序可以在代码更改时实时更新,无需手动刷新浏览器。
  3. 交互式小部件

    • 提供多种交互式小部件,如滑块、按钮、下拉菜单等,用户可以与应用程序进行互动。
  4. 集成数据可视化

    • 支持多种数据可视化库,如Matplotlib、Seaborn、Plotly、Altair等,轻松将数据可视化集成到应用程序中。
  5. Markdown支持

    • 支持Markdown语法,方便用户在应用程序中添加文本、标题、链接等内容。
  6. 部署方便

    • 可以轻松地将应用程序部署到云端,分享给他人使用。

示例代码

下面是一个简单的Streamlit应用程序示例,展示如何使用Streamlit创建一个基本的Web应用程序:

import streamlit as st
import pandas as pd
import numpy as np

# 标题
st.title('我的第一个 Streamlit 应用')

# 文本输入
user_input = st.text_input("输入你的名字")

# 显示用户输入
st.write(f"你好,{user_input}!")

# 显示数据框
df = pd.DataFrame({
    '列A': np.random.randn(10),
    '列B': np.random.randn(10)
})
st.write("数据框示例:", df)

# 显示图表
st.line_chart(df)

# 交互式小部件
if st.button('点击我'):
    st.write("按钮已点击!")

# 下拉菜单
option = st.selectbox(
    '选择一个选项',
    ['选项1', '选项2', '选项3']
)
st.write('你选择了:', option)

如何运行Streamlit应用程序

  1. 安装Streamlit:

    pip install streamlit
    
  2. 创建一个Python脚本,例如app.py,并将上述示例代码复制到该文件中。

  3. 运行Streamlit应用程序:

    streamlit run app.py
    
  4. 在浏览器中打开显示的URL,即可看到Streamlit应用程序。

Streamlit通过简单的API和实时的反馈,极大地简化了数据应用程序的开发和分享过程,适合快速原型设计和数据展示。

YOLOv8-检测实例

完整代码如下:

import streamlit as st

# 设置页面配置
st.set_page_config(page_title="YOLOv8 图像检测", layout="wide")

import cv2
import numpy as np
import os
from ultralytics import YOLO
from PIL import Image

# 设置上传和结果文件夹
UPLOAD_FOLDER = 'uploads'
RESULT_FOLDER = 'results'
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
os.makedirs(RESULT_FOLDER, exist_ok=True)

# 加载模型
model = YOLO('yolov8n.pt')


def process_image(image):
    # 将PIL图像转换为OpenCV格式
    image = np.array(image)
    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)

    # 保存上传的图像
    filename = 'uploaded_image.jpg'
    file_path = os.path.join(UPLOAD_FOLDER, filename)
    cv2.imwrite(file_path, image)

    # 处理图像
    results = model(image)
    detection_results = []
    for result in results:
        boxes = result.boxes
        for box in boxes:
            x1, y1, x2, y2 = box.xyxy[0]
            conf = box.conf[0]
            cls = box.cls[0]
            class_name = model.names[int(cls)]
            cv2.rectangle(image, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
            cv2.putText(image, f'{class_name}:{conf:.2f}', (int(x1), int(y1) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9,
                        (36, 255, 12), 2)
            detection_results.append(f'Class: {class_name}, Confidence: {conf:.2f}, Box: ({x1}, {y1}), ({x2}, {y2})')

    # 保存处理后的图像
    result_filename = 'result_image.jpg'
    result_path = os.path.join(RESULT_FOLDER, result_filename)
    cv2.imwrite(result_path, image)

    # 将处理后的图像转换回PIL格式
    result_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    result_image = Image.fromarray(result_image)

    return result_image, detection_results


# 创建Streamlit界面
st.title("YOLOv8 图像检测")
st.write("上传图像并使用YOLOv8模型进行检测")

uploaded_file = st.file_uploader("上传图像", type=["jpg", "jpeg", "png"])

if uploaded_file is not None:
    # 加载上传的图像
    image = Image.open(uploaded_file)
    # st.image(image, caption='上传的图像', use_column_width=True)
    st.image(image, caption='上传的图像', width=600)

    # 处理图像
    result_image, detection_results = process_image(image)

    # 显示处理后的图像和检测结果
    # st.image(result_image, caption='处理后的图像', use_column_width=True)
    st.image(result_image, caption='处理后的图像', width=600)
    st.write("检测结果:")
    for result in detection_results:
        st.write(result)

# 启动Streamlit应用
if __name__ == '__main__':
    pass 

运行Streamlit应用:

将上述代码保存为 yolo8_Streamlit.py,在命令行运行以下命令启动Streamlit应用:

streamlit run yolo8_Streamlit.py

Streamlit会自动在浏览器中打开应用程序,你可以上传图像并查看YOLOv8模型的检测结果。
注意一点:
运行这段代码,必须在终端下面运行上述命令行,若在pycharm下右击运行代码,会报警告,而且有如下错误:
在这里插入图片描述
正确运行是在pycharm的terminal终端输入上面指令运行,如下:
在这里插入图片描述
回车后,会自动打开浏览器,如下所示:
在这里插入图片描述
会生成两个网址,一个本地访问,一个网络访问,给别人使用。
页面如下:
在这里插入图片描述
加载图片,检测结果如下:
在这里插入图片描述

在这里插入图片描述

<think>好的,我现在要解决的问题是:如何在YOLOv8中集成和使用WBS。首先,我需要明确用户所说的WBS具体指的是什么。WBS通常有两种常见的解释,一种是工作分解结构(Work Breakdown Structure),另一种是WebSockets。结合上下文提到的“可能是WebSockets或其他相关技术”,用户应该是指WebSockets,用于实时通信的技术。因此,我需要确定如何在YOLOv8中集成WebSockets来实现实时数据传输。 接下来,我需要了解YOLOv8的基本架构和使用方式。YOLOv8是Ultralytics公司开发的实时目标检测模型,通常使用Python编写,支持多种部署方式。集成WebSockets可能需要将模型的检测结果实时发送到客户端,如网页或移动应用。因此,解决方案可能涉及在YOLOv8的推理过程中添加WebSocket服务器,将检测结果通过WebSocket发送出去。 我需要考虑以下几个步骤: 1. **安装必要的库**:YOLOv8本身依赖PyTorch和Ultralytics库,而WebSocket可能需要使用websockets库或者FastAPI的WebSocket支持。因此,需要安装这些依赖。 2. **创建WebSocket服务器**:使用Python的异步库如websockets或通过框架如FastAPI来建立WebSocket服务器,处理客户端的连接请求。 3. **集成YOLOv8推理过程**:在服务器端运行YOLOv8模型进行实时检测,并将检测结果通过WebSocket发送给客户端。可能需要多线程或异步处理来同时运行模型推理和WebSocket通信。 4. **客户端实现**:编写一个简单的客户端(如JavaScript的Web客户端)来接收并显示检测结果。 需要注意的是,YOLOv8的推理过程可能比较耗时,尤其是在处理视频流时,需要确保WebSocket的通信不会阻塞主线程,否则会影响实时性能。因此,可能需要使用异步任务或者多进程来处理。 另外,还需要考虑数据传输的格式。检测结果通常是边界框坐标、类别和置信度,这些数据可以转换为JSON格式通过WebSocket发送,方便客户端解析和显示。 可能的代码结构包括: - 使用FastAPI创建WebSocket端点。 - 在WebSocket连接建立后,启动YOLOv8模型进行推理。 - 将每一帧的检测结果发送到客户端。 如,使用FastAPI的WebSocket路由处理函数,结合异步函数来处理模型推理和通信。 还需要处理可能的错误情况,如客户端断开连接时的资源释放,以及模型加载失败的处理等。 总结下来,步骤大致如下: 1. 安装所需库。 2. 创建WebSocket服务器。 3. 集成YOLOv8模型推理。 4. 实现客户端连接和数据传输。 5. 测试和优化性能。 在实施过程中,可能需要查阅YOLOv8的官方文档,了解如何实时处理视频流或摄像头输入,以及如何将检测结果导出。同时,WebSocket的使用需要遵循其协议规范,确保服务器和客户端的兼容性。</think>### 如何在 YOLOv8 中集成和使用 WebSocket (WBS) #### 1. 环境准备 首先安装必要的依赖库: ```bash pip install ultralytics websockets opencv-python ``` #### 2. 创建 WebSocket 服务器 使用 `websockets` 库搭建异步服务器,监听实时检测请求: ```python import asyncio import websockets from ultralytics import YOLO # 加载 YOLOv8 模型 model = YOLO("yolov8n.pt") async def detect_objects(websocket): async for frame_data in websocket: # 接收客户端发送的帧数据 results = model(frame_data) # 执行推理 await websocket.send(results.tojson()) # 返回 JSON 格式结果 async def main(): async with websockets.serve(detect_objects, "localhost", 8765): await asyncio.Future() # 永久运行 asyncio.run(main()) ``` #### 3. 客户端实现(JavaScript 示) ```javascript const ws = new WebSocket("ws://localhost:8765"); const video = document.getElementById("video"); // 从摄像头获取视频流并发送帧 navigator.mediaDevices.getUserMedia({ video: true }).then(stream => { video.srcObject = stream; const canvas = document.createElement("canvas"); const ctx = canvas.getContext("2d"); setInterval(() => { ctx.drawImage(video, 0, 0, canvas.width, canvas.height); canvas.toBlob(blob => ws.send(blob), "image/jpeg"); }, 100); // 按 10 FPS 发送 }); // 接收检测结果 ws.onmessage = event => { const detections = JSON.parse(event.data); renderBoxes(detections); // 自定义渲染函数 }; ``` #### 4. 优化建议 - **异步处理**:使用异步框架(如 FastAPI WebSocket)避免阻塞推理过程[^1]。 - **二进制传输**:压缩图像为 JPEG 格式减少带宽占用。 - **模型轻量化**:选择 `yolov8s` 或 `yolov8n` 等小型模型提升实时性。 #### 5. 应用场景 - 实时监控系统 - 智能安防直播 - 工业质检流水线
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值