OSCR

Automated detection of new cerebral infarctions and prognostic implications using deep learning on serial MRI.

Code ↔ Paper

3 matches between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 3 matches
  1. [1] § Methods › Image data preparation and annotation ↔ 1.preprocessing.ipynb, lines 14–54 · score 0.77 · histogram matching, brain extraction, channel, coregistered, Preprocessing, ANTsPyNet
  2. [2] § Methods › Deep learning model development ↔ 2.ModelImplementation.ipynb, lines 198–227 · score 0.66 · random rotations, global, kernel, augmentation, stride, translations
  3. [3] § Methods › Deep learning model development ↔ 2.ModelImplementation.ipynb, lines 48–114 · score 0.58 · model implementation, Gradient, TensorFlow, weighted, optimization, trained

Paper

Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

Jupyter notebook · 371 lines · 11 KB · no license · 2 matches

  1. # %%
  2. import os
  3. import tensorflow as tf
  4. import tensorflow.keras as keras
  5. import numpy as np
  6. import random
  7. import tensorflow.keras.backend as K
  8. import gc
  9. import natsort
  10. from tensorflow.keras import layers, models
  11. from tensorflow.keras.layers import Lambda
  12. # %%
  13. def seed_everything(seed: int = 41):
  14. random.seed(seed)
  15. np.random.seed(seed)
  16. os.environ["PYTHONHASHSEED"] = str(seed)
  17. tf.random.set_seed(seed)
  18. seed_everything()
  19. # %% [markdown]
  20. # **Import custom metrics and loss**
  21. # %%
  22. import CorrelationAccuracyMetric
  23. import CorrelationAccuracyNegMetric
  24. import supervised_contrastive_loss
  25. # %% [markdown]
  26. # **Hyperparameters**
  27. # %%
  28. imsize = 256
  29. input_shape = (imsize, imsize, 2)
  30. width = 128
  31. kernal_size = 3
  32. strides = 2
  33. encoder_lr = 1e-3
  34. num_epochs_encoder = 100
  35. classifier_lr = 1e-3
  36. num_epochs_classifier = 100
  37. encoder_trainable = False
  38. # %% [markdown]
  39. # # **Stage1. Encoder**
  40. # %% [markdown]
  41. # ## Model definition
  42. # %%
  43. class SupConModel(tf.keras.Model):
  44. def __init__(self, encoder, projection_head, augmenter, **kwargs):
  45. super(SupConModel, self).__init__(**kwargs)
  46. self.encoder = encoder
  47. self.projection_head = projection_head
  48. self.augmenter = augmenter
  49. self.loss_tracker = tf.keras.metrics.Mean(name='loss')
  50. self.PosCorr = CorrelationAccuracyMetric()
  51. self.NegCorr = CorrelationAccuracyNegMetric()
  52. def compile(self, optimizer, loss, **kwargs):
  53. super(SupConModel, self).compile(**kwargs)
  54. self.optimizer = optimizer
  55. self.loss = loss
  56. def call(self, inputs):
  57. augmented_inputs = self.augmenter(inputs)
  58. features = self.encoder(augmented_inputs)
  59. return tf.nn.l2_normalize(features, axis=1)
  60. @tf.function
  61. def train_step(self, data):
  62. images, labels = data
  63. with tf.GradientTape() as tape:
  64. projections = self(images, training=True)
  65. loss = self.loss(labels, projections)
  66. trainable_vars = self.encoder.trainable_weights
  67. gradients = tape.gradient(loss, trainable_vars)
  68. self.optimizer.apply_gradients(zip(gradients, trainable_vars))
  69. self.loss_tracker.update_state(loss)
  70. self.PosCorr.update_state(labels, projections)
  71. self.NegCorr.update_state(labels, projections)
  72. return {
  73. 'loss': self.loss_tracker.result(),
  74. 'corr_pos_pair': self.PosCorr.result(),
  75. 'corr_neg_pair': self.NegCorr.result(),
  76. }
  77. @tf.function
  78. def test_step(self, data):
  79. images, labels = data
  80. projections = self(images, training=False)
  81. loss = self.loss(labels, projections)
  82. self.loss_tracker.update_state(loss)
  83. self.PosCorr.update_state(labels, projections)
  84. self.NegCorr.update_state(labels, projections)
  85. return {
  86. 'loss': self.loss_tracker.result(),
  87. 'corr_pos_pair': self.PosCorr.result(),
  88. 'corr_neg_pair': self.NegCorr.result(),
  89. }
  90. @property
  91. def metrics(self):
  92. return [self.loss_tracker, self.PosCorr, self.NegCorr]
  93. # %% [markdown]
  94. # ## Data loader
  95. # %%
  96. def create_dataset(fpaths, labels, batch_size, buffer_size=1000):
  97. # Convert file paths and labels from lists to TensorFlow tensors
  98. fpaths = tf.constant(fpaths, dtype=tf.string)
  99. labels = tf.constant(labels, dtype=tf.float32)
  100. # Create a TensorFlow Dataset from the file paths and labels
  101. dataset = tf.data.Dataset.from_tensor_slices((fpaths, labels))
  102. # Define the parsing function to apply the preprocessing
  103. def parse_function2(fpath, label):
  104. # Use tf.numpy_function to load the .npy file with NumPy
  105. def load_npy_file(f):
  106. return np.load(f)
  107. images = tf.numpy_function(load_npy_file, [fpath], tf.float32)
  108. images.set_shape((imsize,imsize,2)) # Explicitly set the shape
  109. label = tf.cast(label, tf.float32)
  110. label = tf.reshape(label, [1])
  111. return images, label
  112. # Map the parsing function to the dataset
  113. dataset = dataset.map(parse_function2, num_parallel_calls=tf.data.AUTOTUNE)
  114. # Shuffle, batch, and prefetch the dataset
  115. dataset = dataset.batch(batch_size, drop_remainder=True)
  116. dataset = dataset.prefetch(buffer_size=tf.data.AUTOTUNE)
  117. return dataset
  118. # %%
  119. def get_all_files(folder):
  120. file_paths = []
  121. for root, dirs, files in os.walk(folder):
  122. for file in files:
  123. file_paths.append(os.path.abspath(os.path.join(root, file)))
  124. return file_paths
  125. # %%
  126. HP_files = natsort.natsorted(get_all_files(f'./dataset/HP'))
  127. HP_labels = [1]*len(os.listdir(f'./dataset/HP/Change')) + [0]*len(os.listdir(f'./dataset/HP/NoChange'))
  128. BP_files = natsort.natsorted(get_all_files(f'./dataset/BP'))
  129. BP_labels = [1]*len(os.listdir(f'./dataset/BP/Change')) + [0]*len(os.listdir(f'./dataset/BP/NoChange'))
  130. # %%
  131. patIDsHP = np.unique([fileName.split('_')[-2] for fileName in HP_files])
  132. trIds = patIDsHP[:int(0.7*len(patIDsHP))]
  133. vaIds = patIDsHP[int(0.7*len(patIDsHP)):]
  134. # %%
  135. HP_files_Tr = [fileName for fileName in HP_files if fileName.split('_')[-2] in trIds]
  136. HP_files_Va = [fileName for fileName in HP_files if fileName.split('_')[-2] in vaIds]
  137. # %%
  138. HP_labels_Tr = [0 if 'NoChange' in fileName else 1 for fileName in HP_files_Tr]
  139. HP_labels_Va = [0 if 'NoChange' in fileName else 1 for fileName in HP_files_Va]
  140. # %%
  141. temp = list(zip(HP_files_Tr, HP_labels_Tr))
  142. random.shuffle(temp)
  143. HP_files_Tr, HP_labels_Tr = zip(*temp)
  144. temp = list(zip(HP_files_Va, HP_labels_Va))
  145. random.shuffle(temp)
  146. HP_files_Va, HP_labels_Va = zip(*temp)
  147. temp = list(zip(BP_files, BP_labels))
  148. random.shuffle(temp)
  149. BP_files, BP_labels = zip(*temp)
  150. # %%
  151. tr_gen = create_dataset(HP_files_Tr, HP_labels_Tr, batch_size=256)
  152. va_gen = create_dataset(HP_files_Va, HP_labels_Va, batch_size=256)
  153. ts_gen = create_dataset(BP_files, BP_labels, batch_size=256)
  154. # %% [markdown]
  155. # # Model build
  156. # %%
  157. model = SupConModel(
  158. augmenter=keras.Sequential(
  159. [
  160. layers.Input(shape=(imsize, imsize, 2), name='AugInput'),
  161. layers.RandomTranslation(height_factor=(-0.1,0.1), width_factor=(-0.1,0.1), fill_mode='constant'),
  162. layers.RandomRotation((-45/360, 45/360), fill_mode='constant', name='AugRandRotate'),
  163. ],
  164. name="autmenter"),
  165. encoder=keras.Sequential(
  166. [
  167. layers.Input(shape=(imsize, imsize, 2), name='EncInput'),
  168. layers.Conv2D(width, kernel_size=kernal_size, strides=strides, activation="relu", name='EncCov2_1'),
  169. layers.Conv2D(width, kernel_size=kernal_size, strides=strides, activation="relu", name='EncCov2_2'),
  170. layers.Conv2D(width, kernel_size=kernal_size, strides=strides, activation="relu", name='EncCovFinal'),
  171. layers.GlobalAveragePooling2D(name='EncGAP'),
  172. ],
  173. name="encoder"),
  174. projection_head=keras.Sequential(
  175. [
  176. layers.Input(shape=(width,), name='ProjHeadInput'),
  177. layers.Dense(width, name='ProjHeadDense'),
  178. ],
  179. name="projection_head"),
  180. )
  181. # %%
  182. # Compile model with supervised contrastive loss
  183. model.compile(
  184. optimizer=keras.optimizers.Adam(learning_rate=encoder_lr),
  185. loss=supervised_contrastive_loss,
  186. metrics=[CorrelationAccuracyMetric(), CorrelationAccuracyNegMetric()]
  187. )
  188. # Print model summary
  189. model.summary()
  190. # %% [markdown]
  191. # # Training
  192. # %%
  193. class SaveEncoderCallback(tf.keras.callbacks.Callback):
  194. def __init__(self, encoder, filepath):
  195. super(SaveEncoderCallback, self).__init__()
  196. self.encoder = encoder
  197. self.filepath = filepath
  198. self.best_loss = float('inf')
  199. def on_epoch_end(self, epoch, logs=None):
  200. current_loss = logs.get('loss')
  201. if current_loss < self.best_loss:
  202. self.best_loss = current_loss
  203. self.encoder.save(self.filepath.format(epoch=epoch, loss=current_loss))
  204. mdl_Name = f'SupCon({imsize})'
  205. mdl_path = f'./{mdl_Name}/encoder.keras'
  206. if not os.path.exists(f'./{mdl_Name}/'):
  207. os.mkdir(f'./{mdl_Name}/')
  208. mcp = SaveEncoderCallback(model.encoder, mdl_path)
  209. # %%
  210. model.evaluate(tr_gen)
  211. # %%
  212. # run training
  213. history = model.fit(tr_gen, epochs=num_epochs_encoder, validation_data=va_gen, callbacks=[mcp])
  214. # %%
  215. model = tf.keras.models.load_model(mdl_path)
  216. model.add(layers.Lambda(lambda x: tf.nn.l2_normalize(x,axis=1), name='L2Norm'))
  217. print(f"Best val loss at epoah {np.argmin(history.history['val_loss'])}")
  218. # %% [markdown]
  219. # ---
  220. #
  221. # **Test set evaluation**
  222. # %%
  223. negCorr = CorrelationAccuracyNegMetric()
  224. posCorr = CorrelationAccuracyMetric()
  225. tsloss = []
  226. scoreTest = []
  227. labelsTsResult = []
  228. cnt = 0
  229. for batch in ts_gen:
  230. image, label = batch
  231. predTest = model.predict(image, verbose=False)
  232. negCorr.update_state(label, predTest)
  233. posCorr.update_state(label, predTest)
  234. tsloss.append(supervised_contrastive_loss(label, predTest).numpy())
  235. scoreTest.extend(predTest.tolist())
  236. labelsTsResult.extend(label.numpy().tolist())
  237. cnt += 1
  238. if cnt > 100:
  239. break
  240. print(f'ts_corr_neg_pair: {negCorr.result():.4f} - ts_corr_pos_pair: {posCorr.result():.4f} - ts_loss: {np.mean(tsloss)}')
  241. # %% [markdown]
  242. # # **Stage 2: Classifier**
  243. # %%
  244. def seed_everything(seed: int = 42):
  245. random.seed(seed)
  246. np.random.seed(seed)
  247. os.environ["PYTHONHASHSEED"] = str(seed)
  248. tf.random.set_seed(seed)
  249. seed_everything()
  250. # %% [markdown]
  251. # ## Load encoder
  252. # %%
  253. mdl_path = f'./{mdl_Name}/encoder.keras'
  254. encoder = tf.keras.models.load_model(mdl_path)
  255. # %% [markdown]
  256. # # Model build
  257. # %%
  258. class L2NormalizationLayer(layers.Layer):
  259. def __init__(self, **kwargs):
  260. super(L2NormalizationLayer, self).__init__(**kwargs)
  261. def call(self, inputs):
  262. return tf.math.l2_normalize(inputs, axis=1)
  263. def compute_output_shape(self, input_shape):
  264. return input_shape
  265. # %%
  266. encoder.trainable = encoder_trainable
  267. input = keras.Input((imsize, imsize, 2))
  268. x = layers.RandomRotation((-5/360, 5/360), fill_mode='constant', name='RandRotate')(input)
  269. for layer in encoder.layers:
  270. x = layer(x)
  271. x = L2NormalizationLayer(name='L2Norm')(x)
  272. output = layers.Dense(1, activation='sigmoid', name='Sigmoid')(x)
  273. myMdl = keras.Model(input, output)
  274. # %%
  275. myMdl.summary()
  276. # %%
  277. myMdl.compile(optimizer=keras.optimizers.Adam(learning_rate=classifier_lr),
  278. loss=keras.losses.BinaryCrossentropy(),
  279. metrics=[keras.metrics.AUC(name='AUC'),'accuracy']
  280. )
  281. # %%
  282. clfPath = f'./{mdl_Name}/classifier.keras'
  283. mcp = tf.keras.callbacks.ModelCheckpoint(filepath=clfPath,
  284. monitor='val_loss',
  285. save_best_only=True,
  286. mode='min')
  287. # %%
  288. # run training
  289. history2 = myMdl.fit(tr_gen, epochs=num_epochs_classifier, validation_data=va_gen, callbacks=[mcp])
  290. # %%
  291. custom_objects = {'L2NormalizationLayer': L2NormalizationLayer}
  292. myMdl = keras.models.load_model(clfPath, custom_objects=custom_objects, safe_mode=False)
  293. # %%
  294. myMdl.evaluate(ts_gen)

