Exemple #1
0
// extract patch from images
// !!!!!!coution!!!!!!!
// this function is use for negatime mode!!!!!
void extractPosPatches(std::vector<CPosDataset> &posSet,
                       std::vector<CPosPatch> &posPatch,
                       CConfig conf,
                       const int treeNum,
                       const CClassDatabase &classDatabase){
    cv::Rect tempRect;

    std::vector<CPosPatch> tPosPatch(0);//, posPatch(0);
    std::vector<std::vector<CPosPatch> > patchPerClass(classDatabase.vNode.size());
    int pixNum;
    nCk nck;
    int classNum = 0;

    posPatch.clear();

    tempRect.width  = conf.p_width;
    tempRect.height = conf.p_height;

    std::cout << "image num is " << posSet.size();

    std::cout << "extracting patch from image" << std::endl;
    for(int l = 0;l < posSet.size(); ++l){
        for(int j = 0; j < posSet.at(l).img.at(0)->cols - conf.p_width; j += conf.stride){
            for(int k = 0; k < posSet.at(l).img.at(0)->rows - conf.p_height; k += conf.stride){
                tempRect.x = j;
                tempRect.y = k;
                pixNum = 0;
                int centerDepthFlag = 1;

                // detect negative patch
                for(int m = j; m < j + conf.p_width; ++m){
                    for(int n = k; n < k + conf.p_height; ++n){
                        pixNum += (int)(posSet.at(l).img.at(1)->at<ushort>(n, m));
                    }
                }

                // set patch class
                classNum = classDatabase.search(posSet.at(l).getParam()->getClassName());//dataSet.at(l).className.at(0));
                if(classNum == -1){
                    std::cout << "class not found!" << std::endl;
                    exit(-1);
                }

                //tPatch.setPatch(temp, image.at(l), dataSet.at(l), classNum);


                CPosPatch posTemp(&posSet.at(l),tempRect);
                if (pixNum > 0 && posSet.at(l).img.at(1)->at<ushort>(k + (conf.p_height / 2) + 1, j + (conf.p_width / 2) + 1 ) != 0){
                    tPosPatch.push_back(posTemp);
                    patchPerClass.at(classNum).push_back(posTemp);
                } // if
            }//x
        }//y
    }//allimages

    std::vector<int> patchNum(patchPerClass.size(),conf.patchRatio);

    for(int i = 0; i < patchPerClass.size(); ++i){
        if(i == treeNum % patchPerClass.size())
            patchNum.at(i) = conf.patchRatio;
        else
            patchNum.at(i) = conf.patchRatio * conf.acPatchRatio;
    }

    // choose patch from each image
    for(int i = 0; i < patchPerClass.size(); ++i){
        if(patchPerClass.at(i).size() > conf.patchRatio){

            std::set<int> chosenPatch = nck.generate(patchPerClass.at(i).size(),patchNum.at(i));// conf.patchRatio);//totalPatchNum * conf.patchRatio);
            std::set<int>::iterator ite = chosenPatch.begin();

            while(ite != chosenPatch.end()){
                //std::cout << "this is for debug ite is " << tPosPatch.at(*ite).center << std::endl;
                posPatch.push_back(patchPerClass.at(i).at(*ite));
                ite++;
            }
        }else{
            std::cout << "can't extruct enough patch" << std::endl;
        }
    }
    return;
}
void CRForest::growATree(const int treeNum) {
    // positive, negative dataset
    std::vector<CPosDataset> posSet(0);
    std::vector<CNegDataset> negSet(0);

    // positive, negative patch
    std::vector<CPosPatch> posPatch(0);
    std::vector<CNegPatch> negPatch(0);

    char buffer[256];

    std::cout << "tree number " << treeNum << std::endl;

    // initialize random seed
    boost::mt19937    gen( treeNum * static_cast<unsigned long>(time(NULL)) );
    //boost::timer t;

    //loadTrainPosFile(conf, posSet);//, gen);
    loadTrainObjFile(conf,posSet);

    CClassDatabase tempClassDatabase;
    // extract pos features and register classDatabase
    for(int i = 0; i < posSet.size(); ++i) {
        //std::cout << i << std::endl;

        //std::cout << posSet.at(i).rgb << std::endl;
        //        if(posSet.at(i).loadImage(conf) == -1 && conf.learningMode != 2){
        //            exit(-1);
        //        }

        //posSet.at(i).extractFeatures(conf);

        //std::cout << posSet.size() << std::endl;




        tempClassDatabase.add(posSet.at(i).getParam()->getClassName(),cv::Size(),0);
    }

    //    std::vector<CPosDataset> tempPosSet(0);
    //    int currentClass = treeNum % tempClassDatabase.vNode.size();

    //std::cout << "okashiina" << std::endl;
    //    for(int i = 0; i < posSet.size(); ++i){
    //        if(tempClassDatabase.search(posSet.at(i).getClassName()) == currentClass){
    //            tempPosSet.push_back(posSet.at(i));
    //            //std::cout << "teketeke" << std::endl;
    //        }else{
    //            negSet.push_back(convertPosToNeg2(posSet.at(i)));
    //            //std::cout << "negneg" << std::endl;
    //        }
    //    }

    //posSet = tempPosSet;

    loadTrainNegFile(conf, negSet);

    std::cout << "dataset loaded" << std::endl;

    // initialize class database
    //classDatabase.clear();

    std::cout << "generating appearance from 3D model!" << std::endl;
    // extract pos features and register classDatabase
    for(int i = 0; i < posSet.size(); ++i) {
        //std::cout << i << std::endl;

        //std::cout << posSet.at(i).rgb << std::endl;
        //#pragma omp critical
        posSet.at(i).loadImage(conf, posSet.at(i).getModelPath(), posSet.at(i).getParam());

        //        if(imgload == -1 && conf.learningMode != 2){
        //            std::cout << "can't load image files" << std::endl;
        //            exit(-1);
        //        }

        posSet.at(i).extractFeatures(conf);

        //std::cout << posSet.at(i).img.at(1)->type() << std::endl;
        //std::cout << "detayo" << std::endl;

        //std::cout << posSet.size() << std::endl;

        classDatabase.add(posSet.at(i).getParam()->getClassName(),posSet.at(i).img.at(0)->size(),0);
        pBar(i,posSet.size(),50);
    }
    std::cout << std::endl;
    classDatabase.show();

    // extract neg features
    for(int i = 0; i < negSet.size(); ++i) {
        //        if(negSet.at(i).getModel() != NULL)
        //            negSet.at(i).loadImage(conf, negSet.at(i).getModelPath(), posSet.at(i))
        negSet.at(i).loadImage(conf);
        negSet.at(i).extractFeatures(conf);
    }

    CRTree *tree = new CRTree(conf.min_sample, conf.max_depth, classDatabase.vNode.size(),this->classDatabase);
    std::cout << "tree created" << std::endl;

    extractPosPatches(posSet,posPatch,conf,treeNum,this->classDatabase);
    extractNegPatches(negSet,negPatch,conf);

    std::cout << "extracted pathes" << std::endl;
    std::vector<int> patchClassNum(classDatabase.vNode.size(), 0);

    for(int j = 0; j < posPatch.size(); ++j)
        patchClassNum.at(classDatabase.search(posPatch.at(j).getClassName()))++;

    // grow tree
    //vTrees.at(treeNum)->growTree(vPatches, 0,0, (float)(vPatches.at(0).size()) / ((float)(vPatches.at(0).size()) + (float)(vPatches.at(1).size())), conf, gen, patchClassNum);
    //#pragma omp parallel
    tree->growTree(posPatch,negPatch, 0,0, ((float)posPatch.size() / (float)(posPatch.size() + negPatch.size())), conf, patchClassNum);

    //    cv::namedWindow("test");
    //    cv::imshow("test", *posSet.at(0).feature.at(3));
    //    cv::waitKey(0);
    //    cv::destroyAllWindows();

    // save tree
    sprintf(buffer, "%s%03d.txt",
            conf.treepath.c_str(), treeNum + conf.off_tree);
    std::cout << "tree file name is " << buffer << std::endl;
    tree->saveTree(buffer);

    // save class database
    sprintf(buffer, "%s%s%03d.txt",
            conf.treepath.c_str(),
            conf.classDatabaseName.c_str(), treeNum + conf.off_tree);
    std::cout << "write tree data" << std::endl;
    classDatabase.write(buffer);

    //double time = t.elapsed();

    //std::cout << "tree " << treeNum << " calicuration time is " << time << std::endl;

    sprintf(buffer, "%s%03d_timeResult.txt",conf.treepath.c_str(), treeNum + conf.off_tree);
    std::fstream lerningResult(buffer, std::ios::out);
    if(lerningResult.fail()) {
        std::cout << "can't write result" << std::endl;
    }

    lerningResult << time << std::endl;

    lerningResult.close();

    delete tree;


    posPatch.clear();
    negPatch.clear();

    //    for(int i = 0; i< posSet.size(); ++i){
    //        cv::namedWindow("test");
    //        cv::imshow("test", *posSet.at(i).img.at(0));
    //        cv::waitKey(0);
    //        cv::destroyWindow("test");
    //    }


    //    for(int i = 0; i < posSet.size(); ++i){
    //        posSet.at(i).releaseImage();
    //    }

    //    for(int i = 0; i< posSet.size(); ++i){
    //        cv::namedWindow("test");
    //        cv::imshow("test", *posSet.at(i).feature.at(0));
    //        cv::waitKey(0);
    //        cv::destroyWindow("test");
    //    }

    //    for(int i = 0; i < posSet.size(); ++i){
    //        posSet.at(i).releaseFeatures();
    //    }

    posSet.clear();
    negSet.clear();
}
Exemple #3
0
void loadTrainPosFile(CConfig conf, std::vector<CPosDataset> &posSet)
{
    std::string traindatafilepath = conf.trainpath + PATH_SEP +  conf.traindatafile;
    int n_folders;
    int n_files;
    std::vector<std::string> trainimagefolder;
    std::vector<CPosDataset> tempDataSet;
    std::string trainDataListPath;
    int dataSetNum;
    CClassDatabase database;
    cv::Point tempPoint;
    nCk nck;

    posSet.clear();

    //read train data folder list
    std::ifstream in(traindatafilepath.c_str());
    if(!in.is_open()){
        std::cout << "train data floder list is not found!" << std::endl;
        exit(1);
    }

    // read train pos folder
    in >> n_folders;
    std::cout << "number of training data folders : " << n_folders << std::endl;
    trainimagefolder.resize(n_folders);
    for(int i = 0;i < n_folders; ++i)
        in >> trainimagefolder.at(i);

    // close train pos data folder list
    in.close();

    std::cout << "train folders lists : " << std::endl;
    //read train file name and grand truth from file
    tempDataSet.clear();
    for(int i = 0;i < n_folders; ++i){
        trainDataListPath
                = conf.trainpath + PATH_SEP + trainimagefolder.at(i) + PATH_SEP + conf.traindatalist;

        std::cout << trainDataListPath << std::endl;
        std::string imageFilePath
                = conf.trainpath + PATH_SEP + trainimagefolder.at(i) + PATH_SEP;

        std::ifstream trainDataList(trainDataListPath.c_str());
        if(!trainDataList.is_open()){
            std::cout << "can't read " << trainDataListPath << std::endl;
            exit(1);
        }

        trainDataList >> n_files;

        for(int j = 0;j < n_files; ++j){
            CPosDataset posTemp;
            std::string nameTemp;


            //            posTemp.angles.clear();
            //            posTemp.centerPoint.clear();

            //read file names
            trainDataList >> nameTemp;
            posTemp.setRgbImagePath(imageFilePath + nameTemp);

            trainDataList >> nameTemp;
            posTemp.setDepthImagePath(imageFilePath + nameTemp);

            trainDataList >> nameTemp;// dummy

            //read class name
            std::string tempClassName;
            trainDataList >> tempClassName;
            //temp.className.push_back(tempClassName);
            posTemp.setClassName(tempClassName);

            // read image size
            cv::Mat tempImage = cv::imread(posTemp.getRgbImagePath(),3);
            cv::Size tempSize = cv::Size(tempImage.cols, tempImage.rows);

            // set center point
            tempPoint = cv::Point(tempImage.cols / 2, tempImage.rows / 2);
            posTemp.setCenterPoint(tempPoint);

            // registre class param to class database
            database.add(posTemp.getParam()->getClassName(), tempSize, 0);

            //read angle grand truth
            double tempAngle;
            trainDataList >> tempAngle;
            posTemp.setAngle(tempAngle);

            tempDataSet.push_back(posTemp);
        }

        trainDataList.close();
    }

    dataSetNum = tempDataSet.size();
    int dataOffset = 0;
    database.show();
    for(int j = 0;j < database.vNode.size(); j++){
        std::set<int> chosenData = nck.generate(database.vNode.at(j).instances, conf.imagePerTree);

        std::set<int>::iterator ite = chosenData.begin();

        while(ite != chosenData.end()){
            posSet.push_back(tempDataSet.at(*ite + dataOffset));
            ite++;
        }
        dataOffset += database.vNode.at(j).instances;
    }


    //    std::cout << "show chosen dataset" << std::endl;
    //    for(int i = 0; i < dataSet.size(); ++i){
    //        dataSet.at(i).showDataset();
    //    }
}
void loadTrainFile(CConfig conf, std::vector<CDataset> &dataSet)
{
  dataSet.resize(0);
  
  std::string traindatafilepath = conf.trainpath + PATH_SEP +  conf.traindatafile;
  int n_folders;
  int n_files;
  std::vector<std::string> trainimagefolder;
  CDataset temp;
  std::vector<CDataset> tempDataSet;
  std::string trainDataListPath;
  int dataSetNum;
  CClassDatabase database;
  cv::Point tempPoint;
  nCk nck;
  
  
  //read train data folder list
  std::ifstream in(traindatafilepath.c_str());
  if(!in.is_open()){
    std::cout << "train data floder list is not found!" << std::endl;
    exit(1);
  }

  //std::cout << "kokomade " << std::endl;
  
  // read folder number
  in >> n_folders;
  std::cout << "number of training data folder: "
	    << n_folders << std::endl;
  trainimagefolder.resize(n_folders);

  // read train folder name
  for(int i = 0;i < n_folders; ++i)
    in >> trainimagefolder.at(i);

  std::cout << "train image foloder num is " << trainimagefolder.size() << std::endl;
  in.close();
  //read train file name and grand truth from file
  tempDataSet.clear();
  for(int i = 0;i < n_folders; ++i){
    trainDataListPath 
      = conf.trainpath + PATH_SEP + trainimagefolder.at(i) 
      + PATH_SEP + conf.traindatalist;

    std::cout << trainDataListPath << std::endl;
    temp.imageFilePath 
      = conf.trainpath + PATH_SEP + trainimagefolder.at(i) + PATH_SEP;

    std::ifstream trainDataList(trainDataListPath.c_str());
    if(!trainDataList.is_open()){
      std::cout << "can't read " << trainDataListPath << std::endl;
      exit(0);
    }

    trainDataList >> n_files;
    
    for(int j = 0;j < n_files; ++j){
      //read file names
      trainDataList >> temp.rgbImageName;
      trainDataList >> temp.depthImageName;
      trainDataList >> temp.maskImageName;

      //read bounding box
      //trainDataList >> temp.bBox.x;
      //trainDataList >> temp.bBox.y;
      //trainDataList >> temp.bBox.width;
      //trainDataList >> temp.bBox.height;
      
      temp.centerPoint.clear();

      //read center point
      //trainDataList >> tempPoint.x;//temp.centerPoint.x;
      //trainDataList >> tempPoint.y;

      //temp.centerPoint.push_back(tempPoint);
      
      //read class name
      trainDataList >> temp.className;
      
      database.add(temp.className);

      //read angle grand truth
      trainDataList >> temp.angle;

      //show read data *for debug
      //temp.showDataset();
     
      tempDataSet.push_back(temp);
    }
    trainDataList.close();
  }
  dataSetNum = tempDataSet.size();
  int dataOffset = 0;
  database.show();
  for(int j = 0;j < database.vNode.size(); j++){
    std::set<int> chosenData = nck.generate(database.vNode.at(j).instances, conf.imagePerTree);
    
    std::set<int>::iterator ite = chosenData.begin();
    
    while(ite != chosenData.end()){
      dataSet.push_back(tempDataSet.at(*ite + dataOffset));
      ite++;
    }
    dataOffset += database.vNode.at(j).instances;
  }

  //in.close();
}