Chẩn đoán bệnh viêm phổi từ ảnh chụp X-Quang bằng Deep learning

550
Chẩn đoán bệnh viêm phổi từ ảnh chụp X-Quang bằng Deep learning

Người viết: Quy Nguyen

Ứng dụng của AI nói chung và Deep learning nói riêng ngày càng trở nên phổ biến trong cuộc sống con người. AI đã có thể làm thay con người trong nhiều lĩnh vực, với những dữ liệu đã được tổng hợp và lưu trữ bằng máy tính sẽ giúp AI ngày càng thông minh hơn.

Một trong những lĩnh vực mà AI có thể áp dụng vào rất tốt đó là lĩnh vực y tế, đó cũng là tiềm năng rất lớn ở Việt Nam cũng như trên thế giới.

Hôm nay mình sẽ giới thiệu tới các bạn 1 bài toán khá thú vị về medical image analysis, ứng dụng Chẩn đoán bệnh viêm phổi, sử dụng Deep learning và các kỹ thuật liên quan đến dữ liệu và tối ưu hiệu quả mô hình.

Xem thêm Deep learning là gì.

Mô tả bài toán

Viêm phổi là một bệnh khá phổ biến, nguyên nhân của bệnh viêm phổi có thể là do:

  1. Viêm phổi do vi khuẩn;
  2. Viêm phổi do virus;
  3. Viêm phổi do nấm;
  4. Viêm phổi do hóa chất.

Vì các dạng bệnh được thể hiện trên film chụp X-Quang là khác nhau nên phạm vi bài toán này chỉ giải quyết việc chẩn đoán bệnh cho nguyên nhân 1 và 2.

  Ứng dụng Deep Learning cho bài toán nhận diện chữ viết (OCR)
  Muốn biết cách thức hoạt động của Deep Learning? Hãy đọc hướng dẫn nhanh sau!

Bước 1: Cách tiếp cận bài toán

Dựa vào các hình ảnh chụp X-Quang ta sẽ tiến hành phân loại thành 2 loại: mắc bệnh và không mắc bệnh.

Đây là bài toán phân loại hình ảnh bình thường, tuy nhiên đây chỉ là một mô hình để các bạn học tập nên bộ dữ liệu mẫu rất ít, đòi hỏi chũng ta phải hiểu cách thức hoạt động của mô hình để xây dựng 1 mô hình chấp nhận được ngay cả với một lượng dữ liệu hạn chế.

Để thực hiện việc này chúng ta sẽ sử dụng mạng CNN (VGG16), có sử dụng transfer learning và data augmentation để cải thiện hiệu quả huấn luyện mô hình

Bước 2: Chuẩn bị dữ liệu.

Dữ liệu được public trong y tế rất ít và chúng ta chỉ đang nghiên cứu nên bộ dataset có được cũng khá hạn chế. Bộ dữ liệu được sử dụng mình lấy trên Kaggle với dung lượng ~1Gb

Chẩn đoán bệnh viêm phổi từ ảnh chụp X-Quang bằng Deep learning

Reference: https://www.kaggle.com/paultimothymooney/chest-xray-pneumonia

Bộ dataset này gồm 3 thư mục (train, test, val) và trong mỗi thư mục sẽ là các loại tương ứng (Pneumonia/Normal). Có tất cả 5,863 ảnh JPEG đã được các bác sỹ chuyên khoa phân loại bằng tay và chia làm 2 loại.

Tải về tại đây.

Import thư viện

Dữ liệu sẽ nằm trong thư mục ../input

Thiết lập một số tham số cho Keras và tensorflow

Tiến hành phân chia dữ liệu

Chúng ta đi thử vào 1 thư mục trong tập training, mỗi thư mục sẽ chứa 2 thư mục con:

NORMAL: Các ảnh được đánh nhãn là không bị bệnh PNEUMONIA: Thư mục gồm các ảnh đánh nhãn là bị mắc bệnh

Chúng ta in thử kết quả

image label
0 ../input/chest-xray-pneumonia/chest_xray/chest… 0
1 ../input/chest-xray-pneumonia/chest_xray/chest… 0
2 ../input/chest-xray-pneumonia/chest_xray/chest… 1
3 ../input/chest-xray-pneumonia/chest_xray/chest… 1
4 ../input/chest-xray-pneumonia/chest_xray/chest… 1

Thống kê về tập dữ liệu, số lượng các mẫu bị bênh / không bị bệnh

Chẩn đoán bệnh viêm phổi từ ảnh chụp X-Quang bằng Deep learning

