飞桨常规赛:黄斑中央凹定位(GAMMA挑战赛任务二) – 11月第3名方案

本文介绍飞桨常规赛黄斑中央凹定位11月第3名方案。赛题旨在对2D眼底图像中黄斑中央凹定位,预测其坐标,不可见则设为(0,0)。数据集含200个样本,建模为回归问题,用Resnet50vd作backbone,通过数据增强、自定义损失函数等优化,还提及代码结构、复现步骤及不足与改进思路。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

飞桨常规赛:黄斑中央凹定位(gamma挑战赛任务二) - 11月第3名方案 - 创想鸟

飞桨常规赛:黄斑中央凹定位(GAMMA挑战赛任务二)

1. 赛题分析

GAMMA挑战赛是由百度在MICCAI2021研讨会OMIA8上举办的国际眼科赛事。MICCAI是由国际医学图像计算和计算机辅助干预协会 (Medical Image Computing and Computer Assisted Intervention Society) 举办的跨医学影像计算和计算机辅助介入两个领域的综合性学术会议,是该领域的顶级会议。OMIA是百度在MICCAI会议上组织的眼科医学影像分析 (Ophthalmic Medical Image Analysis) 研讨会,至今已举办八届。
       

1.1 题目

对2D眼底图像中黄斑中央凹进行定位。
本任务的目的是预测黄斑中央凹在图像中的坐标值。若图像中黄斑中央凹不可见,坐标值设为(0, 0),否则需预测出中央凹在图像中的坐标值。
飞桨常规赛:黄斑中央凹定位(GAMMA挑战赛任务二) - 11月第3名方案 - 创想鸟        

1.2 数据分析

数据集由中国广州中山大学中山眼科中心提供,数据集中包含200个2D眼底彩照样本,分别为:训练集100个,测试集100个。
样本数虽然不多,但测试集和训练集数据一致性较好,实际训练时没有发现过拟合现象。图像分辨率大部分为2992 * 2000,少量为1956 * 1934,图片分辨率高。
中央凹标注单位为像素,精度精确到小数点后5-6位(确实不知道是否真的需要这么高的精度嘛?)。虽然说明中有说中央凹不可见时坐标值设为(0, 0),但标注中并未发现这种情况,暂时只能认为测试集中也不存在这种情况。

2. 方案说明

2.1 建模思路

题目要求检测黄斑中央凹点,参考baseline将其建模为回归问题。
backbone选用paddleseg自带的Resnet50vd,输出为归一化的xy坐标值。
考虑到中央凹位置坐标范围有限,这里将坐标映射到[0.3, 0.7]的区间范围内再归一化到[0, 1]区间。

数据集

采用paddle.io.Dataset自定义数据集,能够方便的实现数据管理、组batch、坐标映射与恢复等功能。

class MyDataset(paddle.io.Dataset):    def __init__(self, img_folder, label_file=None, idx=None, argument=False):        '''设置图片目录、标签文件、样本编号(用于训练集和验证集划分)、数据增强等'''        img_paths = get_all_paths(img_folder, '.jpg')        if idx is None:            idx = np.arange(len(img_paths))        imgs = [read_image(img_paths[i]) for i in idx]        if label_file:            label_df = pd.read_excel(label_file)            label_X = label_df['Fovea_X'].values            label_Y = label_df['Fovea_Y'].values            labels = [(label_X[i], label_Y[i]) for i in idx]        else:            labels = [None,]*len(idx)        datas = [(img, label) for img, label in zip(imgs, labels)]        self.datas = datas        self.argument = argument        self.color_jitter = paddle.vision.transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1)    def __getitem__(self, idx):        '''返回的param用于预测时恢复原始图像坐标'''        img, loc = self.datas[idx]        img = img.copy()        if self.argument:            img, loc = self.do_arg(img, loc)        img, label, param = self.pre_process(img, loc)        return img, label, param    def __len__(self):        return len(self.datas)    def do_arg(self, img, loc):        '''            数据增强方式包括:颜色抖动、水平翻转、垂直翻转。            数据增强后对变换参数作相应改动。        '''        h, w, _ = img.shape        img = self.color_jitter(img)        if np.random.uniform(0,1)>0.5:            # horizon flip            img[:,::-1,:] = img            loc = (w-loc[0], loc[1])        if np.random.uniform(0,1)>0.5:            # vertical flip            img[::-1,:,:] = img            loc = (loc[0], h-loc[1])        return img, loc    def pre_process(self, img, loc):        '''图像归一化到[-0.5, 0.5]区间,标签归一化到[0, 1]区间'''        img, loc, param = crop_center(img, loc)        img = img.transpose([2,0,1]).astype(np.float32)/255-0.5        label = np.zeros([2], dtype=np.float32)        if loc is not None:            fx, fy = loc            r0, r1 = OUTPUT_RANGE            w = (fx-r0)/(r1-r0)            h = (fy-r0)/(r1-r0)            label[:] = (h, w)        return img, label, param

   

