【论文10】复现代码tips
一、准备工作
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
相关文章:
【论文10】复现代码tips
一、准备工作 1.创建一个虚拟环境 conda create --name drgcnn38 python=3.8.18 2.激活虚拟环境 conda activate drgcnn38 注意事项 在Pycharm中终端(terminal)显示PS而不是虚拟环境base 问题如下所示 解决方法:shell路径改成cmd.exe 重启终端显示虚拟环境 3.安装torch …...
分布式缓存获取以及设置
1. 通用代码 public SysUser getCache(String sysUserId) {String cacheKey "litgery:warehouse:" sysUserId;// 尝试从缓存中获取数据CacheData cacheData redisUtils.get(cacheKey);if (null ! cacheData) {if (Boolean.TRUE.equals(cacheData.getExist())) {re…...
SMO算法,platt论文的原始算法及优化算法
platt论文:[PDF] Sequential Minimal Optimization : A Fast Algorithm for Training Support Vector Machines | Semantic Scholar 算法优化:[PDF] Improvements to Platts SMO Algorithm for SVM Classifier Design | Semantic Scholar 包含个人plat…...
2.3 openCv -- 对矩阵执行掩码操作
在矩阵上进行掩模操作相当简单。其基本思想是根据一个掩模矩阵(也称为核)来重新计算图像中每个像素的值。这个掩模矩阵包含的值决定了邻近像素(以及当前像素本身)对新的像素值产生多少影响。从数学角度来看,我们使用指定的值来做一个加权平均。 具体而言,掩模操作通常涉…...
【Django】 js实现动态赋值、显示show隐藏hide效果
文章目录 需要达到的前端效果预览:实现步骤复制bootstrp代码(buttons)复制bootstrp代码(Alert警告框)写js测试效果 需要达到的前端效果预览: {% load static %} <!DOCTYPE html> <html lang"…...
qt--做一个拷贝文件器
一、项目要求 使用线程完善文件拷贝器的操作 主窗口不能假死主窗口进度条必须能动改写文件大小的单位(自适应) 1TB1024GB 1GB1024MB 1MB1024KB 1KB1024字节 二、所需技术 1.QFileDialog 文件对话框 QFileDialog也继承了QDialog类,直接使用静态…...
Eclipse 搭建 C/C++ 开发环境以及eclipse的使用
一、下载、安装 MinGW 1、下载: 下载地址:MinGW - Minimalist GNU for Windows - Browse Files at SourceForge.net 点击“Download Latest Version”即可 下载完成后,得到一个名为 mingw-get-setup.exe 的安装文件。双击运行,安装即可。 …...
【初阶数据结构】复杂度算法题篇
旋转数组 力扣原题 方案一 循环K次将数组所有元素向后移动⼀位(代码不通过) 时间复杂度O(n2) 空间复杂度O(1) void rotate(int* nums, int numsSize, int k) {while (k--) {int end nums[numsSize - 1];for (int i numsSize - 1; i > 0; i--) {nums[i] num…...
20240725项目的maven环境报红-重新配置maven
1.在编辑器里面打开项目,导入源码 (1)找到项目的地址C:\Users\zzz\IdeaProjects\datasys,然后右击用idea编辑器打开。 (2)idea中上菜单栏打开open,然后输入file,选择源代码文件 2.…...
若依 ruoyi poi Excel合并行的导入
本文仅针对文字相关的合并做了处理 ,图片合并及保存需要另做处理!! 目标:Excel合并行内容的导入 结果: 1. ExcelUtil.java 类,新增方法:判断是否是合并行 /*** 新增 合并行相关代码:…...
优化算法:1.遗传算法(GA)及Python实现
一、定义 遗传算法就像是在模拟“优胜劣汰”的进化过程,通过选择最优秀的个体,交配产生下一代,并引入一定的变异,逐步优化解决问题。 二、具体步骤 初始化种群(Initialization): 假设你要找到一个迷宫的最佳出口路径。…...
企业化运维(8)Docker容器技术
###1.Docker介绍### 什么是Docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间…...
Unity C#底层原理(二)
委托 方法的容器:委托可以存储一个或多个方法的引用。可以使用委托对象来调用这些方法。函数/方法的变量类型:委托类型可以像变量一样声明和使用,存储方法的引用。存储、传递方法:委托可以作为参数传递给方法,也可以作…...
计算机网络-配置路由器ACL(访问控制列表)
配置访问控制列表ACL 拓扑结构 拓扑结构如下: 要配置一个ACL,禁止PC0访问PC3,禁止PC4访问PC0,其它正常。 配置Router0 配置接口IP地址: interface fastethernet 0/0 ip address 192.168.1.1 255.255.255.0 no shu…...
51单片机嵌入式开发:20、STC89C52R基于C51嵌入式点阵广告屏的设计
STC89C52R基于C51嵌入式点阵广告屏的设计 1 概述2 LED点阵介绍2.1 特点和优势2.2 工作原理:2.3 使用方法: 3 LED点阵原理3.1 Led点阵内部电路3.2 原理图电路3.3 74HC595 4 软件实现点阵图案的滑动4.1 软件工程代码4.2 Protues仿真 5 总结 配套示例程序 1…...
VLC输出NDI媒体流
目录 1. 下载安装VLC Play 2. 首先在电脑上安装NDI Tools 3. 运行VLC进行输出配置 4. 播放视频 5. 验证 (1)用Studio Monitor验证 (2)用OBS验证 NDI(Network Device Interface)即网络设备接口,是由美国 NewTek 公司开发的免费标准,它可使兼容的视频产品以高质量…...
WiFi 局域网通信 - 发现服务和解析
1. nsdManager nsdManager requireContext().getSystemService(Context.NSD_SERVICE) as NsdManager2. NsdManager.DiscoveryListener 注意:在onStartDiscoveryFailed 和 onStopDiscoveryFailed里不要调用nsdManager.stopServiceDiscovery(this) 方法࿰…...
ChatGPT建议前端学习计划
HTML&CSS基础 - 学习HTML标签、CSS属性、页面布局等基础知识 JavaScript基础 - 学习变量、数据类型、控制流、函数等基础知识 jQuery - 学习如何使用jQuery处理文档对象模型(DOM)、事件、动画等 Ajax - 全称为 Asynchronous JavaScript and XML&…...
YOLO5项目目录最强解析
YOLO5项目目录解析 YOLOv5 项目目录下的文件和目录的结构,以下是对每个目录和文件的解释: 目录 📁 .github: 存放 GitHub 相关配置和文件,如 GitHub Actions 工作流文件、Issue 模板等,用于自动化构建和持续集成等功…...
【python】sklearn基础教程及示例
【python】sklearn基础教程及示例 Scikit-learn(简称sklearn)是一个非常流行的Python机器学习库,提供了许多常用的机器学习算法和工具。以下是一个基础教程的概述: 1. 安装scikit-learn 首先,确保你已经安装了Python和…...
游戏开发实战:如何用Bezier曲线打造流畅的3D角色动画路径(Unity/C#示例)
游戏开发实战:如何用Bezier曲线打造流畅的3D角色动画路径(Unity/C#示例) 在3D游戏开发中,角色移动轨迹的自然度直接影响玩家体验。传统直线移动或简单弧线往往显得生硬,而Bezier曲线凭借其平滑过渡和灵活控制的特性&am…...
SmolVLA效果展示:三视角图像对齐误差对最终动作精度影响分析
SmolVLA效果展示:三视角图像对齐误差对最终动作精度影响分析 1. 项目概述 SmolVLA是一个专门为经济实惠的机器人技术设计的紧凑高效视觉-语言-动作模型。这个模型最大的特点是能够在有限的硬件资源下实现高质量的机器人控制,让更多开发者和研究者能够接…...
OpenClaw+GLM-4.7-Flash低成本方案:自建模型替代SaaS API
OpenClawGLM-4.7-Flash低成本方案:自建模型替代SaaS API 1. 为什么选择自建模型替代商业API 去年夏天,当我第一次尝试用OpenClaw自动化处理公司周报时,被OpenAI的API账单吓了一跳——简单的文档整理和摘要生成,一个月竟然消耗了…...
ShapeOfView贡献指南:如何为开源项目添加新的自定义形状
ShapeOfView贡献指南:如何为开源项目添加新的自定义形状 【免费下载链接】ShapeOfView Give a custom shape to any android view, Material Design 2 ready 项目地址: https://gitcode.com/gh_mirrors/sh/ShapeOfView ShapeOfView是一款强大的Android开源库…...
Cogito-v1-preview-llama-3B效果展示:STEM题目分步推导+代码生成真实截图
Cogito-v1-preview-llama-3B效果展示:STEM题目分步推导代码生成真实截图 1. 模型能力概览 Cogito v1 预览版是Deep Cogito推出的混合推理模型系列,在大多数标准基准测试中均超越了同等规模下最优的开源模型。这个3B参数的模型在编码、STEM题目解答、指…...
从随机采样到精准决策:蒙特卡罗方法在复杂系统建模中的实践
1. 蒙特卡罗方法:用随机性破解复杂世界的密码 想象你是一位古代数学家,手里只有一把沙子和一块画着方格的石板。现在要计算一个不规则形状的湖泊面积,你会怎么做?最原始的方法可能是把沙子均匀撒在石板上,然后数出落在…...
MambaAD实战:5分钟搞定工业缺陷检测的SoTA模型部署(附代码)
MambaAD工业缺陷检测实战:从模型原理到产线部署全指南 引言:当状态空间模型遇见工业质检 在液晶面板生产线上,一个0.1mm的亮点缺陷可能导致整批产品报废;在汽车零部件铸造车间,细微的表面裂纹可能引发严重的安全隐患。…...
2026年03月GESPC++二级真题解析(含视频)
视频讲解:GESP2026年3月二级C真题讲解 一、单选题 第1题 解析: 答案B,ACD选项都是向机器人输入信息,是输入设备 第2题 解析: 答案D,判断是 “ 菱形框 ” 第3题 解析: 答案D,变…...
老牌CMS的隐痛:从DedeCMS漏洞看开源系统会员模块的安全设计误区
DedeCMS会员模块漏洞剖析:开源系统安全设计的深层反思 当一款拥有百万级安装量的老牌CMS系统曝出前台任意密码修改漏洞时,我们看到的不仅是一个具体的技术缺陷,更是开源项目在安全架构设计上的系统性隐忧。2018年那场影响广泛的DedeCMS漏洞事…...
【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(五)- 动态配置与性能优化实战(vsetvli/vsetivli/vsetvl)
1. 动态向量配置指令的核心作用 RISC-V向量扩展指令集中最精妙的设计之一,就是允许程序运行时动态调整向量处理参数的机制。想象你正在用不同尺寸的螺丝刀组装家具——当遇到大螺丝就换大号刀头,碰到小螺丝立即切换精密刀头,这就是vsetvli/vs…...




