🔥🔥Java开发者的Python快速实战指南:探索向量数据库之图像相似搜索-文字版

这篇具有很好参考价值的文章主要介绍了🔥🔥Java开发者的Python快速实战指南:探索向量数据库之图像相似搜索-文字版。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先,我要向大家道个歉。原本我计划今天向大家展示如何将图片和视频等形式转换为向量并存储在向量数据库中,但是当我查看文档时才发现,腾讯的向量数据库尚未完全开发完成。因此,今天我将用文本形式来演示相似图片搜索。如果您对腾讯的产品动态不太了解,可以查看官方网址:https://cloud.tencent.com/document/product/1709/95477

在开始讲解之前,我想给大家介绍一个很有用的第三方包,它就是gradio。如果你想与他人共享你的机器学习模型、API或数据科学工作流的最佳方式之一,可以创建一个交互式应用,让用户或同事可以在浏览器中试用你的演示。而gradio正是可以帮助你在Python中构建这样的演示,并且只需要几行代码即可完成!

作为一个后端开发者,我了解如果要我开发前端代码来进行演示,可能需要花费很长时间,甚至可能需要以月为单位计算。所幸,我发现了gradio这个工具的好处,它可以帮助我解决这个问题。使用gradio,我只需要专注于实现我的方法,而不需要关心如何实现界面部分,这对于像我这样不擅长前端开发的人来说非常合适。gradio为我提供了一个简单而有效的解决方案。

源码仓库地址:https://github.com/StudiousXiaoYu/tx-image-search

Gradio

关于gradio的环境配置和官方文档,我就不再赘述了,有兴趣的同学可以去官方文档地址https://www.gradio.app/guides/quickstart 查看。对于后端开发者来说,上手使用gradio非常容易。

🔥🔥Java开发者的Python快速实战指南:探索向量数据库之图像相似搜索-文字版

接下来,我们将搭建一个最简单的图片展示应用。由于我要实现的功能是图片展示,所以我将直接上代码。

数据准备

首先,我们需要准备数据。我已经从官方获取了训练数据,并将图片的信息和路径保存到了我的向量数据库中。幸运的是,这些数据已经被整理成了一个CSV文件。现在,我想要将这些数据插入到数据库中。这是一个很好的机会来练习一下我们的Python语法,比如读取文件、引用第三方包以及使用循环。让我们来看一下具体的实现方法。

我的csv文件是这样的:

id,path,label
0,./train/brain_coral/n01917289_1783.JPEG,brain_coral
1,./train/brain_coral/n01917289_4317.JPEG,brain_coral
2,./train/brain_coral/n01917289_765.JPEG,brain_coral
3,./train/brain_coral/n01917289_1079.JPEG,brain_coral
4,./train/brain_coral/n01917289_2484.JPEG,brain_coral
5,./train/brain_coral/n01917289_1082.JPEG,brain_coral
6,./train/brain_coral/n01917289_1538.JPEG,brain_coral

在这个文件中,第一行是列名,从第二行开始,我可以开始解析数据了。

之前已经完成了数据库的创建,所以我就不再演示了。现在,我们将直接开始设计集合,并将数据插入到我们的集合中。

import gradio as gr
import numpy as np
import tcvectordb
from tcvectordb.model.collection import Embedding
from tcvectordb.model.document import Document, Filter, SearchParams
from tcvectordb.model.enum import FieldType, IndexType, MetricType, ReadConsistency,EmbeddingModel
from tcvectordb.model.index import Index, VectorIndex, FilterIndex, HNSWParams

client = tcvectordb.VectorDBClient(url='http://*****',
                                   username='root', key='1tWQ*****',
                                   read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)
db = client.database('db-xiaoyu')

上面提到的这些流程是基本的,我就不再详细解释了。我们可以直接开始连接,但是在此之前,我们需要先创建一个专门用于图片搜索的集合。之前我们创建的是用于文本搜索的集合,现在我们需要创建一个新的集合来区分。以下是相应的代码:

# -- index config
index = Index(
    FilterIndex(name='id', field_type=FieldType.String, index_type=IndexType.PRIMARY_KEY),
    VectorIndex(name='vector', dimension=768, index_type=IndexType.HNSW,
                metric_type=MetricType.COSINE, params=HNSWParams(m=16, efconstruction=200))
)

# Embedding config
ebd = Embedding(vector_field='vector', field='image_info', model=EmbeddingModel.BGE_BASE_ZH)

# create a collection
coll = db.create_collection(
    name='image-xiaoyu',
    shard=1,
    replicas=0,
    description='this is a collection of test embedding',
    embedding=ebd,
    index=index
)

