2024 TIP 论文 robust-ref-seg 复现过程

本篇是 2024 年 TIP 论文 Toward Robust Referring Image Segmentation 的复现过程。
特点是对不存在的目标不会进行错误分割,鲁棒性较高,其结果如图:
在这里插入图片描述

配置环境

根据论文给出的链接 robust-ref-seg 配置环境。

下载数据集

按照 README 指示,从 RefCOCO 下载数据集。
注意在 make 的时候会报错 Cannot assign type 'double' to 'siz',可以参考 issue#8 的内容,将 setup.py 中的 ext_modules=cythonize(ext_modules) 替换为 ext_modules=cythonize(ext_modules, language_level = "2")

然后在下载数据集,由于 README 提供的链接都挂掉了,可以参考 issue#14 里的回答进行下载。

下载模型

bert-base-uncased 模型下载以下文件。
在这里插入图片描述

uncased 表示是无关大小写的模型。

Swin-base 下载该模型:
在这里插入图片描述
然后按照 README 指示建立目录结构即可。

数据集结构

refcoco 数据集的结构为:

├── refcoco
│   ├── instances.json
│   ├── refs(google).p
│   └── refs(unc).p

其中,instances.json 是从 MS COCO 数据集中继承来的文件标注,refs(xxx).p 是 Python 序列化的 Pickle 格式二进制文件,包含 RefCOCO 数据集特有的语言描述及其目标信息。

instance.json 标注格式如下(仅作示例):

{
    "info": {
        "description": "COCO 2014 Dataset",
        "url": "http://cocodataset.org",
        "version": "1.0",
        "year": 2014,
        "contributor": "COCO Consortium",
        "date_created": "2017/09/01"
    },
    "images": [
        {
            "license": 1,
            "file_name": "COCO_train2014_000000000094.jpg",
            "coco_url": "http://images.cocodataset.org/train2014/COCO_train2014_000000000094.jpg",
            "height": 427,
            "width": 640,
            "date_captured": "2013-11-17 02:07:37",
            "flickr_url": "http://farm7.staticflickr.com/6102/6339531433_a465b39852_z.jpg",
            "id": 94  // 图像 id
        }
    ],
    // 许可类别,这里只保留一个作为示例
    "licenses": [
        {
            "url": "http://creativecommons.org/licenses/by-nc-sa/2.0/",
            "id": 1,
            "name": "Attribution-NonCommercial-ShareAlike License"
        }
    ],
    "annotations": [
        {
	        // 用若干坐标围绕一个轮廓而成的多边形标注,如果目标有多个轮廓则用多个列表
            "segmentation": [
                [
                    317.98780487804873,
                    286.73780487804873,
                    315.7012195121951,
                    288.2621951219512,
                    316.0060975609756,
                    291.92073170731703,
                    320.2743902439024,
                    296.0365853658536,
                    264.56876456876455,
                    312.8205128205128,
                    264.56876456876455,
                    314.9184149184149,
                    284.1491841491841,
                    317.7156177156177,
                ]
            ],
            "area": 51754.216533564235,  // 多边形面积
            "iscrowd": 0,                // 是否是被遮挡区域
            "image_id": 94,
            // [x_min, y_min, w, h]
            "bbox": [
                134.26923076923077,
                425.2307692307692,
                639,
                286
            ],
            "category_id": 1,
            "id": 1                      // 注释id,后面和.p文件的ann_id联动
        }
    ],
    "categories": [
        {
            "supercategory": "animal",
            "id": 1,
            "name": "dog"
        }
    ]

}

json文件过大时 vs code 不能查看,很容易卡死。找到两个查看大 json 文件的软件。
HugeJsonViewer 免费,但查找功能有 bug。
dadroit 查看超过 50M 的文件需要付费。
另外也可以直接用 vim 打开大 json 文件,不过搜索时依然很卡很慢。

refs(xxx).p 则使用 Python 的 pickle 模块加载文件。

import pickle

# 加载 refs(unc).p 文件
with open('refs(unc).p', 'rb') as f:
    data = pickle.load(f)

# 查看第一个引用表达
print(data[0])

