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

news2024/11/24 9:39:34

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终端输入上面指令运行,如下:
在这里插入图片描述
回车后,会自动打开浏览器,如下所示:
在这里插入图片描述
会生成两个网址,一个本地访问,一个网络访问,给别人使用。
页面如下:
在这里插入图片描述
加载图片,检测结果如下:
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1817575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超全分析MybatisPlus中的MetaObjectHandler全局字段填充的基本知识(附Demo及实战)

目录 前言1. 源码及API2. Demo架构3. 全局字段填充(实战)4. 局部字段不填充(实战) 前言 对于Java的相关知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项…

消息队列的应用场景有哪些

通常来说,使用消息队列主要能为我们的系统带来下面三点好处: 异步处理 削峰/限流 降低系统耦合性 除了这三点之外,消息队列还有其他的一些应用场景,例如实现分布式事务、顺序保证和数据流处理。 异步处理 通过异步处理提高系…

Vue3、Element Plus使用v-for循环el-form表单进行校验

在开发中遇到了这样一个需求 有一个form是通过v-for生成出来的&#xff0c;并且数量不确定&#xff0c;每个表单中的字段都需要做校验&#xff0c;就将自己的解决方法记录了下来。 完整代码如下 <template><div class"for-form"><el-button type&quo…

【python】tkinter GUI开发: 多行文本Text,单选框Radiobutton,复选框Checkbutton,画布canvas的应用实战详解

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

将MAE方法用于reflacx数据集--MMpretrain/slurm

MAE—reflacx 问题问题一 对数据集reflacx的了解问题二 MAE实现的是有监督&#xff0c;还是无监督任务问题三 实验流程问题四 实验目的 一、从github上fork我师兄的项目30min&#xff08;github账号的注册什么的&#xff0c;可以去参考b站&#xff09;1.1 点开下面这个链接…

PyTorch -- 最常见激活函数的选择

首先&#xff0c;简单复习下什么是梯度&#xff1a;梯度是偏微分的集合 举例说明&#xff1a;对于 z y 2 − x 2 : ∇ z ( ∂ z ∂ x , ∂ z ∂ y ) &#xff08; 2 x , 2 y &#xff09; z y^2-x^2: \nabla z (\frac{\partial z}{\partial x}, \frac{\partial z}{\partia…

vue3+vite+ts 使用webrtc-streamer播放海康rtsp监控视频

了解webrtc-streamer webrtc-streamer 是一个使用简单机制通过 WebRTC 流式传输视频捕获设备和 RTSP 源的项目&#xff0c;它内置了一个小型的 HTTP server 来对 WebRTC需要的相关接口提供支持。相对于ffmpegflv.js的方案&#xff0c;延迟降低到了0.4秒左右&#xff0c;画面的…

PyTorch学习9:卷积神经网络

文章目录 前言一、说明二、具体实例1.程序说明2.代码示例 总结 前言 介绍卷积神经网络的基本概念及具体实例 一、说明 1.如果一个网络由线性形式串联起来&#xff0c;那么就是一个全连接的网络。 2.全连接会丧失图像的一些空间信息&#xff0c;因为是按照一维结构保存。CNN是…

Shell环境下的脚本编程与应用

Shell是什么&#xff1f; Shell 是一个命令行解释器&#xff0c;它接收用户输入的命令&#xff08;如 ls、cd、mkdir 等&#xff09;&#xff0c;然后执行这些命令。Shell 同时还是一种功能强大的编程语言&#xff0c;允许用户编写由 shell 命令组成的脚本&#xff08;script&…

Windows搭建nacos集群

Nacos是阿里巴巴的产品&#xff0c;现在是SpringCloud中的一个组件。相比Eureka功能更加丰富&#xff0c;在国内受欢迎程度较高。 下载地址&#xff1a;Tags alibaba/nacos GitHub 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;8888 解压文件夹 目录说明&am…

基于条件谱矩的时间序列分析(以轴承故障诊断为例,MATLAB)

