Warning: session_start(): open(/var/lib/php/sessions/sess_6eafvm83hgd8ekfqm383k22e5l, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
!7
cmodule TestWordRecognizers > DynSingleFunctionWithPrintLog {
replace Recognizer with IF1.
S scoreModule;
long maxMBs = 256; // save dat memory
transient L results = syncList();
new Best best;
transient int maxDiff = 2;
transient long dataSize;
transient new L images;
transient JProgressBar progressBar;
// result for recognizer
srecord noeq Result(
S recognizerName, Recognizer recognizer,
double score, Map individualScores) {}
// individual test result
srecord noeq TestResult(
TestImage test,
S line
) {
void showDetails { quickShowImage(test.img); }
}
srecord noeq TestImage(S caseName, BufferedImage img, S interpretation) {
toString { ret caseName + ": " + interpretation; }
}
bool spaceToSpare() { ret toMB(dataSize) < maxMBs; }
void doIt {
prepare();
results.clear();
dm_rcall clear(scoreModule);
_testRecognizer('simpleRecognizer, img -> simpleRecognizer().recognize(BWImage(img)));
}
void prepare runInQAndWait {
if (empty(images)) loadImages();
setField(scoreModule := dm_loadOrActivateScoreMatrixModule(scoreModule));
}
Result scoreRecognizer(S name, Recognizer rec) {
Result result = new(name, rec, 0, new LinkedHashMap);
try {
new Scorer scorer;
for (TestImage img : images) {
S out = rec.get(img.img);
int diff = leven_limited(img.interpretation, out, maxDiff);
//double score = eq(out, img.groupedChars) ? 1 : 0; // TODO
double score = 1.0-doubleRatio(diff, min(l(img.interpretation), maxDiff));
scorer.addZeroToOne(score);
result.individualScores.put(new TestResult(img, out), score);
}
print(scorer);
result.score = scorer.score();
} catch print e {
print("RECOGNIZER TOTAL FAIL");
}
ret result;
}
void loadImages {
File dir = screenClipsDir();
L in = asLinkedList(listFilesWithExtension(".line", dir));
while (nempty(in)) {
if (!spaceToSpare())
break with print("Out of space (" + toM(dataSize) + " MB used), skipping " + nImages(in));
File f = popFirst(in);
File fImg = imageFileWithSameBaseName(f);
if (fImg == null) continue;
S desc = firstLineOfFile(f);
new Matches m;
if (!find3("the images * are the grouped characters *", desc, m)) continue;
S interpretation = dropSpaces($2); // why drop spaces?
interpretation = join(map deSquareBracket(ocr_parseGlyphs(interpretation));
//LS characters = ocr_parseGlyphs(interpretation);
pcall {
BufferedImage img = loadImage2(fImg);
images.add(new TestImage(fileName(fImg), img, interpretation);
dataSize += bufferedImageDataSize(img);
print("Have " + nImages(images) + ", data size: " + toM(dataSize) + " MB");
}
}
print("Loading done");
}
start { setFunctionName("Run tests"); }
visual centerAndSouthWithMargin(super, withMargin(progressBar = jProgressBarWithText()));
void _testRecognizer(S name, Recognizer rec) {
prepare();
Result r = scoreRecognizer(name, rec);
print("Score for " + name + ": " + r.score);
results.add(r);
if (best.put(name, r.score))
print("NEW BEST!");
change();
dm_rcall add(scoreModule,
dm_rcall newEntry(scoreModule, r.recognizerName, r.score, r.individualScores));
}
// API
void testRecognizer(S name, virtual Recognizer _rec) {
_testRecognizer(name, img -> (S) quickImport(callF(_rec, img)));
}
}