Chúng ta có nhận xét sơ bộ về dữ liệu: Các trường hợp bị viêm phổi gấp 3 lần các trường hợp bình thường. Điều này rất bình thường trong các dữ liệu về y tế, dữ liệu sẽ bị không đồng đều, có quá nhiều trường hợp bình thường hoặc có quá nhiều trường hợp bị bệnh. Chúng ta hiển thị thử xem một vài mẫu từ dữ liệu training xem sao:

Chẩn đoán bệnh viêm phổi từ ảnh chụp X-Quang bằng Deep learning

Bằng mắt thường chúng ta khó có thể phân biệt được đâu là trường hợp bị bệnh, đâu là trường hợp không bị bệnh. Vì vậy nếu có thể xây dựng được một mô hình mạnh mẽ thì hẳn sẽ cực kì có ích với bác sỹ.

Chuẩn bị dữ liệu kiểm thử

Bước 3: Tiền xử lý dữ liệu

Augmentation

Một kỹ thuật nữa giúp tiếp tục cải thiện mô hình là tạo ra nhiều dữ liệu training từ dữ liệu training ban đầu. Thoạt nghe có vẻ vô lý, nhưng kỹ thuật này rất hiệu quả. Kỹ thuật này có tên là Image Augmentation. Nghĩa là tạo ra các bức ảnh từ 1 ảnh ban đầu, ví dụ như xoay trái, xoay phải, thêm bộ lọc…

Trong bộ data này chúng ta sẽ tạo ra các dữ liệu mới bằng cách lật theo chiều ngang, xoay ảnh và thêm các điều kiện sáng tối khác nhau

Bước cuối cùng của việc chuẩn bị dữ liệu là khởi tạo dữ liệu training

Bước 4: Định nghĩa mô hình

Đây dường như là phần quan trọng nhất và cần nhiều kỹ thuật để nâng cao hiệu quả huấn luyên. Nhiều người sẽ chọn cách sử dụng transfer learning và fine-tuning từ các mạng đã được học sẵn. Đây là cách làm hiệu quả với hầu hết các bài toán mà tập dữ liệu huấn luyện ít. Chúng ta sẽ thực hiện việc này nhưng với một vài thay đổi để mô hình hiệu quả hơn:

  • Sử dụng mạng đơn giản, ít tham số;
  • Thay vì việc transfer cả mạng, ta sẽ sử dụng các tham số đã được huấn luyện cho mô hình với các layer gốc và thêm vào 1 số layer đầu tiên để trích xuất một số đặc điểm như đốm màu, vùng ảnh, cạnh, v.v. Các layer gốc thay vì khởi tạo tham số ngẫu nhiên, chúng ta sẽ lấy tham số từ mạng đã được học từ trước;
  • Chọn các Layer ít tham số hơn, ví dụ như Depthwise separableConv là sự thay thế tốt cho lớp Conv, số lượng tham số ít hơn và các thông tin trích xuất được nhiều hơn. Bạn có thể đọc thêm tại paper;
  • Tiến hành training với learning rate nhỏ với weight decay.

Nói thế chắc cũng đủ rồi, chúng ta đi vào code:

Thông tin của mô hình:

Load weight từ pre-train của VGG16 và gán cho các layer:

Bước 5: Training thuật toán

Complie mô hình

Lấy dữ liệu

Training

Việc training này khá lâu, có thể mất một vài tiếng phụ thuộc vào cấu hình máy bạn. Nếu bạn không muốn chạy qua bước này thì mình đã thực hiện rồi, bạn chỉ cần load file weight do mình đã training trước rồi. Bạn tải file ở đây.

Chẩn đoán bệnh viêm phổi từ ảnh chụp X-Quang bằng Deep learning

Bước 6: Kiểm thử mô hình

Đánh giá tập test:

Thử dự đoán tập test:

Bước 7: Đánh giá mô hình

Để đánh giá mô hình, chúng ta sử dụng ma trận confusion

Kết quả

Chẩn đoán bệnh viêm phổi từ ảnh chụp X-Quang bằng Deep learning

Đánh giá bằng chỉ số Precision and Recall:

Kết luận

Cảm ơn các bạn đã theo dõi bài viết. Hy vọng bài viết này sẽ có ích cho bạn.

Source code:

  • Bạn có thể tải về source code tại đây
  • Các Weight sử dụng để training bạn có thể tải về ở đây

Có thể bạn quan tâm:

Xem thêm việc làm Software Developers trên TopDev

TopDev via viblo.asia

  Phát hiện giả mạo khuôn mặt bằng Deep Learning
  Machine Translation với thuật toán Attention trong Deep Learning