Mercurial > hg > orthanc-java
annotate Samples/MammographyDeepLearning/src/main/java/OrthancConnection.java @ 43:678bbed285a1 default tip
improved import of JNI in cmake
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 06 Sep 2024 13:53:54 +0200 |
parents | 43923934e934 |
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 org.json.JSONObject; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
26 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
27 import javax.imageio.ImageIO; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
28 import java.awt.image.BufferedImage; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
29 import java.io.ByteArrayInputStream; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
30 import java.io.FileNotFoundException; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
31 import java.io.FileOutputStream; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
32 import java.io.IOException; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
33 import java.math.BigInteger; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
34 import java.net.URI; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
35 import java.net.http.HttpClient; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
36 import java.net.http.HttpRequest; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
37 import java.net.http.HttpResponse; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
38 import java.nio.charset.StandardCharsets; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
39 import java.nio.file.Files; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
40 import java.nio.file.Paths; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
41 import java.security.MessageDigest; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
42 import java.security.NoSuchAlgorithmException; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
43 import java.util.Optional; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
44 import java.util.OptionalLong; |
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.function.Consumer; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
47 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
48 public abstract class OrthancConnection { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
49 private static final String PIXEL_REPRESENTATION = "0028,0103"; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
50 private static final String BITS_STORED = "0028,0101"; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
51 private static final String SAMPLES_PER_PIXEL = "0028,0002"; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
52 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
53 public static OrthancConnection createHttpClient(ExecutorService executor, |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
54 String baseUrl) { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
55 return new OrthancConnection() { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
56 private HttpClient client = HttpClient.newBuilder().executor(executor).build(); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
57 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
58 @Override |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
59 public byte[] doGetAsByteArray(String uri) throws IOException, InterruptedException { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
60 HttpRequest request = HttpRequest.newBuilder() |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
61 .uri(URI.create(baseUrl + uri)) |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
62 .build(); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
63 HttpResponse<byte[]> response = client.send(request, HttpResponse.BodyHandlers.ofByteArray()); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
64 if (response.statusCode() != 200) { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
65 throw new RuntimeException(); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
66 } else { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
67 return response.body(); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
68 } |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
69 } |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
70 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
71 @Override |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
72 public byte[] doPostAsByteArray(String uri, byte[] body) throws IOException, InterruptedException { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
73 HttpRequest request = HttpRequest.newBuilder() |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
74 .uri(URI.create(baseUrl + uri)) |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
75 .POST(HttpRequest.BodyPublishers.ofByteArray(body)) |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
76 .build(); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
77 HttpResponse<byte[]> response = client.send(request, HttpResponse.BodyHandlers.ofByteArray()); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
78 if (response.statusCode() != 200) { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
79 throw new RuntimeException(); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
80 } else { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
81 return response.body(); |
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 } |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
84 }; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
85 } |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
86 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
87 public static OrthancConnection createForPlugin() { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
88 return new OrthancConnection() { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
89 @Override |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
90 public byte[] doGetAsByteArray(String uri) throws IOException, InterruptedException { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
91 return be.uclouvain.orthanc.Functions.restApiGet(uri); |
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 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
94 @Override |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
95 public byte[] doPostAsByteArray(String uri, byte[] body) throws IOException, InterruptedException { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
96 return be.uclouvain.orthanc.Functions.restApiPost(uri, body); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
97 } |
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 } |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
100 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
101 public abstract byte[] doGetAsByteArray(String uri) throws IOException, InterruptedException; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
102 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
103 public abstract byte[] doPostAsByteArray(String uri, |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
104 byte[] body) throws IOException, InterruptedException; |
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 public String doGetAsString(String uri) throws IOException, InterruptedException { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
107 return new String(doGetAsByteArray(uri), StandardCharsets.UTF_8); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
108 } |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
109 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
110 public JSONObject doGetAsJsonObject(String uri) throws IOException, InterruptedException { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
111 return new JSONObject(doGetAsString(uri)); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
112 } |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
113 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
114 public String doPostAsString(String uri, |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
115 String body) throws IOException, InterruptedException { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
116 byte[] answer = doPostAsByteArray(uri, body.getBytes(StandardCharsets.UTF_8)); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
117 return new String(answer, StandardCharsets.UTF_8); |
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 public JSONObject doPostAsJsonObject(String uri, |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
121 String body) throws IOException, InterruptedException { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
122 return new JSONObject(doPostAsString(uri, body)); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
123 } |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
124 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
125 public BufferedImage getGrayscaleFrame(String instance, |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
126 int frame) throws IOException, InterruptedException { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
127 if (frame < 0) { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
128 throw new IllegalArgumentException(); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
129 } |
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 JSONObject tags = doGetAsJsonObject("/instances/" + instance + "/tags?short"); |
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 if (!tags.has(PIXEL_REPRESENTATION) || |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
134 tags.getInt(PIXEL_REPRESENTATION) == 1) { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
135 throw new IllegalArgumentException("Negative pixels not supported"); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
136 } |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
137 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
138 if (!tags.has(BITS_STORED) || |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
139 (tags.getInt(BITS_STORED) != 8 && |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
140 tags.getInt(BITS_STORED) != 16)) { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
141 throw new IllegalArgumentException("Pixel depth not supported"); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
142 } |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
143 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
144 if (!tags.has(SAMPLES_PER_PIXEL) || |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
145 tags.getInt(SAMPLES_PER_PIXEL) != 1) { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
146 throw new IllegalArgumentException("Color images not implemented"); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
147 } |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
148 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
149 byte[] png = doGetAsByteArray("/instances/" + instance + "/frames/" + frame + "/image-uint16"); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
150 try (ByteArrayInputStream stream = new ByteArrayInputStream(png)) { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
151 return ImageIO.read(stream); |
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 boolean isOrthancVersionAbove(int major, |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
156 int minor, |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
157 int revision) throws IOException, InterruptedException { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
158 JSONObject system = doGetAsJsonObject("/system"); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
159 String version = system.getString("Version"); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
160 if (version == null) { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
161 throw new RuntimeException("Not an Orthanc server"); |
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 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
164 if (version.equals("mainline")) { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
165 return true; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
166 } else { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
167 String[] items = version.split("\\."); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
168 if (items.length != 3) { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
169 throw new RuntimeException("Cannot parse Orthanc version: " + version); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
170 } |
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 int thisMajor = Integer.valueOf(items[0]); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
173 int thisMinor = Integer.valueOf(items[1]); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
174 int thisRevision = Integer.valueOf(items[2]); |
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 return (thisMajor > major || |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
177 (thisMajor == major && thisMinor > minor) || |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
178 (thisMajor == major && thisMinor == minor && thisRevision >= revision)); |
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 } |
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 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
183 public static void download(String targetPath, |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
184 ExecutorService executor, |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
185 String url, |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
186 long expectedSize, |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
187 String expectedMd5) throws IOException, NoSuchAlgorithmException, InterruptedException { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
188 class FileDownloader implements HttpResponse.BodyHandler<Void>, Consumer<Optional<byte[]>> { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
189 private FileOutputStream target; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
190 private String url; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
191 private boolean success; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
192 private long contentLength; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
193 private long size; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
194 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
195 public FileDownloader(final FileOutputStream target, |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
196 final String url) throws FileNotFoundException { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
197 this.target = target; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
198 this.success = false; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
199 } |
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 @Override |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
202 public HttpResponse.BodySubscriber<Void> apply(final HttpResponse.ResponseInfo responseInfo) { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
203 if (responseInfo.statusCode() != 200) { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
204 throw new RuntimeException("URL does not exist: " + url); |
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 final OptionalLong contentLength = responseInfo.headers().firstValueAsLong("Content-Length"); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
208 if (contentLength.isEmpty()) { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
209 throw new RuntimeException("Server does not provide a content length: " + url); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
210 } |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
211 this.contentLength = contentLength.getAsLong(); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
212 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
213 return HttpResponse.BodySubscribers.ofByteArrayConsumer(this); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
214 } |
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 @Override |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
217 public void accept(final Optional<byte[]> bytes) { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
218 if (bytes.isEmpty()) { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
219 System.out.println(); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
220 System.out.flush(); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
221 if (this.success) { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
222 throw new IllegalStateException("File already closed"); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
223 } |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
224 if (this.size != this.contentLength) { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
225 throw new RuntimeException("Server has not answered with the proper content length"); |
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 this.success = true; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
228 } else { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
229 try { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
230 this.target.write(bytes.get()); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
231 } catch (IOException e) { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
232 System.out.println(); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
233 throw new RuntimeException("Cannot write to file"); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
234 } |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
235 this.size += bytes.get().length; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
236 final int BAR_WIDTH = 30; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
237 final int a = Math.min(30, Math.round(this.size / (float) this.contentLength * 30.0f)); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
238 System.out.print("\r Progress: [" + "=".repeat(a) + " ".repeat(30 - a) + "]"); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
239 System.out.flush(); |
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 boolean isSuccess() { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
244 return this.success; |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
245 } |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
246 } |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
247 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
248 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
249 System.out.println("Downloading: " + url); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
250 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
251 if (Files.exists(Paths.get(targetPath))) { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
252 System.out.println(" File already downloaded"); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
253 } else { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
254 FileOutputStream target = new FileOutputStream(targetPath); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
255 HttpClient client = HttpClient.newBuilder().executor(executor).followRedirects(HttpClient.Redirect.NORMAL).build(); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
256 HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url)).build(); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
257 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
258 FileDownloader consumer = new FileDownloader(target, url); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
259 HttpResponse<Void> response = client.send(request, (HttpResponse.BodyHandler<Void>) consumer); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
260 target.close(); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
261 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
262 if (!consumer.isSuccess()) { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
263 throw new IOException("Could not download: " + url); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
264 } |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
265 } |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
266 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
267 byte[] content = Files.readAllBytes(Paths.get(targetPath)); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
268 MessageDigest md = MessageDigest.getInstance("MD5"); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
269 md.update(content); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
270 |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
271 final String actualMd5 = new BigInteger(1, md.digest()).toString(16); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
272 if (content.length != expectedSize || |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
273 !actualMd5.equals(expectedMd5)) { |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
274 throw new IOException("Incorrect content in a download file, please remove it and retry: " + targetPath); |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
275 } |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
276 } |
43923934e934
added sample: deep learning for mammography
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
277 } |