英特尔 AI 医疗实战手册

AI 正在变革(中国)医疗。最近,一份实战手册刚刚披露,清晰勾勒出了 AI 如何重塑着医疗行业的各个方面。而且这份手册展示的不光有趋势分析、技术规划,还展示了诸多案例,是实践实战后的全面总结。
报告撰写者,正是提供了最基础但覆盖全流程的 AI 能力计算巨头英特尔,可以说是 AI 医疗的首份权威“剑谱”。

DeepFashion:服装公开数据集

Large-scale Fashion (DeepFashion) Database
Large-scale Fashion (DeepFashion) Database

DeepFashion 是香港中文大学开放的一个 large-scale 数据集。包含 80 万张图片,包含不同角度,不同场景,买家秀,买家秀等图片。

每张图片也有非常丰富的标注信息,包括 50 种类别,1000 种属性,Bbox,特征点。

还有约 30 万的不同姿势/不同场景的图片 pairs。

实际上 DeepFashion 是由4个子集组成的。它们分别是:

1. Category and Attribute Prediction Benchmark

这个子集是用来做分类和属性预测的。共有 50 分类标记,1000 属性标记。包含 289,222 张图像。每张图像都有 1 个类别标注,1000 个属性标注,Bbox 边框,landmarks。数据集下载后可以直接使用。

 Category and Attribute Prediction Benchmark
Category and Attribute Prediction Benchmark

2. In-shop Clothes Retrieval Benchmark

这个是卖家秀图片集,每个商品 id,有多张不同角度的卖家秀,放在同一个文件夹内。7982 件商品,共 52712 张图像,每张图片都有 463 中属性,Bbox,landmarks,以及店铺描述。数据集下载后解压需要密码,密码需要邮件联系作者获取。

In-shop Clothes Retrieval Benchmark
In-shop Clothes Retrieval Benchmark

3. Consumer-to-shop Clothes Retrieval Benchmark

这个子集是卖家秀买家秀对应的数据集,每个商品id对应的文件夹中包含一张卖家秀和几张买家秀。33 881 种商品,共 239 557 张图片。每张图片都有 Bbox,303 种属性,以及来源说明(卖家,买家)。数据集解压同样需要密码。

Consumer-to-shop Clothes Retrieval Benchmark
Consumer-to-shop Clothes Retrieval Benchmark

4. Fashion Landmark Detection Benchmark:

这个子集主要是做 landmark和 Bbox 用的,包含 123 016 张图片,每张图片都有 landmarks 和 Bbox 的标记,还有类别标注(上衣,下装,全身),以及姿态(正常姿势,大幅度姿势等)信息。数据集可直接使用。

Fashion Landmark Detection Benchmark
Fashion Landmark Detection Benchmark

微软研究院新版书籍《数据科学基础》PDF 下载

随着大数据、深度学习在学术界和工业界的普及,人们越来越认识到数据对于科研和应用的重要性。虽然现在相关的工具和框架大大降低了构建数据应用的门槛,数据科学基础对应用的构建依然起着核心的作用。本文介绍微软研究院新版书籍《数据科学基础》。

计算机科学学科从 60 年代兴起,当时人们聚焦于编程语言、编译器、操作系统和相关的数学理论。70年代左右,算法被加入作为计算机科学理论中重要的一员。随着计算机的普及,自然科学、商业等领域有着更强的发现、收集和存储数据的能力。如何理解和应用这些数据成为了现在的一个刚需。互联网和社交网络成为人们日常生活一部分的事实,反映了数据理论的机遇与挑战。

微软研究院的新版书籍《Foundations of Data Science》(《数据科学基础》)详细介绍了许多重要的数据科学理论基础。这些理论基础例如奇异值分解(SVD)、马尔科夫链、随机游走等是支撑现在广泛使用在数据应用中的算法的支柱,如推荐系统、语音识别、图神经网络等。《数据科学基础》提纲及下载链接如下:

  • 简介
  • 高维空间
  • 最佳拟合子空间和奇异值分解(SVD)
  • 随机游走和马尔科夫链
  • 机器学习
  • 面向海量数据问题的算法:流式、概述和采样
  • 聚类
  • 随机图
  • 主题模型、非负矩阵分解、隐马尔科夫模型和图模型
  • 其他主题
  • 小波

Foundations of Data Science

Gartner:2019年人工智能成熟度曲线的超前趋势

Gartner 的这种成熟度周期凸显出人工智能正以多种不同的方式影响企业

根据 Gartner 对 2019 年的 CIO 议程调查,2018 年至 2019 年间,部署人工智能 (AI) 的组织从 4% 增长到了14%。与几年前相比,人工智能正在以多种不同的方式影响组织,当时没有其他方法可以替代使用机器学习 (ML) 构建自己的解决方案。AutoML 和智能应用拥有较明显的发展势头,其他方法也同样值得关注——即人工智能平台即服务(AIPaaS)或人工智能云服务。受亚马逊 Alexa、谷歌 Assistant 等公司在全球范围内取得成功的推动,对话人工智能仍是企业规划日程中的首要内容。与此同时,诸如增强智能、边缘人工智能、数据标签和可解释的人工智能等新技术不断涌现。

