Java使用百度EasyDL定制化图像识别车辆逆行标注

本文介绍了如何使用Java调用百度的EasyDL定制化图像识别模型接口,对车辆行驶图片进行逆行识别并进行标注。通过EasyDL创建和训练模型,然后通过API获取识别结果,对图片进行标注处理,实现智能交通应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值