void Update() { if (debugWaitedFrames++ == debugNumFramesToWait) { debugWaitedFrames = 0; } else { return; } if (Settings.config.datasetOptions.debugOptions.drawDetectionRect) { cameraObject.GetComponent <DetectionRectDraw>().doDrawRect = true; } switch (generationState) { case GenerationState.SingleObjectsSetup: { ClearSceneFromObjects(); if (Settings.config.datasetOptions.classObstacleFrameNum == 0 && Settings.config.datasetOptions.classDetectedFrameNum == 0) { generationState = GenerationState.MultipleObjectsSetup; return; } Instantiate(selectedObjects[currentObjectIndex]); Debug.Log("Clearing scene for S.O. Creating object index: " + currentObjectIndex); generationState = GenerationState.SingleObjects; var info = selectedObjects[currentObjectIndex].GetComponent <DatasetObjectInfo>(); if (IncludeInDataset(selectedObjects[currentObjectIndex])) { counter = Settings.config.datasetOptions.classDetectedFrameNum / objectsNumInClass[info.className]; } else { counter = Settings.config.datasetOptions.classObstacleFrameNum * Settings.config.datasetOptions.classNames.Count / objectsNumInClass["OBSTACLE"]; } for (int i = 0; i < selectedObjects.Count; i++) { string className = selectedObjects[i].GetComponent <DatasetObjectInfo>().className; if (IncludeInDataset(selectedObjects[i])) { Directory.CreateDirectory(Settings.config.datasetOptions.datasetDirPath + @"\" + className); } else { Directory.CreateDirectory(Settings.config.datasetOptions.datasetDirPath + @"\" + "obstacle"); } } break; } case GenerationState.SingleObjects: { GameObject singleObject = GameObject.FindGameObjectWithTag("ToDetect"); string className = singleObject.GetComponent <DatasetObjectInfo>().className; if (!IncludeInDataset(singleObject)) { className = "obstacle"; } singleObject.transform.rotation = Quaternion.Euler(Random.Range(0f, 360f), Random.Range(0f, 360f), Random.Range(0f, 0f)); singleObject.transform.position = DatasetObjectInfo.GetRandomWorldPosistionInBoundary(singleObject, selectedWaterContainer); if (Random.value < Settings.config.datasetOptions.percentClosest) { cameraObject.transform.position = DatasetObjectInfo.GetRandomWorldPosistionInBoundaryClosest(cameraObject, selectedWaterContainer, singleObject); } else { cameraObject.transform.position = DatasetObjectInfo.GetRandomWorldPosistionInBoundary(cameraObject, selectedWaterContainer); } LookAtTargetRandomly(singleObject, cameraObject, Settings.config.datasetOptions.cameraLookAtObjectPitchOffset, Settings.config.datasetOptions.cameraLookAtObjectYawOffset, Settings.config.datasetOptions.cameraLookAtObjectRollOffset); var detector = new Detector(); detector.Detect(cameraObject.GetComponent <Camera>()); if (detector.detection[0].visible && detector.detection[0].fill >= Settings.config.datasetOptions.minObjectFill && (singleObject.transform.position - cameraObject.transform.position).magnitude >= Settings.config.datasetOptions.minCameraDistanceToObject && (singleObject.transform.position - cameraObject.transform.position).magnitude <= Settings.config.datasetOptions.maxCameraDistanceToObject && !DatasetObjectInfo.BoundaryIsColliding(cameraObject, singleObject)) { string datasetRootPath = Settings.config.datasetOptions.datasetDirPath; string txtFileName = datasetRootPath + @"/" + className + @"/" + createdFramesPerClass[className].ToString() + ".txt"; string pngFileName = datasetRootPath + @"/" + className + @"/" + createdFramesPerClass[className].ToString() + ".png"; string trainFileName = datasetRootPath + @"/train.txt"; if (IncludeInDataset(detector.detection[0].gameObject)) { File.WriteAllText(txtFileName, detector.detection[0].GetTextInfo()); } else { File.WriteAllText(txtFileName, ""); } File.AppendAllText(trainFileName, pngFileName + System.Environment.NewLine); if (!Settings.config.datasetOptions.debugOptions.disableScreenshot) { ScreenCapture.CaptureScreenshot(System.IO.Directory.GetCurrentDirectory() + "/" + pngFileName); } createdFramesPerClass[className]++; // Debug.Log("detected " + createdFramesPerClass[className] + "/" + Settings.config.datasetOptions.objectVisibleFrameNum * selectedObjects.Count); Debug.Log("detected " + createdFramesPerClass[className] + "/" + 7 * selectedObjects.Count); createdTypeFrames++; counter--; if (Settings.config.datasetOptions.debugOptions.logDetection) { File.AppendAllText(datasetRootPath + @"/log.dat", detector.detection[0].distance + " " + detector.detection[0].fill + System.Environment.NewLine); } } StartCoroutine(RandomizeGraphics(cameraObject.GetComponent <Camera>())); if (counter <= 0) { Debug.Log("Finished object index:" + currentObjectIndex + " " + (currentObjectIndex + 1) + "/" + selectedObjects.Count); generationState = GenerationState.SingleObjectsSetup; if (++currentObjectIndex >= selectedObjects.Count) { Debug.Log("Finished all single objects"); generationState = GenerationState.MultipleObjectsSetup; } } } break; case GenerationState.MultipleObjectsSetup: { ClearSceneFromObjects(); // if (Settings.config.datasetOptions.objectMultipleFrameNum == 0) /* if (1 == 0) * { * generationState = GenerationState.NoObjectsSetup; * return; TODO * }*/ Debug.Log("Cleared scene for M.O."); randomObjectsInScene = new List <GameObject>(); int TODOrandomObjectsNum = 20; for (int i = 0; i < TODOrandomObjectsNum; i++) { var randomObject = Instantiate(selectedObjects[Random.Range(0, selectedObjects.Count)]); randomObject.transform.rotation = Quaternion.Euler(Random.Range(0f, 360f), Random.Range(0f, 360f), Random.Range(0f, 0f)); randomObject.transform.position = DatasetObjectInfo.GetRandomWorldPosistionInBoundary(randomObject, selectedWaterContainer); randomObjectsInScene.Add(randomObject); } counter = Settings.config.datasetOptions.classMultipleFrameNum * Settings.config.datasetOptions.classNames.Count; if (!Directory.Exists(Settings.config.datasetOptions.datasetDirPath + @"/multiple")) { Directory.CreateDirectory(Settings.config.datasetOptions.datasetDirPath + @"/multiple"); } generationState = GenerationState.MultipleObjects; } break; case GenerationState.MultipleObjects: { if (counter <= 0) { generationState = GenerationState.NoObjectsSetup; return; } // int detectedVisibleObjectsNum = 0; foreach (var obj in randomObjectsInScene) { obj.SetActive(Random.value > 0.5f); if (!obj.activeSelf) { continue; } obj.transform.rotation = Quaternion.Euler(Random.Range(0f, 360f), Random.Range(0f, 360f), Random.Range(0f, 0f)); obj.transform.position = DatasetObjectInfo.GetRandomWorldPosistionInBoundary(obj, selectedWaterContainer); } cameraObject.transform.position = DatasetObjectInfo.GetRandomWorldPosistionInBoundary(cameraObject, selectedWaterContainer); LookRandomly(cameraObject, 20f, 180f, 30f); StartCoroutine(RandomizeGraphics(cameraObject.GetComponent <Camera>())); var detector = new Detector(); string detectedObjectsText = ""; foreach (var info in detector.Detect(cameraObject.GetComponent <Camera>())) { if (!info.visible || info.fill < Settings.config.datasetOptions.minObjectFill || DatasetObjectInfo.BoundaryIsColliding(cameraObject, info.gameObject)) { continue; //TODO sprawdz nową kolizję } if (IncludeInDataset(info.gameObject)) { detectedObjectsText += info.GetTextInfo() + System.Environment.NewLine; } detectedVisibleObjectsNum++; } if (detectedVisibleObjectsNum >= Settings.config.datasetOptions.minVisibleMultipleObjectsNum) { string datasetRootPath = Settings.config.datasetOptions.datasetDirPath; string txtFileName = datasetRootPath + @"/" + "multiple" + @"/" + createdFramesPerClass["multiple"].ToString() + ".txt"; string pngFileName = datasetRootPath + @"/" + "multiple" + @"/" + createdFramesPerClass["multiple"].ToString() + ".png"; string trainFileName = datasetRootPath + @"/train.txt"; File.WriteAllText(txtFileName, detectedObjectsText); File.AppendAllText(trainFileName, pngFileName + System.Environment.NewLine); ScreenCapture.CaptureScreenshot(System.IO.Directory.GetCurrentDirectory() + "/" + pngFileName); createdFramesPerClass["multiple"]++; counter--; } break; } case GenerationState.NoObjectsSetup: { ClearSceneFromObjects(); if (Settings.config.datasetOptions.classBlankFrameNum == 0) { generationState = GenerationState.Finished; return; } counter = Settings.config.datasetOptions.classBlankFrameNum * Settings.config.datasetOptions.classNames.Count; generationState = GenerationState.NoObjects; if (!Directory.Exists(Settings.config.datasetOptions.datasetDirPath + @"/blank")) { Directory.CreateDirectory(Settings.config.datasetOptions.datasetDirPath + @"/blank"); } break; } case GenerationState.NoObjects: { StartCoroutine(RandomizeGraphics(cameraObject.GetComponent <Camera>())); cameraObject.transform.position = DatasetObjectInfo.GetRandomWorldPosistionInBoundary(cameraObject, selectedWaterContainer); LookRandomly(cameraObject, Settings.config.datasetOptions.cameraLookRandomlyPitchOffset, Random.Range(0f, 360f), Settings.config.datasetOptions.cameraLookRandomlyRollOffset); string datasetRootPath = Settings.config.datasetOptions.datasetDirPath; string txtFileName = datasetRootPath + @"/" + "blank" + @"/" + createdFramesPerClass["blank"].ToString() + ".txt"; string pngFileName = datasetRootPath + @"/" + "blank" + @"/" + createdFramesPerClass["blank"].ToString() + ".png"; string trainFileName = datasetRootPath + @"/train.txt"; File.WriteAllText(txtFileName, ""); File.AppendAllText(trainFileName, pngFileName + System.Environment.NewLine); ScreenCapture.CaptureScreenshot(System.IO.Directory.GetCurrentDirectory() + "/" + pngFileName); createdFramesPerClass["blank"]++; } // if (createdFramesPerClass["blank"] >= Settings.config.datasetOptions.objectBlankFrameNum) if (--counter <= 0) { Debug.Log("Finished all no objects frames"); generationState = GenerationState.Finished; } break; case GenerationState.Finished: { ClearSceneFromObjects(); Destroy(selectedWaterContainer); #if UNITY_EDITOR UnityEditor.EditorApplication.isPlaying = false; #else Application.Quit(); #endif break; } default: break; } }
void Start() { QualitySettings.vSyncCount = 0; // VSync must be disabled Application.targetFrameRate = 35; mainThreadUpdateWorkers = new ConcurrentQueue <MainThreadUpdateWorker>(); if (Settings.config == null || Settings.config.mode == null) { SceneManager.LoadScene("Start"); return;//TODO take config } string selectedWaterContainer = Settings.config.simulationOptions.selectedWaterContainer; if (TryGetObjectByTypeName(selectedWaterContainer, out GameObject waterContainerPrefab)) { waterContainer = Instantiate(waterContainerPrefab, Vector3.zero, Quaternion.identity); } robot = Instantiate(robotPrefab, new Vector3(0, 2, 0), Quaternion.identity); robotController = robot.GetComponent <RobotController>(); PlaceRobotInStartZone(); List <string> selectedRandomObjectsNames = Settings.config.simulationOptions.selectedRandomObjects; foreach (string randomObjectName in selectedRandomObjectsNames) { if (TryGetObjectByTypeName(randomObjectName, out GameObject randomObjectPrefab)) { var randomObject = Instantiate(randomObjectPrefab); randomObject.transform.rotation = Quaternion.Euler(UnityEngine.Random.Range(0f, 360f), UnityEngine.Random.Range(0f, 360f), UnityEngine.Random.Range(0f, 0f)); randomObject.transform.position = DatasetObjectInfo.GetRandomWorldPosistionInBoundary(randomObject, waterContainer); } else { Debug.LogError(randomObjectName); } } Time.fixedDeltaTime = Settings.config.simulationOptions.fixedDeltaTime; /* * camera = Camera.main; * postDebug = cameraObject.GetComponent<PostProcessDebug>(); * postLayer = cameraObject.GetComponent<PostProcessLayer>(); * postVolume = cameraObject.GetComponent<PostProcessVolume>(); * SetGraphics();*/ bool TryGetObjectByTypeName(string typeName, out GameObject obj) { obj = null; for (int i = 0; i < knownObjects.Count; i++) { if (knownObjects[i].GetComponent <DatasetObjectInfo>().typeName.ToLower() == typeName.ToLower()) { obj = knownObjects[i]; return(true); } } return(false); } StartCoroutine(StartCapture()); wapiThread = new Thread(WAPIRecv) { IsBackground = true }; wapiThread.Start(); JsonSerializer.ToJsonString(GetDetection()); //No idea why first first call takes 1 second, leave it for performance }