Fusión de imágenes y datos numéricos usando CNN

Imagen (MRI) y fusión de datos numéricos usando CNN

1. Antecedentes

En muchas tareas prácticas, hay varios tipos de datos para la construcción de modelos, como datos numéricos, de imagen, de audio y otros. Si simplemente usa un cierto tipo de datos para construir un modelo de clasificación o regresión, la ventaja es que la construcción es simple y no hay problema de fusión de diferentes tipos de datos. Sin embargo, si solo usa un cierto tipo de datos y el rendimiento del modelo es promedio, como una precisión que oscila entre 0.6-0.7, entonces es necesario incorporar más características, especialmente en el campo médico. Cierta enfermedad o no, las muestras en el conjunto de entrenamiento son todas personas normales. En este momento, no hay mucha diferencia si se trata de datos numéricos o datos de imágenes. Por lo tanto, es necesario considerar la integración de los dos para mejorar la precisión de la predicción.

2. Métodos de fusión de imágenes y datos numéricos comúnmente utilizados en la actualidad

Actualmente, hay tres formas de fusionar imágenes y datos numéricos:

1. Convierte directamente la imagen en un vector

Este método es la solución más violenta. Por ejemplo, una imagen en color de 32 x 32 píxeles se puede convertir en un vector de 32 x 32 x 3 = 3072, lo que equivale a incluir características de 3072. La ventaja es que se incluyen todos los detalles (nivel de píxeles) de la imagen. La desventaja es que, debido a que se incluyen todos los detalles (píxeles), habrá factores de confusión innecesarios, por lo que se requiere una ingeniería de características compleja.

2. Utilice software para extraer algunas características de la imagen

inserte la descripción de la imagen aquíPor ejemplo, en la imagen de resonancia magnética craneal anterior, se puede usar algún software como FSL para extraer parámetros como el tálamo, el hipocampo, el grosor de la corteza cerebral y el volumen cerebral, y luego usar estos parámetros como nuevas características para fusionar con datos numéricos. La ventaja es que la cantidad de características se reduce considerablemente y la velocidad de cálculo mejora. La desventaja es que algunas lesiones orgánicas no se pueden reflejar.

3. Usando CNN (Red Neuronal Convolucional)

inserte la descripción de la imagen aquí
CNN también se puede utilizar para extraer características. La premisa es que la precisión de predicción del modelo es mejor, lo que naturalmente significa que las características extraídas son más precisas. Generalmente, la capa plana después de la base de convolución se empalma con datos numéricos para realizar la fusión de imagen y datos numéricos, como se muestra en la figura anterior.

3. Los pasos de CNN para realizar la fusión de imagen y datos numéricos.

1. Formación de la red CNN

Este paso es relativamente importante en todo el proceso de fusión. Solo una red CNN más precisa puede extraer características precisas y útiles. Generalmente, el modo de preentrenamiento + ajuste fino se usa para entrenar CNN. Para la conveniencia de la demostración, usamos el conjunto de datos Fashion MNIST como nuestra imagen y el conjunto de datos del iris como nuestros datos numéricos para la demostración. Además, dado que hay 10 categorías de Moda MNIST, y solo hay 3 tipos de iris, incluimos los datos de irsi para "asumir que son los datos numéricos que respaldan nuestra imagen", y creamos un nuevo archivo py. El código específico es el siguiente:

import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow import keras
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'


# 加载数据
fashion_mnist = tf.keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
# 查看数据大小
# print(train_images.shape)
# print(test_images.shape)
# 数据集归一化
train_images_norm = train_images / 255.0
test_images_norm = test_images / 255.0
train_images_reshape = train_images.reshape([-1, 28, 28, 1])
test_images_reshape = test_images.reshape([-1, 28, 28, 1])

L = keras.layers
model = keras.Sequential([
    # 卷积层
    L.Conv2D(input_shape=(28, 28, 1), filters=32, kernel_size=3, strides=1),
    # 池化层
    L.MaxPool2D(pool_size=2, strides=2),
    # 卷积层
    L.Conv2D(filters=64, kernel_size=3, strides=1),
    # 池化层
    L.MaxPool2D(pool_size=2, strides=2),
    # 全连接层
    L.Flatten(),
    L.Dense(256, activation='relu'),
    L.Dense(10, activation='softmax')

])
model.summary()


model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])


model.fit(train_images_norm, train_labels, epochs=5, validation_split=0.2)
test_loss, test_acc = model.evaluate(test_images_norm, test_labels)
print('test_loss:{}, test_acc{}'.format(test_loss, test_acc))

