GME-Qwen2-VL-2B-Instruct创新应用:基于SolidWorks工程图的智能零部件检索系统
你是不是也遇到过这种情况?面对电脑里成百上千个SolidWorks工程图文件,想找一个之前设计过的“带沉头孔的M8法兰连接件”,或者“那个用了304不锈钢的支架”,结果只能靠记忆模糊地翻文件夹,或者打开一个个文件去核对,一两个小时就这么过去了。
对于机械设计工程师来说,这简直是家常便饭。设计重用是提升效率的关键,但前提是你能快速找到它。传统的文件管理,靠文件名和文件夹分类,在项目多、零件杂的时候,基本就失灵了。一个零件可能在不同项目里被叫成不同的名字,光靠“搜索”根本找不到。
现在,情况有点不一样了。我们最近尝试用GME-Qwen2-VL-2B-Instruct这个多模态模型,搭建了一套针对SolidWorks工程图的智能检索系统。简单来说,就是让AI“看懂”图纸,然后你用说话的方式就能把图纸找出来。听起来有点科幻?其实背后的逻辑很直接,用下来效果也确实让人惊喜。
1. 当AI“看懂”了你的工程图
传统的图纸检索,无论是用PDM系统还是Windows搜索,核心都是基于文本:文件名、属性卡里的几个关键词。但一张工程图所包含的信息,90%都在图形和标注里——零件的形状、尺寸、公差、材料技术要求、粗糙度符号等等。这些信息,以前的系统是“看不见”的。
GME-Qwen2-VL-2B-Instruct这类视觉语言模型的出现,改变了游戏规则。它经过训练,能够同时理解图像和文本。对我们来说,SolidWorks导出的二维工程图(通常是PDF或图片格式),就是它要理解的“图像”;而我们日常描述零件的自然语言,比如“一个中心有通孔、四周带四个安装孔的方形板”,就是它要理解的“文本”。
这套系统的核心思路是这样的:
- 预处理与解析:把沉睡在文件夹里的工程图批量处理,让AI先“学习”一遍。
- 特征提取与索引:AI不是简单地存储图片,而是像经验丰富的老师傅一样,提取出图纸中的关键视觉和文本特征,比如轮廓形状、典型结构(孔、槽、法兰)、标注的尺寸范围、材料牌号等,并把这些特征转化成可搜索的索引。
- 自然语言检索:你需要找零件时,不用再纠结文件名,直接像跟同事交流一样描述它。系统将你的描述与索引库进行匹配,把最相关的图纸推到你面前。
这相当于给你的图纸库配了一个24小时在线的、看得懂图的资深助理。
2. 从想法到实现:搭建智能检索系统
听起来概念不错,具体怎么落地呢?我们搭建了一个原型系统,流程可以概括为以下几个关键步骤。
2.1 第一步:让图纸“数字化”与“可读化”
首先,得把工程图准备好。SolidWorks可以很方便地导出高分辨率的PDF或PNG格式图纸。我们建议导出为PNG格式,因为对于视觉模型来说,图像格式处理起来更直接。
接下来,需要一个简单的脚本,批量遍历你的图纸库文件夹,把每一张图纸都送到GME-Qwen2-VL-2B-Instruct模型面前,让它进行“解读”。这里的关键是设计好“提问”的模板,引导模型提取出我们关心的信息。
我们编写了一个预处理脚本,核心任务是为每张图纸生成一份“结构化描述”。下面是一个简化的示例:
import os from PIL import Image # 假设已安装并导入了GME-Qwen2-VL-2B-Instruct的相关推理库 # 此处为伪代码,示意流程 from my_vl_model import VLModel model = VLModel() # 初始化模型 def extract_drawing_info(image_path): """ 提取单张工程图的关键信息 """ image = Image.open(image_path) # 构建一个引导模型观察的提示词(Prompt) # 这个提示词很重要,它告诉模型需要关注图纸的哪些方面 prompt = """ 你是一份机械工程图分析助手。请详细描述这张图纸: 1. 主要描绘了什么零件或装配体?(例如:齿轮箱盖板、轴套、焊接支架) 2. 它的主要形状特征是什么?(例如:板状、圆柱状、带有法兰、有无开口) 3. 图纸上标注了哪些关键尺寸?(例如:总长、总宽、孔径、厚度) 4. 技术要求或标题栏中提到了哪些关键信息?(例如:材料:45钢,表面处理:镀锌) 请用一段连贯的文字总结以上信息。 """ # 将图片和提示词输入模型 response = model.query(image=image, question=prompt) # 假设response是模型返回的文本描述 drawing_description = response.text # 同时,我们也可以让模型提取一些关键标签 tag_prompt = "请用几个关键词概括这张图纸中的零件,如:法兰、带孔、钣金、轴类、不锈钢。" tag_response = model.query(image=image, question=tag_prompt) tags = [tag.strip() for tag in tag_response.text.split('、') if tag.strip()] return { "file_path": image_path, "description": drawing_description, "tags": tags, # 还可以存储原始图片的嵌入向量(embedding)用于相似度搜索 "embedding": model.get_image_embedding(image) } # 批量处理目录 drawing_library = "./my_drawings/" all_drawing_data = [] for root, dirs, files in os.walk(drawing_library): for file in files: if file.endswith(('.png', '.jpg', '.jpeg')): img_path = os.path.join(root, file) try: data = extract_drawing_info(img_path) all_drawing_data.append(data) print(f"已处理: {file}") except Exception as e: print(f"处理 {file} 时出错: {e}")这个过程就像是给每一张图纸建立了一份包含“视觉特征”和“文本摘要”的数字化档案。
2.2 第二步:构建“能理解人话”的检索核心
有了所有图纸的“档案”,下一步就是构建检索系统。当用户输入“找一个内径20mm外径40mm的轴承套”时,系统需要理解这个查询。
我们利用GME-Qwen2-VL-2B-Instruct的双重能力:
- 文本编码:将用户的自然语言查询,转换成一段数学向量(称为查询向量)。
- 向量相似度匹配:将这段查询向量,与之前为每张图纸存储的“描述文本向量”和“图片嵌入向量”进行相似度计算(比如使用余弦相似度)。
简单理解就是,把文字和图片都变成同一套“语言”(向量),然后在向量空间里,找和用户问题意思最接近的那些图纸。
# 伪代码:检索过程示意 import numpy as np from sentence_transformers import SentenceTransformer # 用于文本向量化 text_encoder = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2') def search_drawings(query_text, drawing_data_list, top_k=5): """ 根据文本查询检索相关图纸 """ # 1. 将用户查询转化为向量 query_vector = text_encoder.encode(query_text) similarities = [] for data in drawing_data_list: # 2. 计算与图纸描述向量的相似度(假设已预先计算并存储) desc_sim = cosine_similarity(query_vector, data['description_vector']) # 3. 也可以结合图片向量(如果查询更偏形状,如“找一个L形的板”) # img_sim = cosine_similarity(query_vector, data['embedding']) # 综合相似度 total_sim = desc_sim # 这里简化,实际可加权融合 similarities.append((total_sim, data)) # 4. 按相似度排序,返回最相关的几个结果 similarities.sort(key=lambda x: x[0], reverse=True) return [data for _, data in similarities[:top_k]] # 示例查询 user_query = "我需要一个厚度10mm,上面有4个均布M6螺纹孔的方形安装板" results = search_drawings(user_query, all_drawing_data) print(f"为您找到 {len(results)} 个可能相关的图纸:") for i, res in enumerate(results): print(f"{i+1}. 文件: {os.path.basename(res['file_path'])}") print(f" 描述摘要: {res['description'][:100]}...") # 显示前100字符 print(f" 标签: {', '.join(res['tags'])}") print("-" * 30)2.3 第三步:更直观的“以图搜图”
除了用语言描述,有时候直接画个草图更快。我们的系统也支持简单的草图检索。
用户可以在画板上勾勒出零件的大致轮廓(比如一个带键槽的轴截面),系统将这张草图作为图像输入给模型,提取其视觉特征向量,然后直接与图纸库中的图片特征向量进行匹配,找出形状相似的零件图纸。
# 伪代码:草图检索示意 def search_by_sketch(sketch_image, drawing_data_list, top_k=5): """ 根据草图检索形状相似的图纸 """ # 1. 提取草图的视觉特征向量 sketch_vector = model.get_image_embedding(sketch_image) similarities = [] for data in drawing_data_list: # 2. 计算与库中图纸视觉向量的相似度 img_sim = cosine_similarity(sketch_vector, data['embedding']) similarities.append((img_sim, data)) # 3. 排序返回 similarities.sort(key=lambda x: x[0], reverse=True) return [data for _, data in similarities[:top_k]]3. 实际效果:真的能帮上忙吗?
我们用一个大约有500张各类零件图(包括轴类、盘盖类、箱体类、支架类)的小型内部图库做了测试。
场景一:模糊记忆的精确查找一位同事记得去年某个项目用过一种“一端有法兰,中间有减重孔”的电机座,但忘了文件名和具体位置。他用这句话查询,系统返回的前三个结果中,第二个就是他想要的图纸,而那个图纸的文件名是“MOTOR_MOUNT_ASM_Rev3.dwg”,光靠文件名搜索是不可能找到的。
场景二:基于功能的相似件查找新设计一个连接板,需要参考类似功能的旧设计。查询“用于管道连接的、带密封槽的法兰”,系统返回了几种不同口径和压力的法兰图纸,为新材料选型和标准确认提供了快速参考。
场景三:草图辅助概念设计在概念设计阶段,工程师随手画了一个“带加强筋的U形槽”草图进行搜索,系统找到了几个结构相似的钣金件和铸件图纸,虽然不完全一样,但为其结构设计和工艺选择提供了有价值的借鉴。
带来的改变是实实在在的:
- 查找时间从“小时级”降到“分钟级”:尤其是对于非标件、特征复杂的零件,优势极其明显。
- 促进了设计重用:很多“沉睡”在旧项目中的合理设计被重新发现,避免了重复造轮子,也保证了设计经验的一致性。
- 降低了新人门槛:新员工不熟悉公司庞大的图库,通过自然语言描述就能快速找到参考案例,加速上手过程。
当然,它也不是万能的。对于极其复杂的大型装配体工程图,模型的细节理解能力会面临挑战;对于一些标注极其密集或扫描质量不佳的图纸,识别准确率也会下降。但这已经为我们打开了一扇新的大门。
4. 总结与展望
回过头来看,用GME-Qwen2-VL-2B-Instruct来做SolidWorks工程图检索,本质上是一次将AI的“视觉理解”和“语言理解”能力,与工程领域具体痛点相结合的尝试。它不需要改变工程师现有的设计工具(SolidWorks)和习惯(出二维图),只是为海量的设计成果增加了一个智能化的“检索层”。
实现过程比想象中要平滑,核心在于设计好引导模型的“提示词”,以及构建一个高效的向量索引和检索流程。对于中小型团队,完全可以在本地部署,保护设计数据隐私。
未来,这个方向还有很多可以深挖的地方。比如,结合三维模型的轻量化文件进行检索,体验会更直接;或者与PDM/PLM系统深度集成,让智能检索成为标准功能;再进一步,模型甚至可以在检索的基础上,给出简单的修改建议或衍生设计。
如果你也在受困于图纸管理效率,不妨试试这个思路。从一个小的、定义清晰的图纸库开始,用几行代码让AI先学起来,你可能会发现,那些曾经杂乱无章的设计资产,正在变得前所未有的“好找”和“好用”。技术最终的价值,就是让人的工作更简单、更高效。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。