File: SupervisedImageClassificationExample.cxx

package info (click to toggle)
otb 5.8.0%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 38,496 kB
  • ctags: 40,282
  • sloc: cpp: 306,573; ansic: 3,575; python: 450; sh: 214; perl: 74; java: 72; makefile: 70
file content (157 lines) | stat: -rw-r--r-- 5,738 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*=========================================================================

  Program:   ORFEO Toolbox
  Language:  C++
  Date:      $Date$
  Version:   $Revision$


  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
  See OTBCopyright.txt for details.


     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notices for more information.

=========================================================================*/

// Software Guide : BeginLatex
//
// In OTB, a generic streamed filter called \doxygen{otb}{ImageClassificationFilter}
// is available to classify any input multi-channel image according to an input
// classification model file. This filter is generic because it works with any
// classification model type (SVM, KNN, Artificial Neural Network,...) generated
// within the OTB generic Machine Learning framework based on OpenCV (\cite{opencv_library}).
// The input model file is smartly parsed according to its content in order to
// identify which learning method was used to generate it. Once the classification
// method and model are known, the input image can be classified. More details are
// given in subsections \ref{ssec:LearningFromSamples} and \ref{ssec:LearningFromImages}
// to generate a classification model either from samples or from images.
// In this example we will illustrate its use. We start by including the
// appropriate header files.
//
// Software Guide : EndLatex

// Software Guide : BeginCodeSnippet
#include "otbMachineLearningModelFactory.h"
#include "otbImageClassificationFilter.h"
// Software Guide : EndCodeSnippet

#include "otbVectorImage.h"
#include "otbImage.h"
#include "otbImageFileReader.h"
#include "otbImageFileWriter.h"

int main(int itkNotUsed(argc), char * argv[])
{
  const char * infname = argv[1];
  const char * modelfname = argv[2];
  const char * outfname = argv[3];

// Software Guide : BeginLatex
//
// We will assume double precision input images and will also define
// the type for the labeled pixels.
//
// Software Guide : EndLatex

// Software Guide : BeginCodeSnippet
  const unsigned int     Dimension = 2;
  typedef double         PixelType;
  typedef unsigned short LabeledPixelType;
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// Our classifier is generic enough to be able to process images
// with any number of bands. We read the input image as a
// \doxygen{otb}{VectorImage}. The labeled image will be a scalar image.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
  typedef otb::VectorImage<PixelType, Dimension>  ImageType;
  typedef otb::Image<LabeledPixelType, Dimension> LabeledImageType;
// Software Guide : EndCodeSnippet

// Software Guide : BeginLatex
//
// We can now define the type for the classifier filter, which is
// templated over its input and output image types.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
  typedef otb::ImageClassificationFilter<ImageType, LabeledImageType>
                                                          ClassificationFilterType;
  typedef ClassificationFilterType::ModelType ModelType;
// Software Guide : EndCodeSnippet

// Software Guide : BeginLatex
//
// Moreover, it is necessary to define a \doxygen{otb}{MachineLearningModelFactory}
// which is templated over its input and output pixel types. This factory is used
// to parse the input model file and to define which classification method to use.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
  typedef otb::MachineLearningModelFactory<PixelType, LabeledPixelType>
                                                   MachineLearningModelFactoryType;
// Software Guide : EndCodeSnippet

// Software Guide : BeginLatex
//
// And finally, we define the reader and the writer. Since the images
// to classify can be very big, we will use a streamed writer which
// will trigger the streaming ability of the classifier.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
  typedef otb::ImageFileReader<ImageType>        ReaderType;
  typedef otb::ImageFileWriter<LabeledImageType> WriterType;
// Software Guide : EndCodeSnippet

// Software Guide : BeginLatex
//
// We instantiate the classifier and the reader objects and we set
// the existing model obtained in a previous training step.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
  ClassificationFilterType::Pointer filter = ClassificationFilterType::New();

  ReaderType::Pointer reader = ReaderType::New();
  reader->SetFileName(infname);
// Software Guide : EndCodeSnippet

// Software Guide : BeginLatex
//
// The input model file is parsed according to its content and the generated model
// is then loaded within the \doxygen{otb}{ImageClassificationFilter}.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
  ModelType::Pointer model;
  model = MachineLearningModelFactoryType::CreateMachineLearningModel(
                                        modelfname,
                                        MachineLearningModelFactoryType::ReadMode);
  model->Load(modelfname);

  filter->SetModel(model);
// Software Guide : EndCodeSnippet

// Software Guide : BeginLatex
//
// We plug the pipeline and
// trigger its execution by updating the output of the writer.
//
// Software Guide : EndLatex

// Software Guide : BeginCodeSnippet
  filter->SetInput(reader->GetOutput());

  WriterType::Pointer writer = WriterType::New();
  writer->SetInput(filter->GetOutput());
  writer->SetFileName(outfname);
  writer->Update();
// Software Guide : EndCodeSnippet
  return EXIT_SUCCESS;
}