package com.stylefeng.guns.modular.system.util.imageModel;
|
|
import cn.hutool.core.io.FileUtil;
|
import cn.hutool.core.util.URLUtil;
|
import cn.hutool.http.HttpRequest;
|
import cn.hutool.http.HttpResponse;
|
import cn.hutool.http.HttpUtil;
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONObject;
|
import com.stylefeng.guns.modular.system.model.enums.ImageModelEnum;
|
import com.stylefeng.guns.modular.system.util.UUIDUtil;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Value;
|
|
import java.io.File;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.net.MalformedURLException;
|
import java.net.URL;
|
import java.net.URLConnection;
|
import java.util.ArrayList;
|
import java.util.List;
|
|
/**
|
* @author zhibing.pu
|
* @Date 2024/12/20 15:48
|
*/
|
@Slf4j
|
public class ImageModelUtil {
|
|
/**
|
* 本地存储图片地址
|
*/
|
@Value("${filePath}")
|
private static String filePath;
|
|
|
/**
|
* 顶盖密闭模型
|
* @param url 图片网络地址
|
*/
|
private static List<String> closedTopModel(String url){
|
try {
|
String fileName = url.substring(url.lastIndexOf("."));
|
URLConnection urlConnection = new URL(url).openConnection();
|
urlConnection.connect();
|
InputStream inputStream = urlConnection.getInputStream();
|
File file = FileUtil.writeFromStream(inputStream, filePath + UUIDUtil.getTimeStr() + fileName);
|
inputStream.close();
|
return closedTopModel(file);
|
} catch (MalformedURLException e) {
|
throw new RuntimeException(e);
|
} catch (IOException e) {
|
throw new RuntimeException(e);
|
}
|
}
|
|
|
|
/**
|
* 顶盖密闭模型
|
* @param file 图片文件
|
*/
|
private static List<String> closedTopModel(File file){
|
HttpRequest post = HttpUtil.createPost("http://120.232.235.142:5000/predict");
|
post.form("file", file);
|
HttpResponse execute = post.execute();
|
int status = execute.getStatus();
|
if(200 != status){
|
log.error("顶盖密闭模型调用失败:" + execute.body());
|
return null;
|
}
|
JSONObject result = JSON.parseObject(execute.body());
|
JSONArray predicted_labels = result.getJSONArray("predicted_labels");
|
List<String> list = new ArrayList<>();
|
for (int i = 0; i < predicted_labels.size(); i++) {
|
list.add(predicted_labels.getString(i));
|
}
|
return list;
|
}
|
|
|
/**
|
* 摄像头故障模型
|
* @param url 图片网络地址
|
* @return
|
*/
|
private static List<String> cameraFaultModel(String url){
|
try {
|
String fileName = url.substring(url.lastIndexOf("."));
|
URLConnection urlConnection = new URL(url).openConnection();
|
urlConnection.connect();
|
InputStream inputStream = urlConnection.getInputStream();
|
File file = FileUtil.writeFromStream(inputStream, filePath + UUIDUtil.getTimeStr() + fileName);
|
inputStream.close();
|
return cameraFaultModel(file);
|
} catch (MalformedURLException e) {
|
throw new RuntimeException(e);
|
} catch (IOException e) {
|
throw new RuntimeException(e);
|
}
|
}
|
|
|
|
|
/**
|
* 摄像头故障模型
|
* @param file 图片文件
|
* @return
|
*/
|
private static List<String> cameraFaultModel(File file){
|
HttpRequest post = HttpUtil.createPost("http://120.232.235.142:4000/predict");
|
post.form("file", file);
|
HttpResponse execute = post.execute();
|
int status = execute.getStatus();
|
if(200 != status){
|
log.error("摄像头故障模型调用失败:" + execute.body());
|
return null;
|
}
|
JSONObject result = JSON.parseObject(execute.body());
|
String predicted_labels = result.getString("predicted_label");
|
List<String> list = new ArrayList<>();
|
list.add(predicted_labels);
|
return list;
|
}
|
|
|
|
/**
|
* 建筑垃圾装载模型
|
* @param url 图片网络地址
|
* @return
|
*/
|
private static List<String> constructionWasteLoadModel(String url){
|
try {
|
String fileName = url.substring(url.lastIndexOf("."));
|
URLConnection urlConnection = new URL(url).openConnection();
|
urlConnection.connect();
|
InputStream inputStream = urlConnection.getInputStream();
|
File file = FileUtil.writeFromStream(inputStream, filePath + UUIDUtil.getTimeStr() + fileName);
|
inputStream.close();
|
return constructionWasteLoadModel(file);
|
} catch (MalformedURLException e) {
|
throw new RuntimeException(e);
|
} catch (IOException e) {
|
throw new RuntimeException(e);
|
}
|
}
|
|
|
|
|
/**
|
* 建筑垃圾装载模型
|
* @param file 图片文件
|
* @return
|
*/
|
private static List<String> constructionWasteLoadModel(File file){
|
HttpRequest post = HttpUtil.createPost("http://120.232.235.142:");
|
post.form("file", file);
|
HttpResponse execute = post.execute();
|
int status = execute.getStatus();
|
if(200 != status){
|
log.error("建筑垃圾装载模型调用失败:" + execute.body());
|
return null;
|
}
|
JSONObject result = JSON.parseObject(execute.body());
|
String predicted_labels = result.getString("predicted_label");
|
List<String> list = new ArrayList<>();
|
list.add(predicted_labels);
|
return list;
|
}
|
|
|
/**
|
* 1号模型四类标签分别是
|
* Loaded Cargo - Unsealed 装载-未关闭
|
* Empty Container - Sealed 空载-关闭
|
* Empty Container - Unsealed 空载-未关闭
|
* Loaded Cargo - Sealed 装载-关闭
|
* ttt 未识别到货箱
|
* 2号模型四类分别是:'blurred'(模糊), 'no_video'(无视频),'normalcy'(正常), 'splash_screen(花屏)'
|
* @param url
|
* @param modelEnum
|
* @return
|
*/
|
public static boolean modelCheck(String url, ImageModelEnum modelEnum){
|
switch (modelEnum){
|
case TOP_SEAL:
|
List<String> list1 = closedTopModel(url);
|
//其中包含装载未关闭,视为异常
|
return !(list1.contains("Loaded Cargo - Unsealed") || list1.contains("ttt"));
|
case CAMERA_FAULT:
|
List<String> list2 = cameraFaultModel(url);
|
//其中包含正常,视为正常
|
return list2.contains("normalcy");
|
case CONSTRUCTION_WASTE_LOAD: // TODO 待完善
|
List<String> list3 = constructionWasteLoadModel(url);
|
//其中包含正常,视为正常
|
return list3.contains("normalcy");
|
}
|
return false;
|
}
|
|
|
|
}
|