Mercurial > hg > orthanc-java
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 |
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 } |