目前市面上主流的深度学习框架 TensorFlow、pytorch、MxNet都是以Python语言为主,Java工程师们想要利用自己的优势开发一款深度学习应用绝非易事;通过本篇文章我们将解决这个问题,用极少的代码实现一个图片分类服务

场景

【物体分类】

通过Http请求,向后端服务传入一张图片地址,后端服务调用深度学习模型对图片进行处理,给出分类预测结果

搭建工程

使用idea或者eclipse构建maven工程,并导入以下maven依赖

commons-cli
commons-cli
1.4
org.apache.logging.log4j
log4j-slf4j-impl
2.12.1
com.google.code.gson
gson
2.8.5
ai.djl
api
${djl.version}
ai.djl
basicdataset
${djl.version}
ai.djl
model-zoo
${djl.version}
com.sparkjava
spark-core
2.8.0
ai.djl.mxnet
mxnet-model-zoo
${djl.version}
ai.djl.mxnet
mxnet-engine
${djl.version}
ai.djl.mxnet
mxnet-native-auto
1.7.0-a
runtime

加载模型

使用djl ModelZoo加载ImageNet模型,并对输入图片进行分类预测

public class ImageNetTest {
private static Predictor predictor = null;
static {
load();
}
private static void load(){
Criteria criteria =
Criteria.builder()
.optApplication(Application.CV.IMAGE_CLASSIFICATION)
.setTypes(BufferedImage.class, Classifications.class)
.optFilter("multiplier", "0.75")
.optFilter("flavor", "v1")
.optFilter("dataset", "imagenet")
.optArtifactId("mobilenet")
.optProgress(new ProgressBar())
.build();
try {
ZooModel model = ModelZoo.loadModel(criteria);
predictor = model.newPredictor();
} catch (IOException e) {
e.printStackTrace();
} catch (ModelNotFoundException e) {
e.printStackTrace();
} catch (MalformedModelException e) {
e.printStackTrace();
}
}
public static String predict(String imagePath) throws Exception {
BufferedImage image;
if (imagePath.startsWith("http")) {
image = BufferedImageUtils.fromUrl(new URL(imagePath));
} else {
image = BufferedImageUtils.fromFile(Paths.get(imagePath));
}
return new Gson().toJson(predictor.predict(image).topK(3));
}
public static void main(String[] args)throws Exception {
System.out.println(predict("src/test/resources/dog-cat.jpg"));
}
}

模型下载地址

下载模型 将文件解压到

{your_os_user_root}\.djl.ai\cache\repo\model\cv\image_classification\ai\djl\mxnet\mobilenet\v1\0.75

扫码下载

SimpleHttp
通过web spark 快速实现restful api
public static void main(String[] args) {
port(8899);
get("/img_classes/predict", (request, response) -> {
return ImageNetTest.predict(request.queryParams("img_url"));
});
}

测试效果

斗牛犬
image.png