OSCR

Using deep learning to identify inherited retinal diseases based on wide-field retinal imaging data.

Code ↔ Paper

7 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 7 matches
  1. [1] § 2 Methods › 2.4 Deep learning models ↔ KcrossValidationProcess.py, lines 32–93 · score 0.62 · cross entropy loss, subsets, optimizer, weights, fold, cropping
  2. [2] § 2 Methods › 2.4 Deep learning models ↔ Augmentations.py, lines 5–16 · score 0.61 · horizontal flips, translations, vertical, probabilistically, augmentation, training
  3. [3] § 2 Methods › 2.6 Performance evaluation and statistical analysis ↔ MainProcess.py, lines 89–162 · score 0.57 · confusion matrices, F1 score, recall, AUC, precision, accuracy
  4. [4] § 2 Methods › 2.6 Performance evaluation and statistical analysis ↔ Utils.py, lines 103–121 · score 0.56 · confusion matrices, F1 score, recall, AUC, precision, accuracy
  5. [5] § 2 Methods › 2.4 Deep learning models ↔ Utils.py, lines 124–133 · score 0.55 · 47.5–72.5 %, center cropping
  6. [6] § 2 Methods › 2.4 Deep learning models ↔ Main.py, lines 32–38 · score 0.51 · cross entropy loss, weights, cropping, batch, training, class
  7. [7] § 3 Results ↔ Utils.py, lines 103–121 · score 0.50 · confusion matrices, F1 score, AUC, precision, accuracy, predictive

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

