Tracking(rastreo,seguimiento) en práctica

Se le proporcionará una introducción a los principios básicos y (más importante) la práctica de seguimiento simple y múltiple de destino en el laboratorio. A través de una serie de ejercicios que usted aprenderá cómo aplicar el tracking (seguimiento), y cómo evaluar críticamente el desempeño de su propio código de seguimiento.



Antes de iniciar el seguimiento, sin embargo, hay algunos pasos preliminares para llevar a cabo.


Preliminares 

Instalación del  tracking Framework

El tracking framework es el que va a utilizar para este laboratorio, oculta muchos de los detalles detrás de la codificación y de-codificación de vídeo, así como el roscado del Estado en todo el canal de seguimiento. Está diseñado para trabajar bajo Linux y Windows. Para obtener el framework, descargue el archivo zip aqui (incluyen 2 videos) . Ahora cree un directorio de trabajo en algún lugar donde pondrá todo su trabajo para la practica. Dependiendo de qué sistema operativo está utilizando, siga estas instrucciones:

Ahora puede probar el tracking framework por el funcionamiento:

play_video('car-1.avi');

Y para ejecutar el rastreador básico filtro Kalman intente esto:

kalman_tracker('car-2.avi', 0.05, 50, 3);
kalman_tracker('car-1.avi', 0.05, 50, 3);


El tracking Framework


El tracking framework proporcionado para los ejercicios de práctica implementa una versión simple de cada módulo de procesamiento como se mostro en la figura anterior. El rastreador proporcionado es un simple seguidor de Kalman basado en filtro utilizando un modelo de fondo media móvil para la segmentación, la detección de burbuja para la detección, la posición burbuja y el alcance de la representación, y por supuesto un filtro Kalman para realizar el seguimiento. 

En esta sección vamos a describir cada uno de los módulos de procesamiento y la aplicación prevista. Primero se describe la función de nivel superior que enhebra todos los módulos de procesamiento en un rastreador completa. 

La función de nivel superior 

Un tracker en la practica del software framework consiste en: 

  • Un segmentador, los segmentos objetos del primer plano del fondo; 
  • Un reconocedor que identifica qué objetos en primer plano se están (o deberían ser) un seguimiento; 
  • Un representador que representa cada objeto seguido en términos de alguna característica del espacio abstracto; 
  • Un rastreador que realmente hace el seguimiento (es decir, calcula la posición de cada blanco en seguimiento en el marco actual); y 
  • Un visualizador opcional que muestra una visualización de cada fotograma del seguidor.
Un tracking Framework requiere una función de la implementación Matlab de cada uno de estos módulos con el fin de ser completa. Un rastreador (es decir, una colección de módulos de procesamiento) se modela en Matlab como estructura que contiene referencias a cada módulo (es decir la función de Matlab aplicación del módulo). Esta estructura también contiene todas las variables de estado que se debe pasar por la tubería a otros módulos. La estructura de T debe contener las siguientes subestructuras: 

  1. T.segmenter que debe contener un T.segmenter.segment referencia de función a una función de tomar la estructura de T y el cuadro actual. 
  2. T.recognizer que debe contener una referencia de función T.recognizer.recognize a una función de tomar la estructura de T y el cuadro actual. 
  3. T.representer que debe contener un T.representer.represent referencia de función a una función de tomar la estructura de T y el cuadro actual. 
  4. T.tracker que debe contener una referencia de función T.tracker.track a una función de tomar la estructura de T y el cuadro actual. 
  5. Y opcionalmente T.visualizer que debe contener un T.visualizer.visualize referencia de función a una función de tomar la estructura T y la trama actual. 
Vamos a ver un ejemplo completo al final de esta sección, pero una vez que esta estructura ha sido creada, puede ejecutar el rastreador en un vídeo utilizando la función run_tracker:

run_tracker(fname, T);

donde T es la configuración de la estructura previamente con las referencias a todos los módulos de seguimiento y fname es el nombre del archivo del video para ejecutar el rastreador. En la práctica, usted va a escribir una función de envoltura alrededor run_tracker que establece la canalización de procesamiento y establece los parámetros necesarios (véase el ejemplo kalman_tracker al final de esta sección).
El segmentador (segmenter)

El segmentador proporcionado realiza simple resta de fondo basado en un modelo de fondo del promedio rotativo y diferenciación temporal. El modelo de fondo se actualiza así:


dondees un parámetro de tasa de aprendizaje que controla la rapidez con que el modelo de fondo incorpora nueva información y la rapidez con que se olvida de las observaciones más antiguas. Cada píxel en cada trama se clasifica como de fondo (0) o el primer plano (1) utilizando un umbral simple:


donde T es un umbral en la diferencia entre un píxel en el modelo de marco y de fondo actual. Este umbral controla que los píxeles se clasifican en primer plano. Finalmente, la imagen en primer plano se limpia un poco para cerrar pequeños espacios:


donde o es la operación de cierre morfológico y Dp es un disco de radio p. 

La aplicación Matlab de este segmento se parece a esto (background_subtractor.m archivo en el directorio framework):

function T = background_subtractor(T, frame)

% Do everything in grayscale.
frame_grey = double(rgb2gray(frame));

% Check to see if we're initialized
if ~isfield(T.segmenter, 'background');
  T.segmenter.background = frame_grey
end

% Pull local state out.
gamma  = T.segmenter.gamma;
tau    = T.segmenter.tau;
radius = T.segmenter.radius;

% Rolling average update.
T.segmenter.background = gamma * frame_grey + (1 - gamma) * ...
    T.segmenter.background;

% And threshold to get the foreground.
T.segmenter.segmented = abs(T.segmenter.background - frame_grey) > tau;
T.segmenter.segmented = imclose(T.segmenter.segmented, strel('disk', radius));

return

Este es un ejemplo de cómo todos los módulos estan dentro del trabajo framework. Cada módulo se aprueba la estructura T global que contiene todos los parámetros necesarios y el frame actual que se está procesando. El módulo entonces hace su procesamiento y almacena los resultados de vuelta en la subestructura T.segmenter (en la variable T.segmenter.segmented). 

Tenga en cuenta que cada módulo es responsable de mantener sus propios parámetros de estado y ponerlos en la estructura T. Este es el único mecanismo por el cual se pasa un estado a otros módulos de procesamiento y de un fotograma al siguiente. Mantener todas las variables de estado relacionadas con un módulo local a una subestructura (T.segmenter en este caso) es una buena práctica de programación, y usted debe hacer esto en todos los módulos que implemente.

El reconocedor 

La siguiente etapa es el reconocedor. El reconocedor básico proporcionada con eltracking Framework se basa en la detección de burbuja simple. Componentes conectados se encuentran en la imagen segmentada, y todo el conjunto de componentes se conserva como el objeto "reconocido" a ser rastreado. 

El código de Matlab para esto es simple:

function T = find_blob(T, frame)
T.recognizer.blobs = bwlabel(T.segmenter.segmented);
return

Puedes ver aquí cómo el reconocedor asume la imagen segmentada de la etapa anterior se pasa en la variable T.segmenter.segmented. Este es un ejemplo de cómo se pasa de estado entre módulos de procesamiento. El reconocedor luego pone su resultado en el T.recognizer.blob variable para módulos posteriores a utilizar. 

Es importante tener en cuenta que el marco no aplica ningún protocolo particular para pasar variables de estado de módulo a módulo. Usted es responsable de establecer cómo cada módulo recibe sus parámetros y la forma en que almacena sus resultados. 

El representador 

El módulo siguiente es el representador, que toma los resultados de reconocimiento y calcula una representación de cada objeto reconocido a ser rastreado. En el rastreador de base, el representador extrae el BoundingBox y tamaño de cada burbuja y sólo mantiene el más grande. 

function T = filter_blobs(T, frame)

% Make sure at lease one blob was recognized
if sum(sum(T.recognizer.blobs))
  % Extract the BoundingBox and Area of all blobs
  R = regionprops(T.recognizer.blobs, 'BoundingBox', 'Area');
  
  % And only keep the biggest one
  [I, IX] = max([R.Area]);
  T.representer.BoundingBox = R(IX(size(IX,2))).BoundingBox;
end
return

El rastreador 

Un simple rastreador de filtro de Kalman se ha proporcionado. Utiliza los resultados del representador para seguir la posición y el alcance del objeto siendo rastreados. El filtro de Kalman funciona mediante la estimación de un estado no observable que se actualiza en el tiempo con una actualización de estado lineal y ruido aditivo gaussiano. Una medición está provisto en cada paso de tiempo que se supone que es una función lineal del ruido de estado, además de Gauss. Es el más complejo módulo en el framework, y recibe y almacena una gran cantidad de información de estado. 

