WildPerception

WildPerception 是一个利用 Unity Perception Package 来生成大规模多视角视频数据集的工具。
其允许用户导入自己的 Humanoid 人物模型,或者利用 SyntheticHumans Package 以合成人物模型,从而在自定义的场景中模拟行人。配合 MultiviewX_Perception 可以得到符合 Wildtrack 格式的数据集。

注意:

  1. 原 MultiviewX_FYP 现更名为 MultiviewX_Perception
  2. CalibrateTool 已集成到了此处,将不再独立导出
  3. 开发使用的 Editor 版本为 2022.3.3f1,不保证之前版本(尤其是2022.2之前)的表现。 Unity Perception Package 要求一定版本的 HDRP 。

Support For SyntheticHumans

  1. 添加 WildPerception、 SyntheticHumans Package 到您的项目中,推荐导入 SyntheticHumans 官方提供的 Samples,具体过程请参考:Install Packages and Set Things Up

  2. 为 TsingLoo.WildPerception.asmdef 添加 AssemblyDefinitionReferences,选择 SyntheticHumans 提供的 Unity.CV.SyntheticHumans.Runtime,而后在页面底部右下角点击 Apply,保存。

    选择 SyntheticHumans 提供的 Unity.CV.SyntheticHumans.Runtime

    在页面底部右下角点击 Apply,保存

  3. 找到 RuntimeModelProvider.cs 脚本,更改 false 为 true

    更改 false 为 true

  4. 将 RuntimeModelProvider 组件分配给场景

    将 RuntimeModelProvider 组件分配给场景

  5. 移除其他的ModelProvider

    移除其他的ModelProvider

  6. 添加 HumanGenerationConfig,Config 的具体配置请参考此文档下半部分:Generate Your First Humans

添加 HumanGenerationConfig

  1. 运行

Import

有两种方法可以将 WildPerception 包添加到您的项目中。

注意:

  1. 由于需要安装相关依赖,应该在联网环境中导入此包

[Method 1] Add package from git URL

注意:

  1. 这需要您的设备有 git 环境,可以去这里安装:git
  2. 由于目前 Package Manager 的限制,若如此做不可打开示例场景 SampleScene_WildPerception,但不影响其他功能。

Unity Editor 中打开 Window -> Package Manager

Add package from git URL

复制本项目地址,填写并添加

复制本项目地址

填写并添加

大约三到五分钟后,添加完成,Unity 开始导入新包。

[Method 2] Add package from disk

通过 git clone 或者直接从 github 上下载ZIP文件,或者从此处[Download WildPerception] 下载包。

直接从 github 上下载ZIP文件

将此ZIP文件解压,放到非项目Assets文件夹中(在项目文件夹外亦可)

放到非项目Assets文件夹中

Unity Editor 中打开 Window -> Package Manager

Add package from disk

将package.json选中并确定。

将package.json选中

大约两分钟后,添加完成,Unity 开始导入新包。

Setup

您可以很快赋予您的场景生成序列帧的能力,只需要简单的几步配置。

若您使用的是方法2来添加此包,不妨打开场景 Packages -> WildPerception -> Sample -> SampleScene_WildPerception。 这个场景中比较简洁,如下图所示,有预制体SceneController 和一些GameObject

需要用到的预制体及生成的GameObject

若您想使用自己搭建的场景,请为这个场景添加预制体 SceneController

为这个场景添加预制体 SceneController

SceneController

SceneController 集成了所有的配置与功能。

场景导入 SceneController 后,可以打开其Inspector面板,请按照您的情况配置。

Main Controller

MainController 是 SceneController上挂载的一个组件

点击 Init Scene,场景中会自动生成所需的GameObject,请在场景中将这些 GameObject 置于所需的位置,随后点击 Assign Transfrom

请设置 MultiviewX_Perception 项目的绝对路径

若使用 LocalFilePedestrianModelProvider, 请设置 Mode_PATH 的绝对路径,此路径务必在一个路径包含”Resources/Models”的文件夹下且此文件夹中有且仅有人物模型的预制体(.prefab),而非.fbx等模型文件。若您的项目中还没有人物模型,可以使用示例模型,其在 com.tsingloo.wildperception-main\Resources\Models 下,请使用其绝对路径。

