Chinese-CLIP使用教程

目录

一:运行环境

二:代码架构 

 三:数据集准备

1. 文本数据处理

训练集文本处理

测试集文本处理

2. 图像数据处理

3. 生成LMDB数据库

四、模型微调

五:模型验证与测试 

1. 提取图文特征

2. 图文检索

3. 计算召回率

六:总结 

路径问题


 

一:运行环境

        Chinese-CLIP的代码是在Ubuntu系统上运行的,运行方式是在命令行运行 .sh 脚本。

        配置环境的时候尽量不要 pip requestment.txt  ,(好像是会自动下载最高版本的torch,导致和CUDA不匹配),按照自己的CUDA版本下载对应的torch就好了。

二:代码架构 

        参考Github:

Chinese-CLIP/
├── run_scripts/
│   ├── muge_finetune_vit-b-16_rbt-base.sh
│   ├── flickr30k_finetune_vit-b-16_rbt-base.sh
│   └── ...           # 更多finetune或评测脚本...
└── cn_clip/
    ├── clip/
    ├── eval/
    ├── preprocess/
    └── training/

${DATAPATH}
├── pretrained_weights/
├── experiments/
├── deploy/          # 用于存放ONNX & TensorRT部署模型
└── datasets/
    └── MyData/          # 自定义数据集...

自定义数据集的组织方式参考Coco,我这里是这样的,ImageData里放的是图片,word_test.csv是文本内容。

 三:数据集准备

        Cn-CLIP训练和测试时,要把数据转为LMDB数据库文件,方便运行时的随机读取。而数据保存的形式是:文本存在 json 文件,图像使用base64格式存在tsv文件。所以先把文本处理为json,图像处理为tsv,然后进行序列化,转为LMDB。

        

1. 文本数据处理

        文本数据使用的是 json 格式,如果文本是保存在excel文件的话,那么就需要做相应的转换。Github上给出的 json 格式如下:

        可以看到 json 里面包括文本的 id ,文本内容,图片 id。如果是训练集的话,知道图文对应关系,那么可以按照上述格式转换;如果是测试集,其实是不知道图文对应关系的,那么就直接把图片 id 写成空列表就行了。处理代码如下:

训练集文本处理

        假设我训练集文本xlsx格式是这样

        那么我就自己构建一个text_id,按顺序标号12345...:

import pandas as pd
import json

'''训练集文本转为json'''
df = pd.read_excel("/MyData/train_texts.xlsx")
# 构建JSON数据
with open("./train_texts.jsonl", "w", encoding='utf-8') as outfile:
    text_id = 1
    for index, row in df.iterrows():
        image_names = row[0]
        text = row[1]
        image_ids = [image_names]
        json_row = {"text_id": text_id,"text": text,"image_ids": image_ids}
        json.dump(json_row, outfile, ensure_ascii=False)  # 写入单个 JSON 对象
        outfile.write('\n')  # 写入换行符,使得每个 JSON 对象占据一行
        text_id += 1
print("JSON Lines 文件已生成:train_texts.jsonl")

测试集文本处理

假设我测试集文本xlsx文件是这样,测试集不知道文本对应的图像id,image_ids写成空列表就行。

'''测试集文本转为json'''
df = pd.read_excel("MyData/test_texts.xlsx")
# 构建JSON数据
with open("./test_texts.jsonl", "w", encoding='utf-8') as outfile:
    for index, row in df.iterrows():
        text_id = row[0]
        text = row[1]
        image_ids = []
        json_row = {"text_id": text_id,"text": text,"image_ids": image_ids}
        json.dump(json_row, outfile, ensure_ascii=False)  # 写入单个 JSON 对象
        outfile.write('\n')  # 写入换行符,使得每个 JSON 对象占据一行
print("JSON Lines 文件已生成:test_texts.jsonl")

经过上面的操作,文本数据已经处理好了。

2. 图像数据处理

        Github的原话是 ”不是将图片以大量的小文件方式存放,而是将训练/验证/测试图片以base64形式分别存放在${split}_imgs.tsv文件中。文件每行表示一张图片,包含图片id(int型)与图片base64,以tab隔开,格式如下:

        

        假设我这里原本数据集的图像是以小文件方式保存的,例如

 那就先把图片转为base64格式,保存到 tsv 文件中,代码如下:实际使用按照自己的存储路径修改路径就行了

from PIL import Image
import io
import base64
import csv
import os
import json
"""将图片转换为base64格式"""

# 定义存储图像的文件夹路径
folder_path = "MyData/ImageData"  
# 准备写入的TSV文件路径
tsv_file_path = "MyData/test_imgs.tsv"  

