Java 调用百度的EasyDL定制化图像识别模型接口来识别车辆逆行并进行标注,EasyDL是一款定制模型训练和服务平台,我们可以根据自己的需求来创建自己的模型,使用合适的训练集来进行训练,训练完成后校验训练结果,如果满足我们的需求就可以申请发布了,发布成功后就能通过API或SDK,可以用于实际应用了。
百度EasyDL 定制化图像识别模型创建步骤,这里不作阐述,具体可访问EasyDL定制化图像识别 点击模型中心-->进行创建模型
效果图展示
Java调用百度EasyDL 识别图像接口返回json结果集
result:{"log_id":6287275792693832195,"results":[{"location":{"height":122,"left":153,"top":218,"width":125},"name":"逆行","score":0.5173363089561462}]}
待识别车辆行驶图片
识别后车辆逆行标注效果
开始请求
String imgUrl="图片URL";
//请求百度EasyDL图像识别接口
String json = BaiduDiscern.easydlImageClassify(imgUrl);
String resultname="";
if(StringUtil.isNotNull(json)) {
//解析结果
JSONObject json_obj = JSONObject.fromObject(json);
String trans=json_obj.getString("results");
List<Object> jsons = (List<Object>) JSONUtil.jsonToArray(trans, Object[].class);
if(jsons.size()>0) {
Map<String,Object> jsonMap=(Map<String, Object>) jsons.get(0);
Map<String,Object> maskMap=(Map<String, Object>) jsonMap.get("location");
//获取标注图片位置
String yMin = maskMap.get("top").toString();
String xMin = maskMap.get("left").toString();
String width = maskMap.get("width").toString();
String height = maskMap.get("height").toString();
ImgLabel label=new ImgLabel();
label.setxMin(Double.valueOf(xMin).intValue());
label.setyMin(Double.valueOf(yMin).intValue());
label.setWidth(Double.valueOf(width).intValue());
label.setHeight(Double.valueOf(height).intValue());
String time = new SimpleDateFormat("yyMMddssSSS").format(new Date());
String upload_url=img.getUrl().split("/")[2];
label.setUploadUrl(getTempFilePath(request)+"/"+upload_url);
String copy_url="/ImgFile/"+time+".jpg";
label.setCopy_url(getTempFilePath(request)+"/"+time+".jpg");
//图片根据坐标进行标注
boolean state=DrawImage.toDrawImage(label);
}
BaiduDiscern.java 百度识别类,替换自己的训练模型跟key即可
package com.picture.util;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* 百度识别
* @Description :
* @author ybwxblog
* @date : 2021年4月28日
*/
public class BaiduDiscern {
// 你训练的检测接口
private static String url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/detection/test";
// 官网获取的 API Key 更新为你注册的
private static String clientId = "";
// 官网获取的 Secret Key 更新为你注册的
private static String clientSecret = "";
/**
* 上传本地图片进行图像检测
*
* @param imgUrl
* @return 检测结果集
*/
public static String easydlImageClassify(String imgUrl) {
// 检测图片转base64格式
File file = new File(imgUrl);
String base64 = byteConverterBASE64(file);
try {
// 组装图片信息
Map<String, Object> map = new HashMap<>();
map.put("image", base64);
map.put("top_num", "5");
String param = GsonUtils.toJson(map);
// 获取token:注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间,
// 客户端可自行缓存,过期后重新获取。
String accessToken = AuthService.getAuth(clientId, clientSecret);
// 获取返回结果集
String result = HttpUtil.post(url, accessToken, "application/json", param);
System.out.println(result);
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String byteConverterBASE64(File file) {
long size = file.length();
byte[] imageByte = new byte[(int) size];
FileInputStream fs = null;
BufferedInputStream bis = null;
try {
fs = new FileInputStream(file);
bis = new BufferedInputStream(fs);
bis.read(imageByte);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
System.out.println("byte转换BASE64出错:" + e.getMessage());
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
System.out.println("关闭输入流出错:" + e.getMessage());
}
}
if (fs != null) {
try {
fs.close();
} catch (IOException e) {
System.out.println("关闭输入流出错:" + e.getMessage());
}
}
}
return (new sun.misc.BASE64Encoder()).encode(imageByte);
}
public static void main(String[] args) {
String url = "";
easydlImageClassify(url);
}
}
AuthService.java 百度Token 验证
package com.picture.util;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;
/**
* @Description :Token验证
* @author :ybwxblog
* @date : 2021年8月29日
*/
public class AuthService {
// 获取token地址
private static String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
/**
* 获取API访问token 该token有一定的有效期,需要自行管理,当失效时需重新获取.
*
* @param ak
* - 百度云官网获取的 API Key
* @param sk
* - 百度云官网获取的 Securet Key
* @return assess_token 示例:
* "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"
*/
public static String getAuth(String ak, String sk) {
String getAccessTokenUrl = authHost
// 1. grant_type为固定参数
+ "grant_type=client_credentials"
// 2. 官网获取的 API Key
+ "&client_id=" + ak
// 3. 官网获取的 Secret Key
+ "&client_secret=" + sk;
try {
URL realUrl = new URL(getAccessTokenUrl);
// 打开和URL之间的连接
HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
connection.setRequestMethod("GET");
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.err.println(key + "--->" + map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String result = "";
String line;
while ((line = in.readLine()) != null) {
result += line;
}
/**
* 返回结果示例
*/
System.err.println("result:" + result);
JSONObject jsonObject = new JSONObject(result);
String access_token = jsonObject.getString("access_token");
return access_token;
} catch (Exception e) {
System.err.printf("获取token失败!");
e.printStackTrace(System.err);
}
return null;
}
}
DrawImage .java 图片进行标注
package com.picture.util;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import com.picture.model.ImgLabel;
/**
* 图片标注工具类
* @Description :
* @author :ybwxblog
* @date : 2021年4月26日
*/
public class DrawImage {
/**
* 图片标注
* @param img
* @return
*/
public static boolean toDrawImage(ImgLabel img) {
boolean state=false;
int width = img.getWidth();
int height = img.getHeight();
int y = img.getyMin();//top
int x = img.getxMin();//left
String labelName=img.getLabelName();
String oriImage = img.getUploadUrl();
String drawImage = img.getCopy_url();
BufferedImage bufferedImage = null;
//读取图片文件,得到BufferedImage对象
try {
bufferedImage = ImageIO.read(new FileInputStream(oriImage));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//得到Graphics2D 对象
Graphics2D g2D=(Graphics2D)bufferedImage.getGraphics();
//设置颜色、画笔粗细
g2D.setColor(Color.RED);
g2D.setStroke(new BasicStroke(5));
//绘制矩形
g2D.drawRect(x, y, width, height);
g2D.setFont(new Font("",Font.BOLD,40));
//绘制文字
g2D.drawString("逆行", x+10, y+60);
try {
//保存绘制后的新图片
ImageIO.write(bufferedImage, "JPG",new FileOutputStream(drawImage));
state=true;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return state;
}
}