开发者社区 > 博文 > 工程算法一体化平台架构实践
分享
  • 打开微信扫码分享

  • 点击前往QQ分享

  • 点击前往微博分享

  • 点击复制链接

工程算法一体化平台架构实践

  • 京东技术
  • 2019-03-08
  • IP归属:北京
  • 71200浏览

    自2017年下半年,参与一些视觉算法应用尝试和落地的项目,到目前为止已经陆续有一些落地项目及应用,包括AI抠图软件么么照、服装搭配算法、AI互动营销三个方向。AI抠图软件么么照是一款高精度全自动抠图P图类工具,么么照以人像抠图为核心,可实时更换背景/贴纸,并支持全身效果合成,由来自京东硅谷研发中心的团队提供了领先的AI及AR技术,可创造出内容更加丰富的创意表达,极低的学习门槛可轻松上手进行创作。服装搭配算法目前已经在线下智能硬件Mirror+产品上落地,并与商城中台合作,会在商品详情页落地,实现以搭代购,提升购买的连带率。而AI互动营销方面,则通过抠图、换脸、人脸性别年龄等AI技术实现一些好玩的玩法提供给商城业务端进行一些营销活动玩法,另外也实现了自动化证件照、美颜滤镜等一些视觉算法并应用到商城业务中。

    在落地过程中,也总结了一些经验和最佳实践,将通过本文详细介绍。整个架构采用了一体化架构,所谓一体化是指整个算法、工程涉及的包括数据、系统等全链路打通,实现数据流的系统化流动,这种方式的好处是形成了业务闭环,在需求、开发、测试和验证整个过程都是透明化,从而减少沟通误差,形成一套统一的语言,而此套语言中最重要的就是算法数据集,它会影响到整个项目的成败。

    工程&算法一体化平台

    整个工程&算法一体化平台架构如图1所示,包括数据集&amp标注平台、算法模型训练&部署平台、模型测试&质量评估平台、算法服务网关、服装搭配平台,通过将这些平台全链路打通,形成一体化架构,让数据透明、让过程透明,形成统一语言,提升效率和质量。

    图1 工程&算法一体化平台

    数据集&标注平台

    在数据集方面,将整个数据集会分为:训练数据集、测试数据集和验证数据集,训练数据集会通过如开源数据集、爬虫、自有数据集、定制生产、第三方等多渠道采集数据集,数据集的质量、维度和精细化程度决定了最终模型训练后的效果。验证数据集是用于产品经理、工程研发和算法研发之间需求验证的数据集,是大家的沟通语言,如果此数据集没有构建好的话,最终会出现结果不符合产品预期的情况,因此建立该套数据集是非常非常重要的。另外如果有必要可以建立一套测试数据集,该套数据集会持续完善,并通过从现有数据进行抽样形成一套验证样本集,用来验证当前算法在大样本情况下的结果,因为验证数据集会小一些,所以存在很多场景是覆盖不到的,需要抽取测试数据集进行抽样检查。

    有了训练数据集后需要通过标注平台进行人工打标,即告诉机器什么是什么,和小孩一样,机器要能识别某个事物,就需要不断有人教给它这个事物有什么特征。标注有很多种,如分类标注、标框标注、区域标注、描点标注等。比如分类标注,哪些是狗哪些是猫,通过大量的猫狗图片进行分类标注,从而可以告诉机器这类的图片是猫,这类的是狗。数据标注是个非常枯燥而又考验人耐力的工作,并且相比较AI所代表的高科技,标注看起来毫无技术含量,但数据标注是一个非常精细的活,如果标注的训练数据集质量不好或者错误就会导致算法模型最终结果是有问题的。在标注之前一定要非常明确好标注规则,如果规则不明确或者模糊,会导致整个标注质量无法使用,而且应该引入专家复核,即标注完成后一定要有质检进行打标复核。另外标注任务的分配要随机,因为提交的一批数据可能是连续的,导致标注人员快速完成但质量下降。而且有些标注任务应该一页一条,通过快捷键保持并跳到下一个,让标注人员更聚焦。

    打标平台架构上一定要灵活,设计如图2所示,架构上一定要灵活,因为不同的场景其标注需求是不一样的,比如数据存储方面可以考虑像mongodb数据库,是模式自由的,数据存储结构非常灵活;在打标界面方面可以通过插件化模式进行设计,从而针对不同的标注需求和数据使用不同的打标界面进行数据打标。

    图2 标注完成后,算法人员可以从标注平台导出相关数据集进行算法模型训练。

    算法模型训练&部署平台

    在算法模型训练和部署上,需要考虑是GPU还是CPU计算,一些通过openCV开发的算法直接通过CPU环境即可,还有一些是通过Caffe或TensorFlow需要使用GPU环境。如果涉及到多团队合作,建立统一开发框架和训练部署模式是非常重要的,大家在沟通和语言上是在一个频道,排除了沟通屏障,整体的生产效率会提升。所有的训练部署环境应该通过容器化技术进行管理。京东内部有一套自己的机器学习平台,该平台目前打通了京东的J-ONE(编译、上线发布、部署一体化的工具平台),可以通过J-ONE部署CPU或GPU应用,从而简化整个部署过程。对于机器学习平台可以参考【机器学习平台】章节。很多算法人员是不会工程的,需要将代码提交给工程人员进行发布部署,但这种方式在整个开发链条中是不太合理的,对于工程人员其实需要的是算法服务而不是算法代码,所以团队在构建时一定要考虑到该问题,并有简单和有效的解决方案。算法部署尽量是原子化服务,这样可以在业务层进行组装复用。对于手机端上的算法模型移植需要权衡好性能、质量和发热三者的权重。

    模型测试&质量评估平台

    算法模型产出后会提交到测试人员进行测试或回归测试,测试人员会建立一个模型测试平台,对提交的模型进行测试,每次测试会留存之前的测试结果该测试平台的测试数据集一方面是验证数据集,并随着算法的实际应用会采样实际数据中的一些数据集进行测试校验,并通过可视化的方式产出测试报告,测试报告中的效果评测部分需要人工进行打分和评估,所以会在测试结果进行质量评估,该数据会提交到质量评估平台,根据具体需求会提交到产品经理、产品运营或者用户那进行质量评估,从而验证模型产出的结果是否符合用户需求。该结果会反向再给到算法人员进行训练。

    通过这种如上方式实现了训练数据标注、模型训练、模型验证、模型测试、质量评估全链路的打通。在做抠图、换脸和服装搭配算法时整个过程通过该方式,从标注的质量到最终结果评估都有严格的链路控制,从而保证最终产出的效果。

    算法服务网关

    图3 算法服务网关

    算法服务网关如图3,目的是将各种算法API进行封装,提供原子服务和组合服务。业务端需要调用各种算法如抠图,美颜,换脸,换翅膀时,网关对各个业务提供统一算法API,避免各个服务重复调用。算法网关对算法进行统一监控,通过UMP监控服务器性能,接口可用性进行告警。算法网关对数据进行统一收集,便于数据管理,进行数据挖掘。

    在算法预处理和后处理上,进行一些如图片旋转处理,因为有些相机拍出来的会自动旋转90度,需要旋转过来,否则算法会处理失败。另外还网关上进行图片压缩及裁剪处理,从而提升整体的性能。在整个业务服务交互过程中,也会进行鉴权、路由、限流、降低等处理,保证服务的可用性。

    在组合服务上,如人脸检测服务是由各种检测服务组合在一起,包括如睁眼检测、张嘴检测等,如提供给小程序用的服务端抠图服务,有些需求需要加美颜和滤镜,那么会组合人脸检测、美颜、滤镜、抠图等多个服务并对外暴露,这样的好处是算法只需要去维护原子服务,而网关层面可以进行一些业务层面的组合处理。

    在数据管理上,所有原始图片数据和处理完成图片数据会沉淀到Hbase数据存储平台,且根据数据安全级别进行加密存储保证数据的安全性,对于一些公开数据可以直接抽样同步到质量评估平台进行质量评估,再反向同步到算法人员进行模型增强。

    在开发部署上,我们的算法服务分为GPU和CPU两种类型,对于GPU则使用k8s+docker容器化技术进行部署,机器学习框架使用TensorFlow,并通过http/grpc协议对外暴露服务。对于CPU应用,主要使用openCV,环境使用docker容器化技术统一镜像,否则在环境搭建上会耗费极大精力,一种部署模式是Python+openCV模式,通过Python封装对外的http服务,另一种模式是Java+openCV,通过Java JNI调用openCV服务。因为最早想CPU算法部署依赖算法部门代码,每次手动部署,费时费力,目前改造为通过自动部署系统编译打包和部署,整个过程可追溯可回滚,且实现了混合部署,即同一个实例既部署C++算法,还部署Java项目,Java项目作为主服务,C++算法作为子项目。Java通过JIN依赖调用C++算法。算法服务平台之服装搭配平台

    图4 服装搭配平台

    服装搭配平台目的是根据某一件服装自动生成与其匹配的服务搭配,在初期版本实现T+1生成搭配即可,当前开发中的知识图谱架构版本可实时搭配生成。整个平台如图4包括标注平台、服务爬虫系统、搭配专家库、数据异构系统、搭配算法和搭配服务网关。

    在做搭配的第一步是收集服装数据集和搭配数据集,服装数据集采集有很多渠道,包括京东平台服装商品数据集、买家秀评价数据集、爬虫爬取的数据集等,通过多维度的数据丰富数据集从而提升数据集的真实性。对于搭配数据集包括如京东穿搭公式、Polyvore等数据集,通过搭配数据集清洗后生成搭配专家库,专家库中也包括搭配专家人工搭配。

    采集到服装数据和搭配数据后,接下来需要对服装数据进行打标如图5,包括相同服装标注、服装属性标注、搭配标注、质量标注等。


    图5 服装标注

    数据异构系统用于接收京东商城服装数据变更消息,然后将服装数据异构到自己的异构数据库,对于服装SKU其是由颜色*尺码的笛卡尔积组成,而搭配算法只需要颜色维度即可,因此在异构时只需要按照颜色维度进行数据存储即可,这样可以节省掉无谓的算法计算。目前的异构数据按照商{家ID,服装ID,分类(如上衣下衣),服装属性(KV),服装颜色,主图,图片List}完成。

    数据异构完成后,搭配生成系统会对商品进行池化并把变更数据推送到相应的搭配算法系统进行搭配生成,池化的目的是分类进行搭配聚合,如运动装是不适合与正装进行搭配的,所以会根据服装三级分类和服装属性进行池化,另一些店铺担忧跨店铺搭配将导致自己的用户流失,不希望自己店铺的服装与其他店铺的搭配,因此也提供了店铺内搭配。这些池化数据搭配相应的服装搭配模板(搭配的排列方式)推送到搭配算法进行搭配生成。

    搭配算法按照视觉算法和规则(标签、风格、颜色等特征)并根据服装搭配模板完成搭配的生成[{商家ID,服装ID,细节裁剪图,模板位置},{服装ID,细节裁剪图,模板位置}……],然后推送到搭配数据库。

    搭配服务网关会根据颜色SKU查询相关的搭配并提供给前台展示。

    目前这种方式只使用池模式,如果要进行全局搭配需要使用知识图谱,通过深度学习定位服饰,再进行标签、风格、颜色等特征的抽取,在这个基础上运用规则做成图谱,然后实时从图谱检索搭配。

    总结

    一体化平台架构的目的是形成业务闭环,统一数据语言,数据资产沉淀,数据全链路透明流通,数据抽样实时质量评估,提升算法质量。在整个过程中架构边界清晰,系统松耦合,通过闭环服务化内聚化降低组织间沟通成本。