原文:RSNA 2023 #4 计划剖析 —— 多图特征融合 本文是笔者在复盘角逐后的总结和输出,并不是原英文计划的间接翻译。是以能够存在一些主观了解或误差。 总览这个计划出自三位 Kaggle GrandMaster,而且与很多「暴力出奇迹」式的 Ensemble 模子分歧,它采用了怪异的架构设想。此外,在细节处置上也很是到位,该计划名列第四可以说实至名归。 由于数据集合的图片尺寸较大,而用于癌症判定的特征很是细小,是以该计划首先对图片停止了仔细的 Resize 研讨,并发现某些 Resize 方式能够会致使关键特征损坏。 此外,由于本次角逐为多张图片对应单个标签,若何公道操纵多个图像是得胜的关键,是以计划作者还提出了两种多图片融合的方式。现实上,在很多角逐中,图片融合技能都很是适用,而且可以被视为一种相对通用的处理计划。 预处置由于癌症特征凡是在全部 X 光影象图片上很是细小,所以针对 resize 也做了优化。很多 resize 方式能够会损失掉细小的部分特征,例以下图所示的仅包括一个圆环的图片。唯一 PIL 的 其次,为了确保不丧失关键的纤细部分特征,作者将部分图像增强处置放在 resize 操纵之进步行,虽然这会明显增加计较劲。其 Augmentation 顺序以下:
图片融合一先看一下原文的流程图: 流程图中包括了多个额外的损失,但这并非本文的重点,我们将关注两个练习步调(Stage): 第一步:单图练习,获得特征提取器 先不管多张图片对应单个标签的事儿,我们先将每张图片都视为一个零丁的样本,并以此练习模子(这也是绝大部分人的做法,包括笔者自己)。这一步的目标,这一步的首要目标是获得一个优异的主干收集作为第二步中特征提取器利用。 在现实利用中,最好可以在这一步就练习出优异的模子,以此确保我们可以获得高质量的主干模子,由于这对后续步调的影响很是大。 第二步:多图练习,利用 1D-CNN 做图片融合 牢固第一步的 backbone 作为特征提取器,将同一病人的多张图片输入到模子中(操纵 batch_size 的维度,可以同时提取到多个图片的特征),然后,利用 1D-CNN 来融合提取到的特征,具体步调以下:
具体的代码以下(为了演示,下面是简化后的代码,只处置单个病人的多个图片: import torchfrom itertools import combinations class MultiImageFusion(torch.nn.Module): def __init__(self): super().__init__() self.backbone = timm.create_model('resnet18', pretrained=False) self.conv1d = torch.nn.Conv1d(512, 512, kernel_size=2, padding=0, bias=False) self.classifier = torch.nn.Linear(512, 1) def forward(self, x): x = self.backbone.forward_features(x) x = torch.nn.functional.adaptive_max_pool2d(x, 1).flatten(1) # 在 bs 维度停止两两组合,比如假如 x.shape 为 (4 x 512),那末组合后的 # shape 是 6 x 512 x 2,由于 4 个特征一共有 6 种组合 x = torch.stack([torch.stack(couple, dim=1) for couple in combinations(x, 2)]) x = self.conv1d(x).flatten(1) logits = self.classifier(x) # 由于 logits 为 6 种 feature 组合的成果,这里求均值后获得 # 这个病人的多张图片聚合后的 logit return logits.mean() # 假定每个病人有 4 张图片,可以利用 batch_size 维度来构造单个病人的图片。 multi_images = torch.rand(4, 3, 224, 224) model = MultiImageFusion() res = model(multi_images) print(res) # => tensor(1.0893, grad_fn=<MeanBackward0>) 从输入输出的角度来看,该模子接管 6 张图片作为输入(batch size = 6),并输出单个 logit,实现了多张图片的融合。需要留意的是,在利用该模子时无需练习 backbone(freeze backbone)。 图片融合二除了第一种 1D-CNN 的融合,作者还提出了 transformer 的融合方式。全部架构以下图所示: 具体的流程以下:
简化的实现: import torchclass MultiImageFusionV2(torch.nn.Module): def __init__(self): super().__init__() self.backbone = timm.create_model('resnet18', pretrained=False) self.conv2d = torch.nn.Conv2d(512, 384, kernel_size=2, stride=2, bias=False) self.transformer = torch.nn.TransformerEncoder( torch.nn.TransformerEncoderLayer(d_model=384, nhead=8), num_layers=4, ) self.fc = torch.nn.Linear(384, 1) def forward(self, x): x = self.backbone.forward_features(x) # 4 x 512 x 32 x 32 x = self.conv2d(x) # 4 x 384 x 16 x 16 x = x.permute(0, 2, 3, 1).contiguous().view(-1, 384).unsqueeze(0) # 1 x 1024 x 384 x = self.transformer(x) return self.fc(x[:, 0, :]) # 假定单个病人有 4 张图片,用 batch_size 维度来放置单个病人的图片 multi_images = torch.rand(4, 3, 1024, 1024) model = MultiImageFusionV2() res = model(multi_images) print(res) # => tensor([[-1.0924]], grad_fn=<AddmmBackward0>) 这里用一个 总结这套计划最为焦点的进献可以概括以下:
|
在工作中,除了技术工作之外,我们也经常需要写一些项目的方案,当然如果公司比较大,
尽管“断直连”的基本方向已确定,但受各参与方合作意愿、政策理解角度、科技/服务能
作为运营人,写方案是必不可少的,而要想写一份优秀的运营方案,掌握框架、抓准方案的
想要做一名合格的产品经理,首先要能写好一份好的产品方案。一份好的产品方案,会在产
可能不需要再更新了,所以放在开头。因为对我这个方案不满意,所以试了其它的方案,用
2019.09.26更新:文章内容较多,前半部分主要阐述完成一份方案所需的运营思维,建议刚
这是一个故事。请各位看官老爷酌情相信。方案一方案一方案二方案二方案三方案三方案四
编辑导语:有些人在写策划方案时,总觉得页数越多,感觉准备得越充分,对策划案页数迷
听周边的同事和学员的反馈说,每次一到写方案的时候,经常会陷入一种非常焦虑的状态:
11月21日,据中国人民银行网站消息,为深入贯彻党中央、国务院决策部署,按照《长江三
制作:刘珂君、岳小乔、皇甫凌雨、冯慧文、安博文
我国正在加速进入老龄化,这是不争的事实。专家早在几年前就提出了延迟退休的方案,当
近日,中共中央办公厅、国务院办公厅印发了《粮食节约行动方案》,并发出通知,要求各
日常工作问题剖析实际的工作中,不管是项目经理还是售前工程师,给客户提供的大部分解
近日,济南市政府印发《济南市数字人民币试点工作实施方案》(以下简称《实施方案》)
无论是从事运营、策划或其他需要制定方案的岗位,写方案、改方案、执行方案都将成为你
如何保证项目实施成功?项目设计?需求报告?调研记录?项目培训?项目策划?上述提到
国务院联防联控机制11月22日举行新闻发布会表示当前,随着奥密克戎变异株快速传播我国
编辑导语:在产品经理的日常工作中,往往需要了解和收集许多的用户需求,那么,如何将
以下文章来源于泡泡Ter ,作者老1泡听身边不少朋友同事聊到他们写方案时的状态,经常
声明:本站内容由网友分享或转载自互联网公开发布的内容,如有侵权请反馈到邮箱 1415941@qq.com,我们会在3个工作日内删除,加急删除请添加站长微信:15314649589
Copyright @ 2022-2044 杭州共生网络 www.gongshengyun.cn Powered by Discuz!