IMM語義檢索是採用向量檢索方式,根據特定內容語義對多媒體資料進行搜尋的過程,本文介紹如何使用語義檢索。
功能簡介
傳統的標量檢索是根據檔案攜帶的中繼資料資訊進行檢索,例如檔案名稱、檔案建立時間、檔案格式等。與標量檢索不同的是,語義檢索採用向量檢索的方式,可以根據檔案內容進行檢索,例如“俯瞰森林”、“雪中城市”、“去年夏天的草原”等檔案內容。您可以利用 IMM 語義檢索能力對您Object Storage Service 中的檔案進行檢索,也可以對網盤與相簿服務 PDS 中的檔案進行檢索。
應用情境
個人及企業辦公情境
語義檢索功能可以通過特定語義內容直接對辦公檔案進行搜尋,例如直接搜尋“ERP 系統使用方式”、“IT 維修流程”“2024 年經營情況分析”等關鍵詞,以實現檔案搜尋方式的便捷化,從而提升辦公效率。
多媒體社交情境
在多媒體社交情境中,您可以利用IMM語義檢索能力,為您的使用者提供特定內容和多媒體資料檢索功能。例如,在某款社交應用程式中,使用者上傳了大量圖片資料。通過語義檢索,使用者可以直接根據內容進行圖片搜尋,比如直接搜尋內容為“去年郊外春遊”、“春節團聚”、“我見過的大海”等照片,從而為應用程式增加實用性和趣味性。
網盤情境
在網盤情境中,目前大多數提供基於標量檢索的檔案搜尋功能,例如按檔案名稱、建立時間或檔案尾碼進行搜尋。網盤通常應用於個人或企業情境,使用者可以利用IMM語義檢索功能,對網盤中的特定內容進行搜尋,比如相關文檔或相簿中的相關圖片。
視頻監控情境
針對視頻監控儲存區的資料,企業可以利用 IMM 語義檢索能力對監控資料中的部分檔案進行搜尋。比如輸入“昨天的雪天戶外監控”、“晴天中的果園”等關鍵詞,即可對相應檔案進行檢索。
使用限制
目前僅支援對圖片和文檔進行語義檢索。
該功能當前僅支援華北2(北京)地區。
該功能支援的圖片格式:JPG、PNG、BMP、GIF、WebP、TIFF、HEIC、AVIF。
原圖大小不超過 20MB,且對應的原圖高或者寬不能超過30,000 px和總像素不能超過2.5億 px。動態圖片(例如GIF圖片)的總像素計算方式為寬*高*圖片幀數;非動態圖片(例如PNG圖片)的總像素計算方式為寬*高。
文檔大小不得超過30萬字元,超過限制將會被截斷。
資料索引與分析是一個非同步過程。在使用諸如 IndexFileMeta 等 API 介面添加檔案索引後,需要通過回調訊息通知來確認分析完成。這通常需要幾秒或者幾分鐘的時間,具體等待時間取決於您提交的檔案類型和大小,分析的複雜程度以及所需的時間也會有所不同。在分析完成後,由於儲存引擎需要構建索引,通常需要等待幾秒的時間,之後您就可以開始檢索這些檔案。
前提條件
已根據使用情境為檔案建立中繼資料索引。具體操作,請參見建立中繼資料索引。
資料集選擇“Official:CognitionImageManagement” 或者 “Official:CognitionDocumentManagement” 模板,分別對應“圖片語義檢索”和“文檔語義檢索”功能。
當您不再需要進行語義檢索時,請及時刪除資料集。未刪除的IMM 資料集將持續自動抽取 OSS 中繼資料,該過程會導致 IMM 持續產生資料請求費用。
計費說明
IMM 費用:使用 IMM 語義檢索功能,將會產生“中繼資料管理”相關介面的調用費用,詳情請參見IMM計費項目概述。
在您使用語義檢索時,您需要為您的資料集選擇“Official:CognitionImageManagement” 或者 “Official:CognitionDocumentManagement” 模板,分別對應“圖片語義檢索”和“文檔語義檢索”功能。模板中包含了多種運算元,其中語義檢索運算元為免費提供,其餘運算元為收費狀態,關於模板與運算元的對應關係,請查看工作流程範本與運算元。
OSS 費用:詳情請參見 OSS計費概述。
語義檢索
調用 SemanticQuery - 自然語言查詢介面對專案test-project下test-dataset資料集中的中繼資料進行基於語義的查詢搜尋。
圖片語義檢索
例如:某個相簿中包含大量旅遊拍攝的圖片,其中一些照片是2020年7月份在成都熊貓基地拍攝的熊貓,若需通過語義檢索找到這些圖片,可以建立一個資料集為相簿中的照片建立中繼資料索引,之後使用關鍵字”2020年7月成都的熊貓“來進行檢索。
如下以查詢專案test-project下,test-dataset資料集中包含2020年7月成都的熊貓的檔案為例:
請求樣本
{
"ProjectName": "test-project",
"DatasetName": "test-dataset",
"Query": "2020年7月成都的熊貓"
}返回樣本
{
"RequestId": "645FB6D9-5EA0-02C9-B253-****",
"Files": [
{
"ProduceTime": "2020-07-19T17:11:11+08:00",
"ObjectACL": "default",
"ContentType": "image/jpeg",
"ProjectName": "test-project",
"Size": 22868,
"URI": "oss://test-bucket/test-object.jpg",
"Addresses": [
{
"Language": "zh-Hans",
"Township": "三河街道",
"AddressLine": "四川省成都市新都區三河街道成都大熊貓繁育研究基地",
"Country": "中國",
"City": "成都市",
"District": "新都區",
"Province": "四川省"
}
],
"ObjectType": "file",
"OwnerId": "****",
"FileModifiedTime": "2021-05-13T10:22:44+08:00",
"ImageWidth": 270,
"OSSStorageClass": "Standard",
"MediaType": "image",
"ObjectId": "****",
"CreateTime": "2022-07-06T07:10:18.497753661+08:00",
"Filename": "1.jpg",
"Labels": [
{
"CentricScore": 0.757,
"Language": "zh-Hans",
"LabelConfidence": 0.946,
"LabelName": "熊貓",
"LabelLevel": 2,
"ParentLabelName": "野生動物"
},
...
],
"Orientation": 1,
"EXIF": "...",
"ContentMd5": "HZwoCnxPZ/fvhz4oRJ****",
"ImageHeight": 270,
"ImageScore": {
"OverallQualityScore": 0.719
},
"ETag": "\"1D9C280A7C4F67F7EF873E28449D****\"",
"DatasetName": "test-dataset",
"FileHash": "\"1D9C280A7C4F67F7EF873E2****\"",
"UpdateTime": "2022-07-06T07:10:18.497753661+08:00",
"OSSCRC64": "5634447745650079669",
"OSSTaggingCount": 0,
"LatLong": "34.000000,119.000000",
"OSSObjectType": "Normal"
}
]
}範例程式碼(以1.27.3版本的Python SDK為例)
# -*- coding: utf-8 -*-
import os
from alibabacloud_imm20200930.client import Client as imm20200930Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_imm20200930 import models as imm_20200930_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient
class Sample:
def __init__(self):
pass
@staticmethod
def create_client(
access_key_id: str,
access_key_secret: str,
) -> imm20200930Client:
"""
使用AccessKey ID&AccessKey Secret初始化帳號Client。
@param access_key_id:
@param access_key_secret:
@return: Client
@throws Exception
"""
config = open_api_models.Config(
access_key_id=access_key_id,
access_key_secret=access_key_secret
)
config.endpoint = f'imm.cn-beijing.aliyuncs.com'
return imm20200930Client(config)
@staticmethod
def main() -> None:
# 阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
# 強烈建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
# 本樣本通過從環境變數中讀取AccessKey,來實現API訪問的身分識別驗證。如何配置環境變數,請參見https://www.alibabacloud.com/help/document_detail/2361894.html。
imm_access_key_id = os.getenv("AccessKeyId")
imm_access_key_secret = os.getenv("AccessKeySecret")
client = Sample.create_client(imm_access_key_id, imm_access_key_secret)
semantic_query_request = imm_20200930_models.SemanticQueryRequest(
query='2020年7月成都的熊貓',
project_name='test-project',
dataset_name='test-dataset',
max_results=100
)
runtime = util_models.RuntimeOptions()
try:
# 列印API的傳回值。
response = client.semantic_query_with_options(semantic_query_request, runtime)
print(response.body.to_map())
except Exception as error:
# 如有需要,請列印錯誤資訊。
UtilClient.assert_as_string(error.message)
print(error)
if __name__ == '__main__':
Sample.main()文檔語義搜尋
例如:在網盤情境中,該網盤儲存了各種類型的檔案。若要利用語義搜尋找到包含“IT服務流程”內容的檔案,可以建立一個資料集來為網盤中的檔案建立中繼資料索引,之後使用關鍵詞“IT服務流程”進行檢索。
如下以查詢專案test-project下,test-dataset資料集中包含“IT服務流程”的檔案為例,請求參數如下。
請求樣本
{
"ProjectName": "test-project",
"DatasetName": "test-dataset",
"MediaTypes": ["document"],
"Query": "IT服務流程"
}返回樣本
{
"RequestId": "CD870E69-D2E8-031B-BD3E-****",
"Files": [
{
"ObjectACL": "default",
"ContentType": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"ProjectName": "test-project",
"ObjectId": "2f66ba6e902e5ad42341a9e7365b19f6130d4a077e4f57150450e281d0b7afd9",
"Size": 28340,
"CreateTime": "2024-03-08T10:13:19.569053164+08:00",
"Filename": "3839a9a0-c630-420d-ae69-ea24792412fd.docx",
"URI": "oss://test-bucket/test-object.docx",
"ObjectType": "file",
"ContentMd5": "Y7SmYa831Hq1qryuRyl6mg==",
"OwnerId": "****",
"FileModifiedTime": "2024-01-10T16:18:31+08:00",
"ETag": "\"63B4A661AF37D47AB5AABCAE47297A9A\"",
"DatasetName": "test-dataset",
"FileHash": "63B4A661AF37D47AB5AABCAE47297A9A",
"UpdateTime": "2024-03-08T10:13:19.569053164+08:00",
"OSSStorageClass": "Standard",
"MediaType": "document",
"OSSCRC64": "6833019149643646551",
"OSSTaggingCount": 0,
"OSSObjectType": "Normal"
}
]
}範例程式碼(以1.27.3版本的Python SDK為例)
# -*- coding: utf-8 -*-
import os
from alibabacloud_imm20200930.client import Client as imm20200930Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_imm20200930 import models as imm_20200930_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient
class Sample:
def __init__(self):
pass
@staticmethod
def create_client(
access_key_id: str,
access_key_secret: str,
) -> imm20200930Client:
"""
使用AccessKey ID&AccessKey Secret初始化帳號Client。
@param access_key_id:
@param access_key_secret:
@return: Client
@throws Exception
"""
config = open_api_models.Config(
access_key_id=access_key_id,
access_key_secret=access_key_secret
)
config.endpoint = f'imm.cn-beijing.aliyuncs.com'
return imm20200930Client(config)
@staticmethod
def main() -> None:
# 阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
# 強烈建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
# 本樣本通過從環境變數中讀取AccessKey,來實現API訪問的身分識別驗證。如何配置環境變數,請參見https://www.alibabacloud.com/help/document_detail/2361894.html。
imm_access_key_id = os.getenv("AccessKeyId")
imm_access_key_secret = os.getenv("AccessKeySecret")
client = Sample.create_client(imm_access_key_id, imm_access_key_secret)
semantic_query_request = imm_20200930_models.SemanticQueryRequest(
query='IT服務流程',
project_name='test-project',
dataset_name='test-dataset',
media_types=['document'],
max_results=100
)
runtime = util_models.RuntimeOptions()
try:
# 列印API的傳回值。
response = client.semantic_query_with_options(semantic_query_request, runtime)
print(response.body.to_map())
except Exception as error:
# 如有需要,請列印錯誤資訊。
UtilClient.assert_as_string(error.message)
print(error)
if __name__ == '__main__':
Sample.main()