小帅丶干货之图像识别在微信小程序展示
756665228 发布于2017-10-18 浏览:26089 回复:63
8
收藏
  • 第一步肯定是去http://ai.baidu.com 注册账号,登陆并注册创建应用。
  • http://ai.baidu.com/docs#/Begin/top 具体操作就看百度给出的文档即可很详细的哦。图文说明的
  • 第二步https://mp.weixin.qq.com/cgi-bin/wx注册个微信小程序(作者不会移动端开发所以选择了微信小程序)
  • 微信小程序需要注意事项:1.必须有一个具有公网IP的服务器。且需要HTTPS协议(这样很好,可以直接跳转域名备案的问题) 2.选择BCC(百度云服务器)是一个不错的选择。当然别家的也是可以的
  • 第三步就是熟悉百度AI文档,并进行测试接口,以备后续使用
  • http://ai.baidu.com/docs#/ImageClassify-API/top 图像识别的文档。包含了示例代码根据自己所学语言查看即可。(最好会一门后端开发语言 作者使用Java)

                                         图像识别模块截图示意                                                                                                            小程序专属码(微信扫一扫即可体验查看)

                                                  

官网给出的Java代码示例:大家可以直接复制替换参数使用即可

package com.baidu.ai.aip;

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 Dish {

    /**
    * 重要提示代码中所需工具类
    * 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 dish() {
        // 请求url
        String url = "https://aip.baidubce.com/rest/2.0/image-classify/v2/dish";
        try {
            // 本地文件路径
            String filePath = "[本地文件路径]";
            byte[] imgData = FileUtil.readFileByBytes(filePath);
            String imgStr = Base64Util.encode(imgData);
            String imgParam = URLEncoder.encode(imgStr, "UTF-8");

            String param = "image=" + imgParam + "&top_num=" + 5;

            // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
            String accessToken = "[调用鉴权接口获取的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) {
        Dish.dish();
    }
}

作者本人的微信小程序展示分2大部分

  • Java后端实现:使用SpringMVC实现上传图片并进行读取图片的本地路径转base64请求百度AI接口实现。由于后台具体功能尚未完善就不公开源码了。示例代码如下:
	/**

	 * 上传文件方法 植物识别

	 * @param request

	 * @param response

	 * @throws Exception

	 */
	@RequestMapping(value="/uploadBDPLANT",method=RequestMethod.POST)
	public void UploadBDPLANT()throws Exception{
		    String result = "";
		    MultipartHttpServletRequest mpRequest = (MultipartHttpServletRequest)this.request;
		    int sizeThreshold = 6144;
		    String respath = "/uploads";
		    String despath = "/uploads/";
		    String baseResPath = getRealPath(respath);
		    String baseDespath = getRealPath(despath);

		    File repository = new File(baseResPath);
		    long sizeMax = 8388608L;
		    DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
		    diskFileItemFactory.setRepository(repository);
		    diskFileItemFactory.setSizeThreshold(sizeThreshold);
		    ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
		    servletFileUpload.setSizeMax(sizeMax);
		    Iterator iter = mpRequest.getFileNames();
		    MultipartFile file = null;
		    while (iter.hasNext()) {
		      file = mpRequest.getFile((String)iter.next());
		      if ((file != null) && (file.getSize() != 0L))
		      {
		        byte[] b = file.getBytes();
		        String filename = "BDPLANT" + new Date().getTime() / 1000L + file.getOriginalFilename();
		        String allfilename = filename.substring(0, filename.lastIndexOf("."));
		        String ext = filename.substring(filename.lastIndexOf(".") + 1);
		        if (!ext.toLowerCase().equals("amr")) {
		          logger.info("==============非音频文件==============");
		          File targetDir = new File(baseDespath);
		          System.out.println("非音频文件 目录是否存在 是否是目录" + targetDir.exists() + "-" + targetDir.isDirectory());
		          try {
		            boolean a = targetDir.mkdirs();
		            System.out.println(a + "目录已经创建");
		          } catch (Exception e) {
		            logger.error("目录创建失败:" + e.getMessage(), e);
		          }
		          String path = baseDespath + File.separator + filename;
		          File target = new File(path);
		          System.out.println("target path=" + path);
		          if (!target.exists())
		            try {
		              boolean a = target.createNewFile();
		              System.out.println(a + "文件夹创建");
		            } catch (Exception e) {
		              logger.error("文件夹创建失败" + e.getMessage(), e);
		            }
		          try
		          {
		            FileUtil.saveFile(b, path);
		            String token = getBDTokenParam();
		            String url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/plant";
		            byte[] imgData = FileUtil.readFileByBytes(path);
		            String imgStr = com.bdxc.util.Base64Util.encode(imgData);
		            String params = URLEncoder.encode("image", "UTF-8") + "=" + URLEncoder.encode(imgStr, "UTF-8")+"&top_num=1";
		            String responseBD = HttpUtils.post(url, token, params);
		            net.sf.json.JSONObject object = net.sf.json.JSONObject.fromObject(responseBD);
		            Map classMap = new HashMap();
		            classMap.put("result",com.bdxc.vo.baiduVO.BDPlantAnimal.Result.class);
		            BDPlantAnimal bdPlant = (BDPlantAnimal) JSONObject.toBean(object,BDPlantAnimal.class,classMap);
		            if (bdPlant != null) {
		            	double returnscore = bdPlant.getResult().get(0).getScore();
		              if (returnscore<0.001) {
		                  result = "{\"result\":\"fail\",\"words\":\"未能识别出植物或可信度过低 Sorry\"}";
		                  PrintUtil.printJson(this.response, result); 
		                  continue;
		              }
		              logger.info("百度植物返回的信息" + object.toString());
		              String name = bdPlant.getResult().get(0).getName().toString();
		              String score = Double.toString(bdPlant.getResult().get(0).getScore()*100).substring(0, 5);
		              result = "{\"result\":\"ok\",\"words\":\"success\",\"name\":\"" +name + "\",\"score\":\""+score+"%\"}";
		              logger.info("===========百度植物输出为" + result);
		              PrintUtil.printJson(this.response, result);
		              continue;
		            }
		          	}catch (Exception e){
		            logger.error("非音频文件上传失败" + e.getMessage(), e);
		            result = "{\"result\":\"fail\",\"words\":\"植物识别失败\"}";
		            PrintUtil.printJson(this.response, result);
		          }
		        }
		        else {
		          File targetDir = new File(baseDespath);
		          System.out.println("音频文件 目录是否存在 是否是目录" + targetDir.exists() + "-" + targetDir.isDirectory());
		          try {
		            boolean a = targetDir.mkdirs();
		            System.out.println("音频文件目录不存在 创建成功" + a);
		          } catch (Exception e) {
		            logger.error("音频文件目录创建失败" + e.getMessage(), e);
		          }
		          String path = baseDespath + File.separator + filename;
		          File target = new File(path);
		          System.out.println("音频文件存放目录" + path);
		          if (!target.exists())
		            try {
		              boolean a = target.createNewFile();
		              System.out.println("音频文件夹创建成功" + a);
		            } catch (Exception e) {
		              logger.error("音频文件夹创建失败" + e.getMessage(), e);
		            }
		          try
		          {
		            FileUtil.saveFile(b, path);
		            System.out.println("====音频文件=====" + filename);
		            result = "{\"result\", \"OK\"}";
		            PrintUtil.printJson(this.response, result);
		          } catch (Exception e) {
		            logger.error("音频文件上传失败 或者 转换失败" + e.getMessage(), e);
		            result = "{\"result\", \"FAIL\"}";
		            PrintUtil.printJson(this.response, result);
		          }
		        }
		      } else {
		        logger.error("请检查上传文件是否正确");
		        result = "{\"result\", \"FAIL\"}";
		        PrintUtil.printJson(this.response, result);
		      }
		    }
		}
  • 微信小程序前端实现页面(源代码地址如下):

      https://gitee.com/xshuai/weixinxiaochengxu

 

收藏
点赞
8
个赞
共63条回复 最后由756665228回复于2019-06-02
#23我还曾经的回复于2017-10-24

66666

0
#22我还曾经的回复于2017-10-24

谢谢分享

0
#21china476prc回复于2017-10-24
#20 笔墨哥回复
多社区学习,总有一天会明且厉的

666

0
#20笔墨哥回复于2017-10-24
#19 china476prc回复
虽不明但觉厉

多社区学习,总有一天会明且厉的

0
#19china476prc回复于2017-10-23

虽不明但觉厉

0
#18聊了两句就饿回复于2017-10-23

有点懵

0
#17笔墨哥回复于2017-10-22
#15 756665228回复
颜色一样吧。这个是我个人的微信小程序

真的挺不错的,谢谢分享啦

0
#16756665228回复于2017-10-22
#14 china476prc回复
这些都是链接入口还是程序码?

?????

0
#15756665228回复于2017-10-22
#13 china476prc回复
好像是饿了么的小程序

颜色一样吧。这个是我个人的微信小程序

0
#14china476prc回复于2017-10-22

这些都是链接入口还是程序码?

0
#13china476prc回复于2017-10-22

好像是饿了么的小程序

0
#12笔墨哥回复于2017-10-19
#2 756665228回复
https://mp.weixin.qq.com/cgi-bin/wx 微信小程序注册入口 http://ai.baidu.com/docs#/Begin/top 百度AI文档网站 https://gitee.com/xshuai/weixinxiaochengxu 微信小程序源代码
展开

感谢分享啦,很有帮助呢~

0
#11756665228回复于2017-10-18
#10 hongguangzhang回复
赞啊这个花了多长时间?

如果熟悉了百度接口。半天完事。然后就是小程序的开发组件熟悉。我这个从第一个版本到现在这样历时了半年多。

0
#10hongguangzhang回复于2017-10-18

赞啊这个花了多长时间?

0
#9756665228回复于2017-10-18
#8 笔墨哥回复
哇塞,楼主好厉害呀~  

一起学习了

0
#8笔墨哥回复于2017-10-18

哇塞,楼主好厉害呀~

 

0
#7756665228回复于2017-10-18
#6 荒墨丶迷失回复
我也是java,楼主可以多深入一起学习嘛,或许以后可以一起合作

百度AI接口。个人感觉好玩的实用的都会放在微信小程序上

0
#6荒墨丶迷失回复于2017-10-18

我也是java,楼主可以多深入一起学习嘛,或许以后可以一起合作

0
#5荒墨丶迷失回复于2017-10-18

不错不错 学习了

0
#4756665228回复于2017-10-18
#3 __________左手回复
厉害了我的哥

互相学习了。

0
TOP
切换版块