通过阿里云Milvus与通义千问VL大模型,快速实现多模态搜索
本文主要演示了如何使用阿里云向量检索服务Milvus版与通义千问VL大模型,提取图片特征,并使用多模态Embedding模型,快速实现多模态搜索。
基于灵积(Dashscope)模型服务上的通义千问 API以及Embedding API来接入图片、文本等非结构化数据Embedding为向量的能力。
通义千问VL大模型介绍《通义千问VL API详情》
通义多模态向量模型介绍《Multimodal-Embedding API详情》
前提条件
-
已创建阿里云Milvus实例。具体操作,请参见快速创建Milvus实例。
-
已开通服务并获得API-KEY。具体操作,请参见开通DashScope并创建API-KEY。
该示例的运行环境为python3.9
python3 -m pip install dashscope pymilvus==2.5.0
wget https://github.com/milvus-io/pymilvus-assets/releases/download/imagedata/reverse_image_search.zip
unzip -q -o reverse_image_search.zip
示例代码
在本文示例中,我们先将示例图片通过通义千问VL提取图片描述,存储在image_description中,然后将图片描述和图片通过多模态Embedding模型分别转换为向量存储在image_embedding和text_embedding中。
备注:在该示例中,仅以数据集前200张图片作为演示
import base64
import csv
import dashscope
import os
import pandas as pd
import sys
import time
from tqdm import tqdm
from pymilvus import (connections,FieldSchema,CollectionSchema,DataType,Collection,MilvusException,utility,
)from http import HTTPStatus
import logginglogging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)class FeatureExtractor:def __init__(self, DASHSCOPE_API_KEY):self._api_key = DASHSCOPE_API_KEY # 使用环境变量存储API密钥def __call__(self, input_data, input_type):if input_type not in ("image", "text"):raise ValueError("Invalid input type. Must be 'image' or 'text'.")try:if input_type == "image":_, ext = os.path.splitext(input_data)image_format = ext.lstrip(".").lower()with open(input_data, "rb") as image_file:base64_image = base64.b64encode(image_file.read()).decode("utf-8")input_data = f"data:image/{image_format};base64,{base64_image}"payload = [{"image": input_data}]else:payload = [{"text": input_data}]resp = dashscope.MultiModalEmbedding.call(model="multimodal-embedding-v1",input=payload,api_key=self._api_key,)if resp.status_code == HTTPStatus.OK:return resp.output["embeddings"][0]["embedding"]else:raise RuntimeError(f"API调用失败,状态码: {resp.status_code}, 错误信息: {resp.message}")except Exception as e:logger.error(f"处理失败: {str(e)}")raiseclass FeatureExtractorVL:def __init__(self, DASHSCOPE_API_KEY):self._api_key = DASHSCOPE_API_KEY # 使用环境变量存储API密钥def __call__(self, input_data, input_type):if input_type not in ("image"):raise ValueError("Invalid input type. Must be 'image'.")try:if input_type == "image":payload=[{"role": "system","content": [{"type":"text","text": "You are a helpful assistant."}]},{"role": "user","content": [# {"image": "https://dashscope.oss-cn-beijing.aliyuncs.com/images/dog_and_girl.jpeg"},{"image": input_data},{"text": "先用50字内的文字描述这张图片,然后再给出5个关键词"}],}]resp = dashscope.MultiModalConversation.call(model="qwen-vl-plus",messages=payload,api_key=self._api_key,)if resp.status_code == HTTPStatus.OK:return resp.output["choices"][0]["message"].content[0]["text"]else:raise RuntimeError(f"API调用失败,状态码: {resp.status_code}, 错误信息: {resp.message}")except Exception as e:logger.error(f"处理失败: {str(e)}")raiseclass MilvusClient:def __init__(self, MILVUS_TOKEN, MILVUS_HOST, MILVUS_PORT, INDEX, COLLECTION_NAME):self._token = MILVUS_TOKENself._host = MILVUS_HOSTself._port = MILVUS_PORTself._index = INDEXself._collection_name = COLLECTION_NAMEself._connect()self._create_collection_if_not_exists()def _connect(self):try:connections.connect(alias="default", host=self._host, port=self._port, token=self._token)logger.info("Connected to Milvus successfully.")except Exception as e:logger.error(f"连接Milvus失败: {str(e)}")sys.exit(1)def _collection_exists(self):return self._collection_name in utility.list_collections()def _create_collection_if_not_exists(self):try:if not self._collection_exists():fields = [FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),FieldSchema(name="origin", dtype=DataType.VARCHAR, max_length=512),FieldSchema(name="image_description", dtype=DataType.VARCHAR, max_length=1024),FieldSchema(name="image_embedding", dtype=DataType.FLOAT_VECTOR, dim=1024),FieldSchema(name="text_embedding", dtype=DataType.FLOAT_VECTOR, dim=1024)]schema = CollectionSchema(fields)self._collection = Collection(self._collection_name, schema)if self._index == 'IVF_FLAT':self._create_ivf_index()else:self._create_hnsw_index() logger.info("Collection created successfully.")else:self._collection = Collection(self._collection_name)logger.info("Collection already exists.")except Exception as e:logger.error(f"创建或加载集合失败: {str(e)}")sys.exit(1)def _create_ivf_index(self):index_params = {"index_type": "IVF_FLAT","params": {"nlist": 1024, # Number of clusters for the index},"metric_type": "L2",}self._collection.create_index("image_embedding", index_params)self._collection.create_index("text_embedding", index_params)logger.info("Index created successfully.")def _create_hnsw_index(self):index_params = {"index_type": "HNSW","params": {"M": 64, # Maximum number of neighbors each node can connect to in the graph"efConstruction": 100, # Number of candidate neighbors considered for connection during index construction},"metric_type": "L2",}self._collection.create_index("image_embedding", index_params)self._collection.create_index("text_embedding", index_params)logger.info("Index created successfully.")def insert(self, data):try:self._collection.insert(data)self._collection.load()logger.info("数据插入并加载成功.")except MilvusException as e:logger.error(f"插入数据失败: {str(e)}")raisedef search(self, query_embedding, feild, limit=3):try:if self._index == 'IVF_FLAT':param={"metric_type": "L2", "params": {"nprobe": 10}}else:param={"metric_type": "L2", "params": {"ef": 10}}result = self._collection.search(data=[query_embedding],anns_field=feild,param=param,limit=limit,output_fields=["origin", "image_description"],)return [{"id": hit.id, "distance": hit.distance, "origin": hit.origin, "image_description": hit.image_description} for hit in result[0]]except Exception as e:logger.error(f"搜索失败: {str(e)}")return Nonedef load_image_embeddings(extractor, extractorVL, csv_path):df = pd.read_csv(csv_path)image_embeddings = {}for image_path in tqdm(df["path"].tolist()[:200], desc="生成图像embedding"): # 仅用前100张图进行演示try:desc = extractorVL(image_path, "image")image_embeddings[image_path] = [desc, extractor(image_path, "image"), extractor(desc, "text")]time.sleep(1) # 控制API调用频率except Exception as e:logger.warning(f"处理{image_path}失败,已跳过: {str(e)}")return [{"origin": k, 'image_description':v[0], "image_embedding": v[1], 'text_embedding': v[2]} for k, v in image_embeddings.items()]
数据准备
if __name__ == "__main__":MILVUS_HOST = "c-xxxxxxxxxxxx.milvus.aliyuncs.com"MILVUS_PORT = "19530"MILVUS_TOKEN = "root:password"COLLECTION_NAME = "multimodal_search"INDEX = "IVF_FLAT" # IVF_FLAT OR HNSW# Step1:初始化Milvus客户端milvus_client = MilvusClient(MILVUS_TOKEN, MILVUS_HOST, MILVUS_PORT, INDEX, COLLECTION_NAME)DASHSCOPE_API_KEY = ""# Step2:初始化千问VL大模型与多模态Embedding模型extractor = FeatureExtractor(DASHSCOPE_API_KEY)extractorVL = FeatureExtractorVL(DASHSCOPE_API_KEY)# Step3:将图片数据集Embedding后插入到Milvusembeddings = load_image_embeddings(extractor, extractorVL, "reverse_image_search.csv")milvus_client.insert(embeddings)
在Step1中将Collection创建完成后,可以在控制台登录Attu,查看Collection Schema信息,如下图所示。
在完成Step3后,可以在Attu中查看插入数据,此时图片数据已经过通义千问VL大模型提取描述特征,并Embedding为向量。
可以看出下图经过通义千问VL大模型提取后,文本总结为“站在海滩上的人穿着牛仔裤和绿色靴子。沙滩上有水迹覆盖。关键词:海滩、脚印、沙地、鞋子、裤子”,用文字非常形象的描述了这张图片的特征。
图:jean/n03594734_9714.JPEG
多模态量检索:以文搜图
在下面这个这个示例中,查询文本query为"棕色的狗",将query通过多模态向量模型Embedding以后,分别在image_embedding和text_embedding上进行以文搜图和以文搜文,可以得到不同的检索结果。
注意:由于大模型产出结果存在一定的随机性,本示例结果可能无法完全一致的复现。
if __name__ == "__main__":MILVUS_HOST = "c-xxxxxxxxxxxx.milvus.aliyuncs.com"MILVUS_PORT = "19530"MILVUS_TOKEN = "root:password"COLLECTION_NAME = "multimodal_search"INDEX = "IVF_FLAT" # IVF_FLAT OR HNSW# Step1:初始化Milvus客户端milvus_client = MilvusClient(MILVUS_TOKEN, MILVUS_HOST, MILVUS_PORT, INDEX, COLLECTION_NAME)DASHSCOPE_API_KEY = ""# Step2:初始化多模态Embedding模型extractor = FeatureExtractor(DASHSCOPE_API_KEY)# Step4:多模态搜索示例,以文搜图和以文搜文text_query = "棕色的狗"text_embedding = extractor(text_query, "text")text_results_1 = milvus_client.search(text_embedding, feild = 'image_embedding')logger.info(f"以文搜图查询结果: {text_results_1}")text_results_2 = milvus_client.search(text_embedding, feild = 'text_embedding')logger.info(f"以文搜文查询结果: {text_results_2}")"""
以文搜图查询结果
{'id': 457336885198973657, 'distance': 1.338853359222412, 'origin': './train/Rhodesian_ridgeback/n02087394_9675.JPEG', 'image_description': '一张小狗站在地毯上的照片。它有着棕色的毛发和蓝色的眼睛。\n关键词:小狗、地毯、眼睛、毛色、站立'},
{'id': 457336885198973648, 'distance': 1.3568601608276367, 'origin': './train/Rhodesian_ridgeback/n02087394_6382.JPEG', 'image_description': '这是一只棕色的猎犬,耳朵垂下,脖子上戴着项圈。它正直视前方。\n\n关键词:狗、棕色、猎犬、耳朵、项链'},
{'id': 457336885198973655, 'distance': 1.3838427066802979, 'origin': './train/Rhodesian_ridgeback/n02087394_5846.JPEG', 'image_description': '两只小狗在毛毯上玩耍。一只狗躺在另一只上面,背景中有一个玩具熊。\n\n关键词:小狗、玩闹、毛毯、玩具熊、互动'}
""""""
以文搜文查询结果
[{'id': 457336885198973739, 'distance': 0.6969608068466187, 'origin': './train/mongoose/n02137549_7552.JPEG', 'image_description': '这是一张棕色的小动物的特写照片。它有着圆润的脸庞和大大的眼睛。\n\n关键词:小动物、棕毛、圆形脸、大眼、自然背景'},
{'id': 457336885198973648, 'distance': 0.7110348343849182, 'origin': './train/Rhodesian_ridgeback/n02087394_6382.JPEG', 'image_description': '这是一只棕色的猎犬,耳朵垂下,脖子上戴着项圈。它正直视前方。\n\n关键词:狗、棕色、猎犬、耳朵、项链'},
{'id': 457336885198973707, 'distance': 0.7725887298583984, 'origin': './train/lion/n02129165_19310.JPEG', 'image_description': '这是一张狮子的特写照片。它有着浓密的鬃毛和锐利的眼神。\n\n关键词:狮子、眼神、鬃毛、自然环境、野生动物'}
"""
多模态向量检索:以图搜文
在下面这个这个示例中,我们使用test中的狮子图片进行相似性检索,分别进行以图搜图和以图搜文。
图:lion/n02129165_13728.JPEG
注意:由于大模型产出结果存在一定的随机性,本示例结果可能无法完全一致的复现。
if __name__ == "__main__":MILVUS_HOST = "c-xxxxxxxxxxxx.milvus.aliyuncs.com"MILVUS_PORT = "19530"MILVUS_TOKEN = "root:password"COLLECTION_NAME = "multimodal_search"INDEX = "IVF_FLAT" # IVF_FLAT OR HNSW# Step1:初始化Milvus客户端milvus_client = MilvusClient(MILVUS_TOKEN, MILVUS_HOST, MILVUS_PORT, INDEX, COLLECTION_NAME)DASHSCOPE_API_KEY = ""# Step2:初始化多模态Embedding模型extractor = FeatureExtractor(DASHSCOPE_API_KEY)# Step5:多模态搜索示例,以图搜图和以图搜文image_query_path = "./test/lion/n02129165_13728.JPEG"image_embedding = extractor(image_query_path, "image")image_results_1 = milvus_client.search(image_embedding, feild = 'image_embedding')logger.info(f"以图搜图查询结果: {image_results_1}")image_results_2 = milvus_client.search(image_embedding, feild = 'text_embedding')logger.info(f"以图搜文查询结果: {image_results_2}")"""
以图搜图查询结果
{'id': 457336885198973702, 'distance': 0.23892249166965485, 'origin': './train/lion/n02129165_19953.JPEG', 'image_description': '这是一只雄壮的狮子站在岩石旁,背景是树木和灌木丛。阳光洒在它的身上。\n\n关键词:狮子、岩石、森林、阳光、野性'},
{'id': 457336885198973704, 'distance': 0.4113130569458008, 'origin': './train/lion/n02129165_1142.JPEG', 'image_description': '一只狮子在茂密的绿色植物中休息。背景是竹子和树木。\n\n关键词:狮子、草地、绿植、树干、自然环境'},
{'id': 457336885198973699, 'distance': 0.5206397175788879, 'origin': './train/lion/n02129165_16.JPEG', 'image_description': '图中是一对狮子在草地上站立。雄狮鬃毛浓密,雌狮则显得更为瘦弱。\n\n关键词:狮子、草地、雄性、雌性、自然环境'}
""""""
以图搜文查询结果
{'id': 457336885198973704, 'distance': 1.0935896635055542, 'origin': './train/lion/n02129165_1142.JPEG', 'image_description': '一只狮子在茂密的绿色植物中休息。背景是竹子和树木。\n\n关键词:狮子、草地、绿植、树干、自然环境'},
{'id': 457336885198973702, 'distance': 1.2102885246276855, 'origin': './train/lion/n02129165_19953.JPEG', 'image_description': '这是一只雄壮的狮子站在岩石旁,背景是树木和灌木丛。阳光洒在它的身上。\n\n关键词:狮子、岩石、森林、阳光、野性'},
{'id': 457336885198973707, 'distance': 1.2725986242294312, 'origin': './train/lion/n02129165_19310.JPEG', 'image_description': '这是一张狮子的特写照片。它有着浓密的鬃毛和锐利的眼神。\n\n关键词:狮子、眼神、鬃毛、自然环境、野生动物'}
"""
import base64
import csv
import dashscope
import os
import pandas as pd
import sys
import time
from tqdm import tqdm
from pymilvus import (connections,FieldSchema,CollectionSchema,DataType,Collection,MilvusException,utility
)
from http import HTTPStatus
import logginglogging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)class FeatureExtractor:def __init__(self):self._api_key = os.getenv("DASHSCOPE_API_KEY") # 使用环境变量存储API密钥def __call__(self, input_data, input_type):if input_type not in ("image", "text"):raise ValueError("Invalid input type. Must be 'image' or 'text'.")try:if input_type == "image":_, ext = os.path.splitext(input_data)image_format = ext.lstrip(".").lower()with open(input_data, "rb") as image_file:base64_image = base64.b64encode(image_file.read()).decode("utf-8")input_data = f"data:image/{image_format};base64,{base64_image}"payload = [{"image": input_data}]else:payload = [{"text": input_data}]resp = dashscope.MultiModalEmbedding.call(model="multimodal-embedding-v1",input=payload,api_key=self._api_key,)if resp.status_code == HTTPStatus.OK:return resp.output["embeddings"][0]["embedding"]else:raise RuntimeError(f"API调用失败,状态码: {resp.status_code}, 错误信息: {resp.message}")except Exception as e:logger.error(f"处理失败: {str(e)}")raiseclass MilvusClient:def __init__(self):self._token = os.getenv("MILVUS_TOKEN")self._host = os.getenv("MILVUS_HOST")self._port = os.getenv("MILVUS_PORT", "19530")self._collection_name = "multimodal_search"self._connect()self._create_collection_if_not_exists()def _connect(self):try:connections.connect(alias="default", host=self._host, port=self._port, token=self._token)logger.info("Connected to Milvus successfully.")except Exception as e:logger.error(f"连接Milvus失败: {str(e)}")sys.exit(1)def _collection_exists(self):return self._collection_name in utility.list_collections()def _create_index(self):index_params = {"index_type": "IVF_FLAT","params": {"nlist": 1024},"metric_type": "L2",}self._collection.create_index("embedding", index_params)logger.info("Index created successfully.")def _create_collection_if_not_exists(self):try:if not self._collection_exists():fields = [FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=1024),FieldSchema(name="origin", dtype=DataType.VARCHAR, max_length=512),]schema = CollectionSchema(fields)self._collection = Collection(self._collection_name, schema)self._create_index()logger.info("Collection created successfully.")else:self._collection = Collection(self._collection_name)logger.info("Collection already exists.")except Exception as e:logger.error(f"创建或加载集合失败: {str(e)}")sys.exit(1)def insert(self, data):try:self._collection.insert(data)self._collection.load()logger.info("数据插入并加载成功.")except MilvusException as e:logger.error(f"插入数据失败: {str(e)}")raisedef search(self, query_embedding, limit=10):try:result = self._collection.search(data=[query_embedding],anns_field="embedding",param={"metric_type": "L2", "params": {"nprobe": 10}},limit=limit,output_fields=["origin"],)return [{"id": hit.id, "distance": hit.distance, "origin": hit.origin} for hit in result[0]]except Exception as e:logger.error(f"搜索失败: {str(e)}")return Nonedef load_image_embeddings(extractor, csv_path):df = pd.read_csv(csv_path)image_embeddings = {}for image_path in tqdm(df["path"].tolist(), desc="生成图像嵌入"):try:image_embeddings[image_path] = extractor(image_path, "image")time.sleep(0.6) # 控制API调用频率except Exception as e:logger.warning(f"处理{image_path}失败,已跳过: {str(e)}")return [{"origin": k, "embedding": v} for k, v in image_embeddings.items()]def main():# 初始化Milvus客户端milvus_client = MilvusClient()# 初始化特征提取器extractor = FeatureExtractor()## 1. 将图片数据集Embedding后插入到Milvusembeddings = load_image_embeddings(extractor, "reverse_image_search.csv")milvus_client.insert(embeddings)# 2. 执行搜索测试# 示例:以文搜图text_query = "木质折叠椅"text_embedding = extractor(text_query, "text")text_results = milvus_client.search(text_embedding)logger.info(f"以文搜图查询结果: {text_results}")# 示例:以图搜图image_query_path = "./test/Airedale/n02096051_4092.JPEG"image_embedding = extractor(image_query_path, "image")image_results = milvus_client.search(image_embedding)logger.info(f"以图搜图查询结果: {image_results}")if __name__ == "__main__":main()
相关文章:

通过阿里云Milvus与通义千问VL大模型,快速实现多模态搜索
本文主要演示了如何使用阿里云向量检索服务Milvus版与通义千问VL大模型,提取图片特征,并使用多模态Embedding模型,快速实现多模态搜索。 基于灵积(Dashscope)模型服务上的通义千问 API以及Embedding API来接入图片、文…...

使用 Spring Boot Admin 通过图形界面查看应用配置信息的完整配置详解,包含代码示例和注释,最后以表格总结关键配置
以下是使用 Spring Boot Admin 通过图形界面查看应用配置信息的完整配置详解,包含代码示例和注释,最后以表格总结关键配置: 1. 环境准备 Spring Boot 版本:2.7.x(兼容 Spring Boot Admin 2.x)Spring Boot…...
解决NSMutableData appendData性能开销太大的问题
用以下高效方式,原理上是不复制内存: dispatch_data_t accumulatedData dispatch_data_empty; // 假设我们有多个数据块需要合并 for (NSData *chunk in dataChunks) { dispatch_data_t chunkData dispatch_data_create(chunk.bytes, chunk.length, …...
雪花算法生成int64,在前端js的精度问题
1.问题背景 后端对视频生成唯一性id,在发送评论阶段,由于后端接收的json数据格式,设置videoId为int64。前端于是使用js的Number函数,进行字符串转换为数字,由于不清楚js的精度范围,产生了携带的videoId变化…...

【计算机视觉】CV实战项目 - 基于YOLOv5与DeepSORT的智能交通监控系统:原理、实战与优化
基于YOLOv5与DeepSORT的智能交通监控系统:原理、实战与优化 一、项目架构与技术解析1.1 核心算法架构1.2 学术基础 二、实战环境配置2.1 硬件要求与系统配置2.2 分步安装指南 三、核心功能实战3.1 基础车辆计数3.2 自定义检测类别3.3 多区域计数配置 四、性能优化技…...
2025年3月电子学会青少年机器人技术(四级)等级考试试卷-实际操作-测评师
青少年机器人技术等级考试实际操作试卷(四级)-测评师 分数:100 题数:2 一、电路搭设(共1题,共20分) 1. 元器件: (1)装置中包含交通灯模块(或元器件);(2分…...

17.磁珠在EMC设计中的运用
磁珠在EMC设计中的运用 1. 磁珠的高频等效特性2. 磁珠的参数分析与选型3. 磁珠应用中的隐患问题 1. 磁珠的高频等效特性 和磁环类似,低频段感性jwL为主,高频段阻性R为主。 2. 磁珠的参数分析与选型 不需要太在意磁珠在100MHz时的电阻值,选型…...
React vs Vue:性能对决
React vs Vue:性能对决 🚀 渲染机制流程图 #mermaid-svg-LWSKliWNGUh9tZcM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-LWSKliWNGUh9tZcM .error-icon{fill:#552222;}#mermaid-svg-LWSKliWNGUh9tZcM .error-…...

Mediamtx与FFmpeg远程与本地推拉流使用
1.本地推拉流 启服 推流 ffmpeg -re -stream_loop -1 -i ./DJI_0463.MP4 -s 1280x720 -an -c:v h264 -b:v 2000k -maxrate 2500k -minrate 1500k -bufsize 3000k -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/stream 拉流 ffplay -rtsp_transport tcp rtsp://43.136.…...

DPIN在AI+DePIN孟买峰会阐述全球GPU生态系统的战略愿景
DPIN基金会在3月29日于印度孟买举行的AIDePIN峰会上展示了其愿景和未来5年的具体发展计划,旨在塑造去中心化算力的未来。本次活动汇集了DPIN、QPIN、社区成员和Web3行业资深顾问,深入探讨DPIN构建全球领先的去中心化GPU算力网络的战略,该网络…...
React:<></>的存在是为了什么
1. <></> 是什么? <></> 是 React 的Fragment(片段)语法糖,等价于 <React.Fragment></React.Fragment>。 2. 它的作用 主要作用: 允许你在组件里返回多个元素,而不需…...
Android Build Variants(构建变体)详解
Android Build Variants(构建变体)是 Android 开发中用于生成不同版本应用程序的一种机制。它允许开发者根据不同的需求,如不同的应用市场、不同的功能模块、不同的环境配置等,从同一个代码库中生成多个不同的 APK。 组成部分 B…...

Visual Studio Code 使用tab键往左和往右缩进内容
使用VSCode写东西,经常遇到多行内容同时缩进的情况,今天写文档的时候就碰到,记录下来: 往右缩进 选中多行内容,点tab键,会整体往右缩进: 往左缩进 选中多行内容,按shifttab&am…...
【KWDB 创作者计划】_嵌入式硬件篇---寄存器与存储器截断与溢出
文章目录 前言一、寄存器与存储器1. 定义与基本概念寄存器(Register)位置功能特点存储器(Memory)位置功能特点2. 关键区别3. 层级关系与协作存储层次结构协作示例4. 为什么需要寄存器性能优化指令支持减少总线竞争5. 其他寄存器类型专用寄存器程序计数器(PC)栈指针(SP)…...
Python中的 for 与 迭代器
文章目录 一、for 循环的底层机制示例:手动模拟 for 循环 二、可迭代对象 vs 迭代器关键区别: 三、for 循环的典型应用场景1. 遍历序列类型2. 遍历字典3. 结合 range() 生成数字序列4. 遍历文件内容 四、迭代器的自定义实现示例:生成斐波那契…...
C语言编程--15.四数之和
题目: 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复)&…...

HTML、XHTML 和 XML区别
HTML、XHTML 和 XML 这三兄弟的区别 HTML: 老大哥,负责网页长啥样,性格比较随和,有点小错误也能容忍。XHTML: 二哥,看着像 HTML,但规矩严,是按 XML 的规矩来的 HTML,更规范。XML: 小弟,负责存储和传输数据,非常灵活,标签可以自己随便定,但规矩最严。它们仨长啥样?(…...
LeetCode 2799.统计完全子数组的数目:滑动窗口(哈希表)
【LetMeFly】2799.统计完全子数组的数目:滑动窗口(哈希表) 力扣题目链接:https://leetcode.cn/problems/count-complete-subarrays-in-an-array/ 给你一个由 正 整数组成的数组 nums 。 如果数组中的某个子数组满足下述条件&am…...
【高中数学/古典概率】4红2黑六选二,求取出两次都是红球的概率
【问题】 袋子里装4只红球,2只黑球,大小完全相同,抽两次球,每次抽一只,抽出后不再放回,求取出的两次都是红球的概率。 【来源】 数林外传系列之《概率与期望》P20 单埻著 中国科学技术大学出版社 【数学…...
QLExpress 深度解析:构建动态规则引擎的利器
QLExpress 深度解析:构建动态规则引擎的利器 在现代业务系统中,“规则变更快、逻辑复杂、发布要求高”已成为常态。传统硬编码已无法满足这种需求。本文以阿里巴巴开源的轻量级表达式引擎 QLExpress 为例,从实际应用、核心结构到落地建议,系统解析其强大能力和设计哲学。 …...
aarcpy 列表函数的使用(1)
arcpy.ListFeatureClasses() 该函数用于列出指定工作空间中的所有要素类。可以通过通配符和过滤条件进一步筛选结果。 语法: python arcpy.ListFeatureClasses(wild_cardNone, feature_typeNone)• wild_card:用于筛选要素类名称的通配符,…...
C++学习笔记(三十七)——STL之搜索算法
STL 算法分类: 类别常见算法作用排序sort、stable_sort、partial_sort、nth_element等排序搜索find、find_if、count、count_if、binary_search等查找元素修改copy、replace、replace_if、swap、fill等修改容器内容删除remove、remove_if、unique等删除元素归约for…...
MySQL 9.3 正式发布!备份、用户管理与开发支持迎来革命性升级
开源数据库领域的标杆产品MySQL迎来重大更新——MySQL 9.3正式发布!作为企业级数据库的“扛把子”,此次版本更新聚焦备份效率、用户管理精细化、开发支持增强三大核心领域,同时在高可用性和性能优化上实现突破。以下为你逐一解读新版本的亮点…...

FPGA上实现YOLOv5的一般过程
在FPGA上实现YOLOv5 YOLO算法现在被工业界广泛的应用,虽说现在有很多的NPU供我们使用,但是我们为了自己去实现一个NPU所以在本文中去实现了一个可以在FPGA上运行的YOLOv5。 YOLOv5的开源代码链接为 https://github.com/ultralytics/yolov5 为了在FPGA中…...

4U带屏基于DSP/ARM+FPGA+AI的电力故障录波装置设计方案,支持全国产化
4U带屏DSP/ARMFPGAAI电力故障录波分析仪,支持国产化,含有CPU主控模块,96路模拟量采集,256路开关量,通讯扩展卡等#电力故障录波#4U带屏#新能源#电力监测 主要特点 1)是采用嵌入式图形系统,以及…...

数据库数据删除与修改实验
数据库数据删除与修改实验 在数据库原理的学习中,数据的删除与修改是核心操作技能。通过“删除修改数据”实验,我系统实践了 SQL 中 UPDATE 和 DELETE 语句的多种应用场景,从基础语法到复杂业务逻辑处理,积累了丰富的实战经验。本…...

【含文档+PPT+源码】基于SpringBoot+vue的疫苗接种系统的设计与实现
项目介绍 本课程演示的是一款 基于SpringBootvue的疫苗接种系统的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系…...
如何将IDP映射属性添加,到accountToken中 方便项目获取登录人信息
✅ 目标 你想要: 用户通过 IdP 登录(SAML 或 OAuth2)Keycloak 自动将 IdP 返回的属性(如:email、name、role 等)映射到用户账户中并把这些属性加入到用户登录返回的 Access Token 中,供业务系…...

项目自动化测试
一.设计测试用例(细致全面) 二.先引入所需要的pom.xml依赖 1.selenium依赖 2.webdrivermanager依赖 3.commons-io依赖 编写测试用例–按照页面对用例进行划分,每个页面是Java文件,页面下的所有用例统一管理 三.common包(放入公用包) 类1utils 可以调用driver对象,访问url …...

Python爬虫爬取图片并存储到MongoDB(注意:仅尝试存储一条空的示例数据到MongoDB,验证MongoDB的联通性)
以下是一个使用Python爬取图片并存储到MongoDB的示例实现,包含详细步骤说明: import requests from bs4 import BeautifulSoup from pymongo import MongoClient from datetime import datetime import os import re# 配置信息 mongoIP mongodb://root…...