2024-04-03 NO.4 Quest3 手势追踪抓取物体

文章目录

  • 1 手势抓取方式
    • 1.1 Hand Grab
    • 1.2 Touch Hand Grab
    • 1.3 Distance Hand Grab
  • 2 HandGrabExamples 示例场景
    • 2.1 Interactor 对象
    • 2.2 Interactable 对象
      • 2.2.1 父子结构
      • 2.2.2 “Hand Grab lnteractable” 脚本
      • 2.2.3 “Move Towards Target Provider” 脚本
      • 2.2.4 其他 Movement Provider
  • 3 抓取配置
    • 3.1 玩家配置
      • 3.1.1 自制预制体
      • 3.1.2 添加交互功能
    • 3.2 物体配置
      • 3.2.1 配置 HandGrabInteractable
      • 3.2.2 One Grab Free Transformer
      • 3.2.3 Two Grab Free Transformer
    • 3.3 颜色高亮显示
  • 4 添加物理抛掷效果
  • 5 录制抓取手势
    • 5.1 场景录制
    • 5.2 工具录制
    • 5.3 手势镜像和缩放
  • 6 远距离抓取物体
    • 6.1 玩家配置
    • 6.2 物体配置
      • 6.2.1 抓取配置
      • 6.2.2 添加物理效果

1 手势抓取方式

1.1 Hand Grab

  1. 无抓取手势(手和物体会穿模)

    适合非实物的抓取,例如魔法球。

image-20240401154501544
  1. 有抓取手势(给不同形状的物体制作不同的抓取手势)
  • Pinch Grab:手指靠近物体,做捏合动作激活。
image-20240401154559680
  • Palm Grab:手掌靠近物体,做握持动作激活。
image-20240401154223604
  • Pinch Grab + Palm Grab:多个抓取点,每个抓取点对应不同抓取姿势。
image-20240401154811065

适用场景

​ 在需要精准抓取手势或者固定某几个抓取手势时,可使用 Hand Grab。

image-20240401160027921

1.2 Touch Hand Grab

image-20240401154311300

​ 可以在物体表面(准确来说是物体的碰撞体)上的任意位置进行抓取,抓取时手指会贴在物体表面上,可以用任意根手指进行抓取。

​ 相比于 Hand Grab,抓取手势更自由。

1.3 Distance Hand Grab

image-20240401154320144

​ 在远距离通过射线抓取物体,可以将远处的物体抓取到手上,或者在远距离操控物体移动。

2 HandGrabExamples 示例场景

​ VR 中手势交互需要两个对象:

  • Interactor:发起交互的对象。
  • Interactable:可以被交互的对象。

2.1 Interactor 对象

​ 展开玩家物体 OVRCamreaRig,其子物体 OVRInteraction 是所有交互功能的父物体:

  • OVRHmd:头显交互。
  • OVRControllerDrivenHands:手柄交互(手柄控制虚拟手部模型的相关功能)。
  • OVRHands:手势追踪交互。
image-20240401164506695

​ 展开 OVRHands > LeftHand > HandInteractorsLeft,可看到左手的 Interactor 共有两个:

  • HandPokeInteractor:手指点触交互(手指点击虚拟按钮)。
  • HandGrabInteractor:手部抓取交互。
image-20240401165127233
  1. HandGrabAPI:检测 Hand Grab 是否选中或者取消选中可抓取物体。即,检测抓取动作是否发生。

  2. HandWristPoint:控制在抓取时虚拟手部和现实手部在位置和旋转角度上的偏移。

    • Offset:位置偏移。
    • Rotation:角度偏移。
    image-20240401165654917
  3. GripPoint:Palm Grab 的探测范围。

    调整 GripPoint 上的 HandWristOffset 脚本参数可以修改探测范围的位置和旋转角度。物体进入探测范围后触发抓取,会被吸到手上。

    image-20240401165845549
  4. PinchPoint:Pinch Grab 的探测范围。

    范围大小取决于 PinchPoint 子物体的 Collider 的碰撞体大小。

    image-20240401170033887
  5. PinchArea:PinchPoint 的 HandPinchOffset 脚本默认引用 PinchArea , PinchArea 碰撞体的位置会影响 PinchPoint 探测范围的位置。

  6. HandGrabVisual :连接 SyntheticHand ,在手部呈现出完整的抓取手势后固定手部姿态,让抓取手势不与物体穿模。

  7. HandGrabGlow:控制抓取时手部的特效。

    image-20240401172533854
    • Glow Color Grabing:抓取时特效的颜色。

    • Glow Color Hover:靠近时特效的颜色。

    • Glow Type:特效类型。

      • Outline:手指轮廓高亮。
      image-20240401172235645
      • Fill:手指颜色填充。
      image-20240401172416873
      • Both :结合 Outline 和 Fill。

