E2E_端到端的ViT_Pytorch实现

发布时间:2026/8/26 16:16:35

E2E_端到端的ViT_Pytorch实现
✅ 一、PyTorch 代码框架含对比损失 URDF 正则目标从多视角视频预测 12 维关节角 角速度并施加 URDF 结构约束。1. 安装依赖pipinstalltorch torchvision timm einops pytorch3d# pytorch3d 用于可微分 FK可选2. URDF 解析与可微分 FK简化版由于完整 FK 较复杂我们提取关键参数# urdf_info.pyimporttorch# 从 URDF 提取的连杆长度近似值单位米LINK_LENGTHS{R:[0.101,0.089,0.552,0.43,0.0707,0.0673],L:[0.101,0.089,0.552,0.43,0.0707,0.0673]}# 关节限位弧度JOINT_LIMITS{R:[(-6.2832,6.2832)]*6,L:[(-6.2832,6.2832)]*6}defforward_kinematics_simple(joint_angles,armR): 简化 FK假设 Z-Y-Z 旋转仅用于计算连杆长度一致性 实际项目建议用 torch_kinematics 或 Pinocchio batch,T,djoint_angles.shape# d6devicejoint_angles.device# 初始化基座位置 (来自 URDF: R_R00_Joint origin)ifarmR:base_postorch.tensor([0.3015,0.001,0.8295],devicedevice)else:base_postorch.tensor([-0.3015,0.001,0.8295],devicedevice)positions[base_pos.unsqueeze(0).unsqueeze(0).expand(batch,T,-1)]current_posbase_pos.clone()# 简化沿局部轴累加仅用于 link length lossforiinrange(d):# 方向向量根据 URDF axis 和 origin 近似ifi0:directiontorch.tensor([0,0,1.0],devicedevice)# R_R01_Joint axis0 0 1elifi1:directiontorch.tensor([0,-1,0],devicedevice)# R_R02_Joint axis0 -1 0elifi2:directiontorch.tensor([0,1,0],devicedevice)elifi3:directiontorch.tensor([0,1,0],devicedevice)elifi4:directiontorch.tensor([0,0,-1],devicedevice)else:directiontorch.tensor([0,1,0],devicedevice)displacementdirection*LINK_LENGTHS[arm][i]current_poscurrent_posdisplacement positions.append(current_pos.unsqueeze(0).unsqueeze(0).expand(batch,T,-1))returntorch.stack(positions,dim2)# [B, T, J1, 3]3. 主模型Multi-View ViT URDF Regularization# model.pyimporttorchimporttorch.nnasnnfromeinopsimportrearrangefromtimm.models.vision_transformerimportVisionTransformerclassURDFMVVT(nn.Module):def__init__(self,num_views2,num_joints12,seq_len32,embed_dim768):super().__init__()self.num_viewsnum_views self.seq_lenseq_len self.num_jointsnum_joints# 共享 ViT 编码器使用 VideoMAE 预训练self.encoderVisionTransformer(img_size224,patch_size16,embed_dimembed_dim,depth12,num_heads12,mlp_ratio4,qkv_biasTrue)# View Embeddingself.view_embednn.Parameter(torch.randn(num_views,embed_dim))# Cross-View Temporal Fusionself.fusionnn.TransformerEncoder(nn.TransformerEncoderLayer(embed_dim,nhead8,batch_firstTrue),num_layers4)# Motion Decoderself.decodernn.Sequential(nn.Linear(embed_dim,512),nn.ReLU(),nn.Linear(512,num_joints*2)# angle velocity)# Loss weightsself.lambda_cont1.0self.lambda_kin0.5self.lambda_smooth0.1defforward(self,videos):# videos: [B, K, T, C, H, W]B,K,T,C,H,Wvideos.shapeassertKself.num_views# Encode each view and framefeatures[]forkinrange(K):view_feat[]fortinrange(T):xvideos[:,k,t]# [B, C, H, W]featself.encoder.forward_features(x)# [B, D]featfeatself.view_embed[k]# add view embeddingview_feat.append(feat)view_feattorch.stack(view_feat,dim1)# [B, T, D]features.append(view_feat)# Concatenate viewsfusedtorch.cat(features,dim1)# [B, K*T, D]fusedself.fusion(fused)# [B, K*T, D]# Pool to motion tokens (one per time step)motion_tokensfused[:,::K]# [B, T, D]# Decode to actionsoutself.decoder(motion_tokens)# [B, T, 24]anglesout[...,:12]velocitiesout[...,12returnangles,velocitiesdefcontrastive_loss(self,features):# features: list of [B, T, D] per viewB,T,Dfeatures[0].shape loss0.0fortinrange(T):z1features[0][:,t]# [B, D]z2features[1][:,t]# [B, D]# InfoNCElogitstorch.mm(z1,z2.t())/0.07labelstorch.arange(B,devicez1.device)lossnn.CrossEntropyLoss()(logits,labels)returnloss/Tdefkinematic_loss(self,angles):# Split into left and rightangles_Rangles[...,:6]# [B, T, 6]angles_Langles[...,6:]# [B, T, 6]loss0.0forarm,angin[(R,angles_R),(L,angles_L)]:# Link length consistency (simplified)posforward_kinematics_simple(ang,armarm)# [B, T, J1, 3]forjinrange(1,pos.shape[2]):actual_lentorch.norm(pos[:,:,j]-pos[:,:,j-1],dim-1)target_lenLINK_LENGTHS[arm][j-1]losstorch.mean((actual_len-target_len)**2)# Joint limit penaltylow,highzip(*JOINT_LIMITS[arm])lowtorch.tensor(low,deviceang.device)hightorch.tensor(high,deviceang.device)losstorch.mean(torch.relu(ang-high)torch.relu(low-ang)returnlossdefsmoothness_loss(self,angles):velangles[:,1:]-angles[:,:-1]accvel[:,1:]-vel[:,:-1]returntorch.mean(acc**2)defcompute_loss(self,videos,angles_pred,vel_pred):# Re-encode for contrastive lossB,K,T,C,H,Wvideos.shape features[]forkinrange(K):view_feat[]fortinrange(T):xvideos[:,k,t]featself.encoder.forward_features(x)featfeatself.view_embed[k]view_feat.append(feat)features.append(torch.stack(view_feat,dim1))L_contself.contrastive_loss(features)L_kinself.kinematic_loss(angles_pred)L_smoothself.smoothness_loss(angles_pred)returnL_cont*self.lambda_contL_kin*self.lambda_kinL_smooth*self.lambda_smooth4. 训练脚本简化# train.pymodelURDFMVVT(num_views2,num_joints12,seq_len32).cuda()optimizertorch.optim.AdamW(model.parameters(),lr1e-4)forvideosindataloader:# [B, 2, 32, 3, 224, 224]videosvideos.cuda()angles,velmodel(videos)lossmodel.compute_loss(videos,angles,vel)optimizer.zero_grad()loss.backward()optimizer.step()✅ 二、COLMAP 3DGS 自动生成新视角 Pipeline目标从多视角视频自动重建 3D 场景生成任意新视角图像用于数据增强或伪标签1. 安装# COLMAPsudoaptinstallcolmap# 3D Gaussian Splattinggitclone https://github.com/graphdeco-inria/gaussian-splatting--recursivecdgaussian-splatting pipinstall-rrequirements.txt2. 自动化脚本 reconstruct.sh#!/bin/bashVIDEO_DIR$1# e.g., ./videos/task1/OUTPUT_DIR$2# e.g., ./recon/task1/# Step 1: Extract frames (2 FPS)mkdir-p$OUTPUT_DIR/frames ffmpeg-i$VIDEO_DIR/view1.mp4-r2$OUTPUT_DIR/frames/view1_%04d.png ffmpeg-i$VIDEO_DIR/view2.mp4-r2$OUTPUT_DIR/frames/view2_%04d.png# Step 2: Run COLMAP (sparse reconstruction)colmap feature_extractor\--database_path$OUTPUT_DIR/database.db\--image_path$OUTPUT_DIR/frames\--ImageReader.camera_modelPINHOLE colmap exhaustive_matcher\--database_path$OUTPUT_DIR/database.dbmkdir-p$OUTPUT_DIR/sparse colmap mapper\--database_path$OUTPUT_DIR/database.db\--image_path$OUTPUT_DIR/frames\--output_path$OUTPUT_DIR/sparse# Step 3: Convert to 3DGS formatpython convert.py-s$OUTPUT_DIR--images$OUTPUT_DIR/frames# Step 4: Train 3DGScdgaussian-splatting python train.py-s$OUTPUT_DIR# Step 5: Render novel views (optional)python render.py-m$OUTPUT_DIR/output/... 输出$OUTPUT_DIR/output/.../renders/ 包含新视角图像✅ 三、PyBullet 仿真环境搭建脚本1. 准备文件结构robot1010_sim/ ├── robot1010.urdf # 你提供的 URDF ├── meshes/ # STL 文件目录 │ ├── base_link.STL │ ├── R_R00_Link.STL │ └── ... └── sim_test.py2. PyBullet 脚本 sim_test.pyimportpybulletaspimportpybullet_dataimporttimeimportnumpyasnp# Connect to GUIp.connect(p.GUI)p.setAdditionalSearchPath(pybullet_data.getDataPath())p.setGravity(0,0,-9.81)# Load robotrobot_idp.loadURDF(robot1010.urdf,basePosition[0,0,0],useFixedBaseTrue,flagsp.URDF_USE_SELF_COLLISION)# Get revolute joint indicesjoint_indices[]joint_names[]foriinrange(p.getNumJoints(robot_id)):infop.getJointInfo(robot_id,i)ifinfo[2]p.JOINT_REVOLUTE:# 只取旋转关节joint_indices.append(i)joint_names.append(info[1].decode(utf-8))print(Active joints:,joint_names)# 应输出 12 个 revolute joints# Set initial poseinitial_pose[0.0]*len(joint_indices)fori,idxinenumerate(joint_indices):p.resetJointState(robot_id,idx,initial_pose[i])# Simulate a sine wave motionduration1000fortinrange(duration):target[0.5*np.sin(t*0.05i)foriinrange(len(joint_indices))]p.setJointMotorControlArray(robot_id,joint_indices,p.POSITION_CONTROL,targetPositionstarget,forces[100.0]*len(joint_indices))p.stepSimulation()time.sleep(1./240.)p.disconnect()3. 运行python sim_test.py✅ 你将看到双臂机器人在 PyBullet 中运动。可用于验证预测轨迹的可行性。 总结你已获得PyTorch 模型框架支持多视角输入、对比学习、URDF 结构正则适配你的 12-DOF 双臂COLMAP 3DGS pipeline从视频自动生成 3D 场景和新视角无需标定PyBullet 仿真脚本加载你的 URDF 并测试动作下一步建议 用 COLMAP3DGS 从你的产线视频生成伪 3D 关键点 用这些伪标签训练上述 ViT 模型 在 PyBullet 中回放预测轨迹评估任务成功率

