深度学习实战:从零构建图像分类API(Flask/FastAPI版)
引言:AI时代的图像分类需求
在智能时代,图像分类技术已渗透到医疗影像分析、自动驾驶、工业质检等各个领域。作为开发者,掌握如何将深度学习模型封装为API服务,是实现技术落地的关键一步。本文将手把手教你使用Python生态中的Flask/FastAPI框架,结合PyTorch/TensorFlow部署一个端到端的图像分类API,最终得到一个可通过HTTP请求调用的智能服务。
一、技术栈选择指南
| 框架 | 特点 | 适用场景 |
|---|---|---|
| Flask | 轻量级、简单易学、扩展性强 | 小型项目、快速原型开发 |
| FastAPI | 高性能、自动生成API文档、支持异步 | 中大型项目、生产环境部署 |
| PyTorch | 动态计算图、研究友好、灵活性强 | 研究型项目、定制化模型开发 |
| TensorFlow | 静态计算图、工业级部署、生态完善 | 生产环境、大规模分布式训练 |
选择建议:新手可优先尝试Flask+PyTorch组合,熟悉后再探索FastAPI+TensorFlow的高阶用法。
二、实战教程:构建ResNet图像分类API
(一)阶段一:环境搭建
- 创建虚拟环境:
python -m venv image_api_env
source image_api_env/bin/activate # Linux/Mac
image_api_env\Scripts\activate # Windows
- 安装依赖:
pip install flask fastapi uvicorn torch torchvision pillow
# 或
pip install flask fastapi uvicorn tensorflow pillow
(二)阶段二:模型准备
# models/resnet.py(PyTorch示例)
import torch
from torchvision import models, transforms# 加载预训练ResNet
model = models.resnet18(pretrained=True)
model.eval() # 设置为推理模式# 图像预处理管道
preprocess = 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])
])# 定义推理函数
def predict(image_tensor):with torch.no_grad():output = model(image_tensor.unsqueeze(0))probabilities = torch.nn.functional.softmax(output[0], dim=0)return probabilities
(三)阶段三:API开发(Flask版)
# app_flask.py
from flask import Flask, request, jsonify
from PIL import Image
import io
import torch
from models.resnet import preprocess, predictapp = Flask(__name__)@app.route('/classify', methods=['POST'])
def classify():# 获取上传文件file = request.files['image']img = Image.open(io.BytesIO(file.read()))# 图像预处理img_tensor = preprocess(img)# 模型推理probs = predict(img_tensor)# 获取top5预测结果top5_prob, top5_indices = torch.topk(probs, 5)# 映射ImageNet类别标签with open('imagenet_classes.txt') as f:classes = [line.strip() for line in f.readlines()]results = [{'class': classes[idx],'probability': float(prob)} for idx, prob in zip(top5_indices, top5_prob)]return jsonify({'predictions': results})if __name__ == '__main__':app.run(debug=True)
(四)阶段四:API测试
bash复制代码curl -X POST -F "image=@test_image.jpg" http://localhost:5000/classify
或使用Postman发送POST请求,选择form-data格式上传图片。
(五)阶段五:性能优化(FastAPI版)
# app_fastapi.py
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import JSONResponse
from PIL import Image
import io
import torch
from models.resnet import preprocess, predictapp = FastAPI()@app.post("/classify")
async def classify(image: UploadFile = File(...)):# 图像加载与预处理img = Image.open(io.BytesIO(await image.read()))img_tensor = preprocess(img)# 模型推理probs = predict(img_tensor)# 获取预测结果top5_prob, top5_indices = torch.topk(probs, 5)# 读取类别标签with open('imagenet_classes.txt') as f:classes = [line.strip() for line in f.readlines()]results = [{'class': classes[idx],'probability': float(prob)} for idx, prob in zip(top5_indices, top5_prob)]return JSONResponse(content={'predictions': results})
运行命令:
bash复制代码uvicorn app_fastapi:app --reload
三、关键优化策略
- 模型量化:
# 量化示例(PyTorch)
model.quantized = torch.quantization.quantize_dynamic(model, {torch.nn.Linear}, dtype=torch.qint8
)
2.异步处理:
# FastAPI异步示例
from fastapi import BackgroundTasks@app.post("/classify")
async def classify_async(image: UploadFile = File(...), background_tasks: BackgroundTasks):# 将耗时操作放入后台任务background_tasks.add_task(process_image, image)return {"status": "processing"}async def process_image(image):# 实际处理逻辑...
3.缓存机制:
from fastapi.caching import Cachecache = Cache(ttl=3600) # 1小时缓存@app.get("/recent")
async def get_recent(id: str):result = cache.get(id)if not result:result = await fetch_data(id)cache.set(id, result)return result
四、部署方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 本地部署 | 易于调试、成本低 | 并发能力有限 | 开发测试阶段 |
| 云服务 | 高可用、自动扩展 | 需要持续运维成本 | 生产环境 |
| 容器化 | 环境隔离、便于迁移 | 需要容器编排知识 | 微服务架构 |
| Serverless | 按需付费、零运维 | 冷启动延迟 | 偶发性高并发场景 |
推荐组合:开发阶段使用本地部署,生产环境可采用Nginx+Gunicorn+Docker的云服务方案。
五、常见问题排查
- 图片上传失败:
- 检查请求头Content-Type是否为multipart/form-data ;
- 确认文件大小限制(Flask默认16MB,可通过MAX_CONTENT_LENGTH调整)。
2.模型加载缓慢:
- 使用torch.jit.trace进行模型编译;
- 尝试模型剪枝和量化。
3.预测结果不准确:
- 检查图像预处理流程是否与训练时一致;
- 验证输入图像的尺寸和归一化参数。
六、学习扩展路径
- 模型优化:
- 学习知识蒸馏技术
- 探索AutoML自动模型压缩
2.API安全:
- 添加API密钥认证
- 实现请求频率限制
3.进阶框架:
- 研究HuggingFace Transformers的API封装
- 探索ONNX Runtime的跨平台部署
七、结语:构建端到端AI应用的里程碑
通过本文的实践,我们不仅掌握了图像分类API的开发流程,更建立了从模型训练到生产部署的完整认知。随着技术的深入,可以尝试将人脸识别、目标检测等复杂任务封装为API,逐步构建自己的AI服务生态。记住,技术的价值在于应用,保持实践的热情,让AI真正赋能产业!
相关文章:
深度学习实战:从零构建图像分类API(Flask/FastAPI版)
引言:AI时代的图像分类需求 在智能时代,图像分类技术已渗透到医疗影像分析、自动驾驶、工业质检等各个领域。作为开发者,掌握如何将深度学习模型封装为API服务,是实现技术落地的关键一步。本文将手把手教你使用Python生态中的Fla…...
【Linux】39.一个基础的HTTP Web服务器
文章目录 1. 实现一个基础的HTTP Web服务器1.1 功能实现:1.2 Log.hpp-日志记录器1.3 HttpServer.hpp-网页服务器1.4 Socket.hpp-网络通信器1.5 HttpServer.cc-服务器启动器 1. 实现一个基础的HTTP Web服务器 1.1 功能实现: 总体功能: 提供We…...
阿里云域名证书自动更新acme.sh
因为阿里云的免费证书只有三个月的有效期,每次更换都比较繁琐,所以找到了 acme.sh,还有一种 certbot 我没有去了解,就直接使用了 acme.sh 来更新证书,acme.sh 的主要特点就是: 支持多种 DNS 服务商自动化续…...
大数据Hadoop(MapReduce)
MapReduce概述 MapReduce定义 MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上…...
图灵逆向——题十七-字体加密
十七题是一个很经典的字体加密案例,很适合新手入门~ 目录列表 过程分析代码实现 过程分析 打开开发者工具直接看请求,发现它请求的没有加密参数,以为万事大吉的你迫不及待的点击了响应,然后就会发现依托。。。 返回的数据中字体…...
(自用)蓝桥杯准备(需要写的基础)
要写的文件 led_app lcd_app key_app adc_app usart_app scheduler LHF_SYS一、外设引脚配置 1. 按键引脚 按键引脚配置如下: B1:PB0B2:PB1B3:PB2B4:PA0 2. LCD引脚 LCD引脚配置如下: GPIO_Pin_9 /* …...
系统与网络安全------网络通信原理(5)
资料整理于网络资料、书本资料、AI,仅供个人学习参考。 传输层解析 传输层 传输层的作用 IP层提供点到点的连接传输层提供端到端的连接 端口到端口的连接(不同端口号,代表不同的应用程序) TCP协议概述 TCP(Transm…...
minio提供nfs服务
minio提供nfs服务 挂载minio为本地目录配置开机自动挂载方法1: 使用supervisor实现开机自动挂载方法2: 服务单元实现开机自动挂载minio为本地目录---失败调试 配置NFS服务端 挂载minio为本地目录 使用 Minio 作为后端存储,并通过 NFS 为客户端提供访问,…...
vue2添加背景水印-手动实现(无组件模式)
1. App.vue <template><div id="app" class="app"><router-view></router-view></div> </template><script> export default {mounted() {this.updateWatermark();// 监听路由变化this.$router.afterEach(() =…...
嵌入式---加速度计
一、基本概念与定义 定义 加速度计(Accelerometer)是一种测量物体加速度(线性加速度或振动加速度)的传感器,可检测物体运动状态、振动幅度、倾斜角度等,输出与加速度成比例的电信号(模拟或数字信…...
swagger + Document
swagger 虽然有了api接口,对于复杂接口返回值说明,文档还是不能少。如果是一个人做的还简单一点,现在都搞前后端分离,谁知道你要取那个值呢...
【Git】--- 多人协作实战场景
Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: Git 前面我们学习了Git的所有本地仓库的相关操作:git基本操作,分支理解,版本回退,冲突解决等等。同时我们还理解了远端仓库在开发的作用以及相关操作push…...
Higress: 阿里巴巴高性能云原生API网关详解
一、Higress概述 Higress是阿里巴巴开源的一款基于云原生技术构建的高性能API网关,专为Kubernetes和微服务架构设计。它集成了Ingress控制器、微服务网关和API网关功能于一体,支持多种协议和丰富的流量管理能力。 发展历程 Higress 从最初社区的 Isti…...
常见的 set 选项与空变量检查
在编写 Bash 脚本时,使用 set 命令中的一些选项可以帮助我们在脚本执行过程中及时捕获错误和潜在问题,避免脚本在出错时继续执行,提高脚本的可靠性和健壮性。 set -e:遇到错误就停 set -e 的作用是:一旦脚本中的某个…...
leetcode 377. Combination Sum IV
这道题也是完全背包问题。这道题和第518题几乎一摸一样,所不同的是,第518题要求的是组合数,而第377题要求的是排列数。虽然本题题目描述中说求的是组合数,但从例子1中(1,1,2)和&…...
VM——相机拍照失败
1、问题:相机频闪触发,在MVS中正常出图,在VM中出现拍照失败 2、解决: 1、首先排查网络设置(巨帧是否设置) 2、电脑的所有防火墙是否关闭 3、在MVS中恢复相机的设置参数为默认参数,删除VM中的全…...
初识Redis · 简单理解Redis
目录 前言: 分布式系统 开源节流 认识Redis 负载均衡 缓存 微服务 前言: 本文只是作为Redis的一篇杂谈,简单理解一下Redis为什么要存在,以及它能做到和它不能做到的事儿,简单提及一下它对应的优势有什么&#…...
目标检测YOLO实战应用案例100讲- 基于卷积神经网络的小目标检测算法研究与应用
目录 知识储备 基于改进YOLOv5的小目标检测算法 一、环境配置(Python 3.8+) 二、核心代码实现 1. 改进模型定义(models/yolov5s_tiny.py ) 2. 小目标数据增强(datasets/tiny_aug.py ) 3. 训练脚本(train.py ) 三、关键改进点说明 四、实验配置建议 前言 传统…...
自动驾驶时间同步
主要包含两个大的概念:时间系统间的时间同步与传感器数据间的时间同步 1. 时间系统间的时间同步 概念: 自动驾驶域控一般由多个芯片与多种类型的传感器组成,如:MCU SoC Camera Lidar Radar USS GNSS,其中 MCU…...
项目进度延误的十大原因及应对方案
项目进度延误主要源于以下十大原因:目标不明确、需求频繁变更、资源配置不足或不合理、沟通不畅、风险管理不足、缺乏有效的项目监控、技术难题未及时解决、团队协作效率低下、决策链过长、外部因素影响。其中,需求频繁变更是导致延误的关键因素之一&…...
消息队列(IPC技术)
目录 一、Linux 中主要的进程间通信方式如下: 二、消息队列函数 (1)msgget函数 功能概述 函数原型 参数解释 返回值 示例 结果 问题 (2) msgsnd函数 功能概述 函数原型 参数说明 返回值 示例 结果 (3࿰…...
突破焊丝虚影干扰,端子焊点缺陷检测如何实现自动化?
端子焊点作为 3C 产品中连接电路的关键环节,其质量优劣对产品性能有着决定性影响。然而,传统人工检测端子焊点不仅效率低下,难以满足大规模生产需求,而且误判率高,无法精准把控产品质量,成为企业提质增效智…...
电能质量在线监测分析装置支持实时监测、数据存储及远程传输,适用于电网、工业等场景
电能质量在线监测分析装置主要技术指标 2.1工作电源 交流:220V10% ;50Hz0.5Hz;谐波畸变率不大于15% 直流:220V10%,纹波系数不大于5% 2.2电流信号输入 输入方式:电流互感器输入; …...
Springboot整合JAVAFX
Springboot整合JAVAFX 实体与VO设计 pom.xml文件如下: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xs…...
01分数规划
好久没发博客了……浅浅复活一下,讲个冷门些的算法。 算法目的:选出k组ai,bi使得 最大。 算法过程: 不妨考虑二分答案,那么答案的形式便是 的形式,则可通过移项转化为,进一步的,我们可以将…...
网络安全防护技术
边界安全防护——防火墙 控制:在网络连接点上建立一个安全控制点,对进出数据进行限制隔离:将需要保护的网络与不可信任网络进行隔离,隐藏信息并进行安全防护记录:对进出数据进行检查,记录相关信息 防火墙…...
[数据结构]Trie字典树
GPT的介绍 🧠 一句话总结: 字典树是一种专门用来存很多字符串的“超级前缀树”,查找某个字符串或前缀的时候,特别快! ✍️ 举个生活例子(类比): 你想做一个词典(Dictio…...
【WPF】IOC控制反转的应用:弹窗但不互相调用ViewModel
全称:Inversion of Control,控制反转 场景:A页面需要调用B/C页面等,防止直接在VM中新建别的页面实例,使用IOC设计架构; 创建Service,在Service中实现页面的实例创建和定义页面输入输出参数。 在…...
课程分享 | 安全设计原则
讲师介绍 前言 在数字化时代,软件安全已从技术问题升级为关乎企业存亡的战略要务。从SolarWinds供应链攻击到Log4j漏洞风暴,一次次安全事件不断警示我们:传统的边界防护思维已无法应对日益复杂的威胁环境。面对不断演进的攻击手段࿰…...
【数据结构 · 初阶】- 单链表
目录 一.相关指针知识点 二.链表 1.为什么学了顺序表还要学链表 2.优点 三.实现 1.链表的打印 —— 理解链表结构 (2) 物理结构图 2.链表的尾插 —— 入门 错误写法:tail ! NULL 总结: 正确代码物理图解: (2) 尾插整体代码 (思考…...