谱矩方法可以对数据的表面形貌做较为细致的描述&#xff0e;它以随机过程为理论基础&#xff0c;用各阶谱矩及统计不变量等具体的参数表征表面的几何形态&#xff0c;算术平均顶点曲率是一种基于四阶谱矩的统计不变量。 鉴于此&#xff0c;采用条件谱矩方法对滚动轴承进行故障诊…

[大模型]MiniCPM-2B-chat Lora Full 微调

MiniCPM-2B-chat 介绍 MiniCPM 是面壁智能与清华大学自然语言处理实验室共同开源的系列端侧大模型&#xff0c;主体语言模型 MiniCPM-2B 仅有 24亿&#xff08;2.4B&#xff09;的非词嵌入参数量。 经过 SFT 后&#xff0c;MiniCPM 在公开综合性评测集上&#xff0c;MiniCPM …

【C++题解】1469. 数的统计

问题&#xff1a;1469. 数的统计 类型&#xff1a;嵌套循环 题目描述&#xff1a; 试计算在区间 1 到 n 的所有整数中&#xff0c;数字 x ( 0≤x≤9 )共出现了多少次&#xff1f; 例如&#xff0c;在 1 到 11 中&#xff0c;即在 1,2,3,4,5,6,7,8,9,10,11 中&#xff0c;数字…

HCIA 10 网络安全之结合ACL访问控制列表登录Telnet及FTP

ACL 本质上是一种报文过滤器&#xff0c;规则是过滤器的滤芯。设备基于这些规则进行报文匹配&#xff0c;可以过滤出特定的报文&#xff0c;并根据应用 ACL 的业务模块的处理策略来允许或阻止该报文通过。 1.实验介绍及拓扑 R3 为telnet服务器&#xff0c;R1 为客户端&#…

简单的基于Transformer的滚动轴承故障诊断(Pytorch)

递归神经网络在很长一段时间内是序列转换任务的主导模型&#xff0c;其固有的序列本质阻碍了并行计算。因此&#xff0c;在2017年&#xff0c;谷歌的研究人员提出了一种新的用于序列转换任务的模型架构Transformer&#xff0c;它完全基于注意力机制建立输入与输出之间的全局依赖…

计算机图形学入门09:深度缓存

在前面知道了怎么将一个三角形显示到屏幕上&#xff0c;那么如果有很多三角形&#xff0c;各自距离相机的远近也不一样&#xff0c;并且三角形会相互遮挡。也就是三维空间中有很多物体&#xff0c;通常近处的物体会遮挡住远处的物体&#xff0c;那么在计算机渲染中该如何处理呢…

出现 Error creating bean with name xxx defined in class 的解决方法

目录 1. 问题所示2. 原理分析3. 解决方法4. Demo1. 问题所示 此类问题来自私信,本着探究问题的缘由,理性分析了下,让大家也学会分析Bug解决Bug 问题如下所示: Error creating bean with name xxx defined in class截图如下所示: 2. 原理分析 通用的原理进行分析 出现…

【C语言初阶】数组

&#x1f31f;博主主页&#xff1a;我是一只海绵派大星 &#x1f4da;专栏分类&#xff1a;C语言 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、一维数组的创建和初始化 1、数组的创建 1.1数组的创建方式 1.2数组创建的实例 2、数组的初始化 二、一维数组的使用…

vue.js+node.js+mysql在线聊天室源码

vue.jsnode.jsmysql在线聊天室源码 技术栈&#xff1a;vue.jsElement UInode.jssocket.iomysql vue.jsnode.jsmysql在线聊天室源码

word怎么单页横向设置(页码不连续版)

打开word&#xff0c;将光标放在第一页的最后位置。 然后点击布局下的分隔符&#xff0c;选择下一页。 将光标放在第二页的开头&#xff0c;点击布局下的纸张方向&#xff0c;选择横向即可。 效果展示。 PS&#xff1a;如果那一页夹在两页中间&#xff0c;那么在…