基于AWS的3D模型搜索服务实现
3D模型广泛应用于计算机游戏、电影、工程、零售业、广告等许多领域。市场上有很多制作3D模型的工具,但几乎没有工具可以直观地搜索3D模型数据库以找到类似的3D模型 因为开发好的 3D 模型搜索工具非常具有挑战性。 它需要复杂的计算和 AI/ML 框架来创建模型描述符并提取特征向量、数据库来保存和索引大量形状数据以及在大型数据集上进行近实时模式匹配。

推荐:用 NSDT编辑器 快速搭建可编程3D场景
1、要解决的业务问题
在这篇文章中,让我们了解 3D 模型业务中的实际业务问题,并了解如何在 AWS 云上实施该解决方案。
让我们从一个假设的业务问题开始。 工程设计公司 X 在旧数据存储中存储了大量 3D 模型,他们希望开展一项新业务来在线销售其模型。 公司希望提供使用照片、手绘或 3D 模型对象进行视觉搜索的服务,并找到匹配的 3D 模型,以便客户可以轻松选择和购买他们想要的模型。
在这里,X 公司在遗留数据库中拥有大量 3D 模型。 第一步是将模型下载到云存储(最好是 S3)并提取这些模型的形状和特征数据,然后对数据建立索引,以便将相似的模型分组在一起并实现高效搜索。
2、特征生成和索引
下图说明了形状和特征数据生成和索引的架构。

以下是实施该解决方案所需采取的步骤。
- 配置提供无服务器批量计算平台的 AWS Batch 以运行连接到旧数据库并将 3D 模型文件下载到 S3 存储桶的服务。 可以安排它每晚运行。
- 实施 AWS Lambda 函数来处理 S3 存储桶中下载的 3D 模型,并使用形状表示算法生成形状数据。 生成的形状数据应存储在 Amazon DynamoDB 中。 可以配置此 Lambda 函数以触发 S3 存储桶放置事件。
- 实施另一个 AWS Lambda 函数,以不同角度创建 3D 模型的多个快照,并将它们作为图像存储在 S3 存储桶中。
- 使用在众所周知的 ImageNet 数据集上预先训练的卷积神经网络 (CNN) 模型从生成的图像中提取特征,或者使用 Amazon SageMaker 训练和部署的模型
- Amazon SageMaker 是一个完全托管的机器学习平台,允许创建、训练和部署 在 AWS 云中快速部署机器学习模型。 使用此模型,可以提取图像纹理、几何数据和元数据并将其存储在 Amazon DynamoDB 中。
- 创建另一个 lambda 函数,以使用步骤 4 中提取的特征数据来丰富步骤 2 中生成的形状数据。现在形状数据已使用特征数据来丰富。 形状数据是一组浮点数。 下一步是将相似的形状分组在一起。
- 使用 AWS lambda 函数,在 Amazon OpenSearch Service 上构建参考 k-NN 索引,这是一项完全托管的服务,可让你轻松、经济高效地大规模部署、保护和运行弹性搜索。 Amazon OpenSearch Service 提供 k-最近邻 (k-NN) 搜索,可以将形状数据存储为向量,并使用 k-NN 算法按欧几里得距离或余弦相似度对相似的形状数据进行分组。
现在,我们已经生成了富含特征的形状描述符,并使用 k 最近邻 (k-NN) 算法对它们进行了索引。 接下来,展示 3D 模型或模型的 2D 视图(你可以使用工具绘制前视图、顶视图和侧视图)以查询应用程序,以从 Amazon OpenSearch 中的索引数据中查找类似模型。
3、3D模型搜索
下图描述了从模型存储库中查找相似模型的实时 3D 模型搜索的架构。