今年的成熟度曲线出现了许多新技术,但被大众所知晓的有价值或目标的很少

Gartner 2019 年人工智能成熟度曲线审查了在 AI 领域的创新和趋势潮流,以及 AI 计划范围。快速跟风者,首先应该为 AI 设计一个商业案例。对于早期使用者来说,AI 的可扩展性是下一个挑战。

今年的成熟度周期包含了很多新技术,但被大众所知晓的有价值或目标的很少,而被主流应用的则少之又少。“这并不代表 AI 是不可用的。这表示它将会发生改变,为了评估 AI 的价值和风险,CIO 需要为其设定现实的预期。” Gartner 副总裁分析师 Svetlana Sicular 表示。

以下是 Sicular 重点介绍的人工智能技术,这些技术必须在 CIO 的计划上,才能在未来两到五年内对业务转型产生巨大影响。

Hype_Cycle_for_AI_2019
Hype_Cycle_for_AI_2019

增强型智能(Augmented intelligence)

增强型智能是以人为中心的 AI 与人协作提高认知能力的合作模式。它关注的是人工智能在提高人类能力方面的辅助作用。

AI 与人们互动,改善他们已经知道的事物,可以减少日常失误,并可以改善客户互动、市民服务和病人护理。增强型智能的目标是提高自动化的效率,同时辅以人性化和常识来管理决策自动化的风险。

吐槽:不再是我们日常所调戏的Siri和人工智障爱酱,开始追求更高的智慧,比如阿尔法狗这种,目前听说过的比较成功的就是游戏的黑科技外挂,星际 1、拳皇 97 的黑科技可以秒杀世界顶级选手,如果在其他领域开发出这样的增强型智能程序,是不是离 Skynet也不远了。

聊天机器人(ChatBots)

聊天机器人是 AI 的代表,影响着人们所有可交流的领域,比如汽车制造商 KIA,它每周与 11.5 万名用户对话,或者 Lidl 的 Winebot Margot,它提供购买葡萄酒的指导和食物搭配方面的建议。

聊天机器人可以基于文本或语音,也可以两者结合,并依赖于极少人为干预的脚本响应。

常见的应用程序存在于 HR、IT 帮助台和自助服务中,聊天机器人在客户服务领域已经产生极大影响,尤其是改变了客户服务的执行方式。从“用户学习界面”到“聊天机器人正在学习用户想要的东西”的转变,意味着对员工入职、工作效率和培训的更大影响。

机器学习(Machine Learning, ML)

机器学习可以解决业务问题,如个性化的客户服务、供应链推荐、动态定价、医疗诊断和反洗黑钱。ML 使用数学模型从数据中提取知识和模式。随着组织面临的数据量的指数增长和计算基础设施的改进,ML 的使用也在增加。

目前,ML 被用于多个领域和行业,以推动改进,并为业务问题找到新的解决方案。美国运通使用数据分析和 ML 算法来帮助检测几乎实时的欺诈行为,以节省数百万美元的损失。沃尔沃利用数据帮助预测零部件何时可能出现故障,何时需要维修,从而提高了其汽车的安全性。

AI 治理

组织不应该忽视 AI 治理。他们需要意识到潜在的监管和声誉风险。Sicular 说:“AI 治理是制定政策,对抗 AI 相关的偏见、歧视和 AI 其他负面影响的过程。”

确定数据源和算法的透明度要求,减少风险并增强信心

为了发展人工智能治理,数据和分析领导者和 CIO 应该关注三个领域:信任、透明度和多样性。他们需要关注对数据源和人工智能结果的信任,以确保人工智能的成功使用。他们还需要确定数据源和算法的透明度要求,以降低风险,增强对人工智能的信心。此外,应该确保数据、算法和观点的多样性,以追求人工智能的道德伦理和准确性。

智能应用

大多数组织对获取 AI 功能的偏好正在发生改变,更倾向于将其用于企业应用程序中。智能应用是具有嵌入式或集成 AI 技术的企业应用,通过智能自动化、以数据为基础的分析和指导建议来支持或替代基于人工的活动,以提高生产力和决策制定。

今天,企业应用程序供应商正在他们的产品中嵌入 AI 技术,并引入人工智能平台功能——从企业资源规划到客户关系管理,再到人力资源管理,再到劳动力生产率应用程序。

CIO 们应该向他们的外包软件供应商提出要求,需要他们在产品路线图中概述如何结合 AI,以高级分析、智能流程和高级用户体验的形式增加业务价值。

2019 年中国人工智能基础数据服务白皮书

人工智能基础数据服务:指为 AI 算法训练及优化提供的数据采集、清洗、信息抽取、标注等服务,以采集和标注为主。《2019 年中国人工智能基础数据服务白皮书》由艾瑞和百度数据众包联合发布,报告主要分析中国人工智能基础数据服务的现状以及未来发展方向,重点讨论人工智能基础数据服务的价值、发展背景、产业链、市场空间和应用场景。

