otb issueshttps://gitlab.orfeo-toolbox.org/orfeotoolbox/otb/-/issues2024-02-26T14:29:52Zhttps://gitlab.orfeo-toolbox.org/orfeotoolbox/otb/-/issues/1558add new parameter type for handle epsg (ParameterCrs)2024-02-26T14:29:52ZRashad Kanavathadd new parameter type for handle epsg (ParameterCrs)epsg parameter are handled as simple int value in OTB. Qgis uses a crs type which pops a Coordinate reference config dialog.
It seems nice to have this in OTB.
https://gitlab.orfeo-toolbox.org/orfeotoolbox/qgis-otb-plugin/issues/2epsg parameter are handled as simple int value in OTB. Qgis uses a crs type which pops a Coordinate reference config dialog.
It seems nice to have this in OTB.
https://gitlab.orfeo-toolbox.org/orfeotoolbox/qgis-otb-plugin/issues/2https://gitlab.orfeo-toolbox.org/orfeotoolbox/otb/-/issues/1616Deep Learning Streaming Image Data Generator2024-02-26T14:28:18ZJordi IngladaDeep Learning Streaming Image Data GeneratorTraining DL models like conv nets needs the generation of batches of image data over which the training algorithm can loop.
Keras seems to be the most widely used DL framework in Python and it provides an ImageDataGenerator class which ...Training DL models like conv nets needs the generation of batches of image data over which the training algorithm can loop.
Keras seems to be the most widely used DL framework in Python and it provides an ImageDataGenerator class which provides batches of tensor image data with real-time data augmentation; the data is be looped over (in batches). Assuming you have a set of image patches in a directory, you do:
```
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator()
train_generator = train_datagen.flow_from_directory(
train_dir,
target_size=(150, 150)
batch_size=20)
#Fit the DL model using the generator
model.fit_generator(
train_generator,
steps_per_epoch=100,
epochs=30,
validation_data=validation_generator,
validation_steps=50)
```
Right now, to train a DL model with Keras using remote sensing imagery needs to extract patches from the images and save them as individual images so that the standard Keras generator can be used. This also needs to rasterize the reference data set (the shapefile with the labelled training data) so that it fits the image geometry.
This procedure is not efficient and implies lots of I/O.
Using OTB tools developed for the sampling framework would allow to provide a patch image generator which is fully streamed (no need to write data to disk) and does not need to rasterize the reference data. And the code could be:
```
from otbApplication import otbPatchImageGenerator
train_datagen = otbPatchImageGenerator()
train_generator = train_datagen.flow_from_directory(
train_image_list,
reference_vector_list,
target_size=(150, 150)
batch_size=20)
```
Similar generators could be provided for time series using images or for pixel-based classification starting from the SQLite files generated by the SampleExtraction application.
Although the examples above use Keras and Python, the underlying C++ code could provide in memory tensors for Tensorflow so that once a model is trained in python it can be deployed effciently by otbImageClassifier.https://gitlab.orfeo-toolbox.org/orfeotoolbox/otb/-/issues/1539Support z field in input tie point file for GenerateRPCModel and RefineSensor...2024-02-26T14:26:29ZJulien MichelSupport z field in input tie point file for GenerateRPCModel and RefineSensorModel applicationCurrently, the GenerateRPCModel application reads (x,y) and (lat,lon) from the tie points file, and then retrieve the z from input DSM (elev.dem param). It would be interesting to also be able to retrieve the z field from the tie points ...Currently, the GenerateRPCModel application reads (x,y) and (lat,lon) from the tie points file, and then retrieve the z from input DSM (elev.dem param). It would be interesting to also be able to retrieve the z field from the tie points file (optionaly).
This also apply to RefineSensorModel application as requested in #1872.https://gitlab.orfeo-toolbox.org/orfeotoolbox/otb/-/issues/1618coverity Last Analyzed Feb 01, 20182024-02-26T14:01:49ZRashad Kanavathcoverity Last Analyzed Feb 01, 2018### Description
could we try to fix this time?
because again and again...
https://groups.google.com/d/msg/otb-developers/wXJy9o-jvzw/O4TQifcJCgAJ
### Steps to reproduce
Describe as precisely as possible how to reproduce the bug. Tr...### Description
could we try to fix this time?
because again and again...
https://groups.google.com/d/msg/otb-developers/wXJy9o-jvzw/O4TQifcJCgAJ
### Steps to reproduce
Describe as precisely as possible how to reproduce the bug. Try to isolate a minimal number of steps. Also describe reproducibility (always, random ...).
### Configuration information
OS, OTB version or tag, information related to build (binaries, superbuild, system libs ...)https://gitlab.orfeo-toolbox.org/orfeotoolbox/otb/-/issues/2053Conda environment broken2024-02-26T13:58:02ZPeter KettigConda environment broken### Description
Installing otb via conda from a clean environment results in a broken otb installation due to a missing `libshark`.
### Steps to reproduce
Executing the following commands on my machine (Ubuntu 18.04.2) and conda 4.8.3...### Description
Installing otb via conda from a clean environment results in a broken otb installation due to a missing `libshark`.
### Steps to reproduce
Executing the following commands on my machine (Ubuntu 18.04.2) and conda 4.8.3 results in the error:
```
conda create --name=otbenv python=3.8
conda activate otbenv
conda install -c orfeotoolbox otb
python -c "import otbApplication; print(str(otbApplication.Registry.GetAvailableApplications()))"
```
This gives the following output:
```
2020-05-13 11:30:13 (WARNING): Failed to load libraries from /home/akynos/anaconda2/envs/biophy_otb3/lib/otb/applications/otbapp_TrainVectorClassifier.so while trying to create application TrainVectorClassifier
because: -> libshark.so.0: cannot open shared object file: No such file or directory
2020-05-13 11:30:13 (WARNING): Failed to load libraries from /home/akynos/anaconda2/envs/biophy_otb3/lib/otb/applications/otbapp_VectorClassifier.so while trying to create application VectorClassifier
because: -> libshark.so.0: cannot open shared object file: No such file or directory
[...]
Segmentation fault (core dumped)
```
Installing `libshark-dev` from apt does not resolve the error due to a version mismatch. However, I did find that libshark is already included in the package, except it is located in `lib64` and not `lib`. The error can thus be resolved by executing the following lines:
```
ln -s [...]/anaconda2/envs/otbenv/lib64/libshark.so* [...]/anaconda2/envs/otbenv/lib/
```
### Configuration information
* OTB 7.1.0 from conda
* Ubuntu 18.04.2 LTS
* Clean Python 3.8 conda env
* Conda 4.8.3 (any should work)https://gitlab.orfeo-toolbox.org/orfeotoolbox/otb/-/issues/1934RF variable importance in TrainVectorClassifier2024-02-26T13:54:19ZCédric TraizetRF variable importance in TrainVectorClassifierIn `TrainVectorClassifier`, it is currently not possible to compute and output the variable importance. computing variable importance is an option for random forest in both version 2 and 3 of OpenCV, and it could be nice to expose it in ...In `TrainVectorClassifier`, it is currently not possible to compute and output the variable importance. computing variable importance is an option for random forest in both version 2 and 3 of OpenCV, and it could be nice to expose it in the application
There is already a Boolean to activate this computation in the `RandomForestLearningModel` and a method to output the variable importance as a `cv::Mat`, so all we would have to do is add a parameter for variable importance in `LearningApplicationBase` (in `InitRandomForestsParams()`), and write the cv::Mat to a txt file.
In my opinion the purpose of `TrainVectorClassifier` is to wrap openCV (and Shark) to make it easy to use with remote sensing data, so we should provide as many openCV algorithm parameters as possible, in particular for parameter available both in OpenCV 2 and 3.
Note the comment in otbTrainRandomForests.hxx:70 : "//CalculateVariableImportance not exposed", hinting that not providing this parameter might be a design choice, but I don't know why. Also, "prior" and "terminationCriteria" parameters are available in the Machine Learning model, but not in the application.https://gitlab.orfeo-toolbox.org/orfeotoolbox/otb/-/issues/1704On deprecation2024-02-26T13:53:23ZAntoine RegimbeauOn deprecation# Deprecation
There are loads of mechanisms that can be use to deprecate something (functions, classes, modules...). And they allow devs to avoid use or be warn if using deprecated stuff.
But we need to identify clearly what we want t...# Deprecation
There are loads of mechanisms that can be use to deprecate something (functions, classes, modules...). And they allow devs to avoid use or be warn if using deprecated stuff.
But we need to identify clearly what we want to do.
## In OTB
Today in OTB as deprecation mechanism we have :
* vcl_deprecated header (ITK)
* doxygen tag
* application group
Since !236 we can deprecate a whole module. Once the latter is deprecated, one has to make sure that no other module is depending on it, otherwise it will not appear in the module tree (if `OTB_USE_DEPRECATED` is `off`), one can put the deprecated module as an optional dependency to other.
But we cannot deprecate a class without using an `#if` one the whole `.h` (otherwise it produces a warning with the `_DEPRECATED_EXPORT` macro`
## For a better OTB
CMake offer the possibility to add export with the `[[deprecated]]` attribute in order to warn developer that are using it. (see !236). But that is not enough as there is no option to allow or not the compilation of deprecated stuff.
Among different options we can use there are :
* a deprecated module with submodule (ITK) combined with the `OTB_USE_DEPRECATED` flag
* the use of CMake `_DEPRECATED_EXPORT` combined with the `OTB_USE_DEPRECATED` flag to build or not the deprecated stuff
* ...
Feel free to propose ideas, but do not forget that deprecation can be applied to classes (when template they are quiet hard to exclude from the build), modules, namespaces, and functions. So several mechanisms can be combined to cover all those specs.
This will allow the [wiki page](https://gitlab.orfeo-toolbox.org/orfeotoolbox/otb/wikis/How-to-deprecate) to be updated :
* [ ] How to deprecate a c++ class
* [ ] How to deprecate a c++ method
* [ ] How to deprecate an application
* [X] How to deprecate an OTB module
* [ ] How to disable deprecated featurehttps://gitlab.orfeo-toolbox.org/orfeotoolbox/otb/-/issues/149UTM projection supposed WGS84 ellipsoid2024-02-26T13:47:41ZSébastien DinotUTM projection supposed WGS84 ellipsoid_[Mantis Issue 149](https://bugs.orfeo-toolbox.org//view.php?id=149), reported by echristophe, assigned to jmichel, created: 2010-03-25_
Apparently, when confronted with another UTM projection, for example epsg 23030
which is using and ..._[Mantis Issue 149](https://bugs.orfeo-toolbox.org//view.php?id=149), reported by echristophe, assigned to jmichel, created: 2010-03-25_
Apparently, when confronted with another UTM projection, for example epsg 23030
which is using and ED50 datum (http://en.wikipedia.org/wiki/ED50), OTB supposed that the datum is WGS84 and end up 100m away.
See discussion on otb user list:
http://groups.google.com/group/otb-users/browse_thread/thread/5358d28341046f8d
*1429255266 - julien*We should have a look at supported projections in OTB (with other datum for instance).https://gitlab.orfeo-toolbox.org/orfeotoolbox/otb/-/issues/1615pip install otbApplication2024-02-20T11:04:16ZJordi Ingladapip install otbApplicationProvide Wheel binary packages (https://www.python.org/dev/peps/pep-0427/) containing everything needed to make otbApplication python bindings installable from https://pypi.org/Provide Wheel binary packages (https://www.python.org/dev/peps/pep-0427/) containing everything needed to make otbApplication python bindings installable from https://pypi.org/https://gitlab.orfeo-toolbox.org/orfeotoolbox/otb/-/issues/1617Deploy trained models generated by Deep Learning frameworks2024-02-19T16:21:42ZJordi IngladaDeploy trained models generated by Deep Learning frameworksThe classification and regression filters and applications provided by OTB are only able to use models generated by OTB's training tools (which use OpenCV, Shark or custom OTB models).
With the current DL hype, the models are developed ...The classification and regression filters and applications provided by OTB are only able to use models generated by OTB's training tools (which use OpenCV, Shark or custom OTB models).
With the current DL hype, the models are developed and trained using frameworks like Keras leveraging Tensorflow for instance. OpenCV provides the ability to import Caffe and Tensorflow models.
The same functionalty should be available in OTB in order to deploy remote sensing DL at scale.
It seems that OpenCV has taken the option of not depending on Tensorflow or Caffe but just on protobuffer. This means that they read the models from the protobuffer format but reimplement all the needed layers. This may limit the kinds of models that can be deployed or need to develop custom layers (https://docs.opencv.org/trunk/dc/db1/tutorial_dnn_custom_layers.html).
If OTB moves to OpenCV 3.4 all this comes for free.
The other option is to depend on Tensorflow (just the static C API) but being able to import any model trained outside of OTB.https://gitlab.orfeo-toolbox.org/orfeotoolbox/otb/-/issues/1821Refactoring with FunctorImageFilter2024-02-19T16:17:22ZJulien MichelRefactoring with FunctorImageFilterThis issue aims at tracking refactoring with `FunctorImageFilter`.
* [x] `otb::QuaternaryFunctorImageFilter` is no longer used by any code and can be removed
* [ ] `otb::TernaryFunctorImageFilter` is used by:
* Indices module (needs d...This issue aims at tracking refactoring with `FunctorImageFilter`.
* [x] `otb::QuaternaryFunctorImageFilter` is no longer used by any code and can be removed
* [ ] `otb::TernaryFunctorImageFilter` is used by:
* Indices module (needs deeper refactoring)
* Simulation module (refactoring should be straightforward)
* [x] `otb::BinaryFunctorImageFilter` is not used and can be removed (`itk::BinaryFunctorImageFilter` is used, but not an issue for us)
* [x] `otb::UnaryFunctorImageFilter` is used in:
* Common
* Unmixing
* AppFiltering
* AppClasification
* AppImageUtils
* AppSegmentation
* Projection
* [ ] `otb::UnaryImageFunctorWithVectorImageFilter`
* OpticalCalibration
* Simulation
* Projection
* ImageManipulation
* [ ] `otb::UnaryFunctorVectorImageFilter` only used by:
* Statistics
* [ ] `otb::UnaryFunctorNeighborhoodVectorImageFilter`:
* Used by Edge, ImageManipulation, DimensionalityReduction
* Need to solve #1802 first
* [ ] `otb::UnaryFunctorNeighborhoodImageFilter` :
* OpticalCalibration
* Labelling
* ImageManipulation
* [ ] `otb::BinaryFunctorNeighborhoodImageFilter`:
* ChangeDetection
* RoadExtraction
* Need to solve #1802 firsthttps://gitlab.orfeo-toolbox.org/orfeotoolbox/otb/-/issues/1523Support GDAL Python binding in OTB standalone packages2024-02-19T16:14:53ZManuel GrizonnetSupport GDAL Python binding in OTB standalone packagesShort summary of the requested feature:
OTB packages provides a standalone environment to access to OTB features, especially otb applications. Moreover the application integrates Python bindings to wrap otb applications in a Python scri...Short summary of the requested feature:
OTB packages provides a standalone environment to access to OTB features, especially otb applications. Moreover the application integrates Python bindings to wrap otb applications in a Python script.
It would be nice if the package also integrates Python bindings of GDAL. It will provide users the ability to use jointly otb app and gdal functionalities in the same Python environment.
Technically, OTB superbuild allows to pass extra options for internal gdal configuration:
https://gitlab.orfeo-toolbox.org/orfeotoolbox/otb/blob/develop/SuperBuild/CMake/External_gdal.cmake#L48
There is probably something else to do to deploy GDAL Python libraries in the OTB package.https://gitlab.orfeo-toolbox.org/orfeotoolbox/otb/-/issues/1766Refactor radiometric indices2024-02-19T16:13:58ZVictor PoughonRefactor radiometric indicesFollowing #1756 and !268 a major refactoring of radiometric indices classes will be possible. Discussion and planning in this issue.Following #1756 and !268 a major refactoring of radiometric indices classes will be possible. Discussion and planning in this issue.https://gitlab.orfeo-toolbox.org/orfeotoolbox/otb/-/issues/1531Parameter Refactoring2024-02-19T16:12:25ZAntoine RegimbeauParameter RefactoringIn order to better organizing parameter and be able to write clean code in `Application` class we need to re-factor the parameter class and its derived class.
For this it would be wise to follow the dependency inversion principle, for be...In order to better organizing parameter and be able to write clean code in `Application` class we need to re-factor the parameter class and its derived class.
For this it would be wise to follow the dependency inversion principle, for better code improvement and re-use.
The interfaces will be develop in order to improve the efficiency of the application engine. This can be the first step for a more profound refactoring, with use of parameter traits, and even changes in the Application API.
![param_refc](/uploads/46eefcdac45a52be018905c0a92dcb8d/param_refc.png)
## Parameter base class architecture
The new parameter will have the following members:
```c++
public:
const string key // parameter key set during construction
string name // parameter name
string description // parameter description
bool enabled // flag telling if the parameter is enabled or not
bool mandatory // flag telling if the parameter is mandatory or not
bool userValue // flag telling if the parameter has a user value
enum userLevel // enum telling if the parameter is advanced or basic
enum role // enum telling if parameter is an output or an input
protected:
ParameterGroup * parent // pointer to be able to know from which parameter group the parameter is coming from
```
and the following methods :
```c++
bool GetActiveRecurse() const // return true if the parameter branch is active
virtual string ToString() const = 0 // return the parameter value as a string
virtual void FromString( string val ) = 0 // set the parameter value from a string
bool IsRoot() const // return true if the parameter has no parent
virtual void Reset() // set the parameter value to its default if it has one and to an empty value otherwise
virtual bool HasValue() const // return true if the parameter has a value
bool HasUserValue() const // return true if parameter value has been set by the user
```https://gitlab.orfeo-toolbox.org/orfeotoolbox/otb/-/issues/2111Superbuild archive naming convention2024-02-19T16:10:05ZCédric TraizetSuperbuild archive naming conventionThe current naming convention for superbuild archives is `SuperBuild-archives-MAJOR.MINOR.tar.bz2` for non patch releases and `SuperBuild-archives-MAJOR.MINOR.PATCH.tar.bz2` for patch releases, although this is not always applied correct...The current naming convention for superbuild archives is `SuperBuild-archives-MAJOR.MINOR.tar.bz2` for non patch releases and `SuperBuild-archives-MAJOR.MINOR.PATCH.tar.bz2` for patch releases, although this is not always applied correctly for patch releases, for instance the archive for OTB 6.6.1 is `SuperBuild-archives-6.6.tar.bz2` (probably because the archive has not changed).
This adds unnecessary struggles in deployment scripts/dockerfiles/whatnot using the Superbuild archive because the patch release case should be handled.
I propose to use the same convention `SuperBuild-archives-MAJOR.MINOR.PATCH.tar.bz2` for all releases to simplify things.
For backward compatibility we could create symlinks `SuperBuild-archives-MAJOR.MINOR.tar.bz2` pointing to `SuperBuild-archives-MAJOR.MINOR.PATCH.tar.bz2` for existing releases.https://gitlab.orfeo-toolbox.org/orfeotoolbox/otb/-/issues/1584Produce confidence map for FusionOfClassifications application2024-02-19T16:09:07ZJordi IngladaProduce confidence map for FusionOfClassifications applicationThe FusionOfClassifications application takes several classifications and produces a single classification either by majority voting or by using Dempster-Shafer rule.
A confidence map for each pixel of the classification fusion could be...The FusionOfClassifications application takes several classifications and produces a single classification either by majority voting or by using Dempster-Shafer rule.
A confidence map for each pixel of the classification fusion could be produced. In the case of majority voting, the percentage of voters for the majority class could be used as confidence value. In the case of Dempster-Shafer, the mass of belief of the chosen class may be an appropriate confidence indicator.https://gitlab.orfeo-toolbox.org/orfeotoolbox/otb/-/issues/1524Commit hook to check licence headers2024-02-19T16:05:42ZGuillaume PaseroCommit hook to check licence headersWrite and install a small pre-commit hook to check any modification to the licence headers.
See https://github.com/projectcalico/felix/commit/81695ce2f1dddc23e4e73f0a54643ece84f57521Write and install a small pre-commit hook to check any modification to the licence headers.
See https://github.com/projectcalico/felix/commit/81695ce2f1dddc23e4e73f0a54643ece84f57521https://gitlab.orfeo-toolbox.org/orfeotoolbox/otb/-/issues/1634Set up a bot applying clang-tidy checks on push2024-02-19T16:02:07ZJordi IngladaSet up a bot applying clang-tidy checks on push### What changes will be made and why they would make a better Orfeo ToolBox?
#### High level description
Automatically modify and check periodically the existing OTB code to use C++14 features.
#### Risks and benefits
Risk 1: This cou...### What changes will be made and why they would make a better Orfeo ToolBox?
#### High level description
Automatically modify and check periodically the existing OTB code to use C++14 features.
#### Risks and benefits
Risk 1: This could be a lot of work (but some automation can be achieved https://www.kdab.com/clang-tidy-part-1-modernize-source-code-using-c11c14/) with limited usefulness.
Risk 2: Although C++14 is the official C++ standard for OTB, some C++14 code has been removed so that OTB builds with old compilers. This change could surprise some users.
Benefit 1: Cleaner and safer code.
Benefit 2: This would invite developers to use a modern style when making evolutions to existing code if they find a modern style already.
#### Alternatives for implementations
clang-tidy proposes many modernize checkers:
* modernize-avoid-bind
* modernize-deprecated-headers
* modernize-loop-convert
* modernize-make-shared
* modernize-make-unique
* modernize-pass-by-value
* modernize-raw-string-literal
* modernize-redundant-void-arg
* modernize-replace-auto-ptr
* modernize-shrink-to-fit
* modernize-use-auto
* modernize-use-bool-literals
* modernize-use-default
* modernize-use-emplace
* modernize-use-nullptr
* modernize-use-override
* modernize-use-using
An experimental branch applying some of them (deprecated-headers, loop-convert, use-auto, use-bool-literals, use-nullptr, use-override) to OTB core, tests and examples was available in the old git repos. It built successfully with clang-3.9 and gcc-6.3.
To run clang-tidy on a complete CMake project, on has to run CMake with -DCMAKE_EXPORT_COMPILE_COMMANDS=ON in order to generate a JSON file which can be used by the run-clang-tidy script. Then, one can do:
`run-clang-tidy-3.9.py -header-filter='.*' -checks='-*,modernize-use-auto,modernize-loop-convert,modernize-deprecated-headers,modernize-use-override,modernize-use-nullptr,modernize-use-bool-literals' -fix`
Before running clang-tidy, it is useful to replace some ITK macros like ITK_NULLPTR and ITK_OVERRIDE by the standard keywords nullptr and override:
```
find ./ -type f -print0 | xargs -0 sed -i 's/ITK_OVERRIDE/override/g'
find ./ -type f -print0 | xargs -0 sed -i 's/ITK_NULLPTR/nullptr/g'
```
After running clang-tidy, 2 small corrections have to be made:
`find ./ -type f -print0 | xargs -0 sed -i 's/itkFactorylessNewMacro(auto)/itkFactorylessNewMacro(Self)/g'`
find ./ -type f -print0 | xargs -0 sed -i 's/auto char/auto/g'
More info is available here https://wiki.orfeo-toolbox.org/index.php/Request_for_Comments-36:_Move_OTB_to_C%2B%2B14#Transform_OTB_code_with_clang-tidy.
### Who will be developing the proposed changes?https://gitlab.orfeo-toolbox.org/orfeotoolbox/otb/-/issues/1556Add a nightly platform which test the otb qgis descriptors whith qgis2024-02-19T16:00:07ZMickael SavinaudAdd a nightly platform which test the otb qgis descriptors whith qgisWe need to add this platform to test the descriptors with a version of the otb-qgis plugin (latest tagged version) and a version of QGIS (TBD) (#1509)We need to add this platform to test the descriptors with a version of the otb-qgis plugin (latest tagged version) and a version of QGIS (TBD) (#1509)https://gitlab.orfeo-toolbox.org/orfeotoolbox/otb/-/issues/1553clang warning -Wexpansion-to-defined2024-02-19T15:57:29ZStéphane Albertclang warning -Wexpansion-to-definedHello,
I had a look at clang -Wexpansion-to-defined warning [1] which is part of -Wall in recent version of clang. It is related to the fact that #defined() pre-processor directive is used outside of a #if directive [2]
#if defined( OT...Hello,
I had a look at clang -Wexpansion-to-defined warning [1] which is part of -Wall in recent version of clang. It is related to the fact that #defined() pre-processor directive is used outside of a #if directive [2]
#if defined( OTB_DEBUG ) // no warning
#define IS_OTB_DEBUG defined( OTB_DEBUG )
#if IS_OTB_DEBUG // warning
Fix :
#ifdef OTB_DEBUG
#define IS_OTB_DEBUG 1
#else
#define IS_OTB_DEBUG 0
#endif
#if IS_OTB_DEBUG // no warning
In OTB, we use several complex #define USE_FOO directives to enable easy enabling/disabling of various options based on various switches.
There are 2 options :
1. Ignore this warning (my preferred)
2. Fixed all macro definitions as quoted above.
[1] https://dash.orfeo-toolbox.org/viewBuildError.php?type=1&buildid=315002
[2] https://gcc.gnu.org/ml/gcc-patches/2016-08/msg00738.html