藤虎网络广州网站建设郑州全网营销

张小明 2026/1/9 13:52:18
藤虎网络广州网站建设,郑州全网营销,软件平台公司,七牛云加速WordPress欢迎关注『youcans动手学 AI』系列 【动手学UNet】#xff08;1#xff09;创建 UNet项目 【动手学UNet】#xff08;2#xff09;数据加载 【动手学UNet】#xff08;7#xff09;主程序 【动手学UNet】#xff08;11#xff09;创建Unet_V2 项目 【动手学UNet】…欢迎关注『youcans动手学 AI』系列【动手学UNet】1创建 UNet项目【动手学UNet】2数据加载【动手学UNet】7主程序【动手学UNet】11创建Unet_V2 项目【动手学UNet】12Unet_V2 模型实现【动手学UNet】12Unet_V2 模型实现15.4 数据加载模块data_utils_v2.py15.5 UNet v2 模型实现Encoder SDI Decoder欢迎来到【动手学UNet】系列教程本系列将带你从零开始一步步深入理解和实现经典的UNet图像分割模型。无论你是深度学习初学者还是有一定经验的开发者这个系列都将为你提供全面而实用的UNet知识。15.4 数据加载模块data_utils_v2.py1、图像预处理模块utils/preprocess_v2.pypreprocess_v2.py是所有 Retina 图像预处理操作的集中模块绿色通道 CLAHE提供统一的医学图像预处理。模型训练和推理包括单张推理可以复用相同的预处理逻辑。提供一个独立预处理类RetinalPreprocessorV2支持 “绿色通道提取”支持 CLAHE局部直方图均衡参数可调可由 config_v2 控制最终输出统一为单通道 PIL.Image。2、数据加载模块utils/data_utils_v2.pydata_utils.py是 UNetv2_Retina 的数据入口自动完成文件读取 → 预处理 → resize → 归一化 → Tensor 输出。创建 RetinaDatasetV2通用的数据加载类自动按照文件名匹配图像与掩膜调用 RetinalPreprocessorV2绿色通道 CLAHE控制预处理、通道数、图像大小预留 transform 钩子兼容 AlbumentationsHermetic 设计返回训练可直接使用的 Tensor。此前已经建立了data_utils.py脚本用于占位和测试现在用如下脚本替换原来的测试版本。3、测试数据加载test3.py为了测试data_utils.py在项目根目录编写一个测试程序test3.py。构建训练集 Dataset从 dataset/train/images dataset/train/masks 中取出一张样本检查形状构建 DataLoader从 DataLoader 中取出一个 batch运行测试程序时要在dataset/train/images/和dataset/train/masks/目录下至少各放一张图片。15.5 UNet v2 模型实现Encoder SDI Decoder目标在 model/ 目录下实现 U-Net v2 的三大模块 总体网络封装清晰体现 多层特征提取 SDI 融合 解码重建 的流程。1、多层级编码器model/encoder_v2.pyencoder_v2.py负责实现 UNet v2 的编码器部分是整张视网膜图像特征提取的入口模块用于逐层提取由浅入深的多尺度特征图为后续 SDI 注入和解码器重建提供语义与细节信息基础。提供多层级编码器类EncoderV2采用与经典 U-Net 一致的结构DoubleConv 卷积块 Down 下采样块从输入图像中逐级提取特征输出 [f1, f2, f3, f4, f5] 五个层级的特征图4. 保持高分辨率浅层特征用于细节保留、低分辨率深层特征用于语义表达将各层通道数记录在 self.channels 中为 SDI 模块和 Decoder 提供统一的通道配置。输入x, [B, C_in, H, W]输出特征图列表 [f1, f2, f3, f4, f5]分别对应从浅到深的不同层级。# model/encoder_v2.py UNet v2 编码器EncoderV2 - 与经典 U-Net 类似采用多层级卷积 下采样结构 - 输出一系列特征图 [f1, f2, f3, f4, f5]从浅到深 - youcansqq.com fromtypingimportListimporttorchimporttorch.nnasnnclassDoubleConv(nn.Module): 两次 3x3 卷积 BN ReLU 的基本卷积块。 def__init__(self,in_ch:int,out_ch:int):super().__init__()self.netnn.Sequential(nn.Conv2d(in_ch,out_ch,kernel_size3,padding1,biasFalse),nn.BatchNorm2d(out_ch),nn.ReLU(inplaceTrue),nn.Conv2d(out_ch,out_ch,kernel_size3,padding1,biasFalse),nn.BatchNorm2d(out_ch),nn.ReLU(inplaceTrue),)defforward(self,x:torch.Tensor)-torch.Tensor:returnself.net(x)classDown(nn.Module): 下采样块MaxPool2d(2) DoubleConv def__init__(self,in_ch:int,out_ch:int):super().__init__()self.poolnn.MaxPool2d(kernel_size2,stride2)self.convDoubleConv(in_ch,out_ch)defforward(self,x:torch.Tensor)-torch.Tensor:xself.pool(x)xself.conv(x)returnxclassEncoderV2(nn.Module): UNet v2 编码器 输入x, [B, C_in, H, W] 输出一个特征图列表 [f1, f2, f3, f4, f5] - f1: 最浅层高分辨率细节丰富 - f5: 最深层低分辨率高语义 def__init__(self,in_channels:int1,base_channels:int64):super().__init__()# 通道设置经典 U-Net 风格c1base_channels c2base_channels*2c3base_channels*4c4base_channels*8c5base_channels*16self.incDoubleConv(in_channels,c1)self.down1Down(c1,c2)self.down2Down(c2,c3)self.down3Down(c3,c4)self.down4Down(c4,c5)self.channels[c1,c2,c3,c4,c5]defforward(self,x:torch.Tensor)-List[torch.Tensor]:f1self.inc(x)# [B, c1, H, W ]f2self.down1(f1)# [B, c2, H/2, W/2]f3self.down2(f2)# [B, c3, H/4, W/4]f4self.down3(f3)# [B, c4, H/8, W/8]f5self.down4(f4)# [B, c5, H/16,W/16]return[f1,f2,f3,f4,f5]2、SDI模块model/sdi_module.pysdi_module.py实现语义与细节注入模块SDISemantic Detail Infusion通过从高层特征中提炼语义信息并注入到浅层/中层特征中使网络在保持细节分辨率的同时增强语义表达能力。提供 SDI 模块类SDIModule使用最高层特征 f5 作为语义源对于指定层级 i将 f5 经过 1x1 卷积 上采样到与 f_i 相同尺寸通过 Sigmoid生成语义门控语义图sem_gate采用哈达玛积Hadamard product对指定层级的特征进行语义增强f_i’ f_i * (1 sem_gate)6. 是否启用、作用于哪些层级等行为可以通过 feat_channels、sdi_levels、mode 进行配置并由 config_v2 统一管理。# model/sdi_module.py UNet v2 的 SDI 模块Semantic Detail Infusion - 使用最高层特征 f5 作为语义源 - 对于指定层级 i将 f5 经过 1x1 卷积 上采样到与 f_i 相同尺寸 - 生成语义门控语义图 sem_gate sigmoid(conv(upsampled_f5)) - 利用哈达玛积Hadamard product进行增强 f_i f_i * (1 sem_gate) - 未启用的层级保持原样返回 - youcans(at)qq.com fromtypingimportList,Sequenceimporttorchimporttorch.nnasnnimporttorch.nn.functionalasFclassSDIModule(nn.Module):def__init__(self,feat_channels:Sequence[int],sdi_levels:Sequence[int](1,2,3,4),mode:strhadamard,): :param feat_channels: 每层特征图通道数列表例如 [c1, c2, c3, c4, c5] :param sdi_levels: 需要进行 SDI 注入的层级索引1-based如 (1,2,3,4) :param mode: 当前保留占位默认为 hadamard super().__init__()assertlen(feat_channels)2,feat_channels 至少需要两个层级self.feat_channelslist(feat_channels)self.sdi_levelslist(sdi_levels)self.modemode# 最高层特征 f5 的通道数self.top_channelsfeat_channels[-1]# 为每个层级 i 创建一个 1x1 卷积将 top feature 映射到该层通道数self.proj_convsnn.ModuleDict()fori,cinenumerate(feat_channels[:-1],start1):namefproj_to_l{i}self.proj_convs[name]nn.Conv2d(self.top_channels,c,kernel_size1)defforward(self,feats:List[torch.Tensor])-List[torch.Tensor]: :param feats: [f1, f2, f3, f4, f5] :return: [f1,f2,f3,f4,f5]其中部分层经过 SDI 增强 assertlen(feats)len(self.feat_channels),输入特征层数与 feat_channels 不匹配f_topfeats[-1]# f5B,C_top,H_top,W_topf_top.shape out_feats:List[torch.Tensor][]fori,finenumerate(feats,start1):ifilen(feats):# 最深层f5通常作为语义源可直接保留out_feats.append(f)continueifinotinself.sdi_levels:# 不在 SDI 作用层级中保持原样out_feats.append(f)continue# ---- SDI 注入过程 ----# 1) 将 f_top 投影到与 f_i 相同通道数proj_convself.proj_convs[fproj_to_l{i}]sem_featproj_conv(f_top)# [B, c_i, H_top, W_top]# 2) 上采样到 f_i 相同空间尺寸_,_,H_i,W_if.shape sem_feat_upF.interpolate(sem_feat,size(H_i,W_i),modebilinear,align_cornersFalse)# 3) 生成语义 gatesem_gatetorch.sigmoid(sem_feat_up)# [B, c_i, H_i, W_i]ifself.modehadamard:# Hadamard product 残差增强f_enhancedf*(1.0sem_gate)else:# 其他模式可以后续扩展这里简单做加法占位f_enhancedfsem_gate out_feats.append(f_enhanced)returnout_feats3、解码器model/decoder_v2.pydecoder_v2.py实现 UNet v2 的解码器模块负责将多层级特征逐步上采样并融合浅层跳跃连接实现空间分辨率的重建和最终的像素级分割输出整体风格与经典 U-Net 解码路径保持一致。提供上采样块 Up 和解码器类 DecoderV2通过转置卷积ConvTranspose2d逐级将特征图放大 2 倍在每一层上采样后与对应编码器特征如 f4、f3、f2、f1进行 skip-connection 拼接使用 DoubleConv 对拼接后的特征进行融合逐层恢复细节与结构信息最终通过 1×1 卷积输出分割 logits通道数等于 num_classes用于后续 Sigmoid / Softmax 等激活与损失计算。# model/decoder_v2.py UNet v2 解码器DecoderV2 与经典 U-Net 解码路径类似 - 逐步上采样 - 与对应层级的 encoder 特征做 skip-connection - 通过 DoubleConv 融合特征 - youcans(at)qq.com fromtypingimportListimporttorchimporttorch.nnasnnimporttorch.nn.functionalasFfrom.encoder_v2importDoubleConvclassUp(nn.Module): 上采样块 - 采用 ConvTranspose2d 做 2x 上采样 - 与对应 encoder 特征拼接channel 方向 - 再通过 DoubleConv 融合 def__init__(self,in_ch:int,out_ch:int): :param in_ch: 解码特征的通道数上采样前 :param out_ch: 上采后 拼接后再经卷积得到的输出通道数 super().__init__()# 上采样通道数减半尺寸 ×2self.upnn.ConvTranspose2d(in_ch,in_ch//2,kernel_size2,stride2)# 上采样后会与 skip 特征拼接拼接后通道数 in_ch//2 skip_ch# DoubleConv 里具体 in/out 通道设置在 forward 前根据实际拼接情况决定# 这里采用经典 U-Net 的写法用 in_ch 作为 DoubleConv 的输入通道self.convDoubleConv(in_ch,out_ch)defforward(self,x:torch.Tensor,skip:torch.Tensor)-torch.Tensor:xself.up(x)# [B, in_ch//2, H*2, W*2]# 对齐尺寸某些情况下可能因奇偶问题产生 1 像素差异diff_yskip.size(2)-x.size(2)diff_xskip.size(3)-x.size(3)ifdiff_y!0ordiff_x!0:xF.pad(x,[diff_x//2,diff_x-diff_x//2,diff_y//2,diff_y-diff_y//2])# 通道维拼接xtorch.cat([skip,x],dim1)# [B, skip_ch in_ch//2, H, W]xself.conv(x)returnxclassDecoderV2(nn.Module): UNet v2 解码器 输入来自 Encoder ( SDI) 的多层特征 [f1, f2, f3, f4, f5] 输出分割 logits [B, num_classes, H, W] def__init__(self,base_channels:int64,num_classes:int1):super().__init__()c1base_channels c2base_channels*2c3base_channels*4c4base_channels*8c5base_channels*16# 对应 Encoder 的通道设置# f1: c1, f2: c2, f3: c3, f4: c4, f5: c5self.up1Up(c5,c4)# f5 - f4self.up2Up(c4,c3)# ...self.up3Up(c3,c2)self.up4Up(c2,c1)self.out_convnn.Conv2d(c1,num_classes,kernel_size1)defforward(self,feats:List[torch.Tensor])-torch.Tensor: :param feats: [f1, f2, f3, f4, f5] :return: logits [B, num_classes, H, W] assertlen(feats)5,DecoderV2 目前假定有 5 个层级特征f1,f2,f3,f4,f5feats# 注意f1 分辨率最高f5 最低xself.up1(f5,f4)# - 类似 f4 空间尺寸xself.up2(x,f3)xself.up3(x,f2)xself.up4(x,f1)logitsself.out_conv(x)returnlogits4、UNetV2 模型unetv2.pyunetv2.py将 Encoder、SDI 模块与 Decoder 组合成一个完整的 UNet v2 模型类 UNetV2是训练与推理阶段真正被调用的主网络结构实现端到端的“图像输入 → 分割输出”。提供整体网络类UNetV2内部集成 EncoderV2、SDIModule可选与 DecoderV2形成统一的前向计算流程支持从 config_v2 读取模型关键参数输入通道数、类别数、base_channels、是否启用 SDI、SDI 层级等实现配置集中管理前向过程中先通过编码器获得多层特征再选择性通过 SDI 模块进行语义与细节注入最后交由解码器重建输出输出为大小与输入一致、通道数为 num_classes 的分割 logits可直接接入损失函数和评估指标用于视网膜血管等医学图像分割任务。forward(x) 内部流程如下1使用 Encoder 提取特征[f1, f2, f3, f4, f5]2使用 SDI 模块生成融合特征[f1’, f2’, f3’, f4’, f5’]3使用 Decoder 从高层到低层逐步重建高分辨率分割图最终输出 [B, num_classes, H, W] 的分割概率/ logit。# model/unetv2.py UNetV2 主模型 - EncoderV2: 提取多层级特征 [f1..f5] - SDIModule: 在中间对特征进行语义注入可选 - DecoderV2: 逐级上采样输出分割结果 - youcans(at)qq.com fromtypingimportSequence,Listimporttorchimporttorch.nnasnnfromcore.config_v2importcfg_v2from.encoder_v2importEncoderV2from.sdi_moduleimportSDIModulefrom.decoder_v2importDecoderV2classUNetV2(nn.Module):def__init__(self,in_channels:intNone,num_classes:intNone,base_channels:intNone,use_sdi:boolNone,sdi_levels:Sequence[int]None,):super().__init__()# 从 config_v2 中读取默认值方便后续统一配置self.in_channelsin_channelsifin_channelsisnotNoneelsecfg_v2.IN_CHANNELS self.num_classesnum_classesifnum_classesisnotNoneelsecfg_v2.NUM_CLASSES self.base_channelsbase_channelsifbase_channelsisnotNoneelsecfg_v2.BASE_CHANNELS self.use_sdiuse_sdiifuse_sdiisnotNoneelsecfg_v2.USE_SDI self.sdi_levelssdi_levelsifsdi_levelsisnotNoneelsecfg_v2.SDI_LEVELS# 1. 编码器self.encoderEncoderV2(in_channelsself.in_channels,base_channelsself.base_channels,)# 2. SDI 模块可选feat_channelsself.encoder.channels# [c1, c2, c3, c4, c5]ifself.use_sdi:self.sdi_moduleSDIModule(feat_channelsfeat_channels,sdi_levelsself.sdi_levels,modecfg_v2.SDI_FUSION_MODE,)else:self.sdi_moduleNone# 3. 解码器self.decoderDecoderV2(base_channelsself.base_channels,num_classesself.num_classes,)defforward(self,x:torch.Tensor)-torch.Tensor: :param x: [B, C_in, H, W] :return: logits [B, num_classes, H, W] feats:List[torch.Tensor]self.encoder(x)# [f1..f5]ifself.sdi_moduleisnotNone:featsself.sdi_module(feats)# [f1..f5]logitsself.decoder(feats)returnlogits5、测试UNetV2模型test4.py为了测试 UNetV2模型在项目根目录编写一个测试程序test4.py。使用 cfg_v2 中的 IMG_SIZE IN_CHANNELS 生成随机输入构建 UNetV2 模型默认使用 SDI前向推理一次检查输出形状是否为 [1, NUM_CLASSES, H, W]自动给出 OK / ERROR 提示。# test4.py 测试 UNetV2 模型结构是否正确 - 使用随机生成的一张图像batch_size1 - 大小为 cfg_v2.IMG_SIZE通道数为 cfg_v2.IN_CHANNELS - 前向运行 UNetV2检查输出形状是否正确 importtorchfromcore.config_v2importcfg_v2frommodel.unetv2importUNetV2defmain():print( test4.py: 测试 UNetV2 forward \n)devicetorch.device(cpu)# 测试脚本用 CPU 即可in_channelscfg_v2.IN_CHANNELS num_classescfg_v2.NUM_CLASSES H,Wcfg_v2.IMG_SIZEprint(f[INFO] IN_CHANNELS {in_channels})print(f[INFO] NUM_CLASSES {num_classes})print(f[INFO] IMG_SIZE {cfg_v2.IMG_SIZE}\n)# 1. 构建模型modelUNetV2().to(device)model.eval()# 2. 构造随机输入xtorch.randn(1,in_channels,H,W,devicedevice)# 3. 前向推理withtorch.no_grad():ymodel(x)print(f[INFO] 输入张量形状: x.shape {x.shape})print(f[INFO] 输出张量形状: y.shape {y.shape})# 4. 自动检查形状expected_shape(1,num_classes,H,W)iftuple(y.shape)expected_shape:print(f[OK] UNetV2 forward 通过输出形状符合预期:{expected_shape})else:print(f[ERROR] UNetV2 输出形状不符合预期)print(f 实际:{tuple(y.shape)}, 期望:{expected_shape})print(\n test4.py: 结束 )if__name____main__:main()结果如下图所示说明 Encoder SDI Decoder UNetV2 总体结构已经跑通 forward。【本节完】版权声明欢迎关注『youcans动手学 AI』系列转发请注明原文链接【动手学UNet】12Unet_V2 模型实现Copyright 2025 youcansCrated2025-12
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站建设案例好么洛阳企业网站建设

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个萌系风格的电商网站原型,包含以下功能:1.商品展示区(至少5个动漫周边商品)2.购物车系统 3.简易支付接口 4.用户评价模块。要…

