最近做的一些事情【科研/点云/Github/WxPython】

好久没写文章了,说一说最近做的事情。

7月、8月过得比较咸鱼,看了一些论文,补了一些数学,然后就去四川玩了几天,回家待了半个月。

9月份一直做点云处理相关的实验,主要工作就是设计算法、写代码。三维点云实验需要用一些三维显示的库,因为之前导师用的一直是Java3d,我也跟着用Java3d(现在看来也许用Qt3d会好些,我还踩了一些坑),然后用Java语言搭建了一个实验平台。

实验平台

实验平台需要做各种数据的导入(点云、Mesh、中间实验的参数、变换矩阵等),因此写了统一的DataLoader。

实验平台需要跑设计的算法(Pipeline),而点云处理的算法往往是一个个小过程构成,于是我用了Spring来将这些小过程变成一个个JavaBean,他们之间是存在一定的依赖关系的,比如前一个过程输出的图结构需要输入到下一个过程,把普遍用于 Web 应用的Spring 框架用在了科研中,听起来很魔幻,但是我还是做了这件事,哈哈。晒一下最新版的平台的界面:

最近做的一些事情【科研/点云/Github/WxPython】_第1张图片
实验平台UI

整体做起来还是很朴素的,但是有几个重要特性:

  • 所有的调整配置的控件都是通过Java注解自动生成的,比如我给一个字段标注了 @Param,那么抽象基类的一个具体方法会在这个算法运行前被调用并扫描所有被标注了的字段,自动生成一个Spinner或者 CheckBox
  • 平台的前后端分离,前端可以是一个GUI,也可以是终端,但是我只是多做了一层接口,没有走HTTP协议,不然前端还可以是网页了,不过从这个角度看也不算纯粹的前后端分离
  • 为中间数据添加了缓存,我使用Kryo库对算法生成的中间数据生成了缓存,通过点云的Md5和配置JSON的Md5去多级查找缓存,之前写的序列化性能测试的文章
  • 通过 Spring 管理组件依赖关系,组件不仅包括算法过程,还包括 DataLoader,缓存管理器,日志工具、梯度下降优化器等
  • 借助已经被废弃的Java 线程的 suspend()、resume() 等API,实现了算法的暂停和恢复,这个其实很有用,因为我们经常需要在算法跑到一半观察效果,以前只能挂断点,现在要方便很多了
  • 做了一个Java3d的BranchGroup的可视化管理,就是图右边那个列表,我可以控制部分元素的显示和隐藏,技术难度不大,纯粹为了调试起来方便

开源控件的缺乏

使用 Java 的最大优点就是:我对 Java 太熟悉了,以至于可以用反射、StreamAPI等特性搞一些花里胡哨的东西。但是另一个弊病就是,很多库没有

点云处理的常见的库是PointCloudLibrary(PCL),这个库是基于 C++开发的,没有 Java API,所以很多算法我得自己写。更加恶心的是,我居然找不到一个像模像样的库来读取ply文件。ply文件是一种描述mesh模型的文件,里面可以记录数据点的位置、网格边所连点的索引、数据点法向量等信息,因此可以用来描述一个点云。这么一个常见的数据格式,居然找不到一个像模像样的库来读取,我一度很苦恼。

确实,Github 上有一个库叫jPLY,但是这个库的API不支持调包即用,还需要用户多写N行代码才能把数据读到一个实体对象里面去,因此我干脆写了一个读取ply的库,放到了 Github 上,这个库我打算长期开发,现在 bug 还很多,不过不着急,反正有的是时间调整。

另外,我到 sonatype 上提交了一个申请,要创建一个用于点云处理的Java项目,现在这个玩具项目已经挂到了 Maven仓库 上。 过几天有时间的话,会写一写我怎么把项目放上去的,中间还是走了一点点弯路的。

杂七杂八

9月份白天写 Java,晚上接了个活儿,帮别人写一个桌面程序,技术栈已经被钦定了,用 wxpython,因此我还学了几天的 wxpython,算是把 Python 也给重新熟悉了一遍,以前没注意的一些基本特性都重新学习了一遍。

我把以前的个人网站重新搭建了一下,用的 Hexo,虽然几乎没有任何内容,还是放一下链接吧。

我以前总觉得 Python 这种语言不需要 getter 和 setter,现在觉得正是因为 Py 太过动态和灵活,也许更需要 getter 来防止自己犯错。。。。

你可能感兴趣的:(最近做的一些事情【科研/点云/Github/WxPython】)