From c5a666e6c2c20eb5c1f990b6e82203e4f1c31ca5 Mon Sep 17 00:00:00 2001 From: jaco Date: Wed, 9 Jul 2014 20:11:23 +0200 Subject: [PATCH] documentation added (first part) --- .../doc/common_interfaces_saliency.rst | 67 ++++++++++++++++ .../doc/common_interfaces_saliency.rst~ | 67 ++++++++++++++++ modules/saliency/doc/misc | 1 + .../doc/motion_saliency_algorithms.rst | 0 .../saliency/doc/objectness_algorithms.rst | 0 modules/saliency/doc/pics/saliency.png | Bin 0 -> 69091 bytes modules/saliency/doc/saliency.rst | 53 +++++++++++++ modules/saliency/doc/saliency.rst~ | 52 +++++++++++++ modules/saliency/doc/saliencyAPI.rst~ | 34 ++++++++ modules/saliency/doc/saliency_categories.rst | 6 ++ modules/saliency/doc/saliency_categories.rst~ | 6 ++ .../doc/static_saliency_algorithms.rst | 5 ++ .../doc/static_saliency_algorithms.rst~ | 5 ++ .../saliency/saliencySpecializedClasses.hpp | 73 +++++++----------- 14 files changed, 325 insertions(+), 44 deletions(-) create mode 100644 modules/saliency/doc/common_interfaces_saliency.rst create mode 100644 modules/saliency/doc/common_interfaces_saliency.rst~ create mode 160000 modules/saliency/doc/misc create mode 100644 modules/saliency/doc/motion_saliency_algorithms.rst create mode 100644 modules/saliency/doc/objectness_algorithms.rst create mode 100644 modules/saliency/doc/pics/saliency.png create mode 100644 modules/saliency/doc/saliency.rst create mode 100644 modules/saliency/doc/saliency.rst~ create mode 100644 modules/saliency/doc/saliencyAPI.rst~ create mode 100644 modules/saliency/doc/saliency_categories.rst create mode 100644 modules/saliency/doc/saliency_categories.rst~ create mode 100644 modules/saliency/doc/static_saliency_algorithms.rst create mode 100644 modules/saliency/doc/static_saliency_algorithms.rst~ diff --git a/modules/saliency/doc/common_interfaces_saliency.rst b/modules/saliency/doc/common_interfaces_saliency.rst new file mode 100644 index 000000000..34193e351 --- /dev/null +++ b/modules/saliency/doc/common_interfaces_saliency.rst @@ -0,0 +1,67 @@ +Common Interfaces of Saliency +============================ + +.. highlight:: cpp + + +Saliency : Algorithm +------------------- + +.. ocv:class:: Saliency + +Base abstract class for Saliency algorithms:: + + class CV_EXPORTS_W Saliency : public virtual Algorithm + { + public: + + virtual ~Saliency(); + + static Ptr create( const String& saliencyType ); + + bool computeSaliency( const InputArray image, OutputArray saliencyMap ); + + String getClassName() const; + }; + + +Saliency::create +--------------- + +Creates a specialized saliency algorithm by its name. + +.. ocv:function:: static Ptr create( const String& saliencyType ); + + :param saliencyType: saliency Type + +The following saliency types are now supported: + +* ``"SPECTRAL_RESIDUAL"`` -- :ocv:class:`StaticSaliencySpectralResidual` + +* ``"BING"`` -- :ocv:class:`ObjectnessBING` + + +Saliency::computeSaliency +------------------------ + +Performs all the operations, according to the specific algorithm created, to obtain the saliency map. + +.. ocv:function:: bool computeSaliency( const InputArray image, OutputArray saliencyMap ); + + :param image: image or set of input images. According to InputArray proxy and to the needs of different algorithms (currently plugged), the param image may be Mat or vector + :param saliencyMap: saliency map. According to OutputArray proxy and to the results given by different algorithms (currently plugged), the saliency map may be a Mat or vector (BING results). + +Saliency::getClassName +--------------------- + +Get the name of the specific Saliency Algorithm. + +.. ocv:function:: String getClassName() const; + + + + + + + + diff --git a/modules/saliency/doc/common_interfaces_saliency.rst~ b/modules/saliency/doc/common_interfaces_saliency.rst~ new file mode 100644 index 000000000..6f5159ac4 --- /dev/null +++ b/modules/saliency/doc/common_interfaces_saliency.rst~ @@ -0,0 +1,67 @@ +Common Interfaces of Saliency +============================ + +.. highlight:: cpp + + +Saliency : Algorithm +------------------- + +.. ocv:class:: Saliency + +Base abstract class for Saliency algorithms:: + +class CV_EXPORTS_W Saliency : public virtual Algorithm +{ + public: + + virtual ~Saliency(); + + static Ptr create( const String& saliencyType ); + + bool computeSaliency( const InputArray image, OutputArray saliencyMap ); + + String getClassName() const; +}; + + +Saliency::create +--------------- + +Creates a specialized saliency algorithm by its name. + +.. ocv:function:: static Ptr create( const String& saliencyType ); + + :param saliencyType: saliency Type + +The following saliency types are now supported: + +* ``"SPECTRAL_RESIDUAL"`` -- :ocv:class:`StaticSaliencySpectralResidual` + +* ``"BING"`` -- :ocv:class:`ObjectnessBING` + + +Saliency::computeSaliency +------------------------ + +Performs all the operations, according to the specific algorithm created, to obtain the saliency map. + +.. ocv:function:: bool computeSaliency( const InputArray image, OutputArray saliencyMap ); + + :param image: image or set of input images. According to InputArray proxy and to the needs of different algorithms (currently plugged), the param image may be Mat or vector + :param saliencyMap: saliency map. According to OutputArray proxy and to the results given by different algorithms (currently plugged), the saliency map may be a Mat or vector (BING results). + +Saliency::getClassName +--------------------- + +Get the name of the specific Saliency Algorithm. + +.. ocv:function:: String getClassName() const; + + + + + + + + diff --git a/modules/saliency/doc/misc b/modules/saliency/doc/misc new file mode 160000 index 000000000..14511ac1c --- /dev/null +++ b/modules/saliency/doc/misc @@ -0,0 +1 @@ +Subproject commit 14511ac1cc8564e1aee153efae4bf0453d3e645e diff --git a/modules/saliency/doc/motion_saliency_algorithms.rst b/modules/saliency/doc/motion_saliency_algorithms.rst new file mode 100644 index 000000000..e69de29bb diff --git a/modules/saliency/doc/objectness_algorithms.rst b/modules/saliency/doc/objectness_algorithms.rst new file mode 100644 index 000000000..e69de29bb diff --git a/modules/saliency/doc/pics/saliency.png b/modules/saliency/doc/pics/saliency.png new file mode 100644 index 0000000000000000000000000000000000000000..533d60f942f56b2d8d67f1c2066f335f21bdb582 GIT binary patch literal 69091 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

}nNB;7T`WMO) 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

t)_f#OLJjvLS zht^afs4;W_d#cKGKyT8MFB*M~A@bs@hdlx}SJQ_X6_!29>^41-f8;|LM#f&^W3=s!%_Tqwnq zkL*1h+bZ@YZYVapOHq#5%+K9>`XiZ}rk*MLzKKvM=89>rV|Q4~4o#%f8`8;TFM5Dl z28)-meisIbDY+Ej5pt%cNrPg*x-f+FYWbmq7IjRpt+mtdoXY|JctXEepf7l>(lIr{ z;M#4&FQv>e&vjGx_gY+Mlja}Nfe}}S;&aSJXpvqXmIR=cKn%m1wA9Wp4QJPd zTyeiGqg}77hsf2V2AQDBkUjOlvi!O#^kPYLsL z(GE|%KdCjcehsR9B!?IKq>aieID~kT51_e2yxG2GJj3A-Mm~5wH|*Ug!3$??Rv`WP zP3m%Xum1R$FM3zVA?zWQoE^ize+ThJ`!Q79sF}Z0Ay{MSNdNX8_^mjeQY(Na3=ZPp z=VN%(*apbBZ)AekwIwD#1{&Dm#i{DF3rcV8KB{SG1QOrm{fkHD8;LH8VKIQWwNiyQg R6$sqVvQkQt+4l^+{s(;(oDl#3 literal 0 HcmV?d00001 diff --git a/modules/saliency/doc/saliency.rst b/modules/saliency/doc/saliency.rst new file mode 100644 index 000000000..686430c8b --- /dev/null +++ b/modules/saliency/doc/saliency.rst @@ -0,0 +1,53 @@ +Saliency API +============ + +.. highlight:: cpp + +Many computer vision applications may benefit from understanding where humans focus given a scene. Other than cognitively understanding the way human perceive images and scenes, finding salient regions and objects in the images helps various tasks such as speeding up object detection, object recognition, object tracking and content-aware image editing. + +About the saliency, there is a rich literature but the development is very fragmented. The principal purpose of this API is to give a +unique interface, a unique framework for use and plug sever saliency algorithms, also with very different nature and methodology, but they share the same purpose, organizing algorithms into three main categories: + +**Static Saliency**: algorithms belonging to this category, exploit different image features that allow to detect salient objects in a non dynamic scenarios. + +**Motion Saliency**: algorithms belonging to this category, are particularly focused to detect salient objects over time (hence also over frame), then there is a temporal component sealing cosider that allows to detect "moving" objects as salient, meaning therefore also the more general sense of detection the changes in the scene. + +**Objectness**: Objectness is usually represented as a value which reflects how likely an image window covers an object of any category. Algorithms belonging to this category, avoid making decisions early on, by proposing a small number of category-independent proposals, that are expected to cover all objects in an image. Being able to perceive objects before identifying them is closely related to bottom up visual attention (saliency). + + +UML design: + +----------- + +**Saliency diagram** + +.. image:: pics/saliency.png + :width: 80% + :alt: Saliency diagram + :align: center + +To see how API works, try tracker demo: https://github.com/fpuja/opencv_contrib/blob/saliencyModuleDevelop/modules/saliency/samples/computeSaliency.cpp + + +.. note:: This Tracking API has been designed with PlantUML. If you modify this API please change UML files under modules/tracking/misc/ + +The following reference was used in the API + +.. [SR] Hou, Xiaodi, and Liqing Zhang. "Saliency detection: A spectral residual approach." Computer Vision and Pattern Recognition, 2007. CVPR'07. IEEE Conference on. IEEE, 2007. + +.. [BING] Cheng, Ming-Ming, et al. "BING: Binarized normed gradients for objectness estimation at 300fps." IEEE CVPR. 2014. + + +Saliency classes: +---------------- + +.. toctree:: + :maxdepth: 2 + + common_interfaces_saliency + saliency_categories + static_saliency_algorithms + motion_saliency_algorithms + objectness_algorithms + + diff --git a/modules/saliency/doc/saliency.rst~ b/modules/saliency/doc/saliency.rst~ new file mode 100644 index 000000000..e202f40ae --- /dev/null +++ b/modules/saliency/doc/saliency.rst~ @@ -0,0 +1,52 @@ +Saliency API +============ + +.. highlight:: cpp + +Many computer vision applications may benefit from understanding where humans focus given a scene. Other than cognitively understanding the way human perceive images and scenes, finding salient regions and objects in the images helps various tasks such as speeding up object detection, object recognition, object tracking and content-aware image editing. + +About the saliency, there is a rich literature but the development is very fragmented. The principal purpose of this API is to give a +unique interface, a unique framework for use and plug sever saliency algorithms, also with very different nature and methodology, but they share the same purpose, organizing algorithms into three main categories: + +**Static Saliency**: algorithms belonging to this category, exploit different image features that allow to detect salient objects in a non dynamic scenarios. + +**Motion Saliency**: algorithms belonging to this category, are particularly focused to detect salient objects over time (hence also over frame), then there is a temporal component sealing cosider that allows to detect "moving" objects as salient, meaning therefore also the more general sense of detection the changes in the scene. + +**Objectness**: Objectness is usually represented as a value which reflects how likely an image window covers an object of any category. Algorithms belonging to this category, avoid making decisions early on, by proposing a small number of category-independent proposals, that are expected to cover all objects in an image. Being able to perceive objects before identifying them is closely related to bottom up visual attention (saliency). + + +UML design: + +----------- + +**Saliency diagram** + +.. image:: pics/saliency.png + :width: 80% + :alt: Saliency diagram + :align: center + +To see how API works, try tracker demo: https://github.com/fpuja/opencv_contrib/blob/saliencyModuleDevelop/modules/saliency/samples/computeSaliency.cpp + + +.. note:: This Tracking API has been designed with PlantUML. If you modify this API please change UML files under modules/tracking/misc/ + +The following reference was used in the API + +.. [SR] Hou, Xiaodi, and Liqing Zhang. "Saliency detection: A spectral residual approach." Computer Vision and Pattern Recognition, 2007. CVPR'07. IEEE Conference on. IEEE, 2007. + +.. [BING] Cheng, Ming-Ming, et al. "BING: Binarized normed gradients for objectness estimation at 300fps." IEEE CVPR. 2014. + + +Saliency classes: +---------------- + +.. toctree:: + :maxdepth: 2 + + saliency_categories + static_saliency_algorithms + motion_saliency_algorithms + objectness_algorithms + + diff --git a/modules/saliency/doc/saliencyAPI.rst~ b/modules/saliency/doc/saliencyAPI.rst~ new file mode 100644 index 000000000..65292c1d9 --- /dev/null +++ b/modules/saliency/doc/saliencyAPI.rst~ @@ -0,0 +1,34 @@ +Saliency API +============ + +.. highlight:: cpp + + +UML design: +----------- + +**Saliency diagram** + +.. image:: pics/saliency.png + :width: 80% + :alt: Tracker diagram + :align: center + +To see how API works, try tracker demo: + + +.. note:: This Tracking API has been designed with PlantUML. If you modify this API please change UML files under modules/tracking/misc/ + +The following reference was used in the API + +.. [SR] Hou, Xiaodi, and Liqing Zhang. "Saliency detection: A spectral residual approach." Computer Vision and Pattern Recognition, 2007. CVPR'07. IEEE Conference on. IEEE, 2007. + +.. [BING] Cheng, Ming-Ming, et al. "BING: Binarized normed gradients for objectness estimation at 300fps." IEEE CVPR. 2014. + + +Saliency classes: +---------------- + +.. toctree:: + :maxdepth: 2 + diff --git a/modules/saliency/doc/saliency_categories.rst b/modules/saliency/doc/saliency_categories.rst new file mode 100644 index 000000000..984458774 --- /dev/null +++ b/modules/saliency/doc/saliency_categories.rst @@ -0,0 +1,6 @@ +Saliency categories +============================ + +.. highlight:: cpp + + diff --git a/modules/saliency/doc/saliency_categories.rst~ b/modules/saliency/doc/saliency_categories.rst~ new file mode 100644 index 000000000..70d682f9c --- /dev/null +++ b/modules/saliency/doc/saliency_categories.rst~ @@ -0,0 +1,6 @@ +Common Interfaces of Tracker +============================ + +.. highlight:: cpp + + diff --git a/modules/saliency/doc/static_saliency_algorithms.rst b/modules/saliency/doc/static_saliency_algorithms.rst new file mode 100644 index 000000000..5284c6fea --- /dev/null +++ b/modules/saliency/doc/static_saliency_algorithms.rst @@ -0,0 +1,5 @@ +Static Saliency algorithms +============================ + +.. highlight:: cpp + diff --git a/modules/saliency/doc/static_saliency_algorithms.rst~ b/modules/saliency/doc/static_saliency_algorithms.rst~ new file mode 100644 index 000000000..ee922c31a --- /dev/null +++ b/modules/saliency/doc/static_saliency_algorithms.rst~ @@ -0,0 +1,5 @@ +Static Saliency categories +============================ + +.. highlight:: cpp + diff --git a/modules/saliency/include/opencv2/saliency/saliencySpecializedClasses.hpp b/modules/saliency/include/opencv2/saliency/saliencySpecializedClasses.hpp index 91e5e6968..8787ae36a 100644 --- a/modules/saliency/include/opencv2/saliency/saliencySpecializedClasses.hpp +++ b/modules/saliency/include/opencv2/saliency/saliencySpecializedClasses.hpp @@ -46,24 +46,10 @@ #include "BING/kyheader.h" #include "BING/ValStructVec.h" #include "BING/FilterTIG.h" -#include "SuBSENSE/BackgroundSubtractorLBSP.h" #include #include #include -//! defines the default value for BackgroundSubtractorLBSP::m_fRelLBSPThreshold -#define BGSSUBSENSE_DEFAULT_LBSP_REL_SIMILARITY_THRESHOLD (0.333f) -//! defines the default value for BackgroundSubtractorLBSP::m_nDescDistThreshold -#define BGSSUBSENSE_DEFAULT_DESC_DIST_THRESHOLD (3) -//! defines the default value for BackgroundSubtractorSuBSENSE::m_nMinColorDistThreshold -#define BGSSUBSENSE_DEFAULT_COLOR_DIST_THRESHOLD (30) -//! defines the default value for BackgroundSubtractorSuBSENSE::m_nBGSamples -#define BGSSUBSENSE_DEFAULT_NB_BG_SAMPLES (50) -//! defines the default value for BackgroundSubtractorSuBSENSE::m_nRequiredBGSamples -#define BGSSUBSENSE_DEFAULT_REQUIRED_NB_BG_SAMPLES (2) -//! defines the default value for BackgroundSubtractorSuBSENSE::m_nSamplesForMovingAvgs -#define BGSSUBSENSE_DEFAULT_N_SAMPLES_FOR_MV_AVGS (25) - namespace cv { @@ -99,10 +85,6 @@ class CV_EXPORTS_W StaticSaliencySpectralResidual : public StaticSaliency /************************************ Specific Motion Saliency Specialized Classes ************************************/ - - - - /************************************ Specific Objectness Specialized Classes ************************************/ /** @@ -119,35 +101,10 @@ class CV_EXPORTS_W ObjectnessBING : public Objectness void read(); void write() const; - // Load trained model. - int loadTrainedModel( std::string modelName = "" ); // Return -1, 0, or 1 if partial, none, or all loaded - - // Get potential bounding boxes, each of which is represented by a Vec4i for (minX, minY, maxX, maxY). - // The trained model should be prepared before calling this function: loadTrainedModel() or trainStageI() + trainStageII(). - // Use numDet to control the final number of proposed bounding boxes, and number of per size (scale and aspect ratio) - void getObjBndBoxes( CMat &img3u, ValStructVec &valBoxes, int numDetPerSize = 120 ); - void getObjBndBoxesForSingleImage( Mat img, ValStructVec &boxes, int numDetPerSize ); vector getobjectnessValues(); - - void setColorSpace( int clr = MAXBGR ); void setTrainingPath( string trainingPath ); void setBBResDir( string resultsDir ); - // Read matrix from binary file - static bool matRead( const std::string& filename, Mat& M ); - - enum - { - MAXBGR, - HSV, - G - }; - - inline static float LoG( float x, float y, float delta ) - { - float d = - ( x * x + y * y ) / ( 2 * delta * delta ); - return -1.0f / ( (float) ( CV_PI ) * pow( delta, 4 ) ) * ( 1 + d ) * exp( d ); - } // Laplacian of Gaussian protected: bool computeSaliencyImpl( const InputArray src, OutputArray dst ); @@ -155,6 +112,14 @@ class CV_EXPORTS_W ObjectnessBING : public Objectness private: // Parameters + + enum + { + MAXBGR, + HSV, + G + }; + double _base, _logBase; // base for window size quantization int _W; // As described in the paper: #Size, Size(_W, _H) of feature window. int _NSS; // Size for non-maximal suppress @@ -177,7 +142,27 @@ class CV_EXPORTS_W ObjectnessBING : public Objectness //vector objectnessBoundingBox; private: - // Help functions + // functions + + inline static float LoG( float x, float y, float delta ) + { + float d = - ( x * x + y * y ) / ( 2 * delta * delta ); + return -1.0f / ( (float) ( CV_PI ) * pow( delta, 4 ) ) * ( 1 + d ) * exp( d ); + } // Laplacian of Gaussian + + // Read matrix from binary file + static bool matRead( const std::string& filename, Mat& M ); + + void setColorSpace( int clr = MAXBGR ); + + // Load trained model. + int loadTrainedModel( std::string modelName = "" ); // Return -1, 0, or 1 if partial, none, or all loaded + + // Get potential bounding boxes, each of which is represented by a Vec4i for (minX, minY, maxX, maxY). + // The trained model should be prepared before calling this function: loadTrainedModel() or trainStageI() + trainStageII(). + // Use numDet to control the final number of proposed bounding boxes, and number of per size (scale and aspect ratio) + void getObjBndBoxes( CMat &img3u, ValStructVec &valBoxes, int numDetPerSize = 120 ); + void getObjBndBoxesForSingleImage( Mat img, ValStructVec &boxes, int numDetPerSize ); bool filtersLoaded() {