X quang là một lĩnh vực phụ thuộc đáng kể vào chuyên môn của các chuyên gia có tay nghề cao. Các bác sĩ X quang phân tích hình ảnh y tế để chẩn đoán và theo dõi một loạt tình trạng, từ gãy xương đơn giản đến các bệnh phức tạp như ung thư. Tuy nhiên, với sự phát triển của công nghệ hình ảnh y tế và nhu cầu cấp thiết về chẩn đoán nhanh, chính xác, các bác sĩ X quang đang phải chịu áp lực rất lớn. Đây là lúc trí tuệ nhân tạo (AI) bước vào, biến đổi lĩnh vực này bằng cách nâng cao năng lực của con người. Đến cuối bài viết này, bạn sẽ tạo được mô hình phân loại hình ảnh của riêng mình để hỗ trợ phát hiện bệnh viêm phổi trong hình ảnh y tế.
Trước khi đi sâu vào mã hóa, chúng ta cần đảm bảo môi trường của mình đã sẵn sàng. Chúng ta sẽ bắt đầu bằng cách cài đặt các thư viện cần thiết:
%pip install --upgrade tensorflow keras numpy pandas sklearn pillow
Những thư viện này rất cần thiết để xây dựng và đào tạo mô hình của chúng tôi:
tensorflow
và keras
để tạo và huấn luyện mạng lưới thần kinh.numpy
cho các hoạt động số.pandas
để thao tác dữ liệu.sklearn
để xử lý trước dữ liệu.pillow
để xử lý hình ảnh.Với các thư viện đã được cài đặt, hãy nhập chúng:
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
Chúng tôi bắt đầu bằng cách nhập một số thư viện và mô-đun thiết yếu cần thiết để xây dựng và huấn luyện mô hình mạng thần kinh cho các tác vụ xử lý hình ảnh. Chúng tôi sẽ sử dụng TensorFlow và các mô-đun con của nó để tạo và quản lý các mô hình học sâu của mình. Cụ thể, chúng tôi sẽ nhập Keras để sử dụng làm API cấp cao, Sequential để xây dựng một nhóm lớp tuyến tính và các mô-đun như Dense, Conv2D, MaxPool2D và Flatten để xây dựng và định cấu hình các lớp mạng thần kinh khác nhau. Ngoài ra, ImageDataGenerator sẽ giúp chúng tôi tăng cường dữ liệu hình ảnh, nâng cao khả năng khái quát hóa của mô hình. Cuối cùng, chúng tôi sẽ nhập numpy để hỗ trợ các phép toán số, đặc biệt hữu ích để xử lý mảng và thực hiện các hàm toán học.
Bác sĩ X quang AI của chúng tôi cần dữ liệu để học hỏi. Chúng tôi sẽ sử dụng ImageDataGenerator để tải và tăng cường dữ liệu đào tạo và xác thực của mình: để tải xuống dữ liệu, chúng tôi sẽ sử dụng người bạn dữ liệu nguồn mở Kaggle của mình, hãy truy cập và tải xuống tập dữ liệu được gắn nhãn từ liên kết tại đây.
Trong bối cảnh học tập có giám sát ở đây, tập dữ liệu được gắn nhãn sẽ là sự thật cơ bản mà mô hình học máy phải dự đoán.
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))
Đoạn mã này thiết lập trình tạo dữ liệu cho tập dữ liệu đào tạo và xác thực của chúng tôi. Hình ảnh được thay đổi kích thước thành 224x224 pixel, kích thước đầu vào tiêu chuẩn cho kiểu máy VGG16.
Bây giờ đến phần thú vị: xây dựng mô hình VGG16. VGG16 là kiến trúc mạng nơ ron tích chập (CNN) phổ biến được biết đến với tính đơn giản và hiệu quả nhờ kiến trúc độc đáo được xây dựng chủ yếu trên 13 lớp chập và 3 lớp được kết nối đầy đủ. Điều làm nên sự khác biệt của VGG16 là việc sử dụng các bộ lọc tích chập 3x3 nhỏ trong mạng sâu. Thiết kế này ghi lại các mẫu phức tạp trong hình ảnh đồng thời đảm bảo hiệu quả tính toán. Đây là cách chúng tôi tạo ra nó:
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()
Hãy chia nhỏ nó ra:
Với kiến trúc mô hình đã được xác định, chúng ta cần biên dịch nó:
opt = keras.optimizers.Adam(learning_rate=0.001) model.compile(optimizer=opt, loss=keras.losses.binary_crossentropy, metrics=['accuracy'])
Ở đây, chúng tôi sử dụng trình tối ưu hóa Adam với tốc độ học tập là 0,001 và entropy chéo nhị phân làm hàm mất mát, phù hợp cho các nhiệm vụ phân loại nhị phân. Hãy phân tích ưu và nhược điểm của những lựa chọn này:
Thành phần | Thuận lợi | Nhược điểm |
---|---|---|
Trình tối ưu hóa Adam | 1. Tỷ lệ học tập thích ứng 2. hoạt động tốt với cài đặt mặc định. | Khả năng trang bị quá mức với các mô hình phức tạp. |
Mất Entropy chéo nhị phân | Lý tưởng cho việc phân loại nhị phân | không tương thích lắm với chức năng kích hoạt lớp đầu ra của tôi, tại sao? (Để lại nó trong các ý kiến!) |
Hãy thoải mái thử nghiệm các trình tối ưu hóa, tốc độ học tập và hàm mất mát khác nhau vì đây là một cách tuyệt vời để tích lũy kinh nghiệm.
Đã đến lúc đào tạo bác sĩ X quang AI của chúng ta! Chúng tôi thiết lập lệnh gọi lại để lưu mô hình tốt nhất và dừng sớm nếu độ chính xác xác thực không được cải thiện:
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])
Để xem mô hình của chúng tôi đang hoạt động như thế nào, chúng tôi có thể vẽ sơ đồ mức độ mất mát và độ chính xác trong quá trình đào tạo và xác thực:
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()
Những biểu đồ này sẽ giúp chúng tôi hiểu mô hình của chúng tôi đang học tốt như thế nào và liệu nó có phù hợp hay không.
Sau khi đào tạo, bác sĩ X quang AI của chúng tôi đã sẵn sàng đưa ra dự đoán. Đây là cách bạn có thể tải hình ảnh và nhận dự đoán của mô hình:
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)
Xây dựng một bác sĩ X quang AI chỉ là bước khởi đầu. Dưới đây là một số mẹo để tinh chỉnh và cải thiện mô hình của bạn:
Wow, công việc tuyệt vời! 🎉 Bạn đã tạo ra một mô hình có thể phân tích hình ảnh y tế và đưa ra dự đoán—thật là một thành tựu y học tuyệt vời! :) Bằng cách đi sâu vào sự phức tạp của kiến trúc mạng thần kinh, bạn đã thấy một mô hình AI được tinh chỉnh có thể có tác động như thế nào. Hãy tiếp tục vượt qua các ranh giới, tiếp tục thử nghiệm và quan trọng nhất là tận hưởng từng khoảnh khắc làm việc với các dự án AI của bạn!