!7 cmodule TrainChessRecognizer > DynSingleFunctionWithPrintLog { transient Map segmenters = autoCIMap parameterizedSegmenterFromAGIBlue(); transient Set imageMD5s; transient LPair allImages; start-thread { //temp dm_tempDisableAllButtons(); loadImages(); } void doIt { new ChessPieceRecognizer pieceRecognizer; pieceRecognizer.load(); new Best best; for (double factor = 0.2; factor <= 2.0; factor += 0.2) best.put(factor, print("Score: " + scoreForFactor(pieceRecognizer, factor))); print(best); } double scoreForFactor(ChessPieceRecognizer recognizer, double factor) { try { pieceRecognizer.magicCombineFactor = factor; new Scorer scorer; for (unpair S piece, BufferedImage img : cloneList(allImages)) { scorer.add(eqic(pairA(pieceRecognizer.recognize(img)), piece)); } print(scorer); ret scorer.score(); } catch print e { print("RECOGNIZER TOTAL FAIL"); ret 0; } } void loadImages { allImages = syncList(); imageMD5s = new Set; for (S name, fen : unpair agiBlue_chess_trainingImagesWithPositions()) { SS map = pairsToCIMap(agiBlue_lookupMultipleKeys(agiBlue_chessBoardRecognitionTrainingImagesSliceID(), name, ll("Input image", "Segmenter used", "Chess board found"))); S segmenter = map.get("Segmenter used"); if (!isYes(map.get("Chess board found"))) continue with print("Chess board not found, skipping"); print(name + " => " + segmenter); ParameterizedSegmenter seg = timed("Get segmenter " + segmenter, () -> segmenters.get(segmenter)); BufferedImage img = loadImage2(parseImageSnippetURL(map.get("input image"))); Rect r = first(seg.get(img)); if (r == null) continue with print("No board? Skipping"); print("Board: " + r.w + "*" + r.h); if (abs(r.w-r.h) > 3) continue with print("Board not square, skipping"); BufferedImage board = clipBufferedImage(img, r); LS position = chess_parseFEN(fen); printStruct(+position); LL squareImages = map2 cloneBufferedImage(bufferedImageMNGrid(board, 8, 8)); for row to 8: { S fenLine = position.get(row); L images = squareImages.get(row); for col to 8: if (imageMD5s.add(imageMD5(images.get(col)))) allImages.add(pair(chess_parseFENSymbol(fenLine.charAt(col)), images.get(col))); } } print("Have " + nImages(allImages)); } }