2.2 Interactable 对象

2.2.1 父子结构

​ 可抓取物体上需要添加 “Grabbable” 脚本,以实现在抓取物体的时候控制物体的位移、旋转和缩放。

image-20240402160241906

​ 可抓取物体下有一到多个 HandGrabInteractable 物体,即 Hand Grab 所需要的 Interactable 对象。

​ 在示例场景 HandGrabExamples 中,Interactable 对象被统一存放在 Interactables 路径下。以 SimpleGrab2PalmGrab 为例,其子物体 HandGrabInteractable 挂载了交互脚本 “Hand Grab lnteractable”。

image-20240401164416438

2.2.2 “Hand Grab lnteractable” 脚本

image-20240402160758438
  • Supported Grab Type:抓取方式。

    • Palm:捏合抓取。
    • Pinch:握持抓取。
    • All:二者均可。
  • Pinch / Palm Grab Rules:抓取触发手指的规则。

    Thumb、lndex、Middle、Ring、Max:大拇指、食指、中指、无名指、小指。

    • Required:标记了 Required 的手指,必须参与到抓取的触发过程中。即,想要抓起一个物体,必须要用到 Required 手指。
    • Optional:如果没有 Required 手指,则至少要用到一个标记 Optional 的手指。
    • Ignore:标记了 Ignore 的手指,不会被考虑到抓取的触发过程中。

    Unselect Mode:取消抓取的判定条件。

    • All Released:所有 Required 或者 Optional 手指松开后,视为取消抓取。
    • Any Released:有一个 Required 手指松开后,视为取消抓取。
  • Hand Alignment(Unity 中单词拼写错误):决定虚拟手如何变化到对应的抓取手势。

    • None:没有对应限制,会穿模。与没有添加 SyntheticHand 效果一样。
    • AIign On Grab:靠近物体时(即处于 hover 状态)虚拟手会与物体发生穿模。抓取时手部从物体内部快速调整到物体表面。
    • Attract On Hover:靠近物体时虚拟手会被限制在物体外部,不会穿模。抓取时手部直接吸附在物体表面。
    • Align Fingers On Hover:靠近物体时虚拟手会慢慢靠近物体。抓取时手部慢慢吸附到物体表面,穿模程度较小。
  • [Optional] ScaIed Hand Grab Poses:为不同大小的手配置相应的抓取手势。

    • HandGrab Point:后续专门介绍。

2.2.3 “Move Towards Target Provider” 脚本

​ 在运行程序时,如果当前 HandGrabInteractable 物体上没有挂载 “Move Towards Target Provider” 脚本,“Hand Grab lnteractable” 脚本会自动添加 “Move Towards Target Provider” 脚本,用于控制物体被抓取时朝向手部的移动。

image-20240402170405450
  • Travel Speed:移动速度。值越大,移动时间越长。

​ 如果想在程序运行前控制物体朝向手部的移动速度,可以在 HandGrabInteractable 物体上添加 “Move Towards Target Provider” 脚本,并设置其引用。

image-20240402171109624

2.2.4 其他 Movement Provider

(1)Move From Target Provider

​ 抓取时将手部吸附到物体上,而不是物体吸附到手上。

image-20240402171525204

(2)Follow Target Provider

​ 抓取时物体会跟随手部移动,具有阻尼效果。

image-20240402171636276
  • Speed:物体跟随速度。

3 抓取配置

3.1 玩家配置

3.1.1 自制预制体

(1)将 《2024-04-01 NO.3 Quest3 手势追踪与玩家角色配置》 文章中 SampleScene 场景下的 OVRCameraRig 进行 Prefab Unpack Completely,之后拖拽到 Assets > Prefabs 文件夹下。

image-20240402200905432

3.1.2 添加交互功能

