Обзор
Deep Java LibraryЭто библиотека Java для глубокого обучения, запущенная AWS в 2019 году. В настоящее время она поддерживает обучение и вывод моделей MXNet, PyTorch и TensorFlow. DJL не привязан к фиксированной платформе глубокого обучения, поэтому один и тот же набор кода можно адаптировать к разным платформам глубокого обучения.
Здесь, согласно учебному пособию, предоставленному на официальном веб-сайте, если вы создаете демонстрацию обнаружения целей, функции, которые необходимо реализовать, включают чтение локальных изображений, загрузку модели предварительного обучения, предоставленную официальным зоопарком моделей, выполнение вывода модели и вывод результирующая карта обнаружения цели на локальную. Ссылки включают:Официальное руководство по выводу модели SSD,Конфигурация зависимостей Maven,Конфигурация спецификации для DJL Maven,Сочетание зависимостей версии DJL.
Инженерное сооружение
Создайте новый проект Maven
JDK>=1.8
Структура проекта
импорт зависимостей
Представьте сам djl и другие пакеты, от которых зависит djl.
<build>
<plugins>
<!-->设定maven编译使用jdk8<-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<!-->以BOM的方式统一管理依赖包的版本<-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>ai.djl</groupId>
<artifactId>bom</artifactId>
<version>0.9.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
<!-->日志依赖包<-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.12.1</version>
</dependency>
<!-->使用djl必须引入的依赖包<-->
<dependency>
<groupId>ai.djl</groupId>
<artifactId>api</artifactId>
</dependency>
<!-->使用不同的深度学习框架模型引入不同的依赖包, 将mxnet改为pytorch即可更换深度学习框架
Apache MXNet engine implementation<-->
<dependency>
<groupId>ai.djl.mxnet</groupId>
<artifactId>mxnet-engine</artifactId>
</dependency>
<!-->使用不同的深度学习框架模型引入不同的依赖包,
Apache MXNet native library<-->
<dependency>
<groupId>ai.djl.mxnet</groupId>
<artifactId>mxnet-native-auto</artifactId>
<scope>runtime</scope>
</dependency>
<!-->使用不同的深度学习框架模型引入不同的依赖包,
A ModelZoo containing models exported from Apache MXNet<-->
<dependency>
<groupId>ai.djl.mxnet</groupId>
<artifactId>mxnet-model-zoo</artifactId>
</dependency>
</dependencies>
файл конфигурации журнала
Для этой части нет фиксированных требований, вы можете настроить ее в соответствии с реальными потребностями, здесь используется простой файл конфигурации, найденный в Интернете.log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Properties>
<property name="log_level" value="info" />
<Property name="log_dir" value="log" />
<property name="log_pattern"
value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] - [%t] %logger - %m%n" />
<property name="file_name" value="test" />
<property name="every_file_size" value="100 MB" />
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${log_pattern}" />
</Console>
<RollingFile name="RollingFile"
filename="${log_dir}/${file_name}.log"
filepattern="${log_dir}/$${date:yyyy-MM}/${file_name}-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="DEBUG" onMatch="ACCEPT"
onMismatch="DENY" />
<PatternLayout pattern="${log_pattern}" />
<Policies>
<SizeBasedTriggeringPolicy
size="${every_file_size}" />
<TimeBasedTriggeringPolicy modulate="true"
interval="1" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingFile>
<RollingFile name="RollingFileErr"
fileName="${log_dir}/${file_name}-warnerr.log"
filePattern="${log_dir}/$${date:yyyy-MM}/${file_name}-%d{yyyy-MM-dd}-warnerr-%i.log">
<ThresholdFilter level="WARN" onMatch="ACCEPT"
onMismatch="DENY" />
<PatternLayout pattern="${log_pattern}" />
<Policies>
<SizeBasedTriggeringPolicy
size="${every_file_size}" />
<TimeBasedTriggeringPolicy modulate="true"
interval="1" />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="${log_level}">
<AppenderRef ref="Console" />
<AppenderRef ref="RollingFile" />
<appender-ref ref="RollingFileErr" />
</Root>
</Loggers>
</Configuration>
Бизнес-код
процитировано из:GitHub.com/AWS labs/CTR…
package org.town;
import ai.djl.Application;
import ai.djl.ModelException;
import ai.djl.engine.Engine;
import ai.djl.inference.Predictor;
import ai.djl.modality.cv.Image;
import ai.djl.modality.cv.ImageFactory;
import ai.djl.modality.cv.output.DetectedObjects;
import ai.djl.repository.zoo.Criteria;
import ai.djl.repository.zoo.ModelZoo;
import ai.djl.repository.zoo.ZooModel;
import ai.djl.training.util.ProgressBar;
import ai.djl.translate.TranslateException;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* An example of inference using an object detection model.
*/
public final class ObjectDetection {
private static final Logger logger = LoggerFactory.getLogger(ObjectDetection.class);
private ObjectDetection() {}
public static void main(String[] args) throws IOException, ModelException, TranslateException {
DetectedObjects detection = ObjectDetection.predict();
logger.info("{}", detection);
}
public static DetectedObjects predict() throws IOException, ModelException, TranslateException {
Path imageFile = Paths.get("src/test/resources/dog_bike_car.jpg");
Image img = ImageFactory.getInstance().fromFile(imageFile);
String backbone;
if ("TensorFlow".equals(Engine.getInstance().getEngineName())) {
backbone = "mobilenet_v2";
} else {
backbone = "resnet50";
}
Criteria<Image, DetectedObjects> criteria =
Criteria.builder()
.optApplication(Application.CV.OBJECT_DETECTION)
.setTypes(Image.class, DetectedObjects.class)
.optFilter("backbone", backbone)
.optProgress(new ProgressBar())
.build();
try (ZooModel<Image, DetectedObjects> model = ModelZoo.loadModel(criteria)) {
try (Predictor<Image, DetectedObjects> predictor = model.newPredictor()) {
DetectedObjects detection = predictor.predict(img);
saveBoundingBoxImage(img, detection);
return detection;
}
}
}
private static void saveBoundingBoxImage(Image img, DetectedObjects detection)
throws IOException {
Path outputDir = Paths.get("build/output");
Files.createDirectories(outputDir);
// Make image copy with alpha channel because original image was jpg
Image newImage = img.duplicate(Image.Type.TYPE_INT_ARGB);
newImage.drawBoundingBoxes(detection);
Path imagePath = outputDir.resolve("detected-dog_bike_car.png");
// OpenJDK can't save jpg with alpha channel
newImage.save(Files.newOutputStream(imagePath), "png");
logger.info("Detected objects image has been saved in: {}", imagePath);
}
}
выходной результат
журнал проблем
Проблема 1: Статические вызовы методов интерфейса не поддерживаются на уровне языка «7» из-за слишком низкой версии JDK
Решение. Явно укажите использование jdk8 для компиляции в файле конфигурации pom.
Вопрос 2: Исключение в потоке "main" ai.djl.repository.zoo.ModelNotFoundException: не найдена подходящая модель с указанным типом ввода/вывода.
Решение: пакет зависимостей ai.djl.mxnet:mxnet-model-zoo не представлен в файле конфигурации pom, и зависимость может быть введена.
Вопрос 3: Ошибка после перехода на движок pytorch.
Метод переключения:
<dependency>
<groupId>ai.djl.pytorch</groupId>
<artifactId>pytorch-engine</artifactId>
</dependency>
<dependency>
<groupId>ai.djl.pytorch</groupId>
<artifactId>pytorch-native-auto</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>ai.djl.pytorch</groupId>
<artifactId>pytorch-model-zoo</artifactId>
</dependency>
Сообщение об ошибке:
[2021-01-01 23:49:12.420] [WARN] - [main] ai.djl.engine.Engine - Failed to load engine from: ai.djl.pytorch.engine.PtEngineProvider
ai.djl.engine.EngineException: Failed to load PyTorch native library
at ai.djl.pytorch.engine.PtEngine.newInstance(PtEngine.java:56) ~[pytorch-engine-0.9.0.jar:?]
at ai.djl.pytorch.engine.PtEngineProvider.getEngine(PtEngineProvider.java:27) ~[pytorch-engine-0.9.0.jar:?]
at ai.djl.engine.Engine.initEngine(Engine.java:59) [api-0.9.0.jar:?]
at ai.djl.engine.Engine.<clinit>(Engine.java:49) [api-0.9.0.jar:?]
at org.town.ObjectDetection.predict(ObjectDetection.java:45) [classes/:?]
at org.town.ObjectDetection.main(ObjectDetection.java:36) [classes/:?]
Caused by: java.lang.UnsatisfiedLinkError: C:\Users\steel\.djl.ai\pytorch\1.7.0-cpu-win-x86_64\asmjit.dll: Can't find dependent libraries
at java.lang.ClassLoader$NativeLibrary.load(Native Method) ~[?:1.8.0_251]
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1934) ~[?:1.8.0_251]
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1817) ~[?:1.8.0_251]
at java.lang.Runtime.load0(Runtime.java:809) ~[?:1.8.0_251]
at java.lang.System.load(System.java:1086) ~[?:1.8.0_251]
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184) ~[?:1.8.0_251]
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) ~[?:1.8.0_251]
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175) ~[?:1.8.0_251]
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) ~[?:1.8.0_251]
at java.util.Iterator.forEachRemaining(Iterator.java:116) ~[?:1.8.0_251]
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) ~[?:1.8.0_251]
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482) ~[?:1.8.0_251]
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472) ~[?:1.8.0_251]
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) ~[?:1.8.0_251]
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) ~[?:1.8.0_251]
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:1.8.0_251]
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418) ~[?:1.8.0_251]
at ai.djl.pytorch.jni.LibUtils.loadWinDependencies(LibUtils.java:119) ~[pytorch-engine-0.9.0.jar:?]
at ai.djl.pytorch.jni.LibUtils.loadLibrary(LibUtils.java:75) ~[pytorch-engine-0.9.0.jar:?]
at ai.djl.pytorch.engine.PtEngine.newInstance(PtEngine.java:44) ~[pytorch-engine-0.9.0.jar:?]
... 5 more
Exception in thread "main" ai.djl.engine.EngineException: No deep learning engine found.
Please refer to https://github.com/awslabs/djl/blob/master/docs/development/troubleshooting.md for more details.
at ai.djl.engine.Engine.getInstance(Engine.java:119)
at org.town.ObjectDetection.predict(ObjectDetection.java:45)
at org.town.ObjectDetection.main(ObjectDetection.java:36)
Caused by: ai.djl.engine.EngineException: Failed to load PyTorch native library
at ai.djl.pytorch.engine.PtEngine.newInstance(PtEngine.java:56)
at ai.djl.pytorch.engine.PtEngineProvider.getEngine(PtEngineProvider.java:27)
at ai.djl.engine.Engine.initEngine(Engine.java:59)
at ai.djl.engine.Engine.<clinit>(Engine.java:49)
... 2 more
Caused by: java.lang.UnsatisfiedLinkError: C:\Users\steel\.djl.ai\pytorch\1.7.0-cpu-win-x86_64\asmjit.dll: Can't find dependent libraries
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1934)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1817)
at java.lang.Runtime.load0(Runtime.java:809)
at java.lang.System.load(System.java:1086)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.Iterator.forEachRemaining(Iterator.java:116)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at ai.djl.pytorch.jni.LibUtils.loadWinDependencies(LibUtils.java:119)
at ai.djl.pytorch.jni.LibUtils.loadLibrary(LibUtils.java:75)
at ai.djl.pytorch.engine.PtEngine.newInstance(PtEngine.java:44)
... 5 more
Решение: не найдено.