ErdanC / Tooth-and-alveolar-bone-segmentation-from-CBCT

213 stars 30 forks source link

The absence of intermediate labels and the absence of segmentation networks #8

Closed Da1daidaidai closed 1 year ago

Da1daidaidai commented 1 year ago

您好,非常关注这样有意义的工作,但是在我复现代码的时候,发现中心和骨架的标签难以获取,同时,似乎分割阶段的网络并没有上传。包括分类头

Hello, very interested in such meaningful work, but when I reproduced the code, I found that the labels for the center and skeleton were difficult to obtain, and also, it seems that the network for the segmentation phase was not uploaded. Including the category header.

puppy2000 commented 1 year ago

I also find this problem.Looking foward to the author's update. 我也发现了同样的问题,期待后续的完善

yangyang117 commented 1 year ago

1.h5文件里面,'centroids'这个数据没有找到生成文件 2.single tooth segmentation里面没有模型数据,从训练文件里面看,需要{'image': image, 'label': label, 'skeleton': skeleton, 'boundary': boundary, 'keypoints': keypoints},但是keypoints等没有看到怎么生成,看到了semilabel模型,训练了一个半自动关键点模型? 3.在ins_tooth_seg文件中,提到了multi_skeleton,但是我看生成文件里面,这个是根据真实标签生成的,同时模型里面没有看到哪个模型将牙齿分成30+类别。 4.single tooth segmentation也没有找到数据生成文件,按照理解应该单颗牙齿分割,训练一个模型,对粗分割的牙齿进行细分割?那放入模型的是整个牙齿还是根据之前的牙齿结果将一部分区域放入模型? 5.多阶段训练的话,后一个阶段用的是前一个阶段的结果,还是用的真实标签作为训练数据呢?比如skeleton?

ErdanC commented 1 year ago
  1. centroid是每颗牙齿的中心,skeleton是通过skimage库计算出来的,然后每颗牙齿的coordinate与centroid和skeleton最近坐标相减就可以得到offset。
  2. keypoint从牙齿label中可以计算出来,peak 坐标。
  3. multi-skeleton在centroid clustering聚类后,mapping出来的
  4. 是根据GT将一部分区域(patch)放入
  5. 真实的标签放进去训练,centroid加扰动等
yangyang117 commented 1 year ago

1.针对问题3,公开的数据集中,同一个位置的牙齿在不同的数据中的标签不一致,你们所处理的聚类,mapping只是将单个牙齿分开吗? 2.你们在论文中提到,使用MLP进行tooth id预测,请问这种预测怎么和segment结合起来去预测的每颗牙齿的ID呢?

yangyang117 commented 1 year ago

同时,根据你们公开的代码,我在我们的数据集上测试了 输入为(tooth,sk膨胀3),计算loss时使用seg,keypoint,牙齿边缘的数据,发现相比于Vnet准确性下降很多,参数与你们代码中的参数保持一直,包括spacing,size,等参数,请问你们是在训练过程中调整过什么参数吗?

ErdanC commented 1 year ago
  1. 聚类只是将不同牙齿的instance区分开。
  2. MLP加在V-Net的feature中。
  3. 最后一步individual seg,是instance segmentation中的binary segmentation。代码中使用也是V-Net,所以比V-Net下降是指?
MinsGoing commented 1 year ago
  1. 聚类只是将不同牙齿的instance区分开。
  2. MLP加在V-Net的feature中。
  3. 最后一步individual seg,是instance segmentation中的binary segmentation。代码中使用也是V-Net,所以比V-Net下降是指?

最后的individual seg,提供的code是不完整的,复现后发现效果与文章中有差距,请问后续update吗?

ErdanC commented 1 year ago

将哪里效果不好以及segmentation statistical number发我一下?

MinsGoing commented 1 year ago

将哪里效果不好以及segmentation statistical number发我一下?

牙齿上带有孔洞,以及形态上不是很光滑

GaoHuaZhang commented 1 year ago

您好,感谢您的代码我已经生成复现了。并且在您提供的数据集上的精度和您论文中所说的差不多甚至还要好一些。我现在希望用这个训练出来的模型在自己的数据中扩充一下数据集以进一步完善。但是对于牙尖点的标注还是通过手动的。请问您方便提供一下自动提取peak坐标的脚本吗

ErdanC commented 1 year ago

你可以将训练网络的数据的一个sample保存成.nii.g发我

将哪里效果不好以及segmentation statistical number发我一下?

牙齿上带有孔洞,以及形态上不是很光滑

你可以将训练网络的数据的一个sample保存成.nii.gz发我一下(zmcui94@gmail.com)。CNN的卷积本身就会产生比较平滑的结果。所以应该是训练生成数据不对。