(1)在 Package 中找到 HandGrabInteractor 预制体,将其拖拽为 SampleScene 场景中 MyOVRCameraRig > OVRInteraction > OVRHands > LeftHand > HandInteractorsLeft 的子物体。并对 RightHand 进行同样的操作。

image-20240402201242950

(2)场景中展开 LeftHand 下的 HandGrabInteractor 对象,将其 Visuals 下的两个子对象 HandGrabVisual 和 HandGrabGlow 激活,并设置对应的引用参数。同样的操作应用于 RightHand(步骤中所有 Left 对象改为 Right)。

  • HandGrabVisual:
    • Synthetic Hand <-- OVRLeftHandSynthetic。
  • HandGrabGlow:
    • Hand Visual <-- OVRLeftHandSynthetic > OVRLeftHandVisual。
    • Hand Renderer <-- OVRLeftHandSynthetic > OVRLeftHandVisual > OculusHand_L > l_handMeshNode。
    • Material Editor <-- OVRLeftHandSynthetic > OVRLeftHandVisual > OculusHand_L > l_handMeshNode。
image-20240402202042735 image-20240402202143256

(3)找到 LeftHand > HandInteractorsLeft 物体上的 “Best Hover lnteractor Group” 脚本,将 HandInteractorsLeft 物体拖拽入 Interactors 列表中。同样的操作应用于 RightHand > HandInteractorsRight 物体(步骤中所有 Left 对象改为 Right)。

image-20240402202813087

​ Interactors 列表存储不同种类的 Interactor 脚本。

​ Interactor Group 保证其列表下的所有 Interactor 在同一时刻只有一个进行交互,而其他 Interactor 暂时失活。

​ 此处 Best Hover Interactor Group 是 Meta XR SDK 中 Interactor Group 的其中一种。其特性是:

  1. 保证优先级高的 Interactor 进入到 hover 状态,优先级低的 Interactor 会暂时失活。

  2. 默认情况下,越靠前的列表元素拥有越高的优先级。

3.2 物体配置

3.2.1 配置 HandGrabInteractable

(1)在场景中创建一个桌面(Cube,这里配置了红色材质),桌面上放一个立方体 Cube 用于抓取。

​ 同时,给 Cube 添加 Rigidbody 和 Grabbable 组件,并将其 Box Collider 设置为 Trigger,取消勾选 Rigidbody 的 Use Gravity 选项。

​ 最后,勾选 Grabbable 的 Transfer On Second Selection 选项,以实现左右手交替抓取。

image-20240402205603844

(2)在 Project 中找到 HandGrabInteractable 预制体,将其拖拽为 Cube 的子物体。可以看见 HandGrabInteractable 自动寻找到了其父物体中的 Grabbable 和 Rigidbody。

image-20240402205157590

3.2.2 One Grab Free Transformer

​ 到此,运行程序,可以实现双手抓取移动 Cube。

​ 运行程序时,可以看到 Cube 物体上自动添加了 One Grab Free Transformer 脚本,并且被 Grabbable 脚本引用。

image-20240402210103367

​ Grabbable 脚本通过 Transformer 来控制物体被抓取时的移动旋转和缩放。默认使用 One Grab Free Transformer 脚本(一只手控制)。

​ 其他 One Grab Transformer:

image-20240402210628398
  • One Grab Rotate Transformer:仅控制物体旋转。
  • One Grab Scale Transformer:仅控制物体缩放。
  • One Grab Translate Transformer:仅控制物体平移。
  • One Grab Physics Joint Transformer:相对而言使用的很少。

3.2.3 Two Grab Free Transformer

​ 取消勾选 Cube 挂载的 Grabbable 脚本的 Transfer On Second Selection 选项,并更换 One Grab Free Transformer 脚本为 Two Grab Free Transformer 脚本,即可使用双手操控物体。

image-20240402211242487

​ 若想实现单双手都可操控,则同时添加 One Grab Free Transformer 脚本即可。

image-20240402211415484

3.3 颜色高亮显示

(1)在 Cube 下方新建空子物体 Visuals,用于控制 Cube 的颜色显示。