其结构为:

{
	'sent_ids': [
		0,
		1,
	],
	'file_name': 'COCO_train2014_000000581857_16.jpg',
	// 通过ann_id和image_id关联COCO中的图像
	'ann_id': 1719310,                   // COCO 数据集中对应的目标注释 ID
	'ref_id': 0,                         // 引用表达的唯一 ID
	'image_id': 581857,                  // 图像 ID
	'split': 'train',                    // 数据集划分(如 train、val、testA、testB)
	'sentences': [                       // 与目标关联的语言描述
	{
		'tokens': ['the', 'lady', 'with', 'the', 'blue', 'shirt'],  // 描述分词后的结果
		'raw': 'THE LADY WITH THE BLUE SHIRT',                      // 原始描述
		'sent_id': 0,
		'sent': 'the lady with the blue shirt'                      // 句子
	},
	{
		'tokens': ['lady', 'with', 'back', 'to', 'us'],
		'raw': 'lady w back to us',
		'sent_id': 1,
		'sent': 'lady with back to us'
	}
	],
	'category_id': 1                     // 目标类别 ID(如 "人")
	}
}

可以这样修改 refs(xxx).p 文件:

## 修改描述
# 假设修改第一个引用表达的第一个描述
ref = data[0]
ref['sentences'][0]['raw'] = "the new description"
ref['sentences'][0]['tokens'] = ["the", "new", "description"]
# 确认修改
print(ref['sentences'][0])

## 添加新字段
# 给每个引用表达添加一个自定义字段
for ref in data:
    ref['custom_field'] = "custom_value"
# 检查修改
print(data[0]['custom_field'])

## 删除条目
# 删除某些引用表达
data = [ref for ref in data if ref['image_id'] != 57870]
# 检查剩余条目
print(len(data))

## 保存修改后数据
# 保存修改后的 .p 文件
with open('refs(unc)_modified.p', 'wb') as f:
    pickle.dump(data, f)

print("文件保存成功!")

复现

  • main.py 的 97 行中添加自己的数据集名 elif args.dataset in ['rrefcoco', 'rrefcoco+', 'rrefcocog', 'myref']:
  • main.py 的 142 行的 os.mkdir(logger_path) 修改为 os.makedirs(logger_path)

这是因为 mkdir() 在父目录也不存在时会创建失败,而 makedirs() 会递归地创建不存在的目录。

  • dataset/refer.py 的 51 行中添加自己的数据集名 if dataset in ['refcoco', 'refcoco+', 'refcocog', 'rrefcoco', 'rrefcoco+', 'rrefcocog', 'temp', 'myref']:
  • 把修改后的 instances.jsonrefs(unc).p 放到 /data/myref 里。

然后就可以开始测试自己的数据集了。

在测试自己的数据集时,运行到 validation.py 的 215 行 scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lambda step: (1 - step / (len(train_loader) * args.epoch)) ** 0.9) 时会报除 0 错误。
查看代码后发现是命令行运行时,args.type 参数默认为 val。在 main 函数里创建数据集 train_dataset 的参数 split 是 train,而创建 eval_dataset 的参数 split 会使用默认的 val。因此在制作自己的 refs.p 文件时,应该至少包含 split='train'split='val' 两种 ref 条目。

但其实,在 eval 模式时根本不需要 train_dataset,这是代码设计不合理的地方,可以把 main.py 的 209 行

optimizer = AdamW(params=params_to_optimize, lr=args.lr, weight_decay=args.weight_decay)
scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lambda step: (1 - step / (len(train_loader) * args.epoch)) ** 0.9)

if args.eval:
	load_checkpoint(args, model_without_ddp, optimizer, scheduler, logger, args.ckpt_epoch, best=True)
	validate_all(args, model)
	exit(0)
if args.resume:

更改为:

if args.eval:
	load_checkpoint(args, model_without_ddp, None, None, logger, args.ckpt_epoch, best=True)
	validate_all(args, model)
	exit(0)

optimizer = AdamW(params=params_to_optimize, lr=args.lr, weight_decay=args.weight_decay)
scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lambda step: (1 - step / (len(train_loader) * args.epoch)) ** 0.9)

