diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 600bd5b..38a537d 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -27,7 +27,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: npm - name: Install dependencies diff --git a/package-lock.json b/package-lock.json index 723a310..c823d65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,9 @@ "dependencies": { "@astrojs/mdx": "latest", "astro": "latest" + }, + "engines": { + "node": ">=22.12.0" } }, "node_modules/@astrojs/compiler": { diff --git a/package.json b/package.json index 25aaaca..d22bf04 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,9 @@ "build": "astro build", "preview": "astro preview" }, + "engines": { + "node": ">=22.12.0" + }, "dependencies": { "@astrojs/mdx": "latest", "astro": "latest" diff --git a/src/components/Glossary.astro b/src/components/Glossary.astro index a17abc8..1f65bd8 100644 --- a/src/components/Glossary.astro +++ b/src/components/Glossary.astro @@ -7,13 +7,19 @@ interface Term { interface Props { terms: Term[]; + language?: "ja" | "en"; } -const { terms } = Astro.props; +const { terms, language = "ja" } = Astro.props; + +const placeholder = + language === "ja" + ? "例: Dice, U-Net, T2 SPACE, Focal Loss" + : "Example: Dice, U-Net, T2 SPACE, Focal Loss"; ---
- +
{ diff --git a/src/components/LabelMapping.astro b/src/components/LabelMapping.astro index 578fcfd..60a94a9 100644 --- a/src/components/LabelMapping.astro +++ b/src/components/LabelMapping.astro @@ -6,13 +6,27 @@ interface MappingRow { interface Props { rows: MappingRow[]; + language?: "ja" | "en"; } -const { rows } = Astro.props; +const { rows, language = "ja" } = Astro.props; + +const copy = { + ja: { + title: "SPIDERラベルの統合", + note: "ポイントは、解剖学的な個体番号を当てるのではなく、臨床的に見たい構造カテゴリを正確に塗り分けること。", + }, + en: { + title: "SPIDER Label Mapping", + note: "The key point is that the model predicts clinically useful anatomical categories, not individual anatomical IDs.", + }, +} as const; + +const t = copy[language]; ---
-

SPIDERラベルの統合

+

{t.title}

{ rows.map((row) => (
@@ -21,7 +35,5 @@ const { rows } = Astro.props;
)) } -

- ポイントは、解剖学的な個体番号を当てるのではなく、臨床的に見たい構造カテゴリを正確に塗り分けること。 -

+

{t.note}

diff --git a/src/components/ResourceSection.astro b/src/components/ResourceSection.astro index 2ee66f4..53666ec 100644 --- a/src/components/ResourceSection.astro +++ b/src/components/ResourceSection.astro @@ -1,32 +1,56 @@ --- +interface Props { + language?: "ja" | "en"; +} + +const { language = "ja" } = Astro.props; const baseUrl = import.meta.env.BASE_URL.replace(/\/?$/, "/"); const paperPdf = `${baseUrl}papers/paper.pdf`; const datasetPdf = `${baseUrl}papers/Dataset_Paper.pdf`; + +const copy = { + ja: { + openPdf: "別タブで開く", + sourceNote: "出版社ページで概要、DOI、引用情報を確認する。", + mainPdfNote: "このメモの元になっているメイン論文PDF。", + datasetNote: "SPIDERデータセットの詳細を確認する補助資料。", + linksLabel: "論文資料リンク", + }, + en: { + openPdf: "Open in new tab", + sourceNote: "Publisher page for the abstract, DOI, and citation details.", + mainPdfNote: "Local copy of the main paper used for this memo.", + datasetNote: "Supplementary source for the SPIDER dataset details.", + linksLabel: "Paper source links", + }, +} as const; + +const t = copy[language]; ---
Main Paper PDF - 別タブで開く + {t.openPdf}
-
diff --git a/src/components/SpineVisual.astro b/src/components/SpineVisual.astro index 3dca388..a735eab 100644 --- a/src/components/SpineVisual.astro +++ b/src/components/SpineVisual.astro @@ -1,4 +1,29 @@ -
+--- +interface Props { + language?: "ja" | "en"; +} + +const { language = "ja" } = Astro.props; + +const labels = { + ja: { + vertebrae: "椎体 Vertebrae", + canal: "脊柱管 Spinal Canal", + discs: "椎間板 IVDs", + aria: "椎体、脊柱管、椎間板のセグメンテーション模式図", + }, + en: { + vertebrae: "Vertebrae", + canal: "Spinal Canal", + discs: "Intervertebral Discs", + aria: "Segmentation diagram showing vertebrae, spinal canal, and intervertebral discs", + }, +} as const; + +const t = labels[language]; +--- + +
T2 SPACE segmentation map
- 椎体 Vertebrae - 脊柱管 Spinal Canal - 椎間板 IVDs + {t.vertebrae} + {t.canal} + {t.discs}
diff --git a/src/content/paper-memo-en.mdx b/src/content/paper-memo-en.mdx new file mode 100644 index 0000000..574b455 --- /dev/null +++ b/src/content/paper-memo-en.mdx @@ -0,0 +1,151 @@ +--- +title: "Lumbar MRI Segmentation Paper Memo" +description: "An English presentation page for Ahmed et al. (2025), summarizing the paper, dataset, model, metrics, and project direction." +--- + +import Section from "../components/Section.astro"; +import ResourceSection from "../components/ResourceSection.astro"; +import KpiGrid from "../components/KpiGrid.astro"; +import DataFlow from "../components/DataFlow.astro"; +import LabelMapping from "../components/LabelMapping.astro"; +import ModelBoard from "../components/ModelBoard.astro"; +import NoteGrid from "../components/NoteGrid.astro"; +import MetricsTable from "../components/MetricsTable.astro"; +import Glossary from "../components/Glossary.astro"; +import Timeline from "../components/Timeline.astro"; +import Callout from "../components/Callout.astro"; + +
+ +
+ +
+ +
+ +
+
+ + +
+
+ +
+ +
Combined Loss = 0.6 × Focal Loss + 0.4 × Dice Loss
+ +
+ +
+ + + + Presentation note: + Dice around 0.97 is very high, but the reported result should be discussed carefully because test-set details and preprocessing choices affect generalization. + +
+ +
+ +
+ +
+ +
diff --git a/src/layouts/MemoLayout.astro b/src/layouts/MemoLayout.astro index 78105fc..2adc592 100644 --- a/src/layouts/MemoLayout.astro +++ b/src/layouts/MemoLayout.astro @@ -5,24 +5,73 @@ import "../styles/site.css"; interface Props { title: string; description: string; + language?: "ja" | "en"; } -const { title, description } = Astro.props; - -const navItems = [ - { id: "overview", label: "概要" }, - { id: "resources", label: "資料" }, - { id: "important", label: "重要情報" }, - { id: "data", label: "データと前処理" }, - { id: "model", label: "モデル" }, - { id: "metrics", label: "精度" }, - { id: "glossary", label: "用語" }, - { id: "todo", label: "卒研メモ" }, -]; +const { title, description, language = "ja" } = Astro.props; + +const baseUrl = import.meta.env.BASE_URL.replace(/\/?$/, "/"); +const homeHref = baseUrl; +const englishHref = `${baseUrl}en/`; + +const copy = { + ja: { + htmlLang: "ja", + brand: ["腰椎MRI", "セグメンテーション"], + note: "Ahmed et al. (2025) の内容を、発表準備と実装メモ用に再整理したページ。", + navLabel: "ページ内ナビゲーション", + eyebrow: "Ahmed et al. 2025 / Modified U-Net", + title: "腰椎MRIを4クラスに自動分割する研究メモ", + lead: + "MRI画像から背景・椎体・脊柱管・椎間板をピクセル単位で分類する。論文の核心は、前処理、U-Net改良、Combined Lossを組み合わせて高精度なセグメンテーションを実現した点にある。", + actions: { + primary: "重要情報を見る", + resources: "PDFとURLを見る", + glossary: "難しい単語を確認", + }, + navItems: [ + { id: "overview", label: "概要" }, + { id: "resources", label: "資料" }, + { id: "important", label: "重要情報" }, + { id: "data", label: "データと前処理" }, + { id: "model", label: "モデル" }, + { id: "metrics", label: "精度" }, + { id: "glossary", label: "用語" }, + { id: "todo", label: "卒研メモ" }, + ], + }, + en: { + htmlLang: "en", + brand: ["Lumbar MRI", "Segmentation"], + note: "English presentation version of the Ahmed et al. (2025) paper memo.", + navLabel: "Page navigation", + eyebrow: "Ahmed et al. 2025 / Modified U-Net", + title: "A research note on four-class lumbar MRI segmentation", + lead: + "This page summarizes a deep learning approach that classifies each MRI pixel into background, vertebrae, spinal canal, or intervertebral discs. The key idea is the combination of careful preprocessing, a modified U-Net, and a Combined Loss.", + actions: { + primary: "Key facts", + resources: "PDF and links", + glossary: "Terminology", + }, + navItems: [ + { id: "overview", label: "Overview" }, + { id: "resources", label: "Sources" }, + { id: "important", label: "Key Facts" }, + { id: "data", label: "Data Pipeline" }, + { id: "model", label: "Model" }, + { id: "metrics", label: "Metrics" }, + { id: "glossary", label: "Terms" }, + { id: "todo", label: "Project Plan" }, + ], + }, +} as const; + +const t = copy[language]; --- - + @@ -32,14 +81,18 @@ const navItems = [
-