设置相关路径

对于人物模型,仅仅要求其具有 Humanoid 骨骼,并带有 Animator组件,其 Runtime Animator Controller 可以为空,若为空,将会在其生成时使用您在 People Manager 中配置的默认Runtime Animator Controller。

仅仅要求其具有 Humanoid 骨骼,并带有 Animator 组件

注意:

  1. 请尽量保证GridOrigin_OpenCV的纵坐标(Y)与Center_HumanSpawn_CameraLookAt的纵坐标(Y)相同,否则可能会出现标定不准确的情况,这个问题可能会在后续工作中修复。
  2. 确保场景中供人物模型行走的平面携带有 NavMeshSurface 组件,并已完成烘焙,若您未在 Add Component 中找到这个组件,请前往安装 Package Manager -> Packages: Unity Registry -> AI Navigation,此处使用的版本是 1.1.1

供人物模型行走的平面携带有 NavMeshSurface 组件

Camera Manager

Camera Manager 管理并控制着相机相关的内容,您可以在这里配置将在场景运行多少帧后开始导出序列帧(Begin Frame Count)、相机的位置类型(自动生成 Ellipse_Auto 或者手动摆放 By Hand)、相机的自动生成参数 Ellipse_Auto Settings

Camera Place Type

若您希望程序自动生成相机,请使用Auto

若您希望手动放置相机,请使用 By Hand
并从菜单中添加相机,为这个场景添加相机预制体 Camera_Perception,并将预制体放在HandPlacedCameraParent下

为这个场景添加相机预制体

将相机预制体放在HandPlacedCameraParent下

Ellipse_Auto Settings

此处您可以配置相机的自动生成参数。

参数名 备注
Level 有几层相机
Nums Per Level 每层多少个相机
Height First Level 第一层离地(LookAt) 多少垂直高度(已经换算为了OpenCV下长度)
H Per Level 若有多层,每层层高(已经换算为了OpenCV下长度)
Major Axis 椭圆主轴长度 (已经换算为了OpenCV下长度)
Minor Axis 椭圆副轴长度 (已经换算为了OpenCV下长度)
Camera Prefab 将会被自动生成的相机的预制体

Pedestrians Manager

此处您可以配置人物生成的相关参数。

参数名 备注
Default Animator 人物模型使用的默认动画控制器
Add_human_count 每次敲击空格将会新生成几个人物模型
Preset_humans 场景初始化后生成多少个模型
Largest,Smallest,X,Y 规定初始化生成模型的区域(绿色矩形辅助线)以及行人的活动范围
Outter Bound Radius 人物模型回收边界,请设置大一些,务必使此边界不与 Grid 相交,否则可能出现Editor 卡死,这个问题会在后续工作中修复

AbstractPedestrianModelProvider

实现此类以能为 Pedestrians Manager 提供行人模型(将其拖拽到 Main Controller 的 Pedestrian Model Provider 属性槽中,默认为 LocalFilePedestrianModelProvider)

CalibrateTool

用于相机的标定,为 MultiviewX_Perception 提供数据,请见:CalibrateTool

MultiviewX

Introduction

Refer to MultiviewX_FYP for README.

需要指出的是,从原项目hou-yz/MultiviewX(644b90a)上直接clone的项目中的Image_subsets文件夹中的图片有误导性,依据其给出的matchings文件夹中的参数以及calibrate()中的相关代码,正确的图片应该是完整数据集(7.91GB)中的0000.png-0009.png。

下图为使用0000.png-0009.png的结果

967bb58d8c686d90dae7c67d726614b6.png

a784db0dc5b1c8691bbe2cce49ddd273.png

File Structure & Flow Overview

介绍这个项目文件结构与基础运行逻辑

run_all.py

作为程序的入口,运行即可产生结果,其顺序为:

1
2
3
4
5
6
7
8
from calibrateCamera import calibrate
from generatePOM import generate_POM
from generateAnnotation import annotate

