CudaHmaxCBCL.C

Go to the documentation of this file.
00001 /*!@file CUDA/CudaHmaxCBCL.C Wrapper class for CBCL CUDA model */
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: Daniel Parks <danielfp@usc.edu>
00034 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/CUDA/CudaHmaxCBCL.C $
00035 // $Id: CudaHmaxCBCL.C 14154 2010-10-21 05:07:25Z dparks $
00036 //
00037 #include "CUDA/CudaHmaxCBCL.H"
00038 #include "Image/Image.H"
00039 #include "Raster/Raster.H"
00040 #include "Util/log.H"
00041 
00042 #include <fstream>
00043 #include <iostream>
00044 #include <iomanip>
00045 #include <string>
00046 #include <unistd.h>
00047 #include <cstdlib>
00048 #include <vector>
00049 #include <dirent.h>
00050 
00051 
00052 
00053 CudaHmaxCBCL::CudaHmaxCBCL()
00054 {
00055   nc0patches = 0;
00056   nc1patches = 0;
00057 }
00058 
00059 CudaHmaxCBCL::CudaHmaxCBCL(std::string c0patchFile, std::string c1patchFile)
00060 {
00061   loadC0(c0patchFile);
00062   loadC1(c1patchFile);
00063 }
00064 
00065 CudaHmaxCBCL::~CudaHmaxCBCL()
00066 {
00067   if(nc0patches > 0)
00068     cpu_release_images(&c0patches,nc0patches);
00069   if(nc1patches > 0)
00070     cpu_release_images(&c1patches,nc1patches);
00071 }
00072 
00073 void CudaHmaxCBCL::loadC0(std::string c0patchFile)
00074 {
00075   readFilters(c0patchFile,&c0patches,&nc0patches);
00076 }
00077 
00078 void CudaHmaxCBCL::loadC1(std::string c1patchFile)
00079 {
00080   readFilters(c1patchFile,&c1patches,&nc1patches);
00081 }
00082 
00083 float *CudaHmaxCBCL::getC2Features()
00084 {
00085   return c2b;
00086 }
00087 
00088 int CudaHmaxCBCL::numC2Features()
00089 {
00090   return nc2units;
00091 }
00092 
00093 void CudaHmaxCBCL::writeOutFeatures(std::string c2FileName, int id, bool clearFile)
00094 {
00095   std::ofstream c2File;
00096   if(clearFile)
00097     c2File.open(c2FileName.c_str(),std::ios::out);
00098   else
00099     c2File.open(c2FileName.c_str(),std::ios::app);
00100   if (c2File.is_open()) {
00101     c2File << id << " ";
00102     for(int i=0;i<nc2units;i++) {
00103       c2File << std::setiosflags(std::ios::fixed) << std::setprecision(10) <<
00104         (i+1) << ":" << c2b[i] << " ";
00105     }
00106     c2File << std::endl;
00107   }
00108   c2File.close();
00109 }
00110 
00111 void CudaHmaxCBCL::extractC1Patch(Image<float> &stim, int index, int patchSize)
00112 {
00113   getC1(stim.getArrayPtr(),stim.getWidth(),stim.getHeight(),true);
00114   // Determine the width, height and depth of your c1 bandinfo
00115   int targC1Band = nc1bands/2;
00116   int w = cpu_get_width(&c1,nc1bands,targC1Band);
00117   int h = cpu_get_height(&c1,nc1bands,targC1Band);
00118   int wStart = floor((rand()-1.0F)/RAND_MAX*(w-patchSize));
00119   int hStart = floor((rand()-1.0F)/RAND_MAX*(h-patchSize));
00120   assert(wStart>=0);
00121   assert(hStart>=0);
00122   // Copy c1 output
00123   int xPatch=0;
00124   for(int x=wStart;x<wStart+patchSize;x++)
00125     {
00126       int yPatch=0;
00127       for(int y=hStart;y<hStart+patchSize;y++)
00128         {
00129           cpu_copy_filter(&c1patches,nc1patches,index,xPatch,yPatch,&c1,targC1Band,x,y);
00130           yPatch++;
00131         }
00132       xPatch++;
00133     }
00134   clearC1();
00135   printf("Loaded patch %d\n",index);
00136 
00137 }
00138 
00139 void CudaHmaxCBCL::initC1Patches(int numPatches, int patchSize, int patchDepth)
00140 {
00141  cpu_create_filters(&c1patches,numPatches,patchSize,patchSize,patchDepth);
00142  nc1patches = numPatches;
00143 }
00144 
00145 void CudaHmaxCBCL::extractC1Patches(std::vector<std::string> files, int numPatches, int patchSize, int patchDepth)
00146 {
00147   int numPosTrainImages = files.size();
00148   Image<float> stim;
00149 
00150   std::srand(time(0));
00151 
00152   initC1Patches(numPatches,patchSize,patchDepth);
00153 
00154   for(int i=0;i<numPatches;i++){
00155     // Randomly select an image from the list
00156     unsigned int imInd = static_cast<unsigned int>(floor((rand()-1.0F)/RAND_MAX*numPosTrainImages));
00157     stim = Raster::ReadGrayNTSC(files[imInd].c_str());
00158     extractC1Patch(stim,i,patchSize);
00159   }
00160 
00161 }
00162 
00163 void CudaHmaxCBCL::writeOutC1Patches(std::string filename)
00164 {
00165   writeFilters(c1patches,nc1patches,filename.c_str());
00166 }
00167 
00168 void CudaHmaxCBCL::readFilters(std::string filename,band_info** ppfilt,int* pnfilts)
00169 {
00170   cpu_read_filters(filename.c_str(),ppfilt,pnfilts);
00171 }
00172 
00173 void CudaHmaxCBCL::writeFilters(band_info* pfilt,int nfilts, std::string filename)
00174 {
00175   cpu_write_filters(pfilt,nfilts,filename.c_str());
00176 }
00177 
00178 
00179 void CudaHmaxCBCL::getC1(const float *pimg, int width, int height, bool copy)
00180 {
00181   cpu_create_c0(pimg,width,height,&c0,&nc0bands,1.113,12);
00182   gpu_s_norm_filter(c0,nc0bands,c0patches,nc0patches,&s1,&ns1bands,false);
00183   gpu_c_local(s1,ns1bands,8,3,2,2,&c1,&nc1bands,copy);
00184 }
00185 
00186 void CudaHmaxCBCL::clearC1()
00187 {
00188   cpu_release_images(&c0,nc0bands);
00189   cpu_release_images(&s1,ns1bands);
00190   cpu_release_images(&c1,nc1bands);
00191 }
00192 
00193 void CudaHmaxCBCL::getC2(const float *pimg, int width, int height)
00194 {
00195   getC1(pimg,width,height,false);
00196   gpu_s_rbf(c1,nc1bands,c1patches,nc1patches,sqrtf(0.5),&s2,&ns2bands);
00197   cpu_c_global(s2,ns2bands,&c2b,&nc2units);
00198   clearC1();
00199   cpu_release_images(&s2,ns2bands);
00200   // printf("S1bands %d\nC1bands %d\nC1patches %d\nS2bands %d\nC2units %d\n",
00201   //          ns1bands,nc1bands,nc1patches,ns2bands,nc2units);
00202 }
00203 
00204 void CudaHmaxCBCL::clearC2()
00205 {
00206   delete [] c2b;
00207 }
00208 
00209 
00210 std::vector<std::string> CudaHmaxCBCL::readDir(std::string inName)
00211 {
00212         DIR *dp = opendir(inName.c_str());
00213         if(dp == NULL)
00214         {
00215           LFATAL("Directory does not exist %s",inName.c_str());
00216         }
00217         dirent *dirp;
00218         std::vector<std::string> fList;
00219         while ((dirp = readdir(dp)) != NULL ) {
00220                 if (dirp->d_name[0] != '.')
00221                         fList.push_back(inName + '/' + std::string(dirp->d_name));
00222         }
00223         LINFO("%"ZU" files in the directory\n", fList.size());
00224         LINFO("file list : \n");
00225         for (unsigned int i=0; i<fList.size(); i++)
00226                 LINFO("\t%s", fList[i].c_str());
00227         std::sort(fList.begin(),fList.end());
00228         return fList;
00229 }
00230 
00231 // ######################################################################
00232 std::vector<std::string> CudaHmaxCBCL::readList(std::string inName)
00233 {
00234   std::ifstream inFile;
00235   inFile.open(inName.c_str(),std::ios::in);
00236   if(!inFile){
00237     LFATAL("Unable to open image path list file: %s",inName.c_str());
00238   }
00239   std::string sLine;
00240   std::vector<std::string> fList;
00241   while (std::getline(inFile, sLine)) {
00242       std::cout << sLine << std::endl;
00243       fList.push_back(sLine);
00244   }
00245   LINFO("%"ZU" paths in the file\n", fList.size());
00246   LINFO("file list : \n");
00247   for (unsigned int i=0; i<fList.size(); i++)
00248     LINFO("\t%s", fList[i].c_str());
00249   inFile.close();
00250   return fList;
00251 }
00252 
00253 
Generated on Sun May 8 08:40:36 2011 for iLab Neuromorphic Vision Toolkit by  doxygen 1.6.3