点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
做计算机视觉,离不开CNN。
可是,卷积、池化、Softmax……究竟长啥样,是怎样相互连接在一起的?
对着代码凭空想象,多少让人有点头皮微凉。于是,有人干脆用Unity给它完整3D可视化了出来。
还不光是有个架子,训练过程也都呈现得明明白白。
比如随着epoch(迭代次数)的变化,训练过程中各层出现的实时变化。
![7b48b245dfe6a11b3aa197ccaf3e3d20.gif](https://i-blog.csdnimg.cn/blog_migrate/209be8205b40689388d1bf2106832ef8.gif)
![b38e9a7bb0f7dd5f09dbfc84d63bc2aa.gif](https://i-blog.csdnimg.cn/blog_migrate/b4fee421cc2b17a580ccce55b7fdb410.gif)
为了能更清楚地展示网络细节,用户还可以在其中自由地折叠、扩展每个层。
比如将特征图在线性布局和网格布局之间转换。
![7bf70f70c89c3398e11fe4ca95370fea.gif](https://i-blog.csdnimg.cn/blog_migrate/f5815d81297b491443b7b18d46370b2f.gif)
折叠卷积层的特征图输出。
![d262208f8dc83a5e8708cb33153f8aca.gif](https://i-blog.csdnimg.cn/blog_migrate/aa1ef3eead4a6e88e41ac5f2e0b18f8f.gif)
对全连接层进行边绑定(edge bunding)等等。
![c6cfa82b02455cc227193debf05f246b.gif](https://i-blog.csdnimg.cn/blog_migrate/0b21a37d6196d3e158e4e73be89b3f9e.gif)
这样的可视化图像,可以通过加载TensorFlow的检查点来构建。
![e20201cff2c27c6d40ed1a12e52e81cf.png](https://i-blog.csdnimg.cn/blog_migrate/1d7cf0a2abbfba5e310e89abf045ffb1.png)
也可以在Unity编辑器中设计。
![3fbd4e51da7558985285a9c81b938ca1.png](https://i-blog.csdnimg.cn/blog_migrate/98f8451ccfaa8be1f2e5a2f92cd4a6c1.png)
是不是有点鹅妹子嘤那感觉了?
最近,这个项目又在社交媒体上火了起来。
![448c565837f3b201827b44873a160476.png](https://i-blog.csdnimg.cn/blog_migrate/3223a859fd027901a8dd78d190e1860e.png)
网友们纷纷表示:
“要是能在训练的时候看到这个过程,再长时间我也能忍啊。”
“求开源。”
![cad7cb12fdf38721eff155472b2a1bf9.png](https://i-blog.csdnimg.cn/blog_migrate/1ae0cf485bbe10167ee36a02870a4e02.png)
该项目的作者,是一位来自维也纳的3D特效师。
据他介绍,之所以创建这样一个CNN可视化工具,是因为他自己初学神经网络时,经常觉得很难理解卷积层之间是如何相互连接,又如何与不同类型的层连接的。
而该工具的主要功能包括,卷积、最大池化和完全连接层的可视化表示,以及各种能实现更清晰可视化的简化机制等等。
总而言之,就是想让初学者通过最直观的方式,来get到CNN的重点。
如何用Unity搞出一个3D网络
在正式上手Unity前,作者先在Houdini软件中,搭建了一个可视化的3D网络原型。
它的节点编辑器长这样:
![97129b12870f18e52d7310a4ad81ce8d.png](https://i-blog.csdnimg.cn/blog_migrate/f2f7659955fecf44b7e9f250fdb9d0ae.png)
然后,就可以在Unity上搭建3D神经网络了。
首先,需要预设好神经网络的“形状”。
由于之前并没有用过Unity,作者先学习了着色器和过程式几何相关的知识。
这里面,作者发现了一些局限性,他采用的是Unity为着色器开发的语言Shaderlab,这个语言无法使用着色变化,只有对语义进行预定义的变量,才能让它在顶点、几何和像素着色器之间传递。
而且,它无法任意分配顶点属性,只有位置、颜色、UV等预定义属性。(可能这也是3D网络无法实时改变颜色的原因之一)
![a91ea39cc061a0a2c45e7852b5a29700.png](https://i-blog.csdnimg.cn/blog_migrate/14e791730cfab7dfea9360606d4d6b31.png)
在研究了一些实例化(instancing)相关的概念后,作者计划采用几何着色器的方法生成神经网络的连线。其中起点和终点被传递到顶点着色器,并直接转发到几何着色器。
这些线,最多可以由120个顶点组成,因为Unity允许的几何着色器能创建的变量的标量浮点数为1024。
设计后的网络形状,大致长这样:
![4964814decd5113a17f4fb36cc0d9adf.png](https://i-blog.csdnimg.cn/blog_migrate/63720f5e0eba080976a2256c5aca1168.png)
然后,就是从模型的TensorFlow代码中,生成对应的3D神经网络图像。
其中,Tensorflow-native.ckpt格式的文件,需要存储重构模型图所需的数据、二进制的权重读取和激活值,以及特定层的名字。
以Cifar10-greyscale数据集为例,需要编写一个检查点(checkpoint)文件,以及设置随即初始化的权重。
![256c708af66bc8db228bf1545862504f.png](https://i-blog.csdnimg.cn/blog_migrate/1c4cf3c22715d4ffb740de49c5904f9f.png)
在那之后,需要加载这些检查点文件、启动TensorFlow会话,输入训练示例,以便查询每一层的激活函数。
然后编写一个json文件,存储每一层的形状、名称、权重和激活函数,便于读取。然后使用权重值,将颜色数据分配给各层的Unity Mesh。
![0d0ac1951343fcee5a57f4cff60271e3.png](https://i-blog.csdnimg.cn/blog_migrate/d0bde0b6512fdc1c7cda6cbc81abccc7.png)
最终搞出来的效果,还是不错的:
作者还录了个开发视频,在文末可以找到地址。
相关研究还不少
事实上,此前已经有不少学者,进行过神经网络可视化的研究。
例如,去年5月,一位中国博士就可视化了卷积神经网络,将每一层的变化都展示得非常清楚,只需要点击对应的神经元,就能看见它的“操作”。
这是用TensorFlow.js加载的一个10层预训练模型,相当于在浏览器上就能跑CNN模型,也可以实时交互,显示神经元的变化。
不过,这还是个2D的项目。
目前,也已经有人像上面那个神经网络模型一样,做出了3D的可视化神经网络:
这个项目,同样用到了边绑定、光线追踪等技术,与特征提取、微调和归一化相结合,将神经网络可视化。
这项项目希望能借由这些技术,来估计神经网络中不同部分的重要性。
为此,作者将神经网络的每一部分都用不同的颜色来表示,根据节点和节点在网络中的重要性,来预测它们之间的关联性。
![4449967322ec382f8ed2aea65a3be987.png](https://i-blog.csdnimg.cn/blog_migrate/b2e22105ef66fda9df70f12fe895bfbe.png)
大致的处理过程是这样的:
![1a537109a2a1dd589ffb5d18e810f1b9.png](https://i-blog.csdnimg.cn/blog_migrate/113b3e8c9778dc221a6bb82f8f84fa96.png)
如果对于这类3D神经网络可视化感兴趣,可以在文末找到对应的开源项目地址。
作者介绍
![88dcbaa6099180402ab73fef1b74b31a.png](https://i-blog.csdnimg.cn/blog_migrate/3cc3e0d2ea004ad9fc28e6958225ea41.png)
Stefan Sietzen,现居维也纳,此前曾是个3D视觉方向的自由职业者。
目前,他在维也纳工业大学读硕,对视觉计算(visual computing)非常感兴趣,这个3D神经网络,就是他在硕士期间做的项目之一。
开发过程:
https://vimeo.com/stefsietz
已开源的3D神经网络项目:
https://github.com/julrog/nn_vis
好消息!
小白学视觉知识星球
开始面向外开放啦👇👇👇
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~