拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Caffe Web Demo 实战:基于 Flask 与 CaffeNet 构建图像分类 Web 服务

Caffe Web Demo 实战基于 Flask 与 CaffeNet 构建图像分类 Web 服务【免费下载链接】caffeCaffe: a fast open framework for deep learning.项目地址: https://gitcode.com/gh_mirrors/ca/caffeCaffe 仓库内置的examples/web_demo是一个完整的图像分类 Web 演示应用它以 Python 版 Caffe 接口pycaffe为推理引擎加载预训练的 BVLC Reference CaffeNet 模型通过 Flask Tornado 提供网页服务既支持粘贴图片 URL 远程分类也支持本地上传图片分类。阅读本文后你将掌握该 Web Demo 的环境准备、模型与辅助数据下载、启动参数用法并理解其Maximally Accurate信息增益回退结果背后的实现原理与源码调用链。一、Web Demo 概览与文件结构examples/web_demo目录是 Caffe 官方示例中面向 Web 部署的完整演示包含以下关键文件examples/web_demo/app.py服务端主程序负责路由分发、模型加载、图像预处理与推理、结果格式化examples/web_demo/exifutil.py处理图片 EXIF 旋转信息避免手机等设备拍摄照片方向错乱导致分类错误examples/web_demo/requirements.txtPython 依赖清单werkzeug、flask、tornado、numpy、pandas、pillow、pyyamlexamples/web_demo/templates/index.html基于 Bootstrap 的前端页面内置Maximally accurate与Maximally specific两个结果标签页。从源码结构看app.py的顶层设计非常清晰ImagenetClassifier类负责全部模型与数据装载及推理逻辑start_tornado/start_from_terminal负责服务启动方式选择路由函数只做请求解析与模板渲染。二、运行环境准备2.1 Python 依赖安装Web Demo 依赖 Python 及其若干第三方库原文档明确要求pip install -r examples/web_demo/requirements.txt同时必须保证 Python Caffe 接口pycaffe已经编译成功并已加入PYTHONPATH详见仓库的 INSTALL.md 与 docs/installation.md。pycaffe 是app.py中import caffe的基础caffe.io.load_image、caffe.Classifier等接口均来自 python/caffe 目录下编译生成的 Python 扩展。2.2 下载 CaffeNet 模型与 ImageNet 辅助数据运行前需要准备两个数据来源原文档给出的命令为./scripts/download_model_binary.py models/bvlc_reference_caffenet ./data/ilsvrc12/get_ilsvrc_aux.sh./scripts/download_model_binary.py models/bvlc_reference_caffenet会依据 models/bvlc_reference_caffenet/readme.md 中声明的caffemodel_url下载bvlc_reference_caffenet.caffemodel该模型是 AlexNet 论文结构的复现区别在于未使用 relighting 数据增强且池化与归一化的顺序做了对调readme 中记录了其验证集 top-1 准确率约 57.4%、top-5 约 80.4%采用 10-crop 平均可略高data/ilsvrc12/get_ilsvrc_aux.sh 下载caffe_ilsvrc12.tar.gz辅助包并解压其中包含图像均值文件mean、synset_words.txt类别标签synset id 与文字描述、ImageNet 图结构与信息增益数据imagenet.bet.pickle以及训练/验证切分列表。注意该脚本并不下载庞大的 ILSVRC12 原始图片数据集Web Demo 推理也不需要原始训练图片。原文档特别提醒如果运行过程中出现问题尝试重新下载辅助文件例如imagenet.bet.pickle下载不完整时。2.3 文件就绪校验app.py中的ImagenetClassifier在加载时会自动校验默认文件路径缺失即抛异常。其default_args引用的文件路径均以仓库根目录REPO_DIRNAME拼接如下参数路径model_def_filemodels/bvlc_reference_caffenet/deploy.prototxtpretrained_model_filemodels/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel由下载脚本生成mean_filepython/caffe/imagenet/ilsvrc_2012_mean.npyclass_labels_filedata/ilsvrc12/synset_words.txt由 get_ilsvrc_aux.sh 生成bet_filedata/ilsvrc12/imagenet.bet.pickle由 get_ilsvrc_aux.sh 生成代码中对每个文件执行了os.path.exists检查并给出明确报错信息如File for bet_file is missing. Should be at: ...所以缺文件时启动会立即失败而非运行中报错便于定位问题。三、启动服务命令与参数详解3.1 一条命令启动python examples/web_demo/app.py服务启动后默认监听http://0.0.0.0:5000浏览器访问该地址即可看到分类页面。页面提供两种输入方式输入图片 URL 并点击Classify URL对应/classify_url路由直接选择本地图片文件上传对应/classify_upload路由前端 JavaScript 会在选择文件后自动提交表单。3.2 命令行选项app.py使用optparse解析参数原文档给出的帮助信息为Usage: app.py [options] Options: -h, --help show this help message and exit -d, --debug enable debug mode -p PORT, --portPORT which port to serve content on对照源码start_from_terminal实际还有第三个选项-g, --gpu use gpu mode各选项行为如下-d, --debug启用 Flask 调试模式此时走app.run(debugTrue, host0.0.0.0, portopts.port)-p PORT, --portPORT指定监听端口默认5000-g, --gpu使用 GPU 模式推理调用caffe.set_mode_gpu()默认 CPU 模式。该选项会写入ImagenetClassifier.default_args的gpu_mode键并在构造分类器时生效。不开启--debug时服务通过 Tornado 以WSGIContainer方式托管 Flask 应用start_tornado函数利用 Tornado 的 HTTP 服务器能力提升并发处理性能。3.3 启动时的预处理逻辑start_from_terminal在启动服务器前还会做两件事构造ImagenetClassifier实例完成模型加载调用app.clf.net.forward()做一次预热前向提前完成显存/内存分配避免第一个请求延迟过高。同时app.py的__main__入口会创建上传目录/tmp/caffe_demos_uploads不存在时自动os.makedirs并在启动前将日志级别设为INFO方便观察每个请求的分类结果。四、前后端交互流程4.1 路由与请求处理app.py定义了两个核心路由GET /classify_url?imageurlurl从 URL 读取图片字节到内存用caffe.io.load_image解码为 RGB 数组读取失败则返回无法打开该 URL 图片的提示POST /classify_upload接收表单字段imagefile以时间戳 安全文件名werkzeug.secure_filename保存到上传目录便于后续数据收集再交给exifutil.open_oriented_im读取。上传图片读取时examples/web_demo/exifutil.py 会检查 EXIF 中的方向标签tag 274对旋转/镜像方向2~8逐一映射到 PIL 的transpose操作进行纠正灰度图会被复制为三通道RGBA 图只取前三个通道最终统一归一化到[0,1]的 float32 数组。4.2 前端展示examples/web_demo/templates/index.html 使用 Bootstrap 风格页面分类完成后以两个 tab 展示结果Maximally accurate默认激活显示信息增益回退后的尽可能准确预测Maximally specific显示网络原始的 Top-5 最具体预测。两个列表均展示类别名称与置信度徽标页面底部还会显示CNN took X seconds的单次推理耗时。上传图片则以 base64 PNG 内嵌在页面中回显embed_image_html将结果图缩放到 256×256。五、Maximally accurate结果是如何生成的这是原文档重点解释的技术点也是 Web Demo 区别于普通分类演示的核心特色。5.1 思想从叶子节点向父节点回退ImageNet 的 1000 个类别并非互不相关的平铺列表而是一棵语义树最具体最细粒度的类别位于叶子节点叶子可通过更概括的父节点合并树顶是entity实体。普通分类只在叶子节点上输出预测即Maximally specific而为了给出尽可能准确的结果Web Demo 会从最具体的预测开始向父节点回退back off宁可给出更概括但正确的类别也不给出具体但错误的类别。5.2 bet_file 的作用代码中加载的bet_fileimagenet.bet.pickle就是实现回退的关键数据它提供了 ImageNet 相关节点的图结构、节点名称以及节点之间的信息增益information gain度量。加载后的结构可以从app.py的使用方式反推self.bet[probmat]与self.bet[idmapping]用于把 1000 类的 softmax 分数映射到图节点空间self.bet[infogain]各节点的信息增益值self.bet[preferences]先验偏好项self.bet[words]节点对应的语义词条。5.3 期望信息增益的计算链路classify_image中的核心计算如下# 1) 网络预测10-crop 过采样预测取平均 scores self.net.predict([image], oversampleTrue).flatten() # 2) 原始的最具体结果Top-5 叶子节点 indices (-scores).argsort()[:5] # 3) 用 probmat 将叶子得分映射到图节点与 infogain 相乘得到期望信息增益 expected_infogain np.dot(self.bet[probmat], scores[self.bet[idmapping]]) expected_infogain * self.bet[infogain] # 4) 按期望信息增益排序取 Top-5 作为尽可能准确的结果 infogain_sort expected_infogain.argsort()[::-1]其中还包含一个细节加载时对信息增益做了偏好修正——self.bet[infogain] - np.array(self.bet[preferences]) * 0.1注释说明这是为了在单链路径中偏向子节点prefer children nodes in single-chain paths0.1 只是一个快速简单的经验值设定。这种基于信息增益的层级回退策略其理论背景可参考 2012 年 CVPR 的 Hedging your bets 论文原文档即指向该论文作进一步了解。5.4 一次请求的完整返回classify_image最终返回四元组(True, meta, bet_result, elapsed)metaTop-5 最具体预测类别名 五位小数置信度bet_resultTop-5 尽可能准确预测语义词条 期望信息增益分数elapsed单次推理耗时秒三位小数。异常时返回(False, error_message)前端据此渲染错误提示。六、模型与预处理参数源码级解析ImagenetClassifier.__init__中构建分类器的参数恰好体现了 Caffe Python 接口进行图像分类的标准预处理流程self.net caffe.Classifier( model_def_file, pretrained_model_file, image_dims(image_dim, image_dim), raw_scaleraw_scale, meannp.load(mean_file).mean(1).mean(1), channel_swap(2, 1, 0) )image_dims(256, 256)输入图像缩放到 256×256image_dim默认 256raw_scale255.原始像素值缩放因子将[0,1]浮点图还原为[0,255]尺度再做减均值mean加载ilsvrc_2012_mean.npy后对空间维度H、W求均值得到 3 维通道均值向量channel_swap(2, 1, 0)将 RGB 通道顺序交换为 BGR与 Caffe 训练的输入约定一致predict(..., oversampleTrue)使用 10-crop4 角 1 中心再镜像过采样预测取平均可小幅提升精度。网络结构定义在 models/bvlc_reference_caffenet/deploy.prototxt 中输入层为Inputshape 为10×3×227×227batch 10 与 10-crop 对应网络依次包含 5 个卷积块conv1: 96×11×11 步长 4conv2/conv4/conv5 使用 group2 分组卷积conv3: 384 输出、3 个 max pooling、2 个 LRNlocal_size5, alpha0.0001, beta0.75、三个全连接层fc6/fc7 各 4096 维带 Dropout 0.5fc8 输出 1000 维最后以 Softmax 输出prob。七、常见问题与排查建议结合源码与原文档提示运行 Web Demo 时可能遇到的问题及对策如下启动即报File for ... is missing对应的模型或辅助数据未下载/路径不对。核对default_args所列路径必要时按原文档建议重新下载辅助文件import caffe失败pycaffe 未编译或PYTHONPATH未配置回到 INSTALL.md 完成 Python 接口安装URL 图片打不开网络问题或图片地址不可访问服务端日志会记录URL Image open error上传图片方向不对确认图片包含 EXIF 方向信息时走exifutil.open_oriented_im纠正灰度/透明 PNG 会被自动转为三通道GPU 不可用时不加-g以 CPU 模式运行或检查 Caffe 是否以 CUDA 支持编译参见 cmake/Cuda.cmake 与 Makefile.config.example。八、总结examples/web_demo是学习 Caffe 从模型推理到 Web 服务部署的完整范例它示范了 pycaffe 的caffe.Classifier封装、10-crop 过采样预测、均值/通道序预处理、多进程友好的 TornadoFlask 托管方式以及基于 ImageNet 语义图与信息增益的回退式结果生成。通过本文的源码级拆解你不仅可以直接在本仓库上复现这一 Web 分类服务也能将其中的图像预处理、结果排序与错误处理模式迁移到自己的 Caffe 应用中去。【免费下载链接】caffeCaffe: a fast open framework for deep learning.项目地址: https://gitcode.com/gh_mirrors/ca/caffe创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门