!7 replace Finder with F1. p-exp { L files = markedEyebrowsFiles(); final FaceFinderByPictures1 faceFinder = defaultFaceFinderByPictures(); // images are eyebrow-marked full-size faces L images = map(markedEyebrowsFiles(), func(File f) -> RGBImageRectAndState { RGBImage full = loadRGBImage(f); Rect face = faceFinder.get(full); ret RGBImageRectAndState(rgbClip(full, face), clipRect((Rect) unstruct(getFileInfoField(f, "Eyebrow position")), face), getFileInfoField(f, "Eyebrow state")); }); F1 dummyFaceFinder = func(RGBImage img) -> Rect { rgbBounds(img) }; //showRGBImageAndRects(images); final int w = /*32*/50; // face is resized to this width int limit = 95; // search for smallest finder with at least 95% accuracy EyebrowFinder1 finder = new(dummyFaceFinder, w, map(images, func(RGBImageRectAndState image) -> Pair { RGBImage scaledFace = rgbScaleToWidth(image.image, w); Rect scaledRect = scaleRect_imageToImage(image.rect, image.image, scaledFace); ret pair(rgbClip(scaledFace, scaledRect), image.state); })); showImage(mergeRGBImagesVertically(pairsA(finder.pictures))); saveTextFileVerbose(javaxDataDir("Eyebrow Finder/full-finder.struct"), struct(finder)); new Best best; video_scoreRectAndState_step(best, images, finder); showImage(mergeRGBImagesAndRects(callEyebrowFinder(finder, rgbImageAndRects_images(images)))); }