(2)为 Cube 依次添加以下脚本:

  1. Interactable Color Visual:控制物体在各种状态下显示的颜色。

    需要设置:

    • Interactable View <-- Material Property Block Editor 脚本。
    • Editor <-- Interactable Group View 脚本。
  2. Material Property Block Editor:关联物体材质。

    需要设置:

    • Renderers <-- Cube 的 Mesh Renderer 组件。
  3. Interactable Group View:可交互物体组。

    需要设置:

    • Interactables <-- HandGrabInteractable。
image-20240402213125272

​ 设置完成后,即可通过改变 Interactable Color Visual 中的 Color State 来更改物体对应状态的颜色。

​ 到此,我们可以对 Cube 进行抓取、移动和旋转,但是没有录制抓取手势。

4 添加物理抛掷效果

(1)取消 Cube 的 Box Collider 的 Trigger 选项,并勾选 Rigidbody 的 Use Gravity。此时,手部可以和 Cube 进行碰撞,手部碰撞体在 MyOVRCameraRig > TrackingSpace > LeftHandAnchor > OVRHandPrefab 下(运行状态下可见)。

image-20240402214921602

​ 这里运行时产生碰撞体是因为先前设置了 Enable Physics Capsules 选项。

image-20240402215126160

(2)为 Cube 添加 Physics Grabbable 脚本,添加时会自动关联 Cube 上的 Rigidbody 和 Grabbable。

image-20240402215439917

(3)将 Cube 上的 Physics Grabbable 脚本关联到 HandGrabInteractable 对象上。

image-20240402215620437

(4)在 Project 中找到 HandVelocityCaIculator,将其拖拽为 LeftHand / RightHand 的子物体。

image-20240402215835097

(5)关联对应的 LeftHand / RightHand。

image-20240402221145893

(6)将 HandVelocityCaIculator 关联到 HandInteractorsLeft > HandGrabInteractor 和 HandInteractorsRight > HandGrabInteractor 对象上。

image-20240402220137277

​ 此时,即可完成 Cube 物理抛掷的效果。

image-20240403102522126

​ 如果在抛掷过程中有穿模现象,可以将 Cube 的 Rigidbody 的 Collision Detection 设置为 Continuous Dynamic,进行连续动态的碰撞检测,但性能消耗会更大。

image-20240402220309344

5 录制抓取手势

5.1 场景录制

​ 录制抓取手势需要在 Unity 编辑器运行模式下进行,并且需要将头显和电脑进行串流(串流部分在 《2024-03-28 NO.1 Quest3 开发环境配置教程-CSDN博客》 中提及)。

image-20240403103331979

(1)打开 HandGrabPoseTool 场景,添加待录制的物体 Cube(这里还添加了一个子物体 Cube)。并确保物体上挂载 Rigidbody 组件和 Grabbable 脚本,没有则手动添加。

image-20240403103216459

​ 这里将 BoxCollider 设置为 Trigger,取消勾选了 Rigidbody 的 Use Gravity 选项,并勾选了 Grabbable 脚本的 Transfer On Second Selection。

image-20240403110006980

(2)运行 Unity,按下按钮,开始做抓取手势动作,3s 后将自动结束录制。若想要延长录制准备时间,可在前方点击按钮进行调整。注意,录制完成后不要急着退出运行模式。

(3)录制完成后,可以看见 Cube 下方多了 HandGrabInteractable 子物体。首先将 Cube 拖拽至 Assets > Prefabs 文件夹下成为预制体,再退出 Unity 运行模式。

image-20240403111138734

(4)在 Unity 编辑模式下,删除场景中原有的 Cube,将刚创建的预制体拖入场景,开始进行手势微调。

​ 点击 HandGrabInteractable > HandGrabPose 物体,找到其挂载的 Hand Grab Pose 脚本,调节其参数以达到想要的手势。

image-20240403111708236
  • Fingers Freedom:手指灵活程度。

    • Locked:抓取时,虚拟手指无法跟随现实手指进行弯曲。
    • Constrained:抓取时,虚拟手指可以向外弯曲而不能向内。
    • Free:抓取时,虚拟手指不受限制。
  • Joint Angles:关节角度。

    改变值可旋转每个关节的角度,也可以在 Scene 窗口中直接旋转蓝色圆圈编辑调节。

    image-20240403112030781

​ 微调完成后,失活 HandGrabPose 的子物体 Ghost-RightHand(Clone),即可取消显示录制手势。之后抓取物体时,手部会呈现刚录制好的姿势。

