OpenCV3를 사용한 Random Trees
5726 단어 RandomTreesOpenCV3랜덤 숲
• C++에서 다른 모듈과 협업
・ 이미지 데이터를 학습하고 OpenCV를 통해 처리
• 다른 C++ 라이브러리도 있지만 가져오기 환경이 번거롭다
그러나 OpenCV3 버전의 랜덤 숲 랜덤트리스에 대한 일본어 정보는 거의 없고, 참고 자료도 설치와 무엇이 다릅니까(Rtrees: Param은 존재하지 않습니까?)힘들기 때문에 총결산의 메모가 되었다.
데이터 준비(ml:TrainData)
우선 데이터의 준비 작업이다.데이터 클래스로 사용되는 TrainData는 RandomTrees뿐만 아니라 다른 ml 모듈에도 사용할 수 있습니다.
csv 파일에서 읽기
csv 파일에서 학습 데이터를 TrainData 클래스로 읽습니다.csv 파일은 다음과 같이 각 샘플의 특징량 벡터 배열 형식입니다.여기는 첫 번째 열을 라벨로 하지만, 임의의 열일 수도 있습니다.
다음 loadFromcSV를 사용하여 읽습니다.
Ptr<TrainData> loadFromCSV(const String& filename, int headerLineCount, int responseStartIdx=-1, int responseEndIdx=-1, const String& varTypeSpec=String(), char delimiter=',', char missch='?')
(※ 반각 공백이 있으면 강제로 구분되기 때문에 1변수의 표시에는 반각 공백이 필요하지 않습니다.)
string filename = "sample.csv";
Ptr<TrainData> data = TrainData::loadFromCSV(filename, 0, 0, -1);
메모리에서 읽기이미지 그룹에서 특징을 추출하고 메모리에서 데이터 집합을 생성할 때create로TrainData를 만들 수 있습니다.
Ptr<TrainData> create(InputArray samples, int layout, InputArray responses, InputArray varIdx=noArray(), InputArray sampleIdx=noArray(), InputArray sampleWeights=noArray(), InputArray varType=noArray())
학습, 테스트 데이터 분할
setTrainTest SplitRatio를 사용하면 TrainData 내에서 학습용과 테스트용을 분리하여 평가할 수 있습니다.
void TrainData::setTrainTestSplitRatio(double ratio, bool shuffle=true)
데이터가 준비되면 공부를 시작합시다.
초기화
Rtrees의create 함수로 초기화합니다.
Ptr<RTrees> rtrees = RTrees::create();
매개변수 설정학습 매개 변수를 설정하는 중입니다.
rtrees->setMaxDepth(5);
rtrees->setMinSampleCount(2);
rtrees->setCalculateVarImportance(true);
rtrees->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, 100, 0.1));
배우다
데이터가 준비된 TrainData를 매개 변수로 학습을 시작합니다.
rtrees->train(data);
평점TrainData로 setTrainTest SplitRatio를 설정하면 학습, 테스트 데이터를 각각 평가할 수 있습니다.
calcError 함수에TrainData와 로고(학습:가짜, 테스트:진짜)를 첨가하여 평가합니다.
printf("train error: %f\n", rtrees->calcError(data, false, noArray()));
printf("test error: %f\n\n", rtrees->calcError(data, true, noArray()));
분류 문제 중 오류율(%)은 회귀 문제에서 RMS가 평가한다.저장 및 읽기
공부가 끝난 후 save 함수로 저장하세요.
rtrees->save("rtree_model.xml");
마찬가지로load 함수로 읽을 수 있습니다.Ptr<RTrees> rtrees = RTrees::load<RTrees>("rtree_model.xml");
어림잡다마지막으로 추측입니다.
이번 예에서 ROW 배열에서 추정하고자 하는 특징 벡터를predict 함수에 저장하면 추측 결과를 되돌려줍니다.
아래의 예에서 TrainData의 샘플을 얻어 각 샘플을 추측 처리한다.
Mat samples = data->getSamples();
for (int i = 0; i < samples.rows; i++) {
Mat sample = samples.row(i);
float result = rtrees->predict(sample);
cout << "index:" << i << ", predict:" << result <<endl;
}
여러 견본을 총괄적으로 평가할 수 있지만, 두 번째 파라미터에서 결과를 받는 그룹을 지정해야 한다.Mat results;
float result = rtrees->predict(samples, results);
이곳의 반환 값은 최초의 견본의 평가 결과일 뿐이기 때문에 특별한 의미가 없다.보충: 공부할 때의 오류
샘플의 학습 데이터를 이용하여 실험을 진행할 때 입력 변수와 출력 변수(라벨)를 분류하면 오류가 발생할 수 있습니다.
학습 트리의 서브집합에서 출력 변수에 대해 최소한 견본이 하나도 없으면 예외가 발생하는 것 같다.
즉, 라벨이 A, B 두 개면 서브집합 안의 모든 샘플이 A 라벨이면 오류가 발생한다.
OpenCV의 규격이라 어쩔 수 없지만, 서브집합의 샘플 수가 적으면 쉽게 발생할 수 있으므로 데이터 양을 늘리는 것이 좋으며, 입력 변수인지 출력 변수인지 실제 수치로 설정하는 것이 좋다.
말하자면 이미지 데이터로 학습하면 특징량은 실수이고 CV로도 괜찮겠지...(그래도 입력 변수에서 분류가 허용될 때 이상하게 느껴질 수 있다)
데이터 발굴성 이용은 R과 scikit-learn이 좋아요?
Reference
이 문제에 관하여(OpenCV3를 사용한 Random Trees), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/SousukeShimoyama/items/d2dbd32cb16948b08c98텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)