相关新闻

Geoserver2.27.3结合GeoWebCache发布arcgis切片(WMTS服务)

Geoserver2.27.3结合GeoWebCache发布arcgis切片(WMTS服务)

2026/8/26 16:16:35

1.背景说明 原来用的还是Geoserver2.21,漏洞实在太多了,升级到最新的2.27.3(2025年12月18日获取到的最新版)。需要注意两点 (1)java版本从8升级到17.(可以不改服务器java8配置,只让…

C++数字炸弹小游戏(英文版)

C++数字炸弹小游戏(英文版)

2026/8/26 16:16:35

C数字炸弹小游戏!(英文不好的不要玩!!!) 这是本蒟蒻的第一篇博客! 如果有其他想法,作者的私信和该文的评论区永远向您敞开! 在此鸣谢:XY_Lmf、XY_Yzy 附上友链(中文版…

【普通数组】LC 189.轮转数组

【普通数组】LC 189.轮转数组

2026/8/26 16:16:35

文章目录前言一、题目1、原题链接2、题目描述二、个人思路整理1、思路分析法1:三次翻转法法2:环状替换法法3:额外数组映射2、解题代码法1:三次翻转法法2:环状替换法法3:额外数组映射三、知识风暴前言 本专栏…

如何安装dsh deepseek harness

如何安装dsh deepseek harness

2026/8/26 18:36:41

目录 安装 nvm 安装dsh 使用npx deepseek-ai/dsh weba安装 使用git clone https://github.com/deepseek-ai/deepseek-harness.git 下载到本地安装 准备工作: 1:首先去存盘里找到文件夹 2:在输入框中打上cmd ​编辑 指令的输入 1&am…

postiz-mcp MCP 服务说明文档

postiz-mcp MCP 服务说明文档

2026/8/26 18:36:41

1. 服务概述一句话简介:Postiz官方MCP客户端,提供完整的Postiz公共API覆盖(集成、帖子、上传、分析、视频),支持环境变量控制写入权限、确认删除和内置速率限制保护服务名称:postiz-mcp版本号:1…

水域救援割绳刀怎么选?看懂性能参数,选对靠谱生产厂家

水域救援割绳刀怎么选?看懂性能参数,选对靠谱生产厂家

2026/8/26 18:36:41

结论先行:水域救援割绳刀是体积最小、却直接关系生死的应急装备,国内选型已有清晰的参数共识:刀刃硬度不低于48HRC(按GB/T 230.1洛氏硬度方法检测)、平头钝头防刺伤刀型加齿形割绳刃、湿手单手操作的防滑手柄、刀鞘牢固…

谁在偷偷看你的位置?安卓手机应用行为记录一键查询

谁在偷偷看你的位置?安卓手机应用行为记录一键查询

2026/8/26 18:36:41

位置信息是核心隐私数据。Android 15新增应用行为记录功能,让用户清晰查看所有应用访问位置信息的记录,精准识别频繁访问的应用。本文解析原理、查看步骤、优化技巧及故障排查。一、核心逻辑与风险应用通过调用系统位置API获取位置信息。Android 15收紧权…

Apache Paimon 源码导读(二):Action 如何构建并提交 Flink 作业

Apache Paimon 源码导读(二):Action 如何构建并提交 Flink 作业

2026/8/26 18:36:41

目录一、Action 对象已经有了,Flink 作业还没有运行二、run() 到底定义在哪个类里?三、创建 Action 时,执行环境已经准备好了为什么开启 Object Reuse?四、run() 实际只做三件事1. 没有配置 Checkpoint 时,默认开启三分…

2026 年 AI Agent 框架横评:10 大框架优缺点对比 + 选型指南

2026 年 AI Agent 框架横评:10 大框架优缺点对比 + 选型指南

2026/8/26 18:26:40

本文由 GO FUNNY 出品。专注 AI Agent 协作方法论与开源工具深度解读。你想搭一个 AI agent,打开 GitHub 搜「agent framework」,按 star 排序,点进第一名,照着 quickstart 敲完,跑通了一个 demo——觉得这事稳了。然后…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/26 1:50:39

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/26 1:49:16

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/26 17:50:58

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

2026/8/26 0:05:45

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

Hermes接入团队协作后,我推翻了三个效率假设

Hermes接入团队协作后,我推翻了三个效率假设

2026/8/26 0:05:45

聊《Hermes真能提效吗?先看流程里最慢的那一步》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要团队把 Hermes 接进项目三个月后,交付速度没有提升反而慢了。复盘后发现,最先…

免费AI大模型调教指南:打造专属网文写作助手

免费AI大模型调教指南:打造专属网文写作助手

2026/8/26 0:05:45

1. 先搞清楚“AI小说扩展模式”到底能帮你做什么如果你是一个刚开始写网文、或者卡在L3级别以下的作者,最头疼的可能是情节推进不下去、人物对话干瘪,或者世界观设定不够丰满。自己对着空白文档硬憋,效率很低。这时候,一个能理解你…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/26 18:07:30

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/26 17:57:52

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…