Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Generación de código para clasificación de imágenes

En este ejemplo se muestra cómo generar código C a partir de una función de MATLAB que clasifica imágenes de dígitos mediante un modelo de clasificación entrenado. En este ejemplo se muestra un flujo de trabajo alternativo.Digit Classification Using HOG Features (Computer Vision Toolbox) Sin embargo, para admitir la generación de código en ese ejemplo, puede seguir los pasos de generación de código en este ejemplo.

La clasificación automatizada de imágenes es una herramienta ubicua. Por ejemplo, un clasificador entrenado se puede desplegar en un Dron para identificar automáticamente las anomalías en la tierra en el metraje capturado, o en una máquina que escanea códigos postales manuscritos en letras. En el último ejemplo, después de que el equipo encuentra el código postal y almacena imágenes individuales de dígitos, el clasificador desplegado debe adivinar qué dígitos están en las imágenes para reconstruir el código postal.

Este ejemplo muestra cómo entrenar y optimizar un modelo de clasificación de códigos de salida de corrección de errores multiclase (ECOC) para clasificar los dígitos en función de las intensidades de píxel en imágenes ráster. El modelo ECOC contiene alumnos de máquina de vectores de soporte binario (SVM). A continuación, en este ejemplo se muestra cómo generar código C que utiliza el modelo entrenado para clasificar nuevas imágenes. Los datos son imágenes sintéticas de dígitos deformados de varias fuentes, que simula dígitos manuscritos.

Configure el compilador de C

Para generar código de C/C++, debe tener acceso a un compilador de C/C++ que esté configurado correctamente. MATLAB Coder localiza y utiliza un compilador compatible e instalado. Puede usar para ver y cambiar el compilador predeterminado.mex-setup Para obtener más información, consulte.Cambiar el compilador predeterminado (MATLAB)

Supuestos y limitaciones

Para generar código C, MATLAB Coder:

  • Requiere un compilador configurado correctamente.

  • Requiere que las funciones admitidas estén en una función de MATLAB que usted defina. Para el flujo de trabajo básico, consulte.Introducción a la generación de código

  • Prohibe los objetos como argumentos de entrada de la función definida.

En cuanto a la última limitación, considere que:

  • Los modelos de clasificación entrenados son objetos

  • MATLAB Coder admite clasificar las observaciones utilizando modelos entrenados, pero no admite el ajuste del modelopredict

Para solucionar las limitaciones de generación de código para la clasificación, entrenar el modelo de clasificación mediante MATLAB y, a continuación, pasar el objeto de modelo resultante a. reduce el espacio de memoria del modelo (es decir, lo hace compacto) si es necesario y, a continuación, guarda el modelo entrenado en el disco como una matriz de estructura.saveCompactModelsaveCompactModel Al igual que el modelo compacto, la matriz de estructura contiene sólo la información utilizada para clasificar las nuevas observaciones.

Después de guardar el modelo en el disco, cargue el modelo en la función MATLAB utilizando. carga la matriz de estructura guardada y, a continuación, reconstruye el objeto de modelo compacto original.loadCompactModelloadCompactModel En la función MATLAB, para clasificar las observaciones, puede pasar el conjunto de datos de modelo y predictor, que puede ser un argumento de entrada de la función, a.predict

Generación de código para flujo de trabajo de clasificación

Antes de desplegar un clasificador de imágenes en un dispositivo:

  1. Obtenga una cantidad suficiente de imágenes etiquetadas.

  2. Decida qué entidades extraer de las imágenes.

  3. Entrenar y optimizar un modelo de clasificación. Este paso incluye la elección de un algoritmo adecuado y el ajuste de los hiperparámetros, es decir, los parámetros del modelo no caben durante el entrenamiento.

  4. Guarde el modelo en el disco mediante.saveCompactModel

  5. Defina una función para clasificar nuevas imágenes. La función debe cargar el modelo mediante el uso y puede devolver etiquetas, como las puntuaciones de clasificación.loadCompactModel

  6. Configure el compilador de C.

  7. Decidir el entorno en el que se ejecutará el código generado.

  8. Genere el código C para la función.

Cargar datos

Cargue el conjunto de datos.digitimages

load digitimages

es una matriz de enteros de 28 por 28 por 3000.imagesuint16 Cada página es una imagen ráster de un dígito. Cada elemento es una intensidad de píxel. Las etiquetas correspondientes están en el vector numérico 3000-by-1.Y Para obtener más información, escriba en la línea de comandos.Description

Almacene el número de observaciones y el número de variables predictoras. Cree una partición de datos que especifique que se mantenga el 20% de los datos. Extraiga los índices de entrenamiento y de conjunto de pruebas de la partición de datos.

