【论文10】复现代码tips

news2024/11/24 20:39:00

一、准备工作

1.创建一个虚拟环境

conda create --name drgcnn38 python=3.8.18

2.激活虚拟环境

conda activate drgcnn38

注意事项

在Pycharm中终端(terminal)显示PS而不是虚拟环境base

问题如下所示

解决方法:shell路径改成cmd.exe

重启终端显示虚拟环境

3.安装torch 

conda install pytorch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 cpuonly -c pytorch

安装一系列包

注意事项

Pycharm远程连接Linux服务器实现代码同步

1.工具-->部署-->配置

2.选择SFTP远程连接,路径填与服务器要同步的路径地址

二、代码学习

各部分的作用

  • eye_pre_process:视网膜眼底图像预处理模块。
  • Encoder:编码器训练模块。
  • modules:包含模型结构、损失函数和学习率降低策略。
  • utils:包含一些常用函数和评估指标。
  • BFFN:双眼特征融合网络训练模块。
  • CAM:类别注意力模块。

eye_pre_process

copy.py

# 创建一个ArgumentParser对象,用于处理命令行参数  
parser = argparse.ArgumentParser()  
  
# 添加一个命令行参数 '--image-folder',类型为字符串,默认值为 'D:/cv_paper/lesson/Dataset/ceshi'  
# 这个参数用于指定输入图像的文件夹路径  
parser.add_argument('--image-folder', type=str, default=r'D:/cv_paper/lesson/Dataset/ceshi')  
  
# 添加一个命令行参数 '--output-folder',类型为字符串,默认值为 'D:\cv_paper\lesson/Dataset/ceshi_output'  
# 注意:这里路径中的反斜杠在不同的操作系统中可能需要特别注意,Python字符串中推荐使用原始字符串(r前缀)来避免转义字符的问题  
# 这个参数用于指定输出结果的文件夹路径  
parser.add_argument('--output-folder', type=str, default=r'D:\cv_paper\lesson/Dataset/ceshi_output')  
  
# 添加一个命令行参数 '--crop-size',类型为整数,默认值为512  
# 这个参数用于指定图像裁剪的大小  
parser.add_argument('--crop-size', type=int, default=512, help='crop size of image')  
  
# 添加一个命令行参数 '-n' 或 '--num-processes',类型为整数,默认值为8  
# 这个参数用于指定处理任务时要使用的进程数  
# '-n' 是 '--num-processes' 的简写形式,帮助信息说明了该参数的作用  
parser.add_argument('-n', '--num-processes', type=int, default=8, help='number of processes to use')
# 转换一个包含多个任务的列表,每个任务由文件名、目标路径和裁剪大小组成  
# 对于jobs列表中的每个任务(索引为j),它首先检查是否已经处理了100个任务(作为进度指示),然后调用convert函数来执行实际的图像转换。
def convert_list(i, jobs):  
    for j, job in enumerate(jobs):  
        # 每处理100个任务打印一次进度  
        if j % 100 == 0:  
            print(f'worker{i} has finished {j} tasks.')  
        # 解包任务元组并调用convert函数  
        convert(*job)  
  
