向量数据库:usearch的简单使用+实现图片检索应用

usearch的简单使用

  • usearch是快速开源搜索和聚类引擎×,用于C++、C、Python、JavaScript、Rust、Java、Objective-C、Swift、C#、GoLang和Wolfram 🔍中的向量和🔜字符串×
// https://github.com/unum-cloud/usearch/blob/main/python/README.md
$ pip install usearch
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting usearchDownloading https://pypi.tuna.tsinghua.edu.cn/packages/ba/f4/24124f65ea3e940e54af29d55204ddfbeafa86d6b94b63c2e99baff2f7d6/usearch-2.8.14-cp38-cp38-manylinux_2_28_x86_64.whl (1.5 MB)━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.5/1.5 MB 17.0 MB/s eta 0:00:00
Requirement already satisfied: numpy in /home/ubuntu/anaconda3/envs/vglm2/lib/python3.8/site-packages (from usearch) (1.23.1)
Requirement already satisfied: tqdm in /home/ubuntu/anaconda3/envs/vglm2/lib/python3.8/site-packages (from usearch) (4.66.1)
Installing collected packages: usearch
Successfully installed usearch-2.8.14
  • 一个简单的例子(注:本例子在运行时向index中不断添加项目,并将最后的index持久化为一个文件,在运行时由于添加项目内存占用会不断增加)
import numpy as np
from usearch.index import Index, MetricKind, Matchesndim = 131072
index_path =  "test.usearch"index = Index(ndim=ndim, # Define the number of dimensions in input vectorsmetric='cos', # Choose 'l2sq', 'haversine' or other metric, default = 'ip'dtype='f32', # Quantize to 'f16' or 'i8' if needed, default = 'f32'connectivity=16, # How frequent should the connections in the graph be, optionalexpansion_add=128, # Control the recall of indexing, optionalexpansion_search=64, # Control the quality of search, optional
)# index = Index(ndim=ndim, metric=MetricKind.Cos)for i in range(1,10):vector =  np.random.random((1000, ndim)).astype('float32')index.add(None, vector, log=True)index.save(index_path)
vector =  np.random.random((1, ndim)).astype('float32')
matches: Matches = index.search(vector, 10)
ids = matches.keys.flatten()print(matches)# test.usearch大小: 10*1000*131072 =>2.2G  (如果dtype='f32'=>4G+)

usearch-images

  • https://github.com/ashvardanian/usearch-images

运行效果

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

数据获取

  • https://huggingface.co/datasets/unum-cloud/ann-unsplash-25k/tree/main
    在这里插入图片描述

在这里插入图片描述

依赖 ucall

  • Requires: Python >=3.9
  • https://pypi.org/project/ucall/#files
    在这里插入图片描述

OSError: [Errno 28] inotify watch limit reached

  File "/home/ubuntu/anaconda3/envs/usearch/lib/python3.10/site-packages/watchdog/observers/inotify_c.py", line 428, in _raise_errorraise OSError(errno.ENOSPC, "inotify watch limit reached")
OSError: [Errno 28] inotify watch limit reached

这个错误表明在使用 watchdog 库时超过了 Linux 系统对 inotify 监视的文件数或目录数的限制。Linux 对于每个进程的 inotify 能够监视的文件和目录有一个限制,当达到这个限制时,会出现像上面的错误一样的问题。可以尝试增加系统对 inotify 的资源限制。可以通过修改 /etc/sysctl.conf 文件来增加 fs.inotify.max_user_watches 参数的值。例如:

```bash
sudo sysctl -w fs.inotify.max_user_watches=65536
```然后,运行下面的命令使更改生效:```bash
sudo sysctl -p
```

注意:增加监视数可能会对系统资源产生一些影响,因此请根据实际情况慎重调整。

模型加载

在这里插入图片描述

  • https://huggingface.co/unum-cloud/uform-vl-multilingual-v2/tree/main
    在这里插入图片描述
///home/ubuntu/anaconda3/envs/usearch/lib/python3.10/site-packages/uform/__init__.py
def get_checkpoint(model_name, token) -> Tuple[str, Mapping, str]:model_path = snapshot_download(repo_id=model_name, token=token)config_path = f"{model_path}/torch_config.json"state = torch.load(f"{model_path}/torch_weight.pt")return config_path, state, f"{model_path}/tokenizer.json"def get_model(model_name: str, token: Optional[str] = None) -> VLM:config_path, state, tokenizer_path = get_checkpoint(model_name, token)with open(config_path, "r") as f:model = VLM(load(f), tokenizer_path)model.image_encoder.load_state_dict(state["image_encoder"])model.text_encoder.load_state_dict(state["text_encoder"])return model.eval()
  • 修改成如下,调用时使用_model = get_model("你的下载路径")
