如何正确调用百度AI开放平台的API进行图像识别 您所在的位置:网站首页 百度的所有功能介绍 如何正确调用百度AI开放平台的API进行图像识别

如何正确调用百度AI开放平台的API进行图像识别

2024-07-10 18:42| 来源: 网络整理| 查看: 265

一、注册一个百度账号 二、点击下方链接使用百度账号登录百度智能云

百度智能云登录地址:https://login.bce.baidu.com/

三、进入百度智能云个人中心,找到图像识别

四、点击创建图像识别应用

五、创建成功(一定要记住这个API Key和Secret Key)

六、打开百度AI开放平台,找到图像识别

百度AI开发平台地址:http://ai.baidu.com/

七、打开动物识别界面,打开技术文档

八、点击下方链接进行Access Token获取

方式一:查找动物识别的文档,稍微往下翻一下就看到了下面的内容,然后点击Access Token获取 方式二:点击链接地址:https://ai.baidu.com/docs#/Auth/top 进行Access Token获取

九、打开IDEA创建一个包

十、创建一个类名为AuthService的java文件

这里的 API Key和Secret Key下面的代码会用到 代码如下

package com.baidu.ai.aip.auth; 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; /** * 获取token类 */ public class AuthService { public static void main(String[] args) { getAuth(); } //百度技术文档里面是没有主方法的,这里需要自己创建,然后调用getAuth() /** * 获取权限token * @return 返回示例: * { * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567", * "expires_in": 2592000 * } */ public static String getAuth() { // 官网获取的 API Key 更新为你注册的(唯一需要收到的更改的地方 将百度云应用的AK---->API Key) String clientId = "百度云应用的AK"; // 官网获取的 Secret Key 更新为你注册的(唯一需要收到的更改的地方 将百度云应用的AK---->Secret Key) String clientSecret = "百度云应用的SK"; return getAuth(clientId, clientSecret); } /** * 获取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) { // 获取token地址 String authHost = "https://aip.baidubce.com/oauth/2.0/token?"; 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 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; } } 十一、点击运行获取access_token的值(一串数字)

小编这里运行产生的值是(一定要记住,最好找一个记事本复制进去):24.0e499aea1d600d794a1f4226604d3df1.2592000.1576589696.282335-17789002

十二、回到我们的动物识别的技术文档

十三、找到请求代码示例,选择Java

十四、下面需要下载四个FileUtil,Base64Util,HttpUtil,GsonUtils.java文件

百度官方提供的所需工具类的下载地址

/** * 重要提示代码中所需工具类 * FileUtil,Base64Util,HttpUtil,GsonUtils请从 * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72 * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2 * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3 * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3 * 下载 */

将这四个.java文件放入你的项目下面

package baiduapi; /** * Base64 工具类 */ public class Base64Util { private static final char last2byte = (char) Integer.parseInt("00000011", 2); private static final char last4byte = (char) Integer.parseInt("00001111", 2); private static final char last6byte = (char) Integer.parseInt("00111111", 2); private static final char lead6byte = (char) Integer.parseInt("11111100", 2); private static final char lead4byte = (char) Integer.parseInt("11110000", 2); private static final char lead2byte = (char) Integer.parseInt("11000000", 2); private static final char[] encodeTable = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}; public Base64Util() { } public static String encode(byte[] from) { StringBuilder to = new StringBuilder((int) ((double) from.length * 1.34D) + 3); int num = 0; char currentByte = 0; int i; for (i = 0; i < from.length; ++i) { for (num %= 8; num < 8; num += 6) { switch (num) { case 0: currentByte = (char) (from[i] & lead6byte); currentByte = (char) (currentByte >>> 2); case 1: case 3: case 5: default: break; case 2: currentByte = (char) (from[i] & last6byte); break; case 4: currentByte = (char) (from[i] & last4byte); currentByte = (char) (currentByte >> 6); } break; case 6: currentByte = (char) (from[i] & last2byte); currentByte = (char) (currentByte >> 4); } } to.append(encodeTable[currentByte]); } } if (to.length() % 4 != 0) { for (i = 4 - to.length() % 4; i > 0; --i) { to.append("="); } } return to.toString(); } } package baiduapi; import java.io.*; /** * 文件读取工具类 */ public class FileUtil { /** * 读取文件内容,作为字符串返回 */ public static String readFileAsString(String filePath) throws IOException { File file = new File(filePath); if (!file.exists()) { throw new FileNotFoundException(filePath); } if (file.length() > 1024 * 1024 * 1024) { throw new IOException("File is too large"); } StringBuilder sb = new StringBuilder((int) (file.length())); // 创建字节输入流 FileInputStream fis = new FileInputStream(filePath); // 创建一个长度为10240的Buffer byte[] bbuf = new byte[10240]; // 用于保存实际读取的字节数 int hasRead = 0; while ( (hasRead = fis.read(bbuf)) > 0 ) { sb.append(new String(bbuf, 0, hasRead)); } fis.close(); return sb.toString(); } /** * 根据文件路径读取byte[] 数组 */ public static byte[] readFileByBytes(String filePath) throws IOException { File file = new File(filePath); if (!file.exists()) { throw new FileNotFoundException(filePath); } else { ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length()); BufferedInputStream in = null; try { in = new BufferedInputStream(new FileInputStream(file)); short bufSize = 1024; byte[] buffer = new byte[bufSize]; int len1; while (-1 != (len1 = in.read(buffer, 0, bufSize))) { bos.write(buffer, 0, len1); } byte[] var7 = bos.toByteArray(); return var7; } finally { try { if (in != null) { in.close(); } } catch (IOException var14) { var14.printStackTrace(); } bos.close(); } } } }

下面的这个GsonUtils.java会报错,解决方面在下面!

/* * Copyright (C) 2017 Baidu, Inc. All Rights Reserved. */ package baiduapi; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonParseException; import java.lang.reflect.Type; /** * Json工具类. */ public class GsonUtils { private static Gson gson = new GsonBuilder().create(); public static String toJson(Object value) { return gson.toJson(value); } public static T fromJson(String json, Class classOfT) throws JsonParseException { return gson.fromJson(json, classOfT); } public static T fromJson(String json, Type typeOfT) throws JsonParseException { return (T) gson.fromJson(json, typeOfT); } } package baiduapi; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; import java.util.Map; /** * http 工具类 */ public class HttpUtil { public static String post(String requestUrl, String accessToken, String params) throws Exception { String contentType = "application/x-www-form-urlencoded"; return HttpUtil.post(requestUrl, accessToken, contentType, params); } public static String post(String requestUrl, String accessToken, String contentType, String params) throws Exception { String encoding = "UTF-8"; if (requestUrl.contains("nlp")) { encoding = "GBK"; } return HttpUtil.post(requestUrl, accessToken, contentType, params, encoding); } public static String post(String requestUrl, String accessToken, String contentType, String params, String encoding) throws Exception { String url = requestUrl + "?access_token=" + accessToken; return HttpUtil.postGeneralUrl(url, contentType, params, encoding); } public static String postGeneralUrl(String generalUrl, String contentType, String params, String encoding) throws Exception { URL url = new URL(generalUrl); // 打开和URL之间的连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); // 设置通用的请求属性 connection.setRequestProperty("Content-Type", contentType); connection.setRequestProperty("Connection", "Keep-Alive"); connection.setUseCaches(false); connection.setDoOutput(true); connection.setDoInput(true); // 得到请求的输出流对象 DataOutputStream out = new DataOutputStream(connection.getOutputStream()); out.write(params.getBytes(encoding)); out.flush(); out.close(); // 建立实际的连接 connection.connect(); // 获取所有响应头字段 Map headers = connection.getHeaderFields(); // 遍历所有的响应头字段 for (String key : headers.keySet()) { System.err.println(key + "--->" + headers.get(key)); } // 定义 BufferedReader输入流来读取URL的响应 BufferedReader in = null; in = new BufferedReader( new InputStreamReader(connection.getInputStream(), encoding)); String result = ""; String getLine; while ((getLine = in.readLine()) != null) { result += getLine; } in.close(); System.err.println("result:" + result); return result; } } 十五、如何解决GsonUtils.java报错警告呢??这里需要下载两个json包,分别是google和org的json包

两个jar包的百度网盘下载地址如下所示

链接:https://pan.baidu.com/s/1uXB7WQJWqJ2mbBKhEA1BWg 提取码:y9kv 链接:https://pan.baidu.com/s/1rheup48ht06kWkHRcoBlyQ 提取码:uo5p 十六、最重要的一步来了,如何在IDEA项目里面导入jar包呢?

第一步:打开file下的project structure 第二步:找到modules的你的项目放的位置,然后选择dependencies,然后找到“+” 第三步:点击“+”,然后点击JARs or directories,然后找到你下载的两个jar包所在的位置 ,点击ok 最后选择apply,然后点击OK,就不会报错了

十七、创建一个Animal的类,然后将动物识别的那段代码复制粘贴过去 package com.baidu.ai.aip; //这里导你自己项目的Animal所在的包的路径 /*import com.baidu.ai.aip.utils.Base64Util; import com.baidu.ai.aip.utils.FileUtil; import com.baidu.ai.aip.utils.HttpUtil;*/ import java.net.URLEncoder; /** * 动物识别 */ public class Animal { /** * 重要提示代码中所需工具类 * FileUtil,Base64Util,HttpUtil,GsonUtils请从 * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72 * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2 * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3 * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3 * 下载 */ public static String animal() { // 请求url String url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/animal"; try { // 本地文件路径 String filePath = "[本地文件路径]"; //需要改两处,第一处就将引号内部的[本地文件路径]替换为你想要识别的动物图片的地址,小编这里填的是“D:\甲骨文代码\学习总结图片\Animal\three.jpeg”(要具体到图片) byte[] imgData = FileUtil.readFileByBytes(filePath); String imgStr = Base64Util.encode(imgData); String imgParam = URLEncoder.encode(imgStr, "UTF-8"); String param = "image=" + imgParam; // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。 String accessToken = "[调用鉴权接口获取的token]"; //第二处改的值为小编要大家复制到记事本的那个token值 String result = HttpUtil.post(url, accessToken, param); System.out.println(result); return result; } catch (Exception e) { e.printStackTrace(); } return null; } public static void main(String[] args) { Animal.animal(); } } 十七、点击运行,获取识别结果如下所示

{"log_id": 4508637444409713969, "result": [{"score": "0.903391", "name": "金毛犬"}, {"score": "0.0613776", "name": "拉布拉多"}, {"score": "0.004973", "name": "中华田园犬"}, {"score": "0.00133911", "name": "豹犬"}, {"score": "0.00120851", "name": "腊肠犬"}, {"score": "0.000717416", "name": "串串狗"}]}

如果小伙伴们成功出现了这样的返回结果,代表步骤和方法都操作正确,恭喜你们!! 如果小伙伴们出现了错误,也别着急,请再认真仔细的参考小编编写的步骤,相信你们一定会成功的!!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有