java机器学习库_Amazon Deep Java Library——Java 机器学习工具箱

近年来,人们对机器学习的兴趣稳步增长。具体来说,现在,企业在各种各样的场景中使用机器学习进行图像识别。它在汽车工业、医疗保健、安全、零售、仓库、农场和农业的自动化产品跟踪、食品识别,甚至通过手机摄像头进行实时翻译等方面都有应用。借助机器学习和视觉识别,机器可以从MRI 和CT 扫描结果中发现癌症和 COVID-19 。

如今,这些解决方案主要是用 Python 开发的,使用了开源和专有的 ML 工具包,每个工具包都有自己的 API。尽管 Java 在企业中很流行,但是 Java 中没有任何标准是针对机器学习应用程序开发的。 JSR-381 的提出就是为了填补这项空白,它为 Java 应用程序开发人员提供了一套标准的、灵活的、Java 友好的、面向视觉识别(VisRec)应用程序(如图像分类和对象检测)的 API。JSR-381 有几个依赖于 TensorFlow、MXNet 和 DeepNetts 等机器学习平台的实现。其中一个实现是基于 Deep Java Library (DJL)的,这是一个由 Amazon 开发的开源库,用于使用 Java 构建机器学习应用。DJL 通过绑定必要的图像处理例程,提供了流行机器学习框架(如 TensorFlow 、 MXNet 和 PyTorch )的钩子,对于 JSR-381 的用户来说,这是一个灵活而简单的选项。

在本文中,我们将演示 Java 开发人员如何使用 JSR-381 VisRec API 在不到 10 行代码内利用 DJL 的预训练模型实现图像分类或对象检测。我们还通过两个例子演示了用户如何在 10 分钟内使用预先训练好的机器学习模型。让我们开始吧!

使用预训练的模型识别手写数字

识别手写数字是一个有用的应用,也是视觉识别的一个“hello world”示例。对人类来说,识别手写数字似乎很容易。得益于我们大脑中视觉和模式匹配子系统的处理能力和协作,我们通常可以从潦草的手写文件中正确地识别出数字。然而,由于可能存在许多变化,这个看似简单的任务对于机器来说是难以置信的复杂。这是机器学习,特别是视觉识别的一个很好的用例。JSR 381 库中有一个很好的示例,使用JSR-381 VisRec API 正确地识别出了手写数字。这个示例将手写数字与 MNIST 手写数字数据集进行比较,后者是一个包含超过 6 万幅图像的公开数据库。预测图像所代表的内容称为图像分类。我们的示例查看一副新图像,并确定它具体是哪个数字的概率。

对于这项任务,VisRec API 提供了一个ImageClassifier接口,可以使用泛型参数具体化为输入图像的特定 Java 类。它还提供了一个classie()方法,该方法执行图像分类并返回所有可能的图像类别与概率的Map。根据 VisRec API 的约定,每个模型都提供一个静态的builder()方法,它返回一个对应的builder对象,并允许开发者配置所有相关的设置,例如imageHeight、imageWidth。

在我们的手写数字示例中,要定义一个图像分类器,就需要使用inputClass(BufferedImage.class) 配置输入句柄。你可以通过它指定使用哪个类来表示图像。你可以使用imageHeight(28)和imageWidth(28) 将图像尺寸调整到 28x28,模型最初训练时就用的这个大小。 分类器对象构建完成后,将输入图像输入到分类器以识别图像。

File input = new File("../jsr381/src/test/resources/0.png");

// 使用 mlp 文件夹里的预训练模型 Path modelPath = Paths.get("../jsr381/src/test/resources/mlp");

ImageClassifier classifier =

NeuralNetImageClassifier.builder()

// 输入时一个图像文件,应该作为 BufferImage 进行处理 .inputClass(BufferedImage.class)

// 图像尺寸应该调整到 28 x 28 .imageHeight(28)

.imageWidth(28)

.importModel(modelPath)

.build();

// 执行推断并获取分类结果 Map result = classifier.classify(input);

// 打印结果 for (Map.Entry entry : result.entrySet()) {

System.out.println(entry.getKey() + ": " + entry.getValue());

}

执行上述代码会产生以下输出:

0: 0.9997633

2: 6.915607E-5

5: 2.7744078E-5

6: 6.1097984E-5

9: 3.8322916E-5

对于图像中的数字,该模型识别出五种可能的选项,以及每个选项的概率。分类器以 99.98% 的压倒性概率正确地预测了数字 0。 推而广之,如果需要检测出同一副图像中的多个不同的对象该怎么办?

使用预训练的单帧检测器(SSD)模型识别物体

单帧检测器(SSD)是一种利用一个深度神经网络从图像中检测物体的机制。本例使用预先训练好的 SSD 模型识别图像中的对象。对象检测是一项比较具有挑战性的视觉识别任务。除了对图像中的对象进行分类外,对象检测还可以识别图像中对象的位置。它还可以在关注对象周围绘制一个边框并添加一个类别(文本)标签。

