您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
209 行
8.3 KiB
209 行
8.3 KiB
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using NUnit.Framework;
|
|
using UnityEngine;
|
|
using UnityEngine.Perception.GroundTruth;
|
|
using UnityEngine.TestTools;
|
|
using Object = UnityEngine.Object;
|
|
|
|
#if MOQ_PRESENT
|
|
using Moq;
|
|
#endif
|
|
|
|
namespace GroundTruthTests
|
|
{
|
|
#if HDRP_PRESENT
|
|
[Ignore("Ignoring in HDRP because of a rendering issue in the first frame. See issue AISV-455.")]
|
|
#endif
|
|
public class PerceptionCameraIntegrationTests : GroundTruthTestBase
|
|
{
|
|
[UnityTest]
|
|
[UnityPlatform(RuntimePlatform.LinuxPlayer, RuntimePlatform.WindowsPlayer)]
|
|
public IEnumerator EnableBoundingBoxes_GeneratesCorrectDataset()
|
|
{
|
|
//set resolution to ensure we don't have rounding in rendering leading to bounding boxes to change height/width
|
|
Screen.SetResolution(400, 400, false);
|
|
//give the screen a chance to resize
|
|
yield return null;
|
|
|
|
var jsonExpected = $@" {{
|
|
""label_id"": 100,
|
|
""label_name"": ""label"",
|
|
""instance_id"": 1,
|
|
""x"": 0.0,
|
|
""y"": {Screen.height / 4:F1},
|
|
""width"": {Screen.width:F1},
|
|
""height"": {Screen.height / 2:F1}
|
|
}}";
|
|
var labelingConfiguration = CreateLabelingConfiguration();
|
|
SetupCamera(pc =>
|
|
{
|
|
pc.AddLabeler(new BoundingBox2DLabeler(labelingConfiguration));
|
|
});
|
|
|
|
var plane = TestHelper.CreateLabeledPlane();
|
|
AddTestObjectForCleanup(plane);
|
|
//a plane is 10x10 by default, so scale it down to be 10x1 to cover the center half of the image
|
|
plane.transform.localScale = new Vector3(10f, -1f, .1f);
|
|
yield return null;
|
|
SimulationManager.ResetSimulation();
|
|
|
|
var capturesPath = Path.Combine(SimulationManager.OutputDirectory, "captures_000.json");
|
|
var capturesJson = File.ReadAllText(capturesPath);
|
|
StringAssert.Contains(jsonExpected, capturesJson);
|
|
}
|
|
|
|
[UnityTest]
|
|
public IEnumerator EnableSemanticSegmentation_GeneratesCorrectDataset()
|
|
{
|
|
SetupCamera(pc =>
|
|
{
|
|
pc.AddLabeler(new SemanticSegmentationLabeler(CreateSemanticSegmentationLabelConfig()));
|
|
});
|
|
|
|
string expectedImageFilename = $"segmentation_{Time.frameCount}.png";
|
|
|
|
this.AddTestObjectForCleanup(TestHelper.CreateLabeledPlane());
|
|
yield return null;
|
|
SimulationManager.ResetSimulation();
|
|
|
|
var capturesPath = Path.Combine(SimulationManager.OutputDirectory, "captures_000.json");
|
|
var capturesJson = File.ReadAllText(capturesPath);
|
|
var imagePath = Path.Combine("SemanticSegmentation", expectedImageFilename).Replace(@"\", @"\\");
|
|
StringAssert.Contains(imagePath, capturesJson);
|
|
}
|
|
|
|
#if MOQ_PRESENT
|
|
[UnityTest]
|
|
public IEnumerator AddLabelerAfterStart_ShouldInitialize()
|
|
{
|
|
var camera = SetupCamera(null);
|
|
var mockLabeler = new Mock<CameraLabeler>();
|
|
yield return null;
|
|
camera.GetComponent<PerceptionCamera>().AddLabeler(mockLabeler.Object);
|
|
yield return null;
|
|
mockLabeler.Verify(l => l.Setup(), Times.Once());
|
|
}
|
|
[UnityTest]
|
|
public IEnumerator Labeler_ShouldSetupAndUpdateAndOnBeginRenderingInFirstFrame()
|
|
{
|
|
var mockLabeler = new Mock<CameraLabeler>();
|
|
SetupCamera(p => p.AddLabeler(mockLabeler.Object));
|
|
yield return null;
|
|
mockLabeler.Verify(l => l.Setup());
|
|
mockLabeler.Verify(l => l.OnUpdate());
|
|
mockLabeler.Verify(l => l.OnBeginRendering());
|
|
}
|
|
[UnityTest]
|
|
public IEnumerator AddAndRemoveLabelerInSameFrame_ShouldDoNothing()
|
|
{
|
|
var mockLabeler = new Mock<CameraLabeler>();
|
|
var cameraObject = SetupCamera(null);
|
|
var perceptionCamera = cameraObject.GetComponent<PerceptionCamera>();
|
|
perceptionCamera.AddLabeler(mockLabeler.Object);
|
|
perceptionCamera.RemoveLabeler(mockLabeler.Object);
|
|
yield return null;
|
|
mockLabeler.Verify(l => l.Setup(), Times.Never());
|
|
mockLabeler.Verify(l => l.OnUpdate(), Times.Never());
|
|
mockLabeler.Verify(l => l.OnBeginRendering(), Times.Never());
|
|
mockLabeler.Verify(l => l.Cleanup(), Times.Never());
|
|
}
|
|
[UnityTest]
|
|
public IEnumerator RemoveLabeler_ShouldCallCleanup()
|
|
{
|
|
var mockLabeler = new Mock<CameraLabeler>();
|
|
var cameraObject = SetupCamera(null);
|
|
var perceptionCamera = cameraObject.GetComponent<PerceptionCamera>();
|
|
perceptionCamera.AddLabeler(mockLabeler.Object);
|
|
yield return null;
|
|
Assert.IsTrue(perceptionCamera.RemoveLabeler(mockLabeler.Object));
|
|
mockLabeler.Verify(l => l.Cleanup(), Times.Once());
|
|
}
|
|
[UnityTest]
|
|
public IEnumerator RemoveLabeler_OnLabelerNotAdded_ShouldNotCallCleanup()
|
|
{
|
|
var mockLabeler = new Mock<CameraLabeler>();
|
|
var cameraObject = SetupCamera(null);
|
|
var perceptionCamera = cameraObject.GetComponent<PerceptionCamera>();
|
|
yield return null;
|
|
Assert.IsFalse(perceptionCamera.RemoveLabeler(mockLabeler.Object));
|
|
mockLabeler.Verify(l => l.Cleanup(), Times.Never());
|
|
}
|
|
[UnityTest]
|
|
public IEnumerator DestroyPerceptionCameraObject_ShouldCallCleanup()
|
|
{
|
|
var mockLabeler = new Mock<CameraLabeler>();
|
|
var cameraObject = SetupCamera(null);
|
|
var perceptionCamera = cameraObject.GetComponent<PerceptionCamera>();
|
|
perceptionCamera.AddLabeler(mockLabeler.Object);
|
|
yield return null;
|
|
Object.DestroyImmediate(cameraObject);
|
|
mockLabeler.Verify(l => l.Cleanup(), Times.Once());
|
|
}
|
|
[UnityTest]
|
|
public IEnumerator SetupThrows_ShouldDisable()
|
|
{
|
|
var mockLabeler = new Mock<CameraLabeler>();
|
|
mockLabeler.Setup(l => l.Setup()).Throws<InvalidOperationException>();
|
|
var labeler = mockLabeler.Object;
|
|
SetupCamera(p => p.AddLabeler(labeler));
|
|
yield return null;
|
|
mockLabeler.Verify(l => l.Setup(), Times.Once());
|
|
mockLabeler.Verify(l => l.OnUpdate(), Times.Never());
|
|
mockLabeler.Verify(l => l.OnBeginRendering(), Times.Never());
|
|
Assert.IsFalse(labeler.enabled);
|
|
}
|
|
#endif
|
|
|
|
static LabelingConfiguration CreateLabelingConfiguration()
|
|
{
|
|
var label = "label";
|
|
var labelingConfiguration = ScriptableObject.CreateInstance<LabelingConfiguration>();
|
|
|
|
labelingConfiguration.Init(new List<LabelEntry>
|
|
{
|
|
new LabelEntry
|
|
{
|
|
id = 100,
|
|
label = label,
|
|
value = 500
|
|
}
|
|
});
|
|
return labelingConfiguration;
|
|
}
|
|
static SemanticSegmentationLabelConfig CreateSemanticSegmentationLabelConfig()
|
|
{
|
|
var label = "label";
|
|
var labelingConfiguration = ScriptableObject.CreateInstance<SemanticSegmentationLabelConfig>();
|
|
|
|
labelingConfiguration.LabelEntries = new List<SemanticSegmentationLabelEntry>
|
|
{
|
|
new SemanticSegmentationLabelEntry()
|
|
{
|
|
label = label,
|
|
color = Color.blue
|
|
}
|
|
};
|
|
return labelingConfiguration;
|
|
}
|
|
|
|
GameObject SetupCamera(Action<PerceptionCamera> initPerceptionCamera)
|
|
{
|
|
var cameraObject = new GameObject();
|
|
cameraObject.SetActive(false);
|
|
var camera = cameraObject.AddComponent<Camera>();
|
|
camera.orthographic = true;
|
|
camera.orthographicSize = 1;
|
|
|
|
var perceptionCamera = cameraObject.AddComponent<PerceptionCamera>();
|
|
perceptionCamera.captureRgbImages = false;
|
|
initPerceptionCamera?.Invoke(perceptionCamera);
|
|
|
|
cameraObject.SetActive(true);
|
|
AddTestObjectForCleanup(cameraObject);
|
|
return cameraObject;
|
|
}
|
|
}
|
|
}
|