免费发布信息
机器视觉与深度学习
  • 地址:江苏 14.156.31.*
    • Q Q:QQ在线交谈
    • 微信号:
    • 联系人:机器视觉设备
    • 电话: 点击查看完整号码
      • 东莞机械网提醒您:请您在接受平台商家提供的服务前,注意核对商家的身份并提前确认商家提供的产品/服务是否符合相关法律规定。谨防上当受骗!
  • 信息详情
接触视觉算起来有好几年了,每过一段时间都会对视觉有新的思考。慢慢的我发现这些零碎的思考拼出来一幅比较大的图景,这里把它记下来。因为我做过的项目都是从实际需要中来的,所以都是一些关于实际应用的感悟。

思考框架
碰到一个视觉相关的任务,我们应该怎么去思考它?应该用什么方法,效果又怎么把握?之前有人问匹配该不该用深度学习,这里就把这个作为例子来分析。

第一点是对视觉的理解。大家知道,目前我们对于视觉的原理所知甚少,不过还是有几个可以确定的,在这里我们可以归结为这么几条:

纹理、颜色、边缘;空间相关性,是局部就能识别,还是要全局。

好了,剩下的就是说不清的直觉了。也许你要问了,这么几条也算理解?没错,这么简陋的几条可以说就是大部分机器视觉工作的依据。在这么几条范围内的,一般都能找到比较好的机器视觉方法解决;范围以外的,以前没什么好办法,最近可以试试深度学习。

所以,第二点就是对目前视觉算法势力范围的了解。这一点是很重要的,并不是什么火了世界上就只有这个。通过边缘、纹理等基础操作能完成的任务我们就叫基础任务吧,这些都是机器视觉的领地;高级的、说不出所以然的任务一般都上深度学习了,比如人脸识别,以图搜图等等;还有一些针对性非常强的算法跟任务,这种任务往往没什么扩展性,算法也属于一把钥匙开一把锁,一般是一些大神拍脑袋拍出来的神迹,比如去雾算法dark channel prior。

第三点是对任务的了解。以形状匹配为例,这个任务的精髓已经被名字概括了,就是识别只能凭形状,其他纹理、颜色都不能纳入考虑范围,否则generalization不行。值得注意的是,真实场景的任务可能不完全是形状匹配,有的时候可以考虑其他因素。因此,这个任务可以只凭边缘解决,被划入机器视觉的范围。

第四点是对常用算法的了解。比如形状匹配任务,我们可以考虑的有形状匹配(此处指算法),detection网络。形状匹配算法只利用到离散的边缘方向,速度很快,理论上100万像素只需20毫秒,而且对于光照等干扰有很强的抗性,识别率基本100%,而且容易理解,碰到不理想情况可以快速上手调整参数。可以说,只要人眼能看到这个形状,算法就能很好的工作。

网络的方法要达到同样的效果基本不可能。首先是generalization,为了排除颜色、光照等因素,网络往往需要大量的样本,并且要排除的因素越多需要的样本越多,最终的识别率肯定也会下降;识别率来说,基本95%已经是上限,可能保证识别的时候光照等因素完全没变化能到99%吧;速度也不行,就算配上GPU,100万像素恐怕也得1s了。

机器视觉
机器视觉一个特点是真的有用,或者说本身就是把有用的一些算法收集起来。

根据上面的分析,我们基本能得出一个结论:碰到机器视觉能解决的任务,可以很可靠的完成,其他情况都只能用深度学习完成90%多,90%够的话就好说,不够的话也没什么办法。。那么问题来了,哪些任务能被机器视觉解决?我之前也不是很清楚,不过看了halcon的手册之后我了解了很多,每次看到一个案例我内心都是这样的:


举几个例子。

识别划痕,或者类似的路上的裂缝。我看到这个第一感觉是用边缘,简单试了下效果不好,提的到处都是;之前也见过用深度学习直接segmentation的,不过这里的dynamic threashold + blob analysis明显更好。


这个halcon没太说明白,我估计就是利用局部性的特点,把patch抽出来算一下特征然后比较,效果不错。



基本操作,有时候加个tophat去下渐变光照。挺简单,不过对这种情况很实用,第一次见到这效果还挺惊讶的。


形状匹配,不用多说:


3D匹配,原理就是PPF,厉害的是识别很准,速度0.14s,应该是在cpu上,相当快了。


可以看到,这些基本原理都很简单(实现可能有点复杂,还有很多细节优化),但确实能解决相应的问题,非常实用。这些简单的算法能这么可靠,我感觉是因为它们捕捉到了一些intuition,比如形状匹配,离散的边缘点组合起来不就是那个形状吗?