ErdanC commented 1 year ago

您好,感谢您的代码我已经生成复现了。并且在您提供的数据集上的精度和您论文中所说的差不多甚至还要好一些。我现在希望用这个训练出来的模型在自己的数据中扩充一下数据集以进一步完善。但是对于牙尖点的标注还是通过手动的。请问您方便提供一下自动提取peak坐标的脚本吗

Peak点是根据Z轴坐标聚类生成。我这周会把这部分脚本完善并且upload上来

lhnows commented 1 year ago

您好,我也已经复现实验成功了,不过加入我自己标注的数据之后结果反而变差了。想请教作者用的是什么标注软件?

yangyang117 commented 1 year ago

您好,感谢您的代码我已经生成复现了。并且在您提供的数据集上的精度和您论文中所说的差不多甚至还要好一些。我现在希望用这个训练出来的模型在自己的数据中扩充一下数据集以进一步完善。但是对于牙尖点的标注还是通过手动的。请问您方便提供一下自动提取peak坐标的脚本吗

你好,请问你说说的复现的精度比论文中所说的还要好一些,是做什么分割呢?是将牙齿区域(二分类)预测出来之后做的dice吗?用的toothdetection的步骤? 还是做的individual seg?如果是individual seg的话,在single tooth segmentation中就已经用到牙尖点,请问你是怎么训练的数据呢?用Vnet做seg分割的时候,class设置的是多少类呢?

yangyang117 commented 1 year ago
  1. 聚类只是将不同牙齿的instance区分开。

    1. MLP加在V-Net的feature中。

    2. 最后一步individual seg,是instance segmentation中的binary segmentation。代码中使用也是V-Net,所以比V-Net下降是指?

我是这样复现的: 1.ROI未做,使用真实数据的ROI 2.通过最外层的test.py,发现在预测过程中,inst_tooth_seg,输入的是图片,centroids,其中centroids是真实标签的sk,所以 tooth detection也未训练,使用真实标签 sk。同时在test.py中,也未发现使用(聚类只是将不同牙齿的instance区分开。) 3.通过观察ins tooth seg,我们将模型的输入定义为图像,sk(提取sk之后,膨胀),输出为 seg(二分类),牙齿边缘,关键点。 4.通过步骤3的处理,调整输入输出之后,发现相比于 基本模型: 输入为图像,输出为seg(二分类)的训练方式,dice下降3-4个点。(基本模型dice在0.96左右(为了方便,test数据集中也是随机裁剪),步骤3的模型dice在0.94左右)

ErdanC commented 1 year ago
  1. 聚类只是将不同牙齿的instance区分开。

    1. MLP加在V-Net的feature中。
    2. 最后一步individual seg,是instance segmentation中的binary segmentation。代码中使用也是V-Net,所以比V-Net下降是指?

我是这样复现的: 1.ROI未做,使用真实数据的ROI 2.通过最外层的test.py,发现在预测过程中,inst_tooth_seg,输入的是图片,centroids,其中centroids是真实标签的sk,所以 tooth detection也未训练,使用真实标签 sk。同时在test.py中,也未发现使用(聚类只是将不同牙齿的instance区分开。) 3.通过观察ins tooth seg,我们将模型的输入定义为图像,sk(提取sk之后,膨胀),输出为 seg(二分类),牙齿边缘,关键点。 4.通过步骤3的处理,调整输入输出之后,发现相比于 基本模型: 输入为图像,输出为seg(二分类)的训练方式,dice下降3-4个点。(基本模型dice在0.96左右(为了方便,test数据集中也是随机裁剪),步骤3的模型dice在0.94左右)

基本模式是指啥意思。

yangyang117 commented 1 year ago
  1. 聚类只是将不同牙齿的instance区分开。

    1. MLP加在V-Net的feature中。
    2. 最后一步individual seg,是instance segmentation中的binary segmentation。代码中使用也是V-Net,所以比V-Net下降是指?

我是这样复现的: 1.ROI未做,使用真实数据的ROI 2.通过最外层的test.py,发现在预测过程中,inst_tooth_seg,输入的是图片,centroids,其中centroids是真实标签的sk,所以 tooth detection也未训练,使用真实标签 sk。同时在test.py中,也未发现使用(聚类只是将不同牙齿的instance区分开。) 3.通过观察ins tooth seg,我们将模型的输入定义为图像,sk(提取sk之后,膨胀),输出为 seg(二分类),牙齿边缘,关键点。 4.通过步骤3的处理,调整输入输出之后,发现相比于 基本模型: 输入为图像,输出为seg(二分类)的训练方式,dice下降3-4个点。(基本模型dice在0.96左右(为了方便,test数据集中也是随机裁剪),步骤3的模型dice在0.94左右)

