16 #include "itkArray2D.h" 18 #include <itkCSVArray2DFileReader.h> 19 #include <itkCSVArray2DDataObject.h> 22 #include <itkAddImageFilter.h> 28 CPPUNIT_TEST_SUITE(mitkVigraRandomForestTestSuite );
35 MITK_TEST(TrainThreadedDecisionForest_MatlabDataSet_shouldReturnTrue);
36 MITK_TEST(PredictWeightedDecisionForest_SetWeightsToZero_shouldReturnTrue);
37 MITK_TEST(TrainThreadedDecisionForest_BreastCancerDataSet_shouldReturnTrue);
38 CPPUNIT_TEST_SUITE_END();
42 typedef Eigen::Matrix<double ,Eigen::Dynamic,Eigen::Dynamic> MatrixDoubleType;
43 typedef Eigen::Matrix<int, Eigen::Dynamic,Eigen::Dynamic> MatrixIntType;
45 std::pair<MatrixDoubleType, MatrixDoubleType> FeatureData_Cancer;
46 std::pair<MatrixIntType, MatrixIntType> LabelData_Cancer;
48 std::pair<MatrixDoubleType, MatrixDoubleType> FeatureData_Matlab;
49 std::pair<MatrixIntType, MatrixIntType> LabelData_Matlab;
61 FeatureData_Cancer = convertCSVToMatrix<double>(
GetTestDataFilePath(
"Classification/FeaturematrixBreastcancer.csv"),
';',0.5,
true);
62 LabelData_Cancer = convertCSVToMatrix<int>(
GetTestDataFilePath(
"Classification/LabelmatrixBreastcancer.csv"),
';',0.5,
false);
63 FeatureData_Matlab = convertCSVToMatrix<double>(
GetTestDataFilePath(
"Classification/FeaturematrixMatlab.csv"),
';',0.5,
true);
64 LabelData_Matlab = convertCSVToMatrix<int>(
GetTestDataFilePath(
"Classification/LabelmatrixMatlab.csv"),
';',0.5,
false);
68 void tearDown()
override 79 void TrainThreadedDecisionForest_MatlabDataSet_shouldReturnTrue()
82 auto & Features_Training = FeatureData_Matlab.first;
83 auto & Labels_Training = LabelData_Matlab.first;
85 auto & Features_Testing = FeatureData_Matlab.second;
86 auto & Labels_Testing = LabelData_Matlab.second;
90 classifier->Train(Features_Training,Labels_Training);
91 Eigen::MatrixXi classes = classifier->Predict(Features_Testing);
94 unsigned int testmatrix_rows = classes.rows();
96 unsigned int correctly_classified_rows = 0;
97 for(
unsigned int i= 0; i < testmatrix_rows; i++){
98 if(classes(i,0) == Labels_Testing(i,0)){
99 correctly_classified_rows++;
103 MITK_TEST_CONDITION(correctly_classified_rows == testmatrix_rows,
"Matlab Data correctly classified");
112 void TrainThreadedDecisionForest_BreastCancerDataSet_shouldReturnTrue()
115 auto & Features_Training = FeatureData_Cancer.first;
116 auto & Features_Testing = FeatureData_Cancer.second;
117 auto & Labels_Training = LabelData_Cancer.first;
118 auto & Labels_Testing = LabelData_Cancer.second;
123 classifier->Train(Features_Training,Labels_Training);
124 Eigen::MatrixXi classes = classifier->Predict(Features_Testing);
127 unsigned int maxrows = classes.rows();
131 for(
unsigned int i= 0; i < maxrows; i++){
132 if(classes(i,0) == Labels_Testing(i,0)){
136 MITK_TEST_CONDITION(isIntervall<int>(Labels_Testing,classes,98,99),
"Testvalue of cancer data set is in range.");
142 void PredictWeightedDecisionForest_SetWeightsToZero_shouldReturnTrue()
145 auto & Features_Training = FeatureData_Matlab.first;
146 auto & Features_Testing = FeatureData_Matlab.second;
147 auto & Labels_Training = LabelData_Matlab.first;
150 classifier->Train(Features_Training,Labels_Training);
153 auto weights = classifier->GetTreeWeights();
154 weights.resize(classifier->GetRandomForest().tree_count(),1);
157 classifier->SetTreeWeights(weights);
160 Eigen::MatrixXi classes = classifier->PredictWeighted(Features_Testing);
163 unsigned int maxrows = classes.rows();
164 unsigned int count = 0;
167 for(
unsigned int i= 0; i < maxrows; i++)
168 if(classes(i,0) == 1)
171 MITK_TEST_CONDITION( (count == maxrows) ,
"Weighted prediction - weights applied (all weights = 0).");
181 std::pair<Eigen::Matrix<T ,Eigen::Dynamic,Eigen::Dynamic>,Eigen::Matrix<T ,Eigen::Dynamic,Eigen::Dynamic> >convertCSVToMatrix(
const std::string &path,
char delimiter,
double range,
bool isXMatrix)
183 typename itk::CSVArray2DFileReader<T>::Pointer fr = itk::CSVArray2DFileReader<T>::New();
184 fr->SetFileName(path);
185 fr->SetFieldDelimiterCharacter(delimiter);
186 fr->HasColumnHeadersOff();
187 fr->HasRowHeadersOff();
191 }
catch (
const itk::ExceptionObject& ex ){
192 cout <<
"Exception caught!" << std::endl;
193 cout << ex.GetDescription() << std::endl;
196 typename itk::CSVArray2DDataObject<T>::Pointer p = fr->GetOutput();
197 unsigned int maxrowrange = p->GetMatrix().rows();
198 unsigned int c = p->GetMatrix().cols();
199 unsigned int percentRange = (
unsigned int)(maxrowrange*range);
201 if(isXMatrix ==
true){
202 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> trainMatrixX(percentRange,c);
203 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> testMatrixXPredict(maxrowrange-percentRange,c);
205 for(
unsigned int row = 0; row < percentRange; row++){
206 for(
unsigned int col = 0; col < c; col++){
207 trainMatrixX(row,col) = p->GetData(row,col);
211 for(
unsigned int row = percentRange; row < maxrowrange; row++){
212 for(
unsigned int col = 0; col < c; col++){
213 testMatrixXPredict(row-percentRange,col) = p->GetData(row,col);
217 return std::make_pair(trainMatrixX,testMatrixXPredict);
220 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> trainLabelMatrixY(percentRange,c);
221 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> testMatrixYPredict(maxrowrange-percentRange,c);
223 for(
unsigned int row = 0; row < percentRange; row++){
224 for(
unsigned int col = 0; col < c; col++){
225 trainLabelMatrixY(row,col) = p->GetData(row,col);
229 for(
unsigned int row = percentRange; row < maxrowrange; row++){
230 for(
unsigned int col = 0; col < c; col++){
231 testMatrixYPredict(row-percentRange,col) = p->GetData(row,col);
234 return std::make_pair(trainLabelMatrixY,testMatrixYPredict);
243 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> readCsvData(
const std::string &path,
char delimiter)
245 typename itk::CSVArray2DFileReader<T>::Pointer fr = itk::CSVArray2DFileReader<T>::New();
246 fr->SetFileName(path);
247 fr->SetFieldDelimiterCharacter(delimiter);
248 fr->HasColumnHeadersOff();
249 fr->HasRowHeadersOff();
253 }
catch (
const itk::ExceptionObject& ex ){
254 cout <<
"Exception caught!" << std::endl;
255 cout << ex.GetDescription() << std::endl;
258 typename itk::CSVArray2DDataObject<T>::Pointer p = fr->GetOutput();
259 unsigned int maxrowrange = p->GetMatrix().rows();
260 unsigned int maxcols = p->GetMatrix().cols();
261 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> matrix(maxrowrange,maxcols);
263 for(
unsigned int rows = 0; rows < maxrowrange; rows++){
264 for(
unsigned int cols = 0; cols < maxcols; cols++ ){
265 matrix(rows,cols) = p->GetData(rows,cols);
278 void writeMatrixToCsv(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> paramMatrix,
const std::string &path)
280 std::ofstream outputstream (path,std::ofstream::out);
282 if(outputstream.is_open()){
283 for(
int i = 0; i < paramMatrix.rows(); i++){
284 outputstream << paramMatrix(i,0);
285 for(
int j = 1; j < 11; j++){
286 outputstream <<
" " << j <<
":" << paramMatrix(i,j);
288 outputstream << endl;
290 outputstream.close();
293 cout <<
"Unable to write into CSV" << endl;
299 bool isIntervall(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> expected, Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> actual,
double lowrange,
double toprange)
301 bool isInIntervall =
false;
303 unsigned int rowRange = expected.rows();
304 unsigned int colRange = expected.cols();
305 for(
unsigned int i = 0; i < rowRange; i++){
306 for(
unsigned int j = 0; j < colRange; j++){
307 if(expected(i,j) == actual(i,j)){
312 double valueOfMatch = 100*count/(double)(rowRange);
313 if((lowrange <= valueOfMatch) && (toprange >= valueOfMatch)){
314 isInIntervall =
true;
317 return isInIntervall;
MITK_TEST_SUITE_REGISTRATION(mitkImageToItk)
#define MITK_TEST(TESTMETHOD)
Adds a test to the current test suite.
static std::string GetTestDataFilePath(const std::string &testData)
Get the absolute path for test data.
#define MITK_TEST_CONDITION(COND, MSG)
Test fixture for parameterized tests.