在经历了一段时期的野蛮生长之后,人工智能基础数据服务行业进入成长期,行业格局逐渐清晰。人工智能基础数据服务方的上游是数据生产和外包提供者,下游是 AI 算法研发单位,人工智能基础数据服务方通过数据处理能力和项目管理能力为其提供整体的数据资源服务,不过 AI 算法研发单位和 AI 中台也可提供一些数据处理工具,产业上下游普遍存在交叉。

2018 年中国人工智能基础数据服务市场规模为 25.86 亿元,其中数据资源定制服务占比 86%,预计 2025年市场规模将突破 113 亿元。市场供给方主要由人工智能基础数据服务供应商和算法研发单位自建或直接获取外包标注团队的形式组成,其中供应商是行业主要支撑力量。

数据安全、采标能力、数据质量、管理能力、服务能力等仍是需求方的痛点,需要人工智能基础服务商有明确具体的安全管理流程、能够深入理解算法标注需求、可提供精力集中且高质量的服务、能够积极配合、快速响应需求方的要求。

随着算法需求越来越旺盛,依赖人工标注不能满足市场需求,因此增强数据处理平台持续学习能力,由机器持续学习人工标注,提升预标注和自动标注能力对人工的替代率将成趋势。远期,越来越多的长尾、小概率事件所产生的数据需求增强,机器模拟或机器生成数据会是解决这一问题的良好途径,及早研发相应技术也将成为 AI 基础数据服务商未来的护城河。

《人工智能产品经理的新起点》PPT

原作者:黄钊;PPT 目录大纲:

  1. AI PM 在做什么、如何做?
    AI 的时代背景及真正瓶颈
    如何选行业方向 in AI
    如何找场景痛点 in AI 应用层 (2B/2C)
    如何做体验设计 in 对话聊天产品
  2. 如何从互联网 PM 转型成 AI PM
    AI PM 能力模型
    AI 技术概念厘清
    如何转型
  3. 人工智能的本质及脑洞 AI 的过去和现在
    AI 的未来和突破口
    AI 的本质、效用和终局
  • 下载地址 1:https://pan.baidu.com/s/1mjM5PQo 密码: gxmw
  • 下载地址 2:https://pan.baidu.com/s/1brbHw7d 密码: 9t5a

本地下载:人工智能产品经理的新起点

MediaPipe:Google 开源多媒体机器学习框架

MediaPipe 是一款由 Google Research 开发并开源的多媒体机器学习模型应用框架。在谷歌,一系列重要产品,如 YouTubeGoogle LensARCoreGoogle Home 以及 Nest,都已深度整合了 MediaPipe。

作为一款跨平台框架,MediaPipe 不仅可以被部署在服务器端,更可以在多个移动端 (安卓和苹果 iOS)和嵌入式平台(Google Coral 和树莓派)中作为设备端机器学习推理 (On-device Machine Learning Inference)框架。

为什么需要 MediaPipe?

一款多媒体机器学习应用的成败除了依赖于模型本身的好坏,还取决于设备资源的有效调配、多个输入流之间的高效同步、跨平台部署上的便捷程度、以及应用搭建的快速与否。

基于这些需求,谷歌开发并开源了 MediaPipe 项目。除了上述的特性,MediaPipe 还支持 TensorFlow 和 TF Lite 的推理引擎(Inference Engine),任何 TensorFlow 和 TF Lite 的模型都可以在 MediaPipe 上使用。同时,在移动端和嵌入式平台,MediaPipe 也支持设备本身的 GPU 加速。

MediaPipe 演示案例

在今年六月举行的 CVPR 会议上,Google Research 开源了 MediaPipe 的预览版。为方便开发者学习和使用,我们提供了多个桌面系统和移动端的示例。作为一款应用于多媒体的框架,现已开源的安卓和苹果 iOS 示例包括:

MediaPipe 主要概念

MediaPipe 的核心框架由 C++ 实现,并提供 Java 以及 Objective C 等语言的支持。MediaPipe 的主要概念包括数据包(Packet)、数据流(Stream)、计算单元(Calculator)、图(Graph)以及子图(Subgraph)。数据包是最基础的数据单位,一个数据包代表了在某一特定时间节点的数据,例如一帧图像或一小段音频信号;数据流是由按时间顺序升序排列的多个数据包组成,一个数据流的某一特定时间戳(Timestamp)只允许至多一个数据包的存在;而数据流则是在多个计算单元构成的图中流动。MediaPipe 的图是有向的——数据包从数据源(Source Calculator或者 Graph Input Stream)流入图直至在汇聚结点(Sink Calculator 或者 Graph Output Stream) 离开。

 

MediaPipe 主要概念
MediaPipe 主要概念

MediaPipe 在开源了多个由谷歌内部团队实现的计算单元(Calculator)的同时,也向用户提供定制新计算单元的接口。创建一个新的 Calculator,需要用户实现 Open(),Process(),Close() 去分别定义 Calculator 的初始化,针对数据流的处理方法,以及 Calculator 在完成所有运算后的关闭步骤。为了方便用户在多个图中复用已有的通用组件,例如图像数据的预处理、模型的推理以及图像的渲染等, MediaPipe 引入了子图(Subgraph)的概念。因此,一个 MediaPipe 图中的节点既可以是计算单元,亦可以是子图。子图在不同图内的复用,方便了大规模模块化的应用搭建。