深度学习
随着深度学习在高级任务上攻城略地,不可避免地开始入侵一些机器视觉的领域,最为明显的就是每个人现在在做视觉都会问一下深度学习能不能上,典型的就是缺陷检测,detection这些任务。这里就讨论下,在传统方法效果不好的时候怎么上深度学习?

首先我们要了解深度学习的基本套路,简单来说就是那几个网络+常用tricks。这个学起来比较容易,开源资料非常多。

然后是对任务的适配。深度学习的一大缺点是要泛化的因素越多,对样本需求越大,所以我们要尽量减少变化的因素。比如如果我们能确认任务有局部性的特点,可以先把图像分割好喂给网络;光照什么的保持恒定就不说了,一般传统方法也需要尽量保持;然后如果能用其他方法定位就尽量先做好,保证网络只需要分类。总之是能让网络少干点就让它少干点。

打个比方,深度学习就像轰炸机,要么准备充足的弹药,要么得先派侦察兵(自己)去缩小一点轰炸范围。想精准打击?对不起,原理搞不明白的情况下还做不到。

以上还比较简单,我感觉难的是工程问题。比如速度怎么优化?不同平台怎么部署?这些很重要也很难,不过有大佬专门在解决这个---tvm。由于大佬太强了,开源也天然有统治力,以后做这方面的可能都要靠tvm恰饭了。(真的,我觉得这很可能成为现实)

最后对深度学习的优缺点要清楚。

优点是省心,对于一般的工业应用来说也不用想着怎么改结构,准备好数据喂它就行。这主要是因为大佬们前几年把结构都研究的差不多了,还大部分都开源,更恐怖的是现在已经开始上NAS去自动搜索。我的感觉是应用这块属于深度学习的下游,会follow大佬们的成果就可以了。当然,如果任务特殊,可能还是需要稍微调整下后面的损失啊输出啊什么的。

缺点是需要的数据很多,并且每改动一个目标就又要去搜集大量数据。数据量最少100吧,还得丰富些(丰富很重要,理论上变化一个像素点就有255的3次方种可能,光比数量一张图就够了);上不封顶,事实上看最近的大新闻大突破,需要的数据跟算力都已经不是普通玩家玩得起的了。还有个缺点之前说过,就是一般来说99%的识别率已经是上限了,够用那再好不过,要达到100%得用些其他的方法兜底。

当然,深度学习我接触的不多,以上不一定对啊。



最近发现一个有意思的事情,我们对一门技术的价值感知跟技术本身多厉害无关,跟其产生效果的模式有关。

比如DL,本身DL厉害是不容置疑的,虽然存在可解释性等问题,如果强制不准用DL,很多任务的效果指标会大幅下降;但是,由于DL开源丰富,一锤子搞完也没办法提高了,那么在劳动力市场上我只招普通应届水平学习一下弄弄就好。由于生存压力,普通应届水平显然会是一个较低且稳定的价格。

考虑另外一门技术,没有像DL一下子这么提升这么高的指标,也没有特别完善的开源能降低门槛,然后从业人员每对其研究深入一些就有效果的提升。显然,这个时候公司会衡量指标提升带来的市场价值与有经验的劳动力带来的贡献,觉得能接受其中风险时就会给劳动者开高价。开发一般就是这种类型,机器视觉也接近。

所以有趣的是,并不是技术越高端,原理复杂,甚至效果越好带来的回报就越多。我们之所以有这样的感觉,是因为很多情况下具备这些特点的技术产生效果的模式会落入第二种罢了。DL情况特殊,这些特点DL都具备,甚至效果提升更夸张,但很不幸effort---performance曲线属于阶跃信号,阶跃处的难度还被开源打没了,所以导致DL的就业市场越来越难。

其他
了解了这么多后,慢慢我开始思考有没有其他的方式。

对比机器视觉跟深度学习,可以发现一个是扎根于简单的原理做一些组合,抓住intuition就能work;一个是一股脑喂数据,凭借网络的神奇能力达到一定的效果。其实我觉得可以有另外一种思路:谨慎的探索者。

我们希望算法可以被解释,那我们可以让目前有解释的低级特征组合起来。也就是说,我们可以让算法自动尝试组合相邻的边缘、方向、blob、连通域等等,从几种可解释的基础操作开始,试图用强化学习等手段一步步发散思路来解释观察到的数据。每次成功解释之后可以显示出来给人瞧瞧,可以让人做一些反馈调整。也许可以用车道线检测来测试下这个思路,我感觉人眼看车道线的时候就是近大远小框出局部,提出长条形的blob再顺着拼起来产生线的概念。

