AI开放平台集成API

说明

方法说明:

1.select():选择识别的方法,参数为url的路由
2.where():过滤条件,参数为请求的参数,同官方文档一致
3.get():触发API请求,返回结果

百度

代码示例:

  1. 人脸识别(image参数无需base64):

    1
    Entry::Baidu($config)->face->select('detect')->where(['image' => file_get_contents(__DIR__ . '/file/face_detect.jpeg'), 'id_card_side' => 'front'])->get();
  2. 通用文字识别(image参数无需base64):

    1
    Entry::Baidu($this->config)->ocr->select('general_basic')->where(['url' => 'http://aip.bdstatic.com/portal/dist/1513863228374/ai_images/technology/ocr-general/general/demo-card-2.jpg'])->get();
  3. 人体关键点识别(image参数无需base64):

    1
    Entry::Baidu($config)->body->select('analysis')->where(['image' => file_get_contents(__DIR__ . '/../../file/body1.jpg')])->get();
  4. 商品检索(image参数无需base64):

    1
    Entry::Baidu($this->config)->imageSearch->select('v1/realtime_search/product/search')->where(['image' => file_get_contents(__DIR__ . '/../../file/cup.jpg')])->get();

官方文档:

百度AI开放平台

方法:

1.人脸识别(face

* detect:人脸检测
* match:人脸比对
* verify:人脸认证
* identify:人脸识别
* multi-identify:M:N 识别
* add:人脸库添加
* update:人脸库更新
* delete:人脸删除
* get:用户信息查询
* getlist:组列表查询
* getusers:组内用户列表查询
* adduser:组间复制用户
* deleteuser:组内删除用户

2.文字识别(ocr)

* idcard:身份证
* bankcard:银行卡
* general:通用文字识别(含位置信息版)
* general_basic:通用文字识别
* webimage:网络图片文字识别
* general_enhanced:通用文字识别
* driving_license:驾驶证识别
* vehicle_license:行驶证识别
* license_plate:车牌识别
* accurate:通用文字识别(含位置高精度版)
* accurate_basic:通用文字识别(高精度版)
* receipt:通用票据识别
* business_license:营业执照识别

3.人体识别(body)

* analysis:人体关键点识别
* attr:人体属性识别
* num:人流量统计

4.图片搜索(imageSearch)

* realtime_search/same_hq/add:相同图检索—入库
* realtime_search/same_hq/search:相同图检索—检索
* realtime_search/same_hq/delete:相同图检索—删除
* realtime_search/same_hq/update:相同图检索—更新
* v1/realtime_search/similar/add:相似图检索—入库
* v1/realtime_search/similar/search:相似图检索—检索
* v1/realtime_search/similar/delete:相似图检索—删除
* v1/realtime_search/similar/update:相似图检索—更新
* v1/realtime_search/product/add:商品—入库
* v1/realtime_search/product/search:商品—检索
* v1/realtime_search/product/delete:商品—删除
* v1/realtime_search/product/update:商品—更新

腾讯优图

代码示例:

  1. 人脸检测(where()方法可以传入url或者image)

    1
    Entry::Youtu($config)->face->select('detectface')->where(['image' => __DIR__ . '/../../file/face_01.jpg', 'mode' => 1])->get();
  2. 通用文字检测(where()方法可以传入url或者image)

    1
    Entry::Youtu($this->config)->ocr->select('generalocr')->where(['url' => 'http://open.youtu.qq.com/app/img/experience/char_general/ocr_common07.jpg'])->get();
  3. 图像处理(默认调用人脸融合API)

    1
    2
    3
    4
    $opData = [['cmd' => 'doFaceMerge', 'params' => ['model_id' => 'cf_wzry_zhugeImage']]];
    //$request = ['img_data' => __DIR__ . '/../../file/face_01.jpg', 'rsp_img_type' => "url", 'opdata' => $opdata];
    $params = ['img_data' => 'http://open.youtu.qq.com/app/img/experience/face_img/face_04.jpg', 'rsp_img_type' => "url", 'opdata' => $opData];
    $result = Entry::Youtu($config)->imageProcess->select()->where($params)->get();//人脸融合

官方文档:

腾讯AI开放平台

方法:

1.人脸识别(face

* detectface:人脸检测
* faceshape:五官定位
* identify:人脸识别

2.文字识别(ocr)

* generalocr:通用
* idcardocr:身份证
* bcocr:名片
* bizlicenseocr:营业执照
* creditcardocr:银行卡
* plateocr:车牌识别
* driverlicenseocr:驾驶证(1)行驶证(0)识别

3.图像处理(imageProcess)

* pitu_open_access_for_youtu.fcg:人脸融合,默认参数,可以不填

FACE++

代码示例:

  1. 人脸识别(where()方法可以传入image_url,image_file,image_base64):

    1
    Entry::FacePlus($this->config)->face->select('detect')->where(['image_file' => __DIR__ . '/../../file/face_01.jpg', 'return_attributes' => 'skinstatus'])->get();
  2. 手势识别(where()方法可以传入image_url,image_file,image_base64):

    1
    Entry::FacePlus($config)->body->select('gesture')->where(['image_url' => 'http://open.youtu.qq.com/app/img/experience/face_img/face_06.jpg', 'return_attributes' => 'skinstatus'])->get();
  3. 驾驶证识别(where()方法可以传入image_url,image_file,image_base64):

    1
    Entry::FacePlus($this->config)->ocr->select('ocrdriverlicense')->where(['image_url' => 'http://open.youtu.qq.com/app/img/experience/char_general/ocr_jsz_01.jpg'])->get();
  4. 识别图片场景和图片主体(where()方法可以传入image_url,image_file,image_base64):

    1
    Entry::FacePlus($this->config)->image->select('detectsceneandobject')->where(['image_base64' => base64_encode(file_get_contents(__DIR__ . '/../../file/cup.jpg'))])->get();

官方文档:

FACE++AI开放平台

方法:

1.人脸识别(face

* detect:人脸检测和人脸分析
* compare:两个人脸进行比对
* search:在一个已有的 FaceSet 中找出与目标人脸最相似的一张或多张人脸
* create:创建一个人脸的集合 FaceSet
* addface:为一个已经创建的 FaceSet 添加人脸标识 face_token
* removeface:移除一个FaceSet中的某些或者全部face_token
* update:更新一个人脸集合的属性
* getdetail:获取一个 FaceSet 的所有信息
* delete:删除一个人脸集合
* getfacesets:获取某一 API Key 下的 FaceSet 列表及其 faceset_token、outer_id、display_name 和 tags 等信息

2.人体识别(body

* detect:人体检测和人体属性分析
* segment:识别传入图片中人体的完整轮廓,进行人形抠像
* gesture:手势识别

3.证件识别(ocr)

* ocridcard:身份证
* ocrdriverlicense:驾驶证
* ocrvehiclelicense:行驶证
* ocrbankcard:银行卡

4.图像识别(image)

* detectsceneandobject:图片分析,识别图片场景和图片主体
* recognizetext:图片分析,找出图片中出现的文字信息
* general:通用文字识别(含位置信息版)
* mergeface:人脸融合

JUST DO IT

随感:如果你有些想法,有没有去做比最后的结果更重要,也就是去实践这种想法比成功与否更重要,那这种想法就是值得去做的,你是幸福的。

这也让我想起了我大学时候的一个想法,让我一个行政管理的学生花费了2年多的时间,现在只剩下一个网址和截图了:http://app.weibo.com/detail/5a5etW?ref=appsearch

爱情信鸽

虽然没有成功,但是让我踏上了程序员之路,心里只有暗自庆幸。

从设计模式到代码架构

设计模式,这是我听过最糟糕的翻译,这个名字对于程序员来说有点高高在上,难以理解,尤其是php,python,nodejs这些脚本语言的开发人员可能因为这个名字就忽视了设计模式的重要性。当然,除了名字以外,从更深层次,更具体来说,我觉得有三个原因:

  1. 不用设计模式也可以完成工作,很多时候反而更简单快速;
  2. 软件的世界快速迭代,很多设计模式有些过时了;
  3. 如果没有理解透彻一些设计模式,可能还存在过度设计的问题,拿着把锤子,看到哪里都是钉子。

但是用所谓‘简单’的方法去写的代码,业务一复杂之后,你就会发现改动之痛苦,改一个功能要看完所有流程,最后不得不重构,相信很多人都会有这个经历,这些就是设计模式解决的问题,但是精通了设计模式并不能解决所有问题,常常也要重构,设计模式绝对不是银弹。

设计模式的本质是什么

设计模式其实就是架构,实现一个模块或者功能有几种方法,前面的人总结了他觉得最优的方法,然后抽象出来成为一种模式,这就是设计模式。本质上这和架构没有什么区别。

设计模式和架构的区别

那架构和设计模式有没有什么区别呢,其实是有区别的,某种程度上可以这样理解:架构是从整个系统,更宏观的层面来总结的,而现在大家理解的设计模式,更多是从代码层面出发,或者框架的层面来总结的。但是这种区别并不是软件架构大师们主观的结果,这两个概念最开始是一个东西,但是随着软件复杂度的不断增加,演化成了两个概念。

更好的理解设计模式

我觉得对于设计模式的理解是把设计模式归并到架构的一部分,是架构的子集,重命名为代码架构,这样好理解很多。

MVC从多层模型开始

如果你的控制层比模型层更大,产品同学找你改个功能很费劲,一改就来bug的时候,你可以考虑用多层模型解耦你的业务。

MVC功能定位

  1. 模型(Model)应当负责管理几乎所有涉及数据的事情,包含数据、业务逻辑,以及数据校验规则。
  2. 控制器(Controller)用来解释请求数据,使用相应的模型,并渲染相应的响应或视图,可以被看作是模型和视图之间的中间人处理动作和请求。
  3. Views包含用户界面元素,如文本、图片和表单,当然,现在流行前后端分离的架构中,这一层可能从后端同学那里剥离出去了。

数据和业务逻辑放在模型层,控制器只是个中间人的角色,这样就保持了瘦控制器和胖模型。但是实际开发中,很多同学会将数据的校验和业务逻辑放在控制器层,变成了胖控制器,瘦模型,控制层的代码没有复用性可言,产品需求一改,重构又要开始了。所以如果仅仅把模型当作数据库表的映射,一张数据库表对应一个模型是远远不够的。

分层次设计模型

  1. 多层模型的本质原因是由于数据库和业务逻辑之间的差异性,比如关系型数据库中的数据都是存在表中,以一行行数据的形式进行存取的,而程序运行却是一个个对象,实现数据的过滤,数据的处理等业务逻辑,一个对象的数据一般都对应了多张表。如果把业务处理逻辑和数据存取逻辑完全混杂在一块,甚至比把业务逻辑放在控制器里更难维护。
  2. 模型的层级:
    • 一层应该是每个模型映射一张数据表,比如一篇文章对应一个文章表,文章分类对应一个分类表,这里就是两个模型,想必大多数同学都是这样设计模型的,这里就不多说了,我这里把这个成为A层模型。
    • 一些可以复用的业务逻辑块可以封装成模型,供控制器或者模型调用,比如页面的搜索功能,可以继承最相关的A层模型,然后独立成模型,供不同页面都要这个查询功能的控制器调用。
    • 每个表单或者API需要独立的模型,这里面包含了这个表单或者API的数据校验和不可复用的业务逻辑,这个比较关键,也是本文的重点。比如注册表单或者API,需要独立的注册模型,这里面就包含了账号,验证码各种的校验,校验通过之后注册的逻辑,注册之后用户表需要添加一条数据,用户详情表也需要添加一条数据,这就对应了2个A模型,这些都只是注册特有的逻辑,独立出来做成单独的模型,这样业务修改需求主要修改这里,简单清晰。

后话

随着业务的发展,仅仅MVC这样的分层划分已经不能满足需求了,但更强大的架构本质都是抽象出更多的层级,毕竟计算机中的所有问题,都可以通过向上抽象封装一层来解决,这超过本文的讨论范围。