想了解更多 MediaPipe 的概念和使用方法,请移步我们的 GitHub 文档。同时,我们也提供了MediaPipe 移动端的使用教程及示例代码:

机器感知实例 —— 手部关键点追踪

一个使用 MediaPipe 的实例是在图片或视频中检测手部关键点。我们最近在 谷歌 AI 博客上发表了一篇相关文章: “使用 MediaPipe 实现设备端实时手部追踪”介绍了我们如何使用 MediaPipe 来搭建这个应用。

手部关键点追踪解决方案有两部分:手掌检测(Hand Detection)及手部关键点回归 (Hand Landmark Regression)。

手掌模型检测教程
手掌模型检测教程

我们训练了基于SSD 架构的 BlazePalm 模型来进行手掌检测,并对移动端进行了优化。手部检测相较人脸检测来说,是一个更加困难的问题,例如:手的大小角度会有较大范围的变动,手没有显著的纹理结构,以及存在更多遮挡的情景。因此,我们的解决方案采取了不同的思路。我们训练的模型只对手掌区域进行检测,其好处体现在以下几点:首先,手掌相对于整个手而言是一个较为受限的目标,并且由于手掌的区域较小,我们的非极大抑制(Non-Maximum Suppression)算法也会有更好的效果,例如,在两只手相握的情况下,即使手的大部分区域重叠在一起,两只手掌的区域依然可以被区分开;其次,手掌的边框可以用正方形来描述,这样可以减少 3-5 倍数量的锚定位(Anchor),从而最大化模型的容量;最后,经过实验,我们发现使用focal loss可以获得最好的检测结果。该模型在我们的测试数据集上可以达到 95.7% 的平均准确率。

MediaPipe BlazePlam 手掌检测应用

我们使用 MediaPipe 来做移动端模型推理的框架,如下图所示,input_video 为输入图像,output_video 为输出图像。为了保证整个应用的实时运算,我们使用 FlowLimiterCalculator 来筛选进行运算的输入帧数,只有当前一帧的运算完成后,才会将下一帧图像送入模型。当模型推理完成后,我们使用 MediaPipe 提供的一系列计算单元来进行输出的渲染和展示——结合使用 DetectionsToRenderDataCalculator, RectToRenderDataCalculator 及AnnotationOverlayCalculator 将检测结果渲染在输出图像上。

使用 MediaPipe 来做移动端模型推理的框架
使用 MediaPipe 来做移动端模型推理的框架

手掌检测应用的核心部分为上图中的蓝紫色模块(HandDetection子图)。如下图所示,HandDetection 子图包含了一系列图像处理的计算单元和机器学习模型推理的模块。ImageTransformationCalculator 将输入的图像调整到模型可以接受的尺寸,用以送入 TF Lite 模型的推理模块;使用 TfLiteTensorsToDetectionsCalculator,将模型输出的 Tensor 转换成检测结果;运用 NonMaxSuppressionCalculator 等计算单元做后处理;最终从HandDetection子图输出检测结果给主图。

从HandDetection子图输出检测结果
从HandDetection子图输出检测结果

GitHub地址项目 GitHub 地址

TensorFlow 2.0 实战教程

这是一份来自 IJCAI 2019上的一个 TensorFlow 2.0 实操教程,这个教程包含 117 页 PPT,由 Google 资深开发人员 Josh Gordon 讲授,提供了最新 TensorFlow 2.0 的实操介绍,重点介绍了最佳实践。读者将学习编写几种类型的神经网络(Dense, Convolutional, 和 Recurrent),以及生成对抗网络(Generative Adversarial Network)。

Hands on TensorFlow 2.0
Hands on TensorFlow 2.0

TensorFlow 是一个基于数据流编程(Dataflow Programming)的符号数学系统,被广泛应用于各类机器学习(Machine Learning)算法的编程实现,其前身是谷歌的神经网络算法库 DistBelief。

Tensorflow 拥有多层级结构,可部署于各类服务器、PC 终端和网页并支持 GPU 和 TPU 高性能数值计算,被广泛应用于谷歌内部的产品开发和各领域的科学研究。

如果你想学习新发布的 TensorFlow 2.0 版本,那么本教程非常适合您。不过您需要事先熟悉一些基本的机器学习知识。该教程将介绍深度学习中的关键概念。本教程的目标是帮助您高效地开始使用 TensorFlow,这样您就可以继续自学了。

《Hands on TensorFlow 2.0》教程下载

《动手学深度学习》PyTorch 版

我们知道,作为 MXNet 的作者之一,李沐的这本《动手学深度学习》也是使用 MXNet 框架写成的。但是很多入坑机器学习的萌新们,使用的却是 PyTorch。如果有教材对应的 PyTorch 实现代码就更好了!今天就给大家带来这本书的 PyTorch 实现源码。最近,来自印度理工学院的数据科学小组,把《动手学深度学习》从 MXNet 『翻译』成了 PyTorch,经过 3 个月的努力,这个项目已经基本完成,并登上了 GitHub 热榜。

