教学目标
以完成一种以大数据为基础的智能系统的原型开发为目标,在实践中运用大数据智能理论与技术。团队成员学习大数据系统与机器智能的理论知识和专业技能,完成项目团队结构设计和原型开发的实践环节,全面提高学生的技术实践能力。
课程内容
技术浅论
技术本质
- 多维多角度:工具论/人文关怀/社会抱负/技术社会
- 客观上(大众)
- “受害与受益”(两面性)
- 金融理财便捷
- 金融电信诈骗
- 受益方
- 技术改变的领导者(“quick money”)
- 受惠的人群(便捷性)
- 受害方
- 技术改变被动接受的人
- 被技术改变淘汰的人
- “受害与受益”(两面性)
- 主观上(单个人)
- 取决于个人立场、价值观、经历等等
技术泡沫
- 市场宣传和预期炒作,以及一些传媒的洗脑性的报道等的原因,导致概念混乱。
- 需要找到技术的本质(涉及认识论)
- 科学思维就是防止被洗脑,无脑思考。
- 研究思路:规范模式和实证模式
- 事实陈述的时候,一定要找到论点以及论据,以及判断论点是否统帅论据,论据是否支持论点。
- 实践与操作获得体验,而非感觉与愿望。
大数据索引
索引是加快查找的数据结构(Data Structure),主要有哈希表(Hash Table),树(Tree)和倒排索引(Inverted Index)。
- Thomas H. Cormen, introduction to algorithms, third edition, MIT press, 2009.
- Tardos, Eva, and Jon Kleinberg. "Algorithm Design." (2006).
Hash Table
布隆过滤器(BloomFilter)
- B. H. Bloom,Space/time trade-offs in hash coding with allowable errors, Commun. ACM, Volume 13 Issue 7, Pages 422-426, July 1970.
- Crainiceanu, Adina, and Daniel Lemire. "Bloofi: Multidimensional Bloom Filters." Information Systems 54 (2015): 311-324.
Tree Index
- Guttman, Antonin. R-trees: a dynamic index structure for spatial searching. Vol. 14, no. 2. ACM, 1984.
- Sellis, Timos, Nick Roussopoulos, and Christos Faloutsos. "The R+-Tree: A Dynamic Index for Multi-Dimensional Objects." VLDB, 1987.
Inverted Index
倒排索引(Inverted Index)是搜索引擎使用的数据结构。
倒排索引将关键字(keyword)映射到文档(document),在信息检索(Information Retrieval)中发挥重要作用。
在倒排索引中,每个关键词对应一个倒排链表(Inverted List),记录了该关键词出现的所有文档的编号。
- 倒排索引上的最重要的运算是集合交(Conjunction),并(Disjunction)和非(Negation)。
- 倒排索引在实际实现中,可以采用位图(Bitmap)与整数链表(Integer List)两种结构形式。
- 倒排索引上的交,并和非运算,对应的整数链表操作是Intersection/Unions操作,对应位图是比特AND, OR, NOT操作。
倒排索引实现: Lucene
Bitmap Index
Roaring Bitmap Java-Roaring CRoaring
- Chambi, Samy, Daniel Lemire, Owen Kaser, and Robert Godin. "Better bitmap performance with Roaring bitmaps." Software: practice and experience, 2015.
- Vallentin, Matthias, Vern Paxson, and Robin Sommer. "VAST: a unified platform for interactive network forensics." 13th USENIX Symposium on Networked Systems Design and Implementation (NSDI 16), 2016.
- Vallentin, Matthias. Scalable Network Forensics. Diss. University of California, Berkeley, 2016.
- Chenxing Li et al., BAH: A Bitmap Index Compression Algorithm for Fast Data Retrieval, LCN 2016.
Integer List
Data Structures for Inverted Indexes (ds2i)
- Culpepper, J. Shane, and Alistair Moffat. "Efficient set intersection for inverted indexing." ACM Transactions on Information Systems (TOIS), 2010.
- Schlegel, Benjamin, Thomas Willhalm, and Wolfgang Lehner. Fast Sorted-Set Intersection using SIMD Instructions, ADMS 2011.
- Inoue, Hiroshi, Moriyoshi Ohara, and Kenjiro Taura, Faster Set Intersection with SIMD instructions by Reducing Branch Mispredictions, VLDB 2014.
- Kane, Andrew, and Frank Wm Tompa, Skewed Partial Bitvectors for List Intersection, SIGIR 2014.
- Giuseppe Ottaviano, Nicola Tonellotto, Rossano Venturini, Optimal Space-Time Tradeoffs for Inverted Indexes, ACM WSDM 2015.
- Lakshminarasimhan, Sriram, et al. "Scalable in situ scientific data encoding for analytical query processing." Proceedings of the 22nd international symposium on High-performance parallel and distributed computing. ACM, 2013.
混合结构
融合几种独立结构的混合结构
- Athanassoulis, Manos, and Anastasia Ailamaki. "BF-tree: approximate tree indexing." Proceedings of the VLDB Endowment 7, no. 14 (2014): 1881-1892.
其它结构
Succinct Data Structure Library
List of Implemented Data Structures
- Bitvectors supporting Rank and Select
- Integer Vectors
- Wavelet Trees
- Compressed Suffix Arrays (CSA)
- Balanced Parentheses Representations
- Longest Common Prefix (LCP) Arrays
- Compressed Suffix Trees (CST)
- Range Minimum/Maximum Query (RMQ) Structures
- Navarro, Gonzalo, and Eliana Providel. 2012. “Fast, Small, Simple Rank/Select on Bitmaps.” In Proceedings of the 11th International Symposium on Experimental Algorithms (SEA 2013), 295–306.
大数据算法
数据解析
数据解析(Data Analytic),是指对数据集的属性值进行SUM,TopN,Rank操作。一般要求实时响应。
大数据解析平台,是实现数据解析的分布式软件系统。
- Navarro, Gonzalo, and Eliana Providel. "Fast, small, simple rank/select on bitmaps." In International Symposium on Experimental Algorithms, pp. 295-306. Springer Berlin Heidelberg, 2012.
- Vigna, Sebastiano. "Broadword implementation of rank/select queries." In International Workshop on Experimental and Efficient Algorithms, pp. 154-168. Springer Berlin Heidelberg, 2008.
基数估计
基数估计(Cardinality Estimation),评估一下一个集合中不同数目的个数。比如,访问一个网站的独立IP个数。
- Flajolet, Philippe, Éric Fusy, Olivier Gandouet, and Frédéric Meunier. "Hyperloglog: the analysis of a near-optimal cardinality estimation algorithm." DMTCS Proceedings 1 (2008).
- Heule, Stefan, Marc Nunkesser, and Alexander Hall. "HyperLogLog in practice: algorithmic engineering of a state of the art cardinality estimation algorithm." In Proceedings of the 16th International Conference on Extending Database Technology, pp. 683-692. ACM, 2013.
大数据系统
Hadoop
- Sanjay Ghemawat, Howard Gobioff, and Shun-Tak Leung. "The Google file system." ACM SIGOPS operating systems review. Vol. 37. No. 5. ACM, 2003.
- Jeffrey Dean and Sanjay Ghemawat. "MapReduce: simplified data processing on large clusters." Communications of the ACM 51.1 (2008): 107-113.
Spark
- Zaharia, Matei, et al. "Spark: cluster computing with working sets.“ Proceedings of the 2nd USENIX conference on Hot topics in cloud computing. Vol. 10. 2010.
机器智能
三个层面
实现的目标与功能分类
语音识别 机器视觉 智能问答
核心技术分类
特定算法 机器学习算法 深度神经网络
底层实现方案
可编程逻辑阵列 FPGA / 通用图形处理器 GPGPU / 通用处理器 CPU 群集
机器学习
Machine Learning scikit-learn
- Jordan, M. I., and T. M. Mitchell. "Machine learning: Trends, perspectives, and prospects." Science 349, no. 6245 (2015): 255-260. Machine_learning_science_2015
语音识别
Automatic Speech Recognition,简称ASR
计算机视觉
Computer Vision,简称 CV
深度神经网络
Deep Neural Networks,简称DNN
Stanford Deep Learning tutorials DL_tutorials
TensorFlow software Tensorflow
- LeCun, Yann, Yoshua Bengio, and Geoffrey Hinton. "Deep learning." Nature 521(7553), pp:436-444, 2015. Deep_Learning_Nature
- Jeff Dean, Large-Scale Deep Learning for Intelligent Computer Systems, WSDM 2016. WSDM_keynote
- TensorFlow: A System for Large-Scale Machine Learning, OSDI 2016.TensorFlow_OSDI2016_paper TensorFlow_paper
论文报告撰写
项目分组
第一组
组长: 姚沛然
组员: 王逸伦 张正彦
第二组
组长: 王亦凡
组员: 刘梦旸 邱昱田
第三组
组长: 李子豪
组员: 娄晨耀 张若天 邹逍遥
第四组
组长: 石冠亚
组员: 宣程 汤鹏 段了了
第五组
组长: 杨文聪
组员: 梅杰 计昊哲 杨应人
第六组
组长: 赵宇璋
组员: 孙炜岳 吴一凡
第八组
组长: 熊铮
组员: 范承泽 秦梓鑫
论文研读
要求:提交研读论文的PPT(正文部分不超过10页)。
时间:10月14日中午12点之前。
10月19日下午安排每组做一个小报告,每组时间不超过10分钟。
第一组
RUBIK: Efficient Threshold Queries on Massive Time Series, SSDBM 2015.
第二组
SciCSM: Novel Contrast Set Mining over Scientific Datasets Using Bitmap Indices, SSDBM 2015.
第三组
ALACRITY: Analytics-Driven Lossless Data Compression for Rapid In-Situ Indexing, Storing, and Querying, TLDKS X, 2013.
第四组
VSEncoding: Efficient Coding and Fast Decoding of Integer Lists via Dynamic Programming, CIKM 2010.
第五组
Super-Scalar RAM-CPU Cache Compression, ICDE 2006.
第六组
Partitioned Elias-Fano Indexes, SIGIR 2014.
待证明结论3简要证明过程:
待证明结论4简要证明过程:
第六组论文实现伪代码照片:
第八组
Optimal Space-time Tradeoffs for Inverted Indexes, WSDM 2015.
课程实践
学生准备
携带笔记本,智能手机
(Bring your own laptop computers and camera-ready smart phones)
Azure云平台使用
Flask Web服务器搭建
准备virtualenv。安装方法(下面两条命令可能会适用mac和linux):
$ sudo easy_install virtualenv
或者更好的:
$ sudo pip install virtualenv
如果你使用Ubuntu,请尝试:
$ sudo apt-get install python-virtualenv
Centos,请尝试:
$ sudo yum install python-virtualenv
安装好virtualenv后,可以创建一个项目文件夹,利用virtualenv命令在其下创建venv文件夹:
$ mkdir myproject $ cd myproject $ virtualenv venv New python executable in venv/bin/python Installing distribute............done.
现在,你想要在某个项目上工作,只要激活相应的环境。在OS X和Linux下,按如下做:
$ . venv/bin/activate
现在你只需要键入以下的命令来激活你的virtualenv中的Flask:
$ pip install Flask
几秒后,一切就为你准备就绪。(weiwandaixu)
课程项目
项目1-大数据
描述
任务:基于位图索引的概念和原理,用C++实现一个位图索引数据库。
检验:完成对一段网流数据的索引建立,查询。在虚拟机上运行成功,得到正确结果。
网流数据:\\166.111.134.110\team-saturn\网流数据
代码托管:http://gitlab.icenter.tsinghua.edu.cn
时间:10月7日中午12点之前(特殊情况,推迟一周)(校历第四周)
组织:以组为单位,要求要看到所有同学的贡献。
作业提交
[[Group1]] | [[Group2]] | [[Group3]] | [[Group4]] |
[[Group5]] | [[Group6]] | [[Group7]] | [[Group8]] |
项目2-Lucida使用
Lucida安装
每个组在清华工业云平台上安装Lucida软件
- 清华工业云 icenter-cloud
- 下载地址 Lucida-AI
时间:10月26日下周三中午12点之前。(校历第七周)
每组工作
每组熟悉了解Lucida的7种AI服务的实现原理
日历服务CA
Introduction
随着 2012 年 iPhone 4s 和它附带的个人助理 Siri 的发布,智能个人助理成为各大互联网公司研发的热点。
近年来,紧随 Siri,Google 发布了个人助理 Google Now,Amazon 发布了具有个人助理功能的智能硬件 Echo,Microsoft 也将它出品的游戏 Halo 中士官长的助理 Cortana 开发成了可以用在 Windows 10 和 Windows 10 Mobile 操作系统上的真正的个人助理。
伴随着最近的大数据、人工智能和创新创业热潮,国内许多厂家开发的产品也以个人助理为主要卖点,如创新工场投资的创业公司出门问问的主打产品就是具有自主知识产权的中文语音交互智能手表系统 Ticwear 和搭载这一操作系统的智能手表。Clarity 实验室开发的 Lucida AI 就是一个开源的智能个人助理(Intelligent Personal Assistants, IPA)框架。
所有这些智能个人助理,包括十几年前十分火热的掌上电脑(PDA),都包含一个共同的功能:对日历的操作,即:能够查看并安排日程。与曾经的 PDA 不同的是,智能个人助理能够利用机器学习,智能地理解人类以自然语言给出的操作日历的指令,如“把下午3点的会议改到4:30”、“下一个会议在哪里开?”、“我这个周五的日历上有什么安排?”等。这一功能极大地方便了用户,尤其是商业用户的使用。
Framework
从总体原理来看,Calendar Events Retrieval 这一功能的实现主要由两部分组成:负责对人类友好型的输入的理解和处理的后端和负责对日历进行操作的前端。
具体来说,后端负责利用神经网络等手段,将输入的语音、文字或图片转换成计算机可理解的数据,如转换为时间区间。例如,后端可能会将文本输入“What was on my Google calendar last year?”转换成"2015-10-22T00:00:00 2015-10-22T23:59:59"(基于当天日期)。而前端接收后端发来的机器可理解的数据,与日历服务(如 Google Calendar, Microsoft Exchange 或 CalDav)交互。
当然,还需要考虑的一个问题是后端与前端的交互。当然,同前后端的实现相比,这一问题较为无关紧要。前后端通信可以通过REST API, Apache Thrift 等协议完成。
图像匹配IMM
概述
所谓图像匹配,就是给定一张图片,并在一个图片集中寻找与这张图片最相似的图片。
在目前主要用于图片检索服务,在Baidu和Google上都有这样的功能,可以找同一张图片的多种不同分辨率的版本,或者找一张图片的相关图片,效果很好。
使用方法演示
进入Learn页面,加入一张吉娃娃的图片。
加入成功。
再加入一张蓝莓松饼的图片。
加入成功。
接下来尝试匹配一张吉娃娃的图片。
进入Infer页面,上传这张图片,再单击ask按钮。
遗憾的是由于训练数据过少,Lucida认为这张吉娃娃与蓝莓松饼的图片更加接近。
依赖项介绍
OpenCV
OpenCV的全称是:Open Source Computer Vision Library。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
Facebook Thrift
Thrift最初由Facebook研发,主要用于各个服务之间的RPC通信,支持跨语言,常用的语言比如C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#,Cocoa, JavaScript, Node.js, Smalltalk, and OCaml都支持。Thrift是一个典型的CS(客户端/服务端)结构,客户端和服务端可以使用不同的语言开发。
MangoDB
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
代码实现简介
Lucida中的Image Matching主要是采用下面的实现方式:
(1)对于一张图片,调用OpenCV中的SurfFeatureDetector提取这张图片的特征点,得到一个描述矩阵。
(2)将这个矩阵利用GridFS存储在MangoDB数据库中。
(3)利用深度学习模型进行训练。
(4)得到最为匹配的一张图片。
中间的数据通信过程均基于Facebook Thrift。
图像分类IMC
概览
IMC, image classification 是 Lucida Image Processing 服务中的一项功能。在页面上,用户可在Infer上进行提问,例如:这是什么以及这是什么动物。接下来用户可上传照片,系统将为用户定义照片的内容。
代码解读与实现
IMC 主要有 IMCHandler 和 IMCServer 两部分代码组成。
首先,我们将对IMCHandler 进行代码解读。IMCHandler 主要运用了Folly Futures 和Caffe 两个大框架。
Folly Futures, 是一种由Facebook为C++11带来用于同步并发操作的构件。它能够被视为对异步操作结果的只读代理对象。这个对象的初始值为未知。如果Future的客户端试图在操作完成前读取它的值,可能会被阻塞。所以Future通常和一个Promise关联,Promise提供对Future的值进行写访问。异步操作能够立即返回只读的Future,而不堵塞。当异步操作完成时,用户可通过setValue()方法设置它的结果。在IMCHandler中,Folly Futures 主要用于判断create 和 learn 两项IMC功能是否执行完成。若执行尚未完成,系统日志将自动报错。接下来,我们将对IMC运用的Caffe框架进行分析。
Caffe,卷积神经网络框架是一个清晰,可读性高,快速的深度学习框架。它具有上手快,速度快,模块化,开放性,社区好等优点。Caffe主要架构,包括了预处理图像的leveldb (用来存储以及convert imageset),图像分类模型等。在IMCHandler中,caffe结构主要用于加载所需分析的图形,判断图形的大小,并将图形大小重新设置为227 x 227再进行下一部分的比对。
IMC的另一部分便是IMCServer的部署。IMCServer运用了多个thread, 进行同步操作,并运用googlelogging对输入的操作进行记录和学习。
小结
IMC主要运用了深度学习框架以及健康且强大的Folly Futures库,对图像进行预先处理,并最终有效的实现图像的分类及识别。此项功能巧妙运用了Intelligent Personal Assistants, 结合人声与图像,为未来虚拟助手的发展,提供了平台及机遇。
问答QA
1.Lucida demo QA使用介绍
(1)用户自定义信息类
- 在“学习”栏增加至少一段信息。例如“约翰25岁”
- 转到“推断“栏,询问一个与你所添加信息相关的的问题。例如“约翰多少岁?”
(2)网页信息类
- 在“学习“栏加入一条wiki百科的网址。例如“https://en.wikipedia.org/wiki/University_of_Michigan”
- 转到“推断“栏,询问与添加百科信息有关的问题。例如“密歇根大学位于哪里?”
(3)数据库信息类
例: 谁是中国的最后一位皇帝? 谁发现了南极点? 谁发明了电话? 哪位希腊数学发发展了几何学? 慕尼黑协定在何时签订? 泰森在何时夺冠 尼罗河位于什么地方?
2.依赖项介绍
(1)OpenEphyra:OpenEphyra 是一个使用 Java 开发的模块化、可扩展的开源问答系统。它从网络和其他资源检索自然语言问题的答案。开发者能基于这项项目开发新的问答系统,而不用关心端到端系统。
(2)Indri:提供目前最先进的文本搜索,支持多种结构的询问语言。可在一台机器上实现对五千万个文档的文本收集;分配搜索后,量级能再增加一倍。支持linux,solaris,windows和mac os等多个系统。
(3)MongoDB:可以应用于各种规模的企业、各个行业以及各类应用程序的开源数据库。它为开发人员 提供了传统数据库的功能:二级索引,完整的查询系统以及严格一致性等等。
(4)Apache Thrift:提供标量化跨语言开发服务。由一个软件栈和代码生成引擎组成,提供在C++, Java, Python, PHP, Ruby等多种语言间无缝高效转换的服务。
3.代码结构
(1)文件结构
- main:主函数目录
- QADaemon.java:主函数,启动QA服务,监听客户端请求
- handler:处理Lucida服务的代码目录
- KnowledgeBase.java:知识库类(KnowledgeBase)
- QAServiceHandler.java:远程调用框架Thrift文件中的QA服务接口(QAServiceHandler)
(2)代码执行流程
- 初始化thrift对象
- 远程服务调用框架,响应客户请求
TTransport transport = new TSocket("localhost", port); TProtocol protocol = new TBinaryProtocol(new TFramedTransport(transport)); LucidaService.Client client = new LucidaService.Client(protocol);
- 与服务器通讯
transport.open();
- 创建新的QA服务并学习提问内容(依次执行"create","learn","answer")
- Indri用于知识检索
- OpenEphyra用于后台的问答模型处理
client.create(LUCID, create_spec); client.learn(LUCID, knowledge); String answer = client.infer(LUCID, query);
手写数字识别DIG
简介
手写数字识别DIG这个单元由我们第三组负责。
由于技术上对Lucida API调用规则以及thrift语法了解不深,我们组在工业云安装完成Lucida后对于这个项目并没能成功做出自己的前端,因此,我们主要是对Lucida 3000端口的页面和实现DIG的程序代码以及Lucida tutorial里面的内容的一些分析,并查阅了相关资料。
流程分析
首先,手写数字识别这个项目,可以通过给定一个只包含一个手写数字的jpeg格式照片,这一个项目可以识别出这个数字是0到9当中的哪一个。
然后,这一个项目的代码结构主要分为以下的几个部分:
0.压缩并存储。在这一步当中,程序通过对给定jpeg文件的输入进行分析,并通过将这个文件压缩到一个固定大小然后存储起来。
1.黑白二值化。就是通过对原有图片进行一定的修改,因为初始的神经网络只接受0和1的输入,使得数字部分和背景部分能更好的区分开来。在这一步当中,应该可以通过采取较优的黑白二值化的方法(比如说可以与周围一定数量的像素点进行比对)从而同时消除噪点,提高识别的精度。
2.对正图片中心,因为图片偏移会对神经网络得到正确结果产生较大影响,所以对正图片中心是必不可少的预处理过程。
3.把修改后的图片作为神经网络的输入。这一步,就是把经过上两步操作后得到的像素矩阵输入到神经网络当中,然后通过调用caffe(卷积神经网络框架)返回权值从而得到与各个数字的一个相关权值;
4.根据得到的相关权值,返回结果。
以上就是该项目程序的主要部分。
原理分析
我们可以注意到里面运用到了一个卷积神经网络框架模型。我们通过查阅资料得知,该模型,是通过前期的一些训练准备从而具有对相关图片的识别能力。
训练准备的步骤大概分为两步:
首先,是初始化网络及学习参数,如设置网络初始权矩阵、学习因子等。
然后,就是提供大量的手写的0~9的图片的并且采取监督模式学习,训练神经网络,不断修正,直到满足要求为止。
而训练神经网络这一步,分为前向传播过程和后向传播过程。
前向传播过程就是通过给定的训练模式的输入,计算网络的输出模型,并与期望模式进行比较,如果达到要求,则进行下一个训练模式;如果未达要求,则进行后向传播的过程。
(与我们的识别图像一步比较相似,只不过我们识别图像的时候是直接返回网络计算出来的输出模型)
后向传播过程则是可分为三个步骤:
1. 计算同一层单元的误差;
2. 修正权值和阈值;
3. 进行下一个训练模式。
上面的具体操作则是通过将原本的特征maps与一个可学习的卷积核进行卷积,并通过一个激活函数得到输出特征map。然后再利用计算出来的灵敏度map进行梯度下降方法对原本的特征maps进行修正。 那么,通过对足够多的训练模式去训练网络,我们就可以得到一个足够优的神经网络去解决手写数字识别问题。
应用方法
在一定量的数据集训练之后,该网络具有识别数字的能力之后,在真正应用时不必再次学习,只需要载入神经网络每个节点对应的权值即可。所以Lucida没有公开它训练的过程,而是直接提供的具有识别能力的训练好的网络的参数。
与传统方式对比
与传统数字模式识别算法的对比:传统数字模式识别算法基于对每个数字连通块、形状、线的弯曲情况的分析制造出一条条规则来判断图片归属,而神经网络不用再去分析每个数字的特点,而是预先准备一定量的数据集,就可以自己寻找特征。传统数字模式识别算法可能会因手写字体、连笔等差异对识别结果产生很大影响,而神经网络在大量数据训练后,能较好提取出区分这些数字的特征,对于字体等条件依赖不大、更接近人脑识别数字。
参考资料
1.《Notes on Convolutional Neural Networks》,Jake Bouvrie
2.《基于神经网络的图像识别方法》,彭淑敏,王军宁
3.《Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现》,zouxy09
4. Caffee 神经网络框架 http://caffe.berkeleyvision.org
人脸识别FACE
功能实现示例
- 训练集(From Bing Picture)
- 测试集(From Bing Picture)
- 效果
代码解读与实现
FACE 主要有 FACEHandler 和 FACEServer 两部分代码组成,由CONGFIG进行配置。
CONFIG的结构
两个卷积层的卷积神经网络(CNN),C++实现
- 第一层:输入层
name: "face" input: "data" input_dim: 1 input_dim: 3 input_dim: 152 input_dim: 152
- 第二层:卷积层
layers { name: "conv1" type: CONVOLUTION bottom: "data" top: "conv1" convolution_param { num_output: 32 kernel_size: 11 stride: 1 } }
- 第三层:池层
layers { name: "pool2" type: POOLING bottom: "conv1" top: "pool2" pooling_param { pool: MAX kernel_size: 3 stride: 2 } }
- 第四层:卷积层
layers { name: "conv3" type: CONVOLUTION bottom: "pool2" top: "conv3" convolution_param { num_output: 16 kernel_size: 9 stride: 1 } }
- 第五层:LOCAL
layers { name: "local4" type: LOCAL bottom: "conv3" top: "local4" local_param { num_output: 16 kernel_size: 9 stride: 1 } }
- 第六层:LOCAL
layers { name: "local5" type: LOCAL bottom: "local4" top: "local5" local_param { num_output: 16 kernel_size: 7 stride: 2 } }
- 第七层:LOCAL
layers { name: "local6" type: LOCAL bottom: "local5" top: "local6" local_param { num_output: 16 kernel_size: 5 stride: 1 } }
- 第八层:内积
layers { name: "fc7" type: INNER_PRODUCT bottom: "local6" top: "fc7" inner_product_param { num_output: 4096 } }
- 第九层:内积
layers { name: "fc8" type: INNER_PRODUCT bottom: "fc7" top: "fc8" inner_product_param { num_output: 83 } }
- 第十层:SOFTMAX
layers { name: "prob" type: SOFTMAX bottom: "fc8" top: "prob" }
- 第十一层:ARGMAX
layers { name: "argmax" type: ARGMAX bottom: "prob" top: "argmax" }
FACE服务器搭建
FACEServer.cpp 定义了端口和线程:Port 8086 / Threads 4 定义了服务器指向:
auto handler = std::make_shared<FACEHandler>(); auto server = folly::make_unique<ThriftServer>(); server->setPort(FLAGS_port); server->setNWorkerThreads(FLAGS_num_of_threads); server->setInterface(std::move(handler)); server->setIdleTimeout(std::chrono::milliseconds(0)); server->setTaskExpireTime(std::chrono::milliseconds(0));
人脸识别解决方案
FACEHandler.cpp编写了FACE的解决方案,应用Caffe深度学习框架。
- 重要概念
network、weights FACEHandler::FACEHandler()为最重要的函数
- 原理
*对原始数据分离训练集和测试集 *转换为caffe可以处理的lmdb格式 *根据设定的Net网络和Solver配置文件进行训练 *得到训练的模型
- 步骤
在我们组选择好训练数据和测试数据之后,就需要进行数据处理了,处理方法主要分为3个步骤。 *人脸检测 *人脸特征点检测 *人脸的对齐 采用卷积神经网络(CNN)方法,并且采用CNN最后一层的激活值输出作为features,不同的人脸区域放入CNN中提取特征,形成了互补、过完全的特征表示(form complementary and over-complete representations)。 通过深度卷积网络来学习高级的过完全特征(有监督),CNN的最后一层激活值作为输出,
- 具体细节
采用多尺度,多人脸区域,训练多个CNN网络,最后得出一张人脸图像的多维度特征。 CNN的结构如下:![]()
- 说明:
Face patches 是进过对齐过后的的人脸块,也就是说已左(右)眼为中心的人脸区域块,嘴角为中心的人脸区域块等等,这样就有多个不同的输入块输入到CNN中。 最后再把不同的块所输出的特征连接起来,就形成了一个最终一张人脸的特征。然后再用各种分类器对其特征进行分类。采用argmax,softmax。
- 输入图像:
多个人脸正方形块(因为后面要考虑到是全局图像还是局部图像,且需要考虑到尺度问题),其中局部图像是关键点(每个图像一个关键点)居中, 不同的区域大小和不同的尺度图像输入到CNN中,其CNN的结构可能会不相同,最后将所有的特征级联起来。
- 特点:
在训练CNN中,训练数据的类别越多,其性能越好,但是会在训练模型中出现问题,也就是太慢。CNN的输出是特征,而不是输出类别。 分类采用Joint Bayesian 来进行人脸的verification;也采用了神经网络来比较,但是联合贝叶斯的效果比较好;
小结
FACE主要运用了Folly Futures库和Caffe开源深度学习框架,对图像进行预先处理,可以识别人脸,并以Trump-Hillary这一最简单的两类问题做了验证。
语音识别ASR
项目3-TensorFlow安装
阅读深度学习DeepLearning教程
安装Google TensorFlow
完成TensorFlow网站上Get Started.
时间:2016年11月2日中午12点(校历第八周)
项目4-云+端整合
时间:2016年11月9日中午12点(校历第九周)(特殊情况,延长一周)
Thrift协议
Client端
调用摄像头拍照
调用Thrift接口
Server端
接收图片文件
调用服务端程序
参考
项目5-机器智能
描述
完成一个可展示的人工智能系统
步骤:
- 设置Azure虚拟机
- 架构Flask-Web服务
- 建立AI服务(Google Tensorflow)
- lucida.ai
- 智能端开发(移动平台、嵌入式硬件) + Thrift协议联调
参考: Lucida-AI
作业提交
[[Group1]] | [[Group2]] | [[Group3]] | [[Group4]] |
[[Group5]] | [[Group6]] | [[Group7]] | [[Group8]] |
致谢
本课程获得微软Azure云计算与机器学习捐赠支持。
感谢微软公司 杨滔经理,章艳经理,刘士君工程师,闫伟工程师。
参考文献
基础
- John L. Hennessy, and David A. Patterson. Computer architecture: a quantitative approach. Elsevier, 2011.
- Neil Matthew, and Richard Stones. Beginning linux programming. John Wiley & Sons, 2011.
- Bjarne Stroustrup, The C++ programming language. Pearson Education, 2013.
- Weiss, Mark Allen, Data structures and algorithm analysis in Java, Addison-Wesley Longman Publishing Co., Inc., 1998.
- David Flanagan, JavaScript: The definitive guide: Activate your web pages. " O'Reilly Media, Inc.", 2011.
- Miguel Grinberg, Flask Web Development: Developing Web Applications with Python. O'Reilly Media, Inc., 2014.
深度学习
- Yoshua Bengio, Ian Goodfellow, Aaron Courville, Deep Learning, MIT Press, 2016. DeepLearningBook
- Google brain team, TensorFlow: Large-scale machine learning on heterogeneous systems, whitepaper, 2015.
- Vijay Agneeswaran, Real-Time Applications with Storm, Spark, and More Hadoop Alternatives, 2014.
计算机围棋
- Mastering the game of Go with deep neural networks and tree search, nature 2015.
- Better Computer Go Player with Neural Network and Long-term Prediction, ICLR 2016.
- Pachi: State of the art open source Go program, Advances in computer games, Springer Berlin Heidelberg, 2011.
- Training Deep Convolutional Neural Networks to Play Go, JMLR 2015.