00001 /*!@file Channels/ChannelBase.H The base class for all channel classes */ 00002 00003 // //////////////////////////////////////////////////////////////////// // 00004 // The iLab Neuromorphic Vision C++ Toolkit - Copyright (C) 2001 by the // 00005 // University of Southern California (USC) and the iLab at USC. // 00006 // See http://iLab.usc.edu for information about this project. // 00007 // //////////////////////////////////////////////////////////////////// // 00008 // Major portions of the iLab Neuromorphic Vision Toolkit are protected // 00009 // under the U.S. patent ``Computation of Intrinsic Perceptual Saliency // 00010 // in Visual Environments, and Applications'' by Christof Koch and // 00011 // Laurent Itti, California Institute of Technology, 2001 (patent // 00012 // pending; application number 09/912,225 filed July 23, 2001; see // 00013 // http://pair.uspto.gov/cgi-bin/final/home.pl for current status). // 00014 // //////////////////////////////////////////////////////////////////// // 00015 // This file is part of the iLab Neuromorphic Vision C++ Toolkit. // 00016 // // 00017 // The iLab Neuromorphic Vision C++ Toolkit is free software; you can // 00018 // redistribute it and/or modify it under the terms of the GNU General // 00019 // Public License as published by the Free Software Foundation; either // 00020 // version 2 of the License, or (at your option) any later version. // 00021 // // 00022 // The iLab Neuromorphic Vision C++ Toolkit is distributed in the hope // 00023 // that it will be useful, but WITHOUT ANY WARRANTY; without even the // 00024 // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // 00025 // PURPOSE. See the GNU General Public License for more details. // 00026 // // 00027 // You should have received a copy of the GNU General Public License // 00028 // along with the iLab Neuromorphic Vision C++ Toolkit; if not, write // 00029 // to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, // 00030 // Boston, MA 02111-1307 USA. // 00031 // //////////////////////////////////////////////////////////////////// // 00032 // 00033 // Primary maintainer for this file: Rob Peters <rjpeters@klab.caltech.edu> 00034 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/Channels/ChannelBase.H $ 00035 // $Id: ChannelBase.H 12820 2010-02-11 05:44:51Z itti $ 00036 // 00037 00038 #ifndef CHANNELBASE_H_DEFINED 00039 #define CHANNELBASE_H_DEFINED 00040 00041 #include "Channels/InputFrame.H" 00042 #include "Channels/VisualFeatures.H" 00043 #include "Component/ModelComponent.H" 00044 #include "Component/ModelParam.H" 00045 #include "Image/Image.H" 00046 #include "Image/PixelsTypes.H" 00047 #include "Util/Assert.H" 00048 00049 #include <vector> 00050 00051 class ChannelBase; 00052 class ChannelVisitor; 00053 class Dims; 00054 class FrameOstream; 00055 class ParamMap; 00056 template <class T> class Point2D; 00057 class Rectangle; 00058 class SimTime; 00059 template <class T> class PixRGB; 00060 00061 // ###################################################################### 00062 //! ChannelBase represents the various computational modules in VisualCortex. 00063 class ChannelBase : virtual public ModelComponent 00064 { 00065 public: 00066 //! Default constructor. See ModelComponent.H 00067 /*! @param mgr our ModelManager (see ModelManager.H) 00068 @param descrName descriptive name for human usage 00069 @param tagName name for ParamMap usage 00070 @param vs The VisualFeature implemented by the channel */ 00071 ChannelBase(OptionManager& mgr, const std::string& descrName, 00072 const std::string& tagName, const VisualFeature vs); 00073 00074 //! Virtual destructor ensures proper destruction of derived classes. 00075 virtual ~ChannelBase(); 00076 00077 //! Kill our caches 00078 virtual void reset1(); 00079 00080 /// Default version calls visitChannelBase() on the ChannelVisitor. 00081 virtual void accept(ChannelVisitor& v); 00082 00083 // ###################################################################### 00084 /*! @name VisualFeature functions */ 00085 //@{ 00086 00087 //! Get the visual feature 00088 VisualFeature visualFeature() const; 00089 00090 //! Is the channel homogeneous? 00091 /*! A homogeneous channel is one whose subchannels (and their subs) 00092 have identical VisualFeatures, and those are also identical to 00093 our VisualFeature. Default implementation returns true. */ 00094 virtual bool isHomogeneous() const; 00095 //@} 00096 00097 // ###################################################################### 00098 /*! @name ParamMap functions 00099 00100 Subclasses should be sure to call ChannelBase's version of these 00101 functions within their own implementations, so that 00102 ChannelBase's parameters (such as its weights) are properly 00103 handled. 00104 00105 This interface is different from that provided by 00106 ModelComponent, as here we only save a subset of all of the 00107 Channel's parameters, that are useful, e.g., for object 00108 recognition or feature-based attention biasing. Some of the 00109 values saved here may not even be ModelParam parameters. */ 00110 //@{ 00111 00112 //! Read params from the ParamMap. 00113 virtual void readFrom(const ParamMap& pmap); 00114 00115 //! Write params to the ParamMap. 00116 virtual void writeTo(ParamMap& pmap) const; 00117 00118 //@} 00119 00120 // ###################################################################### 00121 /*! @name Input functions 00122 00123 See documentation on InputFrame for multiple ways in which an 00124 InputFrame can be constructed. */ 00125 //@{ 00126 00127 //! Send a full-blown InputFrame to the channel 00128 void input(const InputFrame& inframe); 00129 00130 //@} 00131 00132 // ###################################################################### 00133 /*! @name Access functions */ 00134 //@{ 00135 00136 //! Query whether the channel is ready to give yield valid output. 00137 /*! In some cases (e.g. with motion channels), it may take several 00138 input frames before the channel is fully initialized. */ 00139 virtual bool outputAvailable() const = 0; 00140 00141 //! Return the dimensions of the output image. 00142 virtual Dims getMapDims() const = 0; 00143 00144 //! Check if we've received any input images yet. 00145 bool hasInput() const; 00146 00147 //! Return the dimensions of the most recent input image. 00148 /*! Will LFATAL() if hasInput() is false. */ 00149 Dims getInputDims() const; 00150 00151 //! Return the number of feature maps represented by this channel. 00152 virtual uint numSubmaps() const = 0; 00153 00154 //! Get the feature map at the given index. 00155 /*! This function is intended to be implemented by subclasses so 00156 that it recurses into any nested channels, mapping nested 00157 submaps into a linear sequence of indices. */ 00158 virtual Image<float> getSubmap(const uint index) const = 0; 00159 00160 //! get raw CS map; part of getSubmap() 00161 virtual Image<float> getRawCSmap(const uint idx) const {LFATAL("Not implemented yet."); return Image<float>();} 00162 00163 //! Get the name/description of the feature map at the given index. 00164 /*! This function is intended to be implemented by subclasses so 00165 that it recurses into any nested channels, mapping nested 00166 submaps into a linear sequence of indices. The output of this 00167 function is intended only to be human-readable (e.g. for 00168 labeling image displays), and does not have to follow any 00169 particular parseable syntax. */ 00170 virtual std::string getSubmapName(const uint index) const = 0; 00171 00172 //! Get the name/description of the feature map at the given index, short version 00173 virtual std::string getSubmapNameShort(const uint index) const = 0; 00174 00175 00176 virtual void getFeatures(const Point2D<int>& locn, 00177 std::vector<float>& mean) const = 0; 00178 00179 virtual void getFeaturesBatch(std::vector<Point2D<int>*> *locn, 00180 std::vector<std::vector<float> > *mean, 00181 int *count) const = 0; 00182 00183 //! The output will be the size of the feature map level in the pyramid. 00184 /*! (I.e., the size of the output is given by getMapDims(). */ 00185 virtual Image<float> getOutput() = 0; 00186 00187 //! Save our various maps using a FrameOstream 00188 /*! The default implementation is a no-op; subclasses can override 00189 to do something interesting */ 00190 virtual void saveResults(const nub::ref<FrameOstream>& ofs); 00191 00192 //! Subclasses override this to clear any caches they may maintain. 00193 /*! <b>Subclasses must be sure to explicitly call their base class's 00194 version of this function!</b>. This function will be called by 00195 ChannelBase when a new input image is received, or when new 00196 parameters are read from a ParamMap, etc. Subclasses may also 00197 call this function when they know that caches may have become 00198 invalid. Calling this explicitly after you have obtained the 00199 output from a channel may save you some memory. */ 00200 virtual void killCaches(); 00201 00202 //@} 00203 00204 protected: 00205 //! Subclasses override this implementation of the input() function. 00206 /*! This will be called by one of the input() methods. For 00207 efficiency reasons (e.g. network bandwidth in parallel code), it 00208 is possible that the color or luminance input may be null, 00209 although the code should be wired up properly so that given 00210 subclasses do not receive a null input that they in fact 00211 need. Subclasses should be sure to ASSERT that any used inputs 00212 are non-null. */ 00213 virtual void doInput(const InputFrame& inframe) = 0; 00214 00215 // This is used only by SingleOpponentChannel::singleOpponentInput() 00216 void setInputDims(const Dims& dims); 00217 00218 private: 00219 ChannelBase(const ChannelBase&); // not allowed 00220 ChannelBase& operator=(const ChannelBase&); // not allowed 00221 00222 NModelParam<VisualFeature> itsVisFeature; 00223 00224 Dims itsInputDims; 00225 }; 00226 00227 00228 /* So things look consistent in everyone's emacs... */ 00229 /* Local Variables: */ 00230 /* indent-tabs-mode: nil */ 00231 /* End: */ 00232 00233 #endif // !CHANNELBASE_H_DEFINED