d2l-pytorch
d2l-pytorch

其中,每一小节都是可以运行的 Jupyter 记事本,你可以自由修改代码和超参数来获取及时反馈,从而积累深度学习的实战经验。

GitHub地址项目 GitHub 地址

谷歌发布用于保护数据隐私的开发工具

无论你是城市规划师还是小型企业 CEO 或者是一名软件开发者,利用好数据可以让你更好地为客户提供服务,但是如果没有强有力的隐私保护,你也可能因此失去用户的信任。差分隐私是数据分析的一种手段,旨在提供一种当从统计数据库查询时,最大化数据查询的准确性,同时最大限度减少识别其记录的机会。例如,如果您是一名健康研究人员,您可能想要比较不同医院的患者住院的平均时间,以确定在护理方面是否存在差异。差别隐私是一种高度可靠的分析方法,可以在确保个人隐私的前提下做数据分析。

近日,谷歌开源了其差异隐私平台,该技术已经用于谷歌内部的一些核心应用,谷歌表示开源该技术是为了满足开发人员的需求而设计的。除了可以自由访问,它还希望它易于部署和使用。

以下是该库的一些功能特性:

  • 统计功能:这个版本支持大多数常见的数据科学操作。开发人员可以使用该库计算计数、和、平均值、中位数和百分位数等运算。
  • 严格的测试:正确区分隐私是一项挑战。除了一个广泛的测试组件,它还包括一个可扩展的“随机差异隐私模型检查器库”,以此避免发生错误。
  • 快速入门:开源发行版的真正用途在于回答“我可以使用这个吗?”这也是为什么谷歌加入了一个 PostgreSQL 扩展和一些常用操作指南的原因。此外,谷歌特地在一篇技术论文中描述了该库使用方法的细节
  • 模块化:谷歌设计的这个开源库可以扩展到其他功能,比如附加机制、聚合功能或隐私预算管理。

自从我们在 2014 年发布 RAPPOR 以帮助改进 Chrome 以来,谷歌一直致力于研究和开发实用的差异私有技术,例如出行软件 Project Fi 中可以了解一天中的业务繁忙程度、特定餐厅的菜肴在 Google 地图中的受欢迎程度等。今年,宣布了几项开源隐私技术 —— Tensorflow Privacy,Tensorflow Federated,,Private Join and Compute,涵盖的领域从医学到政府再到商业等。

GitHub地址项目 GitHub 地址

滴滴开源的 AoE:工程实践中的图像处理

近期,滴滴开源了 AOE 项目,很多人还是一脸懵逼,不太清楚 AOE 到底是干什么的,所以今天我们再来听听官方工程师是怎么介绍的吧,不信你还是听不懂:近期我们开发了一个银行卡 OCR 项目。需求是用手机对着银行卡拍摄以后,通过推理,可以识别出卡片上的卡号。

工程开发过程中,我们发现手机拍摄以后的图像,并不能满足模型的输入要求。以 Android 为例,从摄像头获取到的预览图像是带 90 度旋转的 NV21 格式的图片,而我们的模型要求的输入,只需要卡片区域这一块的图像,并且需要转成固定尺寸的 BGR 格式。所以在图像输入到模型之前,我们需要对采集到的图像做图像处理,如下图所示:

OCR 案例
OCR 案例

在开发的过程中,我们对 YUV 图像格式和 libyuv 进行了研究,也积累了一些经验。下文我们结合银行卡 OCR 项目,讲一讲里面涉及到的一些基础知识:

  1. 什么是YUV格式
  2. 如何对YUV图像进行裁剪
  3. 如何对YUV图像进行旋转
  4. 图像处理中的Stride
  5. 如何进行缩放和格式转换
  6. libyuv的使用

想要对采集到的 YUV 格式的图像进行处理,首先我们需要了解什么是 YUV 格式。

什么是 YUV 格式

YUV 是一种颜色编码方法,YUV,分为三个分量:

  • 『Y』 表示明亮度(Luminance 或 Luma),也就是灰度值;
  • 『U』和『V』 表示的则是色度(Chrominance 或 Chroma)。
  • 主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0。

这部分专业的知识,网络上有详细的解释。我们简单理解一下,RGB 和 YUV 都使用三个值来描述一个像素点,只是这三个值的意义不同。通过固定的公式,我们可以对 RGB 和 YUV 进行相互转换。工程里常见的 I420,NV21,NV12,都是属于 YUV420,每四个 Y 共用一组 UV 分量。YUV420 主要包含两种格式,YUV420SP 和 YUV420P。

  • YUV420SP,先排列Y分量,UV分量交替排列,例如:NV12: YYYYYYYY UVUV 和 NV21: YYYYYYYY VUVU (上文中我们在安卓上采集到的图像就是这种格式)。

    YUV420SP
    YUV420SP
  • YUV420P,先排列U(或者V)分量,再排列V(或者U)分量。例如:I420: YYYYYYYY UU VV 和 YV12: YYYYYYYY VV UU。

    YUV420P
    YUV420P

了解了 YUV 的图像格式以后,我们就可以尝试对图片进行裁剪和旋转了。我们的想法是先在图片上裁剪出银行卡的区域,再进行一次旋转。

