发现一款兼容所有主流操作系统的Java开发神器,全新DJL与飞桨的结合助力高效应用部署
自飞桨框架2.0发布以来,许多用户一直在期待一款能够高效简便地帮助Java开发者完成部署任务的工具。在以往的实践中,用户常常需要手动部署Model Server,但在维护和性能方面往往难以达到理想状态。现在,我们与DeepJavaLibrary(DJL)联手推出了一个基于Java的深度学习开发包,它提供了一套飞桨Java推理API,助力开发者更轻松地实现目标。
DJL与飞桨的结合形成了一个轻量级的Java推理库,基于飞桨C++推理库,支持基本的飞桨Tensor,并能对所有飞桨模型进行推理。DJL x Paddle可以在Windows、Linux和Mac操作系统以及所有Java环境中直接使用。
目前,我们为用户提供了两个基本的使用示例:
- 基于飞桨的口罩识别应用
- 基于PaddleOCR的文字识别应用
从性能角度来看,DJL x Paddle集成了飞桨的高速推理引擎,同时结合了Java的特性,如高效内存管理和多线程推理。这能够满足生产环境中大规模推理服务的需求。同时,它也能与现有的大数据平台集成,例如Apache Spark,实现离线大数据推理服务。借助飞桨的预训练模型应用工具PaddleHub,我们提供了许多行业实践案例,您可以按照我们的Paddle模型转换教程轻松将应用部署到Java服务上。接下来,我们将通过一个小故事来展示它的强大功能。
Paddle模型转换教程链接:
http://docs.djl.ai/docs/paddlepaddle/how_to_create_paddlepaddle_model_zh.html
小故事
Aaron是一位来自田纳西州的冷冻炸鸡加工厂负责人。近期,他一直为工人进厂不佩戴口罩而感到烦恼。为了保护员工的健康,他在厂房门口安装了摄像头,这样他就能在上班时监督工人是否佩戴口罩,只有戴了口罩的员工才能进入厂内。
然而,由于进出的人流量很大,工作人员必须时刻注视屏幕以判断哪些员工可以入厂。这不仅不便,还会使工人耽误时间,造成焦虑。于是,Aaron想到了是否可以自动化这个过程,比如利用摄像头自动识别工人是否佩戴口罩,从而自动放行。由于他本科时学习过Java,且工厂的网页后端也是用Java编写的,他开始在网上寻找解决方案,DJL恰好出现在了他的视野中。对于Aaron来说,虽然他对人工智能并不熟悉,但他只想找到一个现成的解决方案。
在DJL提供的案例中,Aaron找到了基于飞桨的口罩识别模型!虽然他之前没有接触过飞桨与DJL,但他发现代码看起来简单易懂,只需要做一些小改动就能完成任务。这个模型不仅可以进行面部识别,还能判断员工是否佩戴口罩,完全符合他的需求!
Aaron迫不及待地开始尝试使用DJL提供的步骤来完成他的口罩识别应用。首先,他需要将DJL相关的依赖项添加到Gradle(Java常用的构建工具)中:
dependencies {
implementation "ai.djl:api:0.10.0"
implementation "ai.djl.paddlepaddle:paddlepaddle-model-zoo:0.10.0"
runtimeOnly "ai.djl.paddlepaddle:paddlepaddle-native-auto:2.0.0"
}
接下来,他通过以下代码导入图像:
String url = "/user/home/my_client.jpg";
Image img = ImageFactory.getInstance().fromUrl(url);
Aaron欣喜地发现,DJL已经将模型和前后处理都封装好了。接下来,只需以下代码便可导入模型并进行推理。首先,他使用第一个模型来进行人脸检测:
Map<String, String> filter = new ConcurrentHashMap<>();
filter.put("flavor", "server");
ZooModel<Image, DetectedObjects> model =
PpModelZoo.FACE_DETECTION.loadModel(filter, null, new ProgressBar());
Predictor<Image, DetectedObjects> predictor = model.newPredictor();
DetectedObjects obj = predictor.predict(img);
然后只需将推理结果映射到图像上即可:
Aaron心想:“哇,系统识别出了两个人的脸。不过,这样只找到人脸还不够,我们如何判断他们是否佩戴了口罩呢?”他继续查阅发现,原来还需要使用另一个模型,只需通过输入一张图片,就能判断是否戴了口罩:
Map<String, String> filter = new ConcurrentHashMap<>();
filter.put("flavor", "server");
ZooModel<Image, Classifications> model =
PpModelZoo.MASK_DETECTION.loadModel(filter, null, new ProgressBar());
Predictor<Image, DetectedObjects> predictor = model.newPredictor();
Classifications result = predictor.predict(img);
“那就试试看吧?”Aaron自言自语。他将每张面部的推理结果映射到图像上:
结果出乎意料,识别精度相当高,借此应用他终于可以方便地控制门禁了。Aaron的这个设计大大节约了人力成本,他不再需要每天守在屏幕前。没想到,即便是Java小白也能轻松上手DJL x Paddle。
Aaron在DJL的Slack群里发了一条消息:
"感谢你们的帮助,让我实现了这个绝妙的应用!对DJL x Paddle表达我的热爱!"