#WinML – Creando una #Windows10 App con #YOLO para reconocer objetos (4 de 4)

Crear una Windows 10 UWP App y utilizar YoloV2 para reconocer objetos


Buenas!

Si retomamos el post anterior veremos que ya tenemos un proceso en tiempo real del video de la webcam analizado con Tiny-YoloV2. El modelo retorna resultados en una imagen de tamaño 416×416, y es por eso por lo que la imagen anterior el Frame de la persona se ve con un aspecto extraño.

01

El tratamiento para que el output se adapte al tamaño del control del WebCam puede solucionarse con 2 líneas de código.

 

 


private uint _overlayCanvasActualWidth;
private uint _overlayCanvasActualHeight;
private void DrawYoloBoundingBox(YoloBoundingBox box, Canvas overlayCanvas)
{
// get current webcam and canvas size
_overlayCanvasActualWidth = (uint)YoloCanvas.ActualWidth;
_overlayCanvasActualHeight = (uint)YoloCanvas.ActualHeight;
// process output boxes
var x = (uint)Math.Max(box.X, 0);
var y = (uint)Math.Max(box.Y, 0);
var w = (uint)Math.Min(overlayCanvas.ActualWidth – x, box.Width);
var h = (uint)Math.Min(overlayCanvas.ActualHeight – y, box.Height);
// fit to current canvas and webcam size
x = _overlayCanvasActualWidth * x / 416;
y = _overlayCanvasActualHeight * y / 416;
w = _overlayCanvasActualWidth * w / 416;
h = _overlayCanvasActualHeight * h / 416;

Y de esta forma, ya podemos dibujar los Frames con el aspecto correcto. En la siguiente imagen es posible ver como se detecta una persona, con un bajo score de precisión y como además uno de los cuadros de la pared se lo detecta como un monitor.

02

A partir de aquí se pueden optimizar muchas cosas, por ejemplo, solo tomar el valor del tamaño

del canvas en el Resize de la App.

 

 


protected override async void OnNavigatedTo(NavigationEventArgs e)
{
LoadYoloOnnxModel();
Window.Current.SizeChanged += Current_SizeChanged;
await CameraPreview.StartAsync();
CameraPreview.CameraHelper.FrameArrived += CameraHelper_FrameArrived;
}
private void Current_SizeChanged(object sender, WindowSizeChangedEventArgs e)
{
_yoloCanvasActualWidth = (uint)YoloCanvas.ActualWidth;
_yoloCanvasActualHeight = (uint)YoloCanvas.ActualHeight;
}

En el ejemplo final, he agregado además un indicador visual que muestra la cantidad de frames procesados por segundo y el tamanio real con el que se esta trabajando.

03

El código completo del ejemplo se puede descargar desde

https://github.com/elbruno/Blog/tree/master/20180704%20UwpMLNet%20TinyYoloV2

Happy Coding!

Saludos @ Mississauga

 

El Bruno

References