SSD 机制是机器学习领域的一项最新进展,它检测对象的速度非常快,与此同时,还能保持与需要更大计算量的模型相媲美的准确性。要了解关于 SSD 模型的更多信息,可以阅读博文“理解 SSD MultiBox——深度学习中的实时对象检测”以及《深入机器学习》这本书里的这个练习。

使用 DJL 的 JSR-381 实现,用户可以访问预先训练好的、开箱即用的 SSD 模型实现。DJL 使用 ModelZoo 来简化模型部署。下面的代码块使用ModelZoo.loadModel()加载一个预先训练好的模型,实例化一个对象检测器类,并将这个模型应用到一副示例图像上。

// 定义一个满足用户需求的模型查找标准 Criteria criteria =

Criteria.builder()

.setTypes(BufferedImage.class, DetectedObjects.class)

// 查找一个对象检测模型 .optApplication(Application.CV.OBJECT_DETECTION)

.build();

// 加载模型,创建一个 SimpleObjectDectector 对象 try (ZooModel model = ModelZoo.loadModel(criteria)) {

// SimpleObjectDetector 是一个负责检测对象的高级 JSR-381 API SimpleObjectDetector objectDetector = new SimpleObjectDetector(model);

// 加载图像 BufferedImage input =

BufferedImageUtils.fromUrl(

"https://djl-ai.s3.amazonaws.com/resources/images/dog_bike_car.jpg");

// 检测对象 Map> result = objectDetector.detectObject(input);

for (List boundingBoxes : result.values()) {

for (BoundingBox boundingBox : boundingBoxes) {

System.out.println(boundingBox.toString());

}

}

}

下面是一副可供我们使用的新图像。

在这幅图像上运行代码将产生如下结果:

BoundingBox{id=0, x=124.0, y=119.0, width=456.45093, height=338.8393, label=bicycle, score=0.9538524}

BoundingBox{id=0, x=469.0, y=78.0, width=225.19464, height=92.147675, label=car, score=0.99991035}

BoundingBox{id=0, x=128.0, y=201.0, width=210.51933, height=341.7647, label=dog, score=0.9375212}

如果你希望给从图像上检测到的每个对象添加边框,只需几行代码即可。要了解更多信息,请参见完整的 GitHub 示例。该模型对三个关注对象(自行车、汽车和狗)进行分类,在每个对象周围画一个边框,并提供一个由概率反映的置信度。

值得注意的是,预训练模型的检测精度取决于用于训练模型的图像。模型的精度可以通过再训练来提高,也可以使用一组更能代表最终应用程序的图像开发一个自定义的模型。然而,这种方法非常耗时,并且需要使用大量的训练数据。对于许多 ML 应用程序,使用预先训练好的模型建立基线通常是值得的。这可以节省大量收集、准备数据和从头训练模型的时间。

更多学习内容请阅读我的知乎专栏:程序员的一切:打造全网Java高级工程师资料库(总目录)看完学的更加快,知识更牢固。你值得拥有(持续更新)~​zhuanlan.zhihu.comcadac9f2e4d5f642a96d2ad138cb4f9a.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阻抗计算

si9000也可以算 一般有点差异,板厂可以微调 加上滤油,实际阻抗会降低2-3欧 影响最大的是层厚 先选择最薄的芯板,注意差分线的阻抗匹配,间距越小,阻抗小, 转载于:https://www.cnblogs.com/IotI/p/8587277.h…

javascript mqtt 发布订阅消息

js client使用paho-mqtt&#xff0c;官网地址&#xff1a;http://www.eclipse.org/paho/&#xff0c;参考http://www.eclipse.org/paho/clients/js/官网给出例子Getting Started&#xff0c;写出下面简单的测试代码。 <!DOCTYPE html> <html> <head> <met…

用C++调用tensorflow在python下训练好的模型(centos7)

本文主要参考博客https://blog.csdn.net/luoyexuge/article/details/80399265 [1] bazel安装参考:https://blog.csdn.net/luoyi131420/article/details/78585989 [2] 首先介绍下自己的环境是centos7&#xff0c;tensorflow版本是1.7&#xff0c;python是3.6&#xff08;anacond…

ActiveMQ producer同步/异步发送消息

http://activemq.apache.org/async-sends.html producer发送消息有同步和异步两种模式&#xff0c;可以通过代码配置&#xff1a; ((ActiveMQConnection)connection).setUseAsyncSend(true); producer默认是异步发送消息。在没有开启事务的情况下&#xff0c;producer发送持久化…

示例介绍:JavaFX 8打印

我有一段时间没有写博客了&#xff0c;我想与其他人分享有关JavaFX的所有信息&#xff08;我的日常工作和家庭可能是借口&#xff09;。 对于那些是本博客的新手&#xff0c;我是JavaFX 2 Introduction by Example&#xff08;JIBE&#xff09;的作者&#xff0c; Java 7 Recip…

int64 java_为什么json 不能使用 int64类型

json 简介jsON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集 。 JSON采用完全独立于语言的文本格式&#xff0…

Spring MVC自定义验证注释

