百度识别实验
一、实验任务
任务一:配置百度识别Java SDK
在进行配置前,需要使用baidu 的javaSDK,需要进行个人认证(我之前没有认证,不会出数据)
- 下载
图像识别 - 简介 | 百度AI开放平台 (baidu.com)
通过这个链接可以查找下载SDK的地址
或者选择2.配置
- 配置
因为我用的是maven管理工具,所以配置就只加入了个依赖
依赖如下:
<dependency>
<groupId>com.baidu.aip</groupId>
<artifactId>java-sdk</artifactId>
<version>4.16.6</version>
</dependency>
任务二:了解百度图像识别相关功能并进行总结
图像识别通常有轮廓识别、特征识别、色彩识别、物体识别等,其中轮廓识别是重中之重。而图像识别的基本流程为:信息获取图像采集->图像预处理得到特征数据->训练过程->识别。百度图像识别基于深度学习及大规模图像训练,准确识别图片中的物体类别、位置、置信度等综合信息。产品功能接口名称接口能力简要描述通用图像分析图像主体检测识别图像中的主体具体坐标位置。细粒度图像识别菜品识别检测用户上传的菜品图片,返回具体的菜名、卡路里、置信度信息。车型识别检测用户上传的车辆图片,识别所属车型,包括车辆品牌及具体型号。logo商标识别识别图片中包含的商品LOGO信息,返回LOGO品牌名称、在图片中的位置、置信度。动物识别检测用户上传的动物图片,返回动物名称、置信度信息。植物识别检测用户上传的植物图片,返回植物名称、置信度信息。定制化图像识别定制图像分类基于自定义训练出的图像分类模型,实现个性化图像识别。
任务三:完成动物识别,自行拍摄动物图片进行上传并查看结果
public class Sample {
//设置APPID/AK/SK
public static final String APP_ID = "28108881";
public static final String API_KEY = "ju9ZHXiedFhWS3w5s2Hb4BQK";
public static final String SECRET_KEY = "WjZF0Wg8qgdZtGANh8AfynNtBfxLOuWG";
private static Object JButton;
static String res1="";
public static String sample(AipImageClassify client) {
// 传入可选参数调用接口
HashMap<String, String> options = new HashMap<String, String>();
options.put("top_num", "2");
// options.put("baike_num", "2");
String image = Shangchuan.absolutePath;
JSONObject res = client.animalDetect(image, options);
res1 = res.get("result").toString();
JSONArray arr = JSON.parseArray(res1);
String jsonObject1 = arr.get(0).toString();
com.alibaba.fastjson.JSONObject obj = JSON.parseObject(jsonObject1);
String name = obj.getString("name");
System.out.println(name);
return name;
}
}
public class Shangchuan extends JFrame {
static String absolutePath="";
//设置APPID/AK/SK
public static final String APP_ID = "28108881";
public static final String API_KEY = "ju9ZHXiedFhWS3w5s2Hb4BQK";
public static final String SECRET_KEY = "WjZF0Wg8qgdZtGANh8AfynNtBfxLOuWG";
private JPanel contentPane;
private static JLabel lblNewLabel0;
private static JLabel lblNewLabel;
private static JLabel lblNewLabel2;
private JButton btnNewButton ;
private JButton btnNewButton2 ;
/**
* 初始化设置窗体
* Create the frame.
*/
public Shangchuan() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 622, 421);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
// contentPane.setBackground(Color.BLUE);
setContentPane(contentPane);
contentPane.setLayout(null);
lblNewLabel0 = new JLabel("动植物识别");
lblNewLabel0.setBounds(256, 1, 200, 100);
contentPane.add(lblNewLabel0);
lblNewLabel = new JLabel("动植物图片等待放入...");
lblNewLabel.setBounds(36, 39, 250, 250);
contentPane.add(lblNewLabel);
lblNewLabel2 = new JLabel("点击下面按钮,显示鉴定结果");
lblNewLabel2.setBounds(336, 39, 250, 250);
// lblNewLabel.setBackground(Color.BLUE);
contentPane.add(lblNewLabel2);
// 按钮1
btnNewButton = new JButton("上传图片");
btnNewButton.setFont(new Font("宋体", Font.BOLD, 18));
btnNewButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// System.out.println("bt1");
addPicture(btnNewButton);
}
});
btnNewButton.setBounds(35, 314, 141, 46);
contentPane.add(btnNewButton);
// 按钮2
btnNewButton2 = new JButton("上传图片验证");
btnNewButton2.setFont(new Font("宋体", Font.BOLD, 18));
btnNewButton2.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// System.out.println("bt2");
verify(btnNewButton2);
}
});
btnNewButton2.setBounds(335, 314, 241, 46);
contentPane.add(btnNewButton2);
}
/**
* 上传图片验证
* @param button
*/
public static void verify(JButton button){
AipImageClassify client = new AipImageClassify(APP_ID, API_KEY, SECRET_KEY);
String name = Sample.sample(client);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
lblNewLabel2.setText("经过鉴定,这个是:"+ name);
}
});
}
/**
* 上传图片
* @param button
* @return
*/
public static String addPicture(JButton button) {
// String absolutePath="";
JFileChooser chooser = new JFileChooser();
chooser.setMultiSelectionEnabled(true);
/** 过滤文件类型 * */
FileNameExtensionFilter filter = new FileNameExtensionFilter("jpg","png");
chooser.setFileFilter(filter);
int returnVal = chooser.showOpenDialog(button);
if (returnVal == JFileChooser.APPROVE_OPTION) {
/** 得到选择的文件* */
File[] arrfiles = chooser.getSelectedFiles();
//判断是否有文件为jpg或者png
File ff = chooser.getSelectedFile();
//创建一个fileName得到选择文件的名字
String fileName =ff.getName();
String prefix=fileName.substring(fileName.lastIndexOf(".")+1);
FileInputStream input = null;
FileOutputStream out = null;
//要上传到的路径,这里可以设你要放图片的路
String path = "D:\\Eclipse\\idea_java\\";
try {
for (File f : arrfiles) {
File dir = new File(path);
/** 目标文件夹 * */
File[] fs = dir.listFiles();
HashSet<String> set = new HashSet<String>();
for (File file : fs) {
set.add(file.getName());
}
//通过文件选择器对象拿到选择的文件.拿到该文件的绝对路径
absolutePath = chooser.getSelectedFile().getAbsolutePath();
//创建一个ImageIcon对象 传入图片文件的绝对路径
ImageIcon imageIcon = new ImageIcon(absolutePath);
lblNewLabel.setIcon(imageIcon);
lblNewLabel.getIcon();
input = new FileInputStream(f);
byte[] buffer = new byte[1024];
File des = new File(path, f.getName());
out = new FileOutputStream(des);
int len = 0;
while (-1 != (len = input.read(buffer))) {
out.write(buffer, 0, len);
}
out.close();
input.close();
}
JOptionPane.showMessageDialog(null, "上传成功!", "提示",
JOptionPane.INFORMATION_MESSAGE);
} catch (FileNotFoundException e1) {
JOptionPane.showMessageDialog(null, "上传失败!", "提示",
JOptionPane.ERROR_MESSAGE);
e1.printStackTrace();
} catch (IOException e1) {
JOptionPane.showMessageDialog(null, "上传失败!", "提示",
JOptionPane.ERROR_MESSAGE);
e1.printStackTrace();
}
}
return absolutePath;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
Shangchuan frame = new Shangchuan();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
任务四:完成植物识别,自行拍摄植物图片进行上传并查看结果
public class Sample {
//设置APPID/AK/SK
public static final String APP_ID = "28108881";
public static final String API_KEY = "ju9ZHXiedFhWS3w5s2Hb4BQK";
public static final String SECRET_KEY = "WjZF0Wg8qgdZtGANh8AfynNtBfxLOuWG";
private static Object JButton;
static String res1="";
public static String sample(AipImageClassify client) {
// 传入可选参数调用接口
HashMap<String, String> options = new HashMap<String, String>();
options.put("top_num", "2");
// options.put("baike_num", "2");
String image = Shangchuan.absolutePath;
JSONObject res = client.plantDetect(image, options);
res1 = res.get("result").toString();
JSONArray arr = JSON.parseArray(res1);
String jsonObject1 = arr.get(0).toString();
com.alibaba.fastjson.JSONObject obj = JSON.parseObject(jsonObject1);
String name = obj.getString("name");
System.out.println(name);
return name;
}
}
二、实验总结
问题1:
将百度识别的代码拿过来使用,没有数据
原因:
没有进行实名认证
解决:
实名认证后,成功获取数据
问题2:
导出的数据为json 格式,而我在Java 窗体中,需要一个字符串数据,无法解决数据格式转换
原因:
没有看官方的api文档
解决:
查看文档,搜索相关方法,成功将json 对象,解析为字符串
问题3:
Java 窗体文件中,设置了两个按钮,但是在点击第二个按钮的时候,会执行第一个按钮的方法,出现重复方法的使用
原因:
在传递变量时,调用了方法,通过方法的返回值获取变量,所以再点击第二个按钮时,执行了第一个按钮的方法
解决:
将返回的变量设置为静态全局变量,解决问题