├── src ├── solo2yolo-unity │ ├── ProjectSettings │ │ ├── ProjectVersion.txt │ │ ├── Packages │ │ │ └── com.unity.testtools.codecoverage │ │ │ │ └── Settings.json │ │ ├── ClusterInputManager.asset │ │ ├── PresetManager.asset │ │ ├── EditorBuildSettings.asset │ │ ├── XRSettings.asset │ │ ├── VersionControlSettings.asset │ │ ├── TimeManager.asset │ │ ├── VFXManager.asset │ │ ├── AudioManager.asset │ │ ├── TagManager.asset │ │ ├── PackageManagerSettings.asset │ │ ├── EditorSettings.asset │ │ ├── UnityConnectSettings.asset │ │ ├── DynamicsManager.asset │ │ ├── MemorySettings.asset │ │ ├── NavMeshAreas.asset │ │ ├── Physics2DSettings.asset │ │ ├── GraphicsSettings.asset │ │ ├── SceneTemplateSettings.json │ │ ├── InputManager.asset │ │ ├── QualitySettings.asset │ │ └── ProjectSettings.asset │ ├── Packages │ │ ├── solo2yolo │ │ │ ├── Runtime │ │ │ │ ├── solo2yolo-osx-x64 │ │ │ │ ├── solo2yolo-linux-x64 │ │ │ │ ├── solo2yolo-win-x64.exe │ │ │ │ ├── solo2yolo-osx-x64.meta │ │ │ │ ├── solo2yolo-linux-x64.meta │ │ │ │ └── solo2yolo-win-x64.exe.meta │ │ │ ├── package.json.meta │ │ │ ├── Editor.meta │ │ │ ├── Runtime.meta │ │ │ ├── Editor │ │ │ │ ├── z3lx.solo2yolo.Editor.asmdef.meta │ │ │ │ ├── RectLayout.cs.meta │ │ │ │ ├── DatasetConverterWindow.cs.meta │ │ │ │ ├── z3lx.solo2yolo.Editor.asmdef │ │ │ │ ├── RectLayout.cs │ │ │ │ └── DatasetConverterWindow.cs │ │ │ └── package.json │ │ ├── manifest.json │ │ └── packages-lock.json │ ├── Assets │ │ ├── Scenes.meta │ │ └── Scenes │ │ │ ├── SampleScene.unity.meta │ │ │ └── SampleScene.unity │ └── .gitignore └── solo2yolo-dotnet │ ├── ComputerVisionTask.cs │ ├── solo2yolo-dotnet.csproj │ ├── ConsoleUtility.cs │ ├── Json │ ├── Converters │ │ ├── Vector2Converter.cs │ │ ├── Vector3Converter.cs │ │ ├── Vector4Converter.cs │ │ ├── CaptureConverter.cs │ │ └── AnnotationConverter.cs │ └── DataModels │ │ ├── FrameData.cs │ │ ├── Annotation.cs │ │ ├── RgbCapture.cs │ │ ├── Metadata.cs │ │ ├── AnnotationDefinition.cs │ │ ├── BoundingBox2DAnnotation.cs │ │ └── Capture.cs │ ├── solo2yolo-dotnet.sln │ ├── Program.cs │ ├── .gitignore │ └── DatasetConverter.cs ├── LICENSE └── README.md /src/solo2yolo-unity/ProjectSettings/ProjectVersion.txt: -------------------------------------------------------------------------------- 1 | m_EditorVersion: 2022.3.0f1 2 | m_EditorVersionWithRevision: 2022.3.0f1 (fb119bb0b476) 3 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "m_Dictionary": { 3 | "m_DictionaryValues": [] 4 | } 5 | } -------------------------------------------------------------------------------- /src/solo2yolo-unity/Packages/solo2yolo/Runtime/solo2yolo-osx-x64: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/z3lx/solo2yolo/HEAD/src/solo2yolo-unity/Packages/solo2yolo/Runtime/solo2yolo-osx-x64 -------------------------------------------------------------------------------- /src/solo2yolo-unity/Packages/solo2yolo/Runtime/solo2yolo-linux-x64: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/z3lx/solo2yolo/HEAD/src/solo2yolo-unity/Packages/solo2yolo/Runtime/solo2yolo-linux-x64 -------------------------------------------------------------------------------- /src/solo2yolo-unity/Packages/solo2yolo/Runtime/solo2yolo-win-x64.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/z3lx/solo2yolo/HEAD/src/solo2yolo-unity/Packages/solo2yolo/Runtime/solo2yolo-win-x64.exe -------------------------------------------------------------------------------- /src/solo2yolo-unity/ProjectSettings/ClusterInputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!236 &1 4 | ClusterInputManager: 5 | m_ObjectHideFlags: 0 6 | m_Inputs: [] 7 | -------------------------------------------------------------------------------- /src/solo2yolo-dotnet/ComputerVisionTask.cs: -------------------------------------------------------------------------------- 1 | namespace z3lx.solo2yolo 2 | { 3 | public enum ComputerVisionTask 4 | { 5 | Classify, 6 | Detect, 7 | Segment, 8 | Pose 9 | } 10 | } -------------------------------------------------------------------------------- /src/solo2yolo-unity/ProjectSettings/PresetManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1386491679 &1 4 | PresetManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_DefaultPresets: {} 8 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/Assets/Scenes.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 445faaa47c0dd204baa363e3d46bbbc8 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/Assets/Scenes/SampleScene.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9fc0d4010bbf28b4594072e72b8655ab 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/Packages/solo2yolo/package.json.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9eaa7d71876030f40b3cfbd86b2b49e0 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/Packages/solo2yolo/Runtime/solo2yolo-osx-x64.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bb11166b0c75933439bfd57f0c2f882c 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/ProjectSettings/EditorBuildSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1045 &1 4 | EditorBuildSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Scenes: [] 8 | m_configObjects: {} 9 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/Packages/solo2yolo/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 73050343639f1b941a200c855d4eb428 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/Packages/solo2yolo/Runtime.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9be65e3a15f5b6c4eb56c659e8ec7f5f 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/Packages/solo2yolo/Runtime/solo2yolo-linux-x64.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4b7a37d77501b8440b85369542a6e731 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/Packages/solo2yolo/Runtime/solo2yolo-win-x64.exe.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 89f5669458f9c174b885e0f894036017 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/ProjectSettings/XRSettings.asset: -------------------------------------------------------------------------------- 1 | { 2 | "m_SettingKeys": [ 3 | "VR Device Disabled", 4 | "VR Device User Alert" 5 | ], 6 | "m_SettingValues": [ 7 | "False", 8 | "False" 9 | ] 10 | } -------------------------------------------------------------------------------- /src/solo2yolo-unity/Packages/solo2yolo/Editor/z3lx.solo2yolo.Editor.asmdef.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cecdcfbec9fa03a459dff78c22d5a876 3 | AssemblyDefinitionImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/ProjectSettings/VersionControlSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!890905787 &1 4 | VersionControlSettings: 5 | m_ObjectHideFlags: 0 6 | m_Mode: Visible Meta Files 7 | m_CollabEditorSettings: 8 | inProgressEnabled: 1 9 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/ProjectSettings/TimeManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!5 &1 4 | TimeManager: 5 | m_ObjectHideFlags: 0 6 | Fixed Timestep: 0.02 7 | Maximum Allowed Timestep: 0.33333334 8 | m_TimeScale: 1 9 | Maximum Particle Timestep: 0.03 10 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/Packages/solo2yolo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "com.z3lx.solo2yolo", 3 | "version": "0.2.3", 4 | "displayName": "solo2yolo", 5 | "description": "solo2yolo is a tool that enables conversion of SOLO datasets to YOLO format from right within the Unity editor.", 6 | "unity": "2021.3", 7 | "unityRelease": "7f1" 8 | } -------------------------------------------------------------------------------- /src/solo2yolo-unity/Packages/solo2yolo/Editor/RectLayout.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6e6d08891d889344082b023f14573121 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/Packages/solo2yolo/Editor/DatasetConverterWindow.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7a88e0a6b3cf8da4e845515874c13d5b 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/ProjectSettings/VFXManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!937362698 &1 4 | VFXManager: 5 | m_ObjectHideFlags: 0 6 | m_IndirectShader: {fileID: 0} 7 | m_CopyBufferShader: {fileID: 0} 8 | m_SortShader: {fileID: 0} 9 | m_StripUpdateShader: {fileID: 0} 10 | m_RenderPipeSettingsPath: 11 | m_FixedTimeStep: 0.016666668 12 | m_MaxDeltaTime: 0.05 13 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/Packages/solo2yolo/Editor/z3lx.solo2yolo.Editor.asmdef: -------------------------------------------------------------------------------- 1 | { 2 | "name": "z3lx.solo2yolo.Editor", 3 | "rootNamespace": "solo2yolo.Editor", 4 | "references": [], 5 | "includePlatforms": [ 6 | "Editor" 7 | ], 8 | "excludePlatforms": [], 9 | "allowUnsafeCode": false, 10 | "overrideReferences": false, 11 | "precompiledReferences": [], 12 | "autoReferenced": true, 13 | "defineConstraints": [], 14 | "versionDefines": [], 15 | "noEngineReferences": false 16 | } -------------------------------------------------------------------------------- /src/solo2yolo-unity/ProjectSettings/AudioManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!11 &1 4 | AudioManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Volume: 1 8 | Rolloff Scale: 1 9 | Doppler Factor: 1 10 | Default Speaker Mode: 2 11 | m_SampleRate: 0 12 | m_DSPBufferSize: 1024 13 | m_VirtualVoiceCount: 512 14 | m_RealVoiceCount: 32 15 | m_SpatializerPlugin: 16 | m_AmbisonicDecoderPlugin: 17 | m_DisableAudio: 0 18 | m_VirtualizeEffects: 1 19 | m_RequestedDSPBufferSize: 1024 20 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/ProjectSettings/TagManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!78 &1 4 | TagManager: 5 | serializedVersion: 2 6 | tags: [] 7 | layers: 8 | - Default 9 | - TransparentFX 10 | - Ignore Raycast 11 | - 12 | - Water 13 | - UI 14 | - 15 | - 16 | - 17 | - 18 | - 19 | - 20 | - 21 | - 22 | - 23 | - 24 | - 25 | - 26 | - 27 | - 28 | - 29 | - 30 | - 31 | - 32 | - 33 | - 34 | - 35 | - 36 | - 37 | - 38 | - 39 | - 40 | m_SortingLayers: 41 | - name: Default 42 | uniqueID: 0 43 | locked: 0 44 | -------------------------------------------------------------------------------- /src/solo2yolo-dotnet/solo2yolo-dotnet.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net6.0 6 | solo2yolo 7 | enable 8 | enable 9 | solo2yolo 10 | 0.1.0 11 | z3lx 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/solo2yolo-dotnet/ConsoleUtility.cs: -------------------------------------------------------------------------------- 1 | namespace z3lx.solo2yolo 2 | { 3 | public static class ConsoleUtility 4 | { 5 | public static void PrintInfo(string message) 6 | { 7 | Console.ForegroundColor = ConsoleColor.White; 8 | Console.WriteLine($"[INFO] {message}"); 9 | Console.ResetColor(); 10 | } 11 | 12 | public static void PrintWarning(string message) 13 | { 14 | Console.ForegroundColor = ConsoleColor.Yellow; 15 | Console.WriteLine($"[WARN] {message}"); 16 | Console.ResetColor(); 17 | } 18 | 19 | public static void PrintError(string message) 20 | { 21 | Console.ForegroundColor = ConsoleColor.Red; 22 | Console.WriteLine($"[ERR ] {message}"); 23 | Console.ResetColor(); 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /src/solo2yolo-unity/Packages/solo2yolo/Editor/RectLayout.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace z3lx.solo2yolo 4 | { 5 | internal class RectLayout 6 | { 7 | public float lineHeight; 8 | public Rect contentRect; 9 | 10 | private Vector2 _currentPosition; 11 | 12 | public Rect GetNextRect(float width, float height) 13 | { 14 | float x = _currentPosition.x; 15 | float y = _currentPosition.y + ((lineHeight - height) / 2); 16 | _currentPosition.x += width; 17 | return new Rect(x, y, width, height); 18 | } 19 | 20 | public Rect GetNextRect(float width) 21 | { 22 | return GetNextRect(width, lineHeight); 23 | } 24 | 25 | public void NewLine() 26 | { 27 | _currentPosition.x = 0; 28 | _currentPosition.y += lineHeight; 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /src/solo2yolo-dotnet/Json/Converters/Vector2Converter.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | using Newtonsoft.Json.Linq; 3 | using System.Numerics; 4 | 5 | namespace z3lx.solo2yolo.Json.Converters 6 | { 7 | public class Vector2Converter : JsonConverter 8 | { 9 | public override bool CanConvert(Type objectType) 10 | { 11 | return objectType == typeof(Vector2); 12 | } 13 | 14 | public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 15 | { 16 | JArray jsonArray = JArray.Load(reader); 17 | if (jsonArray.Count != 2) 18 | throw new JsonException("Invalid array length for Vector2"); 19 | 20 | float x = jsonArray[0].Value(); 21 | float y = jsonArray[1].Value(); 22 | 23 | return new Vector2(x, y); 24 | } 25 | 26 | public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 27 | { 28 | throw new NotImplementedException(); 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /src/solo2yolo-unity/ProjectSettings/PackageManagerSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &1 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 61 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} 13 | m_Name: 14 | m_EditorClassIdentifier: 15 | m_EnablePreReleasePackages: 0 16 | m_EnablePackageDependencies: 0 17 | m_AdvancedSettingsExpanded: 1 18 | m_ScopedRegistriesSettingsExpanded: 1 19 | m_SeeAllPackageVersions: 0 20 | oneTimeWarningShown: 0 21 | m_Registries: 22 | - m_Id: main 23 | m_Name: 24 | m_Url: https://packages.unity.com 25 | m_Scopes: [] 26 | m_IsDefault: 1 27 | m_Capabilities: 7 28 | m_UserSelectedRegistryName: 29 | m_UserAddingNewScopedRegistry: 0 30 | m_RegistryInfoDraft: 31 | m_Modified: 0 32 | m_ErrorMessage: 33 | m_UserModificationsInstanceId: -830 34 | m_OriginalInstanceId: -832 35 | m_LoadAssets: 0 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 z3lx 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/ProjectSettings/EditorSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!159 &1 4 | EditorSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 11 7 | m_ExternalVersionControlSupport: Visible Meta Files 8 | m_SerializationMode: 2 9 | m_LineEndingsForNewScripts: 0 10 | m_DefaultBehaviorMode: 0 11 | m_PrefabRegularEnvironment: {fileID: 0} 12 | m_PrefabUIEnvironment: {fileID: 0} 13 | m_SpritePackerMode: 0 14 | m_SpritePackerPaddingPower: 1 15 | m_EtcTextureCompressorBehavior: 1 16 | m_EtcTextureFastCompressor: 1 17 | m_EtcTextureNormalCompressor: 2 18 | m_EtcTextureBestCompressor: 4 19 | m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp;asmref 20 | m_ProjectGenerationRootNamespace: 21 | m_CollabEditorSettings: 22 | inProgressEnabled: 1 23 | m_EnableTextureStreamingInEditMode: 1 24 | m_EnableTextureStreamingInPlayMode: 1 25 | m_AsyncShaderCompilation: 1 26 | m_EnterPlayModeOptionsEnabled: 0 27 | m_EnterPlayModeOptions: 3 28 | m_ShowLightmapResolutionOverlay: 1 29 | m_UseLegacyProbeSampleCount: 0 30 | m_SerializeInlineMappingsOnOneLine: 1 31 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/ProjectSettings/UnityConnectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!310 &1 4 | UnityConnectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 1 7 | m_Enabled: 0 8 | m_TestMode: 0 9 | m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events 10 | m_EventUrl: https://cdp.cloud.unity3d.com/v1/events 11 | m_ConfigUrl: https://config.uca.cloud.unity3d.com 12 | m_DashboardUrl: https://dashboard.unity3d.com 13 | m_TestInitMode: 0 14 | CrashReportingSettings: 15 | m_EventUrl: https://perf-events.cloud.unity3d.com 16 | m_Enabled: 0 17 | m_LogBufferSize: 10 18 | m_CaptureEditorExceptions: 1 19 | UnityPurchasingSettings: 20 | m_Enabled: 0 21 | m_TestMode: 0 22 | UnityAnalyticsSettings: 23 | m_Enabled: 0 24 | m_TestMode: 0 25 | m_InitializeOnStartup: 1 26 | m_PackageRequiringCoreStatsPresent: 0 27 | UnityAdsSettings: 28 | m_Enabled: 0 29 | m_InitializeOnStartup: 1 30 | m_TestMode: 0 31 | m_IosGameId: 32 | m_AndroidGameId: 33 | m_GameIds: {} 34 | m_GameId: 35 | PerformanceReportingSettings: 36 | m_Enabled: 0 37 | -------------------------------------------------------------------------------- /src/solo2yolo-dotnet/Json/Converters/Vector3Converter.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | using Newtonsoft.Json.Linq; 3 | using System.Numerics; 4 | 5 | namespace z3lx.solo2yolo.Json.Converters 6 | { 7 | public class Vector3Converter : JsonConverter 8 | { 9 | public override bool CanConvert(Type objectType) 10 | { 11 | return objectType == typeof(Vector3); 12 | } 13 | 14 | public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 15 | { 16 | JArray jsonArray = JArray.Load(reader); 17 | if (jsonArray.Count != 3) 18 | throw new JsonException("Invalid array length for Vector3"); 19 | 20 | float x = jsonArray[0].Value(); 21 | float y = jsonArray[1].Value(); 22 | float z = jsonArray[2].Value(); 23 | 24 | return new Vector3(x, y, z); 25 | } 26 | 27 | public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 28 | { 29 | throw new NotImplementedException(); 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /src/solo2yolo-dotnet/Json/DataModels/FrameData.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace z3lx.solo2yolo.Json.DataModels 4 | { 5 | [Serializable] 6 | public sealed class FrameData 7 | { 8 | /// 9 | /// The integer ID of the frame. 10 | /// 11 | [JsonProperty("frame")] 12 | public int Frame { get; set; } 13 | 14 | /// 15 | /// The sequence number. 16 | /// 17 | [JsonProperty("sequence")] 18 | public int Sequence { get; set; } 19 | 20 | /// 21 | /// The step inside the sequence. 22 | /// 23 | [JsonProperty("step")] 24 | public int Step { get; set; } 25 | 26 | /// 27 | /// Timestamp in milliseconds since the sequence started. 28 | /// 29 | [JsonProperty("timestamp")] 30 | public float Timestamp { get; set; } 31 | 32 | /// 33 | /// The list of captures. 34 | /// 35 | [JsonProperty("captures")] 36 | public Capture[]? Captures { get; set; } 37 | } 38 | } -------------------------------------------------------------------------------- /src/solo2yolo-dotnet/Json/Converters/Vector4Converter.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | using Newtonsoft.Json.Linq; 3 | using System.Numerics; 4 | 5 | namespace z3lx.solo2yolo.Json.Converters 6 | { 7 | public class Vector4Converter : JsonConverter 8 | { 9 | public override bool CanConvert(Type objectType) 10 | { 11 | return objectType == typeof(Vector4); 12 | } 13 | 14 | public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 15 | { 16 | JArray jsonArray = JArray.Load(reader); 17 | if (jsonArray.Count != 4) 18 | throw new JsonException("Invalid array length for Vector4"); 19 | 20 | float x = jsonArray[0].Value(); 21 | float y = jsonArray[1].Value(); 22 | float z = jsonArray[2].Value(); 23 | float w = jsonArray[3].Value(); 24 | 25 | return new Vector4(x, y, z, w); 26 | } 27 | 28 | public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 29 | { 30 | throw new NotImplementedException(); 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /src/solo2yolo-dotnet/solo2yolo-dotnet.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.5.33516.290 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "solo2yolo-dotnet", "solo2yolo-dotnet.csproj", "{8449B1D8-EC10-49B5-9485-1BB19F95D2CA}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {8449B1D8-EC10-49B5-9485-1BB19F95D2CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {8449B1D8-EC10-49B5-9485-1BB19F95D2CA}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {8449B1D8-EC10-49B5-9485-1BB19F95D2CA}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {8449B1D8-EC10-49B5-9485-1BB19F95D2CA}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {7DCBA89E-9E66-4592-8B46-B16A2E4E8014} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/ProjectSettings/DynamicsManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!55 &1 4 | PhysicsManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 11 7 | m_Gravity: {x: 0, y: -9.81, z: 0} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_BounceThreshold: 2 10 | m_SleepThreshold: 0.005 11 | m_DefaultContactOffset: 0.01 12 | m_DefaultSolverIterations: 6 13 | m_DefaultSolverVelocityIterations: 1 14 | m_QueriesHitBackfaces: 0 15 | m_QueriesHitTriggers: 1 16 | m_EnableAdaptiveForce: 0 17 | m_ClothInterCollisionDistance: 0 18 | m_ClothInterCollisionStiffness: 0 19 | m_ContactsGeneration: 1 20 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 21 | m_AutoSimulation: 1 22 | m_AutoSyncTransforms: 0 23 | m_ReuseCollisionCallbacks: 1 24 | m_ClothInterCollisionSettingsToggle: 0 25 | m_ContactPairsMode: 0 26 | m_BroadphaseType: 0 27 | m_WorldBounds: 28 | m_Center: {x: 0, y: 0, z: 0} 29 | m_Extent: {x: 250, y: 250, z: 250} 30 | m_WorldSubdivisions: 8 31 | m_FrictionType: 0 32 | m_EnableEnhancedDeterminism: 0 33 | m_EnableUnifiedHeightmaps: 1 34 | m_DefaultMaxAngluarSpeed: 7 35 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/ProjectSettings/MemorySettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!387306366 &1 4 | MemorySettings: 5 | m_ObjectHideFlags: 0 6 | m_EditorMemorySettings: 7 | m_MainAllocatorBlockSize: -1 8 | m_ThreadAllocatorBlockSize: -1 9 | m_MainGfxBlockSize: -1 10 | m_ThreadGfxBlockSize: -1 11 | m_CacheBlockSize: -1 12 | m_TypetreeBlockSize: -1 13 | m_ProfilerBlockSize: -1 14 | m_ProfilerEditorBlockSize: -1 15 | m_BucketAllocatorGranularity: -1 16 | m_BucketAllocatorBucketsCount: -1 17 | m_BucketAllocatorBlockSize: -1 18 | m_BucketAllocatorBlockCount: -1 19 | m_ProfilerBucketAllocatorGranularity: -1 20 | m_ProfilerBucketAllocatorBucketsCount: -1 21 | m_ProfilerBucketAllocatorBlockSize: -1 22 | m_ProfilerBucketAllocatorBlockCount: -1 23 | m_TempAllocatorSizeMain: -1 24 | m_JobTempAllocatorBlockSize: -1 25 | m_BackgroundJobTempAllocatorBlockSize: -1 26 | m_JobTempAllocatorReducedBlockSize: -1 27 | m_TempAllocatorSizeGIBakingWorker: -1 28 | m_TempAllocatorSizeNavMeshWorker: -1 29 | m_TempAllocatorSizeAudioWorker: -1 30 | m_TempAllocatorSizeCloudWorker: -1 31 | m_TempAllocatorSizeGfx: -1 32 | m_TempAllocatorSizeJobWorker: -1 33 | m_TempAllocatorSizeBackgroundWorker: -1 34 | m_TempAllocatorSizePreloadManager: -1 35 | m_PlatformMemorySettings: {} 36 | -------------------------------------------------------------------------------- /src/solo2yolo-dotnet/Json/DataModels/Annotation.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | using z3lx.solo2yolo.Json.Converters; 3 | 4 | namespace z3lx.solo2yolo.Json.DataModels 5 | { 6 | /// 7 | /// An annotation record contains the ground truth for a sensor either inline or in a separate file. A single capture may 8 | /// contain many annotations each corresponding to one active Labeler in the simulation. 9 | /// 10 | [Serializable] 11 | [JsonObject(ItemRequired = Required.Always)] 12 | [JsonConverter(typeof(AnnotationConverter))] 13 | public abstract class Annotation 14 | { 15 | /// 16 | /// The class type of the annotation. 17 | /// 18 | [JsonProperty("@type")] 19 | public string Type { get; set; } 20 | 21 | /// 22 | /// The registered ID of the annotation. 23 | /// 24 | [JsonProperty("id")] 25 | public string Id { get; set; } 26 | 27 | /// 28 | /// The ID of the sensor that this annotation is attached to. 29 | /// 30 | [JsonProperty("sensorId")] 31 | public string SensorId { get; set; } 32 | 33 | /// 34 | /// The human readable description of the sensor. 35 | /// 36 | [JsonProperty("description")] 37 | public string Description { get; set; } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/solo2yolo-dotnet/Json/Converters/CaptureConverter.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | using Newtonsoft.Json.Linq; 3 | using z3lx.solo2yolo.Json.DataModels; 4 | 5 | namespace z3lx.solo2yolo.Json.Converters 6 | { 7 | public class CaptureConverter : JsonConverter 8 | { 9 | public override bool CanConvert(Type objectType) 10 | { 11 | return objectType == typeof(Capture); 12 | } 13 | 14 | public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 15 | { 16 | JObject jsonObject = JObject.Load(reader); 17 | 18 | JToken jsonToken = jsonObject["@type"]; 19 | if (jsonToken == null || jsonToken.Type != JTokenType.String) 20 | throw new JsonSerializationException("Invalid @type property."); 21 | 22 | string type = jsonObject["@type"].Value(); 23 | Capture capture = type switch 24 | { 25 | "type.unity.com/unity.solo.RGBCamera" => new RgbCapture(), 26 | _ => throw new NotImplementedException(), 27 | }; 28 | serializer.Populate(jsonObject.CreateReader(), capture); 29 | return capture; 30 | } 31 | 32 | public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 33 | { 34 | throw new NotImplementedException(); 35 | } 36 | } 37 | } -------------------------------------------------------------------------------- /src/solo2yolo-dotnet/Json/DataModels/RgbCapture.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | using System.Numerics; 3 | using z3lx.solo2yolo.Json.Converters; 4 | 5 | namespace z3lx.solo2yolo.Json.DataModels 6 | { 7 | /// 8 | /// Extends the capture class with data specific for an RGB camera sensor. 9 | /// 10 | [Serializable] 11 | public sealed class RgbCapture : Capture 12 | { 13 | /// 14 | /// A single file that stores sensor captured data. 15 | /// 16 | [JsonProperty("filename")] 17 | public string FileName { get; set; } 18 | 19 | /// 20 | /// The format of the sensor captured file. 21 | /// 22 | [JsonProperty("imageFormat")] 23 | public string ImageFormat { get; set; } 24 | 25 | /// 26 | /// The image size in pixels (width/height). 27 | /// 28 | [JsonProperty("dimension")] 29 | [JsonConverter(typeof(Vector2Converter))] 30 | public Vector2 Dimension { get; set; } 31 | 32 | /// 33 | /// Holds the type of projection the camera used for the capture (perspective/orthographic). 34 | /// 35 | [JsonProperty("projection")] 36 | public string Projection { get; set; } 37 | 38 | /// 39 | /// The projection matrix of the camera. 40 | /// 41 | [JsonProperty("matrix")] 42 | public float[] Matrix { get; set; } 43 | } 44 | } -------------------------------------------------------------------------------- /src/solo2yolo-unity/Packages/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "com.unity.ide.visualstudio": "2.0.18", 4 | "com.unity.modules.ai": "1.0.0", 5 | "com.unity.modules.androidjni": "1.0.0", 6 | "com.unity.modules.animation": "1.0.0", 7 | "com.unity.modules.assetbundle": "1.0.0", 8 | "com.unity.modules.audio": "1.0.0", 9 | "com.unity.modules.cloth": "1.0.0", 10 | "com.unity.modules.director": "1.0.0", 11 | "com.unity.modules.imageconversion": "1.0.0", 12 | "com.unity.modules.imgui": "1.0.0", 13 | "com.unity.modules.jsonserialize": "1.0.0", 14 | "com.unity.modules.particlesystem": "1.0.0", 15 | "com.unity.modules.physics": "1.0.0", 16 | "com.unity.modules.physics2d": "1.0.0", 17 | "com.unity.modules.screencapture": "1.0.0", 18 | "com.unity.modules.terrain": "1.0.0", 19 | "com.unity.modules.terrainphysics": "1.0.0", 20 | "com.unity.modules.tilemap": "1.0.0", 21 | "com.unity.modules.ui": "1.0.0", 22 | "com.unity.modules.uielements": "1.0.0", 23 | "com.unity.modules.umbra": "1.0.0", 24 | "com.unity.modules.unityanalytics": "1.0.0", 25 | "com.unity.modules.unitywebrequest": "1.0.0", 26 | "com.unity.modules.unitywebrequestassetbundle": "1.0.0", 27 | "com.unity.modules.unitywebrequestaudio": "1.0.0", 28 | "com.unity.modules.unitywebrequesttexture": "1.0.0", 29 | "com.unity.modules.unitywebrequestwww": "1.0.0", 30 | "com.unity.modules.vehicles": "1.0.0", 31 | "com.unity.modules.video": "1.0.0", 32 | "com.unity.modules.vr": "1.0.0", 33 | "com.unity.modules.wind": "1.0.0", 34 | "com.unity.modules.xr": "1.0.0" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/.gitignore: -------------------------------------------------------------------------------- 1 | # This .gitignore file should be placed at the root of your Unity project directory 2 | # 3 | # Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore 4 | # 5 | /[Ll]ibrary/ 6 | /[Tt]emp/ 7 | /[Oo]bj/ 8 | /[Bb]uild/ 9 | /[Bb]uilds/ 10 | /[Ll]ogs/ 11 | /[Uu]ser[Ss]ettings/ 12 | 13 | # MemoryCaptures can get excessive in size. 14 | # They also could contain extremely sensitive data 15 | /[Mm]emoryCaptures/ 16 | 17 | # Recordings can get excessive in size 18 | /[Rr]ecordings/ 19 | 20 | # Uncomment this line if you wish to ignore the asset store tools plugin 21 | # /[Aa]ssets/AssetStoreTools* 22 | 23 | # Autogenerated Jetbrains Rider plugin 24 | /[Aa]ssets/Plugins/Editor/JetBrains* 25 | 26 | # Visual Studio cache directory 27 | .vs/ 28 | 29 | # Gradle cache directory 30 | .gradle/ 31 | 32 | # Autogenerated VS/MD/Consulo solution and project files 33 | ExportedObj/ 34 | .consulo/ 35 | *.csproj 36 | *.unityproj 37 | *.sln 38 | *.suo 39 | *.tmp 40 | *.user 41 | *.userprefs 42 | *.pidb 43 | *.booproj 44 | *.svd 45 | *.pdb 46 | *.mdb 47 | *.opendb 48 | *.VC.db 49 | *.vsconfig 50 | 51 | # Unity3D generated meta files 52 | *.pidb.meta 53 | *.pdb.meta 54 | *.mdb.meta 55 | 56 | # Unity3D generated file on crash reports 57 | sysinfo.txt 58 | 59 | # Builds 60 | *.apk 61 | *.aab 62 | *.unitypackage 63 | *.app 64 | 65 | # Crashlytics generated file 66 | crashlytics-build.properties 67 | 68 | # Packed Addressables 69 | /[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin* 70 | 71 | # Temporary auto-generated Android Assets 72 | /[Aa]ssets/[Ss]treamingAssets/aa.meta 73 | /[Aa]ssets/[Ss]treamingAssets/aa/* 74 | -------------------------------------------------------------------------------- /src/solo2yolo-dotnet/Json/Converters/AnnotationConverter.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | using Newtonsoft.Json.Linq; 3 | using z3lx.solo2yolo.Json.DataModels; 4 | 5 | namespace z3lx.solo2yolo.Json.Converters 6 | { 7 | public class AnnotationConverter : JsonConverter 8 | { 9 | public override bool CanConvert(Type objectType) 10 | { 11 | return objectType == typeof(Annotation); 12 | } 13 | 14 | public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 15 | { 16 | JObject jsonObject = JObject.Load(reader); 17 | 18 | JToken jsonToken = jsonObject["@type"]; 19 | if (jsonToken == null || jsonToken.Type != JTokenType.String) 20 | throw new JsonSerializationException("Invalid @type property."); 21 | 22 | string type = jsonObject["@type"].Value(); 23 | Annotation annotation = type switch 24 | { 25 | "type.unity.com/unity.solo.BoundingBox2DAnnotation" => new BoundingBox2DAnnotation(), 26 | "type.unity.com/unity.solo.InstanceSegmentationAnnotation" => throw new NotImplementedException(), 27 | "type.unity.com/unity.solo.KeypointAnnotation" => throw new NotImplementedException(), 28 | _ => throw new NotImplementedException(), 29 | }; 30 | serializer.Populate(jsonObject.CreateReader(), annotation); 31 | return annotation; 32 | } 33 | 34 | public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 35 | { 36 | throw new NotImplementedException(); 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /src/solo2yolo-unity/ProjectSettings/NavMeshAreas.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!126 &1 4 | NavMeshProjectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | areas: 8 | - name: Walkable 9 | cost: 1 10 | - name: Not Walkable 11 | cost: 1 12 | - name: Jump 13 | cost: 2 14 | - name: 15 | cost: 1 16 | - name: 17 | cost: 1 18 | - name: 19 | cost: 1 20 | - name: 21 | cost: 1 22 | - name: 23 | cost: 1 24 | - name: 25 | cost: 1 26 | - name: 27 | cost: 1 28 | - name: 29 | cost: 1 30 | - name: 31 | cost: 1 32 | - name: 33 | cost: 1 34 | - name: 35 | cost: 1 36 | - name: 37 | cost: 1 38 | - name: 39 | cost: 1 40 | - name: 41 | cost: 1 42 | - name: 43 | cost: 1 44 | - name: 45 | cost: 1 46 | - name: 47 | cost: 1 48 | - name: 49 | cost: 1 50 | - name: 51 | cost: 1 52 | - name: 53 | cost: 1 54 | - name: 55 | cost: 1 56 | - name: 57 | cost: 1 58 | - name: 59 | cost: 1 60 | - name: 61 | cost: 1 62 | - name: 63 | cost: 1 64 | - name: 65 | cost: 1 66 | - name: 67 | cost: 1 68 | - name: 69 | cost: 1 70 | - name: 71 | cost: 1 72 | m_LastAgentTypeID: -887442657 73 | m_Settings: 74 | - serializedVersion: 2 75 | agentTypeID: 0 76 | agentRadius: 0.5 77 | agentHeight: 2 78 | agentSlope: 45 79 | agentClimb: 0.75 80 | ledgeDropHeight: 0 81 | maxJumpAcrossDistance: 0 82 | minRegionArea: 2 83 | manualCellSize: 0 84 | cellSize: 0.16666667 85 | manualTileSize: 0 86 | tileSize: 256 87 | accuratePlacement: 0 88 | debug: 89 | m_Flags: 0 90 | m_SettingNames: 91 | - Humanoid 92 | -------------------------------------------------------------------------------- /src/solo2yolo-dotnet/Json/DataModels/Metadata.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace z3lx.solo2yolo.Json.DataModels 4 | { 5 | [Serializable] 6 | [JsonObject(ItemRequired = Required.Always)] 7 | public sealed class Metadata 8 | { 9 | [JsonProperty("unityVersion")] 10 | public string UnityVersion { get; set; } 11 | 12 | [JsonProperty("perceptionVersion")] 13 | public string PerceptionVersion { get; set; } 14 | 15 | [JsonProperty("renderPipeline")] 16 | public string RenderPipeline { get; set; } 17 | 18 | [JsonProperty("simulationStartTime")] 19 | public string SimulationStartTime { get; set; } 20 | 21 | [JsonProperty("scenarioRandomSeed")] 22 | public int ScenarioRandomSeed { get; set; } 23 | 24 | [JsonProperty("scenarioActiveRandomizers")] 25 | public string[] ScenarioActiveRandomizers { get; set; } 26 | 27 | [JsonProperty("totalFrames")] 28 | public int TotalFrames { get; set; } 29 | 30 | [JsonProperty("totalSequences")] 31 | public int TotalSequences { get; set; } 32 | 33 | [JsonProperty("sensors")] 34 | public string[] Sensors { get; set; } 35 | 36 | [JsonProperty("metricCollectors")] 37 | public string[] MetricCollectors { get; set; } 38 | 39 | [JsonProperty("simulationEndTime")] 40 | public string SimulationEndTime { get; set; } 41 | 42 | [JsonProperty("annotators")] 43 | public Annotator[] Annotators { get; set; } 44 | 45 | [Serializable] 46 | public class Annotator 47 | { 48 | [JsonProperty("name")] 49 | public string Name { get; set; } 50 | 51 | [JsonProperty("type")] 52 | public string Type { get; set; } 53 | } 54 | } 55 | } -------------------------------------------------------------------------------- /src/solo2yolo-dotnet/Json/DataModels/AnnotationDefinition.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace z3lx.solo2yolo.Json.DataModels 4 | { 5 | [Serializable] 6 | [JsonObject(ItemRequired = Required.Always)] 7 | public sealed class AnnotationDefinitions 8 | { 9 | [JsonProperty("annotationDefinitions")] 10 | public AnnotationDefinition[] Values { get; set; } 11 | } 12 | 13 | [Serializable] 14 | [JsonObject(ItemRequired = Required.Always)] 15 | public sealed class AnnotationDefinition 16 | { 17 | /// 18 | /// The class type of the annotation. 19 | /// 20 | [JsonProperty("@type")] 21 | public string Type { get; set; } 22 | 23 | /// 24 | /// The registered ID of the annotation, assigned in the Perception Camera UI. 25 | /// 26 | [JsonProperty("id")] 27 | public string Id { get; set; } 28 | 29 | /// 30 | /// The description of this annotation definition. 31 | /// 32 | [JsonProperty("description")] 33 | public string Description { get; set; } 34 | 35 | /// 36 | /// Format-specific specification for the annotation values. 37 | /// 38 | [JsonProperty("spec")] 39 | public Specification[] Specifications { get; set; } 40 | 41 | // TODO: Check annotation-specific properties 42 | [Serializable] 43 | [JsonObject(ItemRequired = Required.Always)] 44 | public sealed class Specification 45 | { 46 | [JsonProperty("label_id")] 47 | public int LabelId { get; set; } 48 | 49 | [JsonProperty("label_name")] 50 | public string labelName { get; set; } 51 | } 52 | } 53 | } -------------------------------------------------------------------------------- /src/solo2yolo-dotnet/Json/DataModels/BoundingBox2DAnnotation.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | using System.Numerics; 3 | using z3lx.solo2yolo.Json.Converters; 4 | 5 | namespace z3lx.solo2yolo.Json.DataModels 6 | { 7 | /// 8 | /// Each bounding box record maps a tuple of (instance, label) to a set of 4 variables (x, y, width, height) that draws a 9 | /// bounding box. The OpenCV 2D coordinate system is followed, where the origin (0,0), (x = 0, y = 0) is at the top left of the image. 10 | /// 11 | [Serializable] 12 | [JsonObject(ItemRequired = Required.Default)] 13 | public sealed class BoundingBox2DAnnotation : Annotation 14 | { 15 | /// 16 | /// Array of bounding boxes in the frame. 17 | /// 18 | [JsonProperty("values")] 19 | public Value[] Values { get; set; } 20 | 21 | [Serializable] 22 | [JsonObject(ItemRequired = Required.Always)] 23 | public class Value 24 | { 25 | /// 26 | /// Integer id of the entity. 27 | /// 28 | [JsonProperty("instanceId")] 29 | public int InstanceId { get; set; } 30 | 31 | /// 32 | /// Integer identifier of the label. 33 | /// 34 | [JsonProperty("labelId")] 35 | public int LabelId { get; set; } 36 | 37 | /// 38 | /// String identifier of the label. 39 | /// 40 | [JsonProperty("labelName")] 41 | public string LabelName { get; set; } 42 | 43 | /// 44 | /// The pixel location of the upper left corner of the box. 45 | /// 46 | [JsonProperty("origin")] 47 | [JsonConverter(typeof(Vector2Converter))] 48 | public Vector2 Origin { get; set; } 49 | 50 | /// 51 | /// The number of pixels in the x and y direction. 52 | /// 53 | [JsonProperty("dimension")] 54 | [JsonConverter(typeof(Vector2Converter))] 55 | public Vector2 Dimension { get; set; } 56 | } 57 | } 58 | } -------------------------------------------------------------------------------- /src/solo2yolo-unity/ProjectSettings/Physics2DSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!19 &1 4 | Physics2DSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 4 7 | m_Gravity: {x: 0, y: -9.81} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_VelocityIterations: 8 10 | m_PositionIterations: 3 11 | m_VelocityThreshold: 1 12 | m_MaxLinearCorrection: 0.2 13 | m_MaxAngularCorrection: 8 14 | m_MaxTranslationSpeed: 100 15 | m_MaxRotationSpeed: 360 16 | m_BaumgarteScale: 0.2 17 | m_BaumgarteTimeOfImpactScale: 0.75 18 | m_TimeToSleep: 0.5 19 | m_LinearSleepTolerance: 0.01 20 | m_AngularSleepTolerance: 2 21 | m_DefaultContactOffset: 0.01 22 | m_JobOptions: 23 | serializedVersion: 2 24 | useMultithreading: 0 25 | useConsistencySorting: 0 26 | m_InterpolationPosesPerJob: 100 27 | m_NewContactsPerJob: 30 28 | m_CollideContactsPerJob: 100 29 | m_ClearFlagsPerJob: 200 30 | m_ClearBodyForcesPerJob: 200 31 | m_SyncDiscreteFixturesPerJob: 50 32 | m_SyncContinuousFixturesPerJob: 50 33 | m_FindNearestContactsPerJob: 100 34 | m_UpdateTriggerContactsPerJob: 100 35 | m_IslandSolverCostThreshold: 100 36 | m_IslandSolverBodyCostScale: 1 37 | m_IslandSolverContactCostScale: 10 38 | m_IslandSolverJointCostScale: 10 39 | m_IslandSolverBodiesPerJob: 50 40 | m_IslandSolverContactsPerJob: 50 41 | m_AutoSimulation: 1 42 | m_QueriesHitTriggers: 1 43 | m_QueriesStartInColliders: 1 44 | m_CallbacksOnDisable: 1 45 | m_ReuseCollisionCallbacks: 1 46 | m_AutoSyncTransforms: 0 47 | m_AlwaysShowColliders: 0 48 | m_ShowColliderSleep: 1 49 | m_ShowColliderContacts: 0 50 | m_ShowColliderAABB: 0 51 | m_ContactArrowScale: 0.2 52 | m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} 53 | m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} 54 | m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} 55 | m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} 56 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 57 | -------------------------------------------------------------------------------- /src/solo2yolo-dotnet/Json/DataModels/Capture.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | using System.Numerics; 3 | using z3lx.solo2yolo.Json.Converters; 4 | 5 | namespace z3lx.solo2yolo.Json.DataModels 6 | { 7 | /// 8 | /// A capture record contains the relationship between a captured file, a collection of annotations, and extra 9 | /// metadata that describes the state of the sensor. 10 | /// 11 | [Serializable] 12 | [JsonObject(ItemRequired = Required.Always)] 13 | [JsonConverter(typeof(CaptureConverter))] 14 | public abstract class Capture 15 | { 16 | /// 17 | /// The class type of the sensor. 18 | /// 19 | [JsonProperty("@type")] 20 | public string Type { get; set; } 21 | 22 | /// 23 | /// The ID of the sensor that made the capture. 24 | /// 25 | [JsonProperty("id")] 26 | public string Id { get; set; } 27 | 28 | /// 29 | /// Human readable description of the sensor. 30 | /// 31 | [JsonProperty("description")] 32 | public string Description { get; set; } 33 | 34 | /// 35 | /// Position in meters: (x, y, z) with respect to the global coordinate system. 36 | /// 37 | [JsonProperty("position")] 38 | [JsonConverter(typeof(Vector3Converter))] 39 | public Vector3 Position { get; set; } 40 | 41 | /// 42 | /// Orientation as quaternion: w, x, y, z. 43 | /// 44 | [JsonProperty("rotation")] 45 | [JsonConverter(typeof(Vector4Converter))] 46 | public Vector4 Rotation { get; set; } 47 | 48 | /// 49 | /// Velocity in meters per second as v_x, v_y, v_z. 50 | /// 51 | [JsonProperty("velocity")] 52 | [JsonConverter(typeof(Vector3Converter))] 53 | public Vector3 Velocity { get; set; } 54 | 55 | /// 56 | /// Acceleration in meters per second^2 as a_x, a_y, a_z. 57 | /// 58 | [JsonProperty("acceleration")] 59 | [JsonConverter(typeof(Vector3Converter))] 60 | public Vector3 Acceleration { get; set; } 61 | 62 | /// 63 | /// List of the annotations in this capture. 64 | /// 65 | [JsonProperty("annotations")] 66 | public Annotation[] Annotations { get; set; } 67 | } 68 | } -------------------------------------------------------------------------------- /src/solo2yolo-unity/ProjectSettings/GraphicsSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!30 &1 4 | GraphicsSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 13 7 | m_Deferred: 8 | m_Mode: 1 9 | m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} 10 | m_DeferredReflections: 11 | m_Mode: 1 12 | m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} 13 | m_ScreenSpaceShadows: 14 | m_Mode: 1 15 | m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} 16 | m_LegacyDeferred: 17 | m_Mode: 1 18 | m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} 19 | m_DepthNormals: 20 | m_Mode: 1 21 | m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} 22 | m_MotionVectors: 23 | m_Mode: 1 24 | m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} 25 | m_LightHalo: 26 | m_Mode: 1 27 | m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} 28 | m_LensFlare: 29 | m_Mode: 1 30 | m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} 31 | m_AlwaysIncludedShaders: 32 | - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} 33 | - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} 34 | - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} 35 | - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} 36 | - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} 37 | - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} 38 | m_PreloadedShaders: [] 39 | m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, 40 | type: 0} 41 | m_CustomRenderPipeline: {fileID: 0} 42 | m_TransparencySortMode: 0 43 | m_TransparencySortAxis: {x: 0, y: 0, z: 1} 44 | m_DefaultRenderingPath: 1 45 | m_DefaultMobileRenderingPath: 1 46 | m_TierSettings: [] 47 | m_LightmapStripping: 0 48 | m_FogStripping: 0 49 | m_InstancingStripping: 0 50 | m_LightmapKeepPlain: 1 51 | m_LightmapKeepDirCombined: 1 52 | m_LightmapKeepDynamicPlain: 1 53 | m_LightmapKeepDynamicDirCombined: 1 54 | m_LightmapKeepShadowMask: 1 55 | m_LightmapKeepSubtractive: 1 56 | m_FogKeepLinear: 1 57 | m_FogKeepExp: 1 58 | m_FogKeepExp2: 1 59 | m_AlbedoSwatchInfos: [] 60 | m_LightsUseLinearIntensity: 0 61 | m_LightsUseColorTemperature: 0 62 | m_LogWhenShaderIsCompiled: 0 63 | m_AllowEnlightenSupportForUpgradedProject: 0 64 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # **solo2yolo** 2 | solo2yolo is a tool that enables the conversion of SOLO datasets to YOLO format directly within the Unity editor. **Please note that this package is currently under development.** 3 | 4 | ## **About SOLO** 5 | SOLO stands for Synthetic Optimized Labeled Objects. A SOLO dataset is a combination of JSON and image files. This tool utilizes this schema, which provides a generic structure for simulation output that can be easily consumed for statistical analysis or machine learning model training. 6 | 7 | For more information about the SOLO dataset schema, refer to the **[Unity documentation](https://docs.unity3d.com/Packages/com.unity.perception@1.0/manual/Schema/SoloSchema.html)**. 8 | 9 | ## **Compatibility** 10 | solo2yolo has been tested with Unity HDRP 2021 LTS and Perception package version 1.0.0-preview.1. However, it should work with any Unity editor version that supports HDRP. 11 | 12 | ## **Installation** 13 | This project requires the **[.NET 6.0 runtime library](https://dotnet.microsoft.com/en-us/download/dotnet/6.0)** to be installed on your system. 14 | 15 | ### Using Git 16 | Before proceeding with this method, ensure you have Git installed on your system and a version of Unity that supports path query parameters for Git packages. 17 | 1. Open Unity and navigate to **Window > Package Manager**. 18 | 2. Click on the top left button with a "+" on it to add a new package. In the dropdown, select **"Add package from git URL"**. 19 | 3. Enter the following git URL: `https://github.com/z3lx/solo2yolo.git?path=src/solo2yolo-unity/Packages/solo2yolo` 20 | 21 | ### Manual Installation 22 | 1. Clone this repository to your local machine and unzip it. 23 | 2. Open Unity and navigate to **Window > Package Manager**. 24 | 3. Click on the top left button with a "+" on it to add a new package. In the dropdown, select **"Add package from disk"**. 25 | 4. Navigate to the unzipped package, and locate the **package.json** file within the **src/solo2yolo-unity/Packages/solo2yolo** directory. 26 | 27 | **Note: If you prefer to build the executable used in the unity package from source, you can find the necessary files in the solo2yolo-dotnet folder.** 28 | 29 | ## **Usage** 30 | Currently, solo2yolo only supports the conversion of BoundingBox2D annotations to YOLO format for object detection tasks. However, this tool is under development, and additional computer vision task support may be added in the future. 31 | 32 | ### Editor GUI 33 | To use solo2yolo using the editor GUI, follow these steps: 34 | 1. Navigate to **Tools > solo2yolo Converter** in the Unity editor. 35 | 2. Select the directory where your SOLO dataset is located. 36 | 3. Choose the output directory where the converted dataset will be stored. 37 | 4. Click on the **Confirm** button to start the conversion process. 38 | 39 | ### CLI 40 | You can also use solo2yolo from the command line using the following options: 41 | ``` 42 | Usage: 43 | solo2yolo [-i ] [-o ] [-t ] 44 | 45 | Example: 46 | solo2yolo -i /path/to/solo_dataset -o /path/to/yolo_dataset -t detect 47 | 48 | Mandatory Flags: 49 | -i: Specifies the input path for the SOLO dataset. 50 | -o: Specifies the output path for the converted YOLO dataset. 51 | -t: Specifies the computer vision task of the converted dataset. 52 | Available options: classify, detect, segment, pose. 53 | 54 | Other Flags: 55 | -h: Displays the help page. 56 | ``` 57 | 58 | Please note that the conversion process may take some time, depending on the size of your dataset. Furthermore, make sure to review the output files with a dataset viewer to ensure successful conversion. 59 | 60 | ## **Contributing** 61 | Contributions are welcome! If you encounter any issues, have suggestions, or want to contribute new features, please open an issue or submit a pull request. Your contributions help improve the tool and make it more useful for the community. 62 | 63 | ## **License** 64 | This project is licensed under the MIT License. See **[LICENSE](https://github.com/z3lx/solo2yolo/blob/main/LICENSE)** for details. 65 | 66 | If you find solo2yolo helpful, please consider giving this repository a star. Your support is highly appreciated! ⭐️ 67 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/Packages/solo2yolo/Editor/DatasetConverterWindow.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using UnityEditor; 4 | using UnityEngine; 5 | 6 | namespace z3lx.solo2yolo 7 | { 8 | internal class DatasetConverterWindow : EditorWindow 9 | { 10 | private static readonly string _windowTitle = "Converter"; 11 | private Texture2D _folderIcon; 12 | 13 | private readonly Vector2 _margins = new Vector2(4, 4); 14 | private readonly float _lineHeight = 24; 15 | private readonly float _buttonHeight = 20; 16 | private readonly float _labelWidth = 144; 17 | private readonly float _buttonWidth = 96; 18 | private readonly float _iconWidth = 24; 19 | 20 | private enum ComputerVisionTask 21 | { 22 | Classify, 23 | Detect, 24 | Segment, 25 | Pose 26 | } 27 | 28 | private string _soloPath; 29 | private string _yoloPath; 30 | private ComputerVisionTask _task; 31 | 32 | [MenuItem("Tools/solo2yolo Converter")] 33 | private static void ShowWindow() 34 | { 35 | DatasetConverterWindow window = GetWindow(); 36 | window.Initialize(); 37 | } 38 | 39 | private void Initialize() 40 | { 41 | titleContent = new GUIContent(_windowTitle); 42 | minSize = new Vector2((2 * _margins.x) + _labelWidth + _iconWidth + 384 + _buttonWidth, 43 | (2 * _margins.y) + (3 * _lineHeight) + _buttonHeight); 44 | _folderIcon = EditorGUIUtility.FindTexture("d_FolderOpened Icon"); 45 | 46 | string defaultPath = Path.Combine(Directory.GetParent(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)).FullName, 47 | "LocalLow", PlayerSettings.companyName, PlayerSettings.productName); 48 | 49 | _soloPath = Path.Combine(defaultPath, "solo"); 50 | _yoloPath = defaultPath; 51 | _task = ComputerVisionTask.Detect; 52 | } 53 | 54 | private void OnGUI() 55 | { 56 | Rect contentRect = new Rect(_margins.x, _margins.y, 57 | position.width - (2 * _margins.x), position.height - (2 * _margins.y)); 58 | GUILayout.BeginArea(contentRect); 59 | 60 | RectLayout layout = new RectLayout() 61 | { 62 | lineHeight = _lineHeight, 63 | contentRect = contentRect 64 | }; 65 | 66 | DrawPathInput(layout, "SOLO directory", ref _soloPath); 67 | DrawPathInput(layout, "YOLO directory", ref _yoloPath); 68 | DrawTaskInput(layout, "YOLO task"); 69 | DrawConfirmButton(layout); 70 | 71 | GUILayout.EndArea(); 72 | } 73 | 74 | private void DrawPathInput(RectLayout layout, string label, ref string path) 75 | { 76 | GUI.Label(layout.GetNextRect(_labelWidth), label); 77 | GUI.Label(layout.GetNextRect(_iconWidth), _folderIcon); 78 | GUI.Label(layout.GetNextRect(layout.contentRect.width - _labelWidth - _iconWidth - _buttonWidth), path); 79 | if (GUI.Button(layout.GetNextRect(_buttonWidth, _buttonHeight), "Choose Folder")) 80 | { 81 | string input = EditorUtility.OpenFolderPanel($"Select {label}", path, ""); 82 | path = string.IsNullOrEmpty(input) ? path : input.Replace('/', Path.DirectorySeparatorChar); 83 | } 84 | layout.NewLine(); 85 | } 86 | 87 | private void DrawTaskInput(RectLayout layout, string label) 88 | { 89 | GUI.Label(layout.GetNextRect(_labelWidth), label); 90 | EditorGUI.BeginDisabledGroup(true); 91 | Rect taskRect = layout.GetNextRect(layout.contentRect.width - _labelWidth, EditorStyles.popup.fixedHeight); 92 | _task = (ComputerVisionTask)EditorGUI.EnumPopup(taskRect, _task); 93 | EditorGUI.EndDisabledGroup(); 94 | layout.NewLine(); 95 | } 96 | 97 | private void DrawConfirmButton(RectLayout layout) 98 | { 99 | Rect confirmButtonRect = new Rect(layout.contentRect.width - _buttonWidth, 100 | layout.contentRect.height - _buttonHeight, _buttonWidth, _buttonHeight); 101 | if (!GUI.Button(confirmButtonRect, "Confirm")) 102 | return; 103 | 104 | string path = Path.GetFullPath(Path.Combine("Packages", "com.z3lx.solo2yolo", "Runtime")); 105 | switch (Application.platform) 106 | { 107 | case RuntimePlatform.WindowsEditor: 108 | path = Path.Combine(path, "solo2yolo-win-x64.exe"); 109 | break; 110 | 111 | case RuntimePlatform.OSXEditor: 112 | path = Path.Combine(path, "solo2yolo-osx-x64"); 113 | break; 114 | 115 | case RuntimePlatform.LinuxEditor: 116 | path = Path.Combine(path, "solo2yolo-linux-x64"); 117 | break; 118 | 119 | default: 120 | throw new PlatformNotSupportedException("Unsupported platform."); 121 | } 122 | System.Diagnostics.Process.Start(path, $"-i {_soloPath} -o {_yoloPath} -t {_task} --unity-editor"); 123 | } 124 | } 125 | } -------------------------------------------------------------------------------- /src/solo2yolo-unity/ProjectSettings/SceneTemplateSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "templatePinStates": [], 3 | "dependencyTypeInfos": [ 4 | { 5 | "userAdded": false, 6 | "type": "UnityEngine.AnimationClip", 7 | "ignore": false, 8 | "defaultInstantiationMode": 0, 9 | "supportsModification": true 10 | }, 11 | { 12 | "userAdded": false, 13 | "type": "UnityEditor.Animations.AnimatorController", 14 | "ignore": false, 15 | "defaultInstantiationMode": 0, 16 | "supportsModification": true 17 | }, 18 | { 19 | "userAdded": false, 20 | "type": "UnityEngine.AnimatorOverrideController", 21 | "ignore": false, 22 | "defaultInstantiationMode": 0, 23 | "supportsModification": true 24 | }, 25 | { 26 | "userAdded": false, 27 | "type": "UnityEditor.Audio.AudioMixerController", 28 | "ignore": false, 29 | "defaultInstantiationMode": 0, 30 | "supportsModification": true 31 | }, 32 | { 33 | "userAdded": false, 34 | "type": "UnityEngine.ComputeShader", 35 | "ignore": true, 36 | "defaultInstantiationMode": 1, 37 | "supportsModification": true 38 | }, 39 | { 40 | "userAdded": false, 41 | "type": "UnityEngine.Cubemap", 42 | "ignore": false, 43 | "defaultInstantiationMode": 0, 44 | "supportsModification": true 45 | }, 46 | { 47 | "userAdded": false, 48 | "type": "UnityEngine.GameObject", 49 | "ignore": false, 50 | "defaultInstantiationMode": 0, 51 | "supportsModification": true 52 | }, 53 | { 54 | "userAdded": false, 55 | "type": "UnityEditor.LightingDataAsset", 56 | "ignore": false, 57 | "defaultInstantiationMode": 0, 58 | "supportsModification": false 59 | }, 60 | { 61 | "userAdded": false, 62 | "type": "UnityEngine.LightingSettings", 63 | "ignore": false, 64 | "defaultInstantiationMode": 0, 65 | "supportsModification": true 66 | }, 67 | { 68 | "userAdded": false, 69 | "type": "UnityEngine.Material", 70 | "ignore": false, 71 | "defaultInstantiationMode": 0, 72 | "supportsModification": true 73 | }, 74 | { 75 | "userAdded": false, 76 | "type": "UnityEditor.MonoScript", 77 | "ignore": true, 78 | "defaultInstantiationMode": 1, 79 | "supportsModification": true 80 | }, 81 | { 82 | "userAdded": false, 83 | "type": "UnityEngine.PhysicMaterial", 84 | "ignore": false, 85 | "defaultInstantiationMode": 0, 86 | "supportsModification": true 87 | }, 88 | { 89 | "userAdded": false, 90 | "type": "UnityEngine.PhysicsMaterial2D", 91 | "ignore": false, 92 | "defaultInstantiationMode": 0, 93 | "supportsModification": true 94 | }, 95 | { 96 | "userAdded": false, 97 | "type": "UnityEngine.Rendering.PostProcessing.PostProcessProfile", 98 | "ignore": false, 99 | "defaultInstantiationMode": 0, 100 | "supportsModification": true 101 | }, 102 | { 103 | "userAdded": false, 104 | "type": "UnityEngine.Rendering.PostProcessing.PostProcessResources", 105 | "ignore": false, 106 | "defaultInstantiationMode": 0, 107 | "supportsModification": true 108 | }, 109 | { 110 | "userAdded": false, 111 | "type": "UnityEngine.Rendering.VolumeProfile", 112 | "ignore": false, 113 | "defaultInstantiationMode": 0, 114 | "supportsModification": true 115 | }, 116 | { 117 | "userAdded": false, 118 | "type": "UnityEditor.SceneAsset", 119 | "ignore": false, 120 | "defaultInstantiationMode": 0, 121 | "supportsModification": false 122 | }, 123 | { 124 | "userAdded": false, 125 | "type": "UnityEngine.Shader", 126 | "ignore": true, 127 | "defaultInstantiationMode": 1, 128 | "supportsModification": true 129 | }, 130 | { 131 | "userAdded": false, 132 | "type": "UnityEngine.ShaderVariantCollection", 133 | "ignore": true, 134 | "defaultInstantiationMode": 1, 135 | "supportsModification": true 136 | }, 137 | { 138 | "userAdded": false, 139 | "type": "UnityEngine.Texture", 140 | "ignore": false, 141 | "defaultInstantiationMode": 0, 142 | "supportsModification": true 143 | }, 144 | { 145 | "userAdded": false, 146 | "type": "UnityEngine.Texture2D", 147 | "ignore": false, 148 | "defaultInstantiationMode": 0, 149 | "supportsModification": true 150 | }, 151 | { 152 | "userAdded": false, 153 | "type": "UnityEngine.Timeline.TimelineAsset", 154 | "ignore": false, 155 | "defaultInstantiationMode": 0, 156 | "supportsModification": true 157 | } 158 | ], 159 | "defaultDependencyTypeInfo": { 160 | "userAdded": false, 161 | "type": "", 162 | "ignore": false, 163 | "defaultInstantiationMode": 1, 164 | "supportsModification": true 165 | }, 166 | "newSceneOverride": 0 167 | } -------------------------------------------------------------------------------- /src/solo2yolo-unity/ProjectSettings/InputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!13 &1 4 | InputManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Axes: 8 | - serializedVersion: 3 9 | m_Name: Horizontal 10 | descriptiveName: 11 | descriptiveNegativeName: 12 | negativeButton: left 13 | positiveButton: right 14 | altNegativeButton: a 15 | altPositiveButton: d 16 | gravity: 3 17 | dead: 0.001 18 | sensitivity: 3 19 | snap: 1 20 | invert: 0 21 | type: 0 22 | axis: 0 23 | joyNum: 0 24 | - serializedVersion: 3 25 | m_Name: Vertical 26 | descriptiveName: 27 | descriptiveNegativeName: 28 | negativeButton: down 29 | positiveButton: up 30 | altNegativeButton: s 31 | altPositiveButton: w 32 | gravity: 3 33 | dead: 0.001 34 | sensitivity: 3 35 | snap: 1 36 | invert: 0 37 | type: 0 38 | axis: 0 39 | joyNum: 0 40 | - serializedVersion: 3 41 | m_Name: Fire1 42 | descriptiveName: 43 | descriptiveNegativeName: 44 | negativeButton: 45 | positiveButton: left ctrl 46 | altNegativeButton: 47 | altPositiveButton: mouse 0 48 | gravity: 1000 49 | dead: 0.001 50 | sensitivity: 1000 51 | snap: 0 52 | invert: 0 53 | type: 0 54 | axis: 0 55 | joyNum: 0 56 | - serializedVersion: 3 57 | m_Name: Fire2 58 | descriptiveName: 59 | descriptiveNegativeName: 60 | negativeButton: 61 | positiveButton: left alt 62 | altNegativeButton: 63 | altPositiveButton: mouse 1 64 | gravity: 1000 65 | dead: 0.001 66 | sensitivity: 1000 67 | snap: 0 68 | invert: 0 69 | type: 0 70 | axis: 0 71 | joyNum: 0 72 | - serializedVersion: 3 73 | m_Name: Fire3 74 | descriptiveName: 75 | descriptiveNegativeName: 76 | negativeButton: 77 | positiveButton: left shift 78 | altNegativeButton: 79 | altPositiveButton: mouse 2 80 | gravity: 1000 81 | dead: 0.001 82 | sensitivity: 1000 83 | snap: 0 84 | invert: 0 85 | type: 0 86 | axis: 0 87 | joyNum: 0 88 | - serializedVersion: 3 89 | m_Name: Jump 90 | descriptiveName: 91 | descriptiveNegativeName: 92 | negativeButton: 93 | positiveButton: space 94 | altNegativeButton: 95 | altPositiveButton: 96 | gravity: 1000 97 | dead: 0.001 98 | sensitivity: 1000 99 | snap: 0 100 | invert: 0 101 | type: 0 102 | axis: 0 103 | joyNum: 0 104 | - serializedVersion: 3 105 | m_Name: Mouse X 106 | descriptiveName: 107 | descriptiveNegativeName: 108 | negativeButton: 109 | positiveButton: 110 | altNegativeButton: 111 | altPositiveButton: 112 | gravity: 0 113 | dead: 0 114 | sensitivity: 0.1 115 | snap: 0 116 | invert: 0 117 | type: 1 118 | axis: 0 119 | joyNum: 0 120 | - serializedVersion: 3 121 | m_Name: Mouse Y 122 | descriptiveName: 123 | descriptiveNegativeName: 124 | negativeButton: 125 | positiveButton: 126 | altNegativeButton: 127 | altPositiveButton: 128 | gravity: 0 129 | dead: 0 130 | sensitivity: 0.1 131 | snap: 0 132 | invert: 0 133 | type: 1 134 | axis: 1 135 | joyNum: 0 136 | - serializedVersion: 3 137 | m_Name: Mouse ScrollWheel 138 | descriptiveName: 139 | descriptiveNegativeName: 140 | negativeButton: 141 | positiveButton: 142 | altNegativeButton: 143 | altPositiveButton: 144 | gravity: 0 145 | dead: 0 146 | sensitivity: 0.1 147 | snap: 0 148 | invert: 0 149 | type: 1 150 | axis: 2 151 | joyNum: 0 152 | - serializedVersion: 3 153 | m_Name: Horizontal 154 | descriptiveName: 155 | descriptiveNegativeName: 156 | negativeButton: 157 | positiveButton: 158 | altNegativeButton: 159 | altPositiveButton: 160 | gravity: 0 161 | dead: 0.19 162 | sensitivity: 1 163 | snap: 0 164 | invert: 0 165 | type: 2 166 | axis: 0 167 | joyNum: 0 168 | - serializedVersion: 3 169 | m_Name: Vertical 170 | descriptiveName: 171 | descriptiveNegativeName: 172 | negativeButton: 173 | positiveButton: 174 | altNegativeButton: 175 | altPositiveButton: 176 | gravity: 0 177 | dead: 0.19 178 | sensitivity: 1 179 | snap: 0 180 | invert: 1 181 | type: 2 182 | axis: 1 183 | joyNum: 0 184 | - serializedVersion: 3 185 | m_Name: Fire1 186 | descriptiveName: 187 | descriptiveNegativeName: 188 | negativeButton: 189 | positiveButton: joystick button 0 190 | altNegativeButton: 191 | altPositiveButton: 192 | gravity: 1000 193 | dead: 0.001 194 | sensitivity: 1000 195 | snap: 0 196 | invert: 0 197 | type: 0 198 | axis: 0 199 | joyNum: 0 200 | - serializedVersion: 3 201 | m_Name: Fire2 202 | descriptiveName: 203 | descriptiveNegativeName: 204 | negativeButton: 205 | positiveButton: joystick button 1 206 | altNegativeButton: 207 | altPositiveButton: 208 | gravity: 1000 209 | dead: 0.001 210 | sensitivity: 1000 211 | snap: 0 212 | invert: 0 213 | type: 0 214 | axis: 0 215 | joyNum: 0 216 | - serializedVersion: 3 217 | m_Name: Fire3 218 | descriptiveName: 219 | descriptiveNegativeName: 220 | negativeButton: 221 | positiveButton: joystick button 2 222 | altNegativeButton: 223 | altPositiveButton: 224 | gravity: 1000 225 | dead: 0.001 226 | sensitivity: 1000 227 | snap: 0 228 | invert: 0 229 | type: 0 230 | axis: 0 231 | joyNum: 0 232 | - serializedVersion: 3 233 | m_Name: Jump 234 | descriptiveName: 235 | descriptiveNegativeName: 236 | negativeButton: 237 | positiveButton: joystick button 3 238 | altNegativeButton: 239 | altPositiveButton: 240 | gravity: 1000 241 | dead: 0.001 242 | sensitivity: 1000 243 | snap: 0 244 | invert: 0 245 | type: 0 246 | axis: 0 247 | joyNum: 0 248 | - serializedVersion: 3 249 | m_Name: Submit 250 | descriptiveName: 251 | descriptiveNegativeName: 252 | negativeButton: 253 | positiveButton: return 254 | altNegativeButton: 255 | altPositiveButton: joystick button 0 256 | gravity: 1000 257 | dead: 0.001 258 | sensitivity: 1000 259 | snap: 0 260 | invert: 0 261 | type: 0 262 | axis: 0 263 | joyNum: 0 264 | - serializedVersion: 3 265 | m_Name: Submit 266 | descriptiveName: 267 | descriptiveNegativeName: 268 | negativeButton: 269 | positiveButton: enter 270 | altNegativeButton: 271 | altPositiveButton: space 272 | gravity: 1000 273 | dead: 0.001 274 | sensitivity: 1000 275 | snap: 0 276 | invert: 0 277 | type: 0 278 | axis: 0 279 | joyNum: 0 280 | - serializedVersion: 3 281 | m_Name: Cancel 282 | descriptiveName: 283 | descriptiveNegativeName: 284 | negativeButton: 285 | positiveButton: escape 286 | altNegativeButton: 287 | altPositiveButton: joystick button 1 288 | gravity: 1000 289 | dead: 0.001 290 | sensitivity: 1000 291 | snap: 0 292 | invert: 0 293 | type: 0 294 | axis: 0 295 | joyNum: 0 296 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/ProjectSettings/QualitySettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!47 &1 4 | QualitySettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 5 7 | m_CurrentQuality: 5 8 | m_QualitySettings: 9 | - serializedVersion: 2 10 | name: Very Low 11 | pixelLightCount: 0 12 | shadows: 0 13 | shadowResolution: 0 14 | shadowProjection: 1 15 | shadowCascades: 1 16 | shadowDistance: 15 17 | shadowNearPlaneOffset: 3 18 | shadowCascade2Split: 0.33333334 19 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 20 | shadowmaskMode: 0 21 | blendWeights: 1 22 | textureQuality: 1 23 | anisotropicTextures: 0 24 | antiAliasing: 0 25 | softParticles: 0 26 | softVegetation: 0 27 | realtimeReflectionProbes: 0 28 | billboardsFaceCameraPosition: 0 29 | vSyncCount: 0 30 | lodBias: 0.3 31 | maximumLODLevel: 0 32 | streamingMipmapsActive: 0 33 | streamingMipmapsAddAllCameras: 1 34 | streamingMipmapsMemoryBudget: 512 35 | streamingMipmapsRenderersPerFrame: 512 36 | streamingMipmapsMaxLevelReduction: 2 37 | streamingMipmapsMaxFileIORequests: 1024 38 | particleRaycastBudget: 4 39 | asyncUploadTimeSlice: 2 40 | asyncUploadBufferSize: 16 41 | asyncUploadPersistentBuffer: 1 42 | resolutionScalingFixedDPIFactor: 1 43 | excludedTargetPlatforms: [] 44 | - serializedVersion: 2 45 | name: Low 46 | pixelLightCount: 0 47 | shadows: 0 48 | shadowResolution: 0 49 | shadowProjection: 1 50 | shadowCascades: 1 51 | shadowDistance: 20 52 | shadowNearPlaneOffset: 3 53 | shadowCascade2Split: 0.33333334 54 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 55 | shadowmaskMode: 0 56 | blendWeights: 2 57 | textureQuality: 0 58 | anisotropicTextures: 0 59 | antiAliasing: 0 60 | softParticles: 0 61 | softVegetation: 0 62 | realtimeReflectionProbes: 0 63 | billboardsFaceCameraPosition: 0 64 | vSyncCount: 0 65 | lodBias: 0.4 66 | maximumLODLevel: 0 67 | streamingMipmapsActive: 0 68 | streamingMipmapsAddAllCameras: 1 69 | streamingMipmapsMemoryBudget: 512 70 | streamingMipmapsRenderersPerFrame: 512 71 | streamingMipmapsMaxLevelReduction: 2 72 | streamingMipmapsMaxFileIORequests: 1024 73 | particleRaycastBudget: 16 74 | asyncUploadTimeSlice: 2 75 | asyncUploadBufferSize: 16 76 | asyncUploadPersistentBuffer: 1 77 | resolutionScalingFixedDPIFactor: 1 78 | excludedTargetPlatforms: [] 79 | - serializedVersion: 2 80 | name: Medium 81 | pixelLightCount: 1 82 | shadows: 1 83 | shadowResolution: 0 84 | shadowProjection: 1 85 | shadowCascades: 1 86 | shadowDistance: 20 87 | shadowNearPlaneOffset: 3 88 | shadowCascade2Split: 0.33333334 89 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 90 | shadowmaskMode: 0 91 | blendWeights: 2 92 | textureQuality: 0 93 | anisotropicTextures: 1 94 | antiAliasing: 0 95 | softParticles: 0 96 | softVegetation: 0 97 | realtimeReflectionProbes: 0 98 | billboardsFaceCameraPosition: 0 99 | vSyncCount: 1 100 | lodBias: 0.7 101 | maximumLODLevel: 0 102 | streamingMipmapsActive: 0 103 | streamingMipmapsAddAllCameras: 1 104 | streamingMipmapsMemoryBudget: 512 105 | streamingMipmapsRenderersPerFrame: 512 106 | streamingMipmapsMaxLevelReduction: 2 107 | streamingMipmapsMaxFileIORequests: 1024 108 | particleRaycastBudget: 64 109 | asyncUploadTimeSlice: 2 110 | asyncUploadBufferSize: 16 111 | asyncUploadPersistentBuffer: 1 112 | resolutionScalingFixedDPIFactor: 1 113 | excludedTargetPlatforms: [] 114 | - serializedVersion: 2 115 | name: High 116 | pixelLightCount: 2 117 | shadows: 2 118 | shadowResolution: 1 119 | shadowProjection: 1 120 | shadowCascades: 2 121 | shadowDistance: 40 122 | shadowNearPlaneOffset: 3 123 | shadowCascade2Split: 0.33333334 124 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 125 | shadowmaskMode: 1 126 | blendWeights: 2 127 | textureQuality: 0 128 | anisotropicTextures: 1 129 | antiAliasing: 0 130 | softParticles: 0 131 | softVegetation: 1 132 | realtimeReflectionProbes: 1 133 | billboardsFaceCameraPosition: 1 134 | vSyncCount: 1 135 | lodBias: 1 136 | maximumLODLevel: 0 137 | streamingMipmapsActive: 0 138 | streamingMipmapsAddAllCameras: 1 139 | streamingMipmapsMemoryBudget: 512 140 | streamingMipmapsRenderersPerFrame: 512 141 | streamingMipmapsMaxLevelReduction: 2 142 | streamingMipmapsMaxFileIORequests: 1024 143 | particleRaycastBudget: 256 144 | asyncUploadTimeSlice: 2 145 | asyncUploadBufferSize: 16 146 | asyncUploadPersistentBuffer: 1 147 | resolutionScalingFixedDPIFactor: 1 148 | excludedTargetPlatforms: [] 149 | - serializedVersion: 2 150 | name: Very High 151 | pixelLightCount: 3 152 | shadows: 2 153 | shadowResolution: 2 154 | shadowProjection: 1 155 | shadowCascades: 2 156 | shadowDistance: 70 157 | shadowNearPlaneOffset: 3 158 | shadowCascade2Split: 0.33333334 159 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 160 | shadowmaskMode: 1 161 | blendWeights: 4 162 | textureQuality: 0 163 | anisotropicTextures: 2 164 | antiAliasing: 2 165 | softParticles: 1 166 | softVegetation: 1 167 | realtimeReflectionProbes: 1 168 | billboardsFaceCameraPosition: 1 169 | vSyncCount: 1 170 | lodBias: 1.5 171 | maximumLODLevel: 0 172 | streamingMipmapsActive: 0 173 | streamingMipmapsAddAllCameras: 1 174 | streamingMipmapsMemoryBudget: 512 175 | streamingMipmapsRenderersPerFrame: 512 176 | streamingMipmapsMaxLevelReduction: 2 177 | streamingMipmapsMaxFileIORequests: 1024 178 | particleRaycastBudget: 1024 179 | asyncUploadTimeSlice: 2 180 | asyncUploadBufferSize: 16 181 | asyncUploadPersistentBuffer: 1 182 | resolutionScalingFixedDPIFactor: 1 183 | excludedTargetPlatforms: [] 184 | - serializedVersion: 2 185 | name: Ultra 186 | pixelLightCount: 4 187 | shadows: 2 188 | shadowResolution: 2 189 | shadowProjection: 1 190 | shadowCascades: 4 191 | shadowDistance: 150 192 | shadowNearPlaneOffset: 3 193 | shadowCascade2Split: 0.33333334 194 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 195 | shadowmaskMode: 1 196 | blendWeights: 4 197 | textureQuality: 0 198 | anisotropicTextures: 2 199 | antiAliasing: 2 200 | softParticles: 1 201 | softVegetation: 1 202 | realtimeReflectionProbes: 1 203 | billboardsFaceCameraPosition: 1 204 | vSyncCount: 1 205 | lodBias: 2 206 | maximumLODLevel: 0 207 | streamingMipmapsActive: 0 208 | streamingMipmapsAddAllCameras: 1 209 | streamingMipmapsMemoryBudget: 512 210 | streamingMipmapsRenderersPerFrame: 512 211 | streamingMipmapsMaxLevelReduction: 2 212 | streamingMipmapsMaxFileIORequests: 1024 213 | particleRaycastBudget: 4096 214 | asyncUploadTimeSlice: 2 215 | asyncUploadBufferSize: 16 216 | asyncUploadPersistentBuffer: 1 217 | resolutionScalingFixedDPIFactor: 1 218 | excludedTargetPlatforms: [] 219 | m_PerPlatformDefaultQuality: 220 | Android: 2 221 | Lumin: 5 222 | Nintendo 3DS: 5 223 | Nintendo Switch: 5 224 | PS4: 5 225 | PSP2: 2 226 | Stadia: 5 227 | Standalone: 5 228 | WebGL: 3 229 | Windows Store Apps: 5 230 | XboxOne: 5 231 | iPhone: 2 232 | tvOS: 2 233 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/Assets/Scenes/SampleScene.unity: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!29 &1 4 | OcclusionCullingSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_OcclusionBakeSettings: 8 | smallestOccluder: 5 9 | smallestHole: 0.25 10 | backfaceThreshold: 100 11 | m_SceneGUID: 00000000000000000000000000000000 12 | m_OcclusionCullingData: {fileID: 0} 13 | --- !u!104 &2 14 | RenderSettings: 15 | m_ObjectHideFlags: 0 16 | serializedVersion: 9 17 | m_Fog: 0 18 | m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} 19 | m_FogMode: 3 20 | m_FogDensity: 0.01 21 | m_LinearFogStart: 0 22 | m_LinearFogEnd: 300 23 | m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} 24 | m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} 25 | m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} 26 | m_AmbientIntensity: 1 27 | m_AmbientMode: 0 28 | m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} 29 | m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} 30 | m_HaloStrength: 0.5 31 | m_FlareStrength: 1 32 | m_FlareFadeSpeed: 3 33 | m_HaloTexture: {fileID: 0} 34 | m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} 35 | m_DefaultReflectionMode: 0 36 | m_DefaultReflectionResolution: 128 37 | m_ReflectionBounces: 1 38 | m_ReflectionIntensity: 1 39 | m_CustomReflection: {fileID: 0} 40 | m_Sun: {fileID: 705507994} 41 | m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} 42 | m_UseRadianceAmbientProbe: 0 43 | --- !u!157 &3 44 | LightmapSettings: 45 | m_ObjectHideFlags: 0 46 | serializedVersion: 12 47 | m_GIWorkflowMode: 1 48 | m_GISettings: 49 | serializedVersion: 2 50 | m_BounceScale: 1 51 | m_IndirectOutputScale: 1 52 | m_AlbedoBoost: 1 53 | m_EnvironmentLightingMode: 0 54 | m_EnableBakedLightmaps: 1 55 | m_EnableRealtimeLightmaps: 0 56 | m_LightmapEditorSettings: 57 | serializedVersion: 12 58 | m_Resolution: 2 59 | m_BakeResolution: 40 60 | m_AtlasSize: 1024 61 | m_AO: 0 62 | m_AOMaxDistance: 1 63 | m_CompAOExponent: 1 64 | m_CompAOExponentDirect: 0 65 | m_ExtractAmbientOcclusion: 0 66 | m_Padding: 2 67 | m_LightmapParameters: {fileID: 0} 68 | m_LightmapsBakeMode: 1 69 | m_TextureCompression: 1 70 | m_FinalGather: 0 71 | m_FinalGatherFiltering: 1 72 | m_FinalGatherRayCount: 256 73 | m_ReflectionCompression: 2 74 | m_MixedBakeMode: 2 75 | m_BakeBackend: 1 76 | m_PVRSampling: 1 77 | m_PVRDirectSampleCount: 32 78 | m_PVRSampleCount: 500 79 | m_PVRBounces: 2 80 | m_PVREnvironmentSampleCount: 500 81 | m_PVREnvironmentReferencePointCount: 2048 82 | m_PVRFilteringMode: 2 83 | m_PVRDenoiserTypeDirect: 0 84 | m_PVRDenoiserTypeIndirect: 0 85 | m_PVRDenoiserTypeAO: 0 86 | m_PVRFilterTypeDirect: 0 87 | m_PVRFilterTypeIndirect: 0 88 | m_PVRFilterTypeAO: 0 89 | m_PVREnvironmentMIS: 0 90 | m_PVRCulling: 1 91 | m_PVRFilteringGaussRadiusDirect: 1 92 | m_PVRFilteringGaussRadiusIndirect: 5 93 | m_PVRFilteringGaussRadiusAO: 2 94 | m_PVRFilteringAtrousPositionSigmaDirect: 0.5 95 | m_PVRFilteringAtrousPositionSigmaIndirect: 2 96 | m_PVRFilteringAtrousPositionSigmaAO: 1 97 | m_ExportTrainingData: 0 98 | m_TrainingDataDestination: TrainingData 99 | m_LightProbeSampleCountMultiplier: 4 100 | m_LightingDataAsset: {fileID: 0} 101 | m_LightingSettings: {fileID: 0} 102 | --- !u!196 &4 103 | NavMeshSettings: 104 | serializedVersion: 2 105 | m_ObjectHideFlags: 0 106 | m_BuildSettings: 107 | serializedVersion: 2 108 | agentTypeID: 0 109 | agentRadius: 0.5 110 | agentHeight: 2 111 | agentSlope: 45 112 | agentClimb: 0.4 113 | ledgeDropHeight: 0 114 | maxJumpAcrossDistance: 0 115 | minRegionArea: 2 116 | manualCellSize: 0 117 | cellSize: 0.16666667 118 | manualTileSize: 0 119 | tileSize: 256 120 | accuratePlacement: 0 121 | debug: 122 | m_Flags: 0 123 | m_NavMeshData: {fileID: 0} 124 | --- !u!1 &705507993 125 | GameObject: 126 | m_ObjectHideFlags: 0 127 | m_CorrespondingSourceObject: {fileID: 0} 128 | m_PrefabInternal: {fileID: 0} 129 | serializedVersion: 6 130 | m_Component: 131 | - component: {fileID: 705507995} 132 | - component: {fileID: 705507994} 133 | m_Layer: 0 134 | m_Name: Directional Light 135 | m_TagString: Untagged 136 | m_Icon: {fileID: 0} 137 | m_NavMeshLayer: 0 138 | m_StaticEditorFlags: 0 139 | m_IsActive: 1 140 | --- !u!108 &705507994 141 | Light: 142 | m_ObjectHideFlags: 0 143 | m_CorrespondingSourceObject: {fileID: 0} 144 | m_PrefabInternal: {fileID: 0} 145 | m_GameObject: {fileID: 705507993} 146 | m_Enabled: 1 147 | serializedVersion: 8 148 | m_Type: 1 149 | m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} 150 | m_Intensity: 1 151 | m_Range: 10 152 | m_SpotAngle: 30 153 | m_CookieSize: 10 154 | m_Shadows: 155 | m_Type: 2 156 | m_Resolution: -1 157 | m_CustomResolution: -1 158 | m_Strength: 1 159 | m_Bias: 0.05 160 | m_NormalBias: 0.4 161 | m_NearPlane: 0.2 162 | m_Cookie: {fileID: 0} 163 | m_DrawHalo: 0 164 | m_Flare: {fileID: 0} 165 | m_RenderMode: 0 166 | m_CullingMask: 167 | serializedVersion: 2 168 | m_Bits: 4294967295 169 | m_Lightmapping: 1 170 | m_LightShadowCasterMode: 0 171 | m_AreaSize: {x: 1, y: 1} 172 | m_BounceIntensity: 1 173 | m_ColorTemperature: 6570 174 | m_UseColorTemperature: 0 175 | m_ShadowRadius: 0 176 | m_ShadowAngle: 0 177 | --- !u!4 &705507995 178 | Transform: 179 | m_ObjectHideFlags: 0 180 | m_CorrespondingSourceObject: {fileID: 0} 181 | m_PrefabInternal: {fileID: 0} 182 | m_GameObject: {fileID: 705507993} 183 | m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} 184 | m_LocalPosition: {x: 0, y: 3, z: 0} 185 | m_LocalScale: {x: 1, y: 1, z: 1} 186 | m_Children: [] 187 | m_Father: {fileID: 0} 188 | m_RootOrder: 1 189 | m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} 190 | --- !u!1 &963194225 191 | GameObject: 192 | m_ObjectHideFlags: 0 193 | m_CorrespondingSourceObject: {fileID: 0} 194 | m_PrefabInternal: {fileID: 0} 195 | serializedVersion: 6 196 | m_Component: 197 | - component: {fileID: 963194228} 198 | - component: {fileID: 963194227} 199 | - component: {fileID: 963194226} 200 | m_Layer: 0 201 | m_Name: Main Camera 202 | m_TagString: MainCamera 203 | m_Icon: {fileID: 0} 204 | m_NavMeshLayer: 0 205 | m_StaticEditorFlags: 0 206 | m_IsActive: 1 207 | --- !u!81 &963194226 208 | AudioListener: 209 | m_ObjectHideFlags: 0 210 | m_CorrespondingSourceObject: {fileID: 0} 211 | m_PrefabInternal: {fileID: 0} 212 | m_GameObject: {fileID: 963194225} 213 | m_Enabled: 1 214 | --- !u!20 &963194227 215 | Camera: 216 | m_ObjectHideFlags: 0 217 | m_CorrespondingSourceObject: {fileID: 0} 218 | m_PrefabInternal: {fileID: 0} 219 | m_GameObject: {fileID: 963194225} 220 | m_Enabled: 1 221 | serializedVersion: 2 222 | m_ClearFlags: 1 223 | m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} 224 | m_projectionMatrixMode: 1 225 | m_SensorSize: {x: 36, y: 24} 226 | m_LensShift: {x: 0, y: 0} 227 | m_GateFitMode: 2 228 | m_FocalLength: 50 229 | m_NormalizedViewPortRect: 230 | serializedVersion: 2 231 | x: 0 232 | y: 0 233 | width: 1 234 | height: 1 235 | near clip plane: 0.3 236 | far clip plane: 1000 237 | field of view: 60 238 | orthographic: 0 239 | orthographic size: 5 240 | m_Depth: -1 241 | m_CullingMask: 242 | serializedVersion: 2 243 | m_Bits: 4294967295 244 | m_RenderingPath: -1 245 | m_TargetTexture: {fileID: 0} 246 | m_TargetDisplay: 0 247 | m_TargetEye: 3 248 | m_HDR: 1 249 | m_AllowMSAA: 1 250 | m_AllowDynamicResolution: 0 251 | m_ForceIntoRT: 0 252 | m_OcclusionCulling: 1 253 | m_StereoConvergence: 10 254 | m_StereoSeparation: 0.022 255 | --- !u!4 &963194228 256 | Transform: 257 | m_ObjectHideFlags: 0 258 | m_CorrespondingSourceObject: {fileID: 0} 259 | m_PrefabInternal: {fileID: 0} 260 | m_GameObject: {fileID: 963194225} 261 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 262 | m_LocalPosition: {x: 0, y: 1, z: -10} 263 | m_LocalScale: {x: 1, y: 1, z: 1} 264 | m_Children: [] 265 | m_Father: {fileID: 0} 266 | m_RootOrder: 0 267 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 268 | -------------------------------------------------------------------------------- /src/solo2yolo-unity/Packages/packages-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "com.unity.ext.nunit": { 4 | "version": "1.0.6", 5 | "depth": 2, 6 | "source": "registry", 7 | "dependencies": {}, 8 | "url": "https://packages.unity.com" 9 | }, 10 | "com.unity.ide.visualstudio": { 11 | "version": "2.0.18", 12 | "depth": 0, 13 | "source": "registry", 14 | "dependencies": { 15 | "com.unity.test-framework": "1.1.9" 16 | }, 17 | "url": "https://packages.unity.com" 18 | }, 19 | "com.unity.test-framework": { 20 | "version": "1.1.33", 21 | "depth": 1, 22 | "source": "registry", 23 | "dependencies": { 24 | "com.unity.ext.nunit": "1.0.6", 25 | "com.unity.modules.imgui": "1.0.0", 26 | "com.unity.modules.jsonserialize": "1.0.0" 27 | }, 28 | "url": "https://packages.unity.com" 29 | }, 30 | "com.z3lx.solo2yolo": { 31 | "version": "file:solo2yolo", 32 | "depth": 0, 33 | "source": "embedded", 34 | "dependencies": {} 35 | }, 36 | "com.unity.modules.ai": { 37 | "version": "1.0.0", 38 | "depth": 0, 39 | "source": "builtin", 40 | "dependencies": {} 41 | }, 42 | "com.unity.modules.androidjni": { 43 | "version": "1.0.0", 44 | "depth": 0, 45 | "source": "builtin", 46 | "dependencies": {} 47 | }, 48 | "com.unity.modules.animation": { 49 | "version": "1.0.0", 50 | "depth": 0, 51 | "source": "builtin", 52 | "dependencies": {} 53 | }, 54 | "com.unity.modules.assetbundle": { 55 | "version": "1.0.0", 56 | "depth": 0, 57 | "source": "builtin", 58 | "dependencies": {} 59 | }, 60 | "com.unity.modules.audio": { 61 | "version": "1.0.0", 62 | "depth": 0, 63 | "source": "builtin", 64 | "dependencies": {} 65 | }, 66 | "com.unity.modules.cloth": { 67 | "version": "1.0.0", 68 | "depth": 0, 69 | "source": "builtin", 70 | "dependencies": { 71 | "com.unity.modules.physics": "1.0.0" 72 | } 73 | }, 74 | "com.unity.modules.director": { 75 | "version": "1.0.0", 76 | "depth": 0, 77 | "source": "builtin", 78 | "dependencies": { 79 | "com.unity.modules.audio": "1.0.0", 80 | "com.unity.modules.animation": "1.0.0" 81 | } 82 | }, 83 | "com.unity.modules.imageconversion": { 84 | "version": "1.0.0", 85 | "depth": 0, 86 | "source": "builtin", 87 | "dependencies": {} 88 | }, 89 | "com.unity.modules.imgui": { 90 | "version": "1.0.0", 91 | "depth": 0, 92 | "source": "builtin", 93 | "dependencies": {} 94 | }, 95 | "com.unity.modules.jsonserialize": { 96 | "version": "1.0.0", 97 | "depth": 0, 98 | "source": "builtin", 99 | "dependencies": {} 100 | }, 101 | "com.unity.modules.particlesystem": { 102 | "version": "1.0.0", 103 | "depth": 0, 104 | "source": "builtin", 105 | "dependencies": {} 106 | }, 107 | "com.unity.modules.physics": { 108 | "version": "1.0.0", 109 | "depth": 0, 110 | "source": "builtin", 111 | "dependencies": {} 112 | }, 113 | "com.unity.modules.physics2d": { 114 | "version": "1.0.0", 115 | "depth": 0, 116 | "source": "builtin", 117 | "dependencies": {} 118 | }, 119 | "com.unity.modules.screencapture": { 120 | "version": "1.0.0", 121 | "depth": 0, 122 | "source": "builtin", 123 | "dependencies": { 124 | "com.unity.modules.imageconversion": "1.0.0" 125 | } 126 | }, 127 | "com.unity.modules.subsystems": { 128 | "version": "1.0.0", 129 | "depth": 1, 130 | "source": "builtin", 131 | "dependencies": { 132 | "com.unity.modules.jsonserialize": "1.0.0" 133 | } 134 | }, 135 | "com.unity.modules.terrain": { 136 | "version": "1.0.0", 137 | "depth": 0, 138 | "source": "builtin", 139 | "dependencies": {} 140 | }, 141 | "com.unity.modules.terrainphysics": { 142 | "version": "1.0.0", 143 | "depth": 0, 144 | "source": "builtin", 145 | "dependencies": { 146 | "com.unity.modules.physics": "1.0.0", 147 | "com.unity.modules.terrain": "1.0.0" 148 | } 149 | }, 150 | "com.unity.modules.tilemap": { 151 | "version": "1.0.0", 152 | "depth": 0, 153 | "source": "builtin", 154 | "dependencies": { 155 | "com.unity.modules.physics2d": "1.0.0" 156 | } 157 | }, 158 | "com.unity.modules.ui": { 159 | "version": "1.0.0", 160 | "depth": 0, 161 | "source": "builtin", 162 | "dependencies": {} 163 | }, 164 | "com.unity.modules.uielements": { 165 | "version": "1.0.0", 166 | "depth": 0, 167 | "source": "builtin", 168 | "dependencies": { 169 | "com.unity.modules.ui": "1.0.0", 170 | "com.unity.modules.imgui": "1.0.0", 171 | "com.unity.modules.jsonserialize": "1.0.0" 172 | } 173 | }, 174 | "com.unity.modules.umbra": { 175 | "version": "1.0.0", 176 | "depth": 0, 177 | "source": "builtin", 178 | "dependencies": {} 179 | }, 180 | "com.unity.modules.unityanalytics": { 181 | "version": "1.0.0", 182 | "depth": 0, 183 | "source": "builtin", 184 | "dependencies": { 185 | "com.unity.modules.unitywebrequest": "1.0.0", 186 | "com.unity.modules.jsonserialize": "1.0.0" 187 | } 188 | }, 189 | "com.unity.modules.unitywebrequest": { 190 | "version": "1.0.0", 191 | "depth": 0, 192 | "source": "builtin", 193 | "dependencies": {} 194 | }, 195 | "com.unity.modules.unitywebrequestassetbundle": { 196 | "version": "1.0.0", 197 | "depth": 0, 198 | "source": "builtin", 199 | "dependencies": { 200 | "com.unity.modules.assetbundle": "1.0.0", 201 | "com.unity.modules.unitywebrequest": "1.0.0" 202 | } 203 | }, 204 | "com.unity.modules.unitywebrequestaudio": { 205 | "version": "1.0.0", 206 | "depth": 0, 207 | "source": "builtin", 208 | "dependencies": { 209 | "com.unity.modules.unitywebrequest": "1.0.0", 210 | "com.unity.modules.audio": "1.0.0" 211 | } 212 | }, 213 | "com.unity.modules.unitywebrequesttexture": { 214 | "version": "1.0.0", 215 | "depth": 0, 216 | "source": "builtin", 217 | "dependencies": { 218 | "com.unity.modules.unitywebrequest": "1.0.0", 219 | "com.unity.modules.imageconversion": "1.0.0" 220 | } 221 | }, 222 | "com.unity.modules.unitywebrequestwww": { 223 | "version": "1.0.0", 224 | "depth": 0, 225 | "source": "builtin", 226 | "dependencies": { 227 | "com.unity.modules.unitywebrequest": "1.0.0", 228 | "com.unity.modules.unitywebrequestassetbundle": "1.0.0", 229 | "com.unity.modules.unitywebrequestaudio": "1.0.0", 230 | "com.unity.modules.audio": "1.0.0", 231 | "com.unity.modules.assetbundle": "1.0.0", 232 | "com.unity.modules.imageconversion": "1.0.0" 233 | } 234 | }, 235 | "com.unity.modules.vehicles": { 236 | "version": "1.0.0", 237 | "depth": 0, 238 | "source": "builtin", 239 | "dependencies": { 240 | "com.unity.modules.physics": "1.0.0" 241 | } 242 | }, 243 | "com.unity.modules.video": { 244 | "version": "1.0.0", 245 | "depth": 0, 246 | "source": "builtin", 247 | "dependencies": { 248 | "com.unity.modules.audio": "1.0.0", 249 | "com.unity.modules.ui": "1.0.0", 250 | "com.unity.modules.unitywebrequest": "1.0.0" 251 | } 252 | }, 253 | "com.unity.modules.vr": { 254 | "version": "1.0.0", 255 | "depth": 0, 256 | "source": "builtin", 257 | "dependencies": { 258 | "com.unity.modules.jsonserialize": "1.0.0", 259 | "com.unity.modules.physics": "1.0.0", 260 | "com.unity.modules.xr": "1.0.0" 261 | } 262 | }, 263 | "com.unity.modules.wind": { 264 | "version": "1.0.0", 265 | "depth": 0, 266 | "source": "builtin", 267 | "dependencies": {} 268 | }, 269 | "com.unity.modules.xr": { 270 | "version": "1.0.0", 271 | "depth": 0, 272 | "source": "builtin", 273 | "dependencies": { 274 | "com.unity.modules.physics": "1.0.0", 275 | "com.unity.modules.jsonserialize": "1.0.0", 276 | "com.unity.modules.subsystems": "1.0.0" 277 | } 278 | } 279 | } 280 | } 281 | -------------------------------------------------------------------------------- /src/solo2yolo-dotnet/Program.cs: -------------------------------------------------------------------------------- 1 | namespace z3lx.solo2yolo 2 | { 3 | internal static class Program 4 | { 5 | private const string MissingSoloPathErrorMessage = "Missing SOLO path for -i flag."; 6 | private const string MissingYoloPathErrorMessage = "Missing YOLO path for -o flag."; 7 | private const string MissingTaskTypeErrorMessage = "Missing task type for -t flag."; 8 | private const string InvalidTaskTypeErrorMessage = "Invalid task type for -t flag: {0}"; 9 | private const string UnknownFlagErrorMessage = "Unknown flag: {0}"; 10 | private const string UnknownArgumentErrorMessage = "Unknown argument: {0}"; 11 | 12 | private static string soloPath = string.Empty; 13 | private static string yoloPath = string.Empty; 14 | private static ComputerVisionTask? task = null; 15 | private static bool unityEditor = false; 16 | 17 | private static HashSet errorMessages = new HashSet(); 18 | 19 | static void Main(string[] args) 20 | { 21 | if (args.Length == 0) 22 | { 23 | ShowHelp(); 24 | return; 25 | } 26 | 27 | ParseArguments(args); 28 | 29 | if (!ValidateArguments()) 30 | return; 31 | 32 | DatasetConverter.Convert(soloPath, yoloPath, task.Value); 33 | 34 | if (unityEditor) 35 | { 36 | Console.WriteLine("\nPress any key to close this window..."); 37 | Console.ReadKey(); 38 | } 39 | } 40 | 41 | /// 42 | /// Parses the command-line arguments and assigns values to corresponding variables. 43 | /// 44 | /// The command-line arguments. 45 | private static void ParseArguments(string[] args) 46 | { 47 | for (int i = 0; i < args.Length; i++) 48 | { 49 | string argument = args[i]; 50 | 51 | if (argument.StartsWith("--")) 52 | { 53 | string flag = argument.Substring(2); 54 | 55 | switch (flag) 56 | { 57 | case "unity-editor": 58 | unityEditor = true; 59 | break; 60 | } 61 | } 62 | else if (argument.StartsWith("-")) 63 | { 64 | string flag = argument.Substring(1); 65 | 66 | switch (flag) 67 | { 68 | case "i": 69 | if (TryGetNextArgumentValue(args, i, out string soloPathValue)) 70 | { 71 | soloPath = soloPathValue; 72 | i++; 73 | } 74 | else 75 | { 76 | errorMessages.Add(MissingSoloPathErrorMessage); 77 | } 78 | break; 79 | 80 | case "o": 81 | if (TryGetNextArgumentValue(args, i, out string yoloPathValue)) 82 | { 83 | yoloPath = yoloPathValue; 84 | i++; 85 | } 86 | else 87 | { 88 | errorMessages.Add(MissingYoloPathErrorMessage); 89 | } 90 | break; 91 | 92 | case "t": 93 | if (TryGetNextArgumentValue(args, i, out string taskValue)) 94 | { 95 | if (TryParseComputerVisionTask(taskValue, out ComputerVisionTask parsedTask)) 96 | { 97 | task = parsedTask; 98 | } 99 | else 100 | { 101 | errorMessages.Add(string.Format(InvalidTaskTypeErrorMessage, taskValue)); 102 | } 103 | i++; 104 | } 105 | else 106 | { 107 | errorMessages.Add(MissingTaskTypeErrorMessage); 108 | } 109 | break; 110 | 111 | case "h": 112 | ShowHelp(); 113 | Environment.Exit(0); 114 | break; 115 | 116 | default: 117 | errorMessages.Add(string.Format(UnknownFlagErrorMessage, flag)); 118 | break; 119 | } 120 | } 121 | else 122 | { 123 | errorMessages.Add(string.Format(UnknownArgumentErrorMessage, argument)); 124 | } 125 | } 126 | } 127 | 128 | /// 129 | /// Tries to retrieve the value of the next argument from the command-line arguments array. 130 | /// 131 | /// The command-line arguments. 132 | /// The current index in the arguments array. 133 | /// The retrieved argument value. 134 | /// true if the value was successfully retrieved; otherwise, false. 135 | private static bool TryGetNextArgumentValue(string[] args, int currentIndex, out string value) 136 | { 137 | value = string.Empty; 138 | 139 | if (currentIndex + 1 < args.Length && !args[currentIndex + 1].StartsWith("-")) 140 | { 141 | value = args[currentIndex + 1]; 142 | return true; 143 | } 144 | 145 | return false; 146 | } 147 | 148 | /// 149 | /// Tries to parse the given task value to a enum value. 150 | /// 151 | /// The task value to parse. 152 | /// The parsed value. 153 | /// true if the parsing was successful; otherwise, false. 154 | private static bool TryParseComputerVisionTask(string taskValue, out ComputerVisionTask parsedTask) 155 | { 156 | return Enum.TryParse(char.ToUpper(taskValue[0]) + taskValue.Substring(1).ToLower(), out parsedTask); 157 | } 158 | 159 | /// 160 | /// Validates the parsed arguments. 161 | /// 162 | /// true if the arguments are valid; otherwise, false. 163 | private static bool ValidateArguments() 164 | { 165 | if (string.IsNullOrEmpty(soloPath)) 166 | errorMessages.Add(MissingSoloPathErrorMessage); 167 | 168 | if (string.IsNullOrEmpty(yoloPath)) 169 | errorMessages.Add(MissingYoloPathErrorMessage); 170 | 171 | if (task == null) 172 | errorMessages.Add(MissingTaskTypeErrorMessage); 173 | 174 | if (errorMessages.Count > 0) 175 | { 176 | foreach (string errorMessage in errorMessages) 177 | Console.WriteLine(errorMessage); 178 | 179 | return false; 180 | } 181 | 182 | return true; 183 | } 184 | 185 | /// 186 | /// Displays the help page with usage information. 187 | /// 188 | private static void ShowHelp() 189 | { 190 | Console.WriteLine("Usage:"); 191 | Console.WriteLine("solo2yolo [-i ] [-o ] [-t ]"); 192 | 193 | Console.WriteLine("\nExample:"); 194 | Console.WriteLine("solo2yolo -i /path/to/solo_dataset -o /path/to/yolo_dataset -t detect"); 195 | 196 | Console.WriteLine("\nMandatory Flags:"); 197 | Console.WriteLine("-i: Specifies the input path for the SOLO dataset."); 198 | Console.WriteLine("-o: Specifies the output path for the converted YOLO dataset."); 199 | Console.WriteLine("-t: Specifies the computer vision task of the converted dataset."); 200 | Console.WriteLine(" Available options: classify, detect, segment, pose."); 201 | 202 | Console.WriteLine("\nOther Flags:"); 203 | Console.WriteLine("-h: Displays this help page."); 204 | } 205 | } 206 | } -------------------------------------------------------------------------------- /src/solo2yolo-dotnet/.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.rsuser 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Mono auto generated files 17 | mono_crash.* 18 | 19 | # Build results 20 | [Dd]ebug/ 21 | [Dd]ebugPublic/ 22 | [Rr]elease/ 23 | [Rr]eleases/ 24 | x64/ 25 | x86/ 26 | [Ww][Ii][Nn]32/ 27 | [Aa][Rr][Mm]/ 28 | [Aa][Rr][Mm]64/ 29 | bld/ 30 | [Bb]in/ 31 | [Oo]bj/ 32 | [Ll]og/ 33 | [Ll]ogs/ 34 | 35 | # Visual Studio 2015/2017 cache/options directory 36 | .vs/ 37 | # Uncomment if you have tasks that create the project's static files in wwwroot 38 | #wwwroot/ 39 | 40 | # Visual Studio 2017 auto generated files 41 | Generated\ Files/ 42 | 43 | # MSTest test Results 44 | [Tt]est[Rr]esult*/ 45 | [Bb]uild[Ll]og.* 46 | 47 | # NUnit 48 | *.VisualState.xml 49 | TestResult.xml 50 | nunit-*.xml 51 | 52 | # Build Results of an ATL Project 53 | [Dd]ebugPS/ 54 | [Rr]eleasePS/ 55 | dlldata.c 56 | 57 | # Benchmark Results 58 | BenchmarkDotNet.Artifacts/ 59 | 60 | # .NET 61 | project.lock.json 62 | project.fragment.lock.json 63 | artifacts/ 64 | 65 | # Tye 66 | .tye/ 67 | 68 | # ASP.NET Scaffolding 69 | ScaffoldingReadMe.txt 70 | 71 | # StyleCop 72 | StyleCopReport.xml 73 | 74 | # Files built by Visual Studio 75 | *_i.c 76 | *_p.c 77 | *_h.h 78 | *.ilk 79 | *.meta 80 | *.obj 81 | *.iobj 82 | *.pch 83 | *.pdb 84 | *.ipdb 85 | *.pgc 86 | *.pgd 87 | *.rsp 88 | *.sbr 89 | *.tlb 90 | *.tli 91 | *.tlh 92 | *.tmp 93 | *.tmp_proj 94 | *_wpftmp.csproj 95 | *.log 96 | *.tlog 97 | *.vspscc 98 | *.vssscc 99 | .builds 100 | *.pidb 101 | *.svclog 102 | *.scc 103 | 104 | # Chutzpah Test files 105 | _Chutzpah* 106 | 107 | # Visual C++ cache files 108 | ipch/ 109 | *.aps 110 | *.ncb 111 | *.opendb 112 | *.opensdf 113 | *.sdf 114 | *.cachefile 115 | *.VC.db 116 | *.VC.VC.opendb 117 | 118 | # Visual Studio profiler 119 | *.psess 120 | *.vsp 121 | *.vspx 122 | *.sap 123 | 124 | # Visual Studio Trace Files 125 | *.e2e 126 | 127 | # TFS 2012 Local Workspace 128 | $tf/ 129 | 130 | # Guidance Automation Toolkit 131 | *.gpState 132 | 133 | # ReSharper is a .NET coding add-in 134 | _ReSharper*/ 135 | *.[Rr]e[Ss]harper 136 | *.DotSettings.user 137 | 138 | # TeamCity is a build add-in 139 | _TeamCity* 140 | 141 | # DotCover is a Code Coverage Tool 142 | *.dotCover 143 | 144 | # AxoCover is a Code Coverage Tool 145 | .axoCover/* 146 | !.axoCover/settings.json 147 | 148 | # Coverlet is a free, cross platform Code Coverage Tool 149 | coverage*.json 150 | coverage*.xml 151 | coverage*.info 152 | 153 | # Visual Studio code coverage results 154 | *.coverage 155 | *.coveragexml 156 | 157 | # NCrunch 158 | _NCrunch_* 159 | .*crunch*.local.xml 160 | nCrunchTemp_* 161 | 162 | # MightyMoose 163 | *.mm.* 164 | AutoTest.Net/ 165 | 166 | # Web workbench (sass) 167 | .sass-cache/ 168 | 169 | # Installshield output folder 170 | [Ee]xpress/ 171 | 172 | # DocProject is a documentation generator add-in 173 | DocProject/buildhelp/ 174 | DocProject/Help/*.HxT 175 | DocProject/Help/*.HxC 176 | DocProject/Help/*.hhc 177 | DocProject/Help/*.hhk 178 | DocProject/Help/*.hhp 179 | DocProject/Help/Html2 180 | DocProject/Help/html 181 | 182 | # Click-Once directory 183 | publish/ 184 | 185 | # Publish Web Output 186 | *.[Pp]ublish.xml 187 | *.azurePubxml 188 | # Note: Comment the next line if you want to checkin your web deploy settings, 189 | # but database connection strings (with potential passwords) will be unencrypted 190 | *.pubxml 191 | *.publishproj 192 | 193 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 194 | # checkin your Azure Web App publish settings, but sensitive information contained 195 | # in these scripts will be unencrypted 196 | PublishScripts/ 197 | 198 | # NuGet Packages 199 | *.nupkg 200 | # NuGet Symbol Packages 201 | *.snupkg 202 | # The packages folder can be ignored because of Package Restore 203 | **/[Pp]ackages/* 204 | # except build/, which is used as an MSBuild target. 205 | !**/[Pp]ackages/build/ 206 | # Uncomment if necessary however generally it will be regenerated when needed 207 | #!**/[Pp]ackages/repositories.config 208 | # NuGet v3's project.json files produces more ignorable files 209 | *.nuget.props 210 | *.nuget.targets 211 | 212 | # Microsoft Azure Build Output 213 | csx/ 214 | *.build.csdef 215 | 216 | # Microsoft Azure Emulator 217 | ecf/ 218 | rcf/ 219 | 220 | # Windows Store app package directories and files 221 | AppPackages/ 222 | BundleArtifacts/ 223 | Package.StoreAssociation.xml 224 | _pkginfo.txt 225 | *.appx 226 | *.appxbundle 227 | *.appxupload 228 | 229 | # Visual Studio cache files 230 | # files ending in .cache can be ignored 231 | *.[Cc]ache 232 | # but keep track of directories ending in .cache 233 | !?*.[Cc]ache/ 234 | 235 | # Others 236 | ClientBin/ 237 | ~$* 238 | *~ 239 | *.dbmdl 240 | *.dbproj.schemaview 241 | *.jfm 242 | *.pfx 243 | *.publishsettings 244 | orleans.codegen.cs 245 | 246 | # Including strong name files can present a security risk 247 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 248 | #*.snk 249 | 250 | # Since there are multiple workflows, uncomment next line to ignore bower_components 251 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 252 | #bower_components/ 253 | 254 | # RIA/Silverlight projects 255 | Generated_Code/ 256 | 257 | # Backup & report files from converting an old project file 258 | # to a newer Visual Studio version. Backup files are not needed, 259 | # because we have git ;-) 260 | _UpgradeReport_Files/ 261 | Backup*/ 262 | UpgradeLog*.XML 263 | UpgradeLog*.htm 264 | ServiceFabricBackup/ 265 | *.rptproj.bak 266 | 267 | # SQL Server files 268 | *.mdf 269 | *.ldf 270 | *.ndf 271 | 272 | # Business Intelligence projects 273 | *.rdl.data 274 | *.bim.layout 275 | *.bim_*.settings 276 | *.rptproj.rsuser 277 | *- [Bb]ackup.rdl 278 | *- [Bb]ackup ([0-9]).rdl 279 | *- [Bb]ackup ([0-9][0-9]).rdl 280 | 281 | # Microsoft Fakes 282 | FakesAssemblies/ 283 | 284 | # GhostDoc plugin setting file 285 | *.GhostDoc.xml 286 | 287 | # Node.js Tools for Visual Studio 288 | .ntvs_analysis.dat 289 | node_modules/ 290 | 291 | # Visual Studio 6 build log 292 | *.plg 293 | 294 | # Visual Studio 6 workspace options file 295 | *.opt 296 | 297 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 298 | *.vbw 299 | 300 | # Visual Studio 6 auto-generated project file (contains which files were open etc.) 301 | *.vbp 302 | 303 | # Visual Studio 6 workspace and project file (working project files containing files to include in project) 304 | *.dsw 305 | *.dsp 306 | 307 | # Visual Studio 6 technical files 308 | *.ncb 309 | *.aps 310 | 311 | # Visual Studio LightSwitch build output 312 | **/*.HTMLClient/GeneratedArtifacts 313 | **/*.DesktopClient/GeneratedArtifacts 314 | **/*.DesktopClient/ModelManifest.xml 315 | **/*.Server/GeneratedArtifacts 316 | **/*.Server/ModelManifest.xml 317 | _Pvt_Extensions 318 | 319 | # Paket dependency manager 320 | .paket/paket.exe 321 | paket-files/ 322 | 323 | # FAKE - F# Make 324 | .fake/ 325 | 326 | # CodeRush personal settings 327 | .cr/personal 328 | 329 | # Python Tools for Visual Studio (PTVS) 330 | __pycache__/ 331 | *.pyc 332 | 333 | # Cake - Uncomment if you are using it 334 | # tools/** 335 | # !tools/packages.config 336 | 337 | # Tabs Studio 338 | *.tss 339 | 340 | # Telerik's JustMock configuration file 341 | *.jmconfig 342 | 343 | # BizTalk build output 344 | *.btp.cs 345 | *.btm.cs 346 | *.odx.cs 347 | *.xsd.cs 348 | 349 | # OpenCover UI analysis results 350 | OpenCover/ 351 | 352 | # Azure Stream Analytics local run output 353 | ASALocalRun/ 354 | 355 | # MSBuild Binary and Structured Log 356 | *.binlog 357 | 358 | # NVidia Nsight GPU debugger configuration file 359 | *.nvuser 360 | 361 | # MFractors (Xamarin productivity tool) working folder 362 | .mfractor/ 363 | 364 | # Local History for Visual Studio 365 | .localhistory/ 366 | 367 | # Visual Studio History (VSHistory) files 368 | .vshistory/ 369 | 370 | # BeatPulse healthcheck temp database 371 | healthchecksdb 372 | 373 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 374 | MigrationBackup/ 375 | 376 | # Ionide (cross platform F# VS Code tools) working folder 377 | .ionide/ 378 | 379 | # Fody - auto-generated XML schema 380 | FodyWeavers.xsd 381 | 382 | # VS Code files for those working on multiple tools 383 | .vscode/* 384 | !.vscode/settings.json 385 | !.vscode/tasks.json 386 | !.vscode/launch.json 387 | !.vscode/extensions.json 388 | *.code-workspace 389 | 390 | # Local History for Visual Studio Code 391 | .history/ 392 | 393 | # Windows Installer files from build outputs 394 | *.cab 395 | *.msi 396 | *.msix 397 | *.msm 398 | *.msp 399 | 400 | # JetBrains Rider 401 | *.sln.iml 402 | 403 | ## 404 | ## Visual studio for Mac 405 | ## 406 | 407 | 408 | # globs 409 | Makefile.in 410 | *.userprefs 411 | *.usertasks 412 | config.make 413 | config.status 414 | aclocal.m4 415 | install-sh 416 | autom4te.cache/ 417 | *.tar.gz 418 | tarballs/ 419 | test-results/ 420 | 421 | # Mac bundle stuff 422 | *.dmg 423 | *.app 424 | 425 | # content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore 426 | # General 427 | .DS_Store 428 | .AppleDouble 429 | .LSOverride 430 | 431 | # Icon must end with two \r 432 | Icon 433 | 434 | 435 | # Thumbnails 436 | ._* 437 | 438 | # Files that might appear in the root of a volume 439 | .DocumentRevisions-V100 440 | .fseventsd 441 | .Spotlight-V100 442 | .TemporaryItems 443 | .Trashes 444 | .VolumeIcon.icns 445 | .com.apple.timemachine.donotpresent 446 | 447 | # Directories potentially created on remote AFP share 448 | .AppleDB 449 | .AppleDesktop 450 | Network Trash Folder 451 | Temporary Items 452 | .apdisk 453 | 454 | # content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore 455 | # Windows thumbnail cache files 456 | Thumbs.db 457 | ehthumbs.db 458 | ehthumbs_vista.db 459 | 460 | # Dump file 461 | *.stackdump 462 | 463 | # Folder config file 464 | [Dd]esktop.ini 465 | 466 | # Recycle Bin used on file shares 467 | $RECYCLE.BIN/ 468 | 469 | # Windows Installer files 470 | *.cab 471 | *.msi 472 | *.msix 473 | *.msm 474 | *.msp 475 | 476 | # Windows shortcuts 477 | *.lnk 478 | -------------------------------------------------------------------------------- /src/solo2yolo-dotnet/DatasetConverter.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | using System.Diagnostics; 3 | using System.Text.RegularExpressions; 4 | using z3lx.solo2yolo.Json.DataModels; 5 | 6 | namespace z3lx.solo2yolo 7 | { 8 | /// 9 | /// Provides functionality to convert a SOLO dataset to the YOLO format. 10 | /// 11 | public static class DatasetConverter 12 | { 13 | // TODO: Add image dimension verification 14 | /// 15 | /// Converts a SOLO dataset to the YOLO format. 16 | /// 17 | /// The path to the SOLO dataset. 18 | /// The path to store the converted YOLO dataset. 19 | /// The computer vision task conversion to perform. 20 | public static void Convert(string soloPath, string outputPath, ComputerVisionTask task) 21 | { 22 | // Validate and sanitize paths 23 | try 24 | { 25 | ValidateAndSanitizePath(ref soloPath); 26 | ValidateAndSanitizePath(ref outputPath); 27 | } 28 | catch (Exception ex) 29 | { 30 | ConsoleUtility.PrintError($"{ex.Message} Aborting."); 31 | return; 32 | } 33 | 34 | // Read metadata 35 | string metadataPath = Path.Combine(soloPath, "metadata.json"); 36 | if (!TryDeserializeObjectFromFile(metadataPath, out Metadata metadata)) 37 | return; 38 | 39 | // Read annotation definitions 40 | string annotationDefinitionsPath = Path.Combine(soloPath, "annotation_definitions.json"); 41 | if (!TryDeserializeObjectFromFile(annotationDefinitionsPath, out AnnotationDefinitions annotationDefinitions)) 42 | return; 43 | 44 | // Find frames 45 | if (!TryFindFrames(soloPath, metadata, out IEnumerable frameDataPaths, out int frameCount)) 46 | return; 47 | 48 | // TODO: Check for write permission 49 | // Create output directory 50 | ConsoleUtility.PrintInfo("Creating YOLO directory..."); 51 | string yoloPath = CreateYoloDirectory(outputPath); 52 | 53 | // Convert dataset format 54 | ConsoleUtility.PrintInfo("Starting dataset format conversion..."); 55 | Stopwatch stopwatch = Stopwatch.StartNew(); 56 | 57 | int soloIndex = 0; 58 | int yoloIndex = 0; 59 | foreach (string frameDataPath in frameDataPaths) 60 | { 61 | soloIndex++; 62 | 63 | // Deserialize frame data json 64 | if (!TryDeserializeObjectFromFile(frameDataPath, out FrameData frameData)) 65 | { 66 | ConsoleUtility.PrintError($"Skipped frame {soloIndex} out of {frameCount}: " + 67 | "could not deserialize frame data."); 68 | continue; 69 | } 70 | 71 | // Check for captures 72 | if (frameData.Captures == null || frameData.Captures.Length == 0) 73 | { 74 | ConsoleUtility.PrintWarning($"Skipped frame {soloIndex} out of {frameCount}: " + 75 | "no reported captures."); 76 | continue; 77 | } 78 | 79 | // Hardcoded RGB capture 80 | RgbCapture capture = frameData.Captures.OfType().FirstOrDefault(); 81 | if (string.IsNullOrEmpty(capture.FileName) || !File.Exists(Path.Combine(Directory.GetParent(frameDataPath).FullName, capture.FileName))) 82 | { 83 | ConsoleUtility.PrintWarning($"Skipped frame {soloIndex} out of {frameCount}: " + 84 | "no associated image file."); 85 | continue; 86 | } 87 | 88 | // Convert annotations for the frame depending on the task 89 | string labelingData = ConvertLabelingData(capture, task); 90 | if (string.IsNullOrEmpty(labelingData)) 91 | { 92 | ConsoleUtility.PrintWarning($"Skipped labelling for frame {soloIndex} out of {frameCount}: " + 93 | "no reported labels."); 94 | } 95 | else 96 | { 97 | // Write labeling data to output 98 | string labelingDataPath = Path.Combine(yoloPath, "labels", $"{yoloIndex:D12}.txt"); 99 | File.WriteAllText(labelingDataPath, labelingData); 100 | } 101 | 102 | // Copy image to output 103 | string sourceImagePath = Path.Combine(Directory.GetParent(frameDataPath).FullName, capture.FileName); 104 | string destImagePath = Path.Combine(yoloPath, "images", $"{yoloIndex:D12}.{capture.ImageFormat.ToLower()}"); 105 | File.Copy(sourceImagePath, destImagePath); 106 | 107 | ConsoleUtility.PrintInfo($"Processed frame {soloIndex} out of {frameCount}."); 108 | 109 | yoloIndex++; 110 | } 111 | 112 | // Create dataset.yaml 113 | ConsoleUtility.PrintInfo("Creating dataset.yaml..."); 114 | AnnotationDefinition annotationDefinition = annotationDefinitions.Values[0]; 115 | GenerateDatasetYaml(yoloPath, annotationDefinition); 116 | 117 | stopwatch.Stop(); 118 | TimeSpan ts = stopwatch.Elapsed; 119 | ConsoleUtility.PrintInfo($"Finished dataset format conversion in {ts.TotalMilliseconds:F3} ms."); 120 | } 121 | 122 | /// 123 | /// Tries to deserialize a JSON file into an object. 124 | /// 125 | /// The type of the object to deserialize. 126 | /// The path to the JSON file. 127 | /// The deserialized object. 128 | private static bool TryDeserializeObjectFromFile(string filePath, out T result) 129 | { 130 | try 131 | { 132 | result = DeserializeObjectFromFile(filePath); 133 | return true; 134 | } 135 | catch (Exception ex) 136 | { 137 | ConsoleUtility.PrintError($"{ex.Message} Aborting."); 138 | result = default; 139 | return false; 140 | } 141 | } 142 | 143 | /// 144 | /// Deserializes a JSON file into an object. 145 | /// 146 | /// The type of the object to deserialize. 147 | /// The path to the JSON file. 148 | /// The deserialized object. 149 | private static T DeserializeObjectFromFile(string filePath) 150 | { 151 | if (!File.Exists(filePath)) 152 | throw new FileNotFoundException($"File '{filePath}' not found."); 153 | 154 | try 155 | { 156 | string data = File.ReadAllText(filePath); 157 | if (string.IsNullOrEmpty(data)) 158 | throw new JsonSerializationException($"File '{filePath}' is empty."); 159 | 160 | T deserializedObject = JsonConvert.DeserializeObject(data); 161 | if (deserializedObject == null) 162 | throw new JsonSerializationException($"Failed to deserialize {typeof(T)} from the file '{filePath}'."); 163 | 164 | return deserializedObject; 165 | } 166 | catch (Exception ex) 167 | { 168 | throw new JsonSerializationException($"An error occurred while deserializing the file '{filePath}': {ex.Message}", ex); 169 | } 170 | } 171 | 172 | /// 173 | /// Validates and sanitizes a file or directory path. 174 | /// 175 | /// The path to validate and sanitize. 176 | private static void ValidateAndSanitizePath(ref string path) 177 | { 178 | if (string.IsNullOrWhiteSpace(path)) 179 | throw new DirectoryNotFoundException("Path cannot be null or empty."); 180 | 181 | path = path.Trim(); 182 | 183 | if (Path.GetInvalidPathChars().Any(path.Contains)) 184 | throw new DirectoryNotFoundException($"Path '{path}' contains invalid characters."); 185 | 186 | if (!Path.IsPathRooted(path)) 187 | throw new DirectoryNotFoundException($"Path '{path}' is not an absolute path."); 188 | 189 | if (!Directory.Exists(path)) 190 | throw new DirectoryNotFoundException($"Path '{path}' does not exist."); 191 | } 192 | 193 | /// 194 | /// Tries to find frame paths in the SOLO dataset. 195 | /// 196 | /// The path to the SOLO dataset. 197 | /// /// The metadata associated to the SOLO dataset. 198 | /// The frame paths. 199 | /// The frame count. 200 | /// 201 | private static bool TryFindFrames(string soloPath, Metadata metadata, out IEnumerable frameDataPaths, out int frameCount) 202 | { 203 | ConsoleUtility.PrintInfo("Finding frame(s)..."); 204 | Stopwatch stopwatch = Stopwatch.StartNew(); 205 | 206 | try 207 | { 208 | frameDataPaths = FindFrames(soloPath); 209 | frameCount = frameDataPaths.Count(); 210 | } 211 | catch (Exception ex) 212 | { 213 | ConsoleUtility.PrintError($"{ex.Message} Aborting."); 214 | frameDataPaths = default; 215 | frameCount = -1; 216 | return false; 217 | } 218 | 219 | stopwatch.Stop(); 220 | TimeSpan ts = stopwatch.Elapsed; 221 | 222 | if (frameCount == metadata.TotalFrames) 223 | { 224 | ConsoleUtility.PrintInfo(string.Format("Found {0} frame{1} in {2:F3} ms.", 225 | frameCount, frameCount == 1 ? "" : "s", ts.TotalMilliseconds)); 226 | } 227 | else if (frameCount == 0) 228 | { 229 | ConsoleUtility.PrintError($"Did not find any frames in '{soloPath}'. Aborting."); 230 | return false; 231 | } 232 | else 233 | { 234 | ConsoleUtility.PrintWarning(string.Format("Found {0} frame{1} in {2:F3} ms, expected {3}.", 235 | frameCount, frameCount == 1 ? "" : "s", ts.TotalMilliseconds, metadata.TotalFrames)); 236 | } 237 | 238 | return true; 239 | } 240 | 241 | /// 242 | /// Finds frame paths in the SOLO dataset. 243 | /// 244 | /// The path to the SOLO dataset. 245 | /// The frame paths. 246 | private static IEnumerable FindFrames(string soloPath) 247 | { 248 | try 249 | { 250 | string sequencePattern = "sequence.*"; 251 | IEnumerable sequencePaths = Directory.EnumerateDirectories(soloPath, sequencePattern, SearchOption.TopDirectoryOnly) 252 | .OrderBy(sequencePath => GetIndexFromPath(sequencePath, sequencePattern)); 253 | 254 | string framePattern = "step*.frame_data.json"; 255 | IEnumerable frameDataPaths = sequencePaths 256 | .SelectMany(sequencePath => Directory.EnumerateFiles(sequencePath, framePattern, SearchOption.TopDirectoryOnly) 257 | .OrderBy(frameDataPath => GetIndexFromPath(frameDataPath, framePattern))); 258 | 259 | return frameDataPaths; 260 | } 261 | catch (Exception ex) 262 | { 263 | throw new IOException($"An error occurred while finding frames in {soloPath}: {ex.Message}", ex); 264 | } 265 | } 266 | 267 | /// 268 | /// Extracts the index from a given path using the provided format. 269 | /// 270 | /// The path to get the index from. 271 | /// The path format. 272 | /// The extracted index. 273 | private static int GetIndexFromPath(string path, string format) 274 | { 275 | string fileName = Path.GetFileName(path); 276 | string pattern = format.Replace("*", "(\\d+)"); 277 | Match match = Regex.Match(fileName, pattern); 278 | 279 | if (!match.Success || !(match.Groups.Count > 1)) 280 | return -1; 281 | 282 | string indexString = match.Groups[1].Value; 283 | return int.Parse(indexString); 284 | } 285 | 286 | /// 287 | /// Creates a YOLO directory for storing the converted dataset. 288 | /// 289 | /// The base path to create the YOLO directory. 290 | /// The path to the created YOLO directory. 291 | private static string CreateYoloDirectory(string path) 292 | { 293 | int i = 0; 294 | string yoloPath = Path.Combine(path, "yolo"); 295 | 296 | while (Directory.Exists(yoloPath)) 297 | { 298 | i++; 299 | yoloPath = Path.Combine(path, $"yolo_{i}"); 300 | } 301 | 302 | Directory.CreateDirectory(yoloPath); 303 | Directory.CreateDirectory(Path.Combine(yoloPath, "images")); 304 | Directory.CreateDirectory(Path.Combine(yoloPath, "labels")); 305 | return yoloPath; 306 | } 307 | 308 | // Can there be multiple of the same annotation type? 309 | // TODO: Add support for other computer vision tasks 310 | /// 311 | /// Converts the labeling data based on the computer vision task. 312 | /// 313 | /// The capture to convert. 314 | /// The computer vision task. 315 | /// The converted labeling data. 316 | private static string ConvertLabelingData(RgbCapture capture, ComputerVisionTask task) 317 | { 318 | string labelingData = string.Empty; 319 | 320 | switch (task) 321 | { 322 | case ComputerVisionTask.Classify: 323 | throw new NotImplementedException(); 324 | 325 | case ComputerVisionTask.Detect: 326 | BoundingBox2DAnnotation annotation = capture.Annotations.OfType().FirstOrDefault(); 327 | if (annotation == null) 328 | return null; 329 | 330 | if (annotation.Values == null) 331 | return null; 332 | 333 | foreach (BoundingBox2DAnnotation.Value value in annotation.Values) 334 | { 335 | int objectClassId = value.LabelId; 336 | double x = (double)(value.Origin.X + (value.Dimension.X / 2)) / capture.Dimension.X; 337 | double y = (double)(value.Origin.Y + (value.Dimension.Y / 2)) / capture.Dimension.Y; 338 | double width = (double)value.Dimension.X / capture.Dimension.X; 339 | double height = (double)value.Dimension.Y / capture.Dimension.Y; 340 | labelingData += $"{objectClassId} {x} {y} {width} {height}\n"; 341 | } 342 | break; 343 | 344 | case ComputerVisionTask.Segment: 345 | throw new NotImplementedException(); 346 | 347 | case ComputerVisionTask.Pose: 348 | throw new NotImplementedException(); 349 | 350 | default: 351 | throw new ArgumentOutOfRangeException(nameof(task), task, "Unsupported task type. "); 352 | } 353 | 354 | return labelingData; 355 | } 356 | 357 | /// 358 | /// Generates the dataset YAML file for YOLO. 359 | /// 360 | /// The path to the YOLO directory. 361 | /// The annotation definition. 362 | private static void GenerateDatasetYaml(string yoloPath, AnnotationDefinition annotationDefinition) 363 | { 364 | string content = 365 | $"path: {yoloPath} # dataset root dir\n" + 366 | "train: images # train images (relative to 'path')\n" + 367 | "val: images # val images (relative to 'path')\n" + 368 | "test: # test images (optional)\n" + 369 | "\n" + 370 | "# Classes\n" + 371 | "names:\n"; 372 | 373 | foreach (AnnotationDefinition.Specification spec in annotationDefinition.Specifications) 374 | content += $" {spec.LabelId}: {spec.labelName}\n"; 375 | 376 | string yamlFilePath = Path.Combine(yoloPath, "dataset.yaml"); 377 | File.WriteAllText(yamlFilePath, content); 378 | } 379 | } 380 | } -------------------------------------------------------------------------------- /src/solo2yolo-unity/ProjectSettings/ProjectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!129 &1 4 | PlayerSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 26 7 | productGUID: d51cf5726b1e85c4daf75879e73b156d 8 | AndroidProfiler: 0 9 | AndroidFilterTouchesWhenObscured: 0 10 | AndroidEnableSustainedPerformanceMode: 0 11 | defaultScreenOrientation: 4 12 | targetDevice: 2 13 | useOnDemandResources: 0 14 | accelerometerFrequency: 60 15 | companyName: z3lx 16 | productName: solo2yolo 17 | defaultCursor: {fileID: 0} 18 | cursorHotspot: {x: 0, y: 0} 19 | m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} 20 | m_ShowUnitySplashScreen: 1 21 | m_ShowUnitySplashLogo: 1 22 | m_SplashScreenOverlayOpacity: 1 23 | m_SplashScreenAnimation: 1 24 | m_SplashScreenLogoStyle: 1 25 | m_SplashScreenDrawMode: 0 26 | m_SplashScreenBackgroundAnimationZoom: 1 27 | m_SplashScreenLogoAnimationZoom: 1 28 | m_SplashScreenBackgroundLandscapeAspect: 1 29 | m_SplashScreenBackgroundPortraitAspect: 1 30 | m_SplashScreenBackgroundLandscapeUvs: 31 | serializedVersion: 2 32 | x: 0 33 | y: 0 34 | width: 1 35 | height: 1 36 | m_SplashScreenBackgroundPortraitUvs: 37 | serializedVersion: 2 38 | x: 0 39 | y: 0 40 | width: 1 41 | height: 1 42 | m_SplashScreenLogos: [] 43 | m_VirtualRealitySplashScreen: {fileID: 0} 44 | m_HolographicTrackingLossScreen: {fileID: 0} 45 | defaultScreenWidth: 1920 46 | defaultScreenHeight: 1080 47 | defaultScreenWidthWeb: 960 48 | defaultScreenHeightWeb: 600 49 | m_StereoRenderingPath: 0 50 | m_ActiveColorSpace: 0 51 | m_SpriteBatchVertexThreshold: 300 52 | m_MTRendering: 1 53 | mipStripping: 0 54 | numberOfMipsStripped: 0 55 | numberOfMipsStrippedPerMipmapLimitGroup: {} 56 | m_StackTraceTypes: 010000000100000001000000010000000100000001000000 57 | iosShowActivityIndicatorOnLoading: -1 58 | androidShowActivityIndicatorOnLoading: -1 59 | iosUseCustomAppBackgroundBehavior: 0 60 | allowedAutorotateToPortrait: 1 61 | allowedAutorotateToPortraitUpsideDown: 1 62 | allowedAutorotateToLandscapeRight: 1 63 | allowedAutorotateToLandscapeLeft: 1 64 | useOSAutorotation: 1 65 | use32BitDisplayBuffer: 1 66 | preserveFramebufferAlpha: 0 67 | disableDepthAndStencilBuffers: 0 68 | androidStartInFullscreen: 1 69 | androidRenderOutsideSafeArea: 1 70 | androidUseSwappy: 1 71 | androidBlitType: 0 72 | androidResizableWindow: 0 73 | androidDefaultWindowWidth: 1920 74 | androidDefaultWindowHeight: 1080 75 | androidMinimumWindowWidth: 400 76 | androidMinimumWindowHeight: 300 77 | androidFullscreenMode: 1 78 | defaultIsNativeResolution: 1 79 | macRetinaSupport: 1 80 | runInBackground: 1 81 | captureSingleScreen: 0 82 | muteOtherAudioSources: 0 83 | Prepare IOS For Recording: 0 84 | Force IOS Speakers When Recording: 0 85 | deferSystemGesturesMode: 0 86 | hideHomeButton: 0 87 | submitAnalytics: 1 88 | usePlayerLog: 1 89 | bakeCollisionMeshes: 0 90 | forceSingleInstance: 0 91 | useFlipModelSwapchain: 1 92 | resizableWindow: 0 93 | useMacAppStoreValidation: 0 94 | macAppStoreCategory: public.app-category.games 95 | gpuSkinning: 1 96 | xboxPIXTextureCapture: 0 97 | xboxEnableAvatar: 0 98 | xboxEnableKinect: 0 99 | xboxEnableKinectAutoTracking: 0 100 | xboxEnableFitness: 0 101 | visibleInBackground: 1 102 | allowFullscreenSwitch: 1 103 | fullscreenMode: 1 104 | xboxSpeechDB: 0 105 | xboxEnableHeadOrientation: 0 106 | xboxEnableGuest: 0 107 | xboxEnablePIXSampling: 0 108 | metalFramebufferOnly: 0 109 | xboxOneResolution: 0 110 | xboxOneSResolution: 0 111 | xboxOneXResolution: 3 112 | xboxOneMonoLoggingLevel: 0 113 | xboxOneLoggingLevel: 1 114 | xboxOneDisableEsram: 0 115 | xboxOneEnableTypeOptimization: 0 116 | xboxOnePresentImmediateThreshold: 0 117 | switchQueueCommandMemory: 0 118 | switchQueueControlMemory: 16384 119 | switchQueueComputeMemory: 262144 120 | switchNVNShaderPoolsGranularity: 33554432 121 | switchNVNDefaultPoolsGranularity: 16777216 122 | switchNVNOtherPoolsGranularity: 16777216 123 | switchGpuScratchPoolGranularity: 2097152 124 | switchAllowGpuScratchShrinking: 0 125 | switchNVNMaxPublicTextureIDCount: 0 126 | switchNVNMaxPublicSamplerIDCount: 0 127 | switchNVNGraphicsFirmwareMemory: 32 128 | stadiaPresentMode: 0 129 | stadiaTargetFramerate: 0 130 | vulkanNumSwapchainBuffers: 3 131 | vulkanEnableSetSRGBWrite: 0 132 | vulkanEnablePreTransform: 1 133 | vulkanEnableLateAcquireNextImage: 0 134 | vulkanEnableCommandBufferRecycling: 1 135 | loadStoreDebugModeEnabled: 0 136 | bundleVersion: 0.1 137 | preloadedAssets: [] 138 | metroInputSource: 0 139 | wsaTransparentSwapchain: 0 140 | m_HolographicPauseOnTrackingLoss: 1 141 | xboxOneDisableKinectGpuReservation: 1 142 | xboxOneEnable7thCore: 1 143 | vrSettings: 144 | enable360StereoCapture: 0 145 | isWsaHolographicRemotingEnabled: 0 146 | enableFrameTimingStats: 0 147 | enableOpenGLProfilerGPURecorders: 1 148 | useHDRDisplay: 0 149 | hdrBitDepth: 0 150 | m_ColorGamuts: 00000000 151 | targetPixelDensity: 30 152 | resolutionScalingMode: 0 153 | resetResolutionOnWindowResize: 0 154 | androidSupportedAspectRatio: 1 155 | androidMaxAspectRatio: 2.1 156 | applicationIdentifier: 157 | Standalone: com.z3lx.solo2yolo 158 | buildNumber: 159 | Standalone: 0 160 | iPhone: 0 161 | tvOS: 0 162 | overrideDefaultApplicationIdentifier: 0 163 | AndroidBundleVersionCode: 1 164 | AndroidMinSdkVersion: 22 165 | AndroidTargetSdkVersion: 0 166 | AndroidPreferredInstallLocation: 1 167 | aotOptions: 168 | stripEngineCode: 1 169 | iPhoneStrippingLevel: 0 170 | iPhoneScriptCallOptimization: 0 171 | ForceInternetPermission: 0 172 | ForceSDCardPermission: 0 173 | CreateWallpaper: 0 174 | APKExpansionFiles: 0 175 | keepLoadedShadersAlive: 0 176 | StripUnusedMeshComponents: 1 177 | strictShaderVariantMatching: 0 178 | VertexChannelCompressionMask: 4054 179 | iPhoneSdkVersion: 988 180 | iOSTargetOSVersionString: 12.0 181 | tvOSSdkVersion: 0 182 | tvOSRequireExtendedGameController: 0 183 | tvOSTargetOSVersionString: 12.0 184 | uIPrerenderedIcon: 0 185 | uIRequiresPersistentWiFi: 0 186 | uIRequiresFullScreen: 1 187 | uIStatusBarHidden: 1 188 | uIExitOnSuspend: 0 189 | uIStatusBarStyle: 0 190 | appleTVSplashScreen: {fileID: 0} 191 | appleTVSplashScreen2x: {fileID: 0} 192 | tvOSSmallIconLayers: [] 193 | tvOSSmallIconLayers2x: [] 194 | tvOSLargeIconLayers: [] 195 | tvOSLargeIconLayers2x: [] 196 | tvOSTopShelfImageLayers: [] 197 | tvOSTopShelfImageLayers2x: [] 198 | tvOSTopShelfImageWideLayers: [] 199 | tvOSTopShelfImageWideLayers2x: [] 200 | iOSLaunchScreenType: 0 201 | iOSLaunchScreenPortrait: {fileID: 0} 202 | iOSLaunchScreenLandscape: {fileID: 0} 203 | iOSLaunchScreenBackgroundColor: 204 | serializedVersion: 2 205 | rgba: 0 206 | iOSLaunchScreenFillPct: 100 207 | iOSLaunchScreenSize: 100 208 | iOSLaunchScreenCustomXibPath: 209 | iOSLaunchScreeniPadType: 0 210 | iOSLaunchScreeniPadImage: {fileID: 0} 211 | iOSLaunchScreeniPadBackgroundColor: 212 | serializedVersion: 2 213 | rgba: 0 214 | iOSLaunchScreeniPadFillPct: 100 215 | iOSLaunchScreeniPadSize: 100 216 | iOSLaunchScreeniPadCustomXibPath: 217 | iOSLaunchScreenCustomStoryboardPath: 218 | iOSLaunchScreeniPadCustomStoryboardPath: 219 | iOSDeviceRequirements: [] 220 | iOSURLSchemes: [] 221 | macOSURLSchemes: [] 222 | iOSBackgroundModes: 0 223 | iOSMetalForceHardShadows: 0 224 | metalEditorSupport: 1 225 | metalAPIValidation: 1 226 | iOSRenderExtraFrameOnPause: 0 227 | iosCopyPluginsCodeInsteadOfSymlink: 0 228 | appleDeveloperTeamID: 229 | iOSManualSigningProvisioningProfileID: 230 | tvOSManualSigningProvisioningProfileID: 231 | iOSManualSigningProvisioningProfileType: 0 232 | tvOSManualSigningProvisioningProfileType: 0 233 | appleEnableAutomaticSigning: 0 234 | iOSRequireARKit: 0 235 | iOSAutomaticallyDetectAndAddCapabilities: 1 236 | appleEnableProMotion: 0 237 | shaderPrecisionModel: 0 238 | clonedFromGUID: c0afd0d1d80e3634a9dac47e8a0426ea 239 | templatePackageId: com.unity.template.3d@8.1.1 240 | templateDefaultScene: Assets/Scenes/SampleScene.unity 241 | useCustomMainManifest: 0 242 | useCustomLauncherManifest: 0 243 | useCustomMainGradleTemplate: 0 244 | useCustomLauncherGradleManifest: 0 245 | useCustomBaseGradleTemplate: 0 246 | useCustomGradlePropertiesTemplate: 0 247 | useCustomGradleSettingsTemplate: 0 248 | useCustomProguardFile: 0 249 | AndroidTargetArchitectures: 1 250 | AndroidTargetDevices: 0 251 | AndroidSplashScreenScale: 0 252 | androidSplashScreen: {fileID: 0} 253 | AndroidKeystoreName: 254 | AndroidKeyaliasName: 255 | AndroidEnableArmv9SecurityFeatures: 0 256 | AndroidBuildApkPerCpuArchitecture: 0 257 | AndroidTVCompatibility: 0 258 | AndroidIsGame: 1 259 | AndroidEnableTango: 0 260 | androidEnableBanner: 1 261 | androidUseLowAccuracyLocation: 0 262 | androidUseCustomKeystore: 0 263 | m_AndroidBanners: 264 | - width: 320 265 | height: 180 266 | banner: {fileID: 0} 267 | androidGamepadSupportLevel: 0 268 | chromeosInputEmulation: 1 269 | AndroidMinifyRelease: 0 270 | AndroidMinifyDebug: 0 271 | AndroidValidateAppBundleSize: 1 272 | AndroidAppBundleSizeToValidate: 150 273 | m_BuildTargetIcons: [] 274 | m_BuildTargetPlatformIcons: [] 275 | m_BuildTargetBatching: 276 | - m_BuildTarget: Standalone 277 | m_StaticBatching: 1 278 | m_DynamicBatching: 0 279 | - m_BuildTarget: tvOS 280 | m_StaticBatching: 1 281 | m_DynamicBatching: 0 282 | - m_BuildTarget: Android 283 | m_StaticBatching: 1 284 | m_DynamicBatching: 0 285 | - m_BuildTarget: iPhone 286 | m_StaticBatching: 1 287 | m_DynamicBatching: 0 288 | - m_BuildTarget: WebGL 289 | m_StaticBatching: 0 290 | m_DynamicBatching: 0 291 | m_BuildTargetShaderSettings: [] 292 | m_BuildTargetGraphicsJobs: 293 | - m_BuildTarget: MacStandaloneSupport 294 | m_GraphicsJobs: 0 295 | - m_BuildTarget: Switch 296 | m_GraphicsJobs: 1 297 | - m_BuildTarget: MetroSupport 298 | m_GraphicsJobs: 1 299 | - m_BuildTarget: AppleTVSupport 300 | m_GraphicsJobs: 0 301 | - m_BuildTarget: BJMSupport 302 | m_GraphicsJobs: 1 303 | - m_BuildTarget: LinuxStandaloneSupport 304 | m_GraphicsJobs: 1 305 | - m_BuildTarget: PS4Player 306 | m_GraphicsJobs: 1 307 | - m_BuildTarget: iOSSupport 308 | m_GraphicsJobs: 0 309 | - m_BuildTarget: WindowsStandaloneSupport 310 | m_GraphicsJobs: 1 311 | - m_BuildTarget: XboxOnePlayer 312 | m_GraphicsJobs: 1 313 | - m_BuildTarget: LuminSupport 314 | m_GraphicsJobs: 0 315 | - m_BuildTarget: AndroidPlayer 316 | m_GraphicsJobs: 0 317 | - m_BuildTarget: WebGLSupport 318 | m_GraphicsJobs: 0 319 | m_BuildTargetGraphicsJobMode: 320 | - m_BuildTarget: PS4Player 321 | m_GraphicsJobMode: 0 322 | - m_BuildTarget: XboxOnePlayer 323 | m_GraphicsJobMode: 0 324 | m_BuildTargetGraphicsAPIs: 325 | - m_BuildTarget: AndroidPlayer 326 | m_APIs: 150000000b000000 327 | m_Automatic: 1 328 | - m_BuildTarget: iOSSupport 329 | m_APIs: 10000000 330 | m_Automatic: 1 331 | - m_BuildTarget: AppleTVSupport 332 | m_APIs: 10000000 333 | m_Automatic: 1 334 | - m_BuildTarget: WebGLSupport 335 | m_APIs: 0b000000 336 | m_Automatic: 1 337 | m_BuildTargetVRSettings: 338 | - m_BuildTarget: Standalone 339 | m_Enabled: 0 340 | m_Devices: 341 | - Oculus 342 | - OpenVR 343 | m_DefaultShaderChunkSizeInMB: 16 344 | m_DefaultShaderChunkCount: 0 345 | openGLRequireES31: 0 346 | openGLRequireES31AEP: 0 347 | openGLRequireES32: 0 348 | m_TemplateCustomTags: {} 349 | mobileMTRendering: 350 | Android: 1 351 | iPhone: 1 352 | tvOS: 1 353 | m_BuildTargetGroupLightmapEncodingQuality: 354 | - m_BuildTarget: Android 355 | m_EncodingQuality: 1 356 | - m_BuildTarget: iPhone 357 | m_EncodingQuality: 1 358 | - m_BuildTarget: tvOS 359 | m_EncodingQuality: 1 360 | m_BuildTargetGroupHDRCubemapEncodingQuality: 361 | - m_BuildTarget: Android 362 | m_EncodingQuality: 1 363 | - m_BuildTarget: iPhone 364 | m_EncodingQuality: 1 365 | - m_BuildTarget: tvOS 366 | m_EncodingQuality: 1 367 | m_BuildTargetGroupLightmapSettings: [] 368 | m_BuildTargetGroupLoadStoreDebugModeSettings: [] 369 | m_BuildTargetNormalMapEncoding: 370 | - m_BuildTarget: Android 371 | m_Encoding: 1 372 | - m_BuildTarget: iPhone 373 | m_Encoding: 1 374 | - m_BuildTarget: tvOS 375 | m_Encoding: 1 376 | m_BuildTargetDefaultTextureCompressionFormat: 377 | - m_BuildTarget: Android 378 | m_Format: 3 379 | playModeTestRunnerEnabled: 0 380 | runPlayModeTestAsEditModeTest: 0 381 | actionOnDotNetUnhandledException: 1 382 | enableInternalProfiler: 0 383 | logObjCUncaughtExceptions: 1 384 | enableCrashReportAPI: 0 385 | cameraUsageDescription: 386 | locationUsageDescription: 387 | microphoneUsageDescription: 388 | bluetoothUsageDescription: 389 | macOSTargetOSVersion: 10.13.0 390 | switchNMETAOverride: 391 | switchNetLibKey: 392 | switchSocketMemoryPoolSize: 6144 393 | switchSocketAllocatorPoolSize: 128 394 | switchSocketConcurrencyLimit: 14 395 | switchScreenResolutionBehavior: 2 396 | switchUseCPUProfiler: 0 397 | switchUseGOLDLinker: 0 398 | switchLTOSetting: 0 399 | switchApplicationID: 0x01004b9000490000 400 | switchNSODependencies: 401 | switchCompilerFlags: 402 | switchTitleNames_0: 403 | switchTitleNames_1: 404 | switchTitleNames_2: 405 | switchTitleNames_3: 406 | switchTitleNames_4: 407 | switchTitleNames_5: 408 | switchTitleNames_6: 409 | switchTitleNames_7: 410 | switchTitleNames_8: 411 | switchTitleNames_9: 412 | switchTitleNames_10: 413 | switchTitleNames_11: 414 | switchTitleNames_12: 415 | switchTitleNames_13: 416 | switchTitleNames_14: 417 | switchTitleNames_15: 418 | switchPublisherNames_0: 419 | switchPublisherNames_1: 420 | switchPublisherNames_2: 421 | switchPublisherNames_3: 422 | switchPublisherNames_4: 423 | switchPublisherNames_5: 424 | switchPublisherNames_6: 425 | switchPublisherNames_7: 426 | switchPublisherNames_8: 427 | switchPublisherNames_9: 428 | switchPublisherNames_10: 429 | switchPublisherNames_11: 430 | switchPublisherNames_12: 431 | switchPublisherNames_13: 432 | switchPublisherNames_14: 433 | switchPublisherNames_15: 434 | switchIcons_0: {fileID: 0} 435 | switchIcons_1: {fileID: 0} 436 | switchIcons_2: {fileID: 0} 437 | switchIcons_3: {fileID: 0} 438 | switchIcons_4: {fileID: 0} 439 | switchIcons_5: {fileID: 0} 440 | switchIcons_6: {fileID: 0} 441 | switchIcons_7: {fileID: 0} 442 | switchIcons_8: {fileID: 0} 443 | switchIcons_9: {fileID: 0} 444 | switchIcons_10: {fileID: 0} 445 | switchIcons_11: {fileID: 0} 446 | switchIcons_12: {fileID: 0} 447 | switchIcons_13: {fileID: 0} 448 | switchIcons_14: {fileID: 0} 449 | switchIcons_15: {fileID: 0} 450 | switchSmallIcons_0: {fileID: 0} 451 | switchSmallIcons_1: {fileID: 0} 452 | switchSmallIcons_2: {fileID: 0} 453 | switchSmallIcons_3: {fileID: 0} 454 | switchSmallIcons_4: {fileID: 0} 455 | switchSmallIcons_5: {fileID: 0} 456 | switchSmallIcons_6: {fileID: 0} 457 | switchSmallIcons_7: {fileID: 0} 458 | switchSmallIcons_8: {fileID: 0} 459 | switchSmallIcons_9: {fileID: 0} 460 | switchSmallIcons_10: {fileID: 0} 461 | switchSmallIcons_11: {fileID: 0} 462 | switchSmallIcons_12: {fileID: 0} 463 | switchSmallIcons_13: {fileID: 0} 464 | switchSmallIcons_14: {fileID: 0} 465 | switchSmallIcons_15: {fileID: 0} 466 | switchManualHTML: 467 | switchAccessibleURLs: 468 | switchLegalInformation: 469 | switchMainThreadStackSize: 1048576 470 | switchPresenceGroupId: 471 | switchLogoHandling: 0 472 | switchReleaseVersion: 0 473 | switchDisplayVersion: 1.0.0 474 | switchStartupUserAccount: 0 475 | switchSupportedLanguagesMask: 0 476 | switchLogoType: 0 477 | switchApplicationErrorCodeCategory: 478 | switchUserAccountSaveDataSize: 0 479 | switchUserAccountSaveDataJournalSize: 0 480 | switchApplicationAttribute: 0 481 | switchCardSpecSize: -1 482 | switchCardSpecClock: -1 483 | switchRatingsMask: 0 484 | switchRatingsInt_0: 0 485 | switchRatingsInt_1: 0 486 | switchRatingsInt_2: 0 487 | switchRatingsInt_3: 0 488 | switchRatingsInt_4: 0 489 | switchRatingsInt_5: 0 490 | switchRatingsInt_6: 0 491 | switchRatingsInt_7: 0 492 | switchRatingsInt_8: 0 493 | switchRatingsInt_9: 0 494 | switchRatingsInt_10: 0 495 | switchRatingsInt_11: 0 496 | switchRatingsInt_12: 0 497 | switchLocalCommunicationIds_0: 498 | switchLocalCommunicationIds_1: 499 | switchLocalCommunicationIds_2: 500 | switchLocalCommunicationIds_3: 501 | switchLocalCommunicationIds_4: 502 | switchLocalCommunicationIds_5: 503 | switchLocalCommunicationIds_6: 504 | switchLocalCommunicationIds_7: 505 | switchParentalControl: 0 506 | switchAllowsScreenshot: 1 507 | switchAllowsVideoCapturing: 1 508 | switchAllowsRuntimeAddOnContentInstall: 0 509 | switchDataLossConfirmation: 0 510 | switchUserAccountLockEnabled: 0 511 | switchSystemResourceMemory: 16777216 512 | switchSupportedNpadStyles: 22 513 | switchNativeFsCacheSize: 32 514 | switchIsHoldTypeHorizontal: 0 515 | switchSupportedNpadCount: 8 516 | switchEnableTouchScreen: 1 517 | switchSocketConfigEnabled: 0 518 | switchTcpInitialSendBufferSize: 32 519 | switchTcpInitialReceiveBufferSize: 64 520 | switchTcpAutoSendBufferSizeMax: 256 521 | switchTcpAutoReceiveBufferSizeMax: 256 522 | switchUdpSendBufferSize: 9 523 | switchUdpReceiveBufferSize: 42 524 | switchSocketBufferEfficiency: 4 525 | switchSocketInitializeEnabled: 1 526 | switchNetworkInterfaceManagerInitializeEnabled: 1 527 | switchPlayerConnectionEnabled: 1 528 | switchUseNewStyleFilepaths: 1 529 | switchUseLegacyFmodPriorities: 0 530 | switchUseMicroSleepForYield: 1 531 | switchEnableRamDiskSupport: 0 532 | switchMicroSleepForYieldTime: 25 533 | switchRamDiskSpaceSize: 12 534 | ps4NPAgeRating: 12 535 | ps4NPTitleSecret: 536 | ps4NPTrophyPackPath: 537 | ps4ParentalLevel: 11 538 | ps4ContentID: ED1633-NPXX51362_00-0000000000000000 539 | ps4Category: 0 540 | ps4MasterVersion: 01.00 541 | ps4AppVersion: 01.00 542 | ps4AppType: 0 543 | ps4ParamSfxPath: 544 | ps4VideoOutPixelFormat: 0 545 | ps4VideoOutInitialWidth: 1920 546 | ps4VideoOutBaseModeInitialWidth: 1920 547 | ps4VideoOutReprojectionRate: 60 548 | ps4PronunciationXMLPath: 549 | ps4PronunciationSIGPath: 550 | ps4BackgroundImagePath: 551 | ps4StartupImagePath: 552 | ps4StartupImagesFolder: 553 | ps4IconImagesFolder: 554 | ps4SaveDataImagePath: 555 | ps4SdkOverride: 556 | ps4BGMPath: 557 | ps4ShareFilePath: 558 | ps4ShareOverlayImagePath: 559 | ps4PrivacyGuardImagePath: 560 | ps4ExtraSceSysFile: 561 | ps4NPtitleDatPath: 562 | ps4RemotePlayKeyAssignment: -1 563 | ps4RemotePlayKeyMappingDir: 564 | ps4PlayTogetherPlayerCount: 0 565 | ps4EnterButtonAssignment: 1 566 | ps4ApplicationParam1: 0 567 | ps4ApplicationParam2: 0 568 | ps4ApplicationParam3: 0 569 | ps4ApplicationParam4: 0 570 | ps4DownloadDataSize: 0 571 | ps4GarlicHeapSize: 2048 572 | ps4ProGarlicHeapSize: 2560 573 | playerPrefsMaxSize: 32768 574 | ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ 575 | ps4pnSessions: 1 576 | ps4pnPresence: 1 577 | ps4pnFriends: 1 578 | ps4pnGameCustomData: 1 579 | playerPrefsSupport: 0 580 | enableApplicationExit: 0 581 | resetTempFolder: 1 582 | restrictedAudioUsageRights: 0 583 | ps4UseResolutionFallback: 0 584 | ps4ReprojectionSupport: 0 585 | ps4UseAudio3dBackend: 0 586 | ps4UseLowGarlicFragmentationMode: 1 587 | ps4SocialScreenEnabled: 0 588 | ps4ScriptOptimizationLevel: 0 589 | ps4Audio3dVirtualSpeakerCount: 14 590 | ps4attribCpuUsage: 0 591 | ps4PatchPkgPath: 592 | ps4PatchLatestPkgPath: 593 | ps4PatchChangeinfoPath: 594 | ps4PatchDayOne: 0 595 | ps4attribUserManagement: 0 596 | ps4attribMoveSupport: 0 597 | ps4attrib3DSupport: 0 598 | ps4attribShareSupport: 0 599 | ps4attribExclusiveVR: 0 600 | ps4disableAutoHideSplash: 0 601 | ps4videoRecordingFeaturesUsed: 0 602 | ps4contentSearchFeaturesUsed: 0 603 | ps4CompatibilityPS5: 0 604 | ps4AllowPS5Detection: 0 605 | ps4GPU800MHz: 1 606 | ps4attribEyeToEyeDistanceSettingVR: 0 607 | ps4IncludedModules: [] 608 | ps4attribVROutputEnabled: 0 609 | monoEnv: 610 | splashScreenBackgroundSourceLandscape: {fileID: 0} 611 | splashScreenBackgroundSourcePortrait: {fileID: 0} 612 | blurSplashScreenBackground: 1 613 | spritePackerPolicy: 614 | webGLMemorySize: 16 615 | webGLExceptionSupport: 1 616 | webGLNameFilesAsHashes: 0 617 | webGLShowDiagnostics: 0 618 | webGLDataCaching: 1 619 | webGLDebugSymbols: 0 620 | webGLEmscriptenArgs: 621 | webGLModulesDirectory: 622 | webGLTemplate: APPLICATION:Default 623 | webGLAnalyzeBuildSize: 0 624 | webGLUseEmbeddedResources: 0 625 | webGLCompressionFormat: 1 626 | webGLWasmArithmeticExceptions: 0 627 | webGLLinkerTarget: 1 628 | webGLThreadsSupport: 0 629 | webGLDecompressionFallback: 0 630 | webGLInitialMemorySize: 32 631 | webGLMaximumMemorySize: 2048 632 | webGLMemoryGrowthMode: 2 633 | webGLMemoryLinearGrowthStep: 16 634 | webGLMemoryGeometricGrowthStep: 0.2 635 | webGLMemoryGeometricGrowthCap: 96 636 | webGLPowerPreference: 2 637 | scriptingDefineSymbols: {} 638 | additionalCompilerArguments: {} 639 | platformArchitecture: {} 640 | scriptingBackend: {} 641 | il2cppCompilerConfiguration: {} 642 | il2cppCodeGeneration: {} 643 | managedStrippingLevel: 644 | EmbeddedLinux: 1 645 | GameCoreScarlett: 1 646 | GameCoreXboxOne: 1 647 | Nintendo Switch: 1 648 | PS4: 1 649 | PS5: 1 650 | QNX: 1 651 | Stadia: 1 652 | WebGL: 1 653 | Windows Store Apps: 1 654 | XboxOne: 1 655 | iPhone: 1 656 | tvOS: 1 657 | incrementalIl2cppBuild: {} 658 | suppressCommonWarnings: 1 659 | allowUnsafeCode: 0 660 | useDeterministicCompilation: 1 661 | selectedPlatform: 0 662 | additionalIl2CppArgs: 663 | scriptingRuntimeVersion: 1 664 | gcIncremental: 1 665 | gcWBarrierValidation: 0 666 | apiCompatibilityLevelPerPlatform: {} 667 | m_RenderingPath: 1 668 | m_MobileRenderingPath: 1 669 | metroPackageName: solo2yolo 670 | metroPackageVersion: 671 | metroCertificatePath: 672 | metroCertificatePassword: 673 | metroCertificateSubject: 674 | metroCertificateIssuer: 675 | metroCertificateNotAfter: 0000000000000000 676 | metroApplicationDescription: solo2yolo 677 | wsaImages: {} 678 | metroTileShortName: 679 | metroTileShowName: 0 680 | metroMediumTileShowName: 0 681 | metroLargeTileShowName: 0 682 | metroWideTileShowName: 0 683 | metroSupportStreamingInstall: 0 684 | metroLastRequiredScene: 0 685 | metroDefaultTileSize: 1 686 | metroTileForegroundText: 2 687 | metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} 688 | metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, a: 1} 689 | metroSplashScreenUseBackgroundColor: 0 690 | platformCapabilities: {} 691 | metroTargetDeviceFamilies: {} 692 | metroFTAName: 693 | metroFTAFileTypes: [] 694 | metroProtocolName: 695 | vcxProjDefaultLanguage: 696 | XboxOneProductId: 697 | XboxOneUpdateKey: 698 | XboxOneSandboxId: 699 | XboxOneContentId: 700 | XboxOneTitleId: 701 | XboxOneSCId: 702 | XboxOneGameOsOverridePath: 703 | XboxOnePackagingOverridePath: 704 | XboxOneAppManifestOverridePath: 705 | XboxOneVersion: 1.0.0.0 706 | XboxOnePackageEncryption: 0 707 | XboxOnePackageUpdateGranularity: 2 708 | XboxOneDescription: 709 | XboxOneLanguage: 710 | - enus 711 | XboxOneCapability: [] 712 | XboxOneGameRating: {} 713 | XboxOneIsContentPackage: 0 714 | XboxOneEnhancedXboxCompatibilityMode: 0 715 | XboxOneEnableGPUVariability: 1 716 | XboxOneSockets: {} 717 | XboxOneSplashScreen: {fileID: 0} 718 | XboxOneAllowedProductIds: [] 719 | XboxOnePersistentLocalStorageSize: 0 720 | XboxOneXTitleMemory: 8 721 | XboxOneOverrideIdentityName: 722 | XboxOneOverrideIdentityPublisher: 723 | vrEditorSettings: {} 724 | cloudServicesEnabled: 725 | UNet: 1 726 | luminIcon: 727 | m_Name: 728 | m_ModelFolderPath: 729 | m_PortalFolderPath: 730 | luminCert: 731 | m_CertPath: 732 | m_SignPackage: 1 733 | luminIsChannelApp: 0 734 | luminVersion: 735 | m_VersionCode: 1 736 | m_VersionName: 737 | hmiPlayerDataPath: 738 | hmiForceSRGBBlit: 1 739 | embeddedLinuxEnableGamepadInput: 1 740 | hmiLogStartupTiming: 0 741 | hmiCpuConfiguration: 742 | apiCompatibilityLevel: 6 743 | activeInputHandler: 0 744 | windowsGamepadBackendHint: 0 745 | cloudProjectId: 746 | framebufferDepthMemorylessMode: 0 747 | qualitySettingsNames: [] 748 | projectName: 749 | organizationId: 750 | cloudEnabled: 0 751 | legacyClampBlendShapeWeights: 0 752 | hmiLoadingImage: {fileID: 0} 753 | platformRequiresReadableAssets: 0 754 | virtualTexturingSupportEnabled: 0 755 | insecureHttpOption: 0 756 | --------------------------------------------------------------------------------