Python · 416 lines · 15 KB · no license · 3 matches

  1. import copy
  2. import glob
  3. import random
  4. import numpy as np
  5. import cv2
  6. import matplotlib.pyplot as plt
  7. import torch
  8. import torchvision
  9. from matplotlib.patches import Rectangle
  10. from torchvision.utils import save_image
  11. import os
  12. import shutil
  13. import imageio as iio
  14. import matplotlib.patches as mpatches
  15. import torchvision.transforms as transforms
  16. import pandas as pd
  17. import sklearn.metrics as met
  18. import imblearn.metrics as immet
  19. import csv
  20. import math
  21. from sklearn.metrics import recall_score
  22. from sklearn.metrics import roc_auc_score
  23. GPU = True
  24. import albumentations as A
  25. import matplotlib
  26. matplotlib.use('TkAgg')
  27. def save_decoded_image(img, name):
  28. save_image(img.view(img.shape), name)
  29. def normalize_img(img):
  30. norm = transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
  31. return norm(img)
  32. # scale : X -> unnormalize to (0,X)
  33. def unnormalize_img(img, scale):
  34. img = img / 2 + 0.5
  35. return img*scale
  36. def get_device():
  37. if GPU:
  38. if torch.cuda.is_available():
  39. device = 'cuda:0'
  40. else:
  41. device = 'cpu'
  42. return device
  43. # return 'cpu'
  44. def makedir(path):
  45. if not os.path.exists(path):
  46. os.mkdir(path)
  47. def rgb2gray(rgb):
  48. return np.dot(rgb[..., :3], [0.2125, 0.7154, 0.0721])
  49. def output_learning_graph(tr_losses, dev_losses, output_file_name, threshold=5):
  50. # for better visualization
  51. plt.figure()
  52. tr_losses_norm = [x if x < threshold else threshold for x in tr_losses]
  53. dev_losses_norm = [x if x < threshold else threshold for x in dev_losses]
  54. iteration = np.arange(0, len(tr_losses_norm))
  55. plt.plot(iteration, tr_losses_norm, 'g-', iteration, dev_losses_norm, 'r-')
  56. plt.xlabel('iteration')
  57. plt.ylabel('loss')
  58. green_patch = mpatches.Patch(color='green', label='train')
  59. red_patch = mpatches.Patch(color='red', label='test')
  60. plt.legend(handles=[green_patch, red_patch])
  61. plt.savefig(f'{output_file_name}.png')
  62. # plt.show()
  63. # the images should be normalized to (-1,1)
  64. def write_results_to_file(accuracy, f1_score, precision, sensitivity, specificity, recall, auc, class_accuracy, subjects_list, label_list, predicted_list, train_or_test, output_file_name, classes, topk_accuracy):
  65. file_name = f'{output_file_name}_{train_or_test}_results.csv'
  66. df_dict = {'subject': subjects_list, 'ground_truth': label_list, 'predicted': predicted_list}
  67. df = pd.DataFrame(df_dict)
  68. df.to_csv(file_name)
  69. with open(file_name, 'a') as f:
  70. writer = csv.writer(f)
  71. if topk_accuracy:
  72. writer.writerow([f'top5_accuracy: {topk_accuracy}'])
  73. writer.writerow([f'accuracy: {accuracy}'])
  74. writer.writerow([f'f1_score: {f1_score}'])
  75. writer.writerow([f'precision: {precision}'])
  76. writer.writerow([f'sesitivity: {sensitivity}'])
  77. writer.writerow([f'specificity: {specificity}'])
  78. writer.writerow([f'recall: {recall}'])
  79. writer.writerow([f'auc: {auc}'])
  80. for i, cs in enumerate(class_accuracy):
  81. writer.writerow([f'{classes[i]} accuracy : {cs})'])
  82. def calculate_scores(predicted_list, label_list, classes, proba_predicted=None):
  83. accuracy = sum(predicted_list == label_list) / len(predicted_list) * 100
  84. f1_score = met.f1_score(label_list, predicted_list, average='macro', zero_division=0.0) * 100
  85. mat = met.confusion_matrix(label_list, predicted_list, labels=list(range(len(classes))))
  86. specificity = immet.specificity_score(label_list, predicted_list, average='weighted')*100
  87. sensitivity = immet.sensitivity_score(label_list, predicted_list, average='weighted')*100
  88. precision = met.classification_report(label_list, predicted_list, labels=list(np.arange(len(classes))), target_names=classes, output_dict=True, zero_division=0.0)['weighted avg']['precision']*100
  89. recall = recall_score(label_list, predicted_list, average='weighted')*100
  90. try:
  91. if proba_predicted:
  92. auc = roc_auc_score(vector_to_one_hot(label_list, len(classes)), proba_predicted, average='weighted') * 100
  93. else:
  94. auc = roc_auc_score(vector_to_one_hot(label_list, len(classes)), vector_to_one_hot(predicted_list, len(classes)), average='weighted')*100
  95. except:
  96. auc = 0
  97. return accuracy, f1_score, specificity, sensitivity, precision, mat, recall, auc
  98. def crop(image, crop_rate=False):
  99. height = len(image)
  100. width = len(image[0])
  101. crop_number = random.uniform(0.475, 0.725) #(0.375, 0.625)
  102. if crop_rate:
  103. crop_number = crop_rate
  104. cropped_height = int(height*crop_number)
  105. cropped_width = int(width*crop_number)
  106. crop_transform = A.CenterCrop(height=cropped_height, width=cropped_width)
  107. return crop_transform(image=image)['image']
  108. def crop_two_images(image1, image2, crop_rate=0.75):
  109. height = len(image1)
  110. width = len(image1[0])
  111. crop_number = crop_rate #random.uniform(0.75, 1.25)
  112. cropped_height = int(height * crop_number)
  113. cropped_width = int(width * crop_number)
  114. crop_transform = A.CenterCrop(height=cropped_height, width=cropped_width)
  115. return crop_transform(image=image1)['image'], crop_transform(image=image2)['image']
  116. def labels_count(data, classes, loader=False):
  117. labels = []
  118. if not loader:
  119. for subject in data:
  120. labels.append(subject.get_labels())
  121. else:
  122. for subject in data:
  123. labels.extend(subject[2])
  124. uniques, counts = np.unique(np.array(labels), return_counts=True)
  125. for unique, count in zip(uniques, counts):
  126. print(f'gene: {classes[unique]}, count: {count} ')
  127. distribution = np.zeros(len(classes))
  128. distribution[uniques] = counts
  129. class_distribution = [(count/sum(counts))*100 for count in distribution]
  130. print(class_distribution)
  131. return np.array(class_distribution)
  132. # same as above just for dataloader to count after sampling
  133. def count_labels_loader(loader):
  134. count = np.zeros(25)
  135. for data in loader:
  136. subjects, scans, labels = data
  137. for i in range(25):
  138. count[i] += labels.tolist().count(i)
  139. print(count/sum(count)) # the distribution is now right for some reason
  140. def np_permute(image, in_axis=0, out_axis=2):
  141. permuted = []
  142. for i in range(image.shape[in_axis]):
  143. permuted.append(np.take(image, i, axis=in_axis))
  144. return np.stack(permuted, axis=out_axis)
  145. def denormalize(image):
  146. image = np_permute(image)
  147. mean = np.array([0.28, 0.28, 0.20])
  148. std = np.array([0.16, 0.16, 0.15])
  149. image = image * std + mean
  150. image = np.clip(image, 0, 1)
  151. return image
  152. def show_one_batch(classes, dataiter, batch_size):
  153. # labels should be one hot vector (or not?)
  154. subjects, images, labels = next(dataiter)
  155. faf = images[0]
  156. color = images[1]
  157. plt.imshow(np_permute(torchvision.utils.make_grid(faf)))
  158. plt.show()
  159. plt.imshow(np_permute(torchvision.utils.make_grid(color)))
  160. plt.show()
  161. print(' '.join('%5s' % classes[labels[j]] for j in range(batch_size)))
  162. def rgba2rgb(rgba, background=(255, 255, 255)):
  163. row, col, ch = rgba.shape
  164. if ch == 3:
  165. return rgba
  166. assert ch == 4, 'RGBA image has 4 channels.'
  167. rgb = np.zeros((row, col, 3), dtype='float32' )
  168. r, g, b, a = rgba[:,:,0], rgba[:,:,1], rgba[:,:,2], rgba[:,:,3]
  169. a = np.asarray(a, dtype='float32' ) / 255.0
  170. # a[a > 0.01] = 1
  171. # a[a <= 0.01] = 0
  172. R, G, B = background
  173. rgb[:,:,0] = r * a + (1.0 - a) * R
  174. rgb[:,:,1] = g * a + (1.0 - a) * G
  175. rgb[:,:,2] = b * a + (1.0 - a) * B
  176. return np.asarray(rgb, dtype='uint8')
  177. def crop_by_pixel_value(img, save_rate=0.5, color=255):
  178. width, height = (img.shape[1], img.shape[0])
  179. up = 0
  180. down = height
  181. left = 0
  182. right = width
  183. for i in range(int(height / (8 / 3)), -1, -1):
  184. # we want to check if a row or a column across all 3
  185. # channels have at least 10 percent of white pixels, then we will remove it
  186. if sum(np.all(img[i, :, :] == color, axis=1)) >= width * save_rate:
  187. up = i
  188. break
  189. for i in range(int(height / (8 / 5)), height, 1):
  190. if sum(np.all(img[i, :, :] == color, axis=1)) >= width * save_rate:
  191. down = i
  192. break
  193. for i in range(int(width / (8 / 3)), -1, -1):
  194. if sum(np.all(img[:, i, :] == color, axis=1)) >= height * save_rate:
  195. left = i
  196. break
  197. for i in range(int(width / (8 / 5)), width, 1):
  198. if sum(np.all(img[:, i, :] == color, axis=1)) >= height * save_rate:
  199. right = i
  200. break
  201. img = img[up:down, left:right, :]
  202. return img, (up, down, left, right)
  203. # img - the img to process
  204. # thresh_hold - the threshold value for the pixels we want to color
  205. # crop - whether to crop the image or not
  206. # color - the color to color the chosen pixels
  207. # save_rate - the rate of colored_pixels in a row or column in order to remove it
  208. def change_color_background(img, thresh_hold=35, crop=True, save_rate=0.5, color=0, size=224):
  209. changed = copy.deepcopy(img)
  210. if color == 'avg':
  211. pass
  212. changed[np.all(img <= thresh_hold, axis=2)] = color
  213. if crop:
  214. changed, dimensions = crop_by_pixel_value(changed, save_rate, color)
  215. resize = A.Resize(size, size)
  216. changed = resize(image=changed)['image']
  217. return changed, dimensions
  218. # helper function for crop_with_beam
  219. def find_boundaries(beam_values, high_derivative_threshold, small_derivative_threshold, low_derivative_distance):
  220. boundary = len(beam_values)-1
  221. derivative = np.abs(beam_values[1:] - beam_values[:-1])
  222. high_derivative = np.argwhere(derivative > high_derivative_threshold).T[0]
  223. for der in high_derivative:
  224. if der + 1 + low_derivative_distance >= boundary:
  225. if (beam_values[der + 1:] < small_derivative_threshold).all():
  226. boundary = der + 1
  227. break
  228. elif (beam_values[der+1: der+1+low_derivative_distance] < small_derivative_threshold).all():
  229. boundary = der + 1
  230. break
  231. return boundary
  232. # img: the image to process
  233. # derivative_threshold: the difference in derivative we start cropping from
  234. # low_derivative_distance: amount of pixels with low derivative o-
  235. # starting_distance: start step
  236. def crop_with_beam(img, high_derivative_threshold=20, small_derivative_threshold=5, low_derivative_distance=0.01, color=255, starting_distance=1, crop=False):
  237. relevant_coordinates = []
  238. width, height = (img.shape[1], img.shape[0])
  239. middle_point_y = int(width/2)
  240. middle_point_x = int(height/2)
  241. x = 0
  242. y = 0
  243. mask = np.zeros((img.shape[0], img.shape[1]), dtype=np.bool)
  244. thetas = [x/10 for x in range(360)] # we change the degree in 0.1 every step
  245. for theta in thetas:
  246. beam_values = []
  247. beam_coordinates = []
  248. r = starting_distance
  249. # first_step
  250. y = middle_point_y - math.floor(r * np.sin(theta))
  251. x = middle_point_x + math.floor(r * np.cos(theta))
  252. beam_values.append(img[x, y])
  253. beam_coordinates.append((x, y))
  254. r += 1
  255. y = middle_point_y - math.floor(r * np.sin(theta))
  256. x = middle_point_x + math.floor(r * np.cos(theta))
  257. # rest of the steps
  258. while height > x >= 0 and width > y >= 0:
  259. # check that the step was big enough to change pixel
  260. if beam_coordinates[-1][0] != x or beam_coordinates[-1][1] != y:
  261. beam_values.append(img[x, y])
  262. beam_coordinates.append((x, y))
  263. r += 1
  264. y = middle_point_y - math.floor(r * np.sin(theta))
  265. x = middle_point_x + math.floor(r * np.cos(theta))
  266. # we need to find the drastic change in derivative in every channel and choose the first one that occurs
  267. relevant_coordinates_red = find_boundaries(np.asarray(beam_values, dtype=np.longlong)[:, 0], high_derivative_threshold, small_derivative_threshold, int(round(low_derivative_distance*width)))
  268. relevant_coordinates_green = find_boundaries(np.asarray(beam_values, dtype=np.longlong)[:, 1], high_derivative_threshold, small_derivative_threshold, int(round(low_derivative_distance*width)))
  269. relevant_coordinates_blue = find_boundaries(np.asarray(beam_values, dtype=np.longlong)[:, 2], high_derivative_threshold, small_derivative_threshold, int(round(low_derivative_distance*width)))
  270. relevant_coordinates.extend(beam_coordinates[min(relevant_coordinates_red, relevant_coordinates_green, relevant_coordinates_blue):])
  271. for coordinate in relevant_coordinates:
  272. mask[coordinate[0], coordinate[1]] = True
  273. changed = copy.deepcopy(img)
  274. changed[mask] = 255
  275. if crop:
  276. changed, _ = crop_by_pixel_value(changed, save_rate=0.1)
  277. return changed
  278. def extract_results(path, correct_dictionary):
  279. df = pd.read_csv(path)
  280. for index, row in df.iterrows():
  281. name = row[1]
  282. ground_truth = row[2]
  283. predicted = row[3]
  284. result = int(ground_truth == predicted)
  285. if correct_dictionary.get(name):
  286. correct_dictionary[name] += result
  287. else:
  288. correct_dictionary[name] = result
  289. return correct_dictionary
  290. def find_repeated_mistake(path='/media/neuro/LivnyLab/General/TEAM_Folders/Tim/IRD'):
  291. num_of_cases = 0
  292. correct_dictionary = {}
  293. for directory in os.listdir():
  294. try:
  295. if directory[:3] == 'run':
  296. results = f'{path}/{directory}/train_train_results.csv'
  297. num_of_cases += 1
  298. extract_results(results, correct_dictionary)
  299. except:
  300. continue
  301. sorted_scan_accuracy = sorted(correct_dictionary.items(), key=lambda x: x[1])
  302. print(sorted_scan_accuracy)
  303. def vector_to_one_hot(target, num_classes):
  304. one_hot = np.zeros((len(target), num_classes))
  305. one_hot[np.arange(len(target)), target.astype(int)] = 1
  306. return one_hot
  307. def compareModelWeights(model1, model2):
  308. for p1, p2 in zip(model1.parameters(), model2.parameters()):
  309. if p1.data.ne(p2.data).sum() > 0:
  310. return False
  311. return True
  312. def get_labels_and_groups(dataset):
  313. groups = []
  314. group_subjects = []
  315. labels = []
  316. for i, subject in enumerate(dataset):
  317. labels.append(subject[-1])
  318. group = subject[0].split('.')[0] #+subject[0].split('.')[-1]
  319. try:
  320. group_subjects.append(groups.index(group))
  321. except:
  322. groups.append(group)
  323. group_subjects.append(groups.index(group))
  324. return labels, group_subjects
  325. # calculate_kcross_average('/media/neuro/C_BIRD/LivnyLab/General/TEAM_Folders/Tim/IRD/run 192 batch size = 36 FIRST STAGE 10 folds cf + faf different seed 150 iterations seed = 5', 18, 'test')
  326. def calculate_topk_accuracy(topk_predicted, label_list, k):
  327. # Check if true label is within top-k predictions for each sample
  328. correct_predictions = np.any(topk_predicted == label_list.reshape(-1, 1), axis=1)
  329. # Calculate accuracy
  330. accuracy = sum(correct_predictions)/len(label_list)
  331. return accuracy*100

