{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":91249,"databundleVersionId":11294684,"sourceType":"competition"},{"sourceId":12114228,"sourceType":"datasetVersion","datasetId":7627313},{"sourceId":433447,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":351106,"modelId":372358}],"dockerImageVersionId":31040,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Heatmap+Mask2Former解决马达蛋白定位问题\n\n**数据特点：**\n\n· 马达目标体积小、边界模糊；\n\n· 每张图像大部分区域为空白；\n\n· 类别严重不平衡（竞赛给出的26w个样本中仅包含450个阳性样本）；\n\n· Ground truth 通过 (z, y, x) 中心点坐标标注。","metadata":{},"attachments":{}},{"cell_type":"markdown","source":"**题目难点：**\n\n· 目标体积很小，需要选择适合分割小目标的方案；\n\n· 阳性样本数量很少；\n\n· 模型需要完成识别图像中是否有马达蛋白与推理马达蛋白具体位置两项任务。","metadata":{}},{"cell_type":"markdown","source":"**选择heatmap+Mask2Former-fine tuning原因：**\n\n· Mask2Former 本身偏向于分割大目标，在本任务中容易出现类别塌缩。Heatmap是一种用来表示目标存在概率或中心位置的连续性概率分布图，可以通过马达蛋白中心点标注 (x, y)，扩展成一个空间上连续可学习的平滑目标分布，相当于对稀疏的训练信号进行了增强。\n\n· 一半以上的参赛者都选择了对YOLO进行fine-tuning的方案，而尚未见到参赛者使用Mask2Former，想尝试新的方案。\n![image.png](attachment:6ae9870d-fe2e-4827-84a5-a6e7f35b7c65.png)\n\n\n**工作流程：**\n1. 将原始的中心点标签 (z, y, x)，转换为 2D 的 Heatmap 掩码（mask），供后续 Mask2Former 训练使用。","metadata":{},"attachments":{"6ae9870d-fe2e-4827-84a5-a6e7f35b7c65.png":{"image/png":"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"}}},{"cell_type":"code","source":"import os\nimport pandas as pd\nimport numpy as np\nfrom tqdm import tqdm\nfrom PIL import Image\nimport cv2\n\ndataset_root = \"/kaggle/input/byu-locating-bacterial-flagellar-motors-2025\"\ntrain_dir = os.path.join(dataset_root, \"train\")\nlabel_file = os.path.join(dataset_root, \"train_labels.csv\")\nmask_root = \"/kaggle/working/masks\"  # 掩码图保存目录\nindex_save_path = \"/kaggle/working/image_mask_index.csv\"\nsigma = 8  # 高斯核标准差\n\n# 高斯掩码函数\ndef draw_gaussian_mask(shape, centers, sigma=6):\n    heatmap = np.zeros(shape, dtype=np.float32)\n    for y, x in centers:\n        if 0 <= x < shape[1] and 0 <= y < shape[0]:\n            tmp = np.zeros_like(heatmap)\n            tmp[y, x] = 1\n            tmp = cv2.GaussianBlur(tmp, (0, 0), sigma)\n            tmp /= tmp.max()  # 归一化到 [0, 1]\n            heatmap = np.maximum(heatmap, tmp)\n    return (heatmap * 255).astype(np.uint8)\n\n# 加载标签数据\nlabels_df = pd.read_csv(label_file)\nlabels_df = labels_df[labels_df[\"Motor axis 0\"] != -1]\nlabels_df = labels_df.rename(columns={\n    \"Motor axis 0\": \"z\",\n    \"Motor axis 1\": \"y\",\n    \"Motor axis 2\": \"x\"\n})\nlabels_df[[\"z\", \"y\", \"x\"]] = labels_df[[\"z\", \"y\", \"x\"]].astype(int)\n\n# 遍历 tomogram\nrecords = []\nfor tomo_id in tqdm(sorted(os.listdir(train_dir)), desc=\"处理Tomogram\"):\n    tomo_path = os.path.join(train_dir, tomo_id)\n    if not os.path.isdir(tomo_path):\n        continue\n\n    os.makedirs(os.path.join(mask_root, tomo_id), exist_ok=True)\n    tomo_labels = labels_df[labels_df[\"tomo_id\"] == tomo_id]\n\n    for fname in sorted(os.listdir(tomo_path)):\n        if not fname.endswith(\".jpg\"):\n            continue\n\n        slice_idx = int(fname.replace(\"slice_\", \"\").replace(\".jpg\", \"\"))\n        image_path = os.path.join(tomo_path, fname)\n\n        with Image.open(image_path) as img:\n            width, height = img.size\n\n        slice_labels = tomo_labels[tomo_labels[\"z\"] == slice_idx][[\"y\", \"x\"]].values.tolist()\n        is_positive = int(len(slice_labels) > 0)\n\n        if is_positive:\n            mask_np = draw_gaussian_mask((height, width), slice_labels, sigma=sigma)\n            mask_path = os.path.join(mask_root, tomo_id, fname.replace(\".jpg\", \".png\"))\n\n            # 保存为灰度 PNG 图像\n            cv2.imwrite(mask_path, mask_np)\n        else:\n            mask_path = None\n\n        records.append({\n            \"image_path\": image_path,\n            \"mask_path\": mask_path,\n            \"tomo_id\": tomo_id,\n            \"slice_idx\": slice_idx,\n            \"width\": width,\n            \"height\": height,\n            \"is_positive\": is_positive,\n            \"points\": str(slice_labels)\n        })\n\n# 保存索引 CSV\ndf = pd.DataFrame(records)\ndf.to_csv(index_save_path, index=False)\nprint(f\"掩码索引文件保存至: {index_save_path}，共记录 {len(df)} 条\")\nprint(f\"正样本数量: {df['is_positive'].sum()}，负样本数量: {(df['is_positive'] == 0).sum()}\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"2. 构建平衡数据集","metadata":{}},{"cell_type":"code","source":"import pandas as pd\n\n# 这里的路径变化是为了避免kaggle重启内核导致数据丢失,下载了掩码索引和掩码图作为数据集上传到了/kaggle/input中\ncsv_path = \"/kaggle/input/mask-image/kaggle/working/image_mask_index.csv\"\nmask_root_prefix = \"/kaggle/input/mask-image/kaggle/working/masks\"\n\n# 原始索引文件\ndf = pd.read_csv(csv_path)\n\n# 修正掩码路径,原因是原掩码索引构建时掩码图位于/kaggle/working文件夹中\ndf[\"mask_path\"] = df[\"mask_path\"].apply(\n    lambda p: p.replace(\"/kaggle/working/masks\", mask_root_prefix) if isinstance(p, str) else None\n)\n\n#正负样本划分\npositive_df = df[df[\"is_positive\"] == 1]\nnegative_df = df[df[\"is_positive\"] == 0]\n\n# 随机采样等量负样本\nnegative_sample = negative_df.sample(n=len(positive_df), random_state=42)\n\n# 合并平衡数据集\nbalanced_df = pd.concat([positive_df, negative_sample]).sample(frac=1, random_state=42).reset_index(drop=True)\n\n# 保存平衡索引\nbalanced_df.to_csv(\"/kaggle/working/balanced_image_mask_index.csv\", index=False)\n\nprint(f\"平衡数据集已保存，共计样本数: {len(balanced_df)} (正样本: {len(positive_df)}, 负样本: {len(negative_sample)})\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-13T06:09:42.201773Z","iopub.execute_input":"2025-06-13T06:09:42.202331Z","iopub.status.idle":"2025-06-13T06:09:46.775866Z","shell.execute_reply.started":"2025-06-13T06:09:42.202294Z","shell.execute_reply":"2025-06-13T06:09:46.774413Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"3. fine-tunning Mask2Former","metadata":{}},{"cell_type":"code","source":"import os\nimport pandas as pd\nimport numpy as np\nimport torch\nimport torch.nn.functional as F\nfrom torch.utils.data import Dataset, DataLoader\nfrom PIL import Image\nfrom sklearn.model_selection import train_test_split\nfrom tqdm import tqdm\nimport matplotlib.pyplot as plt\nfrom transformers import Mask2FormerForUniversalSegmentation, Mask2FormerImageProcessor\n\ncsv_path = \"/kaggle/working/balanced_image_mask_index.csv\"\nmask_root_prefix = \"/kaggle/input/mask-image/kaggle/working/masks\" \ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n\ndf = pd.read_csv(csv_path)\n\n#数据集划分\ndf = df.reset_index(drop=True)\ntrain_df, val_df = train_test_split(df, test_size=0.1, random_state=42)\n\n# dataset函数\nclass FlagellaDataset(Dataset):\n    def __init__(self, dataframe, processor):\n        self.df = dataframe.reset_index(drop=True)\n        self.processor = processor\n\n    def __getitem__(self, idx):\n        row = self.df.iloc[idx]\n        image = Image.open(row[\"image_path\"]).convert(\"RGB\")\n\n        if pd.isna(row[\"mask_path\"]):\n            # 对阴性样本创建空白mask\n            mask_tensor = torch.zeros((1, 512, 512), dtype=torch.float32)\n        else:\n            mask = Image.open(row[\"mask_path\"]).convert(\"L\")\n            mask = np.array(mask).astype(np.float32) / 255.0\n            mask_tensor = torch.from_numpy(mask).unsqueeze(0)\n\n        encoded = self.processor(images=image, return_tensors=\"pt\")\n        return {\n            \"pixel_values\": encoded[\"pixel_values\"].squeeze(0),\n            \"pixel_mask\": encoded[\"pixel_mask\"].squeeze(0),\n            \"mask_labels\": mask_tensor,\n        }\n\n    def __len__(self):\n        return len(self.df)\n\ndef custom_collate_fn(batch):\n    pixel_values = torch.stack([item[\"pixel_values\"] for item in batch])\n    pixel_mask = torch.stack([item[\"pixel_mask\"] for item in batch])\n    mask_labels = [item[\"mask_labels\"] for item in batch]\n    return {\n        \"pixel_values\": pixel_values,\n        \"pixel_mask\": pixel_mask,\n        \"mask_labels\": mask_labels,\n    }\n# 初始化\nprocessor = Mask2FormerImageProcessor.from_pretrained(\"facebook/mask2former-swin-small-coco-panoptic\")\ntrain_dataset = FlagellaDataset(train_df, processor)\nval_dataset = FlagellaDataset(val_df, processor)\ntrain_loader = DataLoader(train_dataset, batch_size=4, shuffle=True, collate_fn=custom_collate_fn)\nval_loader = DataLoader(val_dataset, batch_size=4, shuffle=False, collate_fn=custom_collate_fn)\n# 用于fine-tunning的基模型\nmodel = Mask2FormerForUniversalSegmentation.from_pretrained(\"facebook/mask2former-swin-small-coco-panoptic\").to(device)\n\n# 解冻非主干层\nfor name, param in model.named_parameters():\n    param.requires_grad = not name.startswith(\"backbone\")\n\noptimizer = torch.optim.AdamW(filter(lambda p: p.requires_grad, model.parameters()), lr=1e-4)\n\n#使用Mask2Former的循环逻辑会报错,这里改为标准的pytorch循环逻辑\nbest_val_loss = float(\"inf\")\npatience = 3\npatience_counter = 0\n\nprint(\"\\n 开始训练，设备：\", device)\nfor epoch in range(20):\n    model.train()\n    print(f\"\\n Epoch {epoch + 1}\")\n    train_losses = []\n\n    for step, batch in enumerate(tqdm(train_loader, desc=\"训练中\")):\n        pixel_values = batch[\"pixel_values\"].to(device)\n        pixel_mask = batch[\"pixel_mask\"].to(device)\n        mask_labels_list = batch[\"mask_labels\"]\n\n        outputs = model(pixel_values=pixel_values, pixel_mask=pixel_mask)\n        mask_preds = outputs[\"masks_queries_logits\"]\n\n        losses = []\n        for i in range(pixel_values.size(0)):\n            mask_pred = mask_preds[i][0:1]\n            mask_label = mask_labels_list[i].to(device).float()\n\n            if mask_label.dim() == 2:\n                mask_label = mask_label.unsqueeze(0).unsqueeze(0)\n            elif mask_label.dim() == 3:\n                mask_label = mask_label.unsqueeze(0)\n\n            mask_label_resized = F.interpolate(mask_label, size=mask_pred.shape[-2:], mode=\"bilinear\", align_corners=False)\n            mask_label_resized = mask_label_resized.squeeze(1)\n\n            # 采用BCEloss，添加pos_weight避免模型去向全0预测\n            loss = F.binary_cross_entropy_with_logits(\n                mask_pred, mask_label_resized, pos_weight=torch.tensor(3.0).to(device)\n            )\n            losses.append(loss)\n\n            if i == 0:\n                with torch.no_grad():\n                    #可视化训练过程\n                    print(\"sigmoid(mask_pred).mean():\", torch.sigmoid(mask_pred).mean().item())\n                    plt.subplot(1, 2, 1)\n                    plt.imshow(mask_label_resized.squeeze().cpu(), cmap='gray')\n                    plt.title(\"GT Mask\")\n                    plt.subplot(1, 2, 2)\n                    plt.imshow(torch.sigmoid(mask_pred).squeeze().cpu(), cmap='gray')\n                    plt.title(\"Pred Mask\")\n                    plt.show()\n\n        loss_batch = torch.stack(losses).mean()\n        loss_batch.backward()\n\n        # 统计梯度\n        with torch.no_grad():\n            grads = [param.grad.abs().mean().item() for param in model.parameters() if param.grad is not None]\n            if grads:\n                print(f\"平均梯度：{np.mean(grads):.6f}\")\n            else:\n                print(\"没有可训练的参数或无梯度\")\n\n        optimizer.step()\n        optimizer.zero_grad()\n        train_losses.append(loss_batch.item())\n\n        if step % 10 == 0:\n            print(f\"🟢 Step {step}: Train Loss = {loss_batch.item():.4f}\")\n\n    model.eval()\n    total_val_loss = 0.0\n    with torch.no_grad():\n        #验证集评估\n        for val_batch in tqdm(val_loader, desc=\"验证中\"):\n            pixel_values = val_batch[\"pixel_values\"].to(device)\n            pixel_mask = val_batch[\"pixel_mask\"].to(device)\n            mask_labels_list = val_batch[\"mask_labels\"]\n\n            outputs = model(pixel_values=pixel_values, pixel_mask=pixel_mask)\n            mask_preds = outputs[\"masks_queries_logits\"]\n\n            for i in range(pixel_values.size(0)):\n                mask_pred = mask_preds[i][0:1]\n                mask_label = mask_labels_list[i].to(device).float()\n\n                if mask_label.dim() == 2:\n                    mask_label = mask_label.unsqueeze(0).unsqueeze(0)\n                elif mask_label.dim() == 3:\n                    mask_label = mask_label.unsqueeze(0)\n\n                mask_label_resized = F.interpolate(mask_label, size=mask_pred.shape[-2:], mode=\"bilinear\", align_corners=False)\n                mask_label_resized = mask_label_resized.squeeze(1)\n\n                val_loss = F.binary_cross_entropy_with_logits(\n                    mask_pred, mask_label_resized, pos_weight=torch.tensor(3.0).to(device)\n                )\n                total_val_loss += val_loss.item()\n\n    avg_val_loss = total_val_loss / len(val_loader)\n    print(f\"验证集平均 Loss = {avg_val_loss:.4f}\")\n\n    if avg_val_loss < best_val_loss:\n        print(\"新最佳模型，保存中...\")\n        best_val_loss = avg_val_loss\n        patience_counter = 0\n        model.save_pretrained(\"/kaggle/working/mask2former_bce_best\")\n    else:\n        patience_counter += 1\n        print(f\"验证集无提升，Patience: {patience_counter}/{patience}\")\n        if patience_counter >= patience:\n            print(\"提前停止训练\")\n            break\n\nprint(\"训练完成！最佳验证 loss：\", best_val_loss)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"4. 对模型预测结果进行逻辑回归，解决模型在阳性样本上拟合效果很好，但无法有效分辨阴性样本的问题","metadata":{}},{"cell_type":"code","source":"import os\nimport pandas as pd\nimport numpy as np\nimport torch\nfrom torch.utils.data import Dataset, DataLoader\nfrom PIL import Image\nfrom tqdm import tqdm\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.metrics import f1_score, confusion_matrix\nfrom transformers import Mask2FormerForUniversalSegmentation, Mask2FormerImageProcessor, AutoConfig\nimport joblib\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\nmodel_path = \"/kaggle/input/heatmap-mask2former/pytorch/default/3/mask2former_package/model\"\nprocessor_path = \"/kaggle/input/heatmap-mask2former/pytorch/default/3/preprocessor_config.json\"\ncsv_path = \"/kaggle/working/balanced_image_mask_index.csv\"\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n\nprocessor = Mask2FormerImageProcessor.from_pretrained(processor_path, local_files_only=True)\nconfig = AutoConfig.from_pretrained(model_path, local_files_only=True)\nmodel = Mask2FormerForUniversalSegmentation.from_pretrained(model_path, config=config, local_files_only=True).to(device).eval()\n\n# 推理dataset\nclass InferenceDataset(Dataset):\n    def __init__(self, dataframe, processor):\n        self.df = dataframe.reset_index(drop=True)\n        self.processor = processor\n\n    def __getitem__(self, idx):\n        row = self.df.iloc[idx]\n        image = Image.open(row[\"image_path\"]).convert(\"RGB\")\n        encoded = self.processor(images=image, return_tensors=\"pt\")\n        label = 1 if pd.notna(row[\"mask_path\"]) else 0\n        return {\n            \"pixel_values\": encoded[\"pixel_values\"].squeeze(0),\n            \"pixel_mask\": encoded[\"pixel_mask\"].squeeze(0),\n            \"label\": label\n        }\n\n    def __len__(self):\n        return len(self.df)\n\n# 特征提取,用于逻辑回归\ndef extract_features(df):\n    dataset = InferenceDataset(df, processor)\n    loader = DataLoader(dataset, batch_size=4, shuffle=False)\n    results = []\n    with torch.no_grad():\n        for batch in tqdm(loader):\n            pixel_values = batch[\"pixel_values\"].to(device)\n            pixel_mask = batch[\"pixel_mask\"].to(device)\n            labels = batch[\"label\"].cpu().numpy()\n\n            outputs = model(pixel_values=pixel_values, pixel_mask=pixel_mask)\n            mask_preds = outputs[\"masks_queries_logits\"]\n\n            for i in range(pixel_values.size(0)):\n                mask_pred = mask_preds[i][0:1]\n                pred_mask = torch.sigmoid(mask_pred).squeeze().cpu().numpy()\n\n                max_value = pred_mask.max()\n                mean_value = pred_mask.mean()\n                area_ratio = np.sum(pred_mask > 0.5) / pred_mask.size\n\n                results.append({\n                    \"max\": max_value,\n                    \"mean\": mean_value,\n                    \"area\": area_ratio,\n                    \"label\": labels[i]\n                })\n\n    return pd.DataFrame(results)\n\n# 相同的数据集划分\ndf = pd.read_csv(csv_path).reset_index(drop=True)\nfrom sklearn.model_selection import train_test_split\ntrain_df, val_df = train_test_split(df, test_size=0.1, random_state=42)\n\ntrain_features = extract_features(train_df)\ntrain_features.to_csv(\"/kaggle/working/train_features.csv\", index=False)\n\nval_features = extract_features(val_df)\nval_features.to_csv(\"/kaggle/working/val_features.csv\", index=False)\n\n# 逻辑回归\nX_train = train_features[[\"max\", \"mean\", \"area\"]].values\ny_train = train_features[\"label\"].values\nX_val = val_features[[\"max\", \"mean\", \"area\"]].values\ny_val = val_features[\"label\"].values\n\nmodel_lr = LogisticRegression(max_iter=500)\nmodel_lr.fit(X_train, y_train)\n\n# 验证集评估 \nval_preds = model_lr.predict(X_val)\nval_probs = model_lr.predict_proba(X_val)[:,1]\nval_f1 = f1_score(y_val, val_preds)\ncm = confusion_matrix(y_val, val_preds)\nprint(f\"\\n 验证集逻辑回归 F1 = {val_f1:.4f}\")\nprint(\"验证集混淆矩阵:\\n\", cm)\n\n# 保存逻辑回归模型\njoblib.dump(model_lr, \"/kaggle/working/logistic_model.pkl\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"5. 可视化验证集上模型推理效果","metadata":{}},{"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\nfrom tqdm import tqdm\nfrom PIL import Image\nimport torch\nimport torch.nn.functional as F\nfrom torch.utils.data import Dataset, DataLoader\nimport matplotlib.pyplot as plt\nimport matplotlib.patches as patches\nimport joblib\nfrom transformers import Mask2FormerImageProcessor, Mask2FormerForUniversalSegmentation, AutoConfig\n\nmodel_path = \"/kaggle/input/heatmap-mask2former/pytorch/default/4/mask2former_package/model\"\nprocessor_path = \"/kaggle/input/heatmap-mask2former/pytorch/default/4\"\nlogistic_path = \"/kaggle/input/heatmap-mask2former/pytorch/default/4/logistic_model.pkl\"  \nval_csv = \"/kaggle/working/balanced_image_mask_index.csv\"\n\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n\n# 加载模型\nconfig = AutoConfig.from_pretrained(model_path, local_files_only=True)\nmodel = Mask2FormerForUniversalSegmentation.from_pretrained(model_path, config=config, local_files_only=True).to(device).eval()\nprocessor = Mask2FormerImageProcessor.from_pretrained(processor_path, local_files_only=True)\nlogistic_model = joblib.load(logistic_path)\n\n# 验证集数据加载\ndf = pd.read_csv(val_csv).reset_index(drop=True)\nfrom sklearn.model_selection import train_test_split\ntrain_df, val_df = train_test_split(df, test_size=0.1, random_state=42)\n\n# 定义Dataset与Dataloader\nclass ValDataset(Dataset):\n    def __init__(self, dataframe, processor):\n        self.df = dataframe.reset_index(drop=True)\n        self.processor = processor\n\n    def __getitem__(self, idx):\n        row = self.df.iloc[idx]\n        image = Image.open(row[\"image_path\"]).convert(\"RGB\")\n        encoded = self.processor(images=image, return_tensors=\"pt\")\n        label = 1 if pd.notna(row[\"mask_path\"]) else 0\n\n        # 加载GT mask\n        if pd.notna(row[\"mask_path\"]):\n            mask = Image.open(row[\"mask_path\"]).convert(\"L\")\n            mask = np.array(mask) / 255.0  # 归一化\n            mask_tensor = torch.tensor(mask, dtype=torch.float32)\n        else:\n            mask_tensor = torch.zeros((512, 512), dtype=torch.float32)  # 假设原始掩码大小为512×512\n\n        return {\n            \"pixel_values\": encoded[\"pixel_values\"].squeeze(0),\n            \"pixel_mask\": encoded[\"pixel_mask\"].squeeze(0),\n            \"mask_labels\": mask_tensor,\n            \"image_path\": row[\"image_path\"],\n            \"label\": label\n        }\n\n    def __len__(self):\n        return len(self.df)\n\nval_dataset = ValDataset(val_df, processor)\nval_loader = DataLoader(val_dataset, batch_size=1, shuffle=False)\n\n# 分类逻辑回归判别函数\ndef classify_mask_logistic(pred_mask, logistic_model):\n    max_value = pred_mask.max().item()\n    mean_value = pred_mask.mean().item()\n    area_ratio = np.sum(pred_mask.numpy() > 0.5) / pred_mask.numel()\n    feature = np.array([[max_value, mean_value, area_ratio]])\n    pred = logistic_model.predict(feature)[0]\n    return int(pred)\n\n# 提取mask中心\ndef get_center_from_mask(mask_tensor):\n    if torch.all(mask_tensor == 0):\n        return None\n    coords = torch.nonzero(mask_tensor == mask_tensor.max())\n    y, x = coords[0][-2:].tolist()\n    return x, y\n\ndef evaluate_and_visualize(model, val_loader, val_df, num_visualize=10, radius=6):\n    model.eval()\n    count = 0\n\n    # 评分核心参数\n    angstrom_threshold = 1000\n    pixel_size = 20  # 官方没有生命测试集的voxel spacing(Å/pixel),这里采用一个较为严格的指标评估\n\n    TP, FP, FN = 0, 0, 0\n\n    with torch.no_grad():\n        for batch_idx, batch in enumerate(val_loader):\n            pixel_values = batch[\"pixel_values\"].to(device)\n            pixel_mask = batch[\"pixel_mask\"].to(device)\n            outputs = model(pixel_values=pixel_values, pixel_mask=pixel_mask)\n            mask_preds = outputs[\"masks_queries_logits\"]\n\n            image_path = batch[\"image_path\"][0]\n            image = Image.open(image_path).convert(\"RGB\")\n            w_img, h_img = image.size\n\n            gt_mask_raw = batch[\"mask_labels\"][0].squeeze().cpu()\n            pred_mask = torch.sigmoid(mask_preds[0][0]).cpu()\n            gt_mask = F.interpolate(gt_mask_raw.unsqueeze(0).unsqueeze(0), size=pred_mask.shape, mode=\"bilinear\", align_corners=False).squeeze()\n\n            h_pred, w_pred = pred_mask.shape\n\n            gt_center = get_center_from_mask(gt_mask)\n            pred_center = get_center_from_mask(pred_mask)\n\n            # 计算缩放系数 (特征图分辨率 → 原图像素)\n            scale_x = w_img / w_pred\n            scale_y = h_img / h_pred\n\n            pred_label = classify_mask_logistic(pred_mask, logistic_model)\n\n            row = val_df.iloc[batch_idx]\n            is_positive = int(row[\"is_positive\"])\n\n            if is_positive == 0 and pred_label == 0:\n                pass  # 正确负样本\n            elif is_positive == 0 and pred_label == 1:\n                FP += 1\n            elif is_positive == 1 and pred_label == 0:\n                FN += 1\n            else:  \n                z_true = int(row[\"slice_idx\"])\n                y_true, x_true = eval(row[\"points\"])[0]\n                z_pred = z_true \n\n                if pred_center is not None:\n                    # 预测中心先还原回原图分辨率\n                    x_pred_rescaled = pred_center[0] * scale_x\n                    y_pred_rescaled = pred_center[1] * scale_y\n\n                    # 计算像素空间欧氏距离\n                    dist_pixel = np.sqrt(\n                        (z_true - z_pred) ** 2 + \n                        (y_true - y_pred_rescaled) ** 2 + \n                        (x_true - x_pred_rescaled) ** 2\n                    )\n\n                    # 转换为物理单位 Å\n                    dist_angstrom = dist_pixel * pixel_size\n\n                    if dist_angstrom <= angstrom_threshold:\n                        TP += 1\n                    else:\n                        FN += 1\n                else:\n                    FN += 1\n\n            # 可视化\n            if count < num_visualize:\n                fig, axs = plt.subplots(1, 3, figsize=(15, 5))\n\n                axs[0].imshow(gt_mask.numpy(), cmap='gray')\n                axs[0].set_title(\"GT Mask\")\n                axs[0].axis('off')\n\n                axs[1].imshow(pred_mask.numpy(), cmap='gray')\n                axs[1].set_title(\"Pred Mask\")\n                axs[1].axis('off')\n\n                axs[2].imshow(image)\n                axs[2].set_title(\"Pred vs GT Center\")\n                axs[2].axis('off')\n\n                if pred_label == 1 and pred_center is not None:\n                    pred_x = int(pred_center[0] * scale_x)\n                    pred_y = int(pred_center[1] * scale_y)\n                    pred_x = min(max(pred_x, 0), w_img - 1)\n                    pred_y = min(max(pred_y, 0), w_img - 1)\n                    axs[2].add_patch(patches.Circle(\n                        (pred_x, pred_y), radius=radius,\n                        edgecolor='red', facecolor='none',\n                        linewidth=2, alpha=0.7, linestyle='-'\n                    ))\n                    axs[2].text(pred_x + 2, pred_y + 10, \"Pred\", color=\"red\", fontsize=10, weight='bold')\n                else:\n                    axs[2].text(w_img - 10, 30, \"Pred: None\", color=\"red\", fontsize=14, weight='bold', ha='right')\n\n                if gt_center is not None:\n                    gt_x = int(gt_center[0] * scale_x)\n                    gt_y = int(gt_center[1] * scale_y)\n                    gt_x = min(max(gt_x, 0), w_img - 1)\n                    gt_y = min(max(gt_y, 0), w_img - 1)\n                    axs[2].add_patch(patches.Circle(\n                        (gt_x, gt_y), radius=radius,\n                        edgecolor='cyan', facecolor='none',\n                        linewidth=2, alpha=1.0, linestyle='--'\n                    ))\n                    axs[2].text(gt_x + 2, gt_y - 2, \"GT\", color=\"cyan\", fontsize=10, weight='bold')\n                else:\n                    axs[2].text(10, 30, \"GT: None\", color=\"cyan\", fontsize=14, weight='bold')\n\n                plt.tight_layout()\n                plt.show()\n\n                count += 1\n\n    # 最终评分指标\n    precision = TP / (TP + FP) if (TP + FP) > 0 else 0\n    recall = TP / (TP + FN) if (TP + FN) > 0 else 0\n    beta = 2\n    if precision + recall == 0:\n        f_beta = 0\n    else:\n        f_beta = (1 + beta**2) * precision * recall / (beta**2 * precision + recall)\n\n    print(f\"\\n Final Evaluation Result (Å-based strict scoring):\")\n    print(f\"TP={TP}, FP={FP}, FN={FN}\")\n    print(f\"Precision={precision:.4f}, Recall={recall:.4f}, F2={f_beta:.4f}\")\n\n\n# 执行可视化\nevaluate_and_visualize(model, val_loader, val_df, num_visualize=40)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-13T06:55:12.013362Z","iopub.execute_input":"2025-06-13T06:55:12.014116Z","iopub.status.idle":"2025-06-13T06:58:58.026101Z","shell.execute_reply.started":"2025-06-13T06:55:12.014086Z","shell.execute_reply":"2025-06-13T06:58:58.025089Z"}},"outputs":[],"execution_count":null}]}