# 转换单个图像文件,包括模糊处理、裁剪和保存  
def convert(fname, tgt_path, crop_size):  
    img = Image.open(fname)  # 打开图像文件  
  
    blurred = img.filter(ImageFilter.BLUR)  # 应用模糊滤镜  
    ba = np.array(blurred)  # 将图像转换为NumPy数组  
    h, w, _ = ba.shape  # 获取图像的高度、宽度和通道数  
  
    # 尝试根据图像的亮度分布来识别前景区域  
    if w > 1.2 * h:  
        # 计算左右两侧的最大亮度值  
        left_max = ba[:, :w // 32, :].max(axis=(0, 1)).astype(int)  
        right_max = ba[:, -w // 32:, :].max(axis=(0, 1)).astype(int)  
        max_bg = np.maximum(left_max, right_max)  
  
        foreground = (ba > max_bg + 10).astype(np.uint8)  # 识别前景区域  
        bbox = Image.fromarray(foreground).getbbox()  # 获取前景区域的最小边界框  
  
        # 如果边界框太小或不存在,则打印消息并可能设置为None  
        if bbox is None:  
            print(f'No bounding box found for {fname} (???)')  
        else:  
            left, upper, right, lower = bbox  
            if right - left < 0.8 * h or lower - upper < 0.8 * h:  
                print(f'Bounding box too small for {fname}')  
                bbox = None  
    else:  
        bbox = None  # 如果图像已经是合适的宽高比,则不尝试识别前景  
  
    # 如果未找到有效的边界框,则使用正方形边界框  
    if bbox is None:  
        bbox = square_bbox(img)  
  
    # 使用边界框裁剪图像,并调整大小  
    cropped = img.crop(bbox)  
    cropped = cropped.resize([crop_size, crop_size], Image.ANTIALIAS)  # 注意:ANTIALIAS可能是个拼写错误,应该是ANTIALIASIS  
    save(cropped, tgt_path)  # 保存图像  
  
# 返回一个正方形裁剪框的边界  
def square_bbox(img):  
    w, h = img.size  
    left = max((w - h) // 2, 0)  
    upper = 0  
    right = min(w - (w - h) // 2, w)  
    lower = h  
    return (left, upper, right, lower)  
  
# 保存PIL图像到文件  
def save(img, fname):  
    img.save(fname, quality=100, subsampling=0)  # 注意:subsampling参数可能不是所有格式都支持  
  
# 假设的main函数,用于组织整个流程(注意:这里只是一个示例)  
def main():  
    # 示例任务列表,每个任务是一个(文件名, 目标路径, 裁剪大小)元组  
    jobs = [  
        ('input1.jpg', 'output1_resized.jpg', 256),  
        ('input2.jpg', 'output2_resized.jpg', 256),  
        # ... 更多任务  
    ]  
      
    # 假设有一个工作者ID为1  
    convert_list(1, jobs)  
  
if __name__ == "__main__":  
    main()  

Encoder 

main.py

# 定义主函数入口  
def main():  
    # 解析配置参数  
    args = parse_configuration()  
    # 加载配置文件  
    cfg = load_config(args.config)  
    # 获取配置中保存的路径  
    save_path = cfg.config_base.config_save_path  
    # 如果保存路径不存在,则创建该路径  
    if not os.path.exists(save_path):  
        os.makedirs(save_path)  
    # 将配置文件复制到保存路径  
    copy_config(args.config, cfg.config_base.config_save_path)  
    # 执行工作函数  
    worker(cfg)  
  
# 定义工作函数,负责训练、验证和测试模型  
def worker(cfg):  
    # 根据配置生成模型  
    model = generate_model(cfg)  
    # 计算模型总参数数量  
    total_param = 0  
    for param in model.parameters():  
        total_param += param.numel()  
    print("Parameter: %.2fM" % (total_param / 1e6))  # 打印模型参数数量(单位:百万)  
    # 根据配置生成训练、验证和测试数据集  
    train_dataset, test_dataset, val_dataset = generate_dataset(cfg)  
    # 初始化性能评估器  
    estimator = PerformanceEvaluator(cfg.config_train.config_criterion, cfg.config_data.config_num_classes)  
    # 执行训练过程  
    train(  
        cfg=cfg,  
        model=model,  
        train_dataset=train_dataset,  
        val_dataset=val_dataset,  
        estimator=estimator,  
    )  
  
    # 测试最佳验证模型性能  
    print('This is the performance of the best validation model:')  
    checkpoint = os.path.join(cfg.config_base.config_save_path, 'best_validation_weights.pt')  
    cfg.config_train.config_checkpoint = checkpoint  # 设置检查点路径为最佳验证模型  
    model = generate_model(cfg)  # 重新生成模型以加载权重  
    evaluate(cfg, model, test_dataset, estimator)  # 评估模型性能  
  
    # 测试最终模型性能  
    print('This is the performance of the final model:')  
    checkpoint = os.path.join(cfg.config_base.config_save_path, 'final_weights.pt')  
    cfg.config_train.config_checkpoint = checkpoint  # 设置检查点路径为最终模型  
    model = generate_model(cfg)  # 重新生成模型以加载权重  
    evaluate(cfg, model, test_dataset, estimator)  # 评估模型性能  
  
# 如果此脚本作为主程序运行,则调用main函数  
if __name__ == '__main__':  
    main()

Encoder_predict.py

进行模型的训练,具体来说,它定义了一个训练循环&#x

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1953041.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux:Linux进程控制

目录 1. 进程概念 1.1 并行和并发 2. 进程创建 2.1 fork()函数初识 2.2 写时拷贝 2.3 fork常规用法 2.4 fork调用失败的原因 3. 进程终止 3.1 进程场景 3.2 进程常见退出方法 4. 进程等待 4.1 进程等待必要性 4.2 进程等待的方法 4.2.1 wait方法&#xff1a; 4.…

推荐系统三十六式学习笔记:工程篇.常见架构24|典型的信息流架构是什么样的

目录 整体框架数据模型1.内容即Activity2.关系即连接 动态发布信息流排序数据管道总结 从今天起&#xff0c;我们不再单独介绍推荐算法的原理&#xff0c;而是开始进入一个新的模块-工程篇。 在工程实践的部分中&#xff0c;我首先介绍的内容是当今最热门的信息流架构。 信息…

关于数据存储位置的一点知识

关于数据存储位置的一点知识

c++红黑树,插入公式

概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路 径会比其他路径长出俩倍&#xff0c;因而是接近…

useRoute 函数的详细介绍与使用示例

title: useRoute 函数的详细介绍与使用示例 date: 2024/7/27 updated: 2024/7/27 author: cmdragon excerpt: 摘要&#xff1a;本文介绍了Nuxt.js中useRoute函数的详细用途与示例&#xff0c;展示了如何在组合式API中使用useRoute获取当前路由信息&#xff0c;包括动态参数、…

web服务器dns服务器配置服务

1.搭建一个nfs服务器&#xff0c;客户端可以从该服务器的/share目录上传并下载文件 server服务器&#xff1a; 创建 /share目录&#xff0c;并且编辑/etc/exports文件 更改目录权限为755&#xff1a; 755权限码的含义是&#xff1a; 文件所有者&#xff08;第一位数字7&…

Docker Desktop安装(通俗易懂)

1、官网 https://www.docker.com/products/docker-desktop/ 2、阿里云镜像 docker-toolbox-windows-docker-for-windows安装包下载_开源镜像站-阿里云 1. 双击安装文件勾选选项 意思就是&#xff1a; Use WSL 2 instead of Hyper-V (recommended) : 启用虚拟化&#xff0c;…

20240727生活沉思------------关于报考软考高级架构师

软考高级架构师 软考高级架构师 缴费 主要是报的千峰 1880元。 相对来说还算可以吧。。。其他也没给我机会选择啊 备考 我现在开始备考&#xff0c;考试时间2024年11月。 今天是正式开始7.27号。 给大家看看接下来我的课程安排&#xff1a; 额&#xff0c;还是满满当当的…

Redis从入门到超神-(十二)Redis监听Key的过期事件

前言 试想一个业务场景&#xff0c;订单超过30分钟未支付需要做自动关单处理,修改订单状态&#xff0c;库存回退等&#xff0c;你怎么实现&#xff1f;方案一&#xff1a;可以使用定时任务扫表&#xff0c;通过支付状态和下单时间来判断是否支付过期。但是这样的方案是非常消耗…

Vue入门(二)常用指令

一、Vue 常用指令 Vue 常用指令 - 指令&#xff1a;是带有 v- 前缀的特殊属性&#xff0c;不同指令具有不同含义。例如 v-html&#xff0c;v-if&#xff0c;v-for。 - 使用指令时&#xff0c;通常编写在标签的属性上&#xff0c;值可以使用 JS 的表达式。 - 常用指令 二、常用…

邦布带你从零开始实现图书管理系统(java版)

今天我们来从零开始实现图书管理系统。 图书管理系统 来看我们的具体的实现&#xff0c;上述视频。 我们首先来实现框架&#xff0c;我们要实现图书管理系统&#xff0c;首先要搭框架。 我们首先定义一个书包&#xff0c;在书包中定义一个书类和一个书架类&#xff0c;再定义…

AI大模型写的高考作文,你觉得怎么样?

下方为2024年高考新课标I卷语文作文题目&#xff0c;接下来将使用Chatgpt、文心一言、讯飞星火等众多AI大模型来写这篇高考作文 Chatgpt 标题&#xff1a;问题的演变与思考 随着互联网和人工智能技术的飞速发展&#xff0c;我们获得信息的方式和速度发生了前所未有的变化。曾经…

用PyTorch从零开始编写DeepSeek-V2

DeepSeek-V2是一个强大的开源混合专家&#xff08;MoE&#xff09;语言模型&#xff0c;通过创新的Transformer架构实现了经济高效的训练和推理。该模型总共拥有2360亿参数&#xff0c;其中每个令牌激活21亿参数&#xff0c;支持最大128K令牌的上下文长度。 在开源模型中&…

C嘎嘎浅谈模板

这篇文章给大家介绍一下c嘎嘎内存管理和模板&#xff0c;那么我们直接进入正题 c/c的程序内存分布 这里的了解一下即可 new和delete的定义和操作 格式&#xff1a;类型* 对象名 new 类型&#xff1b; 数组(对象)定义格式&#xff1a;类型* 对象名 new 类型[元素个数]&…

【安卓开发】【Android】如何进行真机调试【注意事项】

一、所需原料 1、电脑&#xff08;安装有Android Studio开发工具&#xff09;&#xff1a; 2、安卓操作系统手机&#xff1a;笔者演示所用机型为huawei rongyao50&#xff0c;型号为NTU-AN00&#xff1a; 3、数据线&#xff08;usb-typeA&#xff09;一根。 二、操作步骤 1…

支持向量机回归及其应用(附Python 案例代码)

使用支持向量机回归估计房价 让我们看看如何使用支持向量机&#xff08;SVM&#xff09;的概念构建一个回归器来估计房价。我们将使用sklearn中提供的数据集&#xff0c;其中每个数据点由13个属性定义。我们的目标是根据这些属性估计房价。 引言 支持向量回归&#xff08;SV…

IndexError: index 0 is out of bounds for axis 1 with size 0

IndexError: index 0 is out of bounds for axis 1 with size 0 目录 IndexError: index 0 is out of bounds for axis 1 with size 0 【常见模块错误】 【解决方案】 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#…

Linux网络工具“瑞士军刀“集合

一、背景 平常我们在进行Linux服务器相关运维的时候&#xff0c;总会遇到一些网络相关的问题。我们可以借助这些小巧、功能强悍的工具帮助我们排查问题、解决问题。 下面结合之前的一些使用经验为大家介绍一下一些经典应用场景下&#xff0c;这个网络命令工具如何使用的。例如怎…

关于Redis(热点数据缓存,分布式锁,缓存安全(穿透,击穿,雪崩));

热点数据缓存: 为了把一些经常访问的数据&#xff0c;放入缓存中以减少对数据库的访问频率。从而减少数据库的压力&#xff0c;提高程序的性能。【内存中存储】成为缓存; 缓存适合存放的数据: 查询频率高且修改频率低 数据安全性低 作为缓存的组件: redis组件 memory组件 e…

大模型算法备案流程最详细说明【流程+附件】

文章目录 一、语料安全评估 二、黑盒测试 三、模型安全措施评估 四、性能评估 五、性能评估 六、安全性评估 七、可解释性评估 八、法律和合规性评估 九、应急管理措施 十、材料准备 十一、【线下流程】大模型备案线下详细步骤说明 十二、【线上流程】算法备案填报…