2.ModelImplementation.ipynb at commit 7c18ca6, no license · at the source

Overview

Authors: Hwan-ho Cho1, Joonwon Lee2, Jeonghoon Bae3, Dongwhane Lee4, Hyung Chan Kim5, Suk Yoon Lee6, Jung Hwa Seo7, Woo-Keun Seo8, Jin-Man Jung9, Hyunjin Park10,11, Seongho Park12
ORCID iDs: Hwan-ho Cho
  1. Department of Electronics Engineering, Incheon National University,Incheon, South Korea
  2. Department of Neurology, Inje University Haeundae Paik Hospital,Busan, South Korea
  3. Department of Neurology, Chung-Ang University Gwangmyeong Hospital,Gwangmyeong, South Korea
  4. Department of Neurology, Uijeongbu Eulji Medical Center, Eulji University School of Medicine,Uijeongbu, South Korea
  5. Department of Neurology, Ulsan Hospital, Ulsan, South Korea
  6. Department of Neurology, Busan Paik Hospital, Inje University College of Medicine,Busan, South Korea
  7. Department of Neurology, Dong-A University College of Medicine,Busan, South Korea
  8. Department of Neurology and Stroke Center, Samsung Medical Center, Sungkyunkwan University School of Medicine,Seoul, South Korea
  9. Department of Neurology, Korea University Ansan Hospital,Ansan, South Korea
  10. Department of Electrical and Computer Engineering, Sungkyunkwan University,Suwon, South Korea
  11. Center for Neuroscience Imaging Research, Institute for Basic Science,Suwon, South Korea
  12. Department of Neurology, Hanyang University Guri Hospital, College of Medicine, Hanyang University,Guri, South Korea
