网站做管理员消息推送,网站开发net,西安软件优化网站建设,中山市西区网站制作近年来#xff0c;人们对机器学习的兴趣稳步增长。具体来说#xff0c;现在#xff0c;企业在各种各样的场景中使用机器学习进行图像识别。它在汽车工业、医疗保健、安全、零售、仓库、农场和农业的自动化产品跟踪、食品识别#xff0c;甚至通过手机摄像头进行实时翻译等方…近年来人们对机器学习的兴趣稳步增长。具体来说现在企业在各种各样的场景中使用机器学习进行图像识别。它在汽车工业、医疗保健、安全、零售、仓库、农场和农业的自动化产品跟踪、食品识别甚至通过手机摄像头进行实时翻译等方面都有应用。借助机器学习和视觉识别机器可以从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.99976332: 6.915607E-55: 2.7744078E-56: 6.1097984E-59: 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{id0, x124.0, y119.0, width456.45093, height338.8393, labelbicycle, score0.9538524}BoundingBox{id0, x469.0, y78.0, width225.19464, height92.147675, labelcar, score0.99991035}BoundingBox{id0, x128.0, y201.0, width210.51933, height341.7647, labeldog, score0.9375212}如果你希望给从图像上检测到的每个对象添加边框只需几行代码即可。要了解更多信息请参见完整的 GitHub 示例。该模型对三个关注对象(自行车、汽车和狗)进行分类在每个对象周围画一个边框并提供一个由概率反映的置信度。值得注意的是预训练模型的检测精度取决于用于训练模型的图像。模型的精度可以通过再训练来提高也可以使用一组更能代表最终应用程序的图像开发一个自定义的模型。然而这种方法非常耗时并且需要使用大量的训练数据。对于许多 ML 应用程序使用预先训练好的模型建立基线通常是值得的。这可以节省大量收集、准备数据和从头训练模型的时间。更多学习内容请阅读我的知乎专栏程序员的一切打造全网Java高级工程师资料库(总目录)看完学的更加快知识更牢固。你值得拥有(持续更新)~zhuanlan.zhihu.com