annotate Samples/MammographyDeepLearning/src/main/java/Main.java @ 42:b04559283a1d

updated Stone Web viewer to newer snapshot
author Sebastien Jodogne <s.jodogne@gmail.com>
date Sat, 31 Aug 2024 12:00:40 +0200
parents 08ea8401f7b2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2 * SPDX-FileCopyrightText: 2023-2024 Sebastien Jodogne, UCLouvain, Belgium
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3 * SPDX-License-Identifier: GPL-3.0-or-later
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4 **/
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
5
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
6 /**
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 * Java plugin for Orthanc
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 * Copyright (C) 2023-2024 Sebastien Jodogne, UCLouvain, Belgium
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 *
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
10 * This program is free software: you can redistribute it and/or
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
11 * modify it under the terms of the GNU General Public License as
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 * published by the Free Software Foundation, either version 3 of the
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 * License, or (at your option) any later version.
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 *
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 * This program is distributed in the hope that it will be useful, but
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
18 * General Public License for more details.
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
19 *
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
20 * You should have received a copy of the GNU General Public License
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22 **/
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
24
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
25 import ai.djl.ndarray.NDArray;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
26 import ai.djl.ndarray.NDManager;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
27 import be.uclouvain.orthanc.Callbacks;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
28 import be.uclouvain.orthanc.ChangeType;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
29 import be.uclouvain.orthanc.Functions;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
30 import be.uclouvain.orthanc.HttpMethod;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
31 import be.uclouvain.orthanc.ResourceType;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
32 import be.uclouvain.orthanc.RestOutput;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
33 import org.apache.commons.compress.utils.IOUtils;
36
08ea8401f7b2 mammography plugin checking whether DICOMweb plugin is installed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
34 import org.json.JSONArray;
28
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
35 import org.json.JSONObject;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
36
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
37 import java.awt.image.BufferedImage;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38 import java.io.IOException;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
39 import java.io.InputStream;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
40 import java.nio.charset.StandardCharsets;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
41 import java.security.NoSuchAlgorithmException;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
42 import java.util.HashMap;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
43 import java.util.List;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
44 import java.util.Map;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
45 import java.util.concurrent.ExecutorService;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
46 import java.util.concurrent.Executors;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
47 import java.util.zip.ZipEntry;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
48 import java.util.zip.ZipFile;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
49
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
50 public class Main {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
51 private static final String MODEL_PATH = "2024-03-08-retina_res50_trained_08_03.torchscript";
42
b04559283a1d updated Stone Web viewer to newer snapshot
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 36
diff changeset
52 private static final String STONE_VERSION = "2024-08-31-StoneWebViewer-DICOM-SR";
b04559283a1d updated Stone Web viewer to newer snapshot
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 36
diff changeset
53 private static final String STONE_PATH = "2024-08-31-StoneWebViewer-DICOM-SR.zip";
28
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
54
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
55 private static ZipFile stone;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
56 private static NDManager manager;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
57 private static RetinaNet retinaNet;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
58 private static Map<String, String> mimeTypes = new HashMap<>();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
60 static {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
61 ExecutorService executor = Executors.newSingleThreadExecutor();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
62 try {
42
b04559283a1d updated Stone Web viewer to newer snapshot
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 36
diff changeset
63 OrthancConnection.download(MODEL_PATH, executor,
b04559283a1d updated Stone Web viewer to newer snapshot
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 36
diff changeset
64 "https://orthanc.uclouvain.be/downloads/cross-platform/orthanc-mammography/models/" + MODEL_PATH,
28
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
65 146029397L, "b3de8f562de683bc3515fe93ae102fd4");
42
b04559283a1d updated Stone Web viewer to newer snapshot
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 36
diff changeset
66 OrthancConnection.download(STONE_PATH, executor,
b04559283a1d updated Stone Web viewer to newer snapshot
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 36
diff changeset
67 "https://github.com/jodogne/orthanc-mammography/raw/master/viewer/" + STONE_PATH,
b04559283a1d updated Stone Web viewer to newer snapshot
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 36
diff changeset
68 4815178L, "86b52a17f86e4769d12e9ae680c4a99f");
28
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
69 } catch (IOException | NoSuchAlgorithmException | InterruptedException e) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 throw new RuntimeException(e);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71 } finally {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72 executor.shutdown();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
73 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
74
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
75 try {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
76 stone = new ZipFile(STONE_PATH);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
77 } catch (IOException e) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
78 throw new RuntimeException(e);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
79 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
80
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
81 Functions.logWarning("Initializing Deep Java Library");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82 manager = NDManager.newBaseManager();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
83
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
84 Functions.logWarning("Loading RetinaNet model");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
85 try {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
86 retinaNet = new RetinaNet(MODEL_PATH);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
87 } catch (Exception e) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 throw new RuntimeException(e);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
89 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
90
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
91 Functions.logWarning("RetinaNet model is ready");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
92
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
93 mimeTypes.put("css", "text/css");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
94 mimeTypes.put("gif", "image/gif");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
95 mimeTypes.put("html", "text/html");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
96 mimeTypes.put("jpeg", "image/jpeg");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
97 mimeTypes.put("js", "text/javascript");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
98 mimeTypes.put("png", "image/png");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
99
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
100 try (InputStream stream = Main.class.getResourceAsStream("OrthancExplorer.js")) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
101 byte[] content = IOUtils.toByteArray(stream);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
102 Functions.extendOrthancExplorer(new String(content, StandardCharsets.UTF_8));
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
103 } catch (IOException e) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
104 throw new RuntimeException(e);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
105 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
106
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
107 Callbacks.register(new Callbacks.OnChange() {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
108 @Override
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
109 public void call(ChangeType changeType, ResourceType resourceType, String resourceId) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
110 switch (changeType) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
111 case ORTHANC_STARTED:
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
112 OrthancConnection connection = OrthancConnection.createForPlugin();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
113 try {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
114 if (!connection.isOrthancVersionAbove(1, 12, 5)) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
115 throw new RuntimeException("Your version of Orthanc must be >= 1.12.5 to run this plugin");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
116 }
36
08ea8401f7b2 mammography plugin checking whether DICOMweb plugin is installed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
117
08ea8401f7b2 mammography plugin checking whether DICOMweb plugin is installed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
118 JSONArray plugins = new JSONArray(connection.doGetAsString("/plugins"));
08ea8401f7b2 mammography plugin checking whether DICOMweb plugin is installed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
119
08ea8401f7b2 mammography plugin checking whether DICOMweb plugin is installed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
120 boolean hasDicomWeb = false;
08ea8401f7b2 mammography plugin checking whether DICOMweb plugin is installed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
121 for (int i = 0; i < plugins.length() && !hasDicomWeb; i++) {
08ea8401f7b2 mammography plugin checking whether DICOMweb plugin is installed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
122 if (plugins.getString(i).equals("dicom-web")) {
08ea8401f7b2 mammography plugin checking whether DICOMweb plugin is installed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
123 hasDicomWeb = true;
08ea8401f7b2 mammography plugin checking whether DICOMweb plugin is installed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
124 }
08ea8401f7b2 mammography plugin checking whether DICOMweb plugin is installed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
125 }
08ea8401f7b2 mammography plugin checking whether DICOMweb plugin is installed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
126
08ea8401f7b2 mammography plugin checking whether DICOMweb plugin is installed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
127 if (!hasDicomWeb) {
08ea8401f7b2 mammography plugin checking whether DICOMweb plugin is installed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
128 throw new RuntimeException("The DICOMweb plugin is required, but is not installed");
08ea8401f7b2 mammography plugin checking whether DICOMweb plugin is installed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
129 }
28
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
130 } catch (IOException | InterruptedException e) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
131 throw new RuntimeException(e);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
132 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
133
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
134 break;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
135
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
136 case ORTHANC_STOPPED:
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
137 Functions.logWarning("Finalizing Deep Java Library");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
138 if (retinaNet != null) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
139 retinaNet.close();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
140 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
141
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
142 if (manager != null) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
143 manager.close();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
144 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
145
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
146 System.gc();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
147 System.runFinalization();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
148 break;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
149
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
150 default:
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
151 break;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
152 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
153 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
154 });
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
155
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
156 Callbacks.register("/java-mammography-apply", new Callbacks.OnRestRequest() {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
157 @Override
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
158 public void call(RestOutput output,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
159 HttpMethod method,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
160 String uri,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
161 String[] regularExpressionGroups,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
162 Map<String, String> headers,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
163 Map<String, String> getParameters,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
164 byte[] body) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
165 if (method != HttpMethod.POST) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
166 output.sendMethodNotAllowed("POST");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
167 return;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
168 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
169
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
170 JSONObject request = new JSONObject(new String(body, StandardCharsets.UTF_8));
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
171
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
172 String instanceId = request.getString("instance");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
173 if (instanceId == null) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
174 throw new RuntimeException("Missing instance identifier");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
175 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
176
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
177 Functions.logWarning("Applying RetinaNet to instance: " + instanceId);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
178 OrthancConnection connection = OrthancConnection.createForPlugin();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
179
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
180 try {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
181 BufferedImage image = connection.getGrayscaleFrame(instanceId, 0);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
182
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
183 double largestSide = Math.max(image.getWidth(), image.getHeight());
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
184 BufferedImage resized = ImageProcessing.resizeImage(image,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
185 (int) Math.round((double) image.getWidth() * 2048.0 / largestSide),
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
186 (int) Math.round((double) image.getHeight() * 2048.0 / largestSide));
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
187
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
188 double aspectRatio = (double) image.getWidth() / (double) resized.getWidth();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
189
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
190 NDArray grayscale = ImageProcessing.imageToTensor(manager, resized);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
191 grayscale = ImageProcessing.standardize(grayscale);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
192
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
193 NDArray rgb = grayscale.concat(grayscale).concat(grayscale); // Create a "RGB" image from grayscale pixel values
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
194 List<Detection> detections = retinaNet.apply(rgb);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
195
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
196 JSONObject created = DicomToolbox.createDicomSR(connection, instanceId, detections, aspectRatio);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
197
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
198 String id = created.getString("ID");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
199 Functions.logWarning("Detection results stored in DICOM-SR instance: " + id);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
200
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
201 output.answerBuffer(created.toString().getBytes(StandardCharsets.UTF_8), "application/json");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
202 } catch (Exception e) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
203 throw new RuntimeException(e);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
204 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
205 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
206 });
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
207
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
208 Callbacks.register("/java-mammography-viewer/(.*)", new Callbacks.OnRestRequest() {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
209 @Override
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
210 public void call(RestOutput output,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
211 HttpMethod method,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
212 String uri,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
213 String[] regularExpressionGroups,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
214 Map<String, String> headers,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
215 Map<String, String> getParameters,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
216 byte[] body) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
217 if (method != HttpMethod.GET) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
218 output.sendMethodNotAllowed("GET");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
219 return;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
220 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
221
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
222 String path = regularExpressionGroups[0];
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
223 int dot = path.lastIndexOf(".");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
224 if (dot < 0) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
225 output.sendHttpStatus((short) 404, new byte[0]);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
226 } else {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
227 String extension = path.substring(dot + 1);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
228 String mime = mimeTypes.getOrDefault(extension, "application/octet-stream");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
229
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
230 ZipEntry entry = stone.getEntry(STONE_VERSION + "/" + path);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
231 if (entry == null) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
232 output.sendHttpStatus((short) 404, new byte[0]);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
233 } else {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
234 try (InputStream stream = stone.getInputStream(entry)) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
235 output.answerBuffer(IOUtils.toByteArray(stream), mime);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
236 } catch (IOException e) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
237 throw new RuntimeException(e);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
238 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
239 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
240 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
241 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
242 });
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
243 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
244 }