TensorFlow-YOLOv3 从本地训练到服务器部署全过程

本文来自社区投稿与征集,作者 52CV 粉丝,分享对已开源的 tensorflow-yolov3 版本进行许多细节上算法改进,步骤详细,非常适合新手入门。

项目简要说明

本项目主要对原 tensorflow-yolov3 版本做了许多细节上的改进,增加了 TensorFlow-Serving 工程化部署,训练了多个数据集,包括 Visdrone2019,安全帽等数据集, 安全帽上 mAP 在 98% 左右,推理速度 1080 上 608 的尺寸大概 25 fps。本项目配有完善的说明,如想你也想入门 TensorFlow 服务端部署,那么,这个项目是你非常好的选择。

TensorFlow Serving 介绍及优势

TensorFlow 在工业界的应用比较广泛,TensorFlow Serving 作为一个用于机器学习模型 Serving 的高性能开源库,它可以将训练好的机器学习模型部署到线上,使用 gRPC 作为接口接受外部调用。TensorFlow Serving 支持模型热更新与自动模型版本管理,具有非常灵活的特点。

系统非常适用于大规模运行能够基于真实情况的数据并会发生动态改变的多重模型。它给出了一个把模型应用到实际生产的解决方案。

能够简化并加速从模型到生产的过程。它能实现在服务器架构和 API 保持不变的情况下,安全地部署新模型并运行试验。除了原生集成 TensorFlow,还可以扩展服务其他类型的模型,使用(之前训练的)模型来实施推理——基于客户端呈现数据的预测。

image

2.1 显著性能优势

  • Cpu推理速度优化( 5 倍于 Django+ 模型)
  • 支持分布式 tensorflow 模型
  • 模型动态加载卸载(无需中断服务,就能实现模型的版本替换)
  • 多个模型同时提供服务
  • 多编程语言客户端(C++,JAVA,GO等)
  • GPU 推理加速
  • 多版本便捷管理
  • 本项目还采用了 GRPC 部署, 速度更加快,亲测速度比 HTTP 快 35% 左右

2.2 gRPC 显著性能优势

  • 二进制框架和压缩。HTTP/2 协议在发送和接收方面都很紧凑和高效
  • 通过单个 TCP 连接复用多个 HTTP/2 调用。多路复用消除了线头阻塞
  • TensorFlow 预测 API 被定义为 Protobufs。因此,可以通过生成必要的 tensorflow 和 tensorflow_serving protobuf python 存根(stubs)
  • 在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法
  • 减少数据传输的时间,不用频繁
  • gRPC 是基于 HTTP/2 协议的,要深刻理解 gRPC,理解下 HTTP/2 是必要的,这里先简单介绍一下 HTTP/2 相关的知识,然后在介绍下 gRPC 是如何基于 HTTP/2 构建的

本项目主要亮点

1. 修改了网络结构,支持 TensorFlow-1.x 版本 saved model 模型导出以便进行 TensorFlow-Serving 部署,自己训练的数据集也可以在线部署,并给出了 docker+python_client 测试脚本,支持 HTTP 跟 GRPC 协议;

2. 修改了 ulits 文件,优化了 demo 展示,可以支持中文展示,添加了支持显示成中文的字体;

3. 详细的中文注释,代码更加易读,添加了数据敏感性处理, 一定程度避免 index 的错误;

4. 修改了训练代码,支持其他数据集使用预训练模型了,模型体积减小二分之一(如果不用指数平滑,可以减小到 200 多M 一个模型,减小三分之二),图片视频 demo 展示,都支持保存到本地,十分容易操作;

5. 借鉴视频检测的原理,添加了批量图片测试脚本,速度特别快(跟处理视频每一帧一样的速度);

6. 添加了易使用的 Anchors 生成脚本以及各步操作完整的操作流程;

7. 添加了 Mobilenetv2 backbone,支持训练,预测,评估以及部署模型,模型大小 70 多M;

8. 增加 ONNX 导出;

9. 增加 GRPC 远程过程调用 Serving 接口,加快预测速度;

10. 增加训练好的安全帽检测模型,数据集跟模型都在 release 中可下载;

算法效果

3.1 模型精度方面

由于采用多尺度训练,warm-up 等策略,在VOC2007+2012 数据集上的 MAP 可达 88.38%,在安全帽数据集上可达 98%。

image

image image

3.2 速度方面

视频预测中,在 GTX1080 显卡上 FPS 约为 23,尺度为 608,416 尺度下更快。服务器端速度,结合 Flask 或者 Django 等框架,处理一张用户请求的图片大概为 100ms。

以上皆是基于 darknet 的 backbone,换成 mobilenetv2 速度会更快。

中文:TensorFlow 公众号