MKDLFDKFL 2023-12-09 22:00 采纳率: 50%
浏览 6

JDL自动下载pytroch的动态库错误

我想使用djl 加载我的模型,但是在自动下载动态库时出现了一些问题请问我该怎么解决?
这是我导入的一些依赖

<dependency>
      <groupId>ai.djl.pytorch</groupId>
      <artifactId>pytorch-model-zoo</artifactId>
      <version>0.25.0</version>
    </dependency>

    <dependency>
      <groupId>ai.djl.pytorch</groupId>
      <artifactId>pytorch-engine</artifactId>
      <version>0.25.0</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>ai.djl.pytorch</groupId>
      <artifactId>pytorch-native-auto</artifactId>
      <version>1.8.1</version>
    </dependency>

下面的是我加载的代码

public class Yolov5 {
    static Translator<Image, DetectedObjects> translator = YoloV5Translator.builder().optSynsetArtifactName("coco.names").build();
    static Criteria<Image, DetectedObjects> criteria =
            Criteria.builder()
                    .setTypes(Image.class, DetectedObjects.class)
                    .optDevice(Device.cpu())
                    .optModelUrls(Main.class.getResource("/yolov5s").getPath())
                    .optModelName("best2.pt")
                    .optTranslator(translator)
                    .optEngine("PyTorch")
                    .build();
    public static void detect(Mat mat) throws ModelNotFoundException, MalformedModelException, IOException {
        ZooModel<Image, DetectedObjects> model = ModelZoo.loadModel(criteria);
        Image img = MyUtils.mat2Image(mat);
        long startTime = System.currentTimeMillis();
        Rect rect = new Rect();
        Scalar color = new Scalar(0,255, 0);
        try (Predictor<Image, DetectedObjects> predictor = model.newPredictor()) {
            DetectedObjects results = predictor.predict(img);
//            System.out.println(results);
            for (DetectedObjects.DetectedObject obj : results.<DetectedObjects.DetectedObject>items()) {
                BoundingBox bbox = obj.getBoundingBox();
                Rectangle rectangle = bbox.getBounds();
                String showText = String.format("%s: %.2f", obj.getClassName(), obj.getProbability());
                rect.x = (int) rectangle.getX();
                rect.y = (int) rectangle.getY();
                rect.width = (int) rectangle.getWidth();
                rect.height = (int) rectangle.getHeight();
                // 画框

                Imgproc.rectangle(mat, rect, color, 2);
                //画名字
                Imgproc.putText(mat, showText,
                        new Point(rect.x, rect.y),
                        Imgproc.FONT_HERSHEY_COMPLEX,
                        rectangle.getWidth() / 200,
                        color);
            }
        } catch (TranslateException e) {
            e.printStackTrace();
        }

    }

}
package com.lgw.until;

import ai.djl.modality.cv.Image;
import ai.djl.modality.cv.ImageFactory;
import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;

public class MyUtils {

    public static Image mat2Image(Mat mat) {
        return ImageFactory.getInstance().fromImage(HighGui.toBufferedImage(mat));
    }


}

运行时自动下载pytroch的动态库出现了一些问题
java.io.FileNotFoundException: https://publish.djl.ai/pytorch/1.8.1/jnilib/0.25.0/win-x86_64/cu111/djl_torch.dll
我打开这个连接出现了


