CNNを使用した画像と数値データの融合

CNNを使用した画像(MRI)と数値データの融合

1. 背景

実際の業務では、数値データ、画像データ、音声データなど、モデルを構築するためのデータが多岐にわたりますが、ある種のデータだけを使って分類モデルや回帰モデルを構築する場合、構築が簡単で異種データの融合が問題ないというメリットがありますが、ある種のデータのみを使用し、精度が0.6~0.7の間で推移するようなモデルの性能が平均的である場合、特に医療分野では、より多くの機能を組み込む必要があります。特定の病気に罹患しているか否かについては、訓練セットのサンプルはすべて健常者ですが、現時点では数値データであっても画像データであっても大きな違いはないため、予測精度を高めるためには両者を統合することを検討する必要があります。

2. 現在一般的に使用されている画像データと数値データの融合手法

現在、画像と数値データを融合するには 3 つの方法があります。

1. 画像を直接ベクトルに変換する

この方法は最も乱暴な解決策です。たとえば、32X32 ピクセルのカラー画像は 32X32X3=3072 のベクトルに変換でき、これは 3072 個の特徴を含むことに相当します。利点は、画像内のすべての詳細 (ピクセル レベル) が含まれることです。欠点は、すべての詳細 (ピクセル) が含まれるため、不要な交絡因子が存在するため、複雑な特徴エンジニアリングが必要になることです。

2. ソフトウェアを使用して画像内のいくつかの特徴を抽出します

ここに画像の説明を挿入例えば、上記の頭蓋磁気共鳴画像では、FSLなどのソフトウェアを利用して視床、海馬、大脳皮質の厚さ、脳体積などのパラメータを抽出し、これらのパラメータを新たな特徴量として数値データと融合することができ、特徴量が大幅に削減され、計算速度が向上するというメリットがありますが、一部の器質的病変が反映できないというデメリットがあります。

3. CNN (畳み込みニューラルネットワーク) の使用

ここに画像の説明を挿入
CNN を使用して特徴を抽出することもできます. モデルの予測精度が高いことが前提であり, 当然抽出された特徴もより正確になります. 一般に、上図に示すように、畳み込みベース後の平坦化層に数値データを接続して、画像と数値データの融合を実現します。

3. 画像と数値データの融合を実現するCNNのステップ

1. CNN ネットワークのトレーニング

このステップは、融合プロセス全体の中で比較的重要なステップです。正確で有用な特徴を抽出できるのは、より正確な CNN ネットワークだけです。一般に、CNN のトレーニングには、事前トレーニング + 微調整モードが使用されます。デモンストレーションの便宜上、画像として Fashion MNIST データセットを使用し、デモンストレーション用の数値データとして虹彩データセットを使用します。また、Fashion MNISTのカテゴリは10個あり、irisは3種類しかないため、「イメージを裏付ける数値データであると仮定する」ためにirsiのデータを含めて新たにpyファイルを作成し、具体的なコードは以下のとおりです。

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')

上記のコードは主に CNN モデルをトレーニングし、それをConV_DT.h5として保存します。これは次のステップで便利です。

2. トレーニング済みモデルをロードし、画像の特徴を抽出し、数値データと結合します。

別の py ファイルを作成します。コードのこの部分は主に、既に構築されたモデルを使用してトレーニング イメージを再入力し、フラット化レイヤーの出力を出力し、それを数値データ (虹彩データ セット) と結合することを実装します。この部分のコードは次のとおりです。

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)

コードのこの部分の出力は次のとおりです。

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)

CNN 特徴抽出後の画像から合計 1600 個の特徴が抽出され、虹彩特徴と結合されて 1604 個の特徴が出力されることがわかります。

3. 新しい機能を使用して予測を行う

この部分は、データ融合後に機械学習モデルまたはニューラル ネットワークを使用して予測を行うだけです。ここでは決定木 (DT) を選択します。具体的なコードは次のとおりです。

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)

コードのこの部分の出力は次のとおりです。

0.6

4. まとめ

この記事では主に、画像と数値データの融合に関するアイデアとキー コードを提供します。選択された例は参考用であるため、具体的な精度は高くありません。実際のアプリケーションでは、画像の正規化、ノイズ除去、ランダムな回転、画像強調なども考慮する必要があります。融合されたデータについては、精度をさらに向上させるために、特徴量エンジニアリングとモデルのハイパーパラメータ調整が依然として必要です。

おすすめ

転載: blog.csdn.net/JaysonWong/article/details/126628707