# 打开或创建TSV文件,并写入列名
with open(tsv_file_path, "w", newline='') as tsvfile:
    writer = csv.writer(tsvfile, delimiter='\t')

    # 遍历文件夹中的图片文件
    for filename in os.listdir(folder_path):
        if filename.endswith(".jpg") or filename.endswith(".png") or filename.endswith(".jpeg"):  # 仅处理图片文件
            # 构建图片文件的完整路径
            image_path = os.path.join(folder_path, filename)
            # 打开图片文件
            with Image.open(image_path) as img:
                # 将图片转换为Base64编码字符串
                img_buffer = io.BytesIO()
                img.save(img_buffer, format=img.format)
                byte_data = img_buffer.getvalue()
                base64_str = base64.b64encode(byte_data).decode("utf-8")
                # 写入文件名和Base64编码字符串到TSV文件中
                writer.writerow([filename, base64_str])
                # print(filename)
print("Base64编码结果已写入到TSV文件中:", tsv_file_path)

到这里已经把数据集格式处理完了:文本是json文件,图像是tsv文件。接下来进行序列化,转为LMDB数据库文件。

3. 生成LMDB数据库

        这个代码GitHub有给,代码是在cn-clip/preprocess文件夹下的build_lmdb_dataset.py,

修改一下参数如下:


def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--data_dir", type=str, default='/MyData/', help="the directory which stores the image tsvfiles and the text jsonl annotations"
    ) #路径
    parser.add_argument(
        "--splits", type=str, default="test", help="specify the dataset splits which this script processes, concatenated by comma \
            (e.g. train,valid,test)"
    )# 选择是训练集还是验证集还是测试集
    parser.add_argument(
        "--lmdb_dir", type=str, default=None, help="specify the directory which stores the output lmdb files. \
            If set to None, the lmdb_dir will be set to {args.data_dir}/lmdb"
    )#不用写 默认生成在MyData文件夹下
    return parser.parse_args()

四、模型微调

        如果是本地单卡训练,修改shell脚本部分参数如下:


# Number of GPUs per GPU worker
GPUS_PER_NODE=1
# Number of GPU workers, for single-worker training, please set to 1
WORKER_CNT=1
# The ip address of the rank-0 worker, for single-worker training, please set to localhost
export MASTER_ADDR=localhost
# The port for communication
export MASTER_PORT=8514
# The rank of this worker, should be in {0, ..., WORKER_CNT-1}, for single-worker training, please set to 0
export RANK=0 

export PYTHONPATH=${PYTHONPATH}:`pwd`/cn_clip/

# data options
train_data=${DATAPATH}xxx/MyData/lmdb/train   #这里的xxx是要改成绝对路径 下面一样
val_data=${DATAPATH}xxx/MyData//lmdb/val # if val_data is not specified, the validation will be automatically disabled
path to resume
reset_data_offset="--reset-data-offset"
reset_optimizer="--reset-optimizer"
# reset_optimizer=""

# output options
output_base_dir=${DATAPATH}xxx/MyData/experiments/ #xxx是绝对路径

        然后在命令行cd到Chinese-CLIP文件夹,运行下面这行代码

bash run_scripts/muge_finetune_vit-b-16_rbt-base.sh ${DataPath}

        关于训练过程中如果出现其它的bug,需要自己慢慢调试了,基本上都是对training文件夹下的py文件做一些小修改。

五:模型验证与测试 

        训练完后权重会保存到 MyData/experiments/里面的checkpoints文件夹下。

1. 提取图文特征

        这一步图搜文和文搜图,用的是一样的代码,都是要先对图片和文本提取特征,然后后面再进行相似度计算。代码是cn_clip/eval/文件夹下的extract_features.py ,根据注释直接在py文件里修改好参数。注意要将extract-image-feats和extract-text-feats参数设为True,才能开始提取特征。提取完后是保存在两个jsonl文件里的,这两个jsonl文件应该是默认保存在MyData文件夹下。

2. 图文检索

        检索部分的代码是分开的,都在cn_clip/eval/文件夹下。文搜图是make_topk_predictions.py文件,图搜文是make_topk_predictions_tr.py文件。这里也是把提取的特征的两个jsonl文件填到路径里,然后设置一下输出的结果的路径。

        检索完成后的结果保存在设置的输出路径中,是 jsonl 文件格式。 

3. 计算召回率

        代码都在cn_clip/eval/文件夹下,用evaluation.py计算文搜图的recall,evaluation_tr.py计算图搜文的recall。

        standard_path = sys.argv[1]可以把sys.argv[1]改成本地的文件地址sys.argv[2]和[3]同理。

        使用evaluation_tr.py前需要先通过 transform_ir_annotation_to_tr.py 把 train_texts.jsonl(就是图文对应的那个json文件)由文到图的格式转为图到文。

