雷锋。com:这是雷锋字幕组整理的技术博客。
翻译|王泽珍整理|范姜
我为狗脸识别做了一个深度学习ios应用,想把这些经验分享给大家。
我是一家初创公司的软件工程师。我曾经在谷歌工作过一段时间,做谷歌财务图表和多收件箱,负责谷歌地图业务。最近开了一家叫Spring的购物公司。同时,我也是一名企业家,业余时间喜欢做一些副业。
几个月前,我开始为狗狗拍照app做人脸滤镜。当你把应用程序指向你的狗时,应用程序会将过滤器应用到狗的脸上。有9200万张标记为Dogsofinstagram的照片——你可能会发现有些用户不在其中——创造人们想要的东西是一种额外的动力:
我需要
建立一个深度学习模型,提取狗的面部特征。 在iPhone上实时视频的顶部运行 使用ARKit显示3D过滤器(二维的表示不是那么酷)从对深度学习一无所知到做好一个app。我想分享一下我每一步学到的经验。
希望刚接触深度学习的人会觉得这些方法有用。
第一步:深度学习大多是现成的
我需要回答的第一个问题是“这可能吗?”。我的问题好处理吗?应该从哪里入手?
一些简单的搜索告诉我应该学习TensorFlow对象检测教程,研究论文,或者如何用现成的代码构建一个带有包围盒的检测器。
我的问题似乎是可以解决的(人们在我需要的范围内得到各种各样的结果),但是在我的用例中没有现成的东西可以使用。试图弄清楚如何修改现有教程是很烦人的。
在看博客文章的过程中,我开始转向最基础的网络课程,从基础开始。事实证明,这是一个非常好的决定。
在这个过程中,我学会了:
Andrew Ng的课程是关于卷积神经网络的课程(这是关于深度学习的一系列课程的第三部分)是学习应用于计算机视觉的基础概念和工具的一个好地方。没有它,我什么也做不了。Keras在TensorFlow上是一个高级的API,它是最容易使用的深度学习模型。TensorFlow本身对于初学者来说太底层,会让初学者感到困惑。我确信Caffe/PyTorch也很棒,但是Keras真的帮了我的忙。Conda是管理python环境的一种很好的工具。Nvidia-docker也很棒,但是只有当你可以使用GPU的时候才有必要使用它。刚开始的时候,你很难从网上教程中学到最基本的概念。如果你是从更适合自己的课程或者书籍中学到基本核心概念。这会让你的学习更容易。
第二步:了解如何实现特征点检测
有了最近发现的基础知识,我开始研究如何实现自己的定制模型。
“物体分类”和“物体检测”是今天现成的。我想做的不是这些,而是后者。在文献中,这个词是“地标检测”,所以用术语来概括我想做的事情更方便。
现在,一个新问题。什么样的模式好?我需要多少数据?怎么给数据贴标签?如何训练数据?什么是好的最低可行开发工作流程?
第一个目标是运行一些程序。我可以做一些工作来提高未来的质量。俗话说,先学走路,后学跑步。
我的心不得不:
我用来标记左眼/右眼/鼻子的工具,自己设计的,起来很糟糕,但是很实用。 建立自己的数据对用户界面进行标注是一个非常好的想法。其他已有的标签对我来说没用,它们只适用于Windows,要么就是做的太多了。后来,当我需要对我所标注的数据进行修改(比如添加新的特征点)时,这种灵活性确实很有用。标记速度很重要。我每小时至少可以标记300张照片。即每12秒就可以标记一个图像。标记8000张照片只需要26小时。如果你想标记数据的真实数量,那么每一秒都很重要。建立我自己的标记集有一定的前期成本,但实际上帮助了你之后的工作。手工标记数据可以让你很好地了解模型的内容。预处理图像最初看起来像是一个细节,但后来证明是很关键的,我花了几天时间来理解如何修改它。查看Stack Overflow上的解答——是否在正确的位置调用preprocess_image是程序是否运行的关键。虽然并不是很精确,但程序已经可以就位了。一个模型输出并不离谱的东西,这让我很开心。这种微妙的黑匣子感觉——当你在正确的地方做正确的事情时,你就会成功——几乎存在于每一步。
跟踪缺陷,识别问题,缩小问题范围——这在一般软件工程中是很正常的——在今天的深度学习开发中并不那么容易。
对于我这样的初学者来说,发现这个问题似乎是梦幻和偶然的,而不是仔细考虑的结果。不知道这个行业有没有人知道怎么做好这个——感觉更多的是大家都在努力解决这个问题。
大约三个星期后,我做了一件事:我可以给数据贴上标签,在上面训练模型,用照片在Jupyter笔记本上运行模型,然后得到真实坐标(带可疑位置)作为输出。
第三步:确保模型在iOS上运行
现在我有了一个简单的工作模式,我的下一步就是保证它能在手机上运行,并且运行的足够快。
Keras/TensorFlow模型不能在iOS上本地运行,但苹果有自己的神经网络运行框架CoreML。跑步。iOS上的mlmodel可以通过教程代码来完成。我被这么简单的过程征服了。
然而,即使是这个简单的转换步骤(从。h5至。mlmodel)并非没有挑战。
苹果的工具(叫coremltools),把一个. h5模型转换成mlmodel模型,是半成品。安装了pip的版本不能开箱即用,我只好用python2.5从源代码构建,在conda环境下打补丁。嘿,至少有用。
要想弄清楚如何在手机上对输入图像进行预处理,难度出乎意料,正如模型所预期的那样。我在stackOverflow上提问,或者搜索博客帖子,都没有。我终于通过给Matthijs Hollemans发一封奇怪的邮件找到了我的答案。令我惊讶的是,他的回答让我摆脱了困境!他甚至有一篇关于这个问题的博文。没有他,我也不会找到这篇文章。
事实证明,整个深度学习工具链还在开发中。在深度学习领域,事情变化很快。
另一方面,我喜欢群体小而有活力,互相帮助的感觉。如果你和我一样有点困惑,不要犹豫,发邮件问。最糟糕的是没有答案。顶多有个好人帮你。就像Matthijs一样。谢谢!
我的模型在真实机器上以每秒19帧的速度运行,就像一个神奇的划时代事件。有了这个基础,现在就可以全身心地投入到提高质量上来了。
第四步:让模型运行得更完美
这确实需要一些时间。在深度学习模式之外,如何做才能让自己的产品表现出色?更多数据?用不同的顶级?使用不同的损失函数?在图层中使用不同的激活参数?太麻烦了!
循序渐进好像是最好的。继续测试、培训,并与之前的操作进行比较,看看哪种方法有效。一开始用少量数据,慢慢扩展数据集。数据量少意味着训练时间更短。一旦用大数据集完成训练。一次运行等待24小时是很常见的,这并不是一个真正快速的迭代。
数据扩展是会出错的代码。可以一开始就跳过这部分,运行的时候不要运行这部分代码,然后再稍微添加一下数据扩展部分的代码。确保代码稳定。你的模型应该和你输入的数据一样好。准备好的时间会被浪费掉,准备好学习最佳实践也需要时间。你必须继续前进,继续做下去,否则你不会从错误中吸取任何教训。去吧,勇于犯错。
这是我尝试做这个项目时学到的:
这一点似乎显而易见----使用TendorBoard对迭代开发能够达到数量级的提高从我的数据生成器中对图像数据进行调试,这能帮助我找到影响我模型的图像处理的Bug。就像我对镜像照片时,虽然我并没有交换左右眼。和那些经常训练模型、有经验的人进行交谈,这节省了我很多时间。一个罗马尼亚的机器学习团队和几个慷慨的朋友证明这很重要(感谢Csomin Negruseri , Matt Slotkin , Qianyi Zhou以及Ajay Chainani)。让别人来主动问你遇到什么困难,这是不可能。 通常来说,不按照默认规则来做并不是一个好主意。比如,当我尝试着用fisheries competition上发布的一个博客做顶层时-- 博客里面的使用了 activation='relu' ,虽然顶层呈现出来的结果很不错,但是 activation='relu' 并不好。当我试着使用我自己的L1 LOSS损失函数时,呈现的结果比更加标准的MSE loss损失函数差很多。编写一个数据生成器很有必要。数据扩充很重要。当你运行教程时,在几百张图片上学习和训练第一个模型,一个CPU就足够了,使用GPU会显得累赘。在GPU上使用一个真实的数据集(8000张图片)和一个数据生成器(80000张图片)进行训练十分重要,即使它要花24小时。亚马逊的GPU对个人开发来说比较昂贵,在24小时一次的迭代当中,大概每小时花一美元,花费会迅速增加。谢谢Cosmin让我通过SSH进入你的电脑,让我能够免费使用你的GPU。测试有点不准确。当然这只是我测试用的狗头,亚马逊买的狗口罩。从来不动,一直开心的看着镜头!
虽然不完美,但是最后的结果还是挺好的,足以做一个app。
而且我觉得如果我是全职的机器学习工程师,很有可能做得更好。
但是和其他产品一样,最后的20%的过程会占用80%的时间,我想我必须在下一个版本中包含这部分工作。
如果你对你的产品不那么感到羞耻,你可能需要花很多时间来完成这些任务,尤其是业余项目。
第五步:构建iOS应用程序和过滤器,然后将它们集成在一起
有了足够好的模型,现在就可以放到Swift和ARKit上了,而且已经证明SpriteKit可以用于2D内容。IOS和它的框架还是让我印象深刻。如果你没看错的话,这几天在手机上能做什么真的很刺激。
应用程序本身就很基础,一个大记录按钮,一个滑动开关滤镜,一个分享按钮。
大部分工作是研究ARKIT,然后找出它的局限性。如何将3D模型放入,如何从场景、灯光、动画和几何图形中添加和移除这些模型
我在这个过程中学到了:
ARKit很好。是的,添加3D内容很容易,很有意思,API也很棒。一旦你把某样模型放到场景中,它就很马上起作用。ARHitTestResult表明,通过图片中的像素,它会返回给你像素的三维坐标,确实有用但是精度不够好。结果中百分之七十是在正确的位置,百分之三十出现在了错误的位置。这给我把过滤器应用在脸部识别上造成了困难。备用计划:构建二维的过滤器。 SpriteKit,苹果的二维游戏引擎,使用起来十分简单--这个引擎有一个内置的物理引擎。使用和学习起来很有意思(虽然表面上是这样)。第一代ARKit技术结合CoreMl让我大开眼界。
几周之内,我就可以在实时摄像头视频流上运行我的深度学习模型,提取面部特征点,用Arkit显示三维内容,用SceneKit显示二维内容。加工精度挺好的。
就在两年前,SnapChat不得不花费1.5亿美元收购一家拥有类似技术的公司。现在iOS免费提供人脸标志检测,不像我的ARHitTestResult,准确率很高。这项技术的迅速商业化令人难以置信
再过几年,一旦iPhone背面出现红外斑点,你的环境3D贴图应该会变得相当不错。
摘要
感觉对深度学习的应用、人工智能的普及、iPhone、ARkit、SpriteKit、Swift目前的表现都有很深的了解。
现在你找不到现成的深度学习模式,因为与深度学习相关的东西都不是很常见,但以后情况会有所改善。
如果你跳过一些必要的步骤和一些必要的限制,对我来说就像是这个博客中的技术应用。
我不用深入神经网络的内部细节,也不用直接接触任何与张量流有关的东西。
高层的Keras就够远了。基于卷积神经网络的一周在线课程,足以满足我的需求。当然,这不会让我成为专家,但会让我把可用的产品降到最低。
我开始相信,苹果必须在手机业务之外开发增强现实技术。当他们推出Magic-Leap-Equivalent产品时,构建增强现实将变得非常容易。ARKit已经让人印象深刻了。
经过这次练习,我对深度学习有了更深的理解,尤其是计算机视觉,感觉像变魔术一样。
能从照片这种简单的东西中提取出来的结构化数据的类型会让人难以置信。买什么狗狗玩具,还剩多少狗粮,喜欢什么狗粮,什么时候带狗狗去看兽医?你将能够从像你的照片这样简单的事情中知道你和你的宠物(或你的宝宝,或你的伴侣)之间关系的一切。
谢谢阅读,希望对你有帮助。如果你有什么建议,不要犹豫,我愿意把我的申请做得更好。
在app store下载这个app,让我知道你的想法。雷锋网雷锋网
另外,非常感谢Cosmin Negruseri、Matt Slotkin、周和Ajay Chainani帮助我完成申请并审阅本文。感谢安迪·博斯为这个应用程序提供了最初的想法。
原文链接https://medium . com/octavias-ideas/what-ive-learn-building-a-deep-learning-dog-face-recognition-IOs-app-afd1 EB 168 ad 2
雷锋字幕组正在招聘
备注“雷锋字幕组+名字”加入我们
1.《狗脸识别app 我是这样从零开始用深度学习做狗脸识别 ios App的》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《狗脸识别app 我是这样从零开始用深度学习做狗脸识别 ios App的》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/shehui/720272.html