def get_checkpoint(model_name, token) -> Tuple[str, Mapping, str]:model_path = model_name#snapshot_download(repo_id=model_name, token=token)config_path = f"{model_path}/torch_config.json"state = torch.load(f"{model_path}/torch_weight.pt")return config_path, state, f"{model_path}/tokenizer.json"def get_model(model_name: str, token: Optional[str] = None) -> VLM:config_path, state, tokenizer_path = get_checkpoint(model_name, token)with open(config_path, "r") as f:model = VLM(load(f), tokenizer_path)model.image_encoder.load_state_dict(state["image_encoder"])model.text_encoder.load_state_dict(state["text_encoder"])return model.eval()

其他细微的修改

数据源的修改
_datasets = {name: _open_dataset(os.path.join("/home/ubuntu/userfile/***/Usearch/usearch-images-main/data", name))for name in ("unsplash-25k",# "cc-3m",# "laion-4m",)
}
dataset_names: str = st.multiselect("Datasets",[dataset_unsplash_name,# dataset_cc_name,# dataset_laion_name,],[dataset_unsplash_name],#, dataset_cc_name],format_func=lambda x: x.split(":")[0],
)
  • 也可下载cc-3m数据:
    在这里插入图片描述
数据读取的修改
    # uris: Strs = File(os.path.join(dir, "images.txt")).splitlines()file_path = os.path.join(dir, "images.txt")with open(file_path, 'r') as file:uris = file.read().splitlines()

CG

  • “usearch” 通常指的是一个生物信息学工具,用于对DNA和蛋白质序列进行搜索和比对。具体来说,它是由Qiime软件包提供的一个用于序列分析的工具,主要用于对微生物群落的高通量测序数据进行处理和分析。Qiime(Quantitative Insights Into Microbial Ecology)是一个用于分析和解释微生物群落结构的开源软件包。在Qiime中,usearch被用于处理和比对DNA序列,以便进行物种注释、多样性分析等。USEARCH —— 最简单易学的扩增子分析流程

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

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

相关文章

第7章-第5节-Java中的比较器comparator和泛型的简单说明

1、 引入 上个章节中我们在使用TreeSet保存自定义数据类型的时候,类必须要实现Comparable这个接口,然后重写CompareTo这个方法,这个必须是在具体的自定义类内部去写,有时不方便,每遇到一个都要在那个类内部去写这个Co…

vs c++ qt 叫请求的json 输出到输出终端

1 接收数据 std::string response ""; //设置数据接收函数 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, Utils::req_reply); // 设置写入数据的缓冲区 curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&response); 2 打印 数据类型 qDebug() << &q…

10-单例模式(Singleton)

意图 保证一个类只有一个实例&#xff0c;并提供一个访问它的全局访问点 实现 1 懒汉式&#xff0c;线程不安全 public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance null) {…

第7章-第4节-Java中的Set集合和自然排序compareble

1、HashSet&#xff1a; 1&#xff09;、 Set集合的特点 元素存储可以有序&#xff0c;可以无序&#xff08;要看选择的具体子类 HashSet 无序 LinkedHashSet&#xff08;有序&#xff09;,TreeSet&#xff08;排序&#xff09;&#xff09; 没有索引&#xff0c;不能通过索引…

学生成绩录入及查询(结构体)

学生成绩表中&#xff0c;一名学生的信息包含如下信息&#xff1a; 学号(11位)、姓名、数学成绩、英语成绩、程序设计成绩、物理成绩。 本题要求编写程序&#xff0c;录入N条学生的信息&#xff0c;并且按查询要求显示学生成绩等信息。 输入格式: 输入在第一行给出正整数N(N…

Java学习网站,哪个最靠谱?

简介 Java学习网站有很多&#xff0c;哪个最靠谱呢&#xff1f;本文对Java学习网站进行对比。 第1类&#xff1a;大型培训机构(黑马等) 典型机构 黑马、尚硅谷、动力节点、白马、千锋、达内。 优点 知名度高。教程齐全&#xff08;Java、前端、Python等都有&#xff09;省…

PiflowX组件-ReadFromUpsertKafka

ReadFromUpsertKafka组件 组件说明 upsert方式从Kafka topic中读取数据。 计算引擎 flink 有界性 Unbounded 组件分组 kafka 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子kafka_hostKAFKA_HO…

AI看图识熊实战(一)

使用ONNX Runtime封装onnx模型并推理 进行这一步之前&#xff0c;请确保已正确安装配置了Visual Studio 2017 和 C#开发环境。 项目的代码也可以在这里找到&#xff0c;下面的步骤是带着大家从头到尾做一遍。 界面设计 创建Windows窗体应用(.NET Framework)项目&#xff0c…

c# 学习笔记 - 枚举

文章目录 1. 枚举1.1 枚举结构梳理1.2 枚举完整代码1.3 枚举知识点补充 2. 迭代两种命名空间接口3. yield语句 1. 枚举 1.1 枚举结构梳理 结构图   上图内容可能依旧不通俗易懂&#xff0c;这里使用最简明的话语告诉大家实现方式. foreach语句就是集合的遍历操作&#xff0c…

221.【2023年华为OD机试真题(C卷)】字符串变换最小字符串(贪心策略-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目二.解题思路三.题解代码Python题解代码JAVA题解…

2024.1.3力扣每日一题——从链表中移除节点

2024.1.3 题目来源我的题解方法一 递归方法二 栈方法三 反转链表方法四 单调栈头插法 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2487 我的题解 方法一 递归 当前节点对其右侧节点是否删除无影响&#xff0c;因此可以对其右侧节点进行递归移除。 若当前节点为空&am…

快速掌握Postman实现接口测试

快速掌握Postman实现接口测试 Postman简介 Postman是谷歌开发的一款网页调试和接口测试工具&#xff0c;能够发送任何类型的http请求&#xff0c;支持GET/PUT/POST/DELETE等方法。Postman非常简单易用&#xff0c;可以直接填写URL&#xff0c;header&#xff0c;body等就可以发…

Unity2D学习笔记 | 《勇士传说》教程 | (六)

目录 &#xff08;一&#xff09;存档点对象制作 &#xff08;二&#xff09;保存数据与加载数据 &#xff08;三&#xff09;存储数值与场景 &#xff08;四&#xff09;游戏结束画面制作 &#xff08;五&#xff09;序列化数据保存 &#xff08;一&#xff09;存档点对象…

Java多线程技术11——ThreadPoolExecutor类的使用2

1 isShutdown()方法 public boolean isShutdown()方法的作用是判断线程池是否已经关闭 public class Run1 {public static void main(String[] args) {Runnable runnable new Runnable() {Overridepublic void run() {try {System.out.println("开始: " Thread.c…

软件安装文档 | MinIO

# docker 下载镜像 docker pull minio/minio# 安装镜像docker run \ --name minio \ -p 19000:9000 \ -p 19090:9090 \ -d --restartalways \ -e "MINIO_ROOT_USERsuweijie" \ -e "MINIO_ROOT_PASSWORDSuweijie0217" \ -v /home/data:/data \ -v /home/c…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第三天-Linux进程练习题(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…

优化|PLSA理论与实践

PLSA又称为概率潜在语义分析&#xff0c;是一种利用概率生成模型对文本集合进行话题分析的无监督学习方法。该模型最大的特点是加入了主题这一隐变量&#xff0c;文本生成主题&#xff0c;主题生成单词&#xff0c;从而得到单词-文本共现矩阵。本文将对包含物理学、计算机科学、…

学习笔记——C++中的循环结构 while语句

while循环语句 作用&#xff1a;满足循环条件&#xff0c;执行循环语句 语法&#xff1a;while&#xff08;循环条件&#xff09;{循环语句} 解释&#xff1a;只要循环条件的结果为真&#xff0c;就执行循环语句 以打印0-9这十个数字为例&#xff0c;特别需要注意的是&…

Anaconda安装失败及解决办法

查看Anaconda版本时正常显示 报错显示&#xff1a; 解决办法&#xff1a; 确保系统要求满足&#xff1a;检查你的操作系统是否满足 Anaconda 的最低要求。例如&#xff0c;确保你使用的是 64 位操作系统&#xff0c;同时具备足够的磁盘空间。禁用防病毒软件&#xff1a;某些防…

单片机原理及应用:独立式键盘控制LED与多功能按键识别

今天来介绍另一个外设——按键与LED的配合工作&#xff0c;与开关不同&#xff0c;按键需要注意消除抖动带来的影响&#xff0c;代码逻辑也会更复杂一写&#xff0c;下面先为大家介绍独立式键盘的相关知识。 单片机的独立式键盘指的是一种不依赖于计算机或其他外部设备的键盘输…