改变,从一个简单的“物体识别”开始
一、百度AI开放平台
前几天在百度的AI平台上看到了很多好玩的API类,像类似于语音识别、人脸识别、文字识别、自然语言处理等等。这些在当前比较热门的技术都有提供给使用者的API。而且~~~,大部分都是免费的喔,前提是大家不要用作商业用途哈,随便玩玩还是可以的,给大家看一看都有些啥,先上一下图像技术的:
大家可以很明显的看到有一些类别在当前还是比较贴近于我们日常生活需要的,像图像审核、图像处理、还有图像识别等等,这些都是平时我们应用的比较多的。当然这只是其中的一个分类而已,在左边有一个大的分类表,大家有兴趣的话可以根据自己的需要去玩一玩这些API,链接先贴在这:(点击get)。
下面做一个简单的示例看看怎么使用这些API类的,在我们选择了心仪的API以后(我先以人脸与人体识别类的人脸检测为例),点进去以后我们可以看到有关这个技术的一些功能介绍和演示,还有一些常用的应用场景和服务类型,如下图:
下面都是些可提供检测的图片,如果你就觉得这些图片可能事先就检测好的,那你也可以上传一下本地的图片检测,像这样:
又或者是这样?
咳咳,哈哈哈,这不是笔者本人哈,打住哈。总之如果大家有兴趣的话,都可以去玩玩,在这里我就不做示范了。好,如果你觉得某个API已经符合你的胃口了,那么就可以开始着手使用它了,我们点击刚开始进来的立即使用按钮后:
登录一下你的百度账号,有账号的小伙伴直接登录就好了,没有的自己注册一下,再进去以后我们可以看到下面这个界面,首先我们创建一下应用。
然后将应用列表的信息补充完整,注意:应用的名称就是指你需要做的项目的名称,然后具体描述什么的就自己随便写点什么吧。在创建成功以后我们再点击左边的应用列表,可以看到我们刚刚创建的应用在这里:
注意一下上图百度给我们的应用提供的AppID,API Key 还有Secret Key,这三个东西是我们待会在用这个API的时候需要向百度发送请求,然后百度通过了以后才可以返回给你数据结果。
当你以上几步都完成了以后就可以正式的使用这个API了,让我们先打开有关这个API的技术文档:
进去了以后我们就可以看到有关这个API的详细介绍以及如何调度使用的情况,里面也有着不同语言在调用这个API的时候所使用的的源码,首先我们需要获取access_token,这是需要通过刚才我们所说的那三个东西作为参数所获取的,如何获取技术文档中有详细的解答,源码什么的也都有提供,只需要我们copy下来就好了(以Java为例):
另外我们需要注意的是:access_token的有效期为30天,切记需要每30天进行定期更换,或者每次请求都拉取新token;
我们在使用这个API的时候一定要下载对应的SDK文档,并且在项目中将其导入,因为我们是调用百度的第三方库,如果不下载的话在使用时就没办法查找到。具体如何下载,API技术文档中也有说明,这里就不再赘述了。
二 、物体和场景识别Deom
通过前面简单的对百度API描述和如何使用以后,相信大家都已经对其有一定的了解了,然后我们就可以开始着手用它来制作一些好玩的东西,在这里我使用的是里面图像技术类的通用物体和场景识别API,这个API的主要功能就是将你上传的图片通过识别然后返回识别的结果。下面我给大家运行一下API技术文档上的Demo,先贴一下源码:
public class Sample { public static void main(String[] args) { Sample sa = new Sample(); System.out.println(sa.DistinguishImage(filePath,appId,apiKey,secretKey)); } private static String appId = "输入你的appID"; private static String apiKey = "输入你的apiKey"; private static String secretKey = "输入你的secretKey"; private static String filePath = "输入你的图片路径"; public String DistinguishImage(String filePath, String appId,String apiKey,String secretKey) { // 初始化一个AipImageClassify对象,传入你的appID,apiKey,secretKey. AipImageClassify client = new AipImageClassify(appId, apiKey, secretKey); String DistinguishContent = TestImage(filePath,client); return DistinguishContent; } private String TestImage(String filePath, AipImageClassify client) { // 传入可选参数调用接口 HashMap<String, String> options = new HashMap<String, String>(); options.put("top_num", "3"); options.put("baike_num", "5"); // 参数为本地路径 // String filepath = "E:\\图片测试\\myimage.jpg"; // JSONObject res = client.advancedGeneral(filepath, options); // System.out.println(res.toString(2)); // 参数为二进制数组 byte[] file = readFile(filePath); JSONObject res = client.advancedGeneral(file, options); String Content = res.toString(2); return Content; }
private BufferedImage img; private byte[] bytes; private byte[] readFile(String fileName) { try { InputStream inputStream = new BufferedInputStream(new FileInputStream(fileName)); img = ImageIO.read(inputStream); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ImageIO.write(img,"jpg",outputStream); bytes = outputStream.toByteArray(); } catch (Exception e) { e.printStackTrace(); } return bytes; } }
下面的是返回结果,可以看到每一种可能性的结果主要返回了四个参数,score(每一种结果的评分,排序的主要参照,范围在0-1之间,数值越大,属于这类物体的可能性越高),root(物体的主要分类:比如动物、植物等),keyword(具体属于哪一种,可以理解为root实例化后的对象)、baike_info(里面主要是关于这个分类的介绍,还包含了介绍的链接和百度百科的描述)。返回的描述结果还是比较全面的。
[main] INFO com.baidu.aip.client.BaseClient - get access_token success. current state: STATE_AIP_AUTH_OK { "result": [ { "score": 0.885108, "root": "植物-菊科", "keyword": "向日葵", "baike_info": { "baike_url": "http://baike.baidu.com/item/%E5%90%91%E6%97%A5%E8%91%B5/6106", "image_url": "http://imgsrc.baidu.com/baike/pic/item/9f2f070828381f309a091d76ab014c086f06f0d9.jpg", "description": "向日葵(拉丁文:Helianthus annuus),属向日葵族,一年生草本,高1~3.5米。茎直立,圆形多棱角,质硬被白色粗硬毛。广卵形的叶片通常互生,先端锐突或渐尖,有基出3脉,边缘具粗锯齿,两面粗糙,被毛,有长柄。头状花序,直径10~30厘米,单生于茎顶或枝端。总苞片多层,叶质,覆瓦状排列,被长硬毛,夏季开花,花序边缘生中性的黄色舌状花,不结实。花序中部为两性管状花,棕色或紫色,能结实。矩卵形瘦果,果皮木质化,灰色或黑色,称葵花籽。原产南美洲,驯化种由西班牙人于1510年从北美带到欧洲,最初为观赏用。19世纪末,又被从俄国引回北美洲。中国均有栽培。向日葵种子叫葵花籽,常炒制之后做为零食食用,味美,也可以榨葵花籽油用于食用,油渣可以做饲料。" } }, { "score": 0.699135, "root": "植物-其它", "keyword": "太阳花", "baike_info": { "baike_url": "http://baike.baidu.com/item/%E5%90%91%E6%97%A5%E8%91%B5/6106", "image_url": "http://imgsrc.baidu.com/baike/pic/item/9f2f070828381f309a091d76ab014c086f06f0d9.jpg", "description": "向日葵(拉丁文:Helianthus annuus),属向日葵族,一年生草本,高1~3.5米。茎直立,圆形多棱角,质硬被白色粗硬毛。广卵形的叶片通常互生,先端锐突或渐尖,有基出3脉,边缘具粗锯齿,两面粗糙,被毛,有长柄。头状花序,直径10~30厘米,单生于茎顶或枝端。总苞片多层,叶质,覆瓦状排列,被长硬毛,夏季开花,花序边缘生中性的黄色舌状花,不结实。花序中部为两性管状花,棕色或紫色,能结实。矩卵形瘦果,果皮木质化,灰色或黑色,称葵花籽。原产南美洲,驯化种由西班牙人于1510年从北美带到欧洲,最初为观赏用。19世纪末,又被从俄国引回北美洲。中国均有栽培。向日葵种子叫葵花籽,常炒制之后做为零食食用,味美,也可以榨葵花籽油用于食用,油渣可以做饲料。" } }, { "score": 0.453014, "root": "植物-其它", "keyword": "花海", "baike_info": { "baike_url": "http://baike.baidu.com/item/%E8%8A%B1%E6%B5%B7/9009691", "image_url": "http://imgsrc.baidu.com/baike/pic/item/3c6d55fbb2fb4316e955e21d26a4462309f7d30b.jpg", "description": "《花海》是周杰伦演唱的一首歌曲,由周杰伦作曲,古小力和黄淩嘉填词,收录在周杰伦2008年发行的专辑《魔杰座》中。《花海》是一首充满岛国风情的歌曲,周杰伦以海岛唱腔演唱,有种抚慰人心的力量。" } }, { "score": 0.272218, "root": "植物-其它", "keyword": "葵花", "baike_info": { "baike_url": "http://baike.baidu.com/item/%E8%91%B5%E8%8A%B1/5097148", "image_url": "http://imgsrc.baidu.com/baike/pic/item/b03533fa828ba61ee8609a9d4b34970a314e59f1.jpg", "description": "葵花,学名向日葵(Helianthus annuus)别名太阳花,是菊科向日葵属的植物。向日葵花语为爱慕、光辉、高傲之意,仰慕、凝视着你。温暖,耐旱,能产果实葵花籽。原产北美洲,世界各地均有栽培。向日葵也是俄罗斯,秘鲁的国花。" } }, { "score": 0.080621, "root": "商品-农用物资", "keyword": "花卉", "baike_info": { "baike_url": "http://baike.baidu.com/item/%E8%8A%B1%E5%8D%89/229536", "image_url": "http://imgsrc.baidu.com/baike/pic/item/f9dcd100baa1cd1192fd9cb2b312c8fcc2ce2ddd.jpg", "description": "花卉,具有观赏价值的草本植物,是用来欣赏的植物的统称,喜阳且耐寒,具有繁殖功能的短枝,有许多种类。典型的花,在一个有限生长的短轴上,着生花萼、花瓣和产生生殖细胞的雄蕊与雌蕊。花由花冠、花萼、花托、花蕊组成,有各种各样颜色,有的长得很艳丽,有香味。有些学者认为裸子植物的孢子叶球也是\u201c花\u201d,而多数人则认为被子植物才有真正的花,所以被子植物也称为有花植物。花的各部分不易受外界环境影响,长期以来,人们都以花的形态结构作为被子植物分类鉴定和系统演化的主要依据(见被子植物门)。" } } ], "log_id": 2979176988250706114, "result_num": 5 }
三、我的物体识别
上面给大家运行了百度API提供的Demo,其实它提供的不仅仅是上面的,还有关于具体的分类的Demo,比如有专门的动物分类,植物分类,以及商场的logo分类等等,大家如果有兴趣的话可以多多尝试,根据自己的需要运行那些你觉得更好玩的Demo。下面给大家展示一下我做的一个比较简单的物体识别的成效,当然不管是代码还是布局什么的都有很大的优化空间,我暂时还没有进行优化,在这里只是给大家做个参考:
在上面的图片中我们可以很明显的看到,一开始我初始化的时候就已经添加了一个猫咪的图片,在通过识别这张图片后将识别的内容返回到了下面的文本框中。在这里文本框中的字体比较小,我还没有进行优化。只是给大家看看大概的成果是这个亚子的。如果想换其他的图片的话,我们也可以通过点击右边的一些图片来看看效果:
可以看到在我点击了右边不同的图片以后,出现了不同的效果以及识别信息,如果觉得这些都太局限了,那么我们就点击下方的“上传”按钮,来识别自己想要的图片,比如这样:
这样子一来就可以将我们的产品变得更具有灵活性,注意:我这里上传的图片文件暂时只是设置了可以识别jpg和png的图片,其他类型的图片上传的话暂时是识别不了的哟。至于github源码的话我先贴在这里(代码是用Java实现的),如果大家有兴趣的话可以看看。
如果大家具体还有些关于百度API使用的问题,又或者是对我的工程有什么更好的改进想法,欢迎大家与我交流(贴一下联系方式):
VX:a1027759481
QQ:1027759481
今天就先到这里啦~
拜~