由于目前向量数据库尚未完全支持图像文件转换为向量的功能,因此我们决定将其改为存储图像描述信息,并将图像路径直接存储为普通字段。由于我们对路径没有过滤要求,因此将其作为普通字段进行存储。所有信息已经成功存储在CSV文件中,因此我们只需直接读取该文件内容并将其存入向量数据库中即可。以下是相关代码示例:

data = np.genfromtxt('./reverse_image_search/reverse_image_search.csv', delimiter=',', skip_header=1, usecols=[0, 1, 2], dtype=None)
doc_list = []
for row in data:
    id_row = str(row[0])
    image_url = row[1].decode()
    image_info = row[2].decode()
    doc_list.append(Document(id=id_row,image_url=image_url,image_info=image_info))
res = coll.upsert(
        documents=doc_list,
        build_index=True
    )

在这段代码中,我使用了 import numpy as np 语句来导入 numpy 库。为什么我使用它呢?因为我在搜索中发现它可以处理 CSV 文件。毕竟,在Python编程中总是喜欢使用现成的工具。最后,我将 Document 封装成一个列表,并将其全部插入到集合中。

构建Gradio交互界面

数据准备工作已经完成,接下来我们需要考虑如何建立一个交互界面。我知道Python有很多优秀的库,其中有一个可以一键构建交互界面的库,这真的很厉害。与Java的自定义界面相比,它们是完全不同的东西,因为他俩没得比。为了实现交互界面的功能,我们需要在一个新的py文件中编写以下代码:

import gradio as gr
import tcvectordb
from tcvectordb.model.document import SearchParams
from tcvectordb.model.enum import ReadConsistency

client = tcvectordb.VectorDBClient(url='http://lb-m*****',
                                   username='root', key='1tWQ*****',
                                   read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)
db = client.database('db-xiaoyu')
coll = db.collection('image-xiaoyu')


def similar_image_text(text):
    doc_lists = coll.searchByText(
        embeddingItems=[text],
        params=SearchParams(ef=200),
        limit=3,
        retrieve_vector=False,
        output_fields=['image_url', 'image_info']
    )
    img_list = []
    for i,docs in enumerate(doc_lists.get("documents")):
        for my_doc in docs:
            print(type(my_doc["image_url"]))
            img_list.append(str(my_doc["image_url"]))
    return img_list


def similar_image(x):
    pass


with gr.Blocks() as demo:
    gr.Markdown("使用此演示通过文本/图像文件来找到相似图片。")
    with gr.Tab("文本搜索"):
        with gr.Row():
            text_input = gr.Textbox()
            image_text_output = gr.Gallery(label="最终的结果图片").style(height='auto', columns=3)
        text_button = gr.Button("开始搜索")
    with gr.Tab("图像搜索"):
        with gr.Row():
            image_input = gr.Image()
            image_output = gr.Gallery(label="最终的结果图片").style(height='auto', columns=3)
        image_button = gr.Button("开始搜索")

    with gr.Accordion("努力的小雨探索AI世界!"):
        gr.Markdown("先将图片或者路径存储到向量数据库中。然后通过文本/图像文件来找到相似图片。")

    text_button.click(similar_image_text, inputs=text_input, outputs=image_text_output)
    image_button.click(similar_image, inputs=image_input, outputs=image_output)

demo.launch()

我创建了一个带有两个标签页的界面。由于本次项目不需要使用图像相似搜索功能,所以等到该功能推出后,我会再次进行图像方面的相似搜索演示。目前,我们只能通过图片描述来查找并显示图片。这部分没有太多值得讲的,我只是对 Gardio 官方示例进行了一些修改。如果你还不清楚的话,我建议你查看官方示例和介绍。现在,让我们来看一下我的运行界面吧。

🔥🔥Java开发者的Python快速实战指南:探索向量数据库之图像相似搜索-文字版

当我输入"gold"后,根据我所存储的图片描述是"gold fish",所以可以找到对应的匹配项。当我看到三种金鱼的图片时,就说明我们的运行是正常的。我已经为图片相似搜索留出来了,以便及时更新。

总结

今天我们写代码时,基本上已经熟练掌握了Python的语法。剩下的就是学习如何使用第三方包,以及在编写过程中遇到不熟悉的包时,可以通过百度搜索来获取答案。虽然并没有太大难度,但是对于使用gradio来说,可能需要花费一些时间上手。有时会遇到一些错误,不像Java那样能够一眼识别出问题所在,需要上网搜索来解决。文章来源地址https://www.toymoban.com/news/detail-748189.html

