Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 106 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
106
Dung lượng
9,07 MB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH ĐỒ ÁN TỐT NGHIỆP NGÀNH KỸ THUẬT Y SINH ỨNG DỤNG MÔ HÌNH VISION TRANSFORMER TRONG PHÂN LOẠI DỮ LIỆU BỆNH PHỔI GVHD: TS NGUYỄN MẠNH HÙNG SVTH: NGÔ QUANG KHẢI HUỲNH VĂN PHÁP SKL008906 Tp.Hồ Chí Minh, tháng 6/2022 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 - KHÓA LUẬN TỐT NGHIỆP NGÀNH KỸ THUẬT Y SINH ĐỀ TÀI: ỨNG DỤNG MÔ HÌNH VISION TRANSFORMER TRONG PHÂN LOẠI DỮ LIỆU BỆNH PHỔI GVHD: TS Nguyễn Mạnh Hùng SVTH1: Ngô Quang Khải MSSV1: 18129026 SVTH2: Huỳnh Văn Pháp MSSV2: 18129041 TP Hồ Chí Minh – 06/2022 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 - KHÓA LUẬN TỐT NGHIỆP NGÀNH KỸ THUẬT Y SINH ĐỀ TÀI: ỨNG DỤNG MƠ HÌNH VISION TRANSFORMER TRONG PHÂN LOẠI DỮ LIỆU BỆNH PHỔI GVHD: TS Nguyễn Mạnh Hùng SVTH1: Ngô Quang Khải MSSV1: 18129026 SVTH2: Huỳnh Văn Pháp MSSV2: 18129041 TP Hồ Chí Minh – 06/2022 TRƯỜNG ĐH SPKT TP HỒ CHÍ MINH KHOA ĐIỆN-ĐIỆN TỬ BỘ MƠN ĐIỆN TỬ CƠNG NGHIỆP – Y SINH CỘNG HỊA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập - Tự - Hạnh phúc Tp HCM, ngày tháng 06 năm 2022 NHIỆM VỤ KHÓA LUẬN TỐT NGHIỆP Họ tên sinh viên: Chun ngành: Hệ đào tạo: Khóa: Ngơ Quang Khải Huỳnh Văn Pháp Kỹ thuật Y Sinh Đại học quy 2018 MSSV: 18129026 MSSV: 18129041 Mã ngành: 7520212D Mã hệ: Lớp: 181290C I TÊN ĐỀ TÀI: ỨNG DỤNG MÔ HÌNH VISION TRANSFORMER TRONG PHÂN LOẠI DỮ LIỆU BỆNH PHỔI II NHIỆM VỤ Các số liệu ban đầu: - Tập liệu X-quang ngực: ChestXpert, Chest14 VinDr-CXR - Các mơ hình Vision Transformer: ViT-B16, ViT-L16, ViT-S16, R50+ViT-B16 - Các biến thể mơ hình ResNet: ResNet18, ResNet34, ResNet50 - Các chế diễn giải mơ hình: Grad-CAM, Attention Map - Ngơn ngữ lập trình: Python, HTML, CSS - Thư viện hỗ trợ xây dựng web API: Flask python - Cơ sở liệu: SQLite, tương tác thông qua công cụ SQLAlchemy - Cơng nghệ đóng gói triển khai ứng dụng: Docker Nội dung thực hiện: - Tìm hiểu lý thuyết mơ hình phân loại - Nghiên cứu tập liệu Chest14, ChestExpert, VinDR-CXR tạo tập liệu phù hợp với đề tài - Tiến hành thí nghiệm huấn luyện mơ hình ViT - Đánh giá kết thí nghiệm phương pháp định tính định lượng - Xây dựng web API cho ứng dụng mơ hình phân loại bệnh phổi i - Chạy thử nghiệm, kiểm tra hiệu chỉnh hệ thống - Đóng gói triển khai ứng dụng với Docker - Viết báo cáo thực - Bảo vệ luận văn III NGÀY GIAO NHIỆM VỤ: 25/02/2022 IV NGÀY HOÀN THÀNH NHIỆM VỤ: 21/06/2022 V HỌ VÀ TÊN CÁN BỘ HƯỚNG DẪN: Ts Nguyễn Mạnh Hùng CÁN BỘ HƯỚNG DẪN BM ĐIỆN TỬ CÔNG NGHIỆP – Y SINH ii TRƯỜNG ĐH SPKT TP HỒ CHÍ MINH KHOA ĐIỆN-ĐIỆN TỬ BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập - Tự - Hạnh phúc Tp HCM, ngày tháng 06 năm 2022 LỊCH TRÌNH THỰC HIỆN KHĨA LUẬN TỐT NGHIỆP Họ tên sinh viên 1: Ngô Quang Khải Lớp: 181290C MSSV: 18129026 Họ tên sinh viên 2: Huỳnh Văn Pháp Lớp: 181290C MSSV: 18129041 Tên đề tài: Ứng dụng mơ hình Vision Transformer phân loại liệu bệnh phổi Tuần/ngày Tuần (28/02 – 06/03) Tuần (07/03 – 13/03) Tuần (14/03 – 20/03) Tuần (21/03 – 27/03) Tuần (28/03 – 03/04) Tuần (04/04 – 10/04) Tuần (11/04 – 17/04) Nội dung GVHD Gặp GVHD để nghe phổ biến yêu cầu làm đồ án, tiến hành chọn đề tài viết đề cương tóm tắt yêu cầu đề tài chọn Tổ chức liệu thí nghiệm từ tập liệu VinDr-XCR Tiến hành thí nghiệm để đánh giá hiệu suất mơ hình Hồn thành thí nghiệm huấn luyện mơ hình Chạy đánh giá kết định tính cho mơ hình huấn luyện từ thí nghiệm Tiến hành đánh giá định lượng mơ hình Tìm hiểu cách triển khai ứng dụng model thơng qua API, tìm hiểu Docker Tuần Xây dựng ứng dụng web cho mơ hình phân loại (18/04 – 24/04) giao thức API với Flask python, html, css Tuần Thêm chức gửi thông báo kết (25/04 – 01/05) Xác nhận chẩn đoán bệnh qua email số điện thoại Tuần Tìm hiểu thêm sở liệu cho ứng dụng, (01/05 – 08/05) thêm chức đăng ký lưu trữ thơng tin iii bệnh nhân Hồn thiện chức ứng dụng: Tuần 10 chức đăng ký bệnh nhân, chức dự (09/05 – 15/05) đốn mơ hình, chức gửi email tin nhắn SMS Tuần 11 Thiết kế hoàn thiện giao diện người dùng (16/05 – 22/05) ứng dụng web, chạy thử nghiệm hiệu chỉnh Tuần 12 (23/05 – 29/05) Tuần 13 (30/05 – 05/06) Tuần 14 (06/06 – 12/06) Tuần 15 (13/06 – 19/06) Đóng gói triển khai ứng dụng với Docker Viết báo cáo đề tài, thiết kế poster Chỉnh sửa báo cáo, làm Slide thuyết trình Hồn thiện báo cáo, Slide thuyết trình, làm video giới thiệu ứng dụng Hoàn thiện báo cáo gửi cho GVHD xem xét Tuần 16 (20/06 – 26/06) góp ý Báo cáo trước GVHD nộp báo cáo Đồ án tốt nghiệp GV HƯỚNG DẪN (Ký ghi rõ họ tên) iv LỜI CAM ĐOAN Đề tài nhóm tìm hiểu, thực dựa số tài liệu kết nghiên cứu công bố với hướng dẫn thầy Nguyễn Mạnh Hùng không chép từ tài liệu hay công trình có trước Người thực đề tài Ngô Quang Khải – Huỳnh Văn Pháp v LỜI CẢM ƠN Trải qua suốt trình nghiên cứu thực đề tài, từ buổi đầu chủng bị kiến thức tảng đến hồn thành đề tài, nhóm nhận nhiều hỗ trợ, hướng dẫn tận tình từ Thầy Nguyễn Mạnh Hùng – Giảng viên môn Điện tử công nghiệp - Y sinh Những góp ý, thảo luận, kinh nghiệm quý báu mà Thầy chia giúp cho đề tài nhóm ngày hồn thiện hơn, chúng em cảm thấy trân quý Chúng em xin gửi lời cảm ơn sâu sắc đến Thầy Nhóm xin gửi lời cảm ơn đến Thầy Cơ khoa Điện - Điện tử kiến thức móng mà thầy truyền đạt để chúng em đến chặn hành trình Chúng em cảm ơn Nhà trường, khoa mơn có kế hoạch tổ cho sinh viên thực đề tài tốt nghiệp hạn trở ngại khoảng thời gian dịch bệnh Đặc biệt cảm ơn Thầy Nguyễn Thanh Hải, Trưởng môn Điện tử công nghiệp - Y sinh, đồng hành tận tâm dẫn dắt chúng em ngành học thú vị Xin gửi lời cảm đến gia đình, người thân ln quan tâm, động viên ủng hộ chúng em suốt đường học tập Cuối nhóm khơng qn gửi lời cảm ơn đến bạn lớp 181290 đồng hành, trao đổi kiến thức giúp đỡ lẫn q trình học Mặc dù đề tài hồn thành theo nội dung đề ra, vốn kiến thức cịn hạn chế nên đề tài khó tránh khỏi thiếu sót Nhóm mong nhận góp ý từ q Thầy Cơ người đọc để cải thiện đề tài tốt Xin chân thành cảm ơn! Người thực đề tài Ngô Quang Khải – Huỳnh Văn Pháp vi MỤC LỤC NHIỆM VỤ KHÓA LUẬN TỐT NGHIỆP i LỊCH TRÌNH THỰC HIỆN KHĨA LUẬ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 DANH MỤC 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 .4 1.5 BỐ CỤC Chương CƠ SỞ LÝ THUYẾT 2.1 GIỚI THIỆU ẢNH X-QUANG 2.1.1 Ảnh số 2.1.2 Ảnh X-quang 2.2 GIỚI THIỆU PHẦN MỀM 2.2.1 Ngôn ngữ lập trình Python .8 2.2.2 Thư viện Pytorch 2.3 GIỚI THIỆU MẠNG NƠ-RON NHÂN TẠO 11 2.3.1 Hàm kích hoạt 12 vii CHƯƠNG KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN Chương KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 6.1 KẾT LUẬN Trong đề tài nhóm đề xuất phương pháp để tinh chỉnh mơ hình ViT tập liệu X-quang ngực nhỏ Thay tinh chỉnh trực tiếp mơ hình pretrained ViT, trước tiên nhóm tinh chỉnh mơ hình pre-trained ViT liệu Xquang ngực tiếng Sau đó, mơ hình huấn luyện sử dụng để huấn luyện lại tập liệu mục tiêu nhỏ Các kết thí nghiệm định lượng cho chứng minh phương pháp tốt chút so với phương pháp dựa CNN truyền thống Ngồi ra, thí nghiệm định tính chứng minh phương pháp giúp xác định vùng tổn thương tốt sai số định vị, Attention map khu vực tổn thương nhiều bệnh xuất Ngồi nhóm xây dựng thành cơng ứng dụng web cho mơ hình phân loại bệnh phổi huấn luyện triển khai ứng dụng nhanh chóng Docker Ứng dụng bao gồm sở liệu, chức dự đốn mơ hình, chức gửi tin nhắn kết cho bệnh nhân Các chức hoạt động mượt mà máy tính, giao diện ứng dụng web thiết kế rõ ràng, dễ tương tác cho người dùng Tổng kết, độ xác mơ hình cịn chưa cao, Các chức ứng dụng web đơn điệu nhìn chung, nhóm thực kỳ vọng mục tiêu đặt ban đầu đề tài “Ứng dụng mơ hình Vision Transformer phân loại liệu bệnh phổi” Quá trình thực đề tài giúp cho nhóm học hỏi tích lũy số kiến thức, kinh nghiệm định cho thân 6.2 HƯỚNG PHÁT TRIỂN Để ứng dụng mô hình phân loại bệnh vào thực tế độ xác điều vô quan trọng Khi thực đề tài, nhóm nhận thấy rằng, ảnh chụp X-quang y tế, đặc tính hấp thụ lượng tia X mơ làm khó nhận diện vùng bệnh, đặc biệt vùng tổn thương nhỏ vùng bị ẩn mơ Do nhóm đề xuất thiết kế mơ-đun tăng cường ảnh để làm bật chi tiết nhỏ trước qua phân loại Phương pháp đem lại số hiệu độ xác cho BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 73 CHƯƠNG KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN phân loại Về ứng dụng web, thiết thêm phân quyền người dùng cho ứng dụng để có bác sĩ số người dùng định có khả truy cập vào xem thơng tin bệnh nhân, đảm bảo tính bảo mật BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 74 TÀI LIỆU THAM KHẢO [1] Dakai Jin, Adam P Harrison, Ling Zhang, Ke Yan, Yirui Wang, Jinzheng Cai, Shun Miao and Le Lu, “Chapter 14 – artificial intelligence in radiology”, In Artificial Intelligence in Medicine, 2020 [2] Ngô Thị Anh Thư, Phạm Thiên Vương, “Ứng dụng xử lý ảnh AI để nhận biết bệnh viêm phổi trẻ em”, Đồ Án Tốt Nghiệp, trường ĐHSPKT, Tp.HCM, 2020 [3] Võ Kiều Phương, Nguyễn Nhật Uyên, “Ứng dụng Deep Learning Radiomics q trình chẩn đốn ung thư phổi”, Đồ Án Tốt Nghiệp, trường ĐHSPKT, Tp.HCM, 2021 [4] O Russakovsky, J Deng, H Su, J Krause, S Satheesh, S Ma, Z Huang, A Karpathy, A Khosla, M Bernstein, A C Berg, and L Fei-Fei, “ImageNet Large Scale Visual Recognition Challenge”, International Journal of Computer Vision (IJCV), vol 115, 2015 [5] X e a Wang, ChestX-ray8: Hospital-scale chest X-ray database and benchmarks on weakly-supervised classification, In Proceedings of the IEEE Conference on Computer Vision and Pattern, 2017 [6] T.-Y Lin, M Maire, S Belongie, L Bourdev, R Girshick, J Hays, P Perona, D Ramanan, C L Zitnick, and P Dollar, “Microsoft coco: Common objects in context", 2014 [7] J e a Irvin, CheXpert: A large chest radiograph dataset with uncertainty labels and expert comparison, In Proceedings of the AAAI Conference on Artificial Intelligence, 2019 [8] C Sun, A Shrivastava, S Singh, and A Gupta, “Revisiting unreasonable effectiveness of data in deep learning era”, in ICCV IEEE Computer Society, 2017 [9] e a Ha Q Nguyen, VinDr-CXR: An open dataset of chest X-rays with radiologist’s annotations, Arxiv, 2021 [10] K He, X Zhang, S Ren, and J Sun, “Deep residual learning for image recognition,”, CoRR, vol abs/1512.03385, 2015 75 [11] A Vaswani, N Shazeer, N Parmar, J Uszkoreit, L Jones, A N Gomez, L u Kaiser, and I Polosukhin, Attention is all you need, in Advances in Neural Information Processing Systems, vol 30 Curran Associates, Inc., 2017 [12] A Dosovitskiy, L Beyer, A Kolesnikov, D Weissenborn, X Zhai, T Unterthiner, M Dehghani, M Minderer, G Heigold, S Gelly, J Uszkoreit, and N Houlsby, An image is worth 16x16 words: Transformers for image recognition at scale, ICLR, 2021 [13] R R Selvaraju, M Cogswell, A Das, R Vedantam, D Parikh, and D Batra, Grad-cam: Visual explanations from deep networks via gradient-based localization, ICCV IEEE Computer Society, 2017 [14] Rafael C Gonzalez, "Digital Image Processing", Prentice Hall, 2008 [15] Cho Z, Jones JP, Singh M, "Foundations of medical imaging", New York: Wiley, 1993 [16] Shiroma, Jonathan T, "An introduction to DICOM" Veterinary Medicine: 19–20, 2006 [17] Lutz, Mark, "Learning Python (5th ed.)" O'Reilly Media 2013 [18] "An Introduction to PyTorch – A Simple yet Powerful Deep Learning Library" analyticsvidhya.com 2018-02-22 [19] Wilson, Halsey "Artificial intelligence", Grey House Publishing, 2018 [20] Chong, Edwin K P.; Żak, Stanislaw H, "Gradient Methods", An Introduction to Optimization (Fourth ed.), 2013 [21] V Andreieva, N Shvai, "Generalization of cross-entropy lossfunction for image classification", doi.org, 2021 [22] Yann LeCun, Leon Bottou, Yosuha Bengio and Patrick Haffner, “Gradient-based learning applied to document recognition”, IEEE, 1998 [23] Alex Krizhevsky, Ilya Sutskever, Geoffrey E Hinton, “ImageNet Classification with Deep Convolutional Neural Networks”, NIPS, 2012 [24] K Simonyan and A Zisserman., “Very Deep Convolutional Networks For LargeScale Image Recognition,”, Proc IEEE Conf Learn Repr, 2015 [25] Christian Szegedy, Wei Liu, Yangqing Jia, Pierre Sermanet, Scott Reed, Dragomir 76 Anguelov, Dumitru Erhan, Vincent Vanhoucke, Andrew Rabinovich, “Going Deeper with Convolutions”, , arXiv, 2014 [26] M G a S Dorling, “Artificial neural networks (the multilayer perceptron)—A review of applications in the atmospheric sciences”, Atmospheric Environment, vol 32, no 14-15, pp 2627–2636, , 1998 [27] B Zhang and R Sennrich, “Root mean square layer normalization”, in Advances in Neural Information Processing Systems, vol 32 Curran Associates, Inc, 2019 [28] Samira Abnar and Willem Zuidema, "Quantifying attention flow in transformers", In ACL, 2020 [29] "API gì", aws.amazon.com, link: https://aws.amazon.com/vi/what-is/api/ [30] "RESTful API gì, cách thiết kế Resfull API", topdev.vn, link: https://topdev.vn/blog/restful-api-la-gi/ [31] "Flask python gì?", ingoa.info, link: https://ingoa.info/flask-python-la-gi-1642399319/ [32] Le Quang Hung, "Docker gi?", tutorials.aiclub.cs.uit.edu.vn, 2020, link: http://tutorials.aiclub.cs.uit.edu.vn/index.php/2020/05/30/docker-co-ban-bai-1docker-la-gi-tai-sao-lai-su-dung-docker/ [33] Jacobgil, "GradCam Map for pytorch kernel description", github.com, link: https://github.com/jacobgil/pytorch-grad-cam, [34] Jeonsworld, "Attention Map for pytorch kernel description", github.com, link: https://github.com/jeonsworld/ViT-pytorch [35] "Transfer learning tutorial pytorch", pytorch.org, link: https://pytorch.org/tutorials/beginner/transfer-learning-tutorial.html 77 PHỤ LỤC Mã nguồn chương trình Chương trình Đánh giá định lượng kết phân loại mơ hình: import numpy as np import pandas as pd def check_FileName(GTData,PDData): GTNAME = GTData['ImageName'].to_list() PDNAME = PDData['ImageName'].to_list() count = for i in range(len(PDNAME)): if PDNAME[i] in GTNAME: count = count + return len(PDNAME)== count def check_Col(GTData,PDData): GT_Col = GTData.columns PD_Col = PDData.columns count = for i in range(len(GT_Col)): if GT_Col[i] == PD_Col[i]: count = count + return len(GT_Col)== count class Evaluator: def init (self, GTfile, PDFile): self.GTname = GTfile self.GTData= pd.read_csv(self.GTname) self.PDname = PDFile self.PDData = pd.read_csv(self.PDname) if not(check_FileName(self.GTData, self.PDData)): 78 raise ValueError("File Name not pass") if not(check_Col(self.GTData, self.PDData)): raise ValueError("Collume not pass") def get_result(self, thre=0.7, k=[1,3,5]): FileName=self.PDData['ImageName'].to_list() col=self.PDData.columns[2:] PreCision=[] ReCall=[] ACC_k=[] for filename in FileName: # print(filename) gt=self.GTData[self.GTData['ImageName']==filename][col].to_numpy() pred=self.PDData[self.PDData['ImageName']==filename][col].to_numpy() The=pred.max()*thre pred_thd=pred>=The pred_thd=pred_thd.astype('float') precision=np.sum(gt*pred_thd)/np.sum(pred_thd) recall = np.sum(gt * pred_thd) / np.sum(gt) PreCision.append(precision) ReCall.append(recall) A_temp=[] y_sort=np.argsort(pred) for i in range (len(k)): y_temp=np.zeros_like(gt) K=k[i] for j in range(K): y_temp[0][int(y_sort[0][-(j+1)])]=1.0 r=np.sum(y_temp*gt)>0 if r: 79 A_temp.append(1.0) else: A_temp.append(0.0) ACC_k.append(A_temp) self.Pre_R=np.mean(np.array(PreCision)) self.ReC_R = np.mean(np.array(ReCall)) self.ACC_R =np.mean(np.array(ACC_k),axis=0) if name == " main ": Chương trình hiển thị Grad-CAM from pytorch_grad_cam import GradCAM, ScoreCAM, GradCAMPlusPlus, AblationCAM, XGradCAM, EigenCAM, LayerCAM, FullGrad from pytorch_grad_cam.utils.image import show_cam_on_image, preprocess_image, deprocess_image from pytorch_grad_cam import GuidedBackpropReLUModel import torch import torch.nn as nn from torchvision import models import cv2 import numpy as np import matplotlib.pyplot as plt from PIL import Image #Load model model=torch.load('model/ resnet50_ft_VinXray10class.pth') model.eval() 80 #Select the target layer target_layer = [model.layer4[-1]] image_path='Images/1b2a7adb5705d9e3f5b63939046d93c7.jpg' img = cv2.imread(image_path, 1)[:, :, ::-1] # Is read rgb img = cv2.resize(img, (224, 224)) img = np.float32(img) / 255 input_tensor = preprocess_image(img, mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) #Construct the CAM object once, and then re-use it on many images: cam = GradCAM(model=model, target_layers=target_layer, use_cuda=True) def show_cam(mask: np.ndarray,use_rgb: bool = False, colormap: int = cv2.COLORMAP_JET) -> np.ndarray: """ This function overlays the cam mask on the image as an heatmap By default the heatmap is in BGR format :param img: The base image in RGB or BGR format :param mask: The cam mask :param use_rgb: Whether to use an RGB or BGR heatmap, this should be set to True if 'img' is in RGB format :param colormap: The OpenCV colormap to be used :returns: The default image with the cam overlay """ heatmap = cv2.applyColorMap(np.uint8(255 * mask), colormap) if use_rgb: 81 heatmap = cv2.cvtColor(heatmap, cv2.COLOR_BGR2RGB) heatmap = np.float32(heatmap) / 255 if np.max(img) > 1: raise Exception( "The input image should np.float32 in the range [0, 1]") cam = heatmap cam = cam / np.max(cam) return np.uint8(255 * cam) #Show cam target_category = None cam.batch_size = 32 #Calculation cam grayscale_cam = cam(input_tensor=input_tensor, target_category=target_category, aug_smooth=True, eigen_smooth=True) #Display and save the heat map , grayscale_cam It's a batch Result , Only one can be selected for display grayscale_cam = grayscale_cam[0,:] visualization = show_cam(grayscale_cam, use_rgb=False) cv2.imwrite(f'cam_image.jpg', visualization) cam_image = Image.open('cam_image.jpg') fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(12, 12)) ax1.set_title('Original') 82 ax2.set_title('Grad-cam') _ = ax1.imshow(img) _ = ax2.imshow(cam_image) plt.show() #Show cam on image visualization = show_cam_on_image(img, grayscale_cam, use_rgb=False) cv2.imwrite(f'cam_image.jpg', visualization) cam_image = Image.open('cam_image.jpg') fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(12, 12)) ax1.set_title('Original') ax2.set_title('Grad-cam') _ = ax1.imshow(img) _ = ax2.imshow(cam_image) plt.show() Chương trình hiển thị Attention Map import typing import io import os import torch import numpy as np import cv2 import matplotlib.pyplot as plt from urllib.request import urlretrieve 83 from PIL import Image from torchvision import transforms, datasets from torch.utils.data import DataLoader from models.modeling import VisionTransformer, CONFIGS # Prepare Model config = CONFIGS["R50-ViT-B_16"] model = VisionTransformer(config, num_classes=10, zero_head=False, img_size=224, vis=True) PATH='model /Finetune_Chest14_R50B16_enhance.bin' model.load_state_dict(torch.load(PATH)) model.eval() VinXray_labels=dict(enumerate(open(' /VinXrayLabel.txt'))) transform = transforms.Compose([ transforms.Resize((224, 224)), transforms.Grayscale(num_output_channels=3), transforms.ToTensor(), transforms.Normalize(mean=[0.5], std=[0.5]), ]) im=Image.open("Images/051c2436c0acdb5e09d085c7e4a764f3.jpg") def get_attention_map(img, get_mask=False): x = transform(img) x.size() logits, att_mat = model(x.unsqueeze(0)) 84 print('logits =',logits) att_mat = torch.stack(att_mat).squeeze(1) # Average the attention weights across all heads att_mat = torch.mean(att_mat, dim=1) # To account for residual connections, we add an identity matrix to the # attention matrix and re-normalize the weights residual_att = torch.eye(att_mat.size(1)) aug_att_mat = att_mat + residual_att aug_att_mat = aug_att_mat / aug_att_mat.sum(dim=-1).unsqueeze(-1) # Recursively multiply the weight matrices joint_attentions = torch.zeros(aug_att_mat.size()) joint_attentions[0] = aug_att_mat[0] for n in range(1, aug_att_mat.size(0)): joint_attentions[n] = torch.matmul(aug_att_mat[n], joint_attentions[n-1]) v = joint_attentions[-1] grid_size = int(np.sqrt(aug_att_mat.size(-1))) mask = v[0, 1:].reshape(grid_size, grid_size).detach().numpy() if get_mask: result = cv2.resize(mask / mask.max(), img.size) else: mask = cv2.resize(mask / mask.max(), img.size)[ , np.newaxis] result = (mask * img).astype("uint8") 85 return result def plot_attention_map(original_img, att_map): fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(16, 16)) ax1.set_title('Original') ax2.set_title('Attention Map Last Layer') _ = ax1.imshow(original_img) _ = ax2.imshow(att_map) result = get_attention_map(im) plot_attention_map(im, result) # Check mask for Attention Map check_mask = get_attention_map(im, True) plot_attention_map(im, check_mask) Chương trình triển khai ứng dụng web: Vì số lượng tệp chương trình nhiều chương trình viết dài, khơng thuận tiện để trình bày tất báo cáo Nhóm xin phép chia mã nguồn nhóm thơng qua link Google Drive dây: https://drive.google.com/file/d/1ydoFvEFrvcFLidWBmTGf37J5ZwSKnnS/view?usp=sharing 86 S K L 0