Skip to content

Commit 4d1e111

Browse files
committed
Java:MultiDataSource 新增为 CVAuto 导出 COCO 检测、分类、OCR 等格式的训练集
1 parent 7123ef0 commit 4d1e111

File tree

2 files changed

+838
-0
lines changed

2 files changed

+838
-0
lines changed
Lines changed: 354 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,354 @@
1+
package apijson;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import com.fasterxml.jackson.databind.node.ArrayNode;
5+
import com.fasterxml.jackson.databind.node.ObjectNode;
6+
7+
import java.io.File;
8+
import java.io.FileWriter;
9+
import java.io.IOException;
10+
import java.util.Arrays;
11+
12+
public class CocoExporter {
13+
14+
public static void main(String[] args) throws Exception {
15+
CocoExporter exporter = new CocoExporter();
16+
17+
exporter.exportDetection("annotations/detection_train.json");
18+
exporter.exportClassification("annotations/classification_train.json");
19+
exporter.exportSegmentation("annotations/segmentation_train.json");
20+
exporter.exportKeypoints("annotations/keypoints_train.json");
21+
exporter.exportFaceKeypoints("annotations/face_keypoints_train.json");
22+
exporter.exportRotated("annotations/rotated_train.txt", true);
23+
exporter.exportRotated("annotations/rotated_train.json", false);
24+
exporter.exportOCR("annotations/ocr_train.txt", true);
25+
exporter.exportOCR("annotations/ocr_train.json", false);
26+
}
27+
28+
private final ObjectMapper mapper = new ObjectMapper();
29+
30+
/**
31+
* Detection
32+
*/
33+
public void exportDetection(String outFile) throws IOException {
34+
ObjectNode root = mapper.createObjectNode();
35+
36+
ArrayNode images = mapper.createArrayNode();
37+
ObjectNode img = mapper.createObjectNode();
38+
img.put("id", 1);
39+
img.put("file_name", "0001.jpg");
40+
img.put("height", 480);
41+
img.put("width", 640);
42+
images.add(img);
43+
44+
ArrayNode annos = mapper.createArrayNode();
45+
ObjectNode anno = mapper.createObjectNode();
46+
anno.put("id", 1);
47+
anno.put("image_id", 1);
48+
anno.put("category_id", 1);
49+
anno.putArray("bbox").addAll(Arrays.asList(
50+
mapper.getNodeFactory().numberNode(100),
51+
mapper.getNodeFactory().numberNode(150),
52+
mapper.getNodeFactory().numberNode(200),
53+
mapper.getNodeFactory().numberNode(100)
54+
));
55+
anno.put("area", 20000);
56+
anno.put("iscrowd", 0);
57+
annos.add(anno);
58+
59+
ArrayNode cats = mapper.createArrayNode();
60+
ObjectNode cat = mapper.createObjectNode();
61+
cat.put("id", 1);
62+
cat.put("name", "car");
63+
cat.put("supercategory", "vehicle");
64+
cats.add(cat);
65+
66+
root.set("images", images);
67+
root.set("annotations", annos);
68+
root.set("categories", cats);
69+
70+
mapper.writerWithDefaultPrettyPrinter().writeValue(new File(outFile), root);
71+
}
72+
73+
/**
74+
* Classification
75+
*/
76+
public void exportClassification(String outFile) throws IOException {
77+
ObjectNode root = mapper.createObjectNode();
78+
79+
ArrayNode images = mapper.createArrayNode();
80+
ObjectNode img = mapper.createObjectNode();
81+
img.put("id", 1);
82+
img.put("file_name", "0001.jpg");
83+
images.add(img);
84+
85+
ArrayNode annos = mapper.createArrayNode();
86+
ObjectNode anno = mapper.createObjectNode();
87+
anno.put("image_id", 1);
88+
anno.put("category_id", 1);
89+
annos.add(anno);
90+
91+
ArrayNode cats = mapper.createArrayNode();
92+
ObjectNode cat = mapper.createObjectNode();
93+
cat.put("id", 1);
94+
cat.put("name", "dog");
95+
cats.add(cat);
96+
97+
root.set("images", images);
98+
root.set("annotations", annos);
99+
root.set("categories", cats);
100+
101+
mapper.writerWithDefaultPrettyPrinter().writeValue(new File(outFile), root);
102+
}
103+
104+
/**
105+
* Segmentation
106+
*/
107+
public void exportSegmentation(String outFile) throws IOException {
108+
ObjectNode root = mapper.createObjectNode();
109+
110+
ArrayNode images = mapper.createArrayNode();
111+
ObjectNode img = mapper.createObjectNode();
112+
img.put("id", 1);
113+
img.put("file_name", "0001.jpg");
114+
img.put("height", 480);
115+
img.put("width", 640);
116+
images.add(img);
117+
118+
ArrayNode annos = mapper.createArrayNode();
119+
ObjectNode anno = mapper.createObjectNode();
120+
anno.put("id", 1);
121+
anno.put("image_id", 1);
122+
anno.put("category_id", 1);
123+
anno.putArray("segmentation").addArray().addAll(Arrays.asList(
124+
mapper.getNodeFactory().numberNode(100),
125+
mapper.getNodeFactory().numberNode(150),
126+
mapper.getNodeFactory().numberNode(300),
127+
mapper.getNodeFactory().numberNode(150),
128+
mapper.getNodeFactory().numberNode(300),
129+
mapper.getNodeFactory().numberNode(250),
130+
mapper.getNodeFactory().numberNode(100),
131+
mapper.getNodeFactory().numberNode(250)
132+
));
133+
anno.putArray("bbox").addAll(Arrays.asList(
134+
mapper.getNodeFactory().numberNode(100),
135+
mapper.getNodeFactory().numberNode(150),
136+
mapper.getNodeFactory().numberNode(200),
137+
mapper.getNodeFactory().numberNode(100)
138+
));
139+
anno.put("area", 20000);
140+
anno.put("iscrowd", 0);
141+
annos.add(anno);
142+
143+
ArrayNode cats = mapper.createArrayNode();
144+
ObjectNode cat = mapper.createObjectNode();
145+
cat.put("id", 1);
146+
cat.put("name", "car");
147+
cats.add(cat);
148+
149+
root.set("images", images);
150+
root.set("annotations", annos);
151+
root.set("categories", cats);
152+
153+
mapper.writerWithDefaultPrettyPrinter().writeValue(new File(outFile), root);
154+
}
155+
156+
/**
157+
* Pose Keypoints
158+
*/
159+
public void exportKeypoints(String outFile) throws IOException {
160+
ObjectNode root = mapper.createObjectNode();
161+
162+
ArrayNode images = mapper.createArrayNode();
163+
ObjectNode img = mapper.createObjectNode();
164+
img.put("id", 1);
165+
img.put("file_name", "0001.jpg");
166+
img.put("height", 480);
167+
img.put("width", 640);
168+
images.add(img);
169+
170+
ArrayNode annos = mapper.createArrayNode();
171+
ObjectNode anno = mapper.createObjectNode();
172+
anno.put("id", 1);
173+
anno.put("image_id", 1);
174+
anno.put("category_id", 1);
175+
anno.putArray("bbox").addAll(Arrays.asList(
176+
mapper.getNodeFactory().numberNode(100),
177+
mapper.getNodeFactory().numberNode(150),
178+
mapper.getNodeFactory().numberNode(200),
179+
mapper.getNodeFactory().numberNode(400)
180+
));
181+
anno.put("num_keypoints", 17);
182+
ArrayNode keypoints = anno.putArray("keypoints");
183+
// 简化示例:只放前3个点
184+
keypoints.addAll(Arrays.asList(
185+
mapper.getNodeFactory().numberNode(120), mapper.getNodeFactory().numberNode(200), mapper.getNodeFactory().numberNode(2),
186+
mapper.getNodeFactory().numberNode(150), mapper.getNodeFactory().numberNode(210), mapper.getNodeFactory().numberNode(2),
187+
mapper.getNodeFactory().numberNode(180), mapper.getNodeFactory().numberNode(250), mapper.getNodeFactory().numberNode(2)
188+
));
189+
annos.add(anno);
190+
191+
ArrayNode cats = mapper.createArrayNode();
192+
ObjectNode cat = mapper.createObjectNode();
193+
cat.put("id", 1);
194+
cat.put("name", "person");
195+
cat.putArray("keypoints").addAll(Arrays.asList(
196+
mapper.getNodeFactory().textNode("nose"),
197+
mapper.getNodeFactory().textNode("left_eye"),
198+
mapper.getNodeFactory().textNode("right_eye")
199+
));
200+
cats.add(cat);
201+
202+
root.set("images", images);
203+
root.set("annotations", annos);
204+
root.set("categories", cats);
205+
206+
mapper.writerWithDefaultPrettyPrinter().writeValue(new File(outFile), root);
207+
}
208+
209+
/**
210+
* Face Keypoints (68 点)
211+
*/
212+
public void exportFaceKeypoints(String outFile) throws IOException {
213+
ObjectNode root = mapper.createObjectNode();
214+
215+
ArrayNode images = mapper.createArrayNode();
216+
ObjectNode img = mapper.createObjectNode();
217+
img.put("id", 1);
218+
img.put("file_name", "0001.jpg");
219+
images.add(img);
220+
221+
ArrayNode annos = mapper.createArrayNode();
222+
ObjectNode anno = mapper.createObjectNode();
223+
anno.put("id", 1);
224+
anno.put("image_id", 1);
225+
anno.put("category_id", 1);
226+
anno.putArray("bbox").addAll(Arrays.asList(
227+
mapper.getNodeFactory().numberNode(120),
228+
mapper.getNodeFactory().numberNode(150),
229+
mapper.getNodeFactory().numberNode(200),
230+
mapper.getNodeFactory().numberNode(200)
231+
));
232+
anno.put("num_keypoints", 68);
233+
ArrayNode kps = anno.putArray("keypoints");
234+
for (int i = 1; i <= 68; i++) {
235+
kps.addAll(Arrays.asList(
236+
mapper.getNodeFactory().numberNode(100 + i),
237+
mapper.getNodeFactory().numberNode(150 + i),
238+
mapper.getNodeFactory().numberNode(2)
239+
));
240+
}
241+
annos.add(anno);
242+
243+
ArrayNode cats = mapper.createArrayNode();
244+
ObjectNode cat = mapper.createObjectNode();
245+
cat.put("id", 1);
246+
cat.put("name", "face");
247+
ArrayNode kpNames = cat.putArray("keypoints");
248+
for (int i = 1; i <= 68; i++) {
249+
kpNames.add("p" + i);
250+
}
251+
cats.add(cat);
252+
253+
root.set("images", images);
254+
root.set("annotations", annos);
255+
root.set("categories", cats);
256+
257+
mapper.writerWithDefaultPrettyPrinter().writeValue(new File(outFile), root);
258+
}
259+
260+
/**
261+
* Rotated Detection
262+
*/
263+
public void exportRotated(String outFile, boolean txtFormat) throws IOException {
264+
if (txtFormat) {
265+
try (FileWriter writer = new FileWriter(outFile)) {
266+
writer.write("320 240 200 100 30 1\n");
267+
}
268+
} else {
269+
ObjectNode root = mapper.createObjectNode();
270+
ArrayNode images = mapper.createArrayNode();
271+
ObjectNode img = mapper.createObjectNode();
272+
img.put("id", 1);
273+
img.put("file_name", "0001.jpg");
274+
images.add(img);
275+
276+
ArrayNode annos = mapper.createArrayNode();
277+
ObjectNode anno = mapper.createObjectNode();
278+
anno.put("id", 1);
279+
anno.put("image_id", 1);
280+
anno.put("category_id", 1);
281+
anno.putArray("bbox").addAll(Arrays.asList(
282+
mapper.getNodeFactory().numberNode(320),
283+
mapper.getNodeFactory().numberNode(240),
284+
mapper.getNodeFactory().numberNode(200),
285+
mapper.getNodeFactory().numberNode(100),
286+
mapper.getNodeFactory().numberNode(30)
287+
));
288+
annos.add(anno);
289+
290+
ArrayNode cats = mapper.createArrayNode();
291+
ObjectNode cat = mapper.createObjectNode();
292+
cat.put("id", 1);
293+
cat.put("name", "plane");
294+
cats.add(cat);
295+
296+
root.set("images", images);
297+
root.set("annotations", annos);
298+
root.set("categories", cats);
299+
300+
mapper.writerWithDefaultPrettyPrinter().writeValue(new File(outFile), root);
301+
}
302+
}
303+
304+
/**
305+
* OCR
306+
*/
307+
public void exportOCR(String outFile, boolean txtFormat) throws IOException {
308+
if (txtFormat) {
309+
try (FileWriter writer = new FileWriter(outFile)) {
310+
writer.write("100,200,220,200,220,240,100,240,Hello\n");
311+
writer.write("50,100,150,100,150,130,50,130,World\n");
312+
}
313+
} else {
314+
ObjectNode root = mapper.createObjectNode();
315+
ArrayNode images = mapper.createArrayNode();
316+
ObjectNode img = mapper.createObjectNode();
317+
img.put("id", 1);
318+
img.put("file_name", "0001.jpg");
319+
images.add(img);
320+
321+
ArrayNode annos = mapper.createArrayNode();
322+
ObjectNode anno = mapper.createObjectNode();
323+
anno.put("id", 1);
324+
anno.put("image_id", 1);
325+
anno.putArray("bbox").addAll(Arrays.asList(
326+
mapper.getNodeFactory().numberNode(100),
327+
mapper.getNodeFactory().numberNode(200),
328+
mapper.getNodeFactory().numberNode(120),
329+
mapper.getNodeFactory().numberNode(40)
330+
));
331+
anno.putArray("segmentation").addArray().addAll(Arrays.asList(
332+
mapper.getNodeFactory().numberNode(100),
333+
mapper.getNodeFactory().numberNode(200),
334+
mapper.getNodeFactory().numberNode(220),
335+
mapper.getNodeFactory().numberNode(200),
336+
mapper.getNodeFactory().numberNode(220),
337+
mapper.getNodeFactory().numberNode(240),
338+
mapper.getNodeFactory().numberNode(100),
339+
mapper.getNodeFactory().numberNode(240)
340+
));
341+
anno.put("text", "Hello");
342+
anno.put("language", "en");
343+
anno.put("legibility", "legible");
344+
annos.add(anno);
345+
346+
root.set("images", images);
347+
root.set("annotations", annos);
348+
349+
mapper.writerWithDefaultPrettyPrinter().writeValue(new File(outFile), root);
350+
}
351+
}
352+
353+
354+
}

0 commit comments

Comments
 (0)