image-20240403112653600

5.2 工具录制

​ 点击上方菜单 Oculus > Interaction > Hand Grab Pose Recorder,打开录制窗口。

image-20240403113546970

(1)配置场景中想要录制的手,以及待录制物体的刚体组件。这里选择的是右手。

image-20240403113903025

(2)运行 Unity,在做好手势后用鼠标点击 Record HandGrabPose 按钮即可完成录制。建议录制时将物体的 Collider 选择 Trigger,并取消勾选了 Rigidbody 的 Use Gravity。

​ 由于录制时带着头显,不方便使用鼠标。因此可以配置相应的键盘按键(默认是空格),按下该键盘按键后即可完成录制。使用键盘按键来结束录制时,需要先将鼠标双击

Hand Grab Pose Recorder 录制窗口,以获取焦点。

​ 注意,录制完成后不要急着退出运行模式。

image-20240403114948243

(3)录制完成后,点击 Save To Collection 按钮保存录制结果,再退出 Unity 运行模式。

image-20240403115057133

(4)在 Unity 编辑模式下点击 Load From Collection 按钮,即可获取刚录制的手势。

image-20240403115346225

​ 可以看到,Cube 下方添加了两个 HandGrabInteractable,且其中一个记录了手势。其上方没有手势的 HandGrabInteractable 是因为录制前 Cube 拥有一个 HandGrabInteractable 子物体,在读取结果时将其一并拷贝了进来,这里删除即可。

image-20240403115417622

​ 之后录制时,不需要先给物体配置 HandGrabInteractable,添加好 Rigidbody 后直接录制即可。

5.3 手势镜像和缩放

​ 选中需要镜像手势的父物体 HandGrabInteractable,点击 Create Mirrored HandGrabInteractable 按钮,即可生成镜像手势。

image-20240403190448779

​ 调节 Scaled Hand Grab Poses 下方的 Scale 值,点击 Add HandGrabPose Key with Scale XXX 按钮后,即可生成对应缩放比例的手势。

image-20240403190858627

6 远距离抓取物体

6.1 玩家配置

(1)在 Project 窗口中找到 DistanceHandGrabInteractor 预制体,将其拖拽为 HandInteractorsLeft / HandInteractorsRight 的子物体。同时,将其挂载到 HandInteractorsLeft / HandInteractorsRight 的 Interactors 列表下。

image-20240403192146073

(2)展开 DistanceHandGrabInteractor 的 Visuals 子物体,将其两个子物体激活。并进行如下关联(与 3.1.2 节 相同):

  • HandGrabVisual:
    • Synthetic Hand <-- OVRLeftHandSynthetic。
  • HandGrabGlow:
    • Hand Visual <-- OVRLeftHandSynthetic > OVRLeftHandVisual。
    • Hand Renderer <-- OVRLeftHandSynthetic > OVRLeftHandVisual > OculusHand_L > l_handMeshNode。
    • Material Editor <-- OVRLeftHandSynthetic > OVRLeftHandVisual > OculusHand_L > l_handMeshNode。

​ 同样的操作对 OVRRightHandSynthetic 再执行一遍(步骤中所有 Left 对象改为 Right)。

image-20240403192704980 image-20240403192827902

(3)将先前配置好的 HandVelocityCalculator 关联到 DistanceHandGrabInteractor 上。该步骤为可选,但需注意左右手对应配置。

image-20240403193055687

6.2 物体配置

6.2.1 抓取配置

​ 参考 3.2.1 节 内容,创建一个 Cube,添加 Rigidbody 和 Grabbable 脚本,并将其设置为 Trigger,取消 Use Gravity。

​ 之后,为该物体添加 Distance Hand Grab Interactable 脚本,添加时会自动关联 Cube 上的 Rigidbody 和 Grabbable。

image-20240403193731345

​ 此时运行 Unity,双手对准 Cube 握拳后,Cube 会被远距离抓到手上。这是因为 Cube 上 Interactable 脚本的 Supported Grab Types 和 RightHand 下 Interactor 的 Supported Grab Types 都是 Pinch。 如果不匹配,则不会被抓取。

image-20240403194241056 image-20240403194225022

6.2.2 添加物理效果

(1)准备模型,这里使用两个 Cube 当成一把剑。其父子结构如下图。

