!7 cmodule TestAutoSegmenter > DynSingleFunctionWithPrintLog { long maxMBs = 256; // save dat memory Map results = syncMap(); new Best best; transient long dataSize; transient new L images; srecord TestImage(S caseName, BufferedImage img, Rect boardLocation) {} replace Segmenter with IF1>. bool spaceToSpare() { ret toMB(dataSize) < maxMBs; } void doIt { if (empty(images)) loadImages(); Cl presets = agiBlue_chessBoardSegmenterPresetNames(); for ping (S preset : presets) testSegmenter(preset, parameterizedSegmenterFromAGIBlue(preset)); } void testSegmenter(S name, Segmenter seg) { double score = scoreSegmenter(seg); print("Score for " + name + ": " + score); results.put(name, score); if (best.put(name, score)) print("NEW BEST!"); change(); } double scoreSegmenter(Segmenter seg) { try { new Scorer scorer; for (TestImage img : images) { L out = seg.get(img.img); Rect r = first(out); double tolerance = imageDiameter(img.img)/48; video_scoreRect(scorer, img.boardLocation, r, tolerance); } print(scorer); ret scorer.score(); } catch print e { print("SEGMENTER TOTAL FAIL"); ret 0; } } void loadImages { LPair in = asLinkedList(agiBlue_chess_trainingImagesWithBoardLocations()); while (nempty(in)) { if (!spaceToSpare()) break with print("Out of space (" + toM(dataSize) + " MB used), skipping " + nImages(in)); S name, Rect location = unpair popFirst(in); pcall { BufferedImage img = loadImage2(parseImageSnippetURL(agiBlue_lookupInSlice(agiBlue_chessBoardRecognitionTrainingImagesSliceID(), name, "input image"))); images.add(new TestImage(name, img, location)); dataSize += bufferedImageDataSize(img); print("Have " + nImages(images) + ", data size: " + toM(dataSize) + " MB"); } } print("Loading done"); } }