function T = kalman_step(T, frame)

% Get the current filter state.
K = T.tracker;

% Don't do anything unless we're initialized.
if isfield(K, 'm_k1k1') && isfield(T.representer, 'BoundingBox')

  % Get the current measurement out of the representer.
  z_k = T.representer.BoundingBox';
  
  % Project the state forward m_{k|k-1}.
  m_kk1 = K.F * K.m_k1k1;
  
  % Partial state covariance update.
  P_kk1 = K.Q + K.F * K.P_k1k1 * K.F';
  
  % Innovation is disparity in actual versus predicted measurement.
  innovation = z_k - K.H * m_kk1;
  
  % The new state covariance.
  S_k = K.H * P_kk1 * K.H' + K.R;
  
  % The Kalman gain.
  K_k = P_kk1 * K.H' * inv(S_k);
  
  % The new state prediction.
  m_kk = m_kk1 + K_k * innovation;
  
  % And the new state covariance.
  P_kk = P_kk1 - K_k * K.H * P_kk1;
  
  % Innovation covariance.
  K.innovation = 0.2 * sqrt(innovation' * innovation) + (0.8) ...
      * K.innovation;
  
  % And store the current filter state for next iteration.
  K.m_k1k1 = m_kk;
  K.P_k1k1 = P_kk;
else
  if isfield(T.representer, 'BoundingBox');
    K.m_k1k1 = T.representer.BoundingBox';
    K.P_k1k1 = eye(4);
  end
end

% Make sure we stuff the filter state back in.
T.tracker = K;

return

Usted debe estudiar esta función con cuidado para ver cómo se inicializa el rastreador y cómo se mantiene su información de estado. 

El visualizador 

El módulo final en la canalización de procesamiento es el visualizador. No es obligatorio, pero siempre es una buena idea para proporcionar un visualizador mínimo para ver cómo su tracking se está realizando.

function T = visualize_kalman(T, frame)

% Display the current frame.
imshow(frame);

% Draw the current measurement in red.
if isfield(T.representer, 'BoundingBox')
  rectangle('Position', T.representer.BoundingBox, 'EdgeColor', 'r');
end

% And the current prediction in green
if isfield(T.tracker, 'm_k1k1');
  rectangle('Position', T.tracker.m_k1k1, 'EdgeColor', 'g');
end
drawnow;
return

Juntando todo 

Ahora que tenemos una función de Matlab,  podemos unirlos usando la función run_tracker en el framework.

function T = kalman_tracker(fname, gamma, tau, radius);
% Initialize background model parameters
Segmenter.gamma   = gamma;
Segmenter.tau     = tau;
Segmenter.radius  = radius;
Segmenter.segment = @background_subtractor;

% Recognizer and representer is a simple blob finder.
Recognizer.recognize = @find_blob;
Representer.represent = @filter_blobs;

% The tracker module.
Tracker.H          = eye(4);        % System model
Tracker.Q          = 0.5 * eye(4);  % System noise
Tracker.F          = eye(4);        % Measurement model
Tracker.R          = 5 * eye(4);    % Measurement noise
Tracker.innovation = 0;
Tracker.track      = @kalman_step;

% A custom visualizer for the Kalman state.
Visualizer.visualize = @visualize_kalman;

% Set up the global tracking system.
T.segmenter   = Segmenter;
T.recognizer  = Recognizer;
T.representer = Representer;
T.tracker     = Tracker;
T.visualizer  = Visualizer;

% And run the tracker on the video.
run_tracker(fname, T);
return

Esta función crea la estructura del seguidor global T, inicializado con todas las subestructuras (segmentador, reconocedor, representer, de seguimiento y de visualizador). Cada una de estas subestructuras se inicializa con la referencia de la función requerida y todos los parámetros necesarios. Por último, la función run_tracker ejecuta la canalización de procesamiento en el video pasado como parámetro. 

Puede ejecutar el rastreador de base en un video usando (por ejemplo):

kalman_tracker('car-2.avi', 0.05, 20, 3);

0 comentarios:

Publicar un comentario

Gracias por tu visita!!