{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":75176,"databundleVersionId":8252256,"sourceType":"competition"},{"sourceId":1799839,"sourceType":"datasetVersion","datasetId":1069682},{"sourceId":9416880,"sourceType":"datasetVersion","datasetId":5719062},{"sourceId":196959091,"sourceType":"kernelVersion"},{"sourceId":197070222,"sourceType":"kernelVersion"}],"dockerImageVersionId":30761,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install -q ultralytics\n!pip install -q albumentations  # Thêm thư viện augment dữ liệu","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-09-19T06:50:27.189002Z","iopub.execute_input":"2024-09-19T06:50:27.189294Z","iopub.status.idle":"2024-09-19T06:50:56.848571Z","shell.execute_reply.started":"2024-09-19T06:50:27.189261Z","shell.execute_reply":"2024-09-19T06:50:56.847421Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom pathlib import Path\nfrom sklearn.utils import resample\nfrom sklearn.model_selection import train_test_split\nimport os\nfrom shutil import copyfile\nimport yaml\nfrom albumentations import Compose, RandomRotate90, Flip, Transpose, ShiftScaleRotate, RandomBrightnessContrast\nfrom ultralytics import YOLO","metadata":{"execution":{"iopub.status.busy":"2024-09-19T06:50:56.850756Z","iopub.execute_input":"2024-09-19T06:50:56.851091Z","iopub.status.idle":"2024-09-19T06:51:05.804231Z","shell.execute_reply.started":"2024-09-19T06:50:56.851056Z","shell.execute_reply":"2024-09-19T06:51:05.803465Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # Load trained model\n# model = YOLO('/kaggle/input/vincxr-yolov8m/runs/detect/Yolov8m(640, 100, 32)/weights/best.pt')\n\n# # Perform prediction on test images folder with a specified batch size\n# results = model.predict(\n#     source='/kaggle/input/amia-public-challenge-2024/test/test',\n#     conf=0.2,\n#     iou=0.2,\n#     imgsz=640,\n# #     device='0',  # Use only one GPU (change to '0,1' if you increase batch size)\n#     batch=16,  # Keep batch size at 16 for single GPU\n# #     visualize=True,\n# #     augment=True,  # TTA\n#     save_txt=True,\n#     save_conf=True,\n#     show_labels=True,\n#     show_conf=True,\n#     show_boxes=True\n# )","metadata":{"execution":{"iopub.status.busy":"2024-09-19T06:51:05.805346Z","iopub.execute_input":"2024-09-19T06:51:05.805816Z","iopub.status.idle":"2024-09-19T06:51:05.810354Z","shell.execute_reply.started":"2024-09-19T06:51:05.805780Z","shell.execute_reply":"2024-09-19T06:51:05.809480Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Xử lý cho 16 class\n#https://etrain.xyz/posts/vinbigdata-chest-x-ray-abnormalities-detection\n# https://www.kaggle.com/code/duythanhng/vinbigdata-yolov5-16-class\n# https://www.kaggle.com/datasets/awsaf49/vinbigdata-1024-image-dataset","metadata":{"execution":{"iopub.status.busy":"2024-09-19T06:51:05.812596Z","iopub.execute_input":"2024-09-19T06:51:05.812897Z","iopub.status.idle":"2024-09-19T06:51:05.823688Z","shell.execute_reply.started":"2024-09-19T06:51:05.812866Z","shell.execute_reply":"2024-09-19T06:51:05.822703Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # Kiểm tra và in ra 3 kết quả đầu tiên\n# for i, result in enumerate(results):\n#     if i >= 3:  # Chỉ in 3 kết quả\n#         break\n    \n#     print(f\"Result {i+1}:\")\n#     print(f\"Boxes: {result.boxes}\")  # Bounding box predictions\n#     print(f\"Classes: {result.boxes.cls}\")  # Class IDs of detected objects\n#     print(f\"Confidence Scores: {result.boxes.conf}\")  # Confidence scores of predictions\n    \n#     # Nếu cần in thêm chi tiết hơn về tọa độ bbox\n#     for box in result.boxes:\n#         print(f\"Class: {int(box.cls)}, Confidence: {box.conf}, BBox: {box.xyxy[0]}\")","metadata":{"execution":{"iopub.status.busy":"2024-09-19T06:51:05.824709Z","iopub.execute_input":"2024-09-19T06:51:05.824989Z","iopub.status.idle":"2024-09-19T06:51:05.833873Z","shell.execute_reply.started":"2024-09-19T06:51:05.824959Z","shell.execute_reply":"2024-09-19T06:51:05.832974Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # Đọc file kích thước ảnh từ img_size.csv\n# img_size_file = '/kaggle/input/amia-public-challenge-2024/img_size.csv'\n# img_size_df = pd.read_csv(img_size_file)\n\n# # Chuyển đổi dữ liệu thành dạng dictionary để tra cứu nhanh\n# img_size_dict = {row['image_id']: (row['dim0'], row['dim1']) for _, row in img_size_df.iterrows()}\n\n# # Đường dẫn tới thư mục ảnh test\n# test_images_folder = '/kaggle/input/amia-public-challenge-2024/test/test'\n\n# # Lấy danh sách file test (tên ảnh) trong thư mục test\n# test_image_filenames = [f for f in os.listdir(test_images_folder) if f.endswith('.png')]","metadata":{"execution":{"iopub.status.busy":"2024-09-19T06:51:05.835102Z","iopub.execute_input":"2024-09-19T06:51:05.835442Z","iopub.status.idle":"2024-09-19T06:51:05.843940Z","shell.execute_reply.started":"2024-09-19T06:51:05.835409Z","shell.execute_reply":"2024-09-19T06:51:05.843077Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# for VinBigData 1024 Image Dataset\n\n# Đường dẫn tới thư mục ảnh test\ntest_images_folder = '/kaggle/input/vinbigdata-1024-image-dataset/vinbigdata/test'\n\n# Lấy danh sách file test (tên ảnh) trong thư mục test\ntest_image_filenames = [f for f in os.listdir(test_images_folder) if f.endswith('.png')]\n\ndim = '1024' #1024, 512, 256, 'original'\ntest_df = pd.read_csv(f'/kaggle/input/vinbigdata-{dim}-image-dataset/vinbigdata/test.csv')\ntest_df.head()","metadata":{"execution":{"iopub.status.busy":"2024-09-19T06:51:05.844931Z","iopub.execute_input":"2024-09-19T06:51:05.845279Z","iopub.status.idle":"2024-09-19T06:51:06.023275Z","shell.execute_reply.started":"2024-09-19T06:51:05.845247Z","shell.execute_reply":"2024-09-19T06:51:06.022388Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport csv\nimport pandas as pd\nimport numpy as np\n\n# Load trained model\nmodel = YOLO('/kaggle/input/vincxr-yolov8x-640px-16class/runs/detect/Yolov8x(640, 100, 16)/weights/best.pt')","metadata":{"execution":{"iopub.status.busy":"2024-09-19T06:51:06.024698Z","iopub.execute_input":"2024-09-19T06:51:06.025286Z","iopub.status.idle":"2024-09-19T06:51:07.835983Z","shell.execute_reply.started":"2024-09-19T06:51:06.025241Z","shell.execute_reply":"2024-09-19T06:51:07.834950Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Đánh giá mô hình trên tập validation\nval_results = model.val(\n    data ='/kaggle/input/vinbigdata-yolo-dataset-with-wbf-640px-16class/vinbigdata-yolo-dataset-with-wbf-640px-16class/data.yaml',\n    split = 'val',\n    device='0,1',\n    iou=0.5)\nprint(val_results.box.map)  # mAP@0.5","metadata":{"execution":{"iopub.status.busy":"2024-09-19T06:51:07.837213Z","iopub.execute_input":"2024-09-19T06:51:07.837509Z","iopub.status.idle":"2024-09-19T06:55:16.468059Z","shell.execute_reply.started":"2024-09-19T06:51:07.837478Z","shell.execute_reply":"2024-09-19T06:55:16.467019Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# AttributeError: 'Metric' object has no attribute 't'. See valid attributes below.\n\n#     Class for computing evaluation metrics for YOLOv8 model.\n\n#     Attributes:\n#         p (list): Precision for each class. Shape: (nc,).\n#         r (list): Recall for each class. Shape: (nc,).\n#         f1 (list): F1 score for each class. Shape: (nc,).\n#         all_ap (list): AP scores for all classes and all IoU thresholds. Shape: (nc, 10).\n#         ap_class_index (list): Index of class for each AP score. Shape: (nc,).\n#         nc (int): Number of classes.\n\n#     Methods:\n#         ap50(): AP at IoU threshold of 0.5 for all classes. Returns: List of AP scores. Shape: (nc,) or [].\n#         ap(): AP at IoU thresholds from 0.5 to 0.95 for all classes. Returns: List of AP scores. Shape: (nc,) or [].\n#         mp(): Mean precision of all classes. Returns: Float.\n#         mr(): Mean recall of all classes. Returns: Float.\n#         map50(): Mean AP at IoU threshold of 0.5 for all classes. Returns: Float.\n#         map75(): Mean AP at IoU threshold of 0.75 for all classes. Returns: Float.\n#         map(): Mean AP at IoU thresholds from 0.5 to 0.95 for all classes. Returns: Float.\n#         mean_results(): Mean of results, returns mp, mr, map50, map.\n#         class_result(i): Class-aware result, returns p[i], r[i], ap50[i], ap[i].\n#         maps(): mAP of each class. Returns: Array of mAP scores, shape: (nc,).\n#         fitness(): Model fitness as a weighted combination of metrics. Returns: Float.\n#         update(results): Update metric attributes with new evaluation results.","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\n\n# Đưa ra ngưỡng riêng cho từng lớp\nclass_thresholds = [0.5] * len(val_results.box.ap50)  # Khởi tạo ngưỡng mặc định cho tất cả các lớp\n\nfor class_id in range(len(val_results.box.ap50)):\n    if class_id < len(val_results.box.p):  # Kiểm tra xem class_id có hợp lệ không\n        precision = val_results.box.p[class_id]\n        recall = val_results.box.r[class_id]\n        f1 = val_results.box.f1[class_id]\n        \n        #  Sử dụng F1 score làm ngưỡng cho mỗi lớp thay vì trung bình của precision và recall. F1 score là một thước đo cân bằng giữa precision và recall.\n        #  Đặt ngưỡng tối thiểu là 0.1 để tránh ngưỡng quá thấp có thể dẫn đến quá nhiều dự đoán sai.\n        \n        # Tính ngưỡng tối ưu dựa trên F1 score\n        threshold = f1  # Sử dụng F1 score làm ngưỡng\n        \n        class_thresholds[class_id] = max(threshold, 0.01)  # Đặt ngưỡng tối thiểu là 0.1\n\nprint(\"Ngưỡng của từng lớp:\", class_thresholds)\n\n# Hàm dự đoán với ngưỡng riêng cho từng lớp\ndef predict_with_thresholds(img_path):\n    results = model.predict(img_path, conf=0.01, iou=0.45, agnostic_nms=True, max_det=300)\n    \n    boxes = []\n    scores = []\n    class_ids = []\n    \n    for result in results:\n        for box, score, class_id in zip(result.boxes.xyxy, result.boxes.conf, result.boxes.cls):\n            class_id = int(class_id)\n            if class_id < len(class_thresholds) and score >= class_thresholds[class_id]:\n                boxes.append(box.tolist())\n                scores.append(float(score))\n                class_ids.append(class_id)\n    \n    return boxes, scores, class_ids\n\n# Danh sách tên lớp\nclass_names = ['Aortic_enlargement', 'Atelectasis', 'Calcification', 'Cardiomegaly', 'Consolidation', 'ILD', 'Infiltration', 'Lung_Opacity', 'Nodule/Mass', 'Other_lesion', 'Pleural_effusion', 'Pleural_thickening', 'Pneumothorax', 'Pulmonary_fibrosis', 'No finding', 'Finding']\n\n# Dự đoán trên ảnh mới\nimg_path = '/kaggle/input/vinbigdata-yolo-dataset-with-wbf-640px-16class/vinbigdata-yolo-dataset-with-wbf-640px-16class/test/images/0005e8e3701dfb1dd93d53e2ff537b6e.jpg'\nboxes, scores, class_ids = predict_with_thresholds(img_path)\n\nprint(\"Số lượng dự đoán:\", len(boxes))\nprint(\"\\nThông tin chi tiết các hộp dự đoán:\")\nfor i, (box, score, class_id) in enumerate(zip(boxes, scores, class_ids)):\n    print(f\"Dự đoán {i+1}:\")\n    print(f\"  Hộp giới hạn: {box}\")\n    print(f\"  Độ tự tin: {score:.4f}\")\n    print(f\"  Lớp ID: {class_id}\")\n    print(f\"  Tên lớp: {class_names[class_id]}\")\n    print()","metadata":{"execution":{"iopub.status.busy":"2024-09-19T07:56:27.927841Z","iopub.execute_input":"2024-09-19T07:56:27.928876Z","iopub.status.idle":"2024-09-19T07:56:28.070157Z","shell.execute_reply.started":"2024-09-19T07:56:27.928824Z","shell.execute_reply":"2024-09-19T07:56:28.069230Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # Thực hiện dự đoán\n# results = model.predict(\n#     source=test_images_folder,\n#     conf=0.01,\n#     iou=0.45,\n#     imgsz=640,\n#     batch=16,\n#     save_txt=True,\n#     save_conf=True,\n#     show_labels=True,\n#     show_conf=True,\n#     show_boxes=True\n# )","metadata":{"execution":{"iopub.status.busy":"2024-09-19T06:55:16.855883Z","iopub.status.idle":"2024-09-19T06:55:16.856250Z","shell.execute_reply.started":"2024-09-19T06:55:16.856069Z","shell.execute_reply":"2024-09-19T06:55:16.856087Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # Code tối ưu chưa biết chạy đúng không\n\n# import csv\n# from glob import glob\n# import numpy as np\n# from tqdm import tqdm\n# import os\n\n# # Hàm chuyển đổi từ định dạng YOLO sang VOC\n# def yolo2voc(h, w, data):\n#     x_center, y_center, width, height = data[:, 0], data[:, 1], data[:, 2], data[:, 3]\n#     xmin = (x_center - width / 2) * w\n#     xmax = (x_center + width / 2) * w\n#     ymin = (y_center - height / 2) * h\n#     ymax = (y_center + height / 2) * h\n#     return np.column_stack((xmin, ymin, xmax, ymax))\n\n# # Mở file submission để ghi\n# with open('submission_new.csv', mode='w', newline='') as submission_file:\n#     writer = csv.writer(submission_file)\n    \n#     # Ghi tiêu đề\n#     writer.writerow(['image_id', 'PredictionString'])\n    \n#     # Duyệt qua từng file kết quả phát hiện\n#     for file_path in tqdm(glob('runs/detect/predict/labels/*txt')):\n#         image_id, _ = os.path.splitext(os.path.basename(file_path))\n#         h, w = img_size_dict[image_id]\n        \n#         with open(file_path, 'r') as f:\n#             data = np.array(f.read().replace('\\n', ' ').strip().split(' ')).astype(np.float32).reshape(-1, 6)\n#             data = data[:, [0, 5, 1, 2, 3, 4]]\n#             bboxes = np.round(np.concatenate((data[:, :2], np.round(yolo2voc(h, w, data[:, 2:]))), axis=1), 1)\n            \n#             prediction_strings = [\n#                 f\"{int(class_id)} {confidence:.3f} {xmin:.0f} {ymin:.0f} {xmax:.0f} {ymax:.0f}\"\n#                 for class_id, confidence, xmin, ymin, xmax, ymax in bboxes\n#                 if int(class_id) != 15\n#             ]\n            \n#             if int(bboxes[0][0]) == 14:\n#                 final_prediction_string = \"14 1.0 0 0 1 1\"\n#             elif len(prediction_strings) > 0:\n#                 final_prediction_string = ' '.join(prediction_strings)\n#             else:\n#                 final_prediction_string = \"14 1 0 0 1 1\"\n            \n#             # Ghi thông tin dự đoán cho từng ảnh vào file submission\n#             writer.writerow([image_id, final_prediction_string])\n\n# print(\"File submission_new.csv đã được tạo thành công.\")","metadata":{"execution":{"iopub.status.busy":"2024-09-19T06:55:16.858755Z","iopub.status.idle":"2024-09-19T06:55:16.859289Z","shell.execute_reply.started":"2024-09-19T06:55:16.859003Z","shell.execute_reply":"2024-09-19T06:55:16.859029Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# #test submit ok '/kaggle/input/amia-public-challenge-2024/test/test'\n\n# import csv\n# from glob import glob\n# import numpy as np\n# from tqdm import tqdm\n\n# # Hàm chuyển đổi từ định dạng YOLO sang VOC\n# def yolo2voc(h, w, data):\n#     x_center, y_center, width, height = data[:, 0], data[:, 1], data[:, 2], data[:, 3]\n#     xmin = (x_center - width / 2) * w\n#     xmax = (x_center + width / 2) * w\n#     ymin = (y_center - height / 2) * h\n#     ymax = (y_center + height / 2) * h\n#     return np.column_stack((xmin, ymin, xmax, ymax))\n\n# # Mở file submission để ghi\n# with open('submission.csv', mode='w', newline='') as submission_file:\n#     writer = csv.writer(submission_file)\n    \n#     # Ghi tiêu đề\n#     writer.writerow(['image_id', 'PredictionString'])\n    \n#     # Duyệt qua từng file kết quả phát hiện\n#     for file_path in tqdm(glob('/kaggle/working/runs/detect/predict/labels/*txt')):\n#         image_id = file_path.split('/')[-1].split('.')[0]\n#         h, w = img_size_dict[image_id]\n        \n#         with open(file_path, 'r') as f:\n#             data = np.array(f.read().replace('\\n', ' ').strip().split(' ')).astype(np.float32).reshape(-1, 6)\n#             data = data[:, [0, 5, 1, 2, 3, 4]]\n#             bboxes = np.round(np.concatenate((data[:, :2], np.round(yolo2voc(h, w, data[:, 2:]))), axis=1), 1)\n            \n#             prediction_strings = []\n#             for bbox in bboxes:\n#                 class_id, confidence, xmin, ymin, xmax, ymax = bbox\n                \n#                 # Kiểm tra nếu class ID là 14 (\"No finding\"), chuẩn hóa kết quả\n#                 if int(class_id) == 14:\n#                     prediction_string = \"14 1.0 0 0 1 1\"\n#                     break  # Không cần xử lý thêm các box khác nếu đã là lớp 14\n\n#                 if int(class_id) != 15:\n#                     prediction_string = f\"{int(class_id)} {confidence:.3f} {xmin:.0f} {ymin:.0f} {xmax:.0f} {ymax:.0f}\"\n#                     prediction_strings.append(prediction_string)\n            \n#             if len(prediction_strings) > 0:\n#                 final_prediction_string = ' '.join(prediction_strings)\n#             else:\n#                 final_prediction_string = \"14 1 0 0 1 1\"\n            \n#             # Ghi thông tin dự đoán cho từng ảnh vào file submission\n#             writer.writerow([image_id, final_prediction_string])\n\n# print(\"File submission.csv đã được tạo thành công.\")","metadata":{"execution":{"iopub.status.busy":"2024-09-19T06:55:16.861154Z","iopub.status.idle":"2024-09-19T06:55:16.861714Z","shell.execute_reply.started":"2024-09-19T06:55:16.861432Z","shell.execute_reply":"2024-09-19T06:55:16.861457Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# #For for VinBigData 1024 Image Dataset\n# # Submit for VinBigData Chest X-ray Abnormalities Detection\n\n# import csv\n# from glob import glob\n# import numpy as np\n# from tqdm import tqdm\n\n# # Hàm chuyển đổi từ định dạng YOLO sang VOC\n# def yolo2voc(h, w, data):\n#     x_center, y_center, width, height = data[:, 0], data[:, 1], data[:, 2], data[:, 3]\n#     xmin = (x_center - width / 2) * w\n#     xmax = (x_center + width / 2) * w\n#     ymin = (y_center - height / 2) * h\n#     ymax = (y_center + height / 2) * h\n#     return np.column_stack((xmin, ymin, xmax, ymax))\n\n# # Mở file submission để ghi\n# with open('submission.csv', mode='w', newline='') as submission_file:\n#     writer = csv.writer(submission_file)\n    \n#     # Ghi tiêu đề\n#     writer.writerow(['image_id', 'PredictionString'])\n    \n#     # Duyệt qua từng file kết quả phát hiện\n#     for file_path in tqdm(glob('/kaggle/working/runs/detect/predict/labels/*txt')):\n#         image_id = file_path.split('/')[-1].split('.')[0]\n#         w, h = test_df.loc[test_df.image_id==image_id,['width', 'height']].values[0]\n        \n#         with open(file_path, 'r') as f:\n#             data = np.array(f.read().replace('\\n', ' ').strip().split(' ')).astype(np.float32).reshape(-1, 6)\n#             data = data[:, [0, 5, 1, 2, 3, 4]]\n#             bboxes = np.round(np.concatenate((data[:, :2], np.round(yolo2voc(h, w, data[:, 2:]))), axis=1), 1)\n            \n#             prediction_strings = []\n#             for bbox in bboxes:\n#                 class_id, confidence, xmin, ymin, xmax, ymax = bbox\n                \n#                 # Kiểm tra nếu class ID là 14 (\"No finding\"), chuẩn hóa kết quả\n#                 if int(class_id) == 14:\n#                     prediction_string = \"14 1.0 0 0 1 1\"\n#                     break  # Không cần xử lý thêm các box khác nếu đã là lớp 14\n\n#                 if int(class_id) != 15:\n#                     prediction_string = f\"{int(class_id)} {confidence:.3f} {xmin:.0f} {ymin:.0f} {xmax:.0f} {ymax:.0f}\"\n#                     prediction_strings.append(prediction_string)\n            \n#             if len(prediction_strings) > 0:\n#                 final_prediction_string = ' '.join(prediction_strings)\n#             else:\n#                 final_prediction_string = \"14 1 0 0 1 1\"\n            \n#             # Ghi thông tin dự đoán cho từng ảnh vào file submission\n#             writer.writerow([image_id, final_prediction_string])\n\n# print(\"File submission.csv đã được tạo thành công.\")","metadata":{"execution":{"iopub.status.busy":"2024-09-19T06:55:16.863035Z","iopub.status.idle":"2024-09-19T06:55:16.863517Z","shell.execute_reply.started":"2024-09-19T06:55:16.863256Z","shell.execute_reply":"2024-09-19T06:55:16.863280Z"},"trusted":true},"execution_count":null,"outputs":[]}]}