rng(1) % For reproducibility n = size(images,3); p = numel(images(:,:,1)); cvp = cvpartition(n,'Holdout',0.20); idxTrn = training(cvp); idxTest = test(cvp);

Muestra nueve imágenes aleatorias de los datos.

figure for j = 1:9     subplot(3,3,j)     selectImage = datasample(images,1,3);     imshow(selectImage,[]) end

Reescalar datos

Dado que las intensidades de píxeles sin procesar varían ampliamente, debe normalizar sus valores antes de entrenar un modelo de clasificación. Vuelva a escalar las intensidades de píxel para que se extienden en el intervalo [0,1]. Es decir, supongamos que

<math display="block">
<mrow>
<msub>
<mrow>
<mi>p</mi>
</mrow>
<mrow>
<mi>i</mi>
<mi>j</mi>
</mrow>
</msub>
</mrow>
</math>
es la intensidad de píxeles
<math display="block">
<mrow>
<mi>j</mi>
</mrow>
</math>
dentro de la imagen
<math display="block">
<mrow>
<mi>i</mi>
</mrow>
</math>
. Para la imagen
<math display="block">
<mrow>
<mi>i</mi>
</mrow>
</math>
, reescalar todas sus intensidades de píxeles utilizando esta fórmula:

<math display="block">
<mrow>
<msub>
<mrow>
<munderover accent="true">
<mrow>
<mi>p</mi>
</mrow>
<mrow></mrow>
<mrow>
<mo>ˆ</mo>
</mrow>
</munderover>
</mrow>
<mrow>
<mi>i</mi>
<mi>j</mi>
</mrow>
</msub>
<mo>=</mo>
<mfrac>
<mrow>
<msub>
<mrow>
<mi>p</mi>
</mrow>
<mrow>
<mi>i</mi>
<mi>j</mi>
</mrow>
</msub>
<mo>-</mo>
<munder>
<mrow>
<mi mathvariant="normal">min</mi>
</mrow>
<mrow>
<mi>j</mi>
</mrow>
</munder>
<mo stretchy="false">(</mo>
<msub>
<mrow>
<mi>p</mi>
</mrow>
<mrow>
<mi>i</mi>
<mi>j</mi>
</mrow>
</msub>
<mo stretchy="false">)</mo>
</mrow>
<mrow>
<munder>
<mrow>
<mi mathvariant="normal">max</mi>
</mrow>
<mrow>
<mi>j</mi>
</mrow>
</munder>
<mo stretchy="false">(</mo>
<msub>
<mrow>
<mi>p</mi>
</mrow>
<mrow>
<mi>i</mi>
<mi>j</mi>
</mrow>
</msub>
<mo stretchy="false">)</mo>
<mo>-</mo>
<munder>
<mrow>
<mi mathvariant="normal">min</mi>
</mrow>
<mrow>
<mi>j</mi>
</mrow>
</munder>
<mo stretchy="false">(</mo>
<msub>
<mrow>
<mi>p</mi>
</mrow>
<mrow>
<mi>i</mi>
<mi>j</mi>
</mrow>
</msub>
<mo stretchy="false">)</mo>
</mrow>
</mfrac>
<mo>.</mo>
</mrow>
</math>

X = double(images); for i = 1:n     minX = min(min(X(:,:,i)));     maxX = max(max(X(:,:,i)));     X(:,:,i) = (X(:,:,i) - minX)/(maxX - minX); end

Alternativamente, si tiene una licencia de Image Processing Toolbox™, puede reescalar eficazmente las intensidades de píxel de las imágenes a [0,1] mediante el uso de.mat2gray Para obtener más información, consulte.mat2gray

Remodele los datos

Para la generación de código, los Datos predictores para el entrenamiento deben estar en una tabla de variables numéricas o una matriz numérica.

Cambie la forma de los datos a una matriz, de forma que las variables predictoras (intensidades de píxel) correspondan a columnas e imágenes (observaciones) a filas. Dado que toma elementos en la columna, debe transponer su resultado.reshape

X = reshape(X,[p,n])';

Para asegurarse de que el preprocesamiento de los datos mantiene la imagen, trace la primera observación en.X

figure imshow(reshape(X(1,:),sqrt(p)*[1 1]),[],'InitialMagnification','fit')

Extraer características

Computer Vision System Toolbox™ ofrece varias técnicas de extracción de características para las imágenes. Una de estas técnicas es la extracción del histograma de las características de gradiente orientado (HOG). Para aprender a entrenar un modelo ECOC utilizando las características de HOG, consulte.Digit Classification Using HOG Features (Computer Vision Toolbox) Para obtener más información sobre otras técnicas admitidas, consulte.Local Feature Detection and Extraction (Computer Vision Toolbox) Este ejemplo utiliza las intensidades de píxel reescalado como variables predictoras.

