annotate Samples/MammographyDeepLearning/src/main/java/Main.java @ 28:43923934e934

added sample: deep learning for mammography
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 12 Jun 2024 13:58:29 +0200
parents
children 08ea8401f7b2
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;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
34 import org.json.JSONObject;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
35
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
36 import java.awt.image.BufferedImage;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
37 import java.io.IOException;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38 import java.io.InputStream;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
39 import java.nio.charset.StandardCharsets;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
40 import java.security.NoSuchAlgorithmException;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
41 import java.util.HashMap;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
42 import java.util.List;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
43 import java.util.Map;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
44 import java.util.concurrent.ExecutorService;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
45 import java.util.concurrent.Executors;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
46 import java.util.zip.ZipEntry;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
47 import java.util.zip.ZipFile;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
48
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
49 public class Main {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
50 private static final String MODEL_PATH = "2024-03-08-retina_res50_trained_08_03.torchscript";
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
51 private static final String STONE_VERSION = "2024-03-15-StoneWebViewer-DICOM-SR";
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
52 private static final String STONE_PATH = "2024-03-15-StoneWebViewer-DICOM-SR.zip";
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
53
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
54 private static ZipFile stone;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
55 private static NDManager manager;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
56 private static RetinaNet retinaNet;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
57 private static Map<String, String> mimeTypes = new HashMap<>();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
58
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59 static {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
60 ExecutorService executor = Executors.newSingleThreadExecutor();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
61 try {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
62 OrthancConnection.download("2024-03-08-retina_res50_trained_08_03.torchscript", executor,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
63 "https://orthanc.uclouvain.be/downloads/cross-platform/orthanc-mammography/models/2024-03-08-retina_res50_trained_08_03.torchscript",
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
64 146029397L, "b3de8f562de683bc3515fe93ae102fd4");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
65 OrthancConnection.download("2024-03-15-StoneWebViewer-DICOM-SR.zip", executor,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
66 "https://github.com/jodogne/orthanc-mammography/raw/master/viewer/2024-03-15-StoneWebViewer-DICOM-SR.zip",
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
67 4742571L, "de952da6fc74a9d4b78ca5064a6a7318");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
68 } catch (IOException | NoSuchAlgorithmException | InterruptedException e) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
69 throw new RuntimeException(e);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 } finally {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71 executor.shutdown();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72 }
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 try {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
75 stone = new ZipFile(STONE_PATH);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
76 } catch (IOException e) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
77 throw new RuntimeException(e);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
78 }
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 Functions.logWarning("Initializing Deep Java Library");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
81 manager = NDManager.newBaseManager();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
83 Functions.logWarning("Loading RetinaNet model");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
84 try {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
85 retinaNet = new RetinaNet(MODEL_PATH);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
86 } catch (Exception e) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
87 throw new RuntimeException(e);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 }
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 Functions.logWarning("RetinaNet model is ready");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
91
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
92 mimeTypes.put("css", "text/css");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
93 mimeTypes.put("gif", "image/gif");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
94 mimeTypes.put("html", "text/html");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
95 mimeTypes.put("jpeg", "image/jpeg");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
96 mimeTypes.put("js", "text/javascript");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
97 mimeTypes.put("png", "image/png");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
98
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
99 try (InputStream stream = Main.class.getResourceAsStream("OrthancExplorer.js")) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
100 byte[] content = IOUtils.toByteArray(stream);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
101 Functions.extendOrthancExplorer(new String(content, StandardCharsets.UTF_8));
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
102 } catch (IOException e) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
103 throw new RuntimeException(e);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
104 }
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 Callbacks.register(new Callbacks.OnChange() {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
107 @Override
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
108 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
109 switch (changeType) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
110 case ORTHANC_STARTED:
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
111 OrthancConnection connection = OrthancConnection.createForPlugin();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
112 try {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
113 if (!connection.isOrthancVersionAbove(1, 12, 5)) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
114 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
115 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
116 } catch (IOException | InterruptedException e) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
117 throw new RuntimeException(e);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
118 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
119
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
120 break;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
121
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
122 case ORTHANC_STOPPED:
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
123 Functions.logWarning("Finalizing Deep Java Library");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
124 if (retinaNet != null) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
125 retinaNet.close();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
126 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
127
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
128 if (manager != null) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
129 manager.close();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
130 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
131
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
132 System.gc();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
133 System.runFinalization();
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 default:
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
137 break;
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
138 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
139 }
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 Callbacks.register("/java-mammography-apply", new Callbacks.OnRestRequest() {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
143 @Override
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
144 public void call(RestOutput output,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
145 HttpMethod method,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
146 String uri,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
147 String[] regularExpressionGroups,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
148 Map<String, String> headers,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
149 Map<String, String> getParameters,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
150 byte[] body) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
151 if (method != HttpMethod.POST) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
152 output.sendMethodNotAllowed("POST");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
153 return;
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 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
157
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
158 String instanceId = request.getString("instance");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
159 if (instanceId == null) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
160 throw new RuntimeException("Missing instance identifier");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
161 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
162
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
163 Functions.logWarning("Applying RetinaNet to instance: " + instanceId);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
164 OrthancConnection connection = OrthancConnection.createForPlugin();
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
165
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
166 try {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
167 BufferedImage image = connection.getGrayscaleFrame(instanceId, 0);
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 double largestSide = Math.max(image.getWidth(), image.getHeight());
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
170 BufferedImage resized = ImageProcessing.resizeImage(image,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
171 (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
172 (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
173
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
174 double aspectRatio = (double) image.getWidth() / (double) resized.getWidth();
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 NDArray grayscale = ImageProcessing.imageToTensor(manager, resized);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
177 grayscale = ImageProcessing.standardize(grayscale);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
178
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
179 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
180 List<Detection> detections = retinaNet.apply(rgb);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
181
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
182 JSONObject created = DicomToolbox.createDicomSR(connection, instanceId, detections, aspectRatio);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
183
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
184 String id = created.getString("ID");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
185 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
186
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
187 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
188 } catch (Exception e) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
189 throw new RuntimeException(e);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
190 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
191 }
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
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
194 Callbacks.register("/java-mammography-viewer/(.*)", new Callbacks.OnRestRequest() {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
195 @Override
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
196 public void call(RestOutput output,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
197 HttpMethod method,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
198 String uri,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
199 String[] regularExpressionGroups,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
200 Map<String, String> headers,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
201 Map<String, String> getParameters,
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
202 byte[] body) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
203 if (method != HttpMethod.GET) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
204 output.sendMethodNotAllowed("GET");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
205 return;
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 String path = regularExpressionGroups[0];
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
209 int dot = path.lastIndexOf(".");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
210 if (dot < 0) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
211 output.sendHttpStatus((short) 404, new byte[0]);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
212 } else {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
213 String extension = path.substring(dot + 1);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
214 String mime = mimeTypes.getOrDefault(extension, "application/octet-stream");
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
215
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
216 ZipEntry entry = stone.getEntry(STONE_VERSION + "/" + path);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
217 if (entry == null) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
218 output.sendHttpStatus((short) 404, new byte[0]);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
219 } else {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
220 try (InputStream stream = stone.getInputStream(entry)) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
221 output.answerBuffer(IOUtils.toByteArray(stream), mime);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
222 } catch (IOException e) {
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
223 throw new RuntimeException(e);
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
224 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
225 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
226 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
227 }
43923934e934 added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
228 });
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 }