六:总结 

1.用Make_json.py将xlsx里的文本转换成json格式(对于测试集只有文本,不知道图文对匹配关系的情况,每行的image_ids字段处理为空列表即可,即"image_ids": []);
用Img2base64将图片编码成base64格式(.tsv文件)

2.用build_Imdb_dataset.py把.tsv和.json文件转换为内存索引的LMDB数据库文件

2.5.对模型进行finetune(微调)。(可以不进行,直接用预训练模型)

3.用extrac_features.py提取图文特征得到train_texts.txt_feat.jsonl和train_imgs.img_feat.jsonl
注意文本最大字长设置为finetune时的一样,不然会影响准确率

4.用make_topk_predictions.py进行文到图检索(文本召回相关图片)通过3得到的两个jsonl文件得到train_predictions.jsonl;
用make_topk_predictions_tr.py进行图到文检索(图片召回相关文本)通过3得到的两个jsonl文件得到train_predictions_tr.jsonl
检索是利用提取出的图像特征和文本特征计算相似度,然后对相似度进行排序。

5.用evaluation.py计算文搜图的recall,evaluation_tr.py计算图搜文的recall。(transform_ir_annotation_to_tr.py用来把
train_texts.jsonl由文到图的格式转为图到文)
standard_path = sys.argv[1]可以把sys.argv[1]改成本地的文件地址sys.argv[2]和[3]同理r

路径问题

如果运行eval文件夹里的文件,找不到cn_clip,路径有问题的话,可以加上

import os
import sys

# 获取当前脚本所在的目录路径
current_directory = os.path.dirname(__file__)

# 找到 cn_clip 文件夹的路径
cn_clip_path = os.path.abspath(os.path.join(current_directory, '..', '..'))  # 假设 cn_clip 文件夹在 eval 文件夹的上两级目录中

 

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

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

相关文章

23 JavaScript学习:验证API

JavaScript验证API 举例&#xff1a; <input id"id1" type"number" min"100" max"300" required> <button onclick"myFunction()">验证</button><p id"demo"></p><script>f…

pinctrl和gpio子系统

文章目录 一、pinctrl 子系统简介二、pinctrl子系统的配置形式分析1.主要功能2.配置格式3.pinctrl驱动匹配 三、gpio子系统1.gpio系统使用流程 四、程序举例-led五、总结 一、pinctrl 子系统简介 在led操作设备树的实验中&#xff0c;对于gpio的初始化是直接操作的寄存器&…

idea No versioned directories to update were found

idea如何配置svn以及svn安装时需要注意什么 下载地址&#xff1a;https://112-28-188-82.pd1.123pan.cn:30443/download-cdn.123pan.cn/batch-download/123-820/3ec9445a/1626635-0/3ec9445a25ba365a23fc433ce0c16f34?v5&t1714358478&s171435847804276f7d9249382ba512…

使用Mybatis映射时间 DateTime ==> LocalDateTime

首先查看&#xff0c;数据库字段&#xff1a; 书写映射实体类对象VO&#xff1a; Data public class OrderListVO implements Serializable {private Integer orderId;private String memberName;private String orderNumber;private BigDecimal orderPrice;private String l…

【数据结构与算法】力扣 239. 滑动窗口最大值

题干描述 给你一个整数数组 nums&#xff0c;有一个大小为 k **的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a; nums [1,3,-1,-3,5,3…

C/C++实现高性能并行计算——1.pthreads并行编程(中)

系列文章目录 pthreads并行编程(上)pthreads并行编程(中)pthreads并行编程(下)使用OpenMP进行共享内存编程 文章目录 系列文章目录前言一、临界区1.1 pi值估计的例子1.2 找到问题竞争条件临界区 二、忙等待三、互斥量3.1 定义和初始化互斥锁3.2 销毁。3.3 获得临界区的访问权&…

安卓中对象序列化面试问题及回答

1. 什么是对象的序列化&#xff1f; 答&#xff1a; 序列化是将对象转换为字节流的过程&#xff0c;以便将其存储在文件、数据库或通过网络传输。反序列化则是将字节流重新转换为对象的过程。 2. 为什么在 Android 开发中需要对象的序列化&#xff1f; 答&#xff1a; 在 An…

ctfshow——JWT

