个人或主题网站建设实验报告长沙响应式网站建设
2026/4/18 9:39:20 网站建设 项目流程
个人或主题网站建设实验报告,长沙响应式网站建设,wordpress怎么上传插件,北京网站建设建站Flask快速搭建API#xff0c;让别人也能调用你的模型 你已经成功部署了阿里开源的「万物识别-中文-通用领域」图像分类模型#xff0c;也能本地运行推理。但如果你想让别人通过网页、手机App或其他系统来调用这个模型呢#xff1f;这时候就需要把它封装成一个可远程访问的A…Flask快速搭建API让别人也能调用你的模型你已经成功部署了阿里开源的「万物识别-中文-通用领域」图像分类模型也能本地运行推理。但如果你想让别人通过网页、手机App或其他系统来调用这个模型呢这时候就需要把它封装成一个可远程访问的API服务。本文将手把手教你使用轻量级Web框架Flask把本地运行的推理.py脚本改造成一个对外提供服务的 RESTful API 接口。完成后只需发送一个HTTP请求上传图片就能收到中文标签识别结果真正实现“让别人也能调用你的AI模型”。1. 为什么选择Flask在众多Python Web框架中如Django、FastAPI、TornadoFlask是最适合AI模型服务化的入门选择原因如下✅极简上手几行代码就能启动一个Web服务✅轻量灵活不强制项目结构适合小规模模型封装✅生态丰富与PyTorch、Pillow、transformers等AI库无缝集成✅调试友好开发模式支持热重载和详细错误提示⚠️ 提示生产环境建议升级为 FastAPI Gunicorn Nginx 组合但对新手来说Flask 是最平滑的第一步。2. 环境准备与依赖安装确保你已处于py311wwtsConda 环境并安装以下Web相关依赖conda activate py311wwts # 安装Flask pip install flask -i https://pypi.tuna.tsinghua.edu.cn/simple # 可选安装gunicorn用于后续性能测试非必需 pip install gunicorn检查当前目录结构推荐将所有文件放在/root/workspace/api_demo目录下结构如下/root/workspace/api_demo/ ├── app.py # Flask主程序 ├── inference.py # 封装好的推理模块由原推理.py改写 ├── static/ # 存放上传的图片 │ └── uploads/ └── requirements.txt # 记录完整依赖你可以通过以下命令创建目录mkdir -p /root/workspace/api_demo/static/uploads cd /root/workspace/api_demo3. 模块化改造从脚本到可导入函数原始的推理.py是一个独立脚本不适合被Flask调用。我们需要将其重构为一个可复用的模块 ——inference.py。### 3.1 创建inference.py将以下内容保存为/root/workspace/api_demo/inference.py# -*- coding: utf-8 -*- import torch from PIL import Image from transformers import AutoModel, AutoTokenizer, CLIPProcessor import os # 配置参数 MODEL_NAME bailian/visual-classification-zh-base DEVICE cuda if torch.cuda.is_available() else cpu # 默认候选标签可根据需求扩展 CANDIDATE_LABELS_ZH [ 动物, 植物, 交通工具, 电子产品, 食物, 自然景观, 城市建筑, 人物, 书籍, 服装, 家具, 办公用品, 海洋生物, 鸟类, 昆虫, 山脉, 河流, 沙漠, 飞机, 汽车, 火车, 轮船, 自行车, 摩托车, 猫, 狗, 老虎, 大象, 熊猫, 狮子 ] # 全局缓存模型和处理器 _model None _processor None def _load_model(): 懒加载模型首次调用时才加载 global _model, _processor if _model is not None: return _model, _processor print(正在加载万物识别模型...) processor CLIPProcessor.from_pretrained(MODEL_NAME) model AutoModel.from_pretrained(MODEL_NAME) model.to(DEVICE) model.eval() print(f模型加载完成运行设备: {DEVICE}) _model, _processor model, processor return _model, _processor def build_text_inputs(labels): 构建文本输入模板 return [f这是一张{label}的照片 for label in labels] def predict(image_path, custom_labelsNone): 执行图像分类预测 Args: image_path (str): 图片文件路径 custom_labels (list): 自定义候选标签列表可选 Returns: list: Top-5预测结果包含label和score model, processor _load_model() labels_to_use custom_labels or CANDIDATE_LABELS_ZH text_inputs build_text_inputs(labels_to_use) try: image Image.open(image_path).convert(RGB) except Exception as e: raise FileNotFoundError(f无法读取图像: {image_path}, 错误: {e}) inputs processor( texttext_inputs, imagesimage, return_tensorspt, paddingTrue, truncationTrue ).to(DEVICE) with torch.no_grad(): outputs model(**inputs) logits_per_image outputs.logits_per_image probs torch.softmax(logits_per_image, dim-1).cpu().numpy()[0] top_indices probs.argsort()[-5:][::-1] results [] for idx in top_indices: label labels_to_use[idx] score float(probs[idx]) results.append({label: label, score: round(score, 4)}) return results### 3.2 改造说明原始问题解决方案脚本式执行改为函数式接口predict()模型重复加载使用全局变量实现单例模式避免每次请求都重新加载路径写死接收外部传入的image_path不支持自定义标签新增custom_labels参数4. 构建Flask应用app.py现在我们来编写核心的Web服务入口文件。### 4.1 创建app.py将以下内容保存为/root/workspace/api_demo/app.py# -*- coding: utf-8 -*- from flask import Flask, request, jsonify, render_template from inference import predict import os import uuid from werkzeug.utils import secure_filename app Flask(__name__) # 配置上传目录 UPLOAD_FOLDER static/uploads os.makedirs(UPLOAD_FOLDER, exist_okTrue) app.config[UPLOAD_FOLDER] UPLOAD_FOLDER # 允许的图片格式 ALLOWED_EXTENSIONS {png, jpg, jpeg, bmp, gif} def allowed_file(filename): return . in filename and \ filename.rsplit(., 1)[1].lower() in ALLOWED_EXTENSIONS app.route(/) def index(): 主页提供简单的HTML上传界面 return h2 万物识别-中文通用模型 API 测试页/h2 p上传一张图片获取AI生成的中文标签/p form methodPOST action/predict enctypemultipart/form-data input typefile nameimage requiredbrbr button typesubmit开始识别/button /form app.route(/predict, methods[POST]) def api_predict(): API接口接收图片并返回识别结果 if image not in request.files: return jsonify({error: 未上传图片}), 400 file request.files[image] if file.filename : return jsonify({error: 文件名为空}), 400 if not allowed_file(file.filename): return jsonify({error: 不支持的文件类型}), 400 # 生成唯一文件名防止冲突 ext file.filename.rsplit(., 1)[1].lower() unique_filename f{uuid.uuid4().hex}.{ext} filepath os.path.join(app.config[UPLOAD_FOLDER], unique_filename) try: file.save(filepath) results predict(filepath) return jsonify({ success: True, results: results }) except Exception as e: return jsonify({error: str(e)}), 500 finally: # 可选识别后删除图片以节省空间 # if os.path.exists(filepath): # os.remove(filepath) pass if __name__ __main__: print( 启动Flask服务...) print( 访问 http://你的IP:5000 查看测试页面) app.run(host0.0.0.0, port5000, debugTrue)### 4.2 关键功能解析功能实现方式文件上传使用request.files获取上传图片安全校验allowed_file()过滤非法扩展名唯一命名uuid.uuid4()防止文件名冲突JSON响应jsonify()返回标准API格式异常处理try-except捕获推理错误调试模式debugTrue开启自动重启和错误追踪5. 启动API服务并测试### 5.1 运行Flask应用进入项目目录并启动服务cd /root/workspace/api_demo python app.py你会看到输出 启动Flask服务... 访问 http://0.0.0.0:5000 查看测试页面 * Running on http://0.0.0.0:5000 (Press CTRLC to quit)### 5.2 如何访问服务如果你在本地Jupyter或PAI平台运行可通过端口转发或内网穿透访问。若有公网IP直接浏览器打开http://公网IP:5000大多数平台会自动映射URL例如https://xxxxx.cloud.com/### 5.3 测试API接口方法一使用网页表单适合新手打开http://IP:5000点击“选择文件”上传一张图片如猫、风景、汽车提交后即可看到返回的Top-5中文标签。方法二使用curl命令适合开发者curl -X POST http://127.0.0.1:5000/predict \ -F image/root/workspace/cat.jpg \ | python -m json.tool预期返回示例{ success: true, results: [ {label: 动物, score: 0.9872}, {label: 猫, score: 0.9645}, {label: 宠物, score: 0.8721}, {label: 哺乳动物, score: 0.7633}, {label: 家具, score: 0.1023} ] }6. 实际应用场景举例一旦API上线它可以被各种系统轻松调用场景调用方式智能相册分类移动App上传照片 → 获取中文标签 → 自动归类“宠物”、“旅行”等相册内容审核辅助后台管理系统上传用户图片 → 判断是否含“敏感物品”、“违规场景”教育辅助工具学生拍照植物 → 返回“银杏叶”、“向日葵”等名称 → 辅助自然课学习无障碍识别视障人士拍摄周围环境 → 语音播报“前方是公交车站”7. 常见问题与优化建议### 7.1 常见问题排查问题现象解决方法OSError: [WinError 10013]Windows需改为host127.0.0.1Linux保持0.0.0.0上传大图卡顿在inference.py中添加图像缩放预处理多次请求变慢确保_load_model()只执行一次检查全局变量中文乱码文件保存为 UTF-8 编码Flask默认支持中文JSON输出### 7.2 性能优化建议限制图片大小在app.py的api_predict中加入尺寸检查from PIL import Image as PILImage # 添加前 img PILImage.open(file.stream) if max(img.size) 2048: return jsonify({error: 图片尺寸过大请上传小于2048px的图片}), 400启用GPU批处理进阶修改predict()函数支持批量图片编码提升吞吐量。增加缓存机制对相同图片MD5值的结果进行缓存避免重复计算。部署为后台服务使用nohup python app.py 或systemd守护进程防止中断。8. 总结从本地脚本到可用API的完整跃迁## 8.1 本教程核心收获✅ 成功将推理.py脚本模块化为可复用的inference.py✅ 使用 Flask 快速搭建了一个支持图片上传的 Web API✅ 实现了/predict接口支持 JSON 格式返回识别结果✅ 掌握了模型服务化的基本流程加载 → 接收 → 推理 → 返回✅ 学会了如何测试和调用自己的AI服务## 8.2 下一步可以做什么接入前端页面用HTMLCSS美化上传界面实时显示识别结果支持Base64输入允许前端直接传base64字符串无需上传文件添加身份验证使用Token控制API访问权限部署到云服务器将服务发布到公网供他人长期使用结合数据库记录每次请求日志便于分析使用情况你现在不仅拥有一个强大的中文图像识别模型更掌握了让它“走出去”的能力 —— 把AI能力变成真正的生产力工具。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询