使用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应用程序:

python 复制代码
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:

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

  3. 运行Streamlit应用程序:

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

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

YOLOv8-检测实例

完整代码如下:

python 复制代码
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应用:

sh 复制代码
streamlit run yolo8_Streamlit.py

Streamlit会自动在浏览器中打开应用程序,你可以上传图像并查看YOLOv8模型的检测结果。
注意一点:

运行这段代码,必须在终端下面运行上述命令行,若在pycharm下右击运行代码,会报警告,而且有如下错误:

正确运行是在pycharm的terminal终端输入上面指令运行,如下:

回车后,会自动打开浏览器,如下所示:

会生成两个网址,一个本地访问,一个网络访问,给别人使用。

页面如下:

加载图片,检测结果如下:

相关推荐
Boilermaker199219 分钟前
【Java EE】SpringIoC
前端·数据库·spring
mozun202024 分钟前
激光雷达信号提取方法对比梳理2025.7.8
目标检测·激光雷达·信号提取·gm-apd·滤波算法
中微子31 分钟前
JavaScript 防抖与节流:从原理到实践的完整指南
前端·javascript
天天向上10241 小时前
Vue 配置打包后可编辑的变量
前端·javascript·vue.js
芬兰y1 小时前
VUE 带有搜索功能的穿梭框(简单demo)
前端·javascript·vue.js
好果不榨汁1 小时前
qiankun 路由选择不同模式如何书写不同的配置
前端·vue.js
小蜜蜂dry1 小时前
Fetch 笔记
前端·javascript
拾光拾趣录1 小时前
列表分页中的快速翻页竞态问题
前端·javascript
小old弟1 小时前
vue3,你看setup设计详解,也是个人才
前端
Lefan1 小时前
一文了解什么是Dart
前端·flutter·dart