放射線科は、高度なスキルを持つ専門家の専門知識に大きく依存する分野です。放射線科医は、単純な骨折から癌などの複雑な病気まで、さまざまな状態を診断し、監視するために医療画像を分析します。しかし、医療画像の急増と迅速かつ正確な診断の緊急の必要性により、放射線科医は大きなプレッシャーにさらされています。ここで人工知能 (AI) が登場し、人間の能力を強化することで分野を変革します。この記事を最後まで読めば、医療画像で肺炎を検出するのに役立つ独自の画像分類モデルを作成できるようになります。
コーディングを始める前に、環境が整っていることを確認する必要があります。まずは必要なライブラリをインストールします。
%pip install --upgrade tensorflow keras numpy pandas sklearn pillow
これらのライブラリは、モデルの構築とトレーニングに不可欠です。
tensorflow
とkeras
。numpy
。pandas
。sklearn
。pillow
。ライブラリがインストールされたら、インポートしましょう。
import os from tensorflow import keras from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Conv2D, MaxPool2D, Flatten from tensorflow.keras.preprocessing.image import ImageDataGenerator import numpy as np
まず、画像処理タスク用のニューラル ネットワーク モデルの構築とトレーニングに必要ないくつかの重要なライブラリとモジュールをインポートします。TensorFlow とそのサブモジュールを使用して、ディープラーニング モデルを作成および管理します。具体的には、高レベル API として使用する Keras、レイヤーの線形スタックを構築するための Sequential、さまざまなニューラル ネットワーク レイヤーを構築および構成するための Dense、Conv2D、MaxPool2D、Flatten などのモジュールをインポートします。さらに、ImageDataGenerator は画像データを拡張し、モデルの一般化能力を高めるのに役立ちます。最後に、数値演算のサポートのために numpy をインポートします。これは、配列の処理や数学関数の実行に特に役立ちます。
AI 放射線科医には学習するためのデータが必要です。ImageDataGenerator を使用してトレーニング データと検証データを読み込み、拡張します。データをダウンロードするには、オープンソース データの友人である Kaggle を使用します。ここのリンクからラベル付きデータセットをダウンロードしてください。
ここでの教師あり学習のコンテキストでは、ラベル付けされたデータセットは、機械学習モデルが予測することになっている真実になります。
trdata = ImageDataGenerator() traindata = trdata.flow_from_directory(directory="data-task1/train", target_size=(224, 224)) tsdata = ImageDataGenerator() testdata = tsdata.flow_from_directory(directory="data-task1/val", target_size=(224, 224))
このコード スニペットは、トレーニング データセットと検証データセットのデータ ジェネレーターを設定します。画像は、VGG16 モデルの標準入力サイズである 224 x 224 ピクセルにサイズ変更されます。
次は楽しい部分、VGG16 モデルの構築です。VGG16 は、主に 13 の畳み込み層と 3 つの完全接続層で構築された独自のアーキテクチャにより、そのシンプルさと有効性で知られる人気の畳み込みニューラル ネットワーク (CNN) アーキテクチャです。VGG16 の特徴は、ディープ ネットワーク内で小さな 3x3 畳み込みフィルターを使用していることです。この設計により、計算効率を確保しながら、画像内の複雑なパターンをキャプチャできます。作成方法は次のとおりです。
model = Sequential() model.add(Conv2D(input_shape=(224,224,3), filters=64, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=64, kernel_size=(3,3), padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Flatten()) model.add(Dense(units=4096, activation="relu")) model.add(Dense(units=4096, activation="relu")) model.add(Dense(units=2, activation="softmax")) model.summary()
詳しく見てみましょう:
モデル アーキテクチャを定義したら、それをコンパイルする必要があります。
opt = keras.optimizers.Adam(learning_rate=0.001) model.compile(optimizer=opt, loss=keras.losses.binary_crossentropy, metrics=['accuracy'])
ここでは、学習率 0.001 の Adam オプティマイザーと、バイナリ分類タスクに適した損失関数としてのバイナリ クロスエントロピーを使用します。これらの選択肢の長所と短所を分析してみましょう。
成分 | 利点 | デメリット |
---|---|---|
アダム・オプティマイザー | 1. 適応学習率 2. デフォルト設定で適切に機能します。 | 複雑なモデルでは過剰適合する可能性があります。 |
バイナリクロスエントロピー損失 | バイナリ分類に最適 | 私の出力層の活性化関数とあまり互換性がありません。なぜでしょうか? (コメントに残してください!) |
さまざまなオプティマイザー、学習率、損失関数を自由に試してみてください。これは経験を積むのに最適な方法です。
AI 放射線科医をトレーニングする時が来ました。最適なモデルを保存し、検証精度の向上が止まったら早期に停止するようにコールバックを設定します。
from keras.callbacks import ModelCheckpoint, EarlyStopping checkpoint = ModelCheckpoint("vgg16_1.h5", monitor='val_accuracy', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', period=1) early = EarlyStopping(monitor='val_accuracy', min_delta=0, patience=20, verbose=1, mode='auto') hist = model.fit_generator(steps_per_epoch=20, generator=traindata, validation_data=testdata, validation_steps=10, epochs=10, callbacks=[checkpoint, early])
モデルがどのように機能しているかを確認するには、トレーニングと検証の損失と精度をプロットします。
import matplotlib.pyplot as plt # Training loss plt.plot(hist.history['loss']) plt.legend(['Training']) plt.title('Training loss') plt.ylabel('loss') plt.xlabel('epoch') plt.show() # Validation loss plt.plot(hist.history['val_loss']) plt.legend(['Validation']) plt.title('Validation loss') plt.ylabel('validation loss') plt.xlabel('epoch') plt.show() # Training and validation accuracy plt.plot(hist.history['accuracy']) plt.plot(hist.history['val_accuracy']) plt.legend(['Training', 'Validation']) plt.title('Training & Validation accuracy') plt.xlabel('epoch') plt.show()
これらのプロットは、モデルの学習状況や、過剰適合か不足適合かを理解するのに役立ちます。
トレーニング後、当社の AI 放射線科医は予測を行う準備が整います。画像を読み込み、モデルの予測を取得する方法は次のとおりです。
from tensorflow.keras.preprocessing import image # Load and preprocess image img_path = 'path_to_your_image.jpg' img = image.load_img(img_path, target_size=(224, 224)) img_array = image.img_to_array(img) img_array = np.expand_dims(img_array, axis=0) # Create batch axis # Make prediction prediction = model.predict(img_array) print('Prediction:', prediction)
AI 放射線科医の構築はほんの始まりに過ぎません。モデルを微調整して改善するためのヒントをいくつか紹介します。
すごいですね!🎉 医療画像を分析して予測できるモデルを作成しました。医学的に素晴らしい成果ですね!:) ニューラル ネットワーク アーキテクチャの複雑さを深く掘り下げることで、細かく調整された AI モデルがいかに大きな影響力を持つかがわかりました。限界を押し広げ、実験を続け、そして何よりも、AI プロジェクトに取り組むすべての瞬間を楽しんでください。