​ 给 Sword 添加 Rigidbody 和 Grabbable 组件,同时添加 Physics Grabbable 脚本。

image-20240403203205500

​ Cube 和 Cube (1) 上带有 BoxCollider,且均设置为 Trigger。

(2)进行手势录制,并做一些微调。这里将所有手指都设置为 Locked。

image-20240403203640338

(3)在生成的 HandGrabInteractable 物体上添加 Distance Hand Grab Interactable 脚本,并为其关联 Physics Grabbable 脚本。

​ 对于 Hand Grab Interactable 脚本,其 Physics Grabbable 的引用在录制时被自动关联,因此这里不需要再重复关联。也可以手动检查确认一下。

image-20240403203953314

(4)恢复物体的 Use Gravity,并且将 Collider 的 Trigger 选项取消。此时这把“剑”便拥有了远距离抓取和抛掷的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/514614.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#编写MQTT客户端软件

主要参考C#MQTT编程06--MQTT服务器和客户端(winform版)_c#mqttserver-CSDN博客 但由于使用的.NET版本和MQTT库版本存在差异&#xff0c;因此有些不同。 MQTT协议内容在此不做描述&#xff0c;仅介绍VS使用C#的实现过程。本次使用VS2015&#xff0c;.netframwork4.6。 C#语言本身…

LeetCode每日一题之专题一:双指针 ——复写零

复写零OJ链接&#xff1a;1089. 复写零 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 解法&#xff08;原地复写-双指针&#xff09;&#xff1a; 算法思路&#xff1a; 如果「从前向后」进⾏原地复写操作的话&#xff0c;由于 0 的出现会复写两次&#xff0c;导致…

无法打开pycharm虚拟环境

问题&#xff1a;在pycharm的terminal中执行pip命令&#xff0c;但是下载的包没有安装到该项目的虚拟环境中。 激活虚拟环境&#xff0c;打开terminal&#xff0c;执行myenv\Scripts\activate&#xff0c;显示执行出错 无法加载文件 D:\Project\RF_Project\venv\Scripts\acti…

1999-2022年各省研究与试验发展经费内部支出数据/研发经费内部支出数据/RD经费内部支出数据

1999-2022年各省研究与试验发展经费内部支出数据/研发经费内部支出数据/R&D经费内部支出数据 1、时间&#xff1a;1999-2022年 2、来源&#xff1a;整理自科技年鉴 3、指标&#xff1a;研究与试验发展经费内部支出/R&D经费内部支出/研发经费内部支出 4、范围&#…

Stable Diffusion 本地化部署

一、前言 最近在家背八股文背诵得快吐了&#xff0c;烦闷的时候&#xff0c;看到使用 AI 进行作图&#xff0c;可以使用本地话部署。刚好自己家里的电脑&#xff0c;之前买来玩暗黑4&#xff0c;配置相对来说来可以&#xff0c;就拿来试试。 此篇是按照 Github 上的 stable-d…

Leetcode 1143. 最长公共子序列

心路历程&#xff1a; 这道题还是按照之前公共子数组的角度去思考的话会超时&#xff0c;即考虑最后一个元素一定是公共子序列的最后一个元素。需要换一种建模思路&#xff0c;从而简化整个递推过程。 状态&#xff1a;以i, j为结尾的区间的最长公共子序列&#xff0c;text1[…

【HTML】简单制作一个动态3D正方体

目录 前言 开始 HTML部分 JS部分 CSS部分 效果图 总结 前言 无需多言&#xff0c;本文将详细介绍一段代码&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建两个文本文档&#xff0c;其中HTML的文件名改为[index.html]&#xff0c;JS的文件名改…

智慧展览馆:基于AI智能识别技术的视频智慧监管解决方案

一、建设背景 随着科技的不断进步和社会安全需求的日益增长&#xff0c;展览馆作为展示文化、艺术和科技成果的重要场所&#xff0c;其安全监控系统的智能化升级已成为当务之急。为此&#xff0c;旭帆科技&#xff08;TSINGSEE青犀&#xff09;基于视频智能分析技术推出了展览馆…

Windows下Docker安装Kafka3+集群