由于样本图像大小不一,这里归一化到统一大小。缩放时保持比例并裁取中间块,同时保留坐标映射信息。预测时可以据此映射回原图坐标。

def crop_center(img, loc=None):    h, w, d = img.shape    dx = (w-h)//2    img = img[:, dx:(dx+h), :]    img = cv2.resize(img, (INPUT_IMAGE_SHAPE, INPUT_IMAGE_SHAPE))    scale = h/INPUT_IMAGE_SHAPE    if loc is not None:        x, y = loc        loc = ((x-dx)/h, y/h)    return img, loc, (scale, dx)def restore_xy(loc, param):    x, y = loc    scale, dx = param    loc = (x*INPUT_IMAGE_SHAPE*scale+dx, y*INPUT_IMAGE_SHAPE*scale)    return loc

   

模型

paddleseg仅需一行代码即可构建backbone模型(work/my_model.py):

self.backbone = paddleseg.models.backbones.ResNet50_vd(pretrained=pretrain_url)

       

与paddle自带的Resnet预训练模型相比,paddleseg的预训练模型默认输出多分辨特征,我们可以很方便的挑选自己所需的特征(work/my_model.py):

feats = self.backbone(x)feats = [feats[i] for i in self.feat_indices]

       

本项目目前仅采用末层特征(self.feat_indices=[-1])。

loss选用的是收敛性能较好的smooth L1。通过自定义loss层,能够方便的实现多头输出加权loss。

class MyLoss(paddle.nn.Layer):    def __init__(self, loss_w = LOSS_WEIGHTS):        super(MyLoss, self).__init__()        self.loss_w = loss_w    def forward(self, preds, label):        loss = 0        for pred, w in zip(preds, self.loss_w):            loss += w*paddle.nn.functional.smooth_l1_loss(pred, label)        return loss

   

2.2 代码结构

代码 功能

config.py参数设置utils.py功能函数my_dataset.py数据集my_model.py模型train.py训练主程序predict.py预测主程序

2.3 一些细节

预处理时全图取中使宽高一致,再缩放为512*512训练数据增强选用了颜色抖动和随机翻转学习率采用warmup和线性递减,基准学习率为1e-3优化器采用Momentum后处理时在局部邻域取灰度最低点作为最终结果

2.4 可视化

不得不说visualdl可视化太棒了,哪怕只是简单的画一下loss和evaluate曲线,都感觉对训练过程把控好很多。
创建日志:

vdl_writer = visualdl.LogWriter(vdl_path)

       

写入监控变量:

vdl_writer.add_scalar('train/loss', loss_scalar, iters)

       

在AI Studio的数据模型可视化模块中便可以看到需要的变量曲线。 飞桨常规赛:黄斑中央凹定位(GAMMA挑战赛任务二) - 11月第3名方案 - 创想鸟飞桨常规赛:黄斑中央凹定位(GAMMA挑战赛任务二) - 11月第3名方案 - 创想鸟        

3. 复现说明

3.1 安装依赖库

本项目运行依赖paddleseg包,可采用pip命令一键安装。

In [ ]

# 安装paddleseg!pip install paddleseg

   

3.2 下载并解压数据集

由于版权要求,比赛数据下载链接在报名后可见。

In [ ]

# 下载比赛数据,报名比赛后在比赛页面可查看下载地址!wget https://xxxxxxxxxxxxxxx/task2_Fovea_localization.zip# 解压至competition_data文件夹!unzip task2_Fovea_localization.zip -d competition_data

   

3.3 训练

模型参数已配置好,执行work/目录下的train.py脚本即可一键启动训练。此外在models/目录下有训练好的checkpoint,也可以不训练直接跳转3.4步获取模型预测结果。

In [ ]

!cd ~/work && python -W ignore train.py

   

3.4 预测

执行work/目录下的predict.py脚本即可一键获取可提交的csv文件,可以拿来作为参考。 但不建议直接拿来提交!!!

In [ ]

!cd ~/work && python -W ignore predict.py

   

4. 不足与改进

原本想借鉴YOLO的思路,把题目建模为“分块回归”问题,即把黄斑中央凹可能存在的区域划分为若干网格,首先通过分类确定中央凹点在哪个网格内,再通过回归确定最终位置,如图所示:
飞桨常规赛:黄斑中央凹定位(GAMMA挑战赛任务二) - 11月第3名方案 - 创想鸟
但实现以后发现效果不如直接回归的,大概是参数调的不够好吧。