基本模式是指啥意思。

基本模式是指:使用Vnet,输入为image,输出为二分类的output(牙齿,非牙齿)

ErdanC commented 1 year ago
  1. 聚类只是将不同牙齿的instance区分开。

    1. MLP加在V-Net的feature中。
    2. 最后一步individual seg,是instance segmentation中的binary segmentation。代码中使用也是V-Net,所以比V-Net下降是指?

我是这样复现的: 1.ROI未做,使用真实数据的ROI 2.通过最外层的test.py,发现在预测过程中,inst_tooth_seg,输入的是图片,centroids,其中centroids是真实标签的sk,所以 tooth detection也未训练,使用真实标签 sk。同时在test.py中,也未发现使用(聚类只是将不同牙齿的instance区分开。) 3.通过观察ins tooth seg,我们将模型的输入定义为图像,sk(提取sk之后,膨胀),输出为 seg(二分类),牙齿边缘,关键点。 4.通过步骤3的处理,调整输入输出之后,发现相比于 基本模型: 输入为图像,输出为seg(二分类)的训练方式,dice下降3-4个点。(基本模型dice在0.96左右(为了方便,test数据集中也是随机裁剪),步骤3的模型dice在0.94左右)

基本模式是指啥意思。

基本模式是指:使用Vnet,输入为image,输出为二分类的output(牙齿,非牙齿)

分割的输入,你是否是用牙齿质心将每颗牙齿crop出来patch,结合当前这颗牙齿的Skl作为网络的输入?你所说的随机裁剪是指?

yangyang117 commented 1 year ago

那在将每颗牙齿crop出来的时候,怎么判断的牙齿的边界呢?即你输入模型的区域是怎么根据质心求出来的呢?根据质心与质心之间的距离,然后分半吗? 另外,是将每颗牙齿crop出来,然后output只与此牙齿进行loss计算,image里面囊括的其他区域的牙齿当作背景吗?

ErdanC commented 1 year ago

那在将每颗牙齿crop出来的时候,怎么判断的牙齿的边界呢?即你输入模型的区域是怎么根据质心求出来的呢?根据质心与质心之间的距离,然后分半吗? 另外,是将每颗牙齿crop出来,然后output只与此牙齿进行loss计算,image里面囊括的其他区域的牙齿当作背景吗?

首先,你应该完全没有看test.py的代码,里边写的很清楚patchsize:96x96x128。其次,建议你多了解一下semantic segmentation 和 instance segmentation的区别,以及instance segmentation中如何根据proposal做binary segmentation。

yangyang117 commented 1 year ago

如果你的输入是96×96×128,然后做的实例分割,那输入就是(image + sk(sk为二分类)),Vnet输入为2通道,然后预测的结果为30+类(seg),那你模型输出的bd是30+类还是2类?keypoint是30+类还是2类? 如果是做实例分割,论文中的MLP分支是实现什么任务呢?

同时你在上面的回复中提到:分割的输入,你是否是用牙齿质心将每颗牙齿crop出来patch,结合当前这颗牙齿的Skl作为网络的输入? 那么在实例分割的时候,你模型的输入是根据将CT的space更改为0.4,0.4,0.4之后,裁剪的9696128,放入模型做实例分割,还是crop出来每颗牙齿做的?从test.py文件里面看,你是裁剪的9696128,crop出来的在哪里用?怎么去做牙齿ID预测?

ErdanC commented 1 year ago

从第一个问题,你应该还是不太清楚RPN的instance segmentation是如何做的。“Vnet输入为2通道,然后预测的结果为30+类(seg)”,mask的output是二分类,只做individual object segmentation。

GaoHuaZhang commented 1 year ago

您好,我也已经复现实验成功了,不过加入我自己标注的数据之后结果反而变差了。想请教作者用的是什么标注软件?

我用3Dslicer挺快的,30颗牙大概一小时吧。但是用作者的网络训练出来一个模型后,在这个基础上refine会更快

ErdanC commented 1 year ago

您好,我也已经复现实验成功了,不过加入我自己标注的数据之后结果反而变差了。想请教作者用的是什么标注软件?

我用3Dslicer挺快的,30颗牙大概一小时吧。但是用作者的网络训练出来一个模型后,在这个基础上refine会更快