Institutions: Incheon National University (South Korea); Inje University Haeundae Paik Hospital (South Korea); Chung-Ang University Gwangmyeong Hospital (South Korea); Eulji University (South Korea); Ulsan University Hospital (South Korea); Inje University (South Korea); Dong-A University (South Korea); Sungkyunkwan University (South Korea); Korea University Ansan Hospital (South Korea); Institute for Basic Science (South Korea); Hanyang University (South Korea)
Journal: NPJ digital medicine, volume 9, issue 1, article 316
Dates: received 20 September 2025; accepted 22 February 2026; published online 5 March 2026
Type: Research article · Language: English
License: CC BY-NC-ND
Identifiers: DOI 10.1038/s41746-026-02511-x · PMID 41786919 · PMCID PMC13079727 · OpenAlex W7133925242
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: structural MRI / diffusion (modality), human (organism), stroke (population), clinical / translational (subfield)
Methods: Connectivity, Statistics, Machine learning
Keywords: Biomarkers, Medical research, Neurology, Neuroscience
Topic: Acute Ischemic Stroke Management (Epidemiology, Medicine), according to OpenAlex
Citations: not cited yet (Europe PMC); 21 references in the paper

Abstract

The abstract is not reproduced here: the paper's license (CC BY-NC-ND) does not allow it. Read it in the paper, at the publisher or on Europe PMC.

