当前位置: 首页 > 科技观察

5分钟!使用Java实现目标检测

时间:2023-03-17 22:17:03 科技观察

本文经AI新媒体量子位(公众号ID:QbitAI)授权转载,转载请联系出处。编者按:作为一名Java开发人员,您是否曾为在PyTorch上部署模型而苦恼过?这篇来自AWS软件工程师的投稿,结合实例,详细介绍了DJL,一个专为Java开发者设计的深度学习库:5分钟,你可以在PyTorch上用Java实现目标检测。由于其独特的设计,PyTorch在深度学习领域得到广泛应用。无论是数据的并行处理,还是动态计算图,都为Python简化了很多。很多论文都选择使用PyTorch来实现,这也证明了它在训练中的高效性和易用性。在PyTorch世界中,虽然部署模型有很多选项,但可供Java开发人员使用的选项很少。过去,用户可以用PyTorchC++编写JNI(JavaNativeInterface)来实现这个过程。最近,PyTorch1.4还发布了一个实验性的Java前端。然而,这两种解决方案都不能被Java开发人员很好地使用:用户需要在易用性和易维护性之间做出选择。针对这个问题,AmazonWebServices(AWS)开源了DeepJavaLibrary(DJL),这是一个专为Java开发者设计的深度学习库。它兼顾了易用性和可维护性,所有的运行效率和内存管理问题都得到了很好的处理。DJL非常易于使用。只需几行代码,用户就可以轻松部署深度学习模型进行推理。因此,让我们开始使用DJL部署PyTorch模型。前期准备用户可以方便的使用maven、gradle等常见的Java配置管理包来引用DJL。这是一个示例:插件{id'java'}存储库{jcenter()}依赖项{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"}然后直接gradlebuild,基本配置就搞定了。开始部署模型我们使用的目标检测模型来自NVIDIA在torchhub上发布的预训练模型。我们使用下图来推理几个可识别的对象(一只狗、一辆自行车和一辆皮卡)。推理过程可以通过如下代码实现:资源/dog_bike_car.jpg";BufferedImageimg=BufferedImageUtils.fromUrl(url);Criteriacriteria=Criteria.builder().optApplication(Application.CV.OBJECT_DETECTION).setTypes(BufferedImage.class,DetectedObjects.class)。optFilter("backbone","re??snet50").optProgress(newProgressBar()).build();try(ZooModelmodel=ModelZoo.loadModel(criteria)){try(Predictorpredictor=model.newPredictor()){DetectedObjectsdetection=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,看看实际检测效果:你可能会说这些代码封装的太强大了,真正的新手应该如何上手呢?我们仔细看一下刚才的代码://读取一张图片Stringurl="https://github.com/awslabs/djl/raw/master/examples/src/test/resources/dog_bike_car.jpg";BufferedImageimg=BufferedImageUtils.fromUrl(url);//创建模型搜索条件Criteriacriteria=Criteria.builder()//设置应用类型:objectdetection.optApplication(Application.CV.OBJECT_DETECTION)//判断输入和输出类型(使用默认图像处理工具).setTypes(BufferedImage.class,DetectedObjects.class)//模型过滤条件.optFilter("backbone","re??snet50").optProgress(newProgressBar()).build();//创建模型对象try(ZooModelmodel=ModelZoo.loadModel(criteria)){//创建推送Reasoningobjecttry(Predictorpredictor=model.newPredictor()){//reasoningDetectedObjectsdetection=predictor.predict(img);System.out.println(detection);}}这样是不是清楚很多?DJL建立了模型库(ModelZoo)的概念,引入了来自GluonCV、TorchHub、Keras预训练模型、huggingface自然语言处理模型等70多个模型,所有模型均可一键导入。用户只需使用默认的或自己编写的输入输出工具即可实现轻松推理。我们不断添加各种预训练模型。了解DJLDJL是亚马逊云服务在2019年re:Invent大会上推出的为Java开发者量身打造的深度学习框架,目前已经运行在数百万亚马逊推理任务上。如果要总结DJL的主要特点,那么就是以下三点:DJL不局限于后端引擎:用户可以很方便地使用MXNet、PyTorch、TensorFlow和fastText在Java上做模型训练和推理。DJL的算子设计无限接近numpy:其用户体验与numpy基本无缝衔接,切换引擎也不会改变结果。DJL优秀的内存管理和效率机制:DJL有自己的资源回收机制,连续推理100小时不会出现内存溢出。JamesGosling(Java创始人)使用后给予好评:SupportforPyTorchDJL现在支持PyTorch1.5。我们深度集成了PyTorchC++API,开发了一套JNI来提供Java底层支持。DJL提供了各种PyTorch原生算子算法,现在支持所有TorchScript模型。DJLPyTorch现在可以在所有Mac/Linux/Windows平台上运行。DJL具有自检测CUDA版本的功能,会自动使用对应的CUDA版本包运行gpu任务。