Entrenar y optimizar el modelo de clasificación

Los modelos de SVM lineales se suelen aplicar a conjuntos de datos de imagen para su clasificación. Sin embargo, SVM son clasificadores binarios y hay 10 clases posibles en el conjunto de datos.

Puede crear un modelo multiclase de varios alumnos de SVM binarios utilizando. combina múltiples estudiantes binarios utilizando un diseño de codificación.fitcecocfitcecoc De forma predeterminada, aplica el diseño uno contra uno, que especifica el aprendizaje de los alumnos binarios en función de las observaciones de todas las combinaciones de pares de clases.fitcecoc Por ejemplo, en un problema con 10 clases, debe entrenar 45 modelos binarios SVM.fitcecoc

En general, cuando se entrena un modelo de clasificación, se deben ajustar los hiperparámetros hasta que se logre un error de generalización satisfactorio. Es decir, debe validar de forma cruzada los modelos para conjuntos concretos de hiperparámetros y, a continuación, comparar las tasas de clasificación errónea.

Puede elegir sus propios conjuntos de valores de hiperparámetros, o puede especificar para implementar la optimización bayesiana. (Para obtener detalles generales sobre la optimización Bayesiana, consulte.)Flujo de trabajo de optimización bayesiana En este ejemplo se realiza la validación cruzada sobre una cuadrícula de valores elegida.

Para validar de forma cruzada un modelo ECOC de alumnos binarios de SVM basados en las observaciones de formación, utilice la validación cruzada de 5 veces. Aunque los valores predictores tienen el mismo rango, para evitar dificultades numéricas durante el entrenamiento, estandarice los predictores. Además, optimice el diseño de codificación ECOC y la restricción de caja SVM. Utilice todas las combinaciones de estos valores:

  • Para el diseño de codificación ECOC, utilice uno contra uno y uno contra todos.

  • Para la restricción de cuadro SVM, utilice tres valores de espaciado logarmicamente de 0,1 a 100 cada uno.

Para todos los modelos, almacene las tasas de clasificación errónea de 5 veces con validación cruzada.

coding = {'onevsone' 'onevsall'}; boxconstraint = logspace(-1,2,3); cvLoss = nan(numel(coding),numel(boxconstraint)); % For preallocation  for i = 1:numel(coding)     for j = 1:numel(boxconstraint)         t = templateSVM('BoxConstraint',boxconstraint(j),'Standardize',true);         CVMdl = fitcecoc(X(idxTrn,:),Y(idxTrn),'Learners',t,'KFold',5,...             'Coding',coding{i});         cvLoss(i,j) = kfoldLoss(CVMdl);         fprintf('cvLoss = %f for model using %s coding and box constraint=%f\n',...             cvLoss(i,j),coding{i},boxconstraint(j))     end end
cvLoss = 0.052083 for model using onevsone coding and box constraint=0.100000 cvLoss = 0.055000 for model using onevsone coding and box constraint=3.162278 cvLoss = 0.050000 for model using onevsone coding and box constraint=100.000000 cvLoss = 0.116667 for model using onevsall coding and box constraint=0.100000 cvLoss = 0.123750 for model using onevsall coding and box constraint=3.162278 cvLoss = 0.125000 for model using onevsall coding and box constraint=100.000000 

Determine los índices de hiperparámetros que producen la tasa de clasificación errónea mínima. Entrenar un modelo ECOC utilizando los datos de entrenamiento. Estandarice los datos de entrenamiento y proporcione la combinación de hiperparámetros óptima observada.

minCVLoss = min(cvLoss(:))
minCVLoss = 0.0500 
linIdx = find(cvLoss == minCVLoss); [bestI,bestJ] = ind2sub(size(cvLoss),linIdx); bestCoding = coding{bestI}
bestCoding =  'onevsone' 
bestBoxConstraint = boxconstraint(bestJ)
bestBoxConstraint = 100 
t = templateSVM('BoxConstraint',bestBoxConstraint,'Standardize',true); Mdl = fitcecoc(X(idxTrn,:),Y(idxTrn),'Learners',t,'Coding',bestCoding);

Construya una matriz de confusión para las imágenes del conjunto de pruebas.

testImages = X(idxTest,:); testLabels = predict(Mdl,testImages); confusionMatrix = confusionchart(Y(idxTest),testLabels);

Los elementos diagonales y fuera de la diagonal corresponden a observaciones clasificadas correcta y incorrectamente, respectivamente. parece clasificar correctamente la mayoría de las imágenes.Mdl

Si está satisfecho con el rendimiento de, a continuación, puede proceder a generar código para la predicción.Mdl De lo contrario, puede seguir ajustando los hiperparámetros. Por ejemplo, puede intentar entrenar a los alumnos de SVM utilizando diferentes funciones del kernel.