Repository

Its files are read in the Code ↔ Paper reader above, with 3 matches between paragraphs and lines of code.

Hwan-ho/SupConFLAIRChange

License: none: the authors keep all their rights
State: the link answers, verified on 30 September 2026
Evidence: files inventoried
Commit: 7c18ca6f79d829088615d6e66ec2bbfa38ce0f96, 14 April 2026
Languages: Python (3), Jupyter (2)
Size: 6 files, 5 scripts
Software Heritage: not archived
Found in: “Code availability”
Holds: README, 2 notebooks
Not found: license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: NumPy (2 files), ANTs (1 file), Keras (1 file), TensorFlow (1 file)
Availability: 1 check, the latest on 30 September 2026: the link answers
  • 30 September 2026: the link answers
6 files

Code availability statement

The paper has a code availability statement. Its license (CC BY-NC-ND) does not allow reproducing it here; in short, from what the harvester recognized in it:

Read it in the paper: doi.org/10.1038/s41746-026-02511-x.

Tracing map

Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.

What the map holds:

  • 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 5 scripts, each with its path and the digest of its content;
  • 3 matches between paragraphs of the paper and lines of the code (method lexical-v1);
  • neither the text of the paper nor the code itself.

Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.

Data

No dataset and no data link were found in the paper.

Code and data availability statement

