1
인터넷 (yale)의 샘플로 분류기를 훈련 시키려고했지만, 테스트 그림으로 트레이닝 그림 중 하나를 입력 할 때 잘못된 예측 (실제로는 카테고리 "1"만 출력)이 계속 발생합니다. 아무도 내게 어떤 힌트를 줄 수 있을까요? 나는 아래에 나의 코드를 첨부했다.OpenCV JAVA 얼굴 인식기 정확도?
(I 오류 bad arguement, size(1,30000), (10000,66)....
것은 내가 그렇게하지 않으면 나타 때문에 그들을 다시 grayscaled. 그들은 이미 grayscaled대로 문제가 훈련 샘플 것 같아요.)
import org.opencv.face.FaceRecognizer;
import org.opencv.core.Mat;
import org.opencv.core.MatOfInt;
import org.opencv.core.*;
import org.opencv.face.Face;
import org.opencv.imgcodecs.Imgcodecs;
import java.io.File;
import java.io.FilenameFilter;
import java.util.List;
import java.util.ArrayList;
import org.opencv.imgproc.Imgproc;
public class FaceRecognization {
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
String trainingDir = "C:\\Users\\songli\\Desktop\\yale\\train";
String testImgPath = "C:\\Users\\songli\\Desktop\\yale\\5-6.bmp";
Mat testImg = Imgcodecs.imread(testImgPath);
Mat gray = new Mat();
File root = new File(trainingDir);
FilenameFilter bmpFilter = new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".bmp");
}
};
File[] imageFiles = root.listFiles(bmpFilter);
List<Mat> list = new ArrayList<Mat>(imageFiles.length);
int[] labels = new int[imageFiles.length];
int counter = 0;
int label;
Mat grayImg = new Mat();
Mat grayTestImg = new Mat();
Mat img = new Mat();
for (File image : imageFiles) {
img = Imgcodecs.imread(image.getAbsolutePath());
// System.out.print(img.elemSize());
label = Integer.parseInt(image.getName().split("\\-")[0]);
grayImg.create(img.width(), img.height(), 1);
Imgproc.cvtColor(img, grayImg, Imgproc.COLOR_BGR2GRAY);
list.add(grayImg);
labels[counter] = label;
counter++;
}
// System.out.print(labels[11]);
MatOfInt labels1 = new MatOfInt();
labels1.fromArray(labels);
FaceRecognizer fr = Face.createEigenFaceRecognizer();
fr.train(list, labels1);
grayTestImg.create(testImg.width(), testImg.height(), 1);
Imgproc.cvtColor(testImg, grayTestImg, Imgproc.COLOR_BGR2GRAY);
int predictedlabel = fr.predict_label(grayTestImg);
// Imgcodecs.imwrite("C:\\Users\\songli\\Desktop\\testImg.jpg",
// testImg);
// int[] predLabel = new int[1];
// double[] confidence = new double[1];
// int result = -1;
// fr.predict(testImgGrey,predLabel,confidence);
// result = predLabel[0];
System.out.println("Predicted label: " + predictedlabel);
}
}