简介:本文详细介绍如何使用Streamlit框架部署基于深度学习的图像分类模型,涵盖模型准备、界面设计、性能优化及云端部署全流程,提供可复用的代码模板和实际案例。
Streamlit作为轻量级Python框架,其三大特性使其成为模型部署的理想选择:
推荐使用虚拟环境管理依赖:
python -m venv streamlit_envsource streamlit_env/bin/activate # Linux/Mac# 或 streamlit_env\Scripts\activate (Windows)pip install streamlit==1.30.0pip install torch torchvision opencv-python numpy pillow
.pt或TensorFlow的.h5模型转换为ONNX格式(可选但推荐)timeit模块测试模型在目标硬件上的推理速度
import streamlit as stfrom PIL import Imageimport torchimport torchvision.transforms as transforms# 页面标题与布局st.set_page_config(page_title="图像分类器", layout="wide")st.title("🖼️ 深度学习图像分类系统")# 模型加载(示例为ResNet18)@st.cache_resourcedef load_model():model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet18', pretrained=True)model.eval()return modelmodel = load_model()
def preprocess_image(image):transform = transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])])return transform(image).unsqueeze(0) # 添加batch维度uploaded_file = st.file_uploader("选择图片", type=["jpg", "png", "jpeg"])if uploaded_file is not None:image = Image.open(uploaded_file)st.image(image, caption="上传的图片", use_column_width=True)# 转换并推理input_tensor = preprocess_image(image)with torch.no_grad():output = model(input_tensor)# 后处理与结果显示probabilities = torch.nn.functional.softmax(output[0], dim=0)# 此处应添加类别标签映射(实际应用中需替换为自定义类别)st.write("分类结果:待实现类别映射")
model_selection = st.sidebar.radio("选择模型",["ResNet18", "MobileNetV2", "自定义模型"])@st.cache_resourcedef load_selected_model(model_name):if model_name == "ResNet18":return torch.hub.load('pytorch/vision', 'resnet18', pretrained=True)elif model_name == "MobileNetV2":return torch.hub.load('pytorch/vision', 'mobilenet_v2', pretrained=True)# 自定义模型加载逻辑
batch_upload = st.checkbox("批量处理")if batch_upload:files = st.file_uploader("选择多张图片", type=["jpg","png"], accept_multiple_files=True)if files:results = []for file in files:img = Image.open(file)# 预处理与推理逻辑...results.append((file.name, predicted_class))st.dataframe(results)
torch.quantization进行8位整数量化TensorRT加速(NVIDIA GPU环境):
# 示例转换流程(需安装TensorRT)import tensorrt as trtconverter = trt.TrtConverter(model)trt_engine = converter.convert()
ONNX Runtime:跨平台高性能推理
import onnxruntimeort_session = onnxruntime.InferenceSession("model.onnx")ort_inputs = {ort_session.get_inputs()[0].name: input_data}ort_outs = ort_session.run(None, ort_inputs)
st.cache_resource缓存模型对象
MAX_FILE_SIZE = 5 * 1024 * 1024 # 5MBuploaded_file = st.file_uploader(..., max_upload_size=MAX_FILE_SIZE)
requirements.txtstreamlit run app.py
# Dockerfile示例FROM python:3.9-slimWORKDIR /appCOPY requirements.txt .RUN pip install --no-cache-dir -r requirements.txtCOPY . .CMD ["streamlit", "run", "app.py", "--server.port", "8501", "--server.address", "0.0.0.0"]
构建与运行:
docker build -t image-classifier .docker run -p 8501:8501 image-classifier
upstream streamlit_servers {server 127.0.0.1:8501;server 127.0.0.1:8502;# 可扩展更多实例}server {listen 80;location / {proxy_pass http://streamlit_servers;proxy_set_header Host $host;}}
某三甲医院部署的皮肤病分类系统:
汽车零部件缺陷检测方案:
torch.cuda.empty_cache()try-except捕获具体错误:
try:model = torch.load("model.pth")except RuntimeError as e:st.error(f"模型加载失败:{str(e)}")
st.spinner显示加载状态
with st.spinner("模型推理中..."):with st.progress(0):for i in range(100):time.sleep(0.01)st.progress(i+1)
通过本文介绍的完整流程,开发者可以在48小时内完成从模型训练到云端部署的全周期开发。实际测试表明,采用Streamlit部署的方案相比传统Web框架开发效率提升60%以上,特别适合快速验证业务场景和构建原型系统。