@@ -17,8 +17,8 @@ MonoBehaviour: | |||
numStackedVectorObservations: 1 | |||
vectorActionSize: 04000000 | |||
cameraResolutions: | |||
- width: 320 | |||
height: 120 | |||
- width: 80 | |||
height: 30 | |||
blackAndWhite: 0 | |||
vectorActionDescriptions: | |||
- |
@@ -974,6 +974,7 @@ MonoBehaviour: | |||
m_EditorClassIdentifier: | |||
renderTextureCropped: {fileID: 8400000, guid: 8bf12f4401860c043a77209428e97b29, | |||
type: 2} | |||
processedImageRenderer: {fileID: 1863707383} | |||
processedImageRendererCropped: {fileID: 712179489} | |||
--- !u!1 &918537782 | |||
GameObject: | |||
@@ -1104,14 +1105,14 @@ MonoBehaviour: | |||
- {fileID: 11400000, guid: 0d9d5ce547064a648b466ad7f208cf3d, type: 2} | |||
maxSteps: 1000 | |||
trainingConfiguration: | |||
width: 84 | |||
height: 84 | |||
width: 80 | |||
height: 30 | |||
qualityLevel: 1 | |||
timeScale: 10 | |||
targetFrameRate: -1 | |||
inferenceConfiguration: | |||
width: 84 | |||
height: 84 | |||
width: 320 | |||
height: 120 | |||
qualityLevel: 5 | |||
timeScale: 1 | |||
targetFrameRate: 60 | |||
@@ -1684,6 +1685,72 @@ MeshFilter: | |||
m_PrefabAsset: {fileID: 0} | |||
m_GameObject: {fileID: 1863707380} | |||
m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} | |||
--- !u!1 &1957393249 | |||
GameObject: | |||
m_ObjectHideFlags: 0 | |||
m_CorrespondingSourceObject: {fileID: 0} | |||
m_PrefabInstance: {fileID: 0} | |||
m_PrefabAsset: {fileID: 0} | |||
serializedVersion: 6 | |||
m_Component: | |||
- component: {fileID: 1957393252} | |||
- component: {fileID: 1957393251} | |||
- component: {fileID: 1957393250} | |||
m_Layer: 0 | |||
m_Name: EventSystem | |||
m_TagString: Untagged | |||
m_Icon: {fileID: 0} | |||
m_NavMeshLayer: 0 | |||
m_StaticEditorFlags: 0 | |||
m_IsActive: 1 | |||
--- !u!114 &1957393250 | |||
MonoBehaviour: | |||
m_ObjectHideFlags: 0 | |||
m_CorrespondingSourceObject: {fileID: 0} | |||
m_PrefabInstance: {fileID: 0} | |||
m_PrefabAsset: {fileID: 0} | |||
m_GameObject: {fileID: 1957393249} | |||
m_Enabled: 1 | |||
m_EditorHideFlags: 0 | |||
m_Script: {fileID: 1077351063, guid: f70555f144d8491a825f0804e09c671c, type: 3} | |||
m_Name: | |||
m_EditorClassIdentifier: | |||
m_HorizontalAxis: Horizontal | |||
m_VerticalAxis: Vertical | |||
m_SubmitButton: Submit | |||
m_CancelButton: Cancel | |||
m_InputActionsPerSecond: 10 | |||
m_RepeatDelay: 0.5 | |||
m_ForceModuleActive: 0 | |||
--- !u!114 &1957393251 | |||
MonoBehaviour: | |||
m_ObjectHideFlags: 0 | |||
m_CorrespondingSourceObject: {fileID: 0} | |||
m_PrefabInstance: {fileID: 0} | |||
m_PrefabAsset: {fileID: 0} | |||
m_GameObject: {fileID: 1957393249} | |||
m_Enabled: 1 | |||
m_EditorHideFlags: 0 | |||
m_Script: {fileID: -619905303, guid: f70555f144d8491a825f0804e09c671c, type: 3} | |||
m_Name: | |||
m_EditorClassIdentifier: | |||
m_FirstSelected: {fileID: 0} | |||
m_sendNavigationEvents: 1 | |||
m_DragThreshold: 10 | |||
--- !u!4 &1957393252 | |||
Transform: | |||
m_ObjectHideFlags: 0 | |||
m_CorrespondingSourceObject: {fileID: 0} | |||
m_PrefabInstance: {fileID: 0} | |||
m_PrefabAsset: {fileID: 0} | |||
m_GameObject: {fileID: 1957393249} | |||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} | |||
m_LocalPosition: {x: 0, y: 0, z: 0} | |||
m_LocalScale: {x: 1, y: 1, z: 1} | |||
m_Children: [] | |||
m_Father: {fileID: 0} | |||
m_RootOrder: 5 | |||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} | |||
--- !u!1 &2078653367 | |||
GameObject: | |||
m_ObjectHideFlags: 0 | |||
@@ -1827,7 +1894,7 @@ MonoBehaviour: | |||
agentCameras: [] | |||
agentRenderTextures: | |||
- {fileID: 8400000, guid: 8bf12f4401860c043a77209428e97b29, type: 2} | |||
maxStep: 1000 | |||
maxStep: 5000 | |||
resetOnDone: 1 | |||
onDemandDecision: 1 | |||
numberOfActionsBetweenDecisions: 1 |
@@ -11,8 +11,8 @@ public class ImageProcessor : MonoBehaviour | |||
public RenderTexture renderTextureCropped; | |||
[Header("Debug Helper")] | |||
//[Tooltip("Reference to the MeshRenderer that will show the processed Image from Cozmo")] | |||
//public MeshRenderer processedImageRenderer; | |||
[Tooltip("Reference to the MeshRenderer that will show the processed Image from Cozmo")] | |||
public MeshRenderer processedImageRenderer; | |||
[Tooltip("Reference to the MeshRenderer that will show the processed and cropped Image from Cozmo")] | |||
public MeshRenderer processedImageRendererCropped; | |||
@@ -34,6 +34,10 @@ public class ImageProcessor : MonoBehaviour | |||
private int croppedImHeight = 120; // Height of the cropped camera image from the virtual cozmo | |||
private Camera textureCamera; // Virtual Cozmo camera | |||
private Texture2D firstTexture; | |||
private void Start() | |||
{ | |||
// Get reference to the cozmo camera | |||
@@ -42,10 +46,10 @@ public class ImageProcessor : MonoBehaviour | |||
// Set image widths and heights based on the given RenderTextures | |||
imWidth = textureCamera.targetTexture.width; | |||
imHeight = textureCamera.targetTexture.height; | |||
croppedImHeight = renderTextureCropped.height; | |||
//croppedImHeight = renderTextureCropped.height; | |||
//assign the processed targetTexture to the renderer to display the image | |||
//processedImageRenderer.material.mainTexture = textureCamera.targetTexture; | |||
processedImageRenderer.material.mainTexture = textureCamera.targetTexture; | |||
processedImageRendererCropped.material.mainTexture = renderTextureCropped; | |||
// initialize video / image with given size | |||
@@ -53,14 +57,37 @@ public class ImageProcessor : MonoBehaviour | |||
videoSourceImageData = new Vec3b[imHeight * imWidth]; | |||
cannyImage = new Mat(imHeight, imWidth, MatType.CV_8UC1); | |||
cannyImageData = new byte[croppedImHeight * imWidth]; | |||
firstTexture = new Texture2D(imWidth, imHeight, TextureFormat.RGBA32, true, true); | |||
processedTexture = new Texture2D(imWidth, croppedImHeight, TextureFormat.RGBA32, true, true); | |||
} | |||
/// <summary> | |||
/// Gets called when a new image arrives from the camera this script lies on | |||
/// </summary> | |||
/// <param name="source"></param> | |||
/// <param name="destination"></param> | |||
private void OnRenderImage(RenderTexture source, RenderTexture destination) | |||
///// <summary> | |||
///// Gets called when a new image arrives from the camera this script lies on | |||
///// </summary> | |||
///// <param name="source"></param> | |||
///// <param name="destination"></param> | |||
//private void OnRenderImage(RenderTexture source, RenderTexture destination) | |||
//{ | |||
// Texture2D tex = RenderTextureToTexture2D(source); | |||
// videoSourceImage = TextureToMat(tex); | |||
// cannyImage = ProcessImage(videoSourceImage); | |||
// cannyImage = CropImage(cannyImage); | |||
// CenterOfGravityTest(cannyImage); | |||
// processedTexture = MatToTexture(cannyImage); | |||
// //processedTexture.Resize(80, 30); | |||
// //processedTexture.Apply(); | |||
// //Graphics.Blit(processedTexture, destination); | |||
// Graphics.Blit(processedTexture, renderTextureCropped); | |||
//} | |||
public void ProcessRenderTexture(RenderTexture source) | |||
{ | |||
ProcessRenderTexture(source, source); | |||
} | |||
public void ProcessRenderTexture(RenderTexture source, RenderTexture target) | |||
{ | |||
Texture2D tex = RenderTextureToTexture2D(source); | |||
videoSourceImage = TextureToMat(tex); | |||
@@ -68,7 +95,35 @@ public class ImageProcessor : MonoBehaviour | |||
cannyImage = CropImage(cannyImage); | |||
CenterOfGravityTest(cannyImage); | |||
processedTexture = MatToTexture(cannyImage); | |||
//processedTexture.Resize(80, 30); | |||
//processedTexture.Apply(); | |||
//Graphics.Blit(processedTexture, destination); | |||
Graphics.Blit(processedTexture, target); | |||
} | |||
//public void ProcessRenderTexture_NEW(RenderTexture source, RenderTexture target) | |||
//{ | |||
// RenderTextureToTexture2D_NEW(source); | |||
// TextureToMat_NEW(firstTexture); | |||
// ProcessImage_NEW(videoSourceImage); | |||
// cannyImage = CropImage(cannyImage); | |||
// CenterOfGravityTest(cannyImage); | |||
// MatToTexture_NEW(cannyImage); | |||
// //processedTexture.Resize(80, 30); | |||
// //processedTexture.Apply(); | |||
// //Graphics.Blit(processedTexture, destination); | |||
// Graphics.Blit(processedTexture, target); | |||
//} | |||
public void OnRenderImage(RenderTexture source, RenderTexture destination) | |||
{ | |||
RenderTextureToTexture2D_NEW(source); | |||
TextureToMat_NEW(firstTexture); | |||
ProcessImage_NEW(videoSourceImage); | |||
cannyImage = CropImage(cannyImage); | |||
CenterOfGravityTest(cannyImage); | |||
MatToTexture_NEW(cannyImage); | |||
Graphics.Blit(processedTexture, destination); | |||
Graphics.Blit(processedTexture, renderTextureCropped); | |||
} | |||
@@ -81,6 +136,15 @@ public class ImageProcessor : MonoBehaviour | |||
return croppedImage; | |||
} | |||
//// Crop image to just see the middle of the original image | |||
//private Mat CropImage_NEW(Mat image) | |||
//{ | |||
// //cut a fourth out of the top and bottom of the image | |||
// OpenCvSharp.Rect rectCroped = new OpenCvSharp.Rect(0, image.Height / 4, image.Width, image.Height / 2); | |||
// Mat croppedImage = new Mat(image, rectCroped); | |||
// return croppedImage; | |||
//} | |||
private Texture2D RenderTextureToTexture2D(RenderTexture rTex) | |||
{ | |||
Texture2D tex = new Texture2D(imWidth, imHeight, TextureFormat.RGBA32, true, true); | |||
@@ -90,6 +154,13 @@ public class ImageProcessor : MonoBehaviour | |||
return tex; | |||
} | |||
private void RenderTextureToTexture2D_NEW(RenderTexture rTex) | |||
{ | |||
RenderTexture.active = rTex; | |||
firstTexture.ReadPixels(new UnityEngine.Rect(0, 0, rTex.width, rTex.height), 0, 0); | |||
firstTexture.Apply(); | |||
} | |||
// Convert Unity Texture2D object to OpenCVSharp Mat object | |||
private Mat TextureToMat(Texture2D source) | |||
{ | |||
@@ -121,6 +192,36 @@ public class ImageProcessor : MonoBehaviour | |||
return tmpMat; | |||
} | |||
// Convert Unity Texture2D object to OpenCVSharp Mat object | |||
private void TextureToMat_NEW(Texture2D source) | |||
{ | |||
// Color32 array : r, g, b, a | |||
Color32[] c = source.GetPixels32(); | |||
// Parallel for loop | |||
// convert Color32 object to Vec3b object | |||
// Vec3b is the representation of pixel for Mat | |||
Parallel.For(0, imHeight, i => | |||
{ | |||
for (var j = 0; j < imWidth; j++) | |||
{ | |||
var col = c[j + i * imWidth]; | |||
var vec3 = new Vec3b | |||
{ | |||
Item0 = col.b, | |||
Item1 = col.g, | |||
Item2 = col.r | |||
}; | |||
// set pixel to an array | |||
videoSourceImageData[j + i * imWidth] = vec3; | |||
} | |||
}); | |||
// assign the Vec3b array to Mat | |||
videoSourceImage.SetArray(0, 0, videoSourceImageData); | |||
} | |||
// Simple example of canny edge detect | |||
private Mat ProcessImage(Mat _image) | |||
{ | |||
@@ -129,6 +230,12 @@ public class ImageProcessor : MonoBehaviour | |||
return cannyImg; | |||
} | |||
// Simple example of canny edge detect | |||
private void ProcessImage_NEW(Mat _image) | |||
{ | |||
Cv2.Canny(_image, cannyImage, 100, 100); | |||
} | |||
// Convert OpenCVSharp Mat object to Unity Texture2D object | |||
private Texture2D MatToTexture(Mat mat) | |||
{ | |||
@@ -161,6 +268,37 @@ public class ImageProcessor : MonoBehaviour | |||
return texture; | |||
} | |||
// Convert OpenCVSharp Mat object to Unity Texture2D object | |||
private void MatToTexture_NEW(Mat mat) | |||
{ | |||
// cannyImageData is byte array, because canny image is grayscale | |||
mat.GetArray(0, 0, cannyImageData); | |||
// create Color32 array that can be assigned to Texture2D directly | |||
Color32[] c = new Color32[croppedImHeight * imWidth]; | |||
// parallel for loop | |||
Parallel.For(0, croppedImHeight, i => | |||
{ | |||
for (var j = 0; j < imWidth; j++) | |||
{ | |||
byte vec = cannyImageData[j + i * imWidth]; | |||
var color32 = new Color32 | |||
{ | |||
r = vec, | |||
g = vec, | |||
b = vec, | |||
a = 0 | |||
}; | |||
c[j + i * imWidth] = color32; | |||
} | |||
}); | |||
processedTexture.SetPixels32(c); | |||
// to update the texture, OpenGL manner | |||
processedTexture.Apply(); | |||
} | |||
private void CenterOfGravityTest(Mat processedImage) | |||
{ |
@@ -12,6 +12,7 @@ public class CozmoAcademy : Academy | |||
public override void AcademyReset() | |||
{ | |||
cozmo.transform.position = startPoint.position; | |||
cozmo.transform.rotation = startPoint.rotation; | |||
} | |||
//private void Update() |
@@ -83,6 +83,7 @@ public class CozmoAgent : Agent | |||
if (renderCamera != null) | |||
{ | |||
renderCamera.Render(); | |||
//onRenderImageTest.ProcessRenderTexture_NEW(renderCamera.targetTexture, onRenderImageTest.renderTextureCropped); | |||
} | |||
@@ -102,6 +103,8 @@ public class CozmoAgent : Agent | |||
SetReward(-1); | |||
print("Reward: -1"); | |||
} | |||
onRenderImageTest.enabled = false; | |||
} | |||
// to be implemented by the developer | |||
@@ -129,6 +132,7 @@ public class CozmoAgent : Agent | |||
if (!academy.GetIsInference()) | |||
{ | |||
//onRenderImageTest.ProcessRenderTexture_NEW(renderCamera.targetTexture, onRenderImageTest.renderTextureCropped); | |||
RequestDecision(); | |||
} | |||
else | |||
@@ -136,6 +140,7 @@ public class CozmoAgent : Agent | |||
if (timeSinceDecision >= timeBetweenDecisionsAtInference) | |||
{ | |||
timeSinceDecision = 0f; | |||
//onRenderImageTest.ProcessRenderTexture_NEW(renderCamera.targetTexture, onRenderImageTest.renderTextureCropped); | |||
RequestDecision(); | |||
} | |||
else |
@@ -12,8 +12,8 @@ RenderTexture: | |||
Hash: 00000000000000000000000000000000 | |||
m_ForcedFallbackFormat: 4 | |||
m_DownscaleFallback: 0 | |||
m_Width: 320 | |||
m_Height: 120 | |||
m_Width: 80 | |||
m_Height: 30 | |||
m_AntiAliasing: 1 | |||
m_DepthFormat: 2 | |||
m_ColorFormat: 0 |
@@ -136,7 +136,7 @@ | |||
}, | |||
{ | |||
"data": { | |||
"image/png": "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\n", | |||
"image/png": "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\n", | |||
"text/plain": [ | |||
"<Figure size 432x288 with 1 Axes>" | |||
] | |||
@@ -195,7 +195,7 @@ | |||
"name": "stdout", | |||
"output_type": "stream", | |||
"text": [ | |||
"Total reward this episode: -699.7999988794327\n" | |||
"Total reward this episode: -366.90000158548355\n" | |||
] | |||
}, | |||
{ |