- 博客(96)
- 收藏
- 关注
原创 opengl箱子的显示
单个旋转箱子:注意要使用文件夹里自带的awsomeface.png。单个箱子:注意要使用文件夹里自带的awsomeface.png。
2024-07-01 15:26:07
914
原创 opengl+vs2013环境配置
4、打开vs2013,新建一个win32控制台程序,打开 视图-》属性管理器-》Debug|x64,右键打开属性,在VC++目录-》库目录下新增目录D:\opengl,提前在D盘目录下新建一个文件夹opengl,将glut64.lib拷到opengl目录下(记得将glut64.lib改成glut32.lib)====================完成上述4个步骤即可以跑通vs2013 Debug x64环境=================如:C:\Windows\SysWOW64 (64位系统)
2024-05-06 10:20:06
199
原创 Anatomy of High-Performance MatrixMultiplication 论文阅读和解析。矩阵乘法GEMM的cache优化
为了高效计算矩阵相乘,并进行并行化放到GPU中运算。需要将矩阵切分成子矩阵,用子矩阵相乘的结果组合为原矩阵相乘的结果:上图是拆分矩阵的方法,M表示矩阵,X方向和Y方向的两个维度都是未知的。P表示横条或竖条,X方向或Y方向有一个方向的维度是极小的。B表示block块,X方向和Y方向的两个维度都是极小的。为了减小单个子矩阵计算量,要拆开A的整行和B的整列。不能让A的整行和B的整列作为子矩阵放入缓存进行计算。因此下图中第二列的Fig8和Fig10拆得最好,把A按列拆,使A的行不再完整,把B按行拆,
2024-04-23 13:49:20
544
原创 读入DICOM图像序列,使用marching cube重建为三维体数据,并输出为.stl格式的文件
【代码】读入DICOM图像序列,使用marching cube重建为三维体数据,并输出为.stl格式的文件。
2024-04-23 13:39:50
410
原创 VTK使用交互器来从三维体数据中提取二维切片
然后根据两点的Y坐标差deltaY,计算新的中心点center并变换至vtkImageSlice当前变换矩阵中,得到变换中心点,将其设置到原来的变换矩阵matrix中,并设置到vtkImageSlice中,最后执行interactor->Render()即可不断的根据鼠标移动刷新图像。当响应到这三个消息时,立即执行vtkImageInteractionCallback的Execute函数,以便实现切片的实时提取和更新。这样在鼠标移动时,只有在确定切片提取标志为1时,执行切片提取功能。
2024-04-05 13:25:03
1036
原创 VTK的交互器
也就是说,当vtkRenderWindowInteractor(实际上是它在平台上的具体一个子类,比如在Windows平台下会使用vtkWin32RenderWindowInteractor)看到依赖于平台的事件时,它会使用。4.将对象iren初始化Initialize,调用Start开始进行交互;Start()方法表示开始进入事件响应循环,交互器处于等待状态,等待用户交互事件的发生。r能捕捉渲染窗口中的鼠标和键盘事件,并将这些事件转变为对相机、演员和属性对象的相应操作,具体的转变由交互方式确定;
2024-04-05 13:09:16
931
原创 VTK的派生子类观察者-事件回调方案
派生子类是在vtkCommand类派生的子类内定义一个Execute()函数。在主函数内用这个子类定义一个指针,将指针加入观察者。
2024-04-03 17:27:06
151
原创 VTK的观察者-事件回调方案
calldata:是执行vtkObject::InvokeEvent()函数时,随着回调函数发送得数据,比如说,当调用ProgressEvent事件时,会自动发送当前的进度值作为callback。clientdata:是与VTKCallbackCommand实例相关的数据,简单地说,是指回调函数里需要访问主程序里面得数据时,由主程序向回调函数传递的数据。1.创建一个VTKCallbackCommand对象,并调用VTKCallbackCommand::SetCallback()函数设置所定义的回调函数。
2024-04-03 17:21:56
362
原创 矩阵乘法优化:GEMM中如何将大矩阵切割成小矩阵
此时运算 ops 为 2∗m∗kc∗nc ,同时做的数据搬运量为 kc∗nc+m(kc+2nc) ,我们期望做最小的 io 产生最大的计算,即。就已知的情况来看,fp32 GEMM 极限可达到 10-11 gflops 左右(即 CPU 峰值的 80+%,packA 和 packB 开销跟着矩阵形状走大约是20%),结合具体的任务,例如 2D 卷积、全连接,可以做到 90% 左右。先做第一次拆分,取 A 的 kc 列(PanelA)和 B 的 kc 行(PanelB),得到待累加的一部分结果;
2024-04-01 11:24:26
1392
原创 VTK中polydata的属性数据结构表示和用法
在VTK中多边形数据集是由顶点、多顶点、线、多线、多边形各三角带构成,多边形数据是非结构化的,并且多边形数据集的单元在拓扑维度上有多种变化,顶点、线和多边形构成了用来表达0、1和2维几何图形的基本要素的最小集合,同时用多顶点、多线和三角形带单元来提高效率和性能,特别是用一个三角形带表达N个三角形只需要用N+2个点,但是用传统的表达方法需要用3N个点。是排列在矩形方格中的点和单元的集合,线性网格的拓扑结构是规则的,但其几何结构只有一部分是规则的,也就是说,它的点是沿着坐标轴排列的,但是两点间的间隔可能不同。
2024-04-01 10:52:58
1209
原创 VTK对属性参数的设置,以及用vtkFieldData存储属性数据的方法
字段的模型是一个m × n的数据值矩阵,其中m是元组的数量,n是组件的数量。)该字段假定是由一个或多个数据数组组成的集合,其中数组中的数据是不同类型的(例如,int, double, char等),并且每个数组中可能有不同数量的组件。注意,假设每个数据数组的长度为“m”(即元组的数量),这通常对应于数据集中的点或单元格的数量。Interpolate使用提供的权重从源数据中选择的元组进行插值,以在目标数据中生成新的元组。vtkFieldData用来存储数据的属性数据,该数据是对拓扑结构和几何结构信息的补充。
2024-03-26 09:40:55
713
1
原创 在VS2013中搭建opengl环境(glfw+glad+glm)
清单列表命令行:/verbose /out:"Debug\glfwtemplate.exe.embed.manifest" /nologo "Debug\glfwtemplate.exe.embed.manifest.res"
2024-03-18 15:46:38
479
原创 VTK中GetOutput()、GetOutputPort()和GetOutput()的区别
GetOutputPort() 返回的是输出端口(output port)的引用。它是一个用于连接到其他算法输入端口的对象,通常在构建VTK管道时使用。
2024-03-18 15:09:54
362
原创 裁剪分割-vtkClipVolume-vtkSelectPolyData类
【代码】裁剪分割-vtkClipVolume-vtkSelectPolyData类。
2024-03-17 10:23:01
289
原创 Anatomy Of High Performance Matrix Multiplication 高性能矩阵乘法剖析
下图左边是一个非常简单的多层内存模型,只有寄存器/ cache/RAM。在这种简单模型结构下考虑优化GEBP,Cmc,n+=Amc,kcBkc,nCmc,n+=Amc,kcBkc,n,其中3个假设基于以上三点假设,上图中GEBP的RAM和cache之间的数据搬移开销为mckc+kcn+2mcnmemops而Cj:=ABj+Cj的计算量为2mckcnflops,那么计算量和数据搬移的比例。问题变成,现实中kckc的选择还受一些其他因素制约,我们将在6.3章节看到。类似地可以分析GEPB和GEDOT操作。
2024-02-19 13:43:13
802
原创 【Python】使用vtkJPEGReader从一个目录中读取50张二维图像,将它们使用marchingcube转化为vtkImagedata的三维体数据,并保存为.stl格式输出
请注意,你需要将"input_directory/"替换为你实际的输入目录。
2024-01-19 09:57:16
565
原创 VTK拓扑结构的使用以及不同维度下的操作
在上例的基础上做一些更改,将零维的点拓扑结构改成一维的线拓扑结构。这里实例化了一个vtkCellArray的对象,前文说“点数据(Point Data)定义数据集的几何结构,单元数据(Cell Data)定义数据集的拓扑结构”。所以,vtkCellArray类型的对象vertices就是用来指定数据集polydata的拓扑结构,而polydata的几何结构则是由points来定义的。只有几何结构,没有拓扑结构的vtkDataSet。此处定义的数据集的拓扑结构是零维的点,即单元类型是Vertex(顶点)。
2024-01-19 09:16:47
665
原创 ITK imagedata三维体数据与VTK imagedata三维体数据的互相转换
【代码】ITK imagedata三维体数据与VTK imagedata三维体数据的互相转换。
2024-01-16 10:50:54
468
原创 多帧的DICOM二维图像转化为VTK的imagedata格式三维体数据(C++)
对于多帧的DICOM数据的三维重建,由于VTK不支持多帧数据的直接读取,因此可以利用DCMTK库先读取DICOM数据,再将其转换为vtkimagedata进行后续处理。
2024-01-16 10:49:16
780
原创 VTK将二维图像向三维空间中无参数化的曲面表面进行纹理映射(含代码)
而对于简单的参数模型,可以方便地建立模型与纹理空间的映射关系,例如。,例如,如果要实现重复纹理,只需通过 vtkTransformTextureCoords::SetScale()将纹理坐标每个方向进行放大,如由[0,1]变换到[0,101即可。而根据图形学三维空间变换容易实现模型空间到屏幕空间的变换,因此最终显示在计算机屏幕上的图像即是纹理映射后的结果。实现纹理映射主要是建立纹理空间与模型空间、模型空间与屏幕空间之间的映射关系。的纹理映射技术,通常需要将纹理空间到模型空间的映射分解为两。
2024-01-08 13:10:59
640
原创 Marching Cubes算法再回顾
三维空间中,平行且相邻的两个二维图像(每个图像中的正方形四个像素顶点组成一个基本的像素图像单元)组成一个基本的三维图像单元。一般来说,会出现一个角点在内,一个角点在外,则角点之间的连线(也就是体元的边)必然与等值面相交,根据这个原理就能判断等值面与哪些体元相交。找到含有等值面的体元之后,接下来就是确定等值面与体元边界的交点,体元间的数值都是呈线性变化,求交点时一般采用的是线性插值,如。间距是体素的高度、长度和宽度,或相邻像素之间的距离,这取决于是将数据视为相同的方框还是连续函数中的样本点。
2024-01-08 10:04:39
1605
原创 UNET和FCN的不同
按照论文中的解释,镜像填充的原因是:因为图像 的边界的外面是空白的,没有其它有效像素,而我们预测图像中的像素类别时往往需要参考它的周围像素作为上下文信息,这样才能保持分割的准确性,为了预测边界像素,论文对边界区域进行镜像,来补全边界周围缺失的内容,然后进行预测。大型网络的优点是更强的图像表述能力,而较为简单、数量少的医学影像并没有那么多的内容需要表述,因此也有人发现在小数量级中,分割的SOTA模型与轻量的Unet并没有优势。医学影像往往是多模态的。,而不用要求所有的训练图像和测试图像具有同样的尺寸。
2023-12-06 11:23:57
630
原创 语义分割网络FCN
于是FCN把conv4中的特征对conv7进行2倍上采样之后的特征图进行融合,然后这时候特征图的尺寸为原始图像的1/16,所以再上采样16倍就可以得到原始图像大小的特征图,这种模型叫做FCN-16s。输入图像经过卷积和池化之后,得到的特征图的宽高相对原图缩小了好几倍,所产生图叫做heatmap----热图,热图就是我们最重要的高维特征图图,得到高维特征之后就是最重要的一步也是最后的一步对原图像进行upsampling,也就是上采样,将图像进行放大直到到原图像的大小。这时候就需要物体的一些细节特征。
2023-12-04 13:49:13
173
原创 图像语义分割算法(FCN/U-net)
另外,还有一个问题在于,patch的大小(对context的使用)和定位的准确性这两者之间具有一个trade-off的过程,patch越大,能利用的信息就越多,但是max pooling也更多,导致分类的结果不一定就是中心点的类别,有可能会受到其它点的影响,因此定位会不准确。除此以外,由于U-net处理的是尺寸较大的医学图像,因此也需要切分成小一些的区域分别进行训练,为了处理边界问题,对于大图内部的小区域,可以切的大一些,然后输出只保留内部的部分(相当于用周围真实的图像内容进行镶边);然后将三者进行求和。
2023-12-04 13:44:51
258
原创 YOLOV1 每个网格预测的两个bounding box是怎么得到的
可以想象,一开始的时候,权重是随机的,面对抽象出来的图像的feature信息,其预测的box的信息、confidence的信息、物体类别的条件概率都是随机的,经过了loss函数进行惩罚与优化,使得预测行为越来越好。如此反复进行,直到权重参数调整到这样的情况,面对同样的grid cell,其计算出来的box的信息完全与ground box的位置符合,confidence=1,正确类别的条件概率为1。的宽度和高度相对于整幅图片的宽度和高度的比例,比如图中的框住狗的蓝色网格的宽度。),以及该网格包含的物体属于。
2023-11-16 15:45:53
890
原创 YOLO的bounding boxes
并且为 S x S(S = 7)个grid,如果物体的中心落入该grid中,那么该grid就需要负责检测该物体。YOLO使用了 7×7 网格 (S×S)、2 个bounding boxes (B=2) 和 20 个类别 ©。网络输出就是一个 S × S × (5×B+C)。3.每个框还要负责预测这个框中的物体是什么。4.综上,S×S 个网格,每个网格要预测。1.YOLO将输入的图片resize成。3.2.2 预测形状。
2023-11-13 11:32:56
446
原创 YOLO V1中关于bounding boxs的部分要点
函数公式中 x, y 是使用 平方差值 来描述,而对于 w, h 使用了根号,是为了检测小物体时候,减小偏移量小的时候对于小物体的的敏感度。平方置信度与真实值之间的差异(分为不同的情况讨论:前景(要检测的物体)、背景(无目标处))每个点只有两个候选框,小物体考虑的少,检测效果一般,多标签检测效果不好。网络中,每个 cell 只预测一个类别,若物体的位置重合时,检测困难。对应的损失函数要尽量减小预测值与真实值之间的差距。每个框还要负责预测这个框中的物体是什么。损失函数中的系数,是相应的权重。
2023-11-13 10:07:04
583
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人