if args.resume:

至此就可以对自己的数据集正常进行测试了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构(初阶6)---二叉树(遍历——递归的艺术)(详解)

二叉树的遍历与练习 一.二叉树的基本遍历形式1.前序遍历(深度优先遍历)2.中序遍历(深度优先遍历)3.后序遍历(深度优先遍历)4.层序遍历!!(广度优先遍历) 二.二叉树的leetcode小练习1.判断平衡二叉树1)正常解法2)优化解法 2.对称二叉…

k8s集群增加nfs-subdir-external-provisioner存储类

文章目录 前言一、版本信息二、本机安装nfs组件包三、下载nfs-subdir-external-provisioner配置文件并进行配置1.下载文件2.修改配置 三、进行部署备注:关于镜像无法拉取问题的处理 前言 手里的一台服务器搭建一个单点的k8s集群,然后在本机上使用nfs-su…

C++ For Hot100

数组&#xff1a;数组是存放在连续内存空间上的相同类型数据的集合。 1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> v;for(int i 0;i<nums.size…

高校宿舍节能用电现状及智慧监管平台构建

0 引言 在节能减排的大背景下&#xff0c;高校通过精细化宿舍用电管理&#xff0c;提升师生的节能节电意识等举措&#xff0c;能够显著提高电能资源的使用效率&#xff0c;并有效预防火灾等安全事故&#xff0c;确保师生的人身安全。因此&#xff0c;当前亟需加强对智慧监管平…

Spring Boot英语知识网站:开发策略

5系统详细实现 5.1 管理员模块的实现 5.1.1 用户信息管理 英语知识应用网站的系统管理员可以对用户信息添加修改删除以及查询操作。具体界面的展示如图5.1所示。 图5.1 用户信息管理界面 5.1.2 在线学习管理 系统管理员可以对在线学习信息进行添加&#xff0c;修改&#xff0…

Jmeter中的前置处理器

5&#xff09;前置处理器 1--JSR223 PreProcessor 功能特点 自定义数据处理&#xff1a;使用脚本语言处理请求数据&#xff0c;实现高度定制化的数据处理和生成。动态数据生成&#xff1a;在请求发送前生成动态数据&#xff0c;如随机数、时间戳等。变量设置&#xff1a;设置…

华为鸿蒙内核成为HarmonyOS NEXT流畅安全新基座

HDC2024华为重磅发布全自研操作系统内核—鸿蒙内核&#xff0c;鸿蒙内核替换Linux内核成为HarmonyOS NEXT稳定流畅新基座。鸿蒙内核具备更弹性、更流畅、更安全三大特征&#xff0c;性能超越Linux内核10.7%。 鸿蒙内核更弹性&#xff1a;元OS架构&#xff0c;性能安全双收益 万…

EG3D: Efficient Geometry-aware 3D Generative Adversarial Networks 学习笔记

1 Contributions 混合显式-隐式网络架构&#xff1a;提出了一种 Tri-plane 的3D表征方法&#xff0c;结合显式体素网格与隐式解码器的优点 速度快&#xff0c;内存效率高&#xff1b; 支持高分辨率生成&#xff0c;保持3D表征的灵活性和表达能力。与纯显式或隐式方法相比&#…

【数据结构OJ】相交链表问题,求相交链表的相交第一个交点

题目如下&#xff08;题目来源力扣&#xff09;&#xff1a; 个人解题思路&#xff1a; 运用双指针&#xff0c;第一次遍历先一起走&#xff0c;当一个走到尾时开始计数&#xff0c;等另一个指针也走到尾时记录下两个指针的路程差&#xff0c;同时比对两个指针指向的地址是否相…

【C语言】指针与数组的例题详解:深入分析与高级用法

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 &#x1f4af;前言&#x1f4af;题目一详细分析与解答代码逐步解析 &#x1f4af;进一步优化和拓展1. 指针与数组的关系2. 指针运算的注意事项3. 常见的错误和陷阱4. 拓展&#xff1a;指针操作的应用场…