# 保存模型
# model.save('ConV_DT.h5')

El código anterior principalmente entrena un modelo CNN y luego lo guarda como ConV_DT.h5 , lo cual es conveniente para el siguiente paso.

2. Cargue el modelo entrenado, extraiga las características de la imagen y empalme con datos numéricos

Cree otro archivo py. Esta parte del código implementa principalmente el uso del modelo ya construido para volver a ingresar la imagen de entrenamiento para generar la salida de la capa Flatten, y luego empalmarla con los datos numéricos, que es el conjunto de datos del iris. El código de esta parte es el siguiente:

import pandas as pd
import tensorflow as tf
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)


fashion_mnist = tf.keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
# 查看数据大小
# print(train_images.shape)
# print(test_images.shape)
# 数据集归一化
train_images_norm = train_images / 255.0
test_images_norm = test_images / 255.0
train_images_reshape = train_images.reshape([-1, 28, 28, 1])
test_images_reshape = test_images.reshape([-1, 28, 28, 1])

# print(test_images_reshape[0].shape)

# 读取iris数据
iris = load_iris()
data = iris.data
labels = iris.target

# 载入模型
model = tf.keras.models.load_model('ConV_DT.h5')

# 输出flatten层的输出
representation_model = tf.keras.models.Model(inputs=model.input, outputs=model.get_layer('flatten').output)
flatten_output = representation_model.predict(train_images_reshape)
print(type(flatten_output))
print(flatten_output.shape)
print(flatten_output[0].shape)

# 由于IRIS数据集长度为150行,因此我们也选取Fashion_MNIST数据集的前150行,来做数据融合
df_1 = pd.DataFrame(flatten_output[:150, :])
df_2 = pd.DataFrame(data)

all_data = pd.concat([df_1, df_2], axis=1, join='outer')

print(all_data.values)
print('--------------')
print(all_data.shape)

La salida de esta parte del código es:

1875/1875 [==============================] - 4s 1ms/step
<class 'numpy.ndarray'>
(60000, 1600)
(1600,)
[[ 1.83051303e-02 -1.34976834e-01 -2.31863484e-02 ...  3.50000000e+00
   1.40000000e+00  2.00000000e-01]
 [-6.31221123e+01  2.14652161e+02 -2.21633682e+01 ...  3.00000000e+00
   1.40000000e+00  2.00000000e-01]
 [ 3.02642097e+01  2.99987674e-01  1.92712307e+00 ...  3.20000000e+00
   1.30000000e+00  2.00000000e-01]
 ...
 [ 1.02550278e+02  2.27436676e+02  3.78363113e+01 ...  3.00000000e+00
   5.20000000e+00  2.00000000e+00]
 [-5.90932703e+00  8.05619736e+01 -4.51921177e+00 ...  3.40000000e+00
   5.40000000e+00  2.30000000e+00]
 [-1.93223495e+01  1.43665100e+02 -4.19176483e+01 ...  3.00000000e+00
   5.10000000e+00  1.80000000e+00]]
--------------
(150, 1604)

Podemos ver que un total de 1600 funciones se extraen de la imagen después de la extracción de funciones de CNN y luego se empalman con las funciones de iris para generar 1604 funciones.

3. Usa nuevas funciones para hacer predicciones

Esta parte es simplemente usar el modelo de aprendizaje automático o la red neuronal para hacer predicciones después de la fusión de datos. Aquí elegimos un árbol de decisión (DT). El código específico es el siguiente:

x_train, x_test, y_train, y_test = train_test_split(all_data.values, test_labels, test_size=0.3)
dt = DecisionTreeClassifier(max_depth=10)
dt.fit(x_train, y_train)
score = dt.score(x_test, y_test)
print(score)

La salida de esta parte del código es:

0.6

Cuatro Resumen

Este artículo proporciona principalmente una idea y un código clave para la fusión de imágenes y datos numéricos. La precisión específica no es alta porque los ejemplos seleccionados son solo para referencia. En aplicaciones prácticas, también se debe considerar la normalización de imágenes, la eliminación de ruido, la rotación aleatoria, la mejora de imágenes, etc. Para los datos fusionados, la ingeniería de características y los ajustes de hiperparámetros del modelo aún son necesarios para mejorar aún más la precisión.

Supongo que te gusta

Origin blog.csdn.net/JaysonWong/article/details/126628707
Recomendado
Clasificación