以上就是飞桨常规赛:黄斑中央凹定位(GAMMA挑战赛任务二) – 11月第3名方案的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/39512.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
mysql怎么用命令进行安装?
上一篇 2025年11月6日 02:50:57
长安汽车:今年东南亚罗勇工厂投产,全球化策略进入2.0阶段
下一篇 2025年11月6日 02:51:02

相关推荐

  • Matplotlib 地图中多类型图例的创建与优化

    Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化

    本教程旨在解决matplotlib地图可视化中,如何在一个图例中同时展示颜色块(如区域分类)和自定义标记(如特定兴趣点)的问题。文章详细介绍了当传统`patch`对象无法正确显示标记时,如何利用`matplotlib.lines.line2d`创建标记图例句柄,并将其与颜色块图例句柄合并,从而生成一…

    2026年5月10日 用户投稿
    100
  • Golang JSON序列化:控制敏感字段暴露的最佳实践

    本教程探讨golang中如何高效控制结构体字段在json序列化时的可见性。当需要将包含敏感信息的结构体数组转换为json响应时,通过利用`encoding/json`包提供的结构体标签,特别是`json:”-“`,可以轻松实现对特定字段的忽略,从而避免敏感数据泄露,确保api…

    2026年5月10日
    000
  • 利用海象运算符简化条件赋值:Python教程与最佳实践

    本文旨在探讨Python中海象运算符(:=)在条件赋值场景下的应用。通过对比传统if/else语句与海象运算符,以及条件表达式,分析海象运算符在简化代码、提高可读性方面的优势与局限性。并通过具体示例,展示如何在列表推导式等场景下合理使用海象运算符,同时强调其潜在的复杂性及替代方案,帮助开发者更好地掌…

    2026年5月10日
    100
  • 比特币新手教程 比特币交易平台有哪些

    比特币是一种去中心化的数字货币,基于区块链技术实现点对点交易,具有匿名性、有限发行和不可篡改等特点;新手可通过交易所购买,P2P交易获得比特币,常用平台包括Binance、OKX和Huobi;交易流程包括注册账户、实名认证、绑定支付方式、充值法币并下单购买,可选择市价单或限价单;比特币存储方式有交易…

    2026年5月10日
    000
  • c++中的SFINAE技术是什么_c++模板编程中的SFINAE原理与应用

    SFINAE 是“替换失败不是错误”的原则,指模板实例化时若参数替换导致错误,只要存在其他合法候选,编译器不报错而是继续重载决议。它用于条件启用模板、类型检测等场景,如通过 decltype 或 enable_if 控制函数重载,实现类型特征判断。尽管 C++20 引入 Concepts 简化了部分…

    2026年5月10日
    000
  • Go语言mgo查询构建:深入理解bson.M与日期范围查询的正确实践

    本文旨在解决go语言mgo库中构建复杂查询时,特别是涉及嵌套`bson.m`和日期范围筛选的常见错误。我们将深入剖析`bson.m`的类型特性,解释为何直接索引`interface{}`会导致“invalid operation”错误,并提供一种推荐的、结构清晰的代码重构方案,以确保查询条件能够正确…

    2026年5月10日
    100
  • RichHandler与Rich Progress集成:解决显示冲突的教程

    在使用rich库的`richhandler`进行日志输出并同时使用`progress`组件时,可能会遇到显示错乱或溢出问题。这通常是由于为`richhandler`和`progress`分别创建了独立的`console`实例导致的。解决方案是确保日志处理器和进度条组件共享同一个`console`实例…

    2026年5月10日
    000
  • Golang goroutine与channel调试技巧

    使用go run -race检测数据竞争,结合runtime.NumGoroutine监控协程数量,通过pprof分析阻塞调用栈,利用select超时避免永久阻塞,有效排查goroutine泄漏、死锁和数据竞争问题。 Go语言的goroutine和channel是并发编程的核心,但它们也带来了调试上…

    2026年5月10日
    000
  • 《魔兽世界》将于6月11日开启国服回归技术测试

    《魔兽世界》将于6月11日开启国服回归技术测试《魔兽世界》将于6月11日开启国服回归技术测试《魔兽世界》将于6月11日开启国服回归技术测试《魔兽世界》将于6月11日开启国服回归技术测试

    《%ign%ignore_a_1%re_a_1%》官方宣布,将于6月11日开启国服回归技术测试,时间为7天,并称可以在6月内正式开服,玩家们可以访问官网下载战网客户端并预下载“巫妖王之怒”客户端,技术测试详情见下图。 WordAi WordAI是一个AI驱动的内容重写平台 53 查看详情 以上就是《…

    2026年5月10日 用户投稿
    200
  • 使用 Jupyter Notebook 进行探索性数据分析

    Jupyter Notebook通过单元格实现代码与Markdown结合,支持数据导入(pandas)、清洗(fillna)、探索(matplotlib/seaborn可视化)、统计分析(describe/corr)和特征工程,便于记录与分享分析过程。 Jupyter Notebook 是进行探索性…

    2026年5月10日
    000
  • 如何在HTML中插入表单元素_HTML表单控件与输入类型使用指南

    HTML表单通过标签构建,包含action和method属性定义数据提交目标与方式,常用input类型如text、password、email等适配不同输入需求,配合label、required、placeholder提升可用性,结合textarea、select、button等控件实现完整交互,是…

    2026年5月10日
    100
  • 创建指定大小并填充特定数据的Golang文件教程

    本文将介绍如何使用Golang创建一个指定大小的文件,并用特定数据填充它。我们将使用 `os` 包提供的函数来创建和截断文件,从而实现快速生成大文件的目的。示例代码展示了如何创建一个10MB的文件,并将其填充为全零数据。掌握这些方法,可以方便地在例如日志系统或磁盘队列等场景中,预先创建测试文件或初始…

    2026年5月10日
    000
  • Python命令怎样使用profile分析脚本性能 Python命令性能分析的基础教程

    使用Python的cProfile模块分析脚本性能最直接的方式是通过命令行执行python -m cProfile your_script.py,它会输出每个函数的调用次数、总耗时、累积耗时等关键指标,帮助定位性能瓶颈;为进一步分析,可将结果保存为文件python -m cProfile -o ou…

    2026年5月10日
    000
  • 如何插入查询结果数据_SQL插入Select查询结果方法

    如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法

    使用INSERT INTO…SELECT语句可高效插入数据,通过NOT EXISTS、LEFT JOIN、MERGE语句或唯一约束避免重复;表结构不一致时可通过别名、类型转换、默认值或计算字段处理;结合存储过程可提升可维护性,支持参数化与动态SQL。 将查询结果数据插入到另一个表中,可以…

    2026年5月10日 用户投稿
    000
  • 使用 WebCodecs VideoDecoder 实现精确逐帧回退

    本文档旨在解决在使用 WebCodecs VideoDecoder 进行视频解码时,实现精确逐帧回退的问题。通过比较帧的时间戳与目标帧的时间戳,可以避免渲染中间帧,从而提高用户体验。本文将提供详细的解决方案和示例代码,帮助开发者实现精确的视频帧控制。 在使用 WebCodecs VideoDecod…

    2026年5月10日
    000
  • Debian Copilot的社区活跃度如何

    debian copilot是codeberg社区维护的ai助手,旨在为debian用户提供服务。尽管搜索结果中没有直接提供关于debian copilot社区支持活跃度的具体数据,但我们可以通过debian社区的整体活跃度和特点来推断其活跃性。 Debian社区的一般情况: Debian拥有详尽的…

    2026年5月10日
    000
  • Discord.py 交互按钮超时与持久化解决方案

    本教程旨在解决Discord.py中交互按钮在一段时间后出现“This Interaction Failed”错误的问题。我们将深入探讨视图(View)的超时机制,并提供通过正确设置timeout参数以及利用bot.add_view()方法实现按钮持久化的具体方案,确保您的机器人交互功能稳定可靠,即…

    2026年5月10日
    000
  • Python递归函数追踪与性能考量:以序列打印为例

    本文深入探讨了Python中一种递归打印序列元素的方法,并着重演示了如何通过引入缩进参数来有效追踪递归函数的执行流程和参数变化。通过实际代码示例,文章揭示了递归调用可能带来的潜在性能开销,特别是对调用栈空间的需求,以及Python默认递归深度限制可能导致的错误,为读者提供了理解和优化递归算法的实用见…

    2026年5月10日
    000
  • python中zip函数详解 python多序列压缩zip函数应用场景

    zip函数的应用场景包括:1) 同时遍历多个序列,2) 合并多个列表的数据,3) 数据分析和科学计算中的元素运算,4) 处理csv文件,5) 性能优化。zip函数是一个强大的工具,能够简化代码并提高处理多个序列时的效率。 在Python中,zip函数是一个非常有用的工具,它能够将多个可迭代对象打包成…

    2026年5月10日
    000
  • JavaScript 动态菜单点击高亮效果实现教程

    本教程详细介绍了如何使用 JavaScript 实现动态菜单的点击高亮功能。通过事件委托和状态管理,当用户点击菜单项时,被点击项会高亮显示(绿色),同时其他菜单项恢复默认样式(白色)。这种方法避免了不必要的DOM操作,提高了性能和代码可维护性,确保了无论点击方向如何,功能都能稳定运行。 动态菜单高亮…

    2026年5月10日
    200

发表回复

登录后才能评论
关注微信