Guardar modelo de clasificación en disco

es un modelo de clasificación predictiva, pero debe prepararlo para la generación de código.Mdl Guardar en el directorio de trabajo actual utilizando.MdlsaveCompactModel

saveCompactModel(Mdl,'DigitImagesECOC')

compacta, la convierte en una matriz de estructura y la guarda en el archivo MAT.saveCompactModelMdlDigitImagesECOC.mat

Definir función de predicción para generación de código

Defina una función de punto de entrada denominada. que hace lo siguiente:predictDigitECOC.m

  • Incluya la Directiva de generación de código en algún lugar de la función.%#codegen

  • Acepte datos de imagen proporcionales a.X

  • Carga usando.DigitImagesECOC.matloadCompactModel

  • Devuelva las etiquetas pronosticadas.

type predictDigitECOC.m % Display contents of predictDigitECOC.m file
function label = predictDigitECOC(X) %#codegen %PREDICTDIGITECOC Classify digit in image using ECOC Model  %   PREDICTDIGITECOC classifies the 28-by-28 images in the rows of X using %   the compact ECOC model in the file DigitImagesECOC.mat, and then %   returns class labels in label. CompactMdl = loadCompactModel('DigitImagesECOC.mat'); label = predict(CompactMdl,X);  end 

Si pulsa el botón situado en la sección superior derecha de esta página y abre este ejemplo en MATLAB®, MATLAB® abre la carpeta de ejemplo.Note: Esta carpeta incluye el archivo de función de punto de entrada.

Compruebe que la función de predicción devuelva las mismas etiquetas de conjunto de pruebas que.predict

pfLabels = predictDigitECOC(testImages); verifyPF = isequal(pfLabels,testLabels)
verifyPF = logical
   1

Devuelve Logical 1 (), lo que significa que todas las entradas son iguales.isequaltrue El rendimiento de los resultados esperados.predictDigitECOC

Decidir qué entorno ejecutar código generado

El código generado puede ejecutarse:

  • Dentro del entorno de MATLAB como un archivo C-MEX

  • Fuera del entorno de MATLAB como un ejecutable independiente

  • Fuera del entorno de MATLAB como una utilidad compartida vinculada a otro ejecutable independiente

Este ejemplo genera un archivo MEX que se ejecutará en el entorno de MATLAB. La generación de un archivo MEX le permite probar el código generado utilizando las herramientas de MATLAB antes de desplegar la función fuera del entorno de MATLAB. En la función MEX, puede incluir código para la verificación, pero no para la generación de código, declarando los comandos como uso extrínseco.coder.extrinsic Los comandos extrínsecos pueden incluir funciones que no tienen compatibilidad con la generación de código. Todos los comandos extrínsecos de la función MEX se ejecutan en MATLAB, pero no generan código para ellos.codegen

Si planea desplegar el código fuera del entorno de MATLAB, debe generar un ejecutable independiente. Una forma de especificar la elección del compilador es mediante la opción de.-configcodegen Por ejemplo, para generar un ejecutable de C estático, especifique cuando llame a CODEGEN.-config:exe Para obtener más información sobre la configuración de opciones de generación de código, consulte la opción de.-configcodegen

Compile la función MATLAB en el archivo MEX

Compilar en un archivo MEX utilizando.predictDigitECOC.mcodegen Especifique estas opciones:

  • : Genera un informe de compilación que identifica el código original de MATLAB y los archivos asociados que se crean durante la generación de código.-reportcodegen

  • — MATLAB Coder requiere que especifique las propiedades de todos los argumentos de entrada de función.-args Una forma de hacerlo es proporcionar un ejemplo de valores de entrada.codegen Por consiguiente, MATLAB Coder deduce las propiedades de los valores de ejemplo. Especifique las imágenes de conjunto de pruebas proporcionadas.X

codegen predictDigitECOC -report -args {testImages}
Code generation successful: View report 

generado correctamente el código para la función de predicción.codegen Puede ver el informe haciendo clic en el vínculo en la línea de comandos. Si la generación de código no se realiza correctamente, el informe puede ayudarle a depurar.

crea el directorio, donde está su directorio de trabajo actual.codegenpwd/codegen/mex/predictDigitECOCpwd En el directorio secundario, genera, entre otras cosas, el archivo MEX.codegenpredictDigitECOC_mex.mexw64

Compruebe que el archivo MEX devuelva las mismas etiquetas que.predict

mexLabels = predictDigitECOC_mex(testImages); verifyMEX = isequal(mexLabels,testLabels)
verifyMEX = logical
   1

Devuelve Logical 1 (), lo que significa que el archivo MEX produce los resultados esperados.isequaltrue

Consulte también

| | |

Temas relacionados