如何在openimaj中保存训练好的数据?

时间:2015-04-27 18:46:04

标签: openimaj

我正在开展一个关于通过课堂视频参加课程的项目。我在程序运行时训练数据,并且需要花费大量时间来训练数据。有什么方法可以保存训练好的数据并直接在程序中使用。以下是我的代码:

public static void main(String[] args) throws MalformedURLException, IOException, VideoCaptureException
{
    FKEFaceDetector faceDetector = new FKEFaceDetector(new HaarCascadeDetector(40));
    EigenFaceRecogniser<KEDetectedFace, Person> faceRecogniser = EigenFaceRecogniser.create(20, new RotateScaleAligner(), 1, DoubleFVComparison.CORRELATION, 0.9f);
    final FaceRecognitionEngine<KEDetectedFace, Person> faceEngine = FaceRecognitionEngine.create(faceDetector, faceRecogniser);

    Video<MBFImage> video;

    //video = new VideoCapture(320, 100);
    video = new XuggleVideo(new URL("file:///home/kamal/Videos/Samplevideo1.mp4"));

    Person[] dataset = new Person[12];

    dataset[0] = new Person("a");
    dataset[1] = new Person("b");
    dataset[2] = new Person("c");
    dataset[3] = new Person("d");
    dataset[4] = new Person("e");
    dataset[5] = new Person("f");
    dataset[6] = new Person("g");
    dataset[7] = new Person("h");
    dataset[8] = new Person("i");
    dataset[9] = new Person("j");
    dataset[10] = new Person("k");
    dataset[11] = new Person("l");

    int dcount;

    for(int i = 0; i < 12; i++)
    {
        dcount = 0;
        for(int j = 1; j <= 20 && dcount == 0; j++)
        {
            MBFImage mbfImage = ImageUtilities.readMBF(new URL("file:///home/kamal/Pictures/"+i+"/"+j+".png"));
            FImage fimg = mbfImage.flatten();
            List<KEDetectedFace> faces = faceEngine.getDetector().detectFaces(fimg);
            if(faces.size() > 0)
            {
                faceEngine.train(faces.get(0), dataset[i]);
                dcount++;
            }
        }
    }
VideoDisplay<MBFImage> vd = VideoDisplay.createVideoDisplay(video);

    vd.addVideoListener(new VideoDisplayListener<MBFImage>() {

        public void afterUpdate(VideoDisplay<MBFImage> display) {
        }

        public void beforeUpdate(MBFImage frame) 
        {
            FImage image = frame.flatten();
            List<KEDetectedFace> faces = faceEngine.getDetector().detectFaces(image);

            for(DetectedFace face : faces) {
                frame.drawShape(face.getBounds(), RGBColour.RED);
                try {
                    List<IndependentPair<KEDetectedFace, ScoredAnnotation<Person>>> rfaces = faceEngine.recogniseBest(face.getFacePatch());
                    ScoredAnnotation<Person> score = rfaces.get(0).getSecondObject();
                    if (score != null)
                    {
                        System.out.println("Mr. "+score.annotation+" is Present.");
                    }
                    else
                    {
                        System.out.println("Recognizing");
                    }
                } catch (Exception e) {
                }
            }
        }

    });
}

1 个答案:

答案 0 :(得分:1)

是的,只需使用org.openimaj.io.IOUtils类中的静态方法将faceEngine写入磁盘,然后再将其重新读回。