(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em(Đồ án tốt nghiệp) Ứng dụng xử lý ảnh và AI để nhận biết bệnh viêm phổi ở trẻ em
BỘ GIÁO DỤC & ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP HỒ CHÍ MINH KHOA ĐIỆN – ĐIỆN TỬ BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH - ĐỒ ÁN TỐT NGHIỆP NGÀNH KỸ THUẬT Y SINH ĐỀ TÀI: ỨNG DỤNG XỬ LÝ ẢNH VÀ AI ĐỂ NHẬN BIẾT BỆNH VIÊM PHỔI Ở TRẺ EM GVHD: ThS Ngô Bá Việt SVTH1: Ngô Thị Anh Thư MSSV1: 16129070 SVTH2: Phạm Thiên Vương MSSV2: 16129085 Tp Hồ Chí Minh - 08/2020 BỘ GIÁO DỤC & ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP HỒ CHÍ MINH KHOA ĐIỆN – ĐIỆN TỬ BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH - ĐỒ ÁN TỐT NGHIỆP NGÀNH KỸ THUẬT Y SINH ĐỀ TÀI: ỨNG DỤNG XỬ LÝ ẢNH VÀ AI ĐỂ NHẬN BIẾT BỆNH VIÊM PHỔI Ở TRẺ EM GVHD: ThS Ngô Bá Việt SVTH1: Ngô Thị Anh Thư MSSV1: 16129070 SVTH2: Phạm Thiên Vương MSSV2: 16129085 Tp Hồ Chí Minh - 08/2020 LỜI CAM ĐOAN Đề tài nhóm tự thực dựa vào số tài liệu có sẵn hướng dẫn thầy hướng dẫn Th.S Ngô Bá Việt khơng chép từ tài liệu hay cơng trình có trước Nếu phát gian dối nhóm hoàn toàn chịu trách nhiệm Người thực đề tài Ngô Thị Anh Thư – Phạm Thiên Vương v LỜI CẢM ƠN Chúng em xin gửi lời cảm ơn sâu sắc đến Thầy Ngô Bá Việt-Giảng viên môn Điện Tử Công Nghiệp-Y Sinh, trực tiếp hướng dẫn tận tình giúp đỡ, chia sẻ nhiều kinh nghiệm quý báu cho chúng em thực tốt đề tài Chúng em xin gửi lời chân thành cảm ơn thầy Khoa Điện-Điện Tử nói chung, thầy mơn Điện Tử Cơng Nghiệp-Y Sinh nói riêng giúp chúng em có sở lý thuyết vững vàng tạo điều kiện tốt cho chúng em hoàn thành đề tài Chúng em gửi lời đồng cảm ơn đến bạn lớp 161290 chia sẻ trao đổi kiến thức kinh nghiệm quý báu thời gian thực đề tài Cuối cùng, xin cảm ơn đến cha mẹ, đấng sinh thành tạo điều kiện, quan tâm, chăm sóc, giúp đỡ, động viên chúng em suốt trình học tập hồn thành khố luận tốt nghiệp Xin chân thành cảm ơn! Người thực đề tài Ngô Thị Anh Thư – Phạm Thiên Vương vi MỤC LỤC NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP i LỊCH TRÌNH THỰC HIỆN ĐỒ ÁN TỐT NGHIỆP iii LỜI CAM ĐOAN v LỜI CẢM ƠN vi MỤC LỤC vii LIỆT KÊ HÌNH VẼ x LIỆT KÊ BẢNG xiii BẢNG LIỆT KÊ TỪ VIẾT TẮT xiv TÓM TẮT xvi Chương TỔNG QUAN 1.1 ĐẶT VẤN ĐỀ 1.2 MỤC TIÊU 1.3 NỘI DUNG NGHIÊN CỨU 1.4 GIỚI HẠN 1.5 BỐ CỤC Chương CƠ SỞ LÝ THUYẾT 2.1 MÔ TẢ VỀ BỆNH VIÊM PHỔI 2.1.1 Khái quát viêm phổi 2.1.2 Bệnh viêm phổi vi-rút 2.1.3 Bệnh viêm phổi vi khuẩn 2.2 CÁC PHƯƠNG PHÁP XỬ LÝ ẢNH SỬ DỤNG 2.2.1 Điểm ảnh lân cận 2.2.2 Lọc nhiễu 10 2.2.3 Phân đoạn ảnh 10 2.3 MẠNG NƠ-RON TÍCH CHẬP 11 2.3.1 Lớp tích chập 12 2.3.2 Lớp Pooling 14 2.3.3 Lớp kết nối đầy đủ 15 2.3.4 Hàm kích hoạt 15 2.3.5 Hàm mát 16 vii 2.4 KIẾN TRÚC MẠNG U-NET 17 2.4.1 Giới thiệu 17 2.4.2 Xây dựng kiến trúc mạng U-Net 17 2.5 TIÊU CHUẨN VỀ TRÍ TUỆ NHÂN TẠO 19 2.6 HỆ THỐNG RFID 20 2.6.1 Giới thiệu công nghệ RFID 20 2.6.2 Giới thiệu phần cứng 20 CHƯƠNG XÂY DỰNG HỆ THỐNG NHẬN DIỆN BỆNH VIÊM PHỔI Ở TRẺ EM 24 3.1 GIỚI THIỆU 24 3.2 EM SƠ ĐỒ KHỐI TOÀN HỆ THỐNG NHẬN DIỆN BỆNH VIÊM PHỔI Ở TRẺ 24 3.3 PHƯƠNG PHÁP PHÂN ĐOẠN PHỔI 26 3.3.1 Ứng dụng phương pháp U-Net vào trình phân đoạn phổi 26 3.3.2 Tập liệu 26 3.3.3 Xây dựng mơ hình phân đoạn ảnh X-quang phổi 27 3.3.4 Lọc ảnh X-quang phổi 30 3.4 XÂY DỰNG MƠ HÌNH HUẤN LUYỆN PHÂN LOẠI BỆNH 32 3.4.1 Xây dựng mơ hình phân loại có bệnh hay khơng có bệnh 32 3.4.2 Xây dựng mơ hình phân loại bệnh phổi 34 3.5 PHÂN TÍCH ĐÁNH GIÁ MẠNG HUẤN LUYỆN 35 3.6 THIẾT KẾ GIAO DIỆN QUẢN LÝ DỮ LIỆU BỆNH NHÂN VÀ HỆ THỐNG PHÂN LOẠI BỆNH VIÊM PHỔI 38 3.6.1 Giới thiệu phần mềm 38 3.6.2 Thiết kế giao diện 39 3.6.3 Phần mềm DB Browser for SQlite 40 3.6.4 Thiết kế hệ thống RFID 43 Chương KẾT QUẢ_NHẬN XÉT_ĐÁNH GIÁ 44 4.1 GIỚI THIỆU 44 4.2 KẾT QUẢ ĐẠT ĐƯỢC 44 4.2.1 Kết phân đoạn phổi 44 4.2.2 Kết huấn luyện phân loại bệnh viêm phổi 45 viii 4.1.3 Giao diện hệ thống nhận diện phân loại bệnh viêm phổi 49 4.1.4 Bộ đọc RFID 51 4.2 KẾT QUẢ THỰC NGHIỆM 52 4.3 HƯỚNG DẪN SỬ DỤNG HỆ THỐNG NHẬN DIỆN VIÊM PHỔI 55 Chương KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 61 5.1 KẾT LUẬN 61 5.2 HƯỚNG PHÁT TRIỂN 61 TÀI LIỆU THAM KHẢO 63 PHỤ LỤC 67 ix LIỆT KÊ HÌNH VẼ Hình Trang Hình 2.1 Ảnh chụp X-quang biểu bệnh viêm phổi vi-rút Hình 2.2 Ảnh chụp X-quang biểu bệnh viêm phổi phế cầu Hình 2.3 Các lân cận điểm ảnh Hình 2.4 Phương pháp lấy ngưỡng 10 Hình 2.5 Mơ tả lớp mơ hình Convolutional neural network 12 Hình 2.6 Minh hoạ stride: Khi stride ma trận đặc trưng có kích thước 3x3 stride ma trận đặc trưng có kích thước 2x2 13 Hình 2.7 Khối đầu vào đệm bit với padding 14 Hình 2.8 Minh hoạ cho kiểu padding 14 Hình 2.9 Mơ tả hai loại lớp tổng hợp max pooling average pooling 15 Hình 2.10 Mạng nơ-ron đầy đủ chứa lớp kết nối đầy đủ FC cuối 15 Hình 2.11 Phân đoạn ảnh tách hình ảnh thành hai đoạn bao gồm mèo 17 Hình 2.12 Ví dụ mô tả kiến trúc mạng lưới U-Net 18 Hình 2.13 Module RFID MFRC522 21 Hình 2.14 Thẻ thụ động 22 Hình 2.15 Thẻ chủ động 22 Hình 2.16 Thẻ Tag bán tích cực 22 Hình 2.17 Bo mạch Arduino UNO R3 23 Hình 3.1 Sơ đồ khối hệ thống nhận diện phân loại 24 Hình 3.2 Sơ đồ khối hệ thống quản lý liệu bệnh nhân 25 Hình 3.3 Sơ đồ khối tổng quát trình phân đoạn phổi 27 Hình 3.4 Kiến trúc U-Net khối phân đoạn phổi 29 Hình 3.5 Quá trình huấn luyện mạng U-Net 30 Hình 3.6 Các thành phần khơng mong muốn cịn sót ảnh phân đoạn 30 Hình 3.7 Lưu đồ quy trình giảm nhiễu cho ảnh 31 Hình 3.8 Mơ hình mạng CNN để phân loại có bệnh hay khơng có bệnh 33 Hình 3.9 Mơ hình mạng nơ-ron tích chập CNN để nhận diện-phân loại bệnh 34 Hình 3.10 Mơ tả hai dạng ma trận ma trận nhầm lẫn 36 x Hình 3.11 Mơ tả cách tính Precision Recall 37 Hình 3.12 Cửa sổ bắt đầu công cụ hỗ trợ xây dựng GUI - Qt Designer 39 Hình 3.13 Cơng cụ có khung thiết kế, khối tiện ích, khối cài đặt giá trị khối hỗ trợ khác 40 Hình 3.14 Màn hình ban đầu DB Browser 40 Hình 3.15 Các tab 'Database Structure' 'DB Schema' mở sở liệu 41 Hình 3.16 Tập hợp thao tác 'Database Structure' 41 Hình 3.17 Khởi tạo sở liệu 42 Hình 3.18 Khởi tạo trường liệu cần thiết 42 Hình 3.19 Thêm thơng tin vào sở liệu lưu lại 42 Hình 3.20 Sơ đồ kết nối Arduino module RC522 43 Hình 4.1 Tập liệu ảnh X-quang phân đoạn phổi 44 Hình 4.2 Hình ảnh sau xử lý thành phần không mong muốn 45 Hình 4.3 Đồ thị độ xác độ lỗi tập liệu train tập liệu val 46 Hình 4.4 Ma trận nhầm lẫn với hai ngỏ dự đoán 46 Hình 4.5 Ma trận nhầm lẫn với ba ngỏ dự đoán 48 Hình 4.6 Giao diện “Dữ liệu bệnh nhân”, nơi cập nhật, lưu trữ truy xuất liệu 49 Hình 4.7 Giao diện “Hệ thống nhận diện phân loại bệnh viêm phổi trẻ em”, nơi chẩn đoán bệnh xuất kết trực tiếp 50 Hình 4.8 Giao diện hồn chỉnh nhận diện phân loại hình ảnh phổi bình thường với hình thức “Chẩn đốn thơng thường” 50 Hình 4.9 Giao diện hồn chỉnh nhận diện phân loại hình ảnh phổi mắc bệnh viêm phổi với hình thức “Chẩn đốn thơng thường” 51 Hình 4.10 Giao diện hồn chỉnh nhận diện phân loại hình ảnh phổi mắc bệnh viêm phổi với hình thức “Chẩn đoán chuyên sâu” 51 Hình 4.11 Sản phẩm sau hồn thành cho đọc thẻ RFID kết nối với máy tính 52 Hình 4.12 Các cửa sổ giao diện mở đầu sau khởi động chương trình 55 Hình 4.13 Thứ tự bước để đăng ký thông tin bệnh nhân 56 Hình 4.14 Hình ảnh nói lên việc đăng ký thơng tin thành công sau quét ID 56 Hình 4.15 Nhấn vào nút “Cập nhật” để hiển thị liệu lên giao diện 57 xi Hình 4.16 Giao diện hồn chỉnh nhận diện phân loại hình ảnh phổi bình thường với hình thức “Chẩn đốn thơng thường” 57 Hình 4.17 Các bước để lưu kết vào liệu bệnh nhân 58 Hình 4.18 Kết cập nhật vào bảng liệu bệnh nhân 58 Hình 4.19 Xem hình ảnh “Kho hình ảnh chẩn đốn” 59 Hình 4.20 Hình ảnh nhận sau quét ID để tìm kiếm thơng tin 59 Hình 4.21 Phiếu thơng tin bệnh án bệnh nhân với đầy đủ thông tin 59 Hình 4.22 Thơng tin kết chẩn đốn bệnh nhân nhấp vào ô “Kết chẩn đoán” 60 xii TÀI LIỆU THAM KHẢO [38] Jaeger S, Karargyris A, Candemir S, Folio L, Siegelman J, Callaghan F, Xue Z, Palaniappan K, Singh RK, Antani S, Thoma G, Wang YX, Lu PX, McDonald CJ, “Automatic tuberculosis screening using chest radiographs”, IEEE Trans Med Imaging 2014 [39] Candemir S, Jaeger S, Palaniappan K, Musco JP, Singh RK, Xue Z, Karargyris A, Antani S, Thoma G, McDonald CJ, “Lung segmentation in chest radiographs using anatomical atlases with nonrigid registration”, IEEE Trans Med Imaging, 2014 [40] Daniel Kermany, Kang Zhang, Michael Goldbaum, “Labeled Optical Coherence Tomography (OTC) and Chest X-Ray Images for Classification”, Mendeley Data, phiên 2, 2018 [41] Vũ Hữu Tiệp, "Bài 33: Các phương pháp đánh giá hệ thống phân lớp", machinelearningcoban.com, 01/2018 (https://machinelearningcoban.com/2017/08/31/evaluation/) [42] "PyQt - Using Qt Designer", tutorialspoint.com (https://www.tutorialspoint.com/pyqt/pyqt_using_qt_designer.htm) BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 66 PHỤ LỤC PHỤ LỤC Kiến trúc mạng U-Net để phân đoạn phổi trái phổi def unet (input_size = (256,256,1)): inputs = Input(input_size) conv1 = Conv2D (32, (3, 3), activation='relu', padding='same') (inputs) conv1 = Conv2D (32, (3, 3), activation='relu', padding='same') (conv1) pool1 = MaxPooling2D (pool_size= (2, 2)) (conv1) conv2 = Conv2D (64, (3, 3), activation='relu', padding='same') (pool1) conv2 = Conv2D (64, (3, 3), activation='relu', padding='same') (conv2) pool2 = MaxPooling2D (pool_size = (2, 2)) (conv2) conv3 = Conv2D (128, (3, 3), activation='relu', padding='same') (pool2) conv3 = Conv2D (128, (3, 3), activation='relu', padding='same') (conv3) pool3 = MaxPooling2D (pool_size = (2, 2)) (conv3) conv4 = Conv2D (256, (3, 3), activation='relu', padding='same') (pool3) conv4 = Conv2D (256, (3, 3), activation='relu', padding='same') (conv4) pool4 = MaxPooling2D (pool_size = (2, 2)) (conv4) conv5 = Conv2D (512, (3, 3), activation='relu', padding='same') (pool4) conv5 = Conv2D (512, (3, 3), activation='relu', padding='same') (conv5) up6 = concatenate ([Conv2Dtranspose (256, (2, 2), strides = (2, 2), padding = (conv5), conv4], axis=3) 'same') conv6 = Conv2D (256, (3, 3), activation='relu', padding='same') (up6) conv6 = Conv2D (256, (3, 3), activation='relu', padding='same') (conv6) up7 = concatenate ([Conv2Dtranspose (128, (2, 2), strides = (2, 2), padding='same') (conv6), conv3], axis=3) conv7 = Conv2D (128, (3, 3), activation='relu', padding='same') (up7) conv7 = Conv2D (128, (3, 3), activation='relu', padding='same') (conv7) up8 = concatenate ([Conv2Dtranspose (64, (2, 2), strides = (2, 2), padding='same') (conv7), conv2], axis=3) conv8 = Conv2D (64, (3, 3), activation='relu', padding='same') (up8) conv8 = Conv2D (64, (3, 3), activation='relu', padding='same') (conv8) up9 = concatenate ([Conv2Dtranspose (32, (2, 2), strides = (2, 2), padding='same') (conv8), conv1], axis=3) BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 67 PHỤ LỤC conv9 = Conv2D (32, (3, 3), activation='relu', padding='same') (up9) conv9 = Conv2D (32, (3, 3), activation='relu', padding='same') (conv9) conv10 = Conv2D (1, (1, 1), activation='sigmoid') (conv9) return Model(inputs=[inputs], outputs=[conv10]) Mơ hình mạng CNN để nhận biết có bệnh hay khơng có bệnh viêm phổi inputs = Input (shape = (img_dims, img_dims, 3)) x = Conv2D (filters=16, kernel_size = (3,3), activation='relu', padding='same') (inputs) x = Conv2D (filters=16, kernel_size = (3,3), activation='relu', padding='same') (x) x = MaxPool2D (pool_size = (2, 2)) (x) x = SeparableConv2D (filters = 32, kernel_size = (3,3), activation='relu', padding='same') (x) x = SeparableConv2D (filters=32, kernel_size = (3,3), activation='relu', padding='same') (x) x = BatchNormalization() (x) x = MaxPool2D (pool_size = (2, 2)) (x) x = SeparableConv2D (filters=64, kernel_size = (3,3), activation='relu', padding='same') (x) x = SeparableConv2D (filters=64, kernel_size = (3,3), activation='relu', padding='same') (x) x = BatchNormalization() (x) x = MaxPool2D (pool_size = (2, 2)) (x) x = SeparableConv2D (filters=128, kernel_size = (3,3), activation='relu', padding='same') (x) x = SeparableConv2D (filters=128, kernel_size = (3,3), activation='relu', padding='same') (x) x = BatchNormalization() (x) x = MaxPool2D (pool_size = (2, 2)) (x) x = Dropou t(rate=0.2) (x) x = SeparableConv2D (filters=256, kernel_size = (3,3), activation='relu', padding='same') (x) x = SeparableConv2D (filters=256, kernel_size = (3,3), activation='relu', padding='same') (x) x = BatchNormalization() (x) x = MaxPool2D (pool_size = (2, 2)) (x) x = Dropout(rate=0.2) (x) x = Flatten() (x) x = Dense (units=512, activation='relu') (x) x = Dropout (rate=0.5) (x) x = Dense (units=128, activation='relu') (x) x = Dropout (rate=0.3) (x) BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 68 PHỤ LỤC x = Dense (units=64, activation='relu') (x) x = Dropout (rate=0.3) (x) output = Dense (units=1, activation='sigmoid') (x) model = Model (inputs=inputs, outputs=output) model.compile (optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) checkpoint = ModelCheckpoint (filepath=2out_23_6_2020.h5', save_best_only=True, save_weights_only=False) lr_reduce = ReduceLROnPlateau (monitor='val_loss', factor=0.3, patience=2, verbose=2, mode='max') early_stop = EarlyStopping (monitor='val_loss', min_delta=0.1, patience=1, mode='min') hist = model.fit_generator (train_gen, steps_per_epoch = train_gen.samples// batch_size, epochs = epochs, validation_data = valid_gen, validation_steps = valid_gen.samples // batch_size, callbacks = [checkpoint, lr_reduce]) Thiết kế giao diện hệ thống nhận diện bệnh viêm phổi trẻ em a Giao diện “Dữ liệu bệnh nhân” class Patient(QMainWindow): def init (self, *args, **kwargs): super(Patient, self). init (*args, **kwargs) self.setWindowIcon(QIcon('icon/logo_nganh_256px.png')) #window icon self.setWindowTitle("Dữ liệu bệnh nhân") self.setMinimumSize(800, 600) self.conn = sqlite3.connect("database.db") self.c = self.conn.cursor() self.c.execute("CREATE TABLE IF NOT EXISTS patients(roll INTEGER ,IDP INTEGER, Name TEXT,Sexual TEXT,BOD INTEGER,Address TEXT,Phone INTEGER, ID INTEGER, BHYT INTEGER, Job TEXT, Lan_kham INTEGER, result_save TEXT, note TEXT)") self.c.close() file_menu = self.menuBar().addMenu("&File") self.tableWidget = QTableWidget() self.setCentralWidget(self.tableWidget) self.tableWidget.setAlternatingRowColors(True) self.tableWidget.setColumnCount(12) self.tableWidget.horizontalHeader().setCascadingSectionResizes(False) self.tableWidget.horizontalHeader().setSortIndicatorShown(False) self.tableWidget.horizontalHeader().setStretchLastSection(True) self.tableWidget.verticalHeader().setVisible(False) self.tableWidget.verticalHeader().setCascadingSectionResizes(False) BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 69 PHỤ LỤC self.tableWidget.verticalHeader().setStretchLastSection(False) label = ["STT", "Mã số BN", "Họ tên bệnh nhân", "Giới tính", "Ngày sinh","Địa chỉ","Điện thoại", "Số CMND","Số BHYT", "Nghề nghiệp", "Lần khám", "Kết chẩn đoán"] self.tableWidget.setHorizontalHeaderLabels(label) header = self.tableWidget.horizontalHeader() header.setSectionResizeMode(0, QtWidgets.QHeaderView.ResizeToContents) header.setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents) header.setSectionResizeMode(2, QtWidgets.QHeaderView.ResizeToContents) header.setSectionResizeMode(3, QtWidgets.QHeaderView.ResizeToContents) header.setSectionResizeMode(4, QtWidgets.QHeaderView.ResizeToContents) header.setSectionResizeMode(5, QtWidgets.QHeaderView.ResizeToContents) header.setSectionResizeMode(6, QtWidgets.QHeaderView.ResizeToContents) header.setSectionResizeMode(7, QtWidgets.QHeaderView.ResizeToContents) header.setSectionResizeMode(8, QtWidgets.QHeaderView.ResizeToContents) header.setSectionResizeMode(9, QtWidgets.QHeaderView.ResizeToContents) header.setSectionResizeMode(10, QtWidgets.QHeaderView.ResizeToContents) header.setSectionResizeMode(11, QtWidgets.QHeaderView.Stretch) stylesheet = "::section{Background-color:rgb(204, 255, 255); border: 1px solid black}" header.setStyleSheet(stylesheet) self.tableWidget.itemDoubleClicked.connect(self.show_result) toolbar = QToolBar() toolbar.setMovable(False) self.addToolBar(toolbar) statusbar = QStatusBar() self.setStatusBar(statusbar) self.rp = QLineEdit(self) self.rp.setPlaceholderText("Tìm kiếm ID ") self.rp.move(40,1) self.rp.resize(200,17) self.rp.returnPressed.connect(self.onPressed) btn_ac_rfid = QAction(QIcon("icon/rfid-signal.png"),"Quét thông tin",self) btn_ac_rfid.triggered.connect(self.rfid) btn_ac_rfid.setStatusTip("Quét thông tin") toolbar.addAction(btn_ac_rfid) btn_ac_adduser = QAction(QIcon("icon/add1.jpg"), "Thêm bệnh nhân", self) btn_ac_adduser.triggered.connect(self.insert) btn_ac_adduser.setStatusTip("Thêm bệnh nhân") toolbar.addAction(btn_ac_adduser) btn_ac_refresh = QAction(QIcon("icon/r3.png"),"Cập nhật",self) btn_ac_refresh.triggered.connect(self.loaddata) btn_ac_refresh.setStatusTip("Bảng cập nhật") toolbar.addAction(btn_ac_refresh) BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 70 PHỤ LỤC btn_ac_delete = QAction(QIcon("icon/d1.png"), "Xoá", self) btn_ac_delete.triggered.connect(self.delete) btn_ac_delete.setStatusTip("Xoá bệnh nhân") toolbar.addAction(btn_ac_delete) btn_ac_data = QAction(QIcon("icon/folder-icon.png"), "Kho hình ảnh chẩn đốn", self) btn_ac_data.triggered.connect(self.datasave) btn_ac_data.setStatusTip("Kho hình ảnh chẩn đốn") toolbar.addAction(btn_ac_data) btn_ac_print = QAction(QIcon("icon/print.png"), "In thơng tin bệnh án", self) btn_ac_print.triggered.connect(self.print) btn_ac_print.setStatusTip("Thông tin bệnh án") toolbar.addAction(btn_ac_print) btn_ac_next = QAction(QIcon("icon/next-icon.png"), "Tiếp theo", self) btn_ac_next.triggered.connect(self.next) btn_ac_next.setStatusTip("Tiếp theo") toolbar.addAction(btn_ac_next) btn_ac_back = QAction(QIcon("icon/back-icon.png"), "Trở lại", self) btn_ac_back.triggered.connect(self.back) btn_ac_back.setStatusTip("Trở lại") toolbar.addAction(btn_ac_back) adduser_action = QAction(QIcon("icon/add1.jpg"),"Thêm bệnh nhân", self) adduser_action.triggered.connect(self.insert) file_menu.addAction(adduser_action) searchuser_action = QAction(QIcon("icon/s1.png"), "Tìm bệnh nhân", self) searchuser_action.triggered.connect(self.search) file_menu.addAction(searchuser_action) deluser_action = QAction(QIcon("icon/d1.png"), "Xoá", self) deluser_action.triggered.connect(self.delete) file_menu.addAction(deluser_action) self.connection = sqlite3.connect("database.db") query = "SELECT * FROM patients" result = self.connection.execute(query) self.tableWidget.setRowCount(0) for row_number, row_data in enumerate(result): self.tableWidget.insertRow(row_number) for column_number, data in enumerate(row_data): self.tableWidget.setItem(row_number, column_number,QTableWidgetItem(str(data))) self.connection.close() def loaddata(self): self.connection = sqlite3.connect("database.db") BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 71 PHỤ LỤC query = "SELECT * FROM patients" result = self.connection.execute(query) self.tableWidget.setRowCount(0) for row_number, row_data in enumerate(result): self.tableWidget.insertRow(row_number) for column_number, data in enumerate(row_data): self.tableWidget.setItem(row_number, column_number,QTableWidgetItem(str(data))) self.connection.close() def handlePaintRequest(self, printer): document = QTextDocument() cursor = QTextCursor(document) model = self.table.model() table = cursor.insertTable(model.rowCount(), model.columnCount()) for row in range(table.rows()): for column in range(table.columns()): cursor.insertText(model.item(row, column).text()) cursor.movePosition(QTextCursor.NextCell) document.print_(printer) b Giao diện chẩn đoán bệnh viêm phổi class Window2(QMainWindow): def init (self): super(). init () self.setWindowTitle("Hệ Thống Nhận Diện Và Phân Loại Bệnh Viêm Phổi Ở Trẻ Em") self.resize(1270, 750) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.setFont(font) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap("logo_nganh_256px.ico"), QtGui.QIcon.Active, QtGui.QIcon.On) self.setWindowIcon(icon) self.centralwidget = QtWidgets.QWidget() self.centralwidget.setObjectName("centralwidget") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(240, 0, 771, 101)) self.label.setStyleSheet("background-color: rgb(29, 184, 255);") self.label.setObjectName("label") self.label_2 = QtWidgets.QLabel(self.centralwidget) BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 72 PHỤ LỤC self.label_2.setGeometry(QtCore.QRect(0, 680, 1280, 51)) self.label_2.setStyleSheet("background-color: rgb(241, 237, 117);") self.label_2.setText("") self.label_2.setObjectName("label_2") self.label_3 = QtWidgets.QLabel(self.centralwidget) self.label_3.setGeometry(QtCore.QRect(-30, -10, 1341, 721)) self.label_3.setStyleSheet("image: url(:/100/bg6.png);") self.label_3.setText("") self.label_3.setObjectName("label_3") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(1150, 690, 101, 31)) self.pushButton.setStyleSheet("QPushButton""{""font: 11pt \".VnBlack\";\n" "background-color: rgb(255, 255, 255);\n" "color: rgb(0, 0, 0);\n" "border: 3px solid gray;\n" "border-radius: 10px;""}" "QPushButton::pressed" "{" "background-color : gray;" "}") icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(":/23/delete.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.pushButton.setIcon(icon) self.pushButton.setObjectName("pushButton") self.pushButton.clicked.connect(self.delete_bn) self.label_4 = QtWidgets.QLabel(self.centralwidget) self.label_4.setGeometry(QtCore.QRect(910, -20, 111, 131)) self.label_4.setStyleSheet("image: url(:/34/logo_khoa.jpg);") self.label_4.setText("") self.label_4.setObjectName("label_4") self.label_5 = QtWidgets.QLabel(self.centralwidget) self.label_5.setGeometry(QtCore.QRect(220, 0, 121, 101)) self.label_5.setStyleSheet("image: url(:/7/logo_truong.png);") self.label_5.setText("") self.label_5.setObjectName("label_5") self.label_6 = QtWidgets.QLabel(self.centralwidget) self.label_6.setGeometry(QtCore.QRect(140, 120, 961, 71)) self.label_6.setObjectName("label_6") self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_5.setGeometry(QtCore.QRect(90, 220, 221, 51)) font = QtGui.QFont() BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 73 PHỤ LỤC font.setFamily("Times New Roman") font.setPointSize(20) font.setBold(True) font.setWeight(75) self.pushButton_5.setFont(font) self.pushButton_5.setStyleSheet("QPushButton" "{""background-color: rgb(230, 153, 230);\n" "border: 3px solid black;\n" "border-radius: 10px;""}" "QPushButton::pressed" "{" "background-color : gray;" "}") self.pushButton_5.setIconSize(QtCore.QSize(30, 30)) self.pushButton_5.setObjectName("pushButton_5") self.pushButton_5.clicked.connect(self.open_bn) self.pushButton_5.clicked.connect(self.comboChanged) self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_2.setGeometry(QtCore.QRect(535, 220, 231, 51)) font = QtGui.QFont() font.setFamily("Times New Roman") font.setPointSize(20) font.setBold(True) font.setWeight(75) self.pushButton_2.setFont(font) self.pushButton_2.setStyleSheet("QPushButton""{""background-color: rgb(0, 213, 0);\n" "border: 3px solid black;\n" "border-radius: 10px;""}" "QPushButton::pressed" "{" "background-color : gray;" "}") self.pushButton_2.setIconSize(QtCore.QSize(30, 30)) self.pushButton_2.setObjectName("pushButton_2") self.pushButton_2.clicked.connect(self.segment_bn) self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_3.setGeometry(QtCore.QRect(970, 220, 221, 51)) font = QtGui.QFont() font.setFamily("Times New Roman") font.setPointSize(20) font.setBold(True) font.setWeight(75) BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 74 PHỤ LỤC self.pushButton_3.setFont(font) self.pushButton_3.setStyleSheet("QPushButton""{""background-color: rgb(255, 85, 0);\n" "border: 3px solid black;\n" "border-radius: 10px;""}" "QPushButton::pressed" "{" "background-color : gray;" "}") self.pushButton_3.setIconSize(QtCore.QSize(30, 30)) self.pushButton_3.setObjectName("pushButton_3") self.pushButton_3.clicked.connect(self.result_bn) self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_4.setGeometry(QtCore.QRect(20, 690, 101, 31)) self.pushButton_4.setStyleSheet("QPushButton""{""font: 11pt \".VnBlack\";\n" "background-color: rgb(255, 255, 255);\n" "color: rgb(0, 0, 0);\n" "border: 3px solid gray;\n" "border-radius: 10px;""}" "QPushButton::pressed" "{" "background-color : gray;" "}") icon4 = QtGui.QIcon() icon4.addPixmap(QtGui.QPixmap("back-icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.pushButton_4.setIcon(icon4) self.pushButton_4.setIconSize(QtCore.QSize(25, 25)) self.pushButton_4.setObjectName("pushButton_4") self.pushButton_4.clicked.connect(self.back_bn) self.pushButton_6 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_6.setGeometry(QtCore.QRect(1045, 690, 101, 31)) self.pushButton_6.setStyleSheet("QPushButton""{""font: 11pt \".VnBlack\";\n" "background-color: rgb(255, 255, 255);\n" "color: rgb(0, 0, 0);\n" "border: 3px solid gray;\n" "border-radius: 10px;""}" "QPushButton::pressed" "{" "background-color : gray;" "}") icon2 = QtGui.QIcon() BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 75 PHỤ LỤC icon2.addPixmap(QtGui.QPixmap("31m7x1MRkWL.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.pushButton_6.setIcon(icon2) self.pushButton_6.setIconSize(QtCore.QSize(23, 23)) self.pushButton_6.setObjectName("pushButton_6") self.pushButton_6.clicked.connect(self.save_bn) self.label_7 = QtWidgets.QLabel(self.centralwidget) self.label_7.setGeometry(QtCore.QRect(50, 210, 71, 71)) self.label_7.setStyleSheet("border: 3px solid black;\n" "border-radius: 35px;\n" "background-color: rgb(255, 255, 255);\n" "image: url(:/98/image open2.png);") self.label_7.setText("") self.label_7.setObjectName("label_7") self.label_8 = QtWidgets.QLabel(self.centralwidget) self.label_8.setGeometry(QtCore.QRect(495, 210, 71, 71)) self.label_8.setStyleSheet("border: 3px solid black;\n" "border-radius: 35px;\n" "background-color: rgb(255, 255, 255);\n" "image: url(:/97/lungseg - Copy.png);") self.label_8.setText("") self.label_8.setObjectName("label_8") self.label_9 = QtWidgets.QLabel(self.centralwidget) self.label_9.setGeometry(QtCore.QRect(920, 210, 71, 71)) self.label_9.setStyleSheet("border: 3px solid black;\n" "border-radius: 35px;\n" "background-color: rgb(255, 255, 255);\n" "image: url(:/93/result icon - Copy.jpg);") self.label_9.setText("") self.label_9.setObjectName("label_9") self.comboBox = QtWidgets.QComboBox(self.centralwidget) self.comboBox.setGeometry(QtCore.QRect(990, 270, 185, 30)) font = QtGui.QFont() font.setPointSize(9) self.comboBox.setFont(font) self.comboBox.setStyleSheet("border: 3px solid black;\n" "border-radius: 5px;") self.comboBox.setObjectName("comboBox") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.currentTextChanged.connect(self.comboChanged) self.label_10 = QtWidgets.QLabel(self.centralwidget) BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 76 PHỤ LỤC self.label_10.setGeometry(QtCore.QRect(900, 310, 150, 31)) self.label_10.setStyleSheet("border: 2px solid black;\n" "background-color: rgb(255, 255, 255);") self.label_10.setText("Kết chẩn đoán:") self.label_10.setObjectName("label_10") font = QtGui.QFont() font.setFamily("Times New Roman") font.setPointSize(13) font.setBold(True) font.setWeight(75) self.label_10.setFont(font) self.label_11 = QtWidgets.QLabel(self.centralwidget) self.label_11.setGeometry(QtCore.QRect(900, 450, 70, 30)) self.label_11.setStyleSheet("border: 2px solid black;\n""background-color: rgb(255, 255, 255);") self.label_11.setText("Ghi chú:") self.label_11.setObjectName("label_11") font = QtGui.QFont() font.setFamily("Times New Roman") font.setPointSize(12) font.setBold(True) font.setWeight(75) self.label_11.setFont(font) self.label_3.raise_() self.label.raise_() self.label_2.raise_() self.pushButton.raise_() self.label_4.raise_() self.label_5.raise_() self.label_6.raise_() self.pushButton_5.raise_() self.pushButton_2.raise_() self.pushButton_3.raise_() self.pushButton_4.raise_() self.pushButton_6.raise_() self.label_7.raise_() self.label_8.raise_() self.label_9.raise_() self.label_10.raise_() self.label_11.raise_() self.comboBox.raise_() self.setCentralWidget(self.centralwidget) BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 77 PHỤ LỤC self.retranslateUi() def retranslateUi(self): _translate = QtCore.QCoreApplication.translate self.setWindowTitle(_translate("MainWindow", "Hệ Thống Nhận Diện Và Phân Loại Bệnh Viêm Phổi Ở Trẻ Em")) self.label.setText(_translate("MainWindow", "TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TPHCM
KHOA ĐIỆN-ĐIỆN TỬ
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP-Y SINH
")) self.pushButton.setText(_translate("MainWindow", "DELETE")) self.label_6.setText(_translate("MainWindow", "ĐỒ ÁN TỐT NGHIỆP
ỨNG DỤNG XỬ LÝ ẢNH VÀ AI ĐỂ NHẬN DIỆN BỆNH VIÊM PHỔI Ở TRẺ EM
")) self.pushButton_5.setText(_translate("Classification", "CHỌN ẢNH")) self.pushButton_2.setText(_translate("Classification", "TÁCH PHỔI")) self.pushButton_3.setText(_translate("Classification", "CHẨN ĐOÁN")) self.pushButton_4.setText(_translate("Classification", "BACK")) self.comboBox.setItemText(0, _translate("Classification", "1 Chẩn đốn thơng thường")) self.comboBox.setItemText(1, _translate("Classification", "2 Chẩn đốn chun sâu")) self.pushButton_6.setText(_translate("MainWindow", "SAVE")) self.show() Chương trình nạp cho Arduino UNO kết nối với đầu đọc thẻ RC522 #include "SPI.h" #include "MFRC522.h" #define SS_PIN #define RFID_SCK 18 #define RFID_MOSI 23 #define RFID_MISO 19 #define RST_PIN 22 #define RST_PIN // Configurable, see typical pin layout above #define SS_PIN 10 // Configurable, see typical pin layout above #define SS_PIN 10 #define SP_PIN #define BUZZER MFRC522 rfid(SS_PIN, RST_PIN); BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 78 PHỤ LỤC MFRC522::MIFARE_Key key; void setup() { Serial.begin(9600); SPI.begin(); rfid.PCD_Init(); } void loop() { if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) return; MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI && piccType != MFRC522::PICC_TYPE_MIFARE_1K && piccType != MFRC522::PICC_TYPE_MIFARE_4K) { Serial.println(F("Your tag is not of type MIFARE Classic.")); return; } String strID = ""; for (byte i = 0; i < 4; i++) { strID += (rfid.uid.uidByte[i] < 0x10 ? "0" : "") + String(rfid.uid.uidByte[i],DEC); } tone(BUZZER, 600); delay(150); noTone(BUZZER); delay(500); strID.toUpperCase(); Serial.println(strID); rfid.PICC_HaltA(); rfid.PCD_StopCrypto1(); } BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 79 S K L 0 ... HỆ THỐNG NHẬN DIỆN BỆNH VIÊM PHỔI Ở TRẺ EM CHƯƠNG XÂY DỰNG HỆ THỐNG NHẬN DIỆN BỆNH VIÊM PHỔI Ở TRẺ EM 3.1 GIỚI THIỆU Với đề tài ? ?Ứng dụng xử lý ảnh AI để nhận biết bệnh viêm phổi trẻ em? ??, nhóm... TẮT Với đề tài ? ?Ứng dụng xử lý ảnh AI để nhận biết bệnh viêm phổi trẻ em? ??, nhóm phát triển mạnh phần mềm huấn luyện mạng nơ-ron nhân tạo ứng dụng xử lý ảnh để nhận biết bệnh viêm phổi Nhóm thiết... BỆNH VIÊM PHỔI Ở TRẺ EM Hệ thống nhận diện bệnh viêm phổi trẻ em nhận ảnh đầu vào ảnh chụp XQuang với định dạng jpeg Đầu giá trị dự đoán nhãn ảnh với hai phương pháp bao gồm Có bệnh / Khơng bệnh