在上一教程中&#xff0c;我展示了如何使用注释来验证表单 。 这对于简单的验证非常有用&#xff0c;但是最终&#xff0c;您需要验证一些现成的注释中没有的自定义规则。 例如&#xff0c;如果您需要根据输入的出生日期来验证用户已超过21岁&#xff0c;或者可能需要验证用户的…

前期

转载于:https://www.cnblogs.com/joker157/p/8618091.html

0基础能学mysql数据库吗_mysql学习入门:零基础如何使用mysql创建数据库表?

零基础如何自学Mysql创建数据库&#xff0c;是Mysql学习者必经之路&#xff0c;Mysql是受欢迎的关系数据库管理系统,WEB应用方面MySQL是很好的RDBMS应用软件之一。如何使用Mysql创建数据库表&#xff0c;打开Mysql学习进阶大门&#xff0c;就是今天MYSQL学习教程丁光辉博客认为…

vue跨域解决及打包

打包之前需要修改如下配置文件&#xff1a; 配置文件一&#xff1a;build>>>utils.js (修改publicPath:"../../" , 这样写是处理打包后找不到静态文件&#xff08;图片路径失效&#xff09;的问题) 配置文件二&#xff1a;config>>>index.js(修改a…

Bootstrap中实现图片圆角效果

Bootstrap 对图片的支持。Bootstrap 提供了三个可对图片应用简单样式的 class&#xff1a; .img-rounded&#xff1a;添加 border-radius:6px 来获得图片圆角。.img-circle&#xff1a;添加 border-radius:500px 来让整个图片变成圆形。.img-thumbnail&#xff1a;添加一些内边…

Bootstrap中的条纹进度条使用案例

创建一个条纹的进度条的步骤如下&#xff1a;1.添加一个带有 class .progress 和 .progress-striped 的 <div>2.接着在上面的 <div> 内&#xff0c;添加一个带有 class .progress-bar 和 class progress-bar-* 的空的 <div>。其中&#xff0c;* 可以是succes…

LM拟合算法

一、 Levenberg-Marquardt算法 &#xff08;1&#xff09;ya*e.^(-b*x)形式拟合 clear all % 计算函数f的雅克比矩阵&#xff0c;是解析式 syms a b y x real; fa*exp(-b*x); Jsymjacobian(f,[a b]); % 拟合用数据。参见《数学试验》&#xff0c;p190&#xff0c;例2 % data_1…

java的前生今世_HBaseGC的前生今世-身世篇

网易视频云是网易倾力打造的一款基于云计算的分布式多媒体处理集群和专业音视频技术&#xff0c;提供稳定流畅、低时延、高并发的视频直播、录制、存储、转码及点播等音视频的PAAS服务&#xff0c;在线教育、远程医疗、娱乐秀网易视频云是网易倾力打造的一款基于云计算的分布式…

CapeDwarf – Java EE上的Google App Engine

我有很多爱好。 从早期的Java EE规范一路走来&#xff0c;并通过Java EE 7进行了“云”之旅&#xff0c;我很好奇看到新宣布的CapeDwarf项目有哪些库存&#xff0c;可以在内部引入Google的平台即服务&#xff0c;提供“ Google App Engine ” 。 到目前为止的故事 我确实使用了…

第二周读书笔记——《构建之法》

【对一些实例的看法】 “我写了二叉树的遍历算法实现&#xff0c;在这里&#xff0c;二叉树是数据结构&#xff0c;遍历的实现细节是算法。C程序就是结果。但是这个程序有什么实际用处呢&#xff1f;在Java和其他一些语言中&#xff0c;似乎没有指针&#xff0c;那我可以不必了…

java springmvc 数据库事务_事务的简单回顾_JavaEE框架(Maven+SpringMvc+Spring+MyBatis)全程实战教程_Java视频-51CTO学院...

SpringMVCSpring MVC属于SpringFrameWork的后续产品&#xff0c;已经融合在Spring Web Flow里面。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色&#xff0c;这种分离让它们更容易进行定制。SpringSpring是一个开源框架&#xff0c;Spring是于2003 年兴起的…

前端 ---jQuery的补充

15-jQuery补充 jquery内容补充 jquery除了咱们上面讲解的常用知识点之外&#xff0c;还有jquery 插件、jqueryUI知识点 jqueryUI 官网&#xff1a; https://jqueryui.com/ jqueryUI 中文网&#xff1a; http://www.jqueryui.org.cn/ jquery插件内容包含 官网demo&#xff1a; h…

用Java编写Hadoop MapReduce任务

尽管Hadoop框架本身是使用Java创建的&#xff0c;但MapReduce作业可以用许多不同的语言编写。 在本文中&#xff0c;我将展示如何像其他Java项目一样&#xff0c;基于Maven项目在Java中创建MapReduce作业。 准备示例输入 让我们从一个虚构的商业案例开始。 在这种情况下&#…

Spring集成:轻量级集成方法

当今的应用程序希望能够访问企业环境中的所有业务&#xff0c;而无需考虑与绝望的系统无缝集成的应用程序技术。 可以通过使用中间件技术对各种系统进行布线来实现这种集成。 集成平台使应用程序可以相互共享信息的环境&#xff0c;从而使体系结构具有高度的互操作性。 Spring…