当前位置: 首页 > news >正文

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

在这里插入图片描述

相关文章:

  • Go微服务: 分布式之发送带有事务消息的示例
  • 树结构的实现
  • java多线程临界区介绍
  • 代码随想录算法训练营第五十七天|1143.最长公共子序列、1035.不相交的线、53. 最大子序和、392.判断子序列
  • SQL进阶day10————多表查询
  • Xmind导入纯文本TXT方法
  • Flutter之旅:探索安卓与跨平台开发的无限可能
  • 【云原生Kubernetes项目部署】k8s集群+高可用负载均衡层+防火墙
  • 【代码随想录算法训练营第37期 第三十二天 | LeetCode122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II】
  • 论文图片颜色提取
  • 数据分享 I 1970-2021年各区县碳排放总量
  • 1. lvs负载均衡
  • 从云端到终端:青犀视频汇聚/融合平台的视频接入方式与场景应用
  • tkinter+火山引擎+python实现语音识别聊天机器人
  • Rust : windows下protobuf和压缩传输方案
  • Android Studio:GIT提交项目到远程仓库
  • CSS 三角实现
  • DataBase in Android
  • php中curl和soap方式请求服务超时问题
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • SwizzleMethod 黑魔法
  • 初识 webpack
  • 给新手的新浪微博 SDK 集成教程【一】
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 官方解决所有 npm 全局安装权限问题
  • 手写双向链表LinkedList的几个常用功能
  • 网页视频流m3u8/ts视频下载
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 一份游戏开发学习路线
  • 【云吞铺子】性能抖动剖析(二)
  • ionic入门之数据绑定显示-1
  • ​configparser --- 配置文件解析器​
  • ​香农与信息论三大定律
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #1014 : Trie树
  • #Lua:Lua调用C++生成的DLL库
  • #mysql 8.0 踩坑日记
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (003)SlickEdit Unity的补全
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (动态规划)5. 最长回文子串 java解决
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (力扣)1314.矩阵区域和
  • (一一四)第九章编程练习
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • .apk 成为历史!
  • .net wcf memory gates checking failed
  • .NET 反射 Reflect
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .net反编译工具
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET文档生成工具ADB使用图文教程
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • .NET中的Exception处理(C#)