5分钟!用Java实现目标检测 | PyTorch
云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!
编者按:作为一个Java开发者,你是否曾为在PyTorch上部署模型而苦恼?这篇来自AWS软件工程师的投稿,结合实例,详细介绍了DJL这个为Java开发者设计的深度学习库:5分钟,你就能在PyTorch上,用Java实现目标检测。
5分钟,用Java实现目标检测
PyTorch在深度学习领域中的应用日趋广泛,得益于它独到的设计。无论是数据的并行处理还是动态计算图,一切都为Python做出了很多简化。很多论文都选择使用PyTorch去实现也证明了它在训练方面的效率以及易用性。
在PyTorch领域,尽管部署一个模型有很多选择,可为Java开发人员准备的选项却屈指可数。
在过去,用户可以用PyTorch C++ 写JNI (Java Native Interface) 来实现这个过程。最近,PyTorch 1.4 也发布了试验性的Java 前端。
可是这两种解决方案都没有办法能让Java开发者很好的使用:用户需要从易于使用和易于维护中二选一。
针对于这个问题,亚马逊云服务 (AWS)开源了 Deep Java Library (DJL),一个为Java开发者设计的深度学习库。它兼顾了易用性和可维护性,一切运行效率以及内存管理问题都得到了很好的处理。
DJL使用起来异常简单。只需几行代码,用户就可以轻松部署深度学习模型用作推理。那么我们就开始上手用DJL部署一个PyTorch 模型吧。
前期准备
用户可以轻松使用maven或者gradle等Java常用配置管理包来引用DJL。下面是一个示例:
plugins { id 'java' } repositories { jcenter() } dependencies { implementation "ai.djl:api:0.4.0" implementation "ai.djl:repository:0.4.0" runtimeOnly "ai.djl.pytorch:pytorch-model-zoo:0.4.0" runtimeOnly "ai.djl.pytorch:pytorch-native-auto:1.4.0" }
然后只需gradle build,基本配置就大功告成了。
开始部署模型
我们用到的目标检测模型来源于NVIDIA在torchhub发布的预训练模型。我们用下面这张图来推理几个可以识别的物体(狗,自行车以及皮卡)。
可以通过下面的代码来实现推理的过程:
public static void main(String[] args) throws IOException, ModelException, TranslateException { String url = "https://github.com/awslabs/djl/raw/master/examples/src/test/resources/dog_bike_car.jpg"; BufferedImage img = BufferedImageUtils.fromUrl(url); Criteria<BufferedImage, DetectedObjects> criteria = Criteria.builder() .optApplication(Application.CV.OBJECT_DETECTION) .setTypes(BufferedImage.class, DetectedObjects.class) .optFilter("backbone", "resnet50") .optProgress(new ProgressBar()) .build(); try (ZooModel<BufferedImage, DetectedObjects> model = ModelZoo.loadModel(criteria)) { try (Predictor<BufferedImage, DetectedObjects> predictor = model.newPredictor()) { DetectedObjects detection = predictor.predict(img); System.out.println(detection); } } }
然后,就结束了。相比于其他解决方案动辄上百行的代码,DJL把所有过程简化到了不到30行完成。那么我们看看输出的结果:
[ class: "dog", probability: 0.96709, bounds: [x=0.165, y=0.348, width=0.249, height=0.539] class: "bicycle", probability: 0.66796, bounds: [x=0.152, y=0.244, width=0.574, height=0.562] class: "truck", probability: 0.64912, bounds: [x=0.609, y=0.132, width=0.284, height=0.166] ]
你也可以用我们目标检测图形化API来看一下实际的检测效果:
你也许会说,这些代码都包装的过于厉害,真正的小白该如何上手呢?
让我们仔细的看一下刚才的那段代码:
// 读取一张图片 String url = "https://github.com/awslabs/djl/raw/master/examples/src/test/resources/dog_bike_car.jpg"; BufferedImage img = BufferedImageUtils.fromUrl(url); // 创建一个模型的寻找标准 Criteria<BufferedImage, DetectedObjects> criteria = Criteria.builder() // 设置应用类型:目标检测 .optApplication(Application.CV.OBJECT_DETECTION) // 确定输入输出类型 (使用默认的图片处理工具) .setTypes(BufferedImage.class, DetectedObjects.class) // 模型的过滤条件 .optFilter("backbone", "resnet50") .optProgress(new ProgressBar()) .build(); // 创建一个模型对象 try (ZooModel<BufferedImage, DetectedObjects> model = ModelZoo.loadModel(criteria)) { // 创建一个推理对象 try (Predictor<BufferedImage, DetectedObjects> predictor = model.newPredictor()) { // 推理 DetectedObjects detection = predictor.predict(img); System.out.println(detection); } }
这样是不是清楚了很多?DJL建立了一个模型库(ModelZoo)的概念,引入了来自于GluonCV, TorchHub, Keras 预训练模型, huggingface自然语言处理模型等70多个模型。所有的模型都可以一键导入,用户只需要使用默认或者自己写的输入输出工具就可以实现轻松的推理。我们还在不断的添加各种预训练模型。
了解DJL
DJL是亚马逊云服务在2019年re:Invent大会推出的专为Java开发者量身定制的深度学习框架,现已运行在亚马逊数以百万的推理任务中。
如果要总结DJL的主要特色,那么就是如下三点:
- DJL不设限制于后端引擎:用户可以轻松的使用 MXNet, PyTorch, TensorFlow和fastText来在Java上做模型训练和推理。
- DJL的算子设计无限趋近于numpy:它的使用体验上和numpy基本是无缝的,切换引擎也不会造成结果改变。
- DJL优秀的内存管理以及效率机制:DJL拥有自己的资源回收机制,100个小时连续推理也不会内存溢出。
James Gosling (Java 创始人) 在使用后给出了赞誉:
对于PyTorch的支持
DJL现已支持PyTorch 1.5。我们深度整合了PyTorch C++ API,开发了一套JNI提供Java的底层支持。DJL提供各类PyTorch原生算子算法,现在支持所有的 TorchScript模型。
现在可以在 Mac/Linux/Windows全平台运行DJL PyTorch。DJL具有自检测CUDA版本的功能,也会自动采用对应的CUDA版本包来运行gpu任务。
【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/live立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK
原文发布时间:2020-07-25
本文作者:知乎用户@Lanking
本文来自:“量子位公众号”,了解相关信息可以关注“公众号QbitAI”
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
机器人懂点「常识」后,找东西方便多了:CMU打造新型语义导航AI机器人
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 想让机器人像人一样思考,似乎一直是个难题。 例如,让智(zhi)能(zhang)机器人去客厅拿个遥控器,结果看到机器人在厨房翻箱倒柜… 好消息是,这个问题现在被CMU解决了。 CMU研究团队打造出了一款拥有人类「常识」的导航机器人,让找东西变得更方便。 这款机器人能利用AI判断家中最可能找到目标物体的地点,从而尽快找到它。 例如,让机器人去拿放在「植物」旁边的遥控器,机器人几乎立即检测出了「植物」盆栽所在的位置,从而检测到遥控器的存在。 项目已被ECCV 2020收录,并获得了居住地目标导航挑战赛的第一名。 一起来看看实现的过程。 让机器人「学点常识」 事实上,以往大部分采用机器学习训练的语义导航机器人,找东西的效果都不太好。 相比于人类潜意识中形成的常识,机器人往往有点“死脑筋”,它们更倾向于去记住目标物体的位置。 但物体所处的场景往往非常复杂,而且彼此间差异很大(正所谓每个人的家,乱得各有章法),如果单纯以大量不同场景对系统进行训练,模型泛化能力都不太好。 于是,相比于用更多的样本对...
- 下一篇
二叉树的基础---四种遍历方式的 Java 实现
0. 前言 大家好,我是多选参数的程序锅,一个正在“研究”操作系统、学数据结构和算法以及 Java 的硬核菜鸡。本篇将带来的是二叉树的相关知识,知识提纲如图所示。 1. 基本介绍 树结构多种多样,但是最常用的还是二叉树。二叉树中每个节点最多有两个子节点,这两个节点分别是左子节点和右子节点。注意:不要求都有两个子节点,可以只有左子节点,也可以只有右子节点。 2. 二叉树的存储 2.1. 链式存储法 每个节点至少有三个字段,其中一个存储数据,另外两个是指向左右子节点的指针。这种存储方式比较常用,大部分二叉树代码都是通过这种结构来实现的。 2.2. 数组存储法 我们把根节点存储在下标 i=1 的位置,它的左子节点存储在下标为 2 * i 的位置,右子节点存储在下标为 2*i+1 的位置。以此类推,B 节点、C 节点的左右子节点都按照这种规律进行存储,最终如下图所示。 综上,如果节点 X 存储在数组中下标为 i 的位置,那么下标为 2*i 的位置存储的就是它的左子节点,下标为 2*i+1 的位置存储的就是它的右子节点。反过来,i/2 的位置存储的就是它的父节点。一般情况下,为了方便计算,根节点...
相关文章
文章评论
共有0条评论来说两句吧...