```xml

<Error>
<Code>NoSuchKey</Code>
<Message>The specified key does not exist.</Message>
<Key>publish/pytorch/1.8.1/jnilib/0.21.0/win-x86_64/cu111/djl_torch.dll</Key>
<RequestId>YM27SCMB5C8AYR4M</RequestId>
<HostId>CESZYMpghat/pM8VZXOvXuUs1i0dY0DiyZ0H83szxjaW+9NtduR50lx2UE1fdUigrPQZoGND3RE=</HostId>
</Error>

我应该怎么解决?

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-10 08:30
    关注

    【相关推荐】



    • 你可以看下这个问题的回答https://ask.csdn.net/questions/7429099
    • 你也可以参考下这篇文章:DJL Java环境下部署pytorch模型推理
    • 除此之外, 这篇博客: DJL快速入门(纯Java跑深度学习模型)中的 3. 实战:DJL使用Pytorch模型完成图片分类 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

      这里使用Pytorch提供的resnet18模型完成一个图片分类任务。

      1. 首先引入依赖:
      <dependency>
          <groupId>ai.djl.pytorch</groupId>
          <artifactId>pytorch-engine</artifactId>
          <version>0.17.0</version>
          <scope>runtime</scope>
      </dependency>
      
      <dependency>
          <groupId>ai.djl.pytorch</groupId>
          <artifactId>pytorch-native-cpu</artifactId>
          <classifier>win-x86_64</classifier>
          <scope>runtime</scope>
          <version>1.11.0</version>
      </dependency>
      <dependency>
          <groupId>ai.djl.pytorch</groupId>
          <artifactId>pytorch-jni</artifactId>
          <version>1.11.0-0.17.0</version>
          <scope>runtime</scope>
      </dependency>
      
      <dependency>
          <groupId>ai.djl</groupId>
          <artifactId>api</artifactId>
          <version>0.17.0</version>
      </dependency>
      
      <dependency>
          <groupId>ai.djl</groupId>
          <artifactId>basicdataset</artifactId>
          <version>0.17.0</version>
      </dependency>
      
      <dependency>
          <groupId>ai.djl.opencv</groupId>
          <artifactId>opencv</artifactId>
          <version>0.17.0</version>
      </dependency>
      
      1. 导出pytorch的resnet18模型:
      import torch
      import torchvision
      
      # An instance of your model.
      model = torchvision.models.resnet18(pretrained=True)
      
      # Switch the model to eval model
      model.eval()
      
      # An example input you would normally provide to your model's forward() method.
      example = torch.rand(1, 3, 224, 224)
      
      # Use torch.jit.trace to generate a torch.jit.ScriptModule via tracing.
      traced_script_module = torch.jit.trace(model, example)
      
      # Save the TorchScript model
      traced_script_module.save("traced_resnet_model.pt")
      
      1. 将导出的模型拷贝到项目的model目录下:
        在这里插入图片描述

      2. 创建Translator,这里我们定义输入为String类型,表示图片的输入路径;输出也为String,表示类别。将图片送入Resnet18网络,需要做一些预处理:

      ...
      preprocess = transforms.Compose([
          transforms.Resize(256),
          transforms.CenterCrop(224),
          transforms.ToTensor(),
          transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
      ])
      ...
      

      这里利用Java的NDArray的

      Translator<String/*filename*/, String/*class*/> translator = new Translator<String, String>() {
      
          @Override
          public NDList processInput(TranslatorContext ctx, String input) throws Exception {
              // 根据路径读取图片
              Image image = ImageFactory.getInstance().fromFile(Paths.get(input));
              NDArray ndArray = image.toNDArray(ctx.getNDManager());
              // 在图片送入resnet前要做一些预处理,官方的例子中使用transforms,但为了本文的前后呼应,我这里就用上面将的NDArray的操作来完成
              Resize resize = new Resize(256, 256);
              ndArray = resize.transform(ndArray); // 将图片的大小resize到256x256
      
              // py: transforms.CenterCrop(224)
              // NDArray没有CenterCrop方法,但是我们可以通过切片的方式实现
              ndArray = ndArray.get(new NDIndex("16:240, 16:240, :"));
      
              // ToTensor会将Shape的(224,224,3)转变为(3,224,224),并且将值从0-255缩放到0-1
              ndArray = new ToTensor().transform(ndArray);
      
              // py: transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
              Normalize normalize = new Normalize(new float[]{0.485f, 0.456f, 0.406f}, new float[]{0.229f, 0.224f, 0.225f});
              ndArray = normalize.transform(ndArray);
      
              return new NDList(ndArray);  // resnet只接受一个Tensor
          }
      
          @Override
          public String processOutput(TranslatorContext ctx, NDList list) throws Exception {
              // resnet只返回一个tensor,所以要get(0)
              int index = list.get(0).argMax().toType(DataType.INT32, false).getInt();
              // 由于resnet可以识别1000种物体,这里我就只给index了。
              return index + "";
          }
      };
      
      1. 定义Criteria,然后实例化模型,并newPredictor
      Criteria<String, String> criteria = Criteria.builder()
              .setTypes(String.class, String.class)
              .optModelPath(Paths.get("model/traced_resnet_model.pt"))
              .optOption("mapLocation", "true")
              .optTranslator(translator)
              .build();
      
      ZooModel model = criteria.loadModel();
      Predictor predictor = model.newPredictor();
      
      1. 准备一张图片,我这里放在项目的test目录下:

      在这里插入图片描述在这里插入图片描述

      1. 进行预测
      System.out.println(predictor.predict("test/test.jpg"));
      

      由于resnet可以识别1000个物体,太多了,所以我只输出了index,全部的类别可以到

      该链接查找。最终输出为:
      258
      

      258对应的类别为Samoyed(萨摩耶),可以看得到预测对了。

      DJL更多的例子可以参考官方Demo







    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 12月9日

悬赏问题

  • ¥15 苹果系统的mac m1芯片的笔记本使用ce修改器使用不了
  • ¥15 单相逆变的电压电流双闭环中进行低通滤波PID算法改进
  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 如何卸载arcgis 10.1 data reviewer for desktop
  • ¥15 共享文件夹会话中为什么会有WORKGROUP
  • ¥15 关于#python#的问题:使用ATL02数据解算光子脚点的坐标(操作系统-windows)
  • ¥115 关于#python#的问题:未加密前两个软件都可以打开,加密后只有A软件可打开,B软件可以打开但读取不了数据
  • ¥15 在matlab中Application Compiler后的软件无法打开
  • ¥15 想问一下STM32创建工程模板时遇到得问题
  • ¥15 Fiddler抓包443