<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      擼一個(gè)功能強(qiáng)大的基于語(yǔ)義的圖像檢索系統(tǒng)

      ?

      視頻演示:

      擼一個(gè)功能強(qiáng)大的基于語(yǔ)義的圖像檢索系統(tǒng)


       

      大家好,這里是Coding茶水間。

      在上一期視頻中,我們介紹了Ultralytics框架下最新更新的語(yǔ)義檢索功能,只需本地3行代碼,就能構(gòu)建一個(gè)基于文本語(yǔ)義的圖像檢索網(wǎng)站。

      然而,框架自帶的界面較為固定,如果需要自定義界面,還需額外開(kāi)發(fā);

      此外,對(duì)中文支持不佳,使用中文檢索時(shí)結(jié)果往往偏差;

      還有小伙伴提出,能否實(shí)現(xiàn)以圖搜圖功能?

      本期視頻針對(duì)這些問(wèn)題進(jìn)行完善,如果你還沒(méi)看過(guò)上一期,建議先回顧一下。

      自定義界面的搭建

      Ultralytics框架的VisualAISearch功能強(qiáng)大,但存在以下局限:

      • 界面固定:框架提供的界面無(wú)法滿足個(gè)性化需求,需要自行編寫GUI。
      • 中文支持差:直接用中文查詢,語(yǔ)義理解不準(zhǔn),導(dǎo)致檢索結(jié)果不理想。
      • 缺少以圖搜圖:原生僅支持文本檢索,無(wú)法直接用圖像查詢相似圖像。

      本期我們構(gòu)建了一個(gè)自定義界面,支持文本檢索(兼容中文)和圖像檢索,全基于語(yǔ)義理解。

      主界面


      基于Kimi的中文轉(zhuǎn)英文

      我們使用PyQt5構(gòu)建圖形界面,集成Ultralytics的搜索功能,并借助Kimi AI處理中文翻譯。

      1. 中文測(cè)試

      界面支持:

      • 文本檢索:輸入中文描述,如“一只歡樂(lè)的奔跑的狗”,系統(tǒng)后臺(tái)自動(dòng)翻譯成英文后檢索。
      • 圖像檢索:上傳圖像,系統(tǒng)基于語(yǔ)義相似度返回相似度最高的8個(gè)圖像。
      • 顯示相似度,并在網(wǎng)格中展示結(jié)果圖像。

      一只歡樂(lè)的奔跑的狗

      檢索速度快,文本檢索的主要耗時(shí)在翻譯網(wǎng)絡(luò)請(qǐng)求上,實(shí)際搜索實(shí)時(shí)完成。

      2. 集成Kimi AI

      上文中我們搜索的時(shí)候,直接輸入的是中文。

      但是原模型對(duì)中文支持比較差,我們用Kimi AI翻譯輸入為英文。新用戶注冊(cè)Kimi獲15元額度,足夠多次翻譯。注冊(cè)后創(chuàng)建API Key,填入代碼即可。

      apikey

      翻譯類(KimiTranslator.py):

      python

      import requests
      
      class KimiTranslator:
          def __init__(self, api_key):
              self.api_key = api_key
      
          def translate(self, text):
              if not self.api_key:
                  raise ValueError("API key is empty")
              
              url = "https://api.moonshot.ai/v1/chat/completions"
              headers = {
                  "Authorization": f"Bearer {self.api_key}",
                  "Content-Type": "application/json"
              }
              data = {
                  "model": "moonshot-v1-8k",
                  "messages": [
                      {"role": "system", "content": "You are a helpful and precise assistant for translating Chinese to English."},
                      {"role": "user", "content": f"Translate the following Chinese text to English: {text}"}
                  ],
                  "temperature": 0.3
              }
              
              response = requests.post(url, headers=headers, json=data)
              if response.status_code == 200:
                  return response.json()["choices"][0]["message"]["content"]
              else:
                  raise Exception(f"Error: {response.status_code} - {response.text}")

      核心代碼實(shí)現(xiàn)

      主窗口類(MainWindow)繼承PyQt5,初始化搜索器并連接按鈕信號(hào)。

      完整代碼:

      python

      import sys
      from PyQt5 import QtWidgets
      import cv2
      from PyQt5.QtGui import *
      from PyQt5.QtCore import *
      import numpy as np
      from PyQt5.QtWidgets import *
      from ultralytics import solutions
      import os
      from main_window import Ui_MainWindow
      from KimiTranslator import KimiTranslator
      
      class MainWindow(QMainWindow, Ui_MainWindow):
          def __init__(self):
              super().__init__()
              self.setupUi(self)
              self.dir = "JPEGImages"
              self.searcher = solutions.VisualAISearch(
                  data=self.dir
              )
              # 填寫 Kimi 的 API Key
              API_KEY = ""  # 在這里替換為你的 API Key
              
              # 創(chuàng)建翻譯器實(shí)例
              self.translator = KimiTranslator(API_KEY)
              
              # 初始化文件路徑
              self.file_path = None
              
              # 連接按鈕信號(hào)(假設(shè) UI 中的對(duì)象名;如果不同,請(qǐng)調(diào)整)
              self.btnSelectImage.clicked.connect(self.selectImage)  # 選擇圖像按鈕
              self.btnTextSearch.clicked.connect(self.searchText2Pic)  # 以文搜圖按鈕
              self.btnImageSearch.clicked.connect(self.searchPic2Pic)  # 以圖搜圖按鈕
      
          def updateImage(self, path, qlabel):
              image = self.cv_imread(path)
              if image is not None:
                  rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
                  rows, cols, channels = rgb_image.shape
                  bytesPerLine = channels * cols
                  QImg = QImage(rgb_image.data, cols, rows, bytesPerLine, QImage.Format_RGB888)
                  qlabel.setPixmap(QPixmap.fromImage(QImg).scaled(qlabel.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation))
      
          def selectImage(self):
              file_path, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Select an Image", "", "Image Files (*.jpg *.jpeg *.png)")
              if file_path:
                  self.file_path = file_path
                  self.updateImage(self.file_path, self.queryImagePreview)
      
          def cv_imread(self, path):
              cv_img = cv2.imdecode(np.fromfile(path, dtype=np.uint8), -1)
              return cv_img
      
          def searchText2Pic(self):
              query_text = self.textQueryEdit.toPlainText().strip()
              if not query_text:
                  QtWidgets.QMessageBox.warning(self, "提示", "輸入文本不能為空")
                  return
              translated = self.translator.translate(query_text)
              results = self.searcher.search_text(translated)
              self.updateResults(results)
      
          def searchPic2Pic(self):
              if not self.file_path:
                  QtWidgets.QMessageBox.warning(self, "提示", "請(qǐng)選擇圖像")
                  return
              results = self.searcher.search_image(self.file_path)
              self.updateResults(results)
      
          def updateResults(self, results):
              image_paths = []
              similarities = []
              for image_path, similarity in results[:8]:
                  if hasattr(image_path, '__str__'):
                      image_path = str(image_path)
                  # 拼接完整路徑
                  full_path = os.path.join(self.dir, image_path)
                  image_paths.append(full_path)
                  similarities.append(round(similarity, 4))
              
              # 更新圖像和相似度,處理少于8個(gè)結(jié)果的情況
              for i in range(8):
                  label = getattr(self, f'image_{i+1}')
                  sim_label = getattr(self, f'similarity_{i+1}')
                  if i < len(image_paths):
                      self.updateImage(image_paths[i], label)
                      sim_label.setText("相似度:" + str(similarities[i]))
                  else:
                      label.clear()
                      sim_label.setText("")
      
      if __name__ == "__main__":
          app = QApplication(sys.argv)
          window = MainWindow()
          window.show()
          sys.exit(app.exec_())

      依賴:PyQt5、opencv-python、ultralytics、requests。圖像目錄“JPEGImages”需預(yù)置圖像。


      使用效果演示

      文本檢索示例

      “一個(gè)人抱著一只狗”——包含人與狗的語(yǔ)義圖像。

      一個(gè)人抱著一只狗

      圖像檢索示例

      上傳一張實(shí)例圖像,點(diǎn)擊“以圖搜圖”,原圖相似度1.0,其后是相似語(yǔ)義圖像,如下圖所示。

      以圖搜圖


      結(jié)語(yǔ)

      這個(gè)系統(tǒng)完善了Ultralytics的語(yǔ)義檢索,支持自定義界面和中文。

      歡迎三連加關(guān)注,留言郵箱,我發(fā)源碼給大家!如果有問(wèn)題,評(píng)論區(qū)討論。

      ?

      posted @ 2025-10-24 13:01  Coding茶水間  閱讀(369)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 边添小泬边狠狠躁视频| 国产精品伦人视频免费看| 中国国产一级毛片| 亚洲av午夜福利大精品| 美女黄网站人色视频免费国产| 不卡av电影在线| 国产成人精品亚洲一区二区| 中文字幕乱码一区二区免费| 国产第一页浮力影院入口| 亚洲AV成人片在线观看| 精品亚洲欧美中文字幕在线看| 国产肥臀视频一区二区三区| 99在线小视频| 精品一区二区三区国产馆| 五月丁香啪啪| 鲁丝片一区二区三区免费| 久久久久成人精品无码中文字幕| 少妇人妻偷人精品视蜜桃| 国产v综合v亚洲欧美大天堂| 国产-第1页-浮力影院| 国产无遮挡真人免费视频| 999福利激情视频| 亚洲国产成人久久综合区| 国产精品v片在线观看不卡| 国产性天天综合网| 18禁精品一区二区三区| 精品偷拍一区二区三区| 邹平县| 日韩av无码一区二区三区| 精品无码一区在线观看| 日本边添边摸边做边爱喷水| 熟女国产精品一区二区三| 亚洲av产在线精品亚洲第一站| 国产久爱免费精品视频| 中文 在线 日韩 亚洲 欧美| 国产女人高潮视频在线观看| 国产精品国产三级国快看| 免费国产黄线在线观看| 国产AV影片麻豆精品传媒| 久久精产国品一二三产品| av在线播放国产一区|