对图片进行裁剪和旋转
对图片进行裁剪和旋转

如何对 YUV 图像进行裁剪

YUV420SP 和 YUV420P 裁剪的过程类似,以 YUV420SP 为例,我们要裁剪图中的这块区域:

YUV420SP
YUV420SP

在图上看起来就非常明显了,只要找到裁剪区域对应的 Y 分量和 UV 分量,按行拷贝到目标空间里就可以了。

我们再来看一张图,是否可以用上面的方法来裁剪图中的这块区域呢?

答案是否定的,如果你按照上面说的方法来操作,最后你会发现你保存出来的图,颜色基本是不对的,甚至会有内存错误。原因很简单,仔细观察一下,当 ClipLeft 或者 ClipTop 是奇数的时候,会导致拷贝的时候 UV 分量错乱。如果把错误的图像数据输入到模型里面,肯定是得不到我们期望的结果的。所以我们在做裁剪的时候,需要规避掉奇数的场景,否则你会遇到意想不到的结果。

如何对 YUV 图像进行旋转?

对上文裁剪后的图像做顺时针 90 度旋转,相比裁剪,转换要稍微复杂一些。

基本方法是一样的,拷贝对应的 Y 分量和 UV 分量到目标空间里。

在了解了裁剪和旋转的方法以后,我们发现在学习的过程中不可避免地遇到了 Stride 这个词。那它在图像中的作用是什么呢?

图像处理中的 Stride

Stride 是非常重要的一个概念,Stride 指在内存中每行像素所占的空间,它是一个大于等于图像宽度的内存对齐的长度。如下图所示:

Stride 是非常重要的一个概念
Stride 是非常重要的一个概念

回过头来看我们上面说到的裁剪和旋转,是否有什么问题?以 Android 上的 YV12 为例,Google Doc 里是这样描述的:

YV12 is a 4:2:0 YCrCb planar format comprised of a WxH Y plane followed by (W/2) x (H/2) Cr and Cb planes.

This format assumes
• an even width
• an even height
• a horizontal stride multiple of 16 pixels
• a vertical stride equal to the height

y_size = stride * height
c_stride = ALIGN(stride / 2, 16)
c_size = c_stride * height / 2
size = y_size + c_size * 2
cr_offset = y_size
cb_offize = y_size + c_size

所以在不同的平台和设备上,需要按照文档和 stride 来进行计算。例如计算 Buffer 的大小,很多文章都是简单的 “*3/2” ,仔细考虑一下,这其实是有问题的。如果不考虑 stride ,会有带来什么后果?如果 “运气” 足够好,一切看起来很正常。“运气”不够好,你会发现很多奇怪的问题,例如花屏,绿条纹,内存错误等等。这和我们平常工作中遇到的很多的奇怪问题一样,实际上背后都是有深层次的原因的。

经过裁剪和旋转,我们只需要把图像缩放成模型需要的尺寸,转成模型需要的 BGR 格式就可以了。

如何进行缩放和格式转换

以缩放为例,有临近插值,线性插值,立方插值,兰索斯插值等算法。YUV 和 RGB 之间的转换,转换的公式也有很多种,例如量化和非量化。这些涉及到专业的知识,需要大量的时间去学习和理解。

这么多的转换,我们是否都要自己去实现?

很多优秀的开源项目已经提供了完善的 API 给我们调用,例如 OpenCV,libyuv 等。我们需要做的是理解基本的原理,站在别人的肩膀上,做到心里有数,这样即使遇到问题,也能很快地定位解决。

经过调查和比较,我们选择了 libyuv 来做图像处理的库。libyuv 是 Google 开源的实现各种 YUV 与 RGB 之间相互转换、旋转、缩放的库。它是跨平台的,可在 Windows、Linux、Mac、Android 等操作系统,x86、x64、arm 架构上进行编译运行,支持 SSE、AVX、NEON等SIMD 指令加速。

libyuv 的使用

引入 libyuv 以后,我们只需要调用 libyuv 提供的相关 API 就可以了。在银行卡 OCR 工程使用的过程中,我们主要遇到了 2 个问题:

  1. 在Android开发的初期,我们发现识别率和我们的期望存在一定的差距。我们怀疑是模型的输入数据有问题,通过排查发现是使用libyuv的时候,没注意到它是little endian。例如这个方法:int BGRAToARGB(…),BGRA little endian,在内存里顺序实际是ARGB。所以在使用的时候需要弄清楚你的数据在内存里是什么顺序的,修改这个问题后识别率达到了我们的预期。
  2. 在大部分机型上运行正常,但在部分机型上出现了 Native 层的内存异常。

通过多次定位,最后发现是 stride 和 buffersize 的计算错误引起的。由于 libyuv 是 C/C++ 实现的,使用的时候不是那么的便捷。为了提高开发效率,我们提取了一个 AoeVision 组件,对libyuv封装了一层 JNI 接口,包括了一些基础的转换和一些 Sample,这样使用起来更加简单方便,AoeVision组件还在不断开发和完善中。

GitHub地址项目 GitHub 地址