到了这里,关于🔥🔥Java开发者的Python快速实战指南:探索向量数据库之图像相似搜索-文字版的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java开发者的Python快速进修指南:实战之跳表pro版本

    之前我们讲解了简易版的跳表,我希望你能亲自动手实现一个更完善的跳表,同时也可以尝试实现其他数据结构,例如动态数组或哈希表等。通过实践,我们能够发现自己在哪些方面还有所欠缺。这些方法只有在熟练掌握之后才会真正理解,就像我在编写代码的过程中,难免

    2024年02月05日
    浏览(65)
  • 🔥🔥Java开发者的Python快速实战指南:实用工具之PDF转DOCX文档(可视化界面)

    首先,大家对Python语法的了解已经基本完成,现在我们需要开始进行各种练习。我为大家准备了一些练习题目,比如之前的向量数据库等,这些题目可以参考第三方的SDK来进行操作,文档也是比较完善的。这个过程有点像我们之前使用Java对接第三方接口的方式,所以今天我想

    2024年02月05日
    浏览(66)
  • Java开发者的Python快速实战指南:实用工具之PDF转DOCX文档(可视化界面)

    首先,大家对Python语法的了解已经基本完成,现在我们需要开始进行各种练习。我为大家准备了一些练习题目,比如之前的向量数据库等,这些题目可以参考第三方的SDK来进行操作,文档也是比较完善的。这个过程有点像我们之前使用Java对接第三方接口的方式,所以今天我想

    2024年02月05日
    浏览(66)
  • Java开发者的Python快速进修指南:异常捕获

    在之前的学习中,我们已经讲解了函数和控制流等基本概念。然而,在接触实际业务时,你会发现异常捕获也是必不可少的一部分,因为在Java编程中,异常处理是不可或缺的。Python的异常捕获与Java的异常捕获原理是相同的,只是在写法上有一些区别。它们的目的都是为了处

    2024年02月05日
    浏览(81)
  • 🔥🔥Java开发者的Python快速进修指南:文件操作

    Python提供的文件操作相对于Java来说,确实简单方便许多。不仅操作简单,代码可读性也相对较高。然而,我们需要注意的不仅仅是文件操作的简单性,还有文件操作的各种模式。在Java中,我们并不经常使用像Python中那样的操作模式。 另外,我们还需要注意文件指针的移动。

    2024年02月05日
    浏览(84)
  • 🔥🔥Java开发者的Python快速进修指南:函数基础

    话不多说,今天我们要介绍的是函数。本系列文章追求短而精,今天我们将重点讨论函数以及与Java方法的区别。与Java方法不同,函数不需要像Java方法一样讲究修饰符等其他特性,它只需要使用\\\"def\\\"进行声明。另外,函数的参数也与Java方法有所不同,Java方法中不存在默

    2024年02月05日
    浏览(64)
  • 🔥🔥Java开发者的Python快速进修指南:函数进阶

    在上一篇文章中,我们讲解了函数最基础常见的用法,今天我想在这里简单地谈一下函数的其他用法。尽管这些用法可能不是非常常见,但我认为它们仍然值得介绍。因此,我将单独为它们开设一个章节,并探讨匿名函数和装饰器函数这两种特殊的用法。 在Python中,匿名函数

    2024年02月05日
    浏览(56)
  • 🔥🔥Java开发者的Python快速进修指南:面向对象进阶

    在上一期中,我们对Python中的对象声明进行了初步介绍。这一期,我们将深入探讨对象继承、组合以及多态这三个核心概念。不过,这里不打算赘述太多理论,因为我们都知道,Python与Java在这些方面的主要区别主要体现在语法上。例如,Python支持多重继承,这意味着一个类可

    2024年02月05日
    浏览(61)
  • 🔥🔥Java开发者的Python快速进修指南:面向对象基础

    当我深入学习了面向对象编程之后,我首先感受到的是代码编写的自由度大幅提升。不同于Java中严格的结构和约束,Python在面向对象的实现中展现出更加灵活和自由的特性。它使用了一些独特的,如self和cls,这些不仅增强了代码的可读性,还提供了对类和实例的明确

    2024年02月05日
    浏览(68)
  • Java开发者的Python快速进修指南:面向对象--高级篇

    首先,让我来介绍一下今天的主题。今天我们将讨论封装、反射以及单例模式。除此之外,我们不再深入其他内容。关于封装功能,Python与Java大致相同,但写法略有不同,因为Python没有修饰符。而对于反射来说,我认为它比Java简单得多,不需要频繁地获取方法和属性,而是

    2024年02月05日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包