if __name__ == '__main__':
calibrate()
generate_POM()
annotate()

首先会运行calibrate()方法,也是本文着重讨论的方法。

datasetParameters.py

记录了数据集的一些参数,包括相机数量,地图宽高等等,其内容为:

1
2
3
4
5
6
7
8
NUM_CAM = 6
MAP_HEIGHT = 16
MAP_WIDTH = 25
MAP_EXPAND = 40
IMAGE_HEIGHT = 1080
IMAGE_WIDTH = 1920
MAN_RADIUS = 0.16
MAN_HEIGHT = 1.8

CX folder

存放了相机X摄取的帧,

matchings folder

matchings 文件夹中给出本程序接受的主要变量,以相机为单位(CameraX.txt,CameraX_3d.txt)进行管理,理解其中各个参数的含义尤为重要。

Refer to Regarding the ground truths for MultiviewX · Issue #7 · hou-yz/MultiviewX · GitHub 可以看到一些对于参数含义的讨论,其内容如下:

the camera~.txt files provide 3d bounding boxes in both 3d coordinates and their 2d correspondences, both generated from unity.

Just in case anyone needs this for future reference, each row seems to consist of the following.

  • first column: frame number (0~399)
  • second column: person ID (PID)
  • third column onward: 3 (or in case of 2D bounding boxes, 2) coordinates for each vertex of the cuboid 3D bounding box and the feet of a person.

CameraX.txt

其中数据如下(为了更为直观的展示,将包围立方盒的16栏参数放在了一栏中,并使用括号包标出点,原数据中均使用空格隔开,并没有括号或者逗号

此数据的坐标系为屏幕空间。

Frame Number Person ID(PID) Cuboid 3D Bounding Box(8 points to define, 16 columns occupied) 脚底点的X坐标 脚底点的Y坐标
0 -190200 (1506.871,740.1227),
(1437.122 ,740.1227),
(1475.729,775.8286),
(1551.121 ,775.8286),
(1567.83,388.0219),
(1490.307,388.0219),
(1538.434, 396.1149),
(1622.993,396.1149)
1491.906 757.2814

367f286364486d2b01c1432d8f50df79.png

CameraX_3d.txt

其中数据如下,可以参照上述CameraX.txt 知晓含义

此数据的坐标系为世界坐标系。

Frame Number Person ID(PID) Cuboid 3D Bounding Box(8 points to define, 16 columns occupied) 脚底点坐标
0 -190200 (9.492622 11.4601144790649 0)
(9.132622 11.4601144790649 0)
(9.132622 11.8201150894165 0)
(9.492622 11.8201150894165 0)
(9.492622 11.4601144790649 1.8)
(9.132622 11.4601144790649 1.8)
(9.132622 11.8201150894165 1.8)
(9.492622 11.8201150894165 1.8)
(9.312622,11.6401147842407,0)

Unity3D(Any CG Tools)

在得到上述变量的相关含义后,就可以在对应的计算机图形学工具中准备数据(给出CameraX.txt,CameraX_3d.txt)了。

任何工具,只要能得出合理的空间坐标,图像上坐标,都是可以接受的。

工具将产出帧,以及此帧中对应的信息。

Introduction

本文中使用的是 Unity3D 2021.3.5f1c1,随后会给出相关的C#代码。思路比较简单,首先是在场景搭建中使用利于观察的方砖,其次是对每一个物体,生成一个3D的包围盒。

综合原GitHub中的项目文件来看,其产生的数据的精度是过高的,导致CameraX.txt,CameraX_3d.txt 略显臃肿。在Python代码中,其砍去了数据中小数部分,并且在标定阶段(calibrateCamera())给予了相应的补偿。

Code Practice

为了更为直观地展现流程,本文随后将关注单帧的信息生成,一些相关的代码可见于FYP_HDRP_Scripts

Bounding Box

首先为模型动态生成BoxCollider,随后获取此BoxCollider的顶点坐标

动态生成BoxCollider

见FYP_HDRP_Scripts

获取顶点坐标

参考# Unity 获取BoxCollider八个点的世界坐标