计算机科学 (CS) 顶会历届最佳论文列表

历届最佳论文大列表,从 1996 年至 2018 年都包含了。机器学习、深度学习前沿 Paper 都能找得到!这些『顶会』包括:

AAAI, ACL, CHI, CIKM, CVPR, FOCS, FSE, ICCV, ICML, ICSE, IJCAI, INFOCOM, KDD, MOBICOM, NSDI, OSDI, PLDI, PODS, S&P, SIGCOMM, SIGIR, SIGMETRICS, SIGMOD, SODA, SOSP, STOC, UIST, VLDB, WWW

这个网页上,按照不同顶会,列举了各个年份的最佳 CS 论文,论文源地址和作者信息都有了!几个 AI 领域的代表性顶会最佳论文资源包括:

  •  AAAI (Artificial Intelligence)
  •  ACL (Natural Language Processing)
  • CVPR (Computer Vision)
  • ICCV (Computer Vision)
  • ICML (Machine Learning)
  • IJCAI (Artificial Intelligence)

以上是人工智能领域具有代表性的几个顶会,相应的最佳论文都按照不同年份列举出来了,非常便于查找和定位。除此之外,还包括其他 CS 顶会的最佳论文。

Google 发布姿势估测应用

Google 日前发布一款 TensorFlow Lite 示例应用,该应用使用 PoseNet 模型在 Android 中实现人体姿势估测。PoseNet 是一种视觉模块,通过检测人体关键部位的位置,来估测图像或视频中的人体姿势。例如,该模型可以估测图像中人物手肘和膝盖的所在位置。姿势估测模型只会识别人体关键部位的位置,而不会去辨别图像中的人物。TensorFlow Lite 现与您分享这款 Android 示例应用,该应用可利用设备的相机实时检测和显示个人的关键身体部位。

使用 PoseNet 模型在 Android 中实现人体姿势估测
使用 PoseNet 模型在 Android 中实现人体姿势估测

PoseNet 应用前景

姿势估测存在多种用途。例如,开发者可根据人体图像增强现实、制作计算机图形人物动画以及为运动中的运动员分析步态。在 Google I/O 2019 大会上,TensorFlow Lite 展示了使用 PoseNet 模块帮助用户学习舞蹈的应用 Dance Like。借助这款示例应用,应用开发者和机器学习专家能够更轻松地探索轻量级移动模型的各种可能性。

PoseNet 示例应用

不同于用 Java 编写的现有 Andriod 应用,PoseNet 示例应用的开发采用 Kotlin 语言。开发此应用旨在让所有人都能以低成本轻松使用 PoseNet 模型。示例应用包含可消除模型复杂性的 PoseNet 库。下图展示应用、PoseNet 库 和 TensorFlow Lite 库之间的工作流。

PoseNet 应用工作流
PoseNet 应用工作流

PoseNet 库

PoseNet 库提供了一个接口,通过该接口接收经处理的相机图像,并返回人体关键部位所在位置的相关信息。此功能由 estimateSinglePose() 函数提供,该函数会在经处理的 RGB 位图上运行 TensorFlow Lite 解释器并返回 Person 对象。了解 PoseNet 输入和输出的含义

PoseNet 示例应用

PoseNet 示例应用是一种设备端相机应用,该应用可通过相机捕获帧,并实时覆盖图像上的关键点。针对每张传入的相机图像,该应用均会执行以下步骤:

  1. 从相机预览中捕获图像数据,并将其格式从 YUV_420_888 转换为 ARGB_888。
  2. 创建 Bitmap 对象,以保存 RGB 格式帧数据的像素。将 Bitmap 裁剪并缩放至可输入模块的尺寸,从而将其传入模块。
  3. 调用 PoseNet 库的 estimateSinglePose () 函数,以获取 Person 对象。
  4. 将 Bitmap 重新缩放至屏幕尺寸。在 Canvas 对象上绘制新 Bitmap。
  5. 使用通过 Person 对象获取的关键点位置,在画布上绘制骨架。显示可信度高于特定阈值(默认为 0.2)的关键点。

为使姿势渲染与相机帧同步,我们对输出显示使用单个 SurfaceView,而非分别对姿势与相机使用 View 实例。SurfaceView 会在 View 画布上进行捕获、锁定和绘制,从而确保在屏幕上实时显示画面。

发展蓝图

我们希望未来能为此示例应用开发更多功能,其中包括:

  • 多姿势估测
  • 使用 GPU 代理实现 GPU 加速
  • 使用 NNAPI 代理实现 NNAPI 加速
  • 使用模型的训练后量化降低延迟
  • 更多模型选项,例如 ResNet PoseNet 模型

GitHub地址项目 GitHub 地址

数据科学家常用自然语言处理Python库

此前,跨象乘云™ 发布过系列文章 ——

互联网上大约有 70% 以上的数据不是结构化格式的。非结构化数据包括传感器数据、图像、视频文件、音频文件、网站和 API 的数据、社交媒体数据、电子邮件以及更多与文本相关的信息。由于其特殊的特性,我们无法以一种简单的方式处理数据,为了解决这一问题,在大数据和数据科学环境下,出现了许多技术和工具来解决这一问题。