【Java】ArrayList与LinkedList详解!!!

目录 一&#x1f31e;、List 1&#x1f345;.什么是List&#xff1f; 2&#x1f345;.List中的常用方法 二&#x1f31e;、ArrayList 1&#x1f34d;.什么是ArrayList? 2&#x1f34d;.ArrayList的实例化 3&#x1f34d;.ArrayList的使用 4&#x1f34d;.ArrayList的遍…

【SQL Server】华中农业大学空间数据库实验报告 实验六 视图

1.实验目的 通过课堂理论学习与实验课的实际操作&#xff0c;充分理解视图的相关概念&#xff0c;作用&#xff0c;以及特点&#xff0c;视图中定义的是对一个或多个基本表的查询语句&#xff0c;其本身并不保存数据&#xff0c;所有的数据都存储在数据库的表中&#xff0c;因…

javaweb-day01-html和css初识

html:超文本标记语言 CSS&#xff1a;层叠样式表 1.html实现新浪新闻页面 1.1 标题排版 效果图&#xff1a; 1.2 标题颜色样式 1.3 标签内颜色样式 1.4设置超链接 1.5 正文排版 1.6 页面布局–盒子 &#xff08;1&#xff09;盒子模型 &#xff08;2&#xff09;页面布局…

【Android】webview常用方法和使用

文章目录 前言一、常见用法二、基础属性webView的常用方法WebViewClient的常用方法WebChromeClient的常用方法WebSettings的相关方法 三、加载流程和事件回调四、webview和JS之间的互相调用总结 五、参考链接 前言 最近项目又用到了webview&#xff0c;在回顾复习一次webview相…

【微服务架构】Kubernetes与Docker在微服务架构中的最佳实践(详尽教程)

文章目录 什么是微服务架构Docker在微服务中的应用Docker基础Docker的核心组件 Docker在微服务中的优势 Kubernetes在微服务中的应用Kubernetes基础Kubernetes的核心组件 Kubernetes在微服务中的优势 Kubernetes与Docker的集成最佳实践容器化微服务服务发现与负载均衡自动化部署…

深入了解JDK动态代理

什么是JDK动态代理 &#xff08;有动态代理&#xff0c;就有静态代理&#xff0c;参见&#xff1a;多线程03--静态代理模式_runnable接口静态代理模式-CSDN博客&#xff09; JDK动态代理是Java提供的一种动态生成代理对象的机制&#xff0c;允许在运行时创建一个实现了指定接口…

C#基础56-60

56.字符数组x中存有任意一串字符&#xff1b;串中的所有小写字母改写成大写字母&#xff0c;如果是大写字母改为小写字母&#xff0c;其他字符不变。最后把已处理的字符串仍重新存入字符数组x中&#xff0c;最后调用函数把结果输出到控制台中。 57.求出100以上1000以内所有个位…

华为IPD流程管理体系L1至L5最佳实践-解读

该文档主要介绍了华为IPD流程管理体系&#xff0c;包括流程体系架构、流程框架实施方法、各业务流程框架示例以及相关案例等内容&#xff0c;旨在帮助企业建立高效、规范的流程管理体系&#xff0c;实现业务的持续优化和发展。具体内容如下&#xff1a; 1. 华为流程体系概述 -…

Edge浏览器保留数据,无损降级退回老版本+禁止更新教程(适用于Chrome)

3 个月前阿虚就已经写文章告警过大家&#xff0c;Chromium 内核的浏览器将在 127 以上版本开始限制仍在使用 Manifest V2 规范的扩展&#xff1a;https://mp.weixin.qq.com/s/v1gINxg5vMh86kdOOmqc6A 像是 IDM、油猴脚本管理器、uBblock 等扩展都会受到影响&#xff0c;后续将无…

DevOps引领数字化转型新趋势

DevOps帮助数字化转型 在数字化转型的大潮中&#xff0c;DevOps作为一种文化、运动和实践&#xff0c;已经成为推动企业快速适应市场变化、提高竞争力的关键因素。DevOps的核心在于打破开发&#xff08;Development&#xff09;和运维&#xff08;Operations&#xff09;之间的…