张小明 2026/1/9 5:33:57 网站建设

旅游小网站怎样做精不做全导购网站怎么做视频教学

河南省行政区划数据完整指南:免费GIS地图制作终极教程 【免费下载链接】中国省级行政区划-河南省shp 本资源提供了中国省级行政区划的数据,特别是针对河南省的详细地理信息。以Shapefile(.shp)格式呈现,这是GIS&#x…

张小明 2026/1/4 22:01:57 网站建设

昆山网站建设ikelv品牌营销推广方案

GIMP Photoshop主题完整指南:免费打造专业级图像编辑体验 【免费下载链接】GimpPs Gimp Theme to be more photoshop like 项目地址: https://gitcode.com/gh_mirrors/gi/GimpPs 想要让免费开源的GIMP软件拥有媲美Photoshop的专业界面吗?GIMP Pho…

张小明 2026/1/9 4:01:09 网站建设

起飞页怎么做网站英语网站建设策划书

美国联邦航空管理局证实,佳明公司的自动着陆产品在首次实际紧急情况应用中取得成功,一架小型飞机在科罗拉多州落基山都市机场完全依靠自动化系统安全紧急降落。佳明紧急自动着陆系统的设计目标是在"飞行员无法驾驶的紧急情况下自动接管飞行的完全控…

张小明 2026/1/6 3:18:46 网站建设

如何用front做网站网页青州网站设计公司

chinese-calendar 是一个专业的 Python 库,专门用于精准判断中国法定节假日和工作日。该库支持从 2004 年至 2026 年的完整节假日数据,包括春节延长假期等特殊情况的权威识别,是企业考勤系统和财务计算应用的理想选择。 【免费下载链接】chin…

张小明 2026/1/9 12:19:44 网站建设

上海英文网站建设南梁红色景区建设管理局网站

H5-Dooring可视化编辑器终极指南:零基础快速制作专业H5页面 【免费下载链接】h5-Dooring MrXujiang/h5-Dooring: h5-Dooring是一个开源的H5可视化编辑器,支持拖拽式生成交互式的H5页面,无需编码即可快速制作丰富的营销页或小程序页面。 项目…

张小明 2026/1/9 2:51:31 网站建设