本文是作者在2018年12月13日众智汇社群分享的记录。由@kellie 记录整理。 本文由机器之心经授权转载自悦思悦读(ID:yuesiyuedu ) ,未经授权禁止二次转载。
作者: 刘培 AI创业企业算法工程师
西安电子科技大学光电图象专业,硕士
毕业后就职于爱立信
2018年初加入AI创业企业,从事图象处理领域的研发工作
2017年8月17日,主讲人曾经做过一个分享:《我,女生,程序员》,讲述了自己从非计算机专业转行成为程序员的经历。
在今年初,主讲人再次前进一大步,成为了AI工程师。本文呈现给大家这一年的工作历程。
偶入人脸识别领域
开始做AI人脸识别其实非常偶然,因为我之前做程序员也不久,大概刚好一年的时间,但是到后来我觉得重复性太强了。
于是,去年冬天的时候我就考虑能不能离开换一份工作。我就开始把简历收拾了一下,准备去找新的工作。
在读研究生的时候,我的方向是偏图像处理的,我在简历上突出了这块,打算寻找偏工程类的图像方向的工作。
可能由于西安的市场工作还不是很丰富,一直都没有找到合适的,直到一个多月之后,我现在的老板找到了我,并和我进行了沟通。于是,在去年4月份,我加入了这个团队。
加入团队,从0开始
进公司之后,发现公司的同事们都特别厉害。在西安你很难碰到北大的同事或者中科院的同事,幸运的是我竟然碰到了。我从他们身上学到了很多,当然,很多基础性的工作就落到了我的身上。
数据采集
我来公司的前两个月一直没有接触跟技术相关的工作,而是在外面做数据采集。
大家都知道数据是推进算法精度的一个非常重要的资源,只有在大量数据上训练,我们得到的模型才会趋于精准。
我们公司是做三维人脸识别方向的,网上的数据库大部分都是图片是二维数据,三维数据需要三维采集设备去采集。
我们去了很多很多地方,因为现在人们的安全保密意识都非常强,所以我们在采数据的时候困难重重。
我们都是通过熟人、朋友去联系一些单位,给他们发礼品,鼓励他们去采集。我们也去了乡村、高校等,给他们送杯子。虽然困难,但是也挺有意思的。
我提到的数据可能跟你们提问中的数据不一样,我们采的数据是人脸,人脸点的彩色信息,位置信息会通过采集设备变为数据存储下来。
采集数据的两个月让我体验了非常不同的生活:
case1:有的村民为了多要我们的一份礼品就向我们发火,甚至准备打架。
case2:有的年纪特别大的老人看到我们采集数据会送礼物,他们竟然坐着轮椅让家人推着过来。
因为采集的那几分钟要做姿势,做表情,对老人来说,也是很难熬的,而且90高龄的老人,听不到你的指令,做的表情也没什么差别。我们为了不让他们不舒服,就很友好的把礼品直接给他们,不让他们参与了。
case3:我们坐高铁的时候会把三维设备都紧紧放在怀里,因为摄像头都是玻璃,特别容易震动而导致一些镜头参数改变,很多次在路上我们一直都很奇怪的被大家盯着。
case4:还有6月份,我们去铜川交警队所在的一处道路管理处,是一排路边搭的石棉瓦房,里面非常的闷热,就在里面去采集数据。
但是我们几个年轻人也不觉得很累,相反会觉得这是不同于我们平时做研发,一个很难得的体验。
数据处理
数据采集之后还得我们自己来处理,还好有几个实习生可以让我来“欺负”一下。
为了能够快速地处理这些数据,我们经常用Python写一些批处理的工具进行特定的处理。
有的时候担心中间意外断掉,我们会下载一个TeamViewer远程控制软件,可以通过家里的电脑控制公司电脑的程序。所以睡觉前做的事情,除了敷面膜,还要看程序有没有断掉,有没有异常出现。
之后再对这些数据进行筛选,把不符合标准的数据删除,比如模糊不清或者脸部信息不完整的数据。
删除完之后,我们会写程序对数据进行矫正——把人脸放正,有时为了增强数据规模和数据姿态的丰富性,我们要做一定的数据增强。
数据标注
做完数据处理之后,我们要对数据进行标注。
举一个简单的例子,如果这个人戴眼镜,我们就给这张照片标“1”,如果这个人没有戴眼镜,我们就标“0”。
因为现在深度学习的很多训练都是建立在监督学习的基础上,通俗地说,机器识别出的结果判定为“1”的概率和判定为“0”的概率进行比较,概率较高的就被判定为最终识别的结果,所以我们要进行数据标注。
但是试验的数据集都非常大,我们不可能逐一点开文件,手动标注在文档里,再把文件关掉,然后再打开再标注,所以我们要写一些标注工具。这些标注工具通过界面展示出你的图片,我们看了这张照片直接按“1”或“0”,就会自动生成所需要的标准格式文件。
因为现在市场上有很多标注公司,他们是对成千上万的数据进行标注,但对我们初创公司来说还没有能力去购买这些资源,我们员工在空闲时间就会多标注一些,所以需要把标注工具尽量开发得非常顺手。
自己标注的数量级还是太少,更多的时候,在做二维人脸识别的时候是和一些外国的数据库糅合在一起用,比如WIDER FACE。
这些数据库是自带标签的,比如男是“1”,女是“0”,这些标签通常是放在文件名里的,我们就需要开发一些程序来读取这些标签,再生成我们所需要的标注文件。
这是我们基本的标注工作。
模型训练
数据标注并处理好之后,我们就可以开始训练了。训练框架目前很流行的有Pytorch、TensorFlow、Caffe。
我们选择的是caffe,它有一个很好的优势——模型和数据集都是分开的,数据集都做成了固定的格式,放在这个平台里,按照选定的网络结构,进行训练,训练完就可以生成一个固定的模型,放在测试代码里检测,直接可以得出识别结果。
接下来就是神经网络体现作用的时候了。
关于神经网络,在网上有很多资源可以帮助大家理解神经网络里卷积、池化、激活函数、损失函数、学习率这些概念,在这里就不一一给大家解释了,我自己理解的也不是很深。
今天就是想为大家去展现一个模型训练流程,这样大家在有了一个宏观概念之后,再去细分、研究和补充,会有一个非常好的效果。
我举一个例子:识别人是否戴眼镜的任务。
我们当时准备了10万个戴眼镜的和10万个没有戴眼镜的数据,我们对它们进行筛选、处理和标注,都准备好之后,我们准备在Caffe上进行训练。
在决定选用什么神经网络模型的时候,因为这是个二分类问题,也比较简单,所以我们选了一个简单的网络结构,层数比较少。
我们把学习率也设到了0.001,我们发现损失函数Loss是越来越小的,也就是收敛的。
Loss可以理解为,预测的函数和真实的函数的差,如果它越来越小,就说明我们训练出的模型是越来越拟合真实分布的。
模型出来之后,我们在自己搭建的测试平台里面去测试,得出概率,然后通过比较概率大小来决定判别结果。
目前我们在人脸比对和人脸库搜索等方面还需要很大的努力。
我最近在做很多工程类的事情,比如用Qt来做工程终端界面、之前做了一些H5的东西以及微信小程序,在创业公司你可能不能很长时间在做一件事情,所以我当时接触的不是特别深。
AI新人的职场感悟
来分享一下来到这边快八个月的时间我的一些感受。
算法并非高不可攀
我以前觉得算法非常难,高不可攀,但是现在当我参与到公司的一些算法训练的项目中,我有了一些感知,我觉得这些东西也不是那么抽象,所以非常有信心。
我希望每一个程序员,当你们想做一件事情的时候,就勇敢地去做,这些事情都没有想象中那么难,也并没有太高的门槛。
市场上,大家可能都会愿意选择研究生去做算法,可能也是看中了他们在研究生的一些数学积累。但是如果你可以由面到点地去学,我相信只要积累得足够深,你也是一个非常合格的算法工程师。
不要给自己设限
我们公司有一个男生,比我还小,前段时间公司需要一个安卓版的应用,他之前跟我们都是做算法的,从来没有接触过工程,但是他承担了下来。
他快速的学习能力是建立在他去分析新问题的思路上——先整体再微观,先实现基本功能再逐步充实,所以他是可以做到的。
我希望听到分享的同学们,不要给自己任何限制,只要你想做,那你就可以做到的。我觉得外界的传言有时候还是要屏蔽掉一些的,你只管去做,不懂就问。
与优秀者为伍
在公司还有一个非常好的感觉,同事们都很棒,他们总是用一些很高的要求来要求自己。
比如交大的一个小同学,他坚持用很优秀的人的习惯去要求自己,要求自己每天看书,给自己买了特别多的书,对书中的内容分析得很透彻,并且做了笔记,即使工作了还像一个学生一样——我觉得这种状态非常好。
其实工作也是一种生活方式,如果我们能够享受其中,我觉得已经离成功不远了。所以从这些很优秀的人学到了非常好的品质,学到了他们的坚持,学到了他们的认真,学他们对一个问题不解决不放弃的劲儿。
Q1:机器学习对硬件要求高吗?普通开发者学习AI的难度主要在哪一块?
A1:深度学习要大量训练数据的话,至少对GPU有要求,硬件目前还没有特别了解。
普通开发者学习AI的难度,我认为还是不高的。如果你们具有一定的工程能力的话,可以在GitHub找一些人脸识别或者语音识别方面的代码跑一跑,跑通之后再逐步去挖掘。
这个时候就需要去看一些数学方面的东西,现在网上的资源比较多,也挺容易理解的。
我觉得让一个没有工程经验的人直接去学可能不是很快,但是有工程能力的人去学AI相反会比较快。
Q2:训练模型用了多少服务器资源?多少时间?多大数据量?
A2:识别是否戴眼镜的任务,我训练了20万次,大概两三个小时。我们的电脑如果在训练模型的话,基本上你就别干其他事情了。
Q3:你入门AI花了多长时间,通过哪些资料学习的?
A3:入门AI,我之前也看过一些书,比如吴恩达的公开课,但是我觉得你真的想入门AI的话,不如去一个公司实习。
Q4:训练模型用的是阿里云的服务器吗?作为个人开发者学AI,需要怎样的配置?
A4:我们公司用的是自己配置的服务器,具体怎么样的配置,你可以私下问我,我去问一下公司负责搭建服务器这块儿的同事。
Q5:有很多开源AI框架,如TensorFlow,做工程还需要读论文并实现它吗?
A5:我们现在经常是需要看最新的论文,比如CVPR之类国际上比较有名的会议的期刊和论文。
我们做工程,就是发现他们有一些新的网络结构,有多少其他的层,我们对比一下,把网络结构改一改,试一下,看效果有没有提升。
我们经常是需要这样去读论文并实现它的,非常像在学校做科研,但是比科研会效率高很多。
大家有一定工程能力的话,真的可以去GitHub上找一些开源的源代码,把它配置好,跑一跑,做一做,比开始去补很多基础会快得多。
先宏观再微观是一个非常好的学习方法,对整体的一个模型有了感知之后,再去探究和测试局部的意思会比较好。
Q6:初学者,Caffe(作者采用)和TensorFlow如何选择?
A6:我个人后期非常喜欢Pytorch,因为我在做程序员时用的是Python,所以我觉得Pytorch还是非常好用的,Tensorflow可能做NLP比较多。
Q7:但是实习也需要基础模型知识的,面试官要问模型,如果一开始就去GitHub上找项目做的话,这样对模型的理解还是很浅的。而且直接看代码会觉得很困难,怎么样学习才对呢?
A7:因为我当时自己看书非常累,不知道他们在干什么。
后期我们公司有一个工作了好几年的大牛带我做了一个项目,告诉我先采集、处理和标注数据,然后在搭建好的一些模型里训练,并且在搭建好的代码里测试和验证,这个流程走完之后,我好像突然可以理解识别是怎么回事了。
之后我开始探究每一部分是做什么的,把相应模型的代码打开发现这个模型里面全放的是神经网络的层数,一层卷积之类的。这时我就提问为什么要加这几层?他会说层数多的话可能会提升拟合的精度,但也有可能过拟合之类的。我就再去查什么是拟合和过拟合。
万事开头难,这个过程可能每个人都无法避免,有时候可能需要一个契机,有时候可能需要你厚积薄发,很多路可能都没有办法去避免,所以我相信如果你没有合适的实习机会的话,你可以在网上去多找一些工程,总会有顿悟的那一刻。
Q8:专属女生的一些顾虑。
A8:”女生不适合做程序员,女生更别想着有去做AI工程师”——我觉得这些都是谬论。
女孩,有自己的优势,即使女生要面对生孩子问题。知识都是循序渐进的过程,我们积累了,有自己的体系之后,是不需要时刻具有非常强的精力和脑力去支配它的,它无非是生活中我们需要解决的一些问题罢了,所以希望每个女孩都要有信心。
现在成功的女生很多,我之前在赤兔上关注到了潇洒姐——趁早的王潇,我觉得她非常积极,而且做了非常好的事业。
我们把女生遇到的问题,转换一下心态,看做人生的不同体验,我们在生育孩子的几年好好照顾孩子。
在工作时,努力把工作做好,这样我们的资本就无形增加了。我们在市场上是有主动权的,就能够产出对社会有价值的一些技术。
Q9:你们公司有算法研究专家、做工程专家,分工明确吗?
A9:我们公司有单独的算法研究专家,有专门做工程的。
但是在开始招聘的时候,可能因为想把算法做到最好,算法工程师比较多,专门做后台、做终端的工程师就非常少。
现在我们公司在向工程方面倾斜,要成为一个产品,工程必须要过硬。
我前段时间做了一个微信小程序,类似于我们的颜值分析、微笑检测的一些属性,过两天可能就会发布了,到时候我可以发出来让大家体验一下。
我之前也没有做过微信小程序,花了一周时间按照教程做了一个,感觉挺有意思的。在创业公司,各种可能性都会发生。不要给自己设限,更不要给自己的方向去设限。
Q10:招人的标准是什么样的?有什么事情做好了是加分项?
A10:如果从公司来看,我觉得还是一个人的劲儿!
我们老板特别看重的一个人的钻研精神,即使一个人什么都不会但是TA很有那种把一个问题抠得透彻的精神,老板也愿意要。
还有就是解决问题的思路和方法,你是怎么去看待一个问题的,即使你不会,你觉得你怎么做可能会解决。
加分项当然是有比较好的机器学习或者数学基础,因为现在数学思维是非常重要的。
我们公司是做三维人脸识别的,目前在市场上这个领域的研究还是非常少的,在这个方向上我们还是很占有优势的。
如果大家有想了解我们公司的,或者是想跟我联系的,也可以在这里面跟我们联系。我们也可以跟市场上有需要的公司进行合作,帮大家去实现智能化。