- 使用 S3 中托管的 Web 应用程序,你可以上传 3D 模型对象(如果有),也可以使用草图应用程序绘制模型的顶视图、前视图和侧视图,并将视图作为图像上传。 如果从不同角度呈现更多视图图像,将获得更准确的结果。
- 上传的图像通过 Amazon API Gateway 发送到 AWS Lambda。
- AWS Lambda 函数将为上传的模型/图像生成形状描述符,然后调用 Amazon SageMaker 实时端点来提取特征数据。
- AWS Lambda 函数将利用特征数据丰富形状描述符。
- AWS Lambda 函数将查询发送到 Amazon Elastic Search Service (Amazon OpenSearch Service) 索引中的 k 最近邻。 它将返回 k 个相似模型数据的列表,并返回模型各自的 Amazon S3 URI。
- AWS Lambda 函数生成预签名的 Amazon S3 URL 以返回到客户端 Web 应用程序以可视化类似的模型。
本文的目的是解释使用 AWS 服务在 AWS 云上进行 3D 模型搜索服务的架构和高级实现细节。 添加了下面的常见问题解答部分以提供更多详细信息。
4、常见问题解答
- 什么是 3D 形状描述符?
3D 形状描述符是一组数字,用于表示 3D 模型表面上的点,以捕获 3D 对象的几何本质。 它是 3D 对象的紧凑表示,描述符形成具有有意义的距离度量的向量空间。
- 如何生成 3D 形状描述符?
有许多算法可用于生成 3D 形状描述符。 他们生成一组 2D 视图数据,这些数据是通过以不同角度旋转 3D 模型而生成的。 更多视图产生更高的准确性。 流行的算法是光场描述符(LFD)和多视图卷积神经网络(MVCNN)。
- 什么是预训练 CNN 模型?
预训练模型是由某人创建和训练的模型,用于解决与我们遇到的问题类似的问题。 在我们的例子中,我们可以使用预先训练的 resnet50 卷积神经网络,该网络经过 ImageNet 数据库中超过一百万张图像的训练。 resnet50 可作为 SageMaker 中的内置算法使用。
- 什么是 SageMaker?
它是一项完全托管的机器学习服务,可快速轻松地构建和训练机器学习模型,然后直接将其部署到生产就绪的托管环境中。
- Amazon Elastic Search Service 与 Amazon OpenSearch Service。
Amazon Elastic Search Service 现在更名为 Amazon OpenSearch Service,它提供最新版本的 OpenSearch 以及由 OpenSearch 仪表板和 Kibana 提供支持的可视化功能。 它使你能够轻松摄取、保护、搜索、聚合、查看和分析大量数据。
- Amazon OpenSearch Service 的 k-NN 是什么?
它允许你在向量空间中搜索点,并通过欧几里得距离或余弦相似度找到这些点的“k 个最近邻”。
原文链接:基于AWS的3D模型搜索 — BimAnt
相关文章:
基于AWS的3D模型搜索服务实现
3D模型广泛应用于计算机游戏、电影、工程、零售业、广告等许多领域。市场上有很多制作3D模型的工具,但几乎没有工具可以直观地搜索3D模型数据库以找到类似的3D模型 因为开发好的 3D 模型搜索工具非常具有挑战性。 它需要复杂的计算和 AI/ML 框架来创建模型描述符并提…...
pycharm远程连接docker容器
pycharm远程连接docker容器 1.根据镜像创建容器2.进入容器3.修改容器的root密码4. 容器安装openssh-server和openssh-client5.修改SSH配置文件6.重启ssh服务7. 退出测试8.配置pycharm并连接docker容器9. 选择docker环境 1.根据镜像创建容器 sudo docker run -itd --nameconn_t…...
开源全球地理空间数据可视化框架——Cesium学习(2023.8.21)
Cesium学习 2023.8.21 1、Cesium简介1.1 Github上的Cesium 2、Cesium下载安装使用2.1 方式一:页面在线引用2.2 方式二:页面离线使用2.3 方式三:完整项目使用 3、CesiumJS学习教程(快速上手 API文档)3、Cesium官方示例…...
RT-Thread学习日记——点亮LED
最近开始接触RT-Thread,后面会单独建立专栏以此记录我的学习过程,如果能给你的学习提供参考,本人倍感荣幸。 学习工具:正点原子战舰开发板 一、、点亮LED 在RT-Thread的配置项里搜索LED可以看到和LED相关的很多内容,…...
粘包问题(TCP面向字节流批量发送数据导致)
粘包问题出现的原因 由于TCP协议网络传输数据的基本单位是字节流,所以当应用程序收到了传输的数据时,看到的是一连串的字节数据,而TCP协议网络传输数据有滑动窗口的机制(核心就是批量传输数据,推荐看TCP中窗口和滑动窗…...
selenium Chrome驱动下载地址
Chrome驱动官方最新版下载地址:https://googlechromelabs.github.io/chrome-for-testing/ 有稳定版,开发版等版本可以选择下载 选择 操作系统复制下载链接直接下载...
Linux命令200例:tar命令主要用于创建、查看和提取归档文件(常用)
🏆作者简介,黑夜开发者,全栈领域新星创作者✌。CSDN专家博主,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 &…...
【Django】Task4 序列化及其高级使用、ModelViewSet
【Django】Task4 序列化及其高级使用、ModelViewSet Task4主要了解序列化及掌握其高级使用,了解ModelViewSet的作用,ModelViewSet 是 Django REST framework(DRF)中的一个视图集类,用于快速创建处理模型数据的 API 视…...
FFMPEG RTMP流打开速度慢优化方法一
先上使用方法: codec_ctx->flags | AVFMT_FLAG_NOBUFFER; AVFMT_FLAG_NOBUFFER 标记如果没有设置,就会导致打开时探测的数据包丢AVFormatContext的缓存区中。 播放的时候,就从这些数据包开始,但是整个探测过程时间可能较长&…...
NextJs - Middleware(中间件)
中间件允许您在请求完成之前运行代码。然后,根据传入的请求,您可以通过重写、重定向、修改请求或响应标头或直接响应来修改响应。 中间件在缓存内容和路由匹配之前运行。 使用规则 使用项目根目录中的文件 middleware.ts(或 .js)…...
记录几个Hudi Flink使用问题及解决方法
前言 如题,记录几个Hudi Flink使用问题,学习和使用Hudi Flink有一段时间,虽然目前用的还不够深入,但是目前也遇到了几个问题,现在将遇到的这几个问题以及解决方式记录一下 版本 Flink 1.15.4Hudi 0.13.0 流写 流写…...
Go:测试框架GoConvey 简介
快速开始 GoConvey是一个完全兼容官方Go Test的测试框架,一般来说这种第三方库都比官方的功能要强大、更加易于使用、开发效率更高,闲话少说,先看一个example: package utils import (. "github.com/smartystreets/goconvey…...
JavaWeb-特殊文件(propertis与XML)
目录 Properties文件 一.properties介绍 二.properties使用 三.解决中文乱码问题 XML文件 一.XML介绍 二.XML文件的语法规则 三.XML的使用 Properties文件 一.properties介绍 1.什么是properties文件 Properties文件是一种常用的配置文件格式,用于存储键值…...
ffmpeg合并mp4视频文件
下载ffmpeg Download FFmpeg 2配置环境 右键此电脑-》属性-》高级系统设置 环境变量-》path 解压上面ffmpeg压缩包,找到bin目录,复制完整路径,添加到path环境变量中 测试ffmpeg ffmpeg合并MP4文件 创建一个文本文件,例如inpu…...
ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks使用分析
ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks使用分析 1 ATF的下载链接2 ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks处理流程2.1 ATF BL1/BL2 ufs_read_blocks2.2 ATF BL1/BL2 ufs_write_blocks 3 UFS System Model4 ufs_read_blocks/ufs_write_blocks详细分析4.1 ufs_re…...
Elasticsearch(十二)搜索---搜索匹配功能③--布尔查询及filter查询原理
一、前言 本节主要学习ES匹配查询中的布尔查询以及布尔查询中比较特殊的filter查询及其原理。 复合搜索,顾名思义是一种在一个搜索语句中包含一种或多种搜索子句的搜索。 布尔查询是常用的复合查询,它把多个子查询组合成一个布尔表达式,这些…...
解决Windows下的docker desktop无法启动问题
以管理员权限运行cmd 报错: docker: error during connect: Post http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.40/containers/create: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows,…...
LLM生成式 AI 项目生命周期Generative AI project lifecycle
在本课程的其余部分中,您将学习开发和部署LLM驱动应用所需的技巧。在这个视频中,您将了解一个能帮助您完成此工作的生成式AI项目生命周期。此框架列出了从构思到启动项目所需的任务。到课程结束时,您应该对您需要做的重要决策、可能遇到的困难…...
java高并发系列 - 第13天:JUC中的Condition对象
java高并发系列 - 第13天:JUC中的Condition对象 java高并发系列第13篇文章 本文内容 synchronized中实现线程等待和唤醒Condition简介及常用方法介绍及相关示例使用Condition实现生产者消费者使用Condition实现同步阻塞队列Object对象中的wait(),notify()方法,用于线程等待…...
【TTY子系统】printf与printk深入驱动解析
tty子系统解析 tty子系统是一个庞大且复杂,也是内核维护者所头大的子系统。 At a first glance, the TTY layer wouldn’t seem like it should be all that challenging. It is, after all, just a simple char device which is charged with transferring byte-o…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...
