由于毕业设计做的是mask rcnn应用。本想找mask rcnn代码来理解整个过程,但是在不断的了解之后发现,mask rcnn代码嵌套很多,对于python的库导用也是复杂无比,现在的自己完全看不懂。无奈,只能求其次先了解整个框架结构。至少应该明白每一个代码模块都做了什么。令人失望的是,自己依旧看了很久仍不明白。在抱怨自己的愚笨之下,我搜索了网上的别人观点。发现,mask rcnn代码还很新,相对详细的框架并没有人解释。不过,在每一个介绍mrcnn的网页上都提到了是使用faster rcnn框架。为此,我沿着cnn到mask rcnn论文的历史,逐一找到rcnn,fast rcnn,和faster rcnn。rcnn和fast rcnn并不难理解,代码结果也很易懂。但是对于faster rcnn 实在是看了好久,在想象力和逻辑的一并帮助下,总算是大体明白了整个框架的理念。有了一些自己的体会和感悟。
faster rcnn中我觉得最难理解的是那个anchors也就是所谓的rpn层。当我第一次看的时候,让我觉得迷茫的是,这9个anchors到底是怎么在代码中实现的。代码框架里只有卷积层,并没有别的操作呀。一开始一直想不通,后来在偶然中回顾cnn作用于minist数据集从而用softmax来分类时才恍然大悟,其实第一次用1x1卷积核卷积时,输出的18与36维数据并不代表什么,但是将数据输入误差函数时他就有了我们给他指定的意义。也就是,我们希望这个数据变成什么,其实是有判断依据来衡量的,而不是数据本身。这也就是softmax中判断0-9这10个数字时的迭代的含义。这个观念的转变让我突然豁然开朗。就像一个沙漏,里面的沙子从上面漏到下面用时1分钟。但是你在制作这个沙漏的时候你是怎么知道多少沙子才够漏一分钟的呢?为此,你可以选择计算沙漏的颈部每秒流出沙子的量,乘以60秒从而获得总沙子的量。这就是我们从小学习的计算方法。也就是理论法。第二种方法就是你不计算这些,直接先在沙漏里放一些沙子,测试漏完用了多久,例如只用了20秒。然后你再往里面加沙子,直到刚好需要一分钟漏完。这两种方法都可以很好的完成任务,第一种用的是理论思维,需要一定的计算和度量,而第二种则更趋向于迭代和重复。这样的思想就很类似于现在这个问题的误差函数迭代。我们只有一个梯度法,通过大量计算来获得最优,虽然耗时,但是简单。这大概就是解决问题的两种思路吧。
之后就是回顾一下这段时间的cnn学习。从装python到tensorflow到GPU加速,再到最后的完美运行mask rcnn代码。真的是挫折满满。没有一个地方是顺利的,每一个步骤都用时至少3天。但是,等到真的明白,成功之后才发现,这些尝试都很有意义。这一切经验会告诉你,没什么事是值得害怕的,只要去做都会成功。整个mask rcnn之前代码我大概看了有15天吧,直到今天才大致明白一个大概,虽然进度很慢,但是的确可以感受到那种每天进步一点点的快乐。以及面对困难的不害怕和冷静耐心。
至此,mask rcnn之前历史论文算是告一段落了。在写毕业论文的同时还会继续啃mask rcnn的代码。
本文暂时没有评论,来添加一个吧(●'◡'●)