自然语言处理,是人工智能领域的前沿技术之一。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。NLP 的最终目标是以一种有价值的方式阅读、破译、理解和理解人类语言。大多数 NLP 技术依靠机器学习从人类语言中获得意义。基于 NLP 最著名的应用是:

  • Google Speech Recognition.
  • Apple’s Siri.
  • Microsoft’s Cortona.
  • Amazon’s Alexa.
  • Ok Google in Android Mobiles.
  • Interactive voice responses used in call centers.
  • Grammarly

1. spaCy

非常优化的 NLP 库,可以与 TensorFlowPyTorch 等深度学习框架一起使用。它是一个高级的 NLP 库,可在 Python 和 Cython 中的使用,它帮助我们可以进行快速的开发,spaCy 提供了预先训练的统计模型和单词向量,目前支持 50 多种语言的标记化。它具有最先进的速度,卷积神经网络模型的标签,解析和命名实体识别和易于深入学习集成。

# Importing the Library
import spacy

NLPLagnguageType = spacy.load('en')
text = NLPLanguageType('Earth Revolves around the sun.')
# Iterating over the text
for token in text:
print(token.text,token_pos_)

在上面的例子中,我们实现了一个简单的 NLP 例子,他将输出文本,并加上每个单词的词性:

> > > 地球名词

> > > 是动词

这样的例子不胜枚举。它将生成给定文本中每个单词的词性。

2. Gensim

Gensim 是一个用于从文档中自动提取语义主题的 Python 库,目标受众是自然语言处理 (NLP) 和信息检索 (IR) 社区。具有以下特性:

  • 内存独立:对于训练语料来说,没必要在任何时间将整个语料都驻留在RAM中
  • 有效实现了许多流行的向量空间算法,包括 tf-idf,分布式 LSA,分布式 LDA 以及 RP;并且很容易添加新算法
  • 对流行的数据格式进行了 IO 封装和转换
  • 在其语义表达中,可以相似查询

Gensim 的创建的目的是,由于缺乏简单的(java 很复杂)实现主题建模的可扩展软件框架。

import gensim
id2word = gensim.corpora.Dictionary.load_from_text('wiki_en_wordids.txt')
mm = gensim.corpora.MmCorpus('wiki_en_tfidf.mm')

lda = gensim.models.ldamodel.LdaModel(corpus=mm, id2word=id2word, num_topics=10, update_every=1, chunksize=10000, passes=1)

lda.print_topics(1)

上面示例可以看到一个通过 LDA 从 Wikipedia 转储中提取主题的非常简单的示例。

3. Pattern

Pattern 是采用 Python 开发的数据挖掘库,用于抓取和解析各种数据源,如谷歌、Twitter、Wikipedia 等等。

它提供了各种 NLP 工具 (PoS 标签、n- gram、WordNet)、机器学习功能 (向量空间模型、聚类、分类) 和用于进行网络分析的各种工具。它是由 CLiPS 维护的,因此不仅有很好的文档和许多例子,而且有许多学术出版物正在利用图书馆。

# Importing Libraries
from pattern.web import Google
from pattern.en import ngrams

engine = Google(license=API_LICENSE)

for result in engine.search('NLP', cached=False):
print(result.url, result.text)
print(ngrams(result.text, n=2))

在上面的示例中,是爬取谷歌以获取包含关键字『NLP』的结果,它将输出所有的结果 url 和文本。虽然这确实是一个毫无意义的示例,但它展示了如何通过 Pattern 执行爬行和 NLP 任务。

4. Natural Language Tool KIT [NLTK]

NLTK 是可用来训练 NLP 模型的最好的库之一。这个库很容易使用。它是一个初学者友好的 NLP 库。它有很多预先训练好的模型和语料库,可以帮助我们很容易地分析事物。

# Importing Libraries
import nltk
text = 'Earth Revovles around the Sun.'
# Token Generator--> Separates the sentence into tokens
tokens = nltk.word_tokenize(text)
for token in tokens:
print(token)

word_tokenize() 将帮助我们将一组文本创建为简单的单词。我们把它叫做 token,输出 ——

Earth
Revolves
around
the
Sun

5. TextBlob

TextBlob 基于 Pattern 和 NLTK,后者为所有常见的 NLP 操作提供了一个很棒的 API 调用。它不是最快或最完整的库,但它以一种极容易访问和管理的方式提供了人们日常所需功能。

# Importing Module
from textblob import TextBlob

text = 'Earth Revolves around the sun.'

text_blob = TextBlob(text)

for sentence in blob.sentences:
print(sentence.sentiment.polarity)

在上面的示例中,我们考虑 NLTK 库中获取的相同示例文本。在这个程序中,textblob 首先将句子分割成 Token,并在标记上执行情感分析,这只是句子极性分析。希望你对 Python 中自然语言的流行库有一个完整,由于 NLP 是一门难学课程,初学者可能无法正确理解它。但是那些想要开始 NLP 的人,那么你应该使用上面的任何一个库。如果你是一名自然语言处理的新手,我强烈建议您从 NLTK 开始,这将是一个很好的开始。