其实人类做识别,除了说不清的直觉,剩下的也是在尝试组合这些基本特征(注意是组合,不是SIFT那样简单的比对)。我觉得这个过程才叫学习,复杂的、语义丰富的自然图像不清楚,工业零件之类的图像这样来应该比直接深度学习靠谱得多。仔细想想人看这些图像的感觉,哪有什么高级的认知在里面,所以完全有可能用算法描述出来。

其实做视觉真正应该做的就是去把这些说不清的直觉给说清楚,不过难度应该非常高。我也思考过这个问题,隐隐觉得直觉有两大块,一是3D认知,第二个就是组合。3D认知是动物跟人的共性,组合是人类特有的对符号的认知。符号认知有一部分是从3D认知里发展来的,比如最早的汉字都是像型文字,而且从来没有发展出类似二维码的符号(二维码当然也能承载信息,但没有现在的文字像3D物体(拓扑结构的感觉?有点说不清)),这说明3D认知与符号认知至少会共用一部分模块。还有一个例子是adversarial examples,跟二维码类似的乱码图片可以误导网络,说明这种确实是可以承载信息的,但不是人类的方式。方式很重要,面对视觉这种高维信息,方式或者说先验、bias就是泛化能力的保证。

当然,以上都是我瞎猜的。


学习
最后谈一谈我对学习的感悟,就是怎么学才能最快最好地掌握视觉知识?

谈这个其实要谈一个更基本的问题,就是学一门知识,我们究竟应该学什么。常见的论调有这么几种:

掌握底层,越底层越好;

越难越好,难的都会了就代表你学会了;

别扯这么多,直接找个项目开干,用到什么学什么。

这些论调都有些道理,不过也都有些没道理。比如越底层越好,你写代码用到的编译器,跑代码用到的操作系统,跑操作系统的芯片,做芯片的光刻机都要仔细研究下吗?越难越好,那现在大家应该都在研究深度学习的数学原理了;直接找项目做,一开始啥都不会的话也不知道该去学什么吧。

所以,学习一门知识应当根据它本身的特点跟自己的需要来学。有的知识就像开车,车本身是很复杂的,但开车要学的并不是很多;有的知识又像走迷宫,不亲自把每个角落走一遍就不知道该怎么走出来;有的还需要去创造,去探索,这种就需要把基础掌握好之后真正做项目去在实践中学习。

把握特点还是需要自己衡量。比如对于我平时的需要来说,编译原理就是开车,操作系统就是迷宫。这个倒不是功利,其实要是对车本身有兴趣去学学也无妨。不过,要对知识的边界有清晰的认识,不要在该走迷宫的时候一头扎进汽车制造与维修。

知识的特点也跟目前学习资料、开源代码的丰富程度相关。比如在做形状匹配之前,为了稳定可靠地识别个圆我尝试了hough变换、聚类、降噪、edcircle(edge drawing circle)各种方法,这个时候我感觉就是走一个带战争迷雾的迷宫;现在再做就是开车了,最多有闲情逸致的时候看看代码。也有的知识天生就是超级复杂,学几遍、给多少代码也不会,多见于数学物理,建议形而上学,不行退学。。

视觉的知识有什么特点呢?我感觉是零散,低矮,拓展性不大。首先,视觉没有一个大一统的大理论,倒是有很多小理论,而且小理论几乎都没什么深度,数学知识足够的话领悟不需要半分钟。而且拓展性也不强,不像一些物理上的知识,几乎都是一个公式打天下。但是,这并不意味着视觉很简单或没什么用。如果你将来打算做开发,实现这些视觉算法需要的编程水平还是挺高,而且还得经常琢磨怎么组合起来靠谱,就像乐器跟音乐的关系。

那怎么去学呢?首先我不是很推荐直接读那些经典书,虽然我之前是这样,但其实买回来做参考,随便翻翻就够了。CS231A的slides不错,把这个从头看到尾,里面的东西都详细查清楚,认真学完收获绝对不小。之后选一个方向深入学习,翻一翻halcon手册,查一查论文,跑一跑代码,做一做项目,这样过个几年知识水平肯定相当高了。
联系我时,请说是在东莞机械网看到的,谢谢!

  • 您可能对以下机械设备信息感兴趣
查看更多
    小贴士:本页信息由用户及第三方发布,真实性、合法性由发布人负责,请仔细甄别。
13435619118