The paper has a code and data availability statement. Its license (CC BY-NC-ND) does not allow reproducing it here; in short, from what the harvester recognized in it:

  • it points to the authors' code: Hwan-ho/SupConFLAIRChange
  • it says that the data are available on request
  • it says that the code is available on request

Read it in the paper: doi.org/10.1038/s41746-026-02511-x.

Versions

The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.

Version 1, 30 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 11 authors, 4 keywords, 5 funders, 20 references.

Cite

This paper

Cho, H.-h., Lee, J., Bae, J., Lee, D., Kim, H. C., Lee, S. Y., Seo, J. H., Seo, W.-K., Jung, J.-M., Park, H., & Park, S. (2026). Automated detection of new cerebral infarctions and prognostic implications using deep learning on serial MRI. NPJ digital medicine, 9(1), 316. https://doi.org/10.1038/s41746-026-02511-x

BibTeX

@article{cho2026automated,
author = {Cho, Hwan-ho and Lee, Joonwon and Bae, Jeonghoon and Lee, Dongwhane and Kim, Hyung Chan and Lee, Suk Yoon and Seo, Jung Hwa and Seo, Woo-Keun and Jung, Jin-Man and Park, Hyunjin and Park, Seongho},
title = {{Automated detection of new cerebral infarctions and prognostic implications using deep learning on serial MRI}},
journal = {NPJ digital medicine},
year = {2026},
month = mar,
volume = {9},
number = {1},
pages = {316},
publisher = {Nature Publishing Group},
issn = {2398-6352},
doi = {10.1038/s41746-026-02511-x},
url = {https://doi.org/10.1038/s41746-026-02511-x},
pmid = {41786919},
pmcid = {PMC13079727}
}

RIS

TY - JOUR
AU - Cho, Hwan-ho
AU - Lee, Joonwon
AU - Bae, Jeonghoon
AU - Lee, Dongwhane
AU - Kim, Hyung Chan
AU - Lee, Suk Yoon
AU - Seo, Jung Hwa
AU - Seo, Woo-Keun
AU - Jung, Jin-Man
AU - Park, Hyunjin
AU - Park, Seongho
TI - Automated detection of new cerebral infarctions and prognostic implications using deep learning on serial MRI
T2 - NPJ digital medicine
J2 - NPJ Digit Med
PY - 2026
DA - 2026/03/05
VL - 9
IS - 1
SP - 316
SN - 2398-6352
PB - Nature Publishing Group
DO - 10.1038/s41746-026-02511-x
UR - https://doi.org/10.1038/s41746-026-02511-x
LA - en
ER -

CSL-JSON

{
"id": "10.1038/s41746-026-02511-x",
"type": "article-journal",
"title": "Automated detection of new cerebral infarctions and prognostic implications using deep learning on serial MRI",
"container-title": "NPJ digital medicine",
"author": [
{
"family": "Cho",
"given": "Hwan-ho"
},
{
"family": "Lee",
"given": "Joonwon"
},
{
"family": "Bae",
"given": "Jeonghoon"
},
{
"family": "Lee",
"given": "Dongwhane"
},
{
"family": "Kim",
"given": "Hyung Chan"
},
{
"family": "Lee",
"given": "Suk Yoon"
},
{
"family": "Seo",
"given": "Jung Hwa"
},
{
"family": "Seo",
"given": "Woo-Keun"
},
{
"family": "Jung",
"given": "Jin-Man"
},
{
"family": "Park",
"given": "Hyunjin"
},
{
"family": "Park",
"given": "Seongho"
}
],
"container-title-short": "NPJ Digit Med",
"volume": "9",
"issue": "1",
"page": "316",
"DOI": "10.1038/s41746-026-02511-x",
"PMID": "41786919",
"PMCID": "PMC13079727",
"ISSN": "2398-6352",
"publisher": "Nature Publishing Group",
"URL": "https://doi.org/10.1038/s41746-026-02511-x",
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
5
]
]
}
}