Utils.py at commit d419615, no license · at the source

Overview

Authors: Leo Joskowicz1, Tim Buchbinder1, Eldan Chodorov1, Assaf Hoogi2, Katherine Matos3, Antonio Rivera3, Dror Sharon3, Eyal Banin3, Jaime Levy3
  1. School of Computer Science and Engineering, The Hebrew University of Jerusalem, Jerusalem, Israel
  2. School of Computer Science, Ariel University, Ariel, Israel,‌‌
  3. Department of Ophthalmology, Hadassah Medical Center, Faculty of Medicine, The Hebrew University of Jerusalem, Jerusalem, Israel
Journal: PloS one, volume 21, issue 5, article e0348866
Dates: received 2 December 2024; accepted 22 April 2026; published online 11 May 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1371/journal.pone.0348866 · PMID 42113772 · PMCID PMC13160341 · OpenAlex W7160864879
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: other (modality), human (organism), clinical / translational (subfield)
Methods: Statistics, Machine learning
MeSH: Deep Learning*, Retina*, Retinal Diseases*, Convolutional Neural Networks, Fundus Oculi, Humans, Image Processing, Computer-Assisted, Optical Imaging, Retrospective Studies (* major topic)
Topic: Retinal Imaging and Analysis (Radiology, Nuclear Medicine and Imaging, Medicine), according to OpenAlex
Citations: cited by 1 paper (Europe PMC); 34 references in the paper

