三分钟体验:SpringBoot用深度学习模型识别数字

Posted 程序员欣宸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三分钟体验:SpringBoot用深度学习模型识别数字相关的知识,希望对你有一定的参考价值。

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

本篇概览

  • 使用Deeplearning4j训练出来的模型,可以在java应用中使用吗?

  • 当然能,今天咱们花三分钟来体验集成了AI能力的SpringBoot应用

  • 该应用的功能是识别黑白图片中的手写数字(每张图片内只有一个数字),如下图,通过http接口将此图片提交,让SpringBoot应用去识别:
    在这里插入图片描述

  • 下图是postman操作界面的截图,红框中的数字就是SpringBoot应用的识别结果,数字8,与图片一致:
    在这里插入图片描述

  • SpringBoot应用用到的AI模型是LeNet-5,这是个经典的识别模型,常用在卷积网络入门学习中

  • 本篇以体验为主,不涉及具体的开发,后面还会有文章介绍完整的开发过程(包括源码)

环境信息

  • 为了简化体验过程,接下来会用到docker,推荐的环境信息如下:
  1. 操作系统:Ubuntu 16.04.1 LTS 服务器版(MacBook Pro也可以,版本是11.2.3,macOS Big Sur)
  2. docker:20.10.2 Community
  3. 为了加快docker镜像的下载速度,建议您提前做好docker加速配置
  4. 用于提交图片的http工具,我这里是postman
  • 文章标题号称三分钟极速体验,没时间说太多,准备好环境就火速动手啦

部署

  1. 新建名为images的目录,用于存储处理后的文件,我这里完整路径是/home/will/temp/202106/29/images
  2. 新建名为model目录,用于存储稍后要下载的模型文件,我这里完整路径是/home/will/temp/202106/29/model
  3. 下载训练好的模型文件,我准备了两个下载地址,您任选一个即可,一个是csdn的(无需积分):https://download.csdn.net/download/boling_cavalry/19881160,另一个是https://raw.githubusercontent.com/zq2599/blog_download_files/master/files/minist-model.zip
  4. 下载好的模型文件是minist-model.zip,不要解压,直接放进前面新建的model目录
  5. 执行以下命令,会先下载docker镜像文件再创建容器:
docker run \\
--rm \\
-p 18080:8080 \\
-v /home/will/temp/202106/29/images:/app/images \\
-v /home/will/temp/202106/29/model:/app/model \\
bolingcavalry/dl4j-model-app:0.0.3
  1. 镜像文件有点大(九百多兆…),请您耐心等待,主要是dl4j的依赖库太大了
  2. 当控制台输出如下内容,表示启动成功,并且加载模型成功:
2021-06-29 10:51:55.744  INFO 1 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1748 ms
2021-06-29 10:51:55.852  INFO 1 --- [           main] c.b.p.service.impl.PredictServiceImpl    : load model from [/app/model/minist-model.zip]
2021-06-29 10:51:55.950  INFO 1 --- [           main] org.nd4j.linalg.factory.Nd4jBackend      : Loaded [CpuBackend] backend
2021-06-29 10:51:58.397  INFO 1 --- [           main] org.nd4j.nativeblas.NativeOpsHolder      : Number of threads used for linear algebra: 1
2021-06-29 10:51:58.399  WARN 1 --- [           main] o.n.l.cpu.nativecpu.CpuNDArrayFactory    : *********************************** CPU Feature Check Warning ***********************************
2021-06-29 10:51:58.399  WARN 1 --- [           main] o.n.l.cpu.nativecpu.CpuNDArrayFactory    : Warning: Initializing ND4J with Generic x86 binary on a CPU with AVX/AVX2 support
2021-06-29 10:51:58.399  WARN 1 --- [           main] o.n.l.cpu.nativecpu.CpuNDArrayFactory    : Using ND4J with AVX/AVX2 will improve performance. See deeplearning4j.org/cpu for more details
2021-06-29 10:51:58.399  WARN 1 --- [           main] o.n.l.cpu.nativecpu.CpuNDArrayFactory    : Or set environment variable ND4J_IGNORE_AVX=true to suppress this warning
2021-06-29 10:51:58.399  WARN 1 --- [           main] o.n.l.cpu.nativecpu.CpuNDArrayFactory    : *************************************************************************************************
2021-06-29 10:51:58.407  INFO 1 --- [           main] org.nd4j.nativeblas.Nd4jBlas             : Number of threads used for OpenMP BLAS: 1
2021-06-29 10:51:58.411  INFO 1 --- [           main] o.n.l.a.o.e.DefaultOpExecutioner         : Backend used: [CPU]; OS: [Linux]
2021-06-29 10:51:58.412  INFO 1 --- [           main] o.n.l.a.o.e.DefaultOpExecutioner         : Cores: [32]; Memory: [7.0GB];
2021-06-29 10:51:58.412  INFO 1 --- [           main] o.n.l.a.o.e.DefaultOpExecutioner         : Blas vendor: [OPENBLAS]
2021-06-29 10:51:59.076  INFO 1 --- [           main] o.d.nn.multilayer.MultiLayerNetwork      : Starting MultiLayerNetwork with WorkspaceModes set to [training: ENABLED; inference: ENABLED], cacheMode set to [NONE]
2021-06-29 10:51:59.658  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2021-06-29 10:51:59.671  INFO 1 --- [           main] c.b.p.PredictNumberApplication           : Started PredictNumberApplication in 6.474 seconds (JVM running for 7.235)
  • 现在SpringBoot应用启动成功了,我们来试试识别图片的功能,这个应用提供了两个接口,分别可以测试白底黑字和黑底白字

识别白底黑字

  • 准备一张白底黑字的png图片(画图板,截图工具都可以),例如下面这张:
    在这里插入图片描述
  • 白底黑字识别服务的地址是IP地址:18080/predict-with-white-background,用postman操作如下图,请按照数字顺序操作1-6,可见输入很简单,就一个字段,返回值就是识别结果,符合预期:
    在这里插入图片描述

识别黑底白字

  • 接下来试试黑底白字,准备一张类似下图的png图片:
    在这里插入图片描述

  • 黑底白字识别服务的地址是IP地址:18080/predict-with-black-background,用postman操作如下图,请按照数字顺序操作1-6,返回结果是红框8中的数字,符合预期:
    在这里插入图片描述

  • 至此,SpringBoot结合深度学习模型的体验已经完成,一分钟概览,一分钟部署,一分钟体验,咱们足够高效(下载九百多兆镜像的时间不能算,不敢算…)

  • 此刻您应该能感受到深度学习的魅力了,聪明的您当然会有很多疑问,例如:

  1. 模型是怎么训练出来的?
  2. java代码中如何使用这个模型?
  3. 这些东西怎么做成docker镜像?
  • 这些疑问会在接下来的文章中完全揭秘,然后您也能轻易做出集成深度学习模型的SpringBoot应用,敬请期待,欣宸原创,必不会让您失望!

你不孤单,欣宸原创一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 数据库+中间件系列
  6. DevOps系列

以上是关于三分钟体验:SpringBoot用深度学习模型识别数字的主要内容,如果未能解决你的问题,请参考以下文章

深度学习与爬虫实例教学--深度学习模型构建和训练

深度学习——用简单的线性模型构建识别鸟与飞机模型

用深度学习做命名实体识别——模型训练

华为云ModelArts初体验-飞机识别

深度学习实践基于深度学习的车牌识别(python,车牌检测+车牌识别)

深度学习入门比赛——街景字符识别