The tracing map gets a citation of its own once an author has validated it and it has a DOI.

Similar papers

The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.

[1] doi:10.1002/hbm.70602 [code]
Neuroimaging Correlates of Post-Stroke Pain After Ischemic Stroke: Secondary Analysis of the INSPiRE-TMS Trial.
Journal: Human brain mapping
In common: Keras, ANTs, TensorFlow, 1 other tool, stroke, clinical / translational
[2] doi:10.1111/ene.70678 [code]
Who Falls After a Stroke? Evidence From a Prospective Stroke Cohort.
Journal: European journal of neurology
In common: Keras, ANTs, TensorFlow, 1 other tool, stroke, clinical / translational
[3] doi:10.1002/epi.70296 [code]
Fully automated three-dimensional deep learning-based magnetic resonance imaging segmentation of brain cavities in epilepsy surgery.
Journal: Epilepsia
In common: Keras, ANTs, TensorFlow, 1 other tool, structural MRI / diffusion, clinical / translational
[4] doi:10.1186/s12938-026-01555-0 [code]
Incorporating normal periventricular changes for enhanced pathological white matter hyperintensity segmentation: on multiclass deep learning approaches.
Journal: Biomedical engineering online
In common: Keras, TensorFlow, NumPy, stroke, structural MRI / diffusion, 1 reference
[5] doi:10.1038/s41598-026-47047-y [code]
Imaging-genetics-based dementia risk prediction using deep survival neural networks in the Rotterdam Study.
Journal: Scientific reports
In common: Keras, TensorFlow, NumPy, structural MRI / diffusion, clinical / translational, 1 reference
[6] doi:10.1162/imag.a.1366 [code]
MICAFlow: Fast and robust MRI preprocessing bridging research neuroimaging and clinical practice.
Journal: Imaging neuroscience (Cambridge, Mass.)
In common: Keras, ANTs, TensorFlow, 1 other tool, structural MRI / diffusion
[7] doi:10.1162/imag.a.1164 [code]
Bias and generalizability of brain age prediction models: A multi-cohort evaluation with anatomical and interpretability insights.
Journal: Imaging neuroscience (Cambridge, Mass.)
In common: Keras, ANTs, TensorFlow, 1 other tool, structural MRI / diffusion
[8] doi:10.1038/s41586-026-10631-3 [code]
A prognostic human brain network for diffuse midline glioma.
Journal: Nature
In common: Keras, ANTs, TensorFlow, 1 other tool, clinical / translational
[9] doi:10.1002/ana.78206 [code]
Multimodal Image Guidance in Subthalamic Deep Brain Stimulation for Parkinson's Disease.
Journal: Annals of neurology
In common: Keras, ANTs, TensorFlow, 1 other tool, clinical / translational
[10] doi:10.1038/s41467-026-71555-0 [code]
A deep representation learning model to predict response to vagus nerve stimulation.
Journal: Nature communications
In common: ANTs, NumPy, structural MRI / diffusion, clinical / translational, 2 references

Contribute

The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.

Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.

Request its removal

To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).

Discussion, reproductions, activity

Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.

Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.

Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.