我们最早期用的是ITK-Snap和3D Slicer,近期尝试了一下Pair这个软件(试用了14天,貌似是收费的:(),感觉挺好用

yangyang117 commented 1 year ago

instance segmentation 请问是否将ROI区域检测这个模型当作了RPN模块? Tooth ROI区域检测和Centroid network,Skeleton network我默认已经训练好,使用真实标签。 1.目前关注的是Multi-task tooth segmentation network的工作。此模型的输入,从test.py看是image+sk(膨胀处理),输出是tooth root point, tooth boundary, tooth mask 。这三个输出是30+类还是2类? 2.如果是2类的话,按照上面的沟通,你的输入是96×96×128,那tooth mask得到的是一个2类的结果,tooth id通过一个MLP layers获得。 那么在此区域内存在多个牙齿,听你的意思是通过处理,进行了individual object segmentation,获得了单独的牙齿,那么怎么讲tooth id 和 这些单独的牙齿匹配上的呢?

3.从论文中看,你们说实现了牙齿ID级别的分割,即输入CT,可以获得每颗牙齿的ID(此ID只是简单的排序,还是说同一颗牙齿在不同的患者上的ID是一致的?)整个论文实现的是individual object segmentation,只是可以将每颗牙齿单独出来,并不识别牙齿的医学标签?

ErdanC commented 1 year ago

instance segmentation 请问是否将ROI区域检测这个模型当作了RPN模块? Tooth ROI区域检测和Centroid network,Skeleton network我默认已经训练好,使用真实标签。 1.目前关注的是Multi-task tooth segmentation network的工作。此模型的输入,从test.py看是image+sk(膨胀处理),输出是tooth root point, tooth boundary, tooth mask 。这三个输出是30+类还是2类? 2.如果是2类的话,按照上面的沟通,你的输入是96×96×128,那tooth mask得到的是一个2类的结果,tooth id通过一个MLP layers获得。 那么在此区域内存在多个牙齿,听你的意思是通过处理,进行了individual object segmentation,获得了单独的牙齿,那么怎么讲tooth id 和 这些单独的牙齿匹配上的呢?

3.从论文中看,你们说实现了牙齿ID级别的分割,即输入CT,可以获得每颗牙齿的ID(此ID只是简单的排序,还是说同一颗牙齿在不同的患者上的ID是一致的?)整个论文实现的是individual object segmentation,只是可以将每颗牙齿单独出来,并不识别牙齿的医学标签?

ErdanC commented 1 year ago

instance segmentation 请问是否将ROI区域检测这个模型当作了RPN模块? Tooth ROI区域检测和Centroid network,Skeleton network我默认已经训练好,使用真实标签。 1.目前关注的是Multi-task tooth segmentation network的工作。此模型的输入,从test.py看是image+sk(膨胀处理),输出是tooth root point, tooth boundary, tooth mask 。这三个输出是30+类还是2类? 2.如果是2类的话,按照上面的沟通,你的输入是96×96×128,那tooth mask得到的是一个2类的结果,tooth id通过一个MLP layers获得。 那么在此区域内存在多个牙齿,听你的意思是通过处理,进行了individual object segmentation,获得了单独的牙齿,那么怎么讲tooth id 和 这些单独的牙齿匹配上的呢?

3.从论文中看,你们说实现了牙齿ID级别的分割,即输入CT,可以获得每颗牙齿的ID(此ID只是简单的排序,还是说同一颗牙齿在不同的患者上的ID是一致的?)整个论文实现的是individual object segmentation,只是可以将每颗牙齿单独出来,并不识别牙齿的医学标签?

我们采用的ID预测是在V-Net中间的feature 引入MLP做分类,这块我们没有去讨论关于ID分类的准确性。因为临床中非常的复杂,有成人ID系统,还有小孩ID系统,很多人是在这两者之间的换牙期。所以我们只采用了成人牙齿ID系统做预测。

yangyang117 commented 1 year ago

1.请问是怎么通过MLP模块预测出来的牙齿ID系统和seg得到的结果进行匹配的呢? 2.这个成人ID系统,比如右上中切牙,在你们的标记文件中,label是一致的吗?

YangZiz commented 1 year ago

您好,我也已经复现实验成功了,不过加入我自己标注的数据之后结果反而变差了。想请教作者用的是什么标注软件?

我用3Dslicer挺快的,30颗牙大概一小时吧。但是用作者的网络训练出来一个模型后,在这个基础上refine会更快

@GaoHuaZhang 请问您是用什么方法对牙齿CBCT标注的呢,我纯用的itksnap进行标注速度非常慢

supgy commented 10 months ago

您好,我也已经复现实验成功了,不过加入我自己标注的数据之后结果反而变差了。想请教作者用的是什么标注软件?

我用自己的数据集效果也变差了,请问你知道是什么原因嘛

sakthivelj commented 9 months ago

@supgy Could you please share the details, of how you take tooth tip root points? how implement MLP for tooth id classification