编写 docker-compose.yaml 主要参照&#xff1a;https://www.cnblogs.com/wangguishe/p/17563274.html version: "3"services:kafka1:image: bitnami/kafka:3.4.1container_name: kafka1environment:- KAFKA_HEAP_OPTS-Xmx1024m -Xms1024m- KAFKA_ENABLE_KRAFTyes- K…

在s390x架构机器上构建frps/frpc镜像 —— 筑梦之路

源码&#xff1a;GitHub - fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet. # 克隆代码git clone https://github.com/fatedier/frp.git# 切换目录cd frp# 构建frps服务端docker build -t frps:s390x -f …

04 Python进阶:MySQL-PyMySQL

什么是 PyMySQL&#xff1f; PyMySQL 是一个用于 Python 的纯 Python MySQL 客户端库&#xff0c;提供了与 MySQL 数据库进行交互的功能。PyMySQL 允许 Python 开发人员连接到 MySQL 数据库服务器&#xff0c;并执行诸如查询、插入、更新和删除等数据库操作。 以下是 PyMySQL …

MySQL查询数据大小

在 MySQL 数据库中&#xff0c;有一个内置的库叫做 information_schema&#xff0c;该数据库中的 tables 表包含了数据库中所有表的基本信息&#xff0c;tables 表结构如下&#xff1a; 下面介绍几个主要关键字段&#xff1a; TABL_SCHEMA&#xff1a;表所属的数据库名TABLE_N…

使用deepspeed,transformers,safetensor中常见的训练精度,共享权重问题

使用deepspeed可能需要注意精度问题 混合精度&#xff0c;LayerNorm 虽然deepspeed有混合精度训练的功能&#xff0c;但是对于网络上各种奇奇怪怪的代码的DIY转化中&#xff0c;他还是很弱小的。它的精度问题&#xff0c;使用deepspeed如果模型中有部分模型使用的是half精度&a…

0基础如何进入IT行业?

前言 俗话说得好“隔行如隔山”&#xff0c;每个人从事自己陌生的行业都是十分艰难的。但现在网上不是流行一种这样的说法吗&#xff1f;360行&#xff0c;行行转IT。我觉得这个说的真的挺对的&#xff0c;因为从我身边认识的同事确实有很多大学并非是计算机科学专业的&#x…

【项目新功能开发篇】开发编码

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

练习 20 Web [HCTF 2018]admin

本题由于GitHub上的源码已经不见了&#xff0c;看了wp也没法复现&#xff0c;只用用保利破解的方式做题。 其他方法还有&#xff1a; Flask Session 伪造 https://blog.csdn.net/qq_46918279/article/details/121294915 暴力破解 打开后看到右上角有菜单栏 然后进入register界…

【THM】Nmap Post Port Scans(后端口扫描)-初级渗透测试

介绍 本房间是 Nmap 系列的最后一个(网络安全简介模块的一部分)。在这个房间中,我们重点关注端口扫描之后的步骤:特别是服务检测、操作系统检测、Nmap脚本引擎和保存扫描结果。 Nmap实时主机发现Nmap基本端口扫描Nmap高级端口扫描Nmap后端口扫描在本系列的第一个房间中,我…

​网络socket编程(二)——面向流的TCP编程及测试(SocketTool)、Wireshark软件使用

目录 一、书接上回&#xff08;select()函数使用注意事项&#xff09; 二、面向流(TCP)的socket编程 2.1 TCP服务端编程和测试 2.1.1 TCP服务器原理流程图 2.1.2 TCP服务端编程实战 2.1.3 测试 2.2 TCP客户端编程和测试 三、Wireshark抓包软件的使用 3.1 Wireshark是什…

vue 数据埋点

最近菜鸟做项目&#xff0c;需要做简单的数据埋点&#xff0c;不是企业级的&#xff0c;反正看渡一的视频&#xff0c;企业级特别复杂&#xff0c;包括但不限于&#xff1a;错误收集、点击地方、用户行为…… 菜鸟的需求就是简单收集一下用户的ip、地址、每个界面的访问时间&a…

doccano标注工具|为机器学习建模做数据标注

目录 一、标记流程 二、配置环境 2.1 安装 2.2 运行doccano 三、案例 3.1 创建项目 3.2 上传数据 3.3 定义标签 3.4 添加成员 3.5 开始标注 3.6 导出数据 3.7 导出数据 doccano doccano是开源的数据…