文章目录 web 345web 346——算法改为Noneweb 347-348——爆破密匙web 349——非对称加密算法RS256私钥泄漏web 350——泄漏公钥、非对称密码算法改为对称密码算法 web 345 抓个包&#xff0c;可以看到cookie部分使用JWT&#xff08;Json Web Token&#xff09;。 JWT实际上是…

Django后台项目开发实战一

开发环境使用 Anaconda, IDE 使用 pycharm 第一阶段 创建 Django 项目 在 Anaconda Prompt 中逐步输入下面的命令&#xff08;之后的所有命令都在这个&#xff09; 首先创建一个虚拟环境&#xff0c;名称自拟&#xff0c;python 版本我这里使用 3.9.18 关于 python 版本和…

STM32中断之TIM定时器详解

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. TIM简述 2. 定时器类型 2.1 基本定时器 2.2 通用定时器 2.3 高级定时器 3. 定时中断 4. 代码示例1 5. 代码示例2 1. TIM简述 定时器的基本功能&#xff1a;定时器可以在预定的时间间隔内产生周…

经典机器学习法---感知模型机

优质博文&#xff1a;IT-BLOG-CN 1、模型形式 感知机模型主要用于解决二分类问题&#xff0c;即响应变量Y是个二分类变量&#xff08;如性别&#xff09;。其基本思想是拟找出一个超平面S&#xff0c;将样本空间中的训练集分为两个部分&#xff0c;使得位于超平面S合一侧的点具…

启发式搜索算法4 -遗传算法实战:吊死鬼游戏

相关文章: 启发式搜索算法1 – 最佳优先搜索算法 启发式搜索算法2 – A*算法 启发式搜索算法2 – 遗传算法 有一个小游戏叫吊死鬼游戏&#xff08;hangman&#xff09;&#xff0c;在学习英语的时候&#xff0c;大家有可能在课堂上玩过。老师给定一个英文单词&#xff0c;同学们…

2024深圳杯数学建模竞赛A题(东三省数学建模竞赛A题):建立火箭残骸音爆多源定位模型

更新完整代码和成品完整论文 《2024深圳杯&东三省数学建模思路代码成品论文》↓↓↓&#xff08;浏览器打开&#xff09; https://www.yuque.com/u42168770/qv6z0d/zx70edxvbv7rheu7?singleDoc# 2024深圳杯数学建模竞赛A题&#xff08;东三省数学建模竞赛A题&#xff0…

前端性能优化知识梳理

1.重要性 当我们面试的时候&#xff0c;前端性能优化方面算是必考的知识点&#xff0c;但是工作中我们又很少会重点的对项目进行前端优化&#xff0c;它真的不重要吗&#xff1f; 如果我们可以将后端响应时间缩短一半&#xff0c;整体响应时间只能减少5%~10%。而如果关注前端…

手把手实现一个简约酷美美的版权声明模块

1. 导语 版权声明在很多网站都有用到&#xff0c;出场率还是很高的。所以今天就实现一个属于自己分风格的版权声明模块&#xff0c;技术上采用原生的前端三剑客: HTMLCSSJavaScript(可能会用到) 比如CSDN的版权声明是这样的 2. 需求分析 先看看成品吧&#xff0c;这篇文字结…

翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习一

合集 ChatGPT 通过图形化的方式来理解 Transformer 架构 翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习一翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习二翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深…

强网杯 2019]随便注解题方式

先来看题 这里只有一个提交&#xff0c;那我们就先提交看看情况找找思路 这里提交以后发现也没有什么有用的信息 这样我们只能根据我们的经验先试试 输入1发现有报错 有报错信息就可以试试报错注入了&#xff0c;但是这种ctf题通常会有限制字符所以我使用 1 select 1,2# 来…

c#数据库: 4.修改学生成绩

将4年级的学生成绩全部修改为100分,。修改前的学生信息表如图所示: using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks;namespace StudentUpdate {internal class Program{s…

Apache SeaTunnel k8s 集群模式 Zeta 引擎部署指南

SeaTunnel提供了一种运行Zeta引擎(cluster-mode)的方法&#xff0c;可以让Kubernetes在本地运行Zeta引擎&#xff0c;实现更高效的应用程序部署和管理。在本文中&#xff0c;我们将探索SeaTunnel k8s运行zeta引擎(cluster-mode模式)的更多信息&#xff0c;了解如何更好地利用Ze…

JavaScript基础(二)

JS语法结构——引入方式 js很明显可以是一个后缀名为js的文件&#xff0c;js的引入方式和css一样&#xff0c;也有三种方式。 1.外部 使用script表现&#xff0c;只不过增加一个src属性&#xff0c;把js文件的路径src属性中。 <script src "js文件路径">&l…