Abstract

Objective: To evaluate a novel image-based deep learning method for the automated identification of inherited retinal diseases (IRDs) and to explore the feasibility of predicting selected causative gene groups using a multimodal analysis of wide-field fundus autofluorescence (FAF) and pseudocolor fundus (pCF) images.

Design: The method was evaluated using a retrospective dataset of patient studies containing FAF and pCF images, as well as genetic tests for IRD.

Participants: Patients with confirmed IRD for which both wide-field FAF and pCF images and genetic tests for IRD performed at Hadassah University Medical Center were included. The dataset consisted of 409 patients (330 patients with IRD with the 25 most commonly affected genes in our population and patients without IRD, and 79 patients without IRD).

Methods: Nine EfficientNet-V2-m convolutional neural networks were trained for the following three classification tasks: a binary IRD vs. non-IRD classification, and classification into two groups of five causative genes (Groups 1 and 2). For each task, three models were trained on the FAF images only, the pCF images only, and both the FAF and pCF images. The performance of the models was then evaluated and compared using 5-fold cross-validation.

Main outcome measures: Accuracy, precision, F1 scores, AUC, and confusion matrices.

Results: The multimodal classification models that were trained on both the FAF and pCF images yielded the best results. The binary classification model had a mean (±SD) accuracy of 0.95 ± 0.01, a mean precision of 0.92 ± 0.01, and a mean F1 score of 0.90 ± 0.02. The Group 1 classification model had a mean accuracy of 0.92 ± 0.03, a mean precision of 0.93 ± 0.03, and a mean F1 score of 0.89 ± 0.03. Finally, the Group 2 classification model had a mean accuracy of 0.85 ± 0.03, a mean precision of 0.87 ± 0.04, and a mean F1 score of 0.83 ± 0.04.

Conclusions: Our results indicate that determining whether a patient has IRD can be performed with high accuracy within this retrospective cohort based on FAF and pCF images using image-based deep learning classifiers. This image-based approach may assist clinicians during the patient’s initial visit by providing decision support prior to genetic testing. It may also help prioritize patients for genetic workup, particularly in settings in which genetic testing is not readily available. Further prospective and external validation is required before clinical implementation.

Reproduced under the paper's license (CC BY), from the paper cited above.

Repository

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

timshik/Deep-learning-based-identification-of-inherited-retinal-disease-using-wide-field-retina-imaging

License: none: the authors keep all their rights
State: the link answers, verified on 28 September 2026
Evidence: files inventoried
Commit: d4196159f13abe62b7baba1111d6fd5fac070876, 24 October 2024
Languages: Python (17)
Size: 19 files, 17 scripts
Software Heritage: not archived
Found in: “Data Availability”
Holds: README
Not found: license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: PyTorch (11 files), NumPy (7 files), Matplotlib (5 files), OpenCV (4 files), scikit-learn (4 files), pandas (2 files), Pillow (2 files), SciPy (2 files), imageio (1 file), imbalanced-learn (1 file), MONAI (1 file), Plotly (1 file), scikit-image (1 file), seaborn (1 file)
Availability: 1 check, the latest on 28 September 2026: the link answers
  • 28 September 2026: the link answers
18 files

The paper's code and data availability statement is in the Data section.

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;
  • 17 scripts, each with its path and the digest of its content;
  • 7 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.

Data Availability

All data supporting the findings of this study are available within the manuscript and in supplementary materials. Due to patient privacy and ethical restrictions, raw retinal images cannot be made publicly available. However, all aggregated performance metrics, confusion matrices, model architecture details, and hyperparameters are provided within the manuscript and supplementary materials. The code is available at: https://github.com/timshik/Deep-learning-based-identification-of-inherited-retinal-disease-using-wide-field-retina-imaging.

Reproduced under the paper's license (CC BY), from the paper cited above.

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, 28 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 9 authors, 9 MeSH terms, 29 references.

Cite

This paper

Joskowicz, L., Buchbinder, T., Chodorov, E., Hoogi, A., Matos, K., Rivera, A., Sharon, D., Banin, E., & Levy, J. (2026). Using deep learning to identify inherited retinal diseases based on wide-field retinal imaging data. PloS one, 21(5), e0348866. https://doi.org/10.1371/journal.pone.0348866

BibTeX

@article{joskowicz2026using,
author = {Joskowicz, Leo and Buchbinder, Tim and Chodorov, Eldan and Hoogi, Assaf and Matos, Katherine and Rivera, Antonio and Sharon, Dror and Banin, Eyal and Levy, Jaime},
title = {{Using deep learning to identify inherited retinal diseases based on wide-field retinal imaging data}},
journal = {PloS one},
year = {2026},
month = may,
volume = {21},
number = {5},
pages = {e0348866},
publisher = {PLOS},
issn = {1932-6203},
doi = {10.1371/journal.pone.0348866},
url = {https://doi.org/10.1371/journal.pone.0348866},
pmid = {42113772},
pmcid = {PMC13160341}
}

RIS

TY - JOUR
AU - Joskowicz, Leo
AU - Buchbinder, Tim
AU - Chodorov, Eldan
AU - Hoogi, Assaf
AU - Matos, Katherine
AU - Rivera, Antonio
AU - Sharon, Dror
AU - Banin, Eyal
AU - Levy, Jaime
TI - Using deep learning to identify inherited retinal diseases based on wide-field retinal imaging data
T2 - PloS one
J2 - PLoS One
PY - 2026
DA - 2026/05/11
VL - 21
IS - 5
SP - e0348866
SN - 1932-6203
PB - PLOS
DO - 10.1371/journal.pone.0348866
UR - https://doi.org/10.1371/journal.pone.0348866
LA - en
ER -

CSL-JSON

{
"id": "10.1371/journal.pone.0348866",
"type": "article-journal",
"title": "Using deep learning to identify inherited retinal diseases based on wide-field retinal imaging data",
"container-title": "PloS one",
"author": [
{
"family": "Joskowicz",
"given": "Leo"
},
{
"family": "Buchbinder",
"given": "Tim"
},
{
"family": "Chodorov",
"given": "Eldan"
},
{
"family": "Hoogi",
"given": "Assaf"
},
{
"family": "Matos",
"given": "Katherine"
},
{
"family": "Rivera",
"given": "Antonio"
},
{
"family": "Sharon",
"given": "Dror"
},
{
"family": "Banin",
"given": "Eyal"
},
{
"family": "Levy",
"given": "Jaime"
}
],
"container-title-short": "PLoS One",
"volume": "21",
"issue": "5",
"page": "e0348866",
"DOI": "10.1371/journal.pone.0348866",
"PMID": "42113772",
"PMCID": "PMC13160341",
"ISSN": "1932-6203",
"publisher": "PLOS",
"URL": "https://doi.org/10.1371/journal.pone.0348866",
"language": "en",
"issued": {
"date-parts": [
[
2026,
5,
11
]
]
}
}

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.3389/frai.2026.1771088 [code]
Few-shot deployment of pretrained MRI transformers in brain imaging tasks.
Journal: Frontiers in artificial intelligence
In common: MONAI, imageio, OpenCV, 9 other tools
[2] doi:10.1038/s42003-026-10957-8 [code]
Brain defence by the extracellular matrix protein Cochlin.
Journal: Communications biology
In common: imbalanced-learn, Plotly, OpenCV, 9 other tools
[3] doi:10.1016/j.isci.2026.116825 [code]
Social hierarchy shapes behavioral and transcriptional responses to chronic stress and ketamine in male mice.
Journal: iScience
In common: imbalanced-learn, Plotly, OpenCV, 9 other tools
[4] doi:10.1186/s12880-026-02481-2 [code]
Deep learning-based neuroanatomical profiling reveals population-specific brain changes in multiple sclerosis: a large-scale Middle Eastern study.
Journal: BMC medical imaging
In common: imageio, Plotly, OpenCV, 8 other tools, clinical / translational
[5] doi:10.3389/fnins.2026.1870124 [code]
An end-to-end pipeline for automated fetal brain segmentation and biometry from 3D SSFP MRI.
Journal: Frontiers in neuroscience
In common: MONAI, imageio, OpenCV, 8 other tools
[6] doi:10.1371/journal.pcbi.1013499 [code]
VesiclePy: A machine learning vesicle analysis toolbox for volume electron microscopy.
Journal: PLoS computational biology
In common: imageio, Plotly, OpenCV, 8 other tools
[7] doi:10.1016/j.xcrm.2026.102766 [code]
A longitudinal single-cell and spatial multiomic atlas of pediatric high-grade glioma.
Journal: Cell reports. Medicine
In common: imageio, Plotly, OpenCV, 8 other tools
[8] doi:10.1038/s41598-026-57519-w [code]
Automated segmentation of neurons and spinal cord structures in immunofluorescence images using SpineDL.
Journal: Scientific reports
In common: imageio, Plotly, OpenCV, 8 other tools
[9] doi:10.1371/journal.pcbi.1014571 [code]
SynAPSeg: A novel dataset and image analysis framework for deep learning-based synapse detection and quantification.
Journal: PLoS computational biology
In common: imageio, OpenCV, scikit-image, 8 other tools
[10] doi:10.1038/s41593-026-02388-9 [code]
Hippocampal CA3 connectomics reveals a gradient of mossy fiber inputs and selective feedforward inhibition onto pyramidal cells.
Journal: Nature neuroscience
In common: imageio, Plotly, OpenCV, 8 other tools

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.