本文基于ImagePy作者给群友回答问题的讨论中整理而来,阅读需要发散思维,如有不解,可以查看代码链接。

正文:

ImagePy的canvas解耦对程序员是好事,然后imagepy可以再与后面的深度学习结合,这对小白是好事,因为深度学习有很多的工作是前面对图像的处理,比如裁剪、旋转以及标注等。现在的深度学习库着眼于后面的训练,前面的图像操作是一般用的是第三方库,比如cv,两者是分离的。

其实imagepy有个问题是,开发者用容易喧宾夺主。基础功能太多了,自己加的插件都不太起眼。如果能解耦,又能快速集成,就会有开发者愿意选择.就是打开没那么多功能,就只有自己加的少数功能,就是把现有的插件都干掉,只保留框架。

我能深刻体会这句话,之前就想用imagepy做开发,但是工具太多了,给别人用也找不到,分成两个项目,一个空壳,一个插件系统。

不是重量问题,有一些开发者的目的是,树立品牌概念。做一个插件太不起眼,没动力。

如果基础组件能像plt和napari那样使用,然后又可以在空壳上快速搭建插件应用,就比较好了。

其实现在的imagepy只要把menus菜单里面的东西删光,也是一样的。那就变成了带标记和显示功能的ui。

1  sciwx初步完成

​​

sciwx是类似matplotlib的一套绘图库,不同的是组件化更好,可以快速搭建上层应用。

其实就是把imagepy里面的canvas,3dmyvi,gridtable,markdown,还有直方图,曲线面板,鹰眼什么的做成了独立控件。各种组件,画布,表格,参数对话框生成,都放到sciwx里面了。

主要是imagepy里面的ui部分,独立出来了。

ImagePy解耦SCIWX,便于开发者树立独立品牌_机器学习ImagePy解耦SCIWX,便于开发者树立独立品牌_java_02

又加了一个matplotlib式的用法。现在imagepy里面的三维,二维面板,都可以类似matplotlib的简单语法独立调用了。还可以通过实现接口,set给工具栏实现交互。

ImagePy解耦SCIWX,便于开发者树立独立品牌_java_03

除了napari的三维功能,其他的把imagepy的canvas独立出来,都可以实现。其实napari也是用了一个比较成熟的三维可视化工具包装的。

画图和普通的处理有点区别,其他的处理可以用很长时间做处理,最后刷新一次。但是画图是动一下鼠标就要更新一次,就要不停的从cpu送显存。所以napari那种用显卡可视化的,就有问题了。

除非开发局部纹理节点更新,这个水就深了。图像在opengl里面是纹理。画图如果高效一些,应该局部更新纹理数据。这个应该不是python层面可以解决的问题了。

Amira优化的似乎还不错,不过是商业软件了,没法比。路线不同,napari是gpu渲染,我现在的是cpu渲染。

不过优化得还不错了,最近支持了复数,对数展示。

ImagePy解耦SCIWX,便于开发者树立独立品牌_python_04

复数,不是提前求模,log送过去的。画布实时做采样,求模,对数。依然有上百帧率。全屏状态下40帧。

其实z和c的支持都已经很成熟了,独立出来应该还是有用。就像plt那样,三五行,show出来,多图层多通道,可以设置假彩色。canvas里面都是很极端的代码,一切性能优先。

box只是控制显示区域逻辑,还不涉及太多性能。imutil里面,写法都是在我能力范围内,优化到极致了。复数的场景是用在什么地方?傅里叶变换吧,其他的我也没想到。

2  toolbar重构

ImagePy解耦SCIWX,便于开发者树立独立品牌_python_05

这次重构的目的是

1. 组件可以当成wx的panel,放在其他UI项目中使用

2. 可以像plt,napari那样,简短的代码show出图像或表格

3. 测试插件或工具可以不需要拷贝到特定目录,可以用代码快捷加载测试

4. 可以从纯净版环境快速搭建特定的简单应用,比如标记工具

5. 现有插件全部以一个插件管理项目外部加载到纯净版

简单应用如果不想准备图标,可以用一个字母代替作为工具的logo。imagepy的定位可以是“一站式图像处理及智能识别库”。

​​

cellpose这个例子很好,imagepy正好作为胶水框架,把整个流程串起来:前端提供缩放、裁剪、标注、显示,后端集成深度学习模型,提供训练和预测

现在只是一个训练的模型,然后cellpose自己也带一个简单的ui,上面有标记功能,很简陋。先把这个提交了,然后问一下作者标记之后怎么用。

​​

ImagePy解耦SCIWX,便于开发者树立独立品牌_python_06

cellpose的那个UI,如果在ImagePy里面做,很轻松的。插件做好了,最多再做一个widget,就可以做到很定制化的程度了。

不过他这个我记得半径那个参数挺重要的,有些比较难的例子还需要调一下

那个不是磁性套索,就是鼠标轨迹。不过感觉不是用来修复的。

他们这个工作有几个非常简单的点比较有意思,第一个是他们的训练数据不是一个类别的,是非常多,非常广块状物体,第二个是他们输入之前的缩放,针对不同块状物体,可以先缩放大小再输入,输出再缩放回来。

他们好像就是用的cellprofiler+cellpose标记的他们自己的数据。

for i in range(n):

mask = img==n

xxxx 找mask的轮廓

这么写,如果图很大,并且里面标记又多,就非常慢了。

mask = img==n 这一句要反复分配大内存。没有工程化的优化思维的。

毕竟重点在机器学习

不过那个写法真的不是电脑好能抢回来的。如果图像2048平方,里面1024个碎片。这个目测就几十秒了。

为了分析一个小块label,先复制整个图像,然后做成bool掩膜。

我估计他们可能不care这些,所以问了一下需不需要帮忙优化。用的话就套个近乎,不用就算了。

3  github图看不到问题

https://github.com/Image-Py/cellpose-plgs 我刚写的,七牛云,我这里看不到图,不知道什么原因。

github做图床,怎么拿到绝对链接呢

在issue里传图,传完后就有个markdown格式的链接

githubusercontent.com 可能被墙了