40 using namespace KKMLL;
46 const KKStr& fileName,
47 const KKStr& funcName,
49 const KKStr& errorDesc
52 log.Level (-1) << endl
53 << funcName <<
" *** ERROR ***" << endl
54 <<
" File [" << fileName <<
"]" << endl
55 <<
" LineCount[" << lineCount <<
"]" << endl
56 <<
" Error [" << errorDesc <<
"]" << endl
64 vector<FeatureFileIOPtr>*
FeatureFileIO::registeredDrivers = NULL;
68 std::vector<FeatureFileIOPtr>*
FeatureFileIO::RegisteredDrivers ()
70 if (registeredDrivers == NULL)
72 RegisterAllDrivers ();
75 return registeredDrivers;
83 if (!registeredDrivers)
85 RegisterAllDrivers ();
86 registeredDrivers =
new std::vector<FeatureFileIOPtr> ();
89 registeredDrivers->push_back (_driver);
100 if (registeredDrivers == NULL)
102 registeredDrivers =
new std::vector<FeatureFileIOPtr> ();
103 registeredDrivers->push_back (
new FeatureFileIOArff ());
104 registeredDrivers->push_back (
new FeatureFileIOC45 ());
105 registeredDrivers->push_back (
new FeatureFileIOColumn ());
106 registeredDrivers->push_back (
new FeatureFileIODstWeb ());
108 registeredDrivers->push_back (
new FeatureFileIORoberts ());
109 registeredDrivers->push_back (
new FeatureFileIOSparse ());
110 registeredDrivers->push_back (
new FeatureFileIOUCI ());
111 atexit (FeatureFileIO::FinalCleanUp);
129 <<
"FeatureFileIO::RegisterDriver ***ERROR***" << endl
131 <<
" trying to register more than one FeatureFileIO driver with " << endl
132 <<
" the same name[" << _driver->driverName <<
"]." << endl
137 registeredDrivers->push_back (_driver);
161 if (registeredDrivers)
163 while (registeredDrivers->size () > 0)
165 FeatureFileIOPtr f = registeredDrivers->back ();
166 registeredDrivers->pop_back ();
170 delete registeredDrivers;
171 registeredDrivers = NULL;
183 vector<FeatureFileIOPtr>* drivers = RegisteredDrivers ();
185 vector<FeatureFileIOPtr>::const_iterator idx;
186 for (idx = drivers->begin (); idx != drivers->end (); idx++)
188 if ((*idx)->driverNameLower == driverNameLower)
199 return LookUpDriver (_fileFormatStr);
229 vector<FeatureFileIOPtr>* drivers = RegisteredDrivers ();
231 KKStr driversThatCanRead
(128
);
233 vector<FeatureFileIOPtr>::const_iterator idx;
234 for (idx = drivers->begin (); idx != drivers->end (); idx++)
240 driversThatCanRead <<
", ";
244 return driversThatCanRead;
251 vector<FeatureFileIOPtr>* drivers = RegisteredDrivers ();
253 KKStr driversThatCanWrite
(128
);
255 vector<FeatureFileIOPtr>::const_iterator idx;
256 for (idx = drivers->begin (); idx != drivers->end (); idx++)
262 driversThatCanWrite <<
", ";
266 return driversThatCanWrite;
274 KKStr driversThatCanReadAndWrite
(128
);
276 vector<FeatureFileIOPtr>* drivers = RegisteredDrivers ();
278 vector<FeatureFileIOPtr>::const_iterator idx;
279 for (idx = drivers->begin (); idx != drivers->end (); idx++)
284 if (!driversThatCanReadAndWrite
.Empty ())
285 driversThatCanReadAndWrite <<
", ";
289 return driversThatCanReadAndWrite;
299 vector<FeatureFileIOPtr>* drivers = RegisteredDrivers ();
301 vector<FeatureFileIOPtr>::iterator idx;
303 for (idx = drivers->begin (); idx != drivers->end (); idx++)
312 names.push_back (driver->DriverName ());
327 canWrite (_canWrite),
328 driverName
(_driverName
),
354 while ((ch !=
'\n') && (ch !=
'\r') && (!_in.eof ()))
386 const char* _delimiters,
407 while ((ch ==
' ') && (!_in.eof ()))
424 if (_in.peek () ==
'\r')
433 if (_in.peek () ==
'\n')
439 while ((!_in.eof ()) && (ch !=
'\n') && (ch !=
'\r') && (strchr (_delimiters, ch) == NULL))
442 _token.Append ((
char)ch);
446 if (strchr (_delimiters, ch) != NULL)
472 _log.Level (10) <<
"LoadFeatureFile File[" << _fileName <<
"] FileFormat[" << driverName <<
"]" << endl;
474 _changesMade =
false;
476 kkint32 estimatedNumOfDataItems = -1;
480 ifstream in (_fileName.Str (), ios_base::in);
483 _log.Level (-1) <<
"LoadFeatureFile ***ERROR*** Error Opening File[" << _fileName <<
"]." << endl;
490 FileDescPtr fileDescFromFile = GetFileDesc (_fileName, in, &_mlClasses, estimatedNumOfDataItems, errorMessage, _log);
491 if (fileDescFromFile == NULL)
493 _log.Level (-1) << endl << endl
494 <<
"FeatureFileIO::LoadFeatureFile ***ERROR*** Loading Feature File[" << _fileName <<
"]" << endl
503 in.seekg (0, ios::beg);
505 FeatureVectorListPtr examples = LoadFile (_fileName, fileDesc, _mlClasses, in, _maxCount, _cancelFlag, _changesMade, errorMessage, _log);
506 if (examples == NULL)
532 _log.Level (10) <<
"FeatureFileIO::AppendToFile - File[" << _fileName <<
"]." << endl;
538 ofstream out (_fileName.Str (), ios::app);
543 err <<
"AppendToFile Error Opening File[" << _fileName <<
"]";
544 _log.Level (-1) << endl
545 <<
"FeatureFileIO::AppendToFile ***ERROR***" << endl
547 <<
" " << err << endl
549 osDisplayWarning (err);
555 SaveFile (_examples, _fileName, _selFeatures, out, _numExamplesWritten, _cancelFlag, _successful, errorMessage, _log);
574 _log.Level (10) <<
"FeatureFileIO::SaveFeatureFile - File[" << _fileName <<
"]." << endl;
576 ofstream out (_fileName.Str ());
579 _log.Level (-1) <<
"***ERROR***, SaveFeatureFile, Opening File[" << _fileName <<
"]" << endl;
588 SaveFile (_examples, _fileName, _selFeatures, out, _numExamplesWritten, _cancelFlag, _successful, errorMessage, _log);
608 if (_cancelFlag || (!_successful))
611 if (_examples.QueueSize () > 64000)
613 kkint32 numPartsNeeded = (_examples.QueueSize () / 64000);
614 if ((_examples.QueueSize () % 64000) > 0)
617 kkint32 maxPartSize = (_examples.QueueSize () / numPartsNeeded) + 1;
620 FeatureVectorList::const_iterator idx = _examples.begin ();
622 while ((idx != _examples.end ()) && (_successful) && (!_cancelFlag))
624 FeatureVectorListPtr part = _examples.ManufactureEmptyList (
false);
626 while ((idx != _examples.end ()) && (part->QueueSize () < maxPartSize))
628 part->PushOnBack (*idx);
632 KKStr partFileName = osRemoveExtension (_fileName) +
"-" +
633 StrFormatInt (partNum,
"00") +
"." +
634 osGetFileExtension (_fileName);
636 SaveFeatureFile (partFileName, _selFeatures, *part, numExamplesWritten, _cancelFlag, _successful, _log);
639 delete part; part = NULL;
649 (FactoryFVProducerPtr _fvProducerFactory,
652 bool _useDirectoryNameForClassName,
654 bool _rewiteRootFeatureFile,
658 _log.Level (10) <<
"FeatureFileIO::LoadInSubDirectoryTree rootDir[" << _rootDir <<
"]." << endl;
663 KKStr fullFeatureFileName
("");
668 fullFeatureFileName
= _rootDir
+ featureFileName;
672 featureFileName
= "Root.data";
673 fullFeatureFileName
= "Root.data";
677 if (_useDirectoryNameForClassName)
683 bool changesMade =
false;
685 FeatureVectorListPtr dirImages = NULL;
689 if (_rewiteRootFeatureFile)
696 _useDirectoryNameForClassName
, 703 if (_useDirectoryNameForClassName)
705 FeatureVectorList::iterator idx;
706 for (idx = dirImages->begin (); idx != dirImages->end (); idx++)
708 if ((*idx)->MLClass () != unKnownClass)
710 (*idx)->MLClass (unKnownClass);
720 bool successful =
false;
745 KKStrList::iterator idx;
747 for (idx = subDirectories->begin (); (idx != subDirectories->end () && (!_cancelFlag)); idx++)
749 KKStr subDirName (**idx);
750 if (subDirName
== "BorderImages")
761 _useDirectoryNameForClassName
, 766 FeatureVectorPtr fv = NULL;
771 FeatureVectorList::iterator idx = subDirImages->begin ();
772 for (idx = subDirImages->begin (); idx != subDirImages->end (); idx++)
780 subDirImages->Owner (
false);
784 delete subDirectories; subDirectories = NULL;
787 _log.Level (10) <<
"LoadInSubDirectoryTree - Done" << endl;
800 const KKStr& _dirName,
801 const KKStr& _fileName,
803 bool _useDirectoryNameForClassName,
811 _changesMade =
false;
815 if (_unknownClass == NULL)
820 _log.Level (10) <<
"FeatureFileIO::FeatureDataReSink dirName: " << _dirName << endl
821 <<
" fileName: " << _fileName <<
" UnKnownClass: " << className << endl;
825 bool successful =
true;
827 KKStr fileNameToOpen;
829 fileNameToOpen
= _fileName;
833 bool versionsAreSame =
false;
835 FeatureVectorListPtr origFeatureVectorData
838 if (origFeatureVectorData == NULL)
846 delete origFeatureVectorData; origFeatureVectorData = NULL;
850 FeatureVectorListPtr origFeatureData = NULL;
857 origFeatureData = origFeatureVectorData;
862 delete origFeatureVectorData;
863 origFeatureVectorData = NULL;
873 if (origFeatureData->QueueSize () > 0)
876 delete origFeatureData; origFeatureData = NULL;
887 versionsAreSame =
true;
898 delete origFeatureData;
909 KKStrList::iterator fnIDX;
910 fnIDX = fileNameList->begin ();
912 KKStrPtr imageFileName;
914 kkint32 numImagesFoundInOrigFeatureData = 0;
915 kkint32 numOfNewFeatureExtractions = 0;
917 for (fnIDX = fileNameList->begin (); (fnIDX != fileNameList->end ()) && (!_cancelFlag); ++fnIDX)
919 imageFileName = *fnIDX;
923 if (rootName ==
"pv414-_002_20140414-162243_02068814-1261")
924 cout <<
"Stop Here." << endl;
928 if (!validImageFileFormat)
931 bool featureVectorCoputaionSuccessful =
false;
935 numImagesFoundInOrigFeatureData++;
937 if (origFV && versionsAreSame)
939 featureVectorCoputaionSuccessful =
true;
940 if (_useDirectoryNameForClassName)
956 origFeatureData->DeleteEntry (origFV);
963 FeatureVectorPtr fv = NULL;
972 featureVectorCoputaionSuccessful =
true;
974 featureVectorCoputaionSuccessful =
false;
978 _log.Level (-1) << endl << endl
979 <<
"FeatureDataReSink ***ERROR***" << endl
980 <<
" Exception occurred calling constructor 'ComputeFeatureVector'." << endl
982 featureVectorCoputaionSuccessful =
false;
986 if (!featureVectorCoputaionSuccessful)
988 _log.Level (-1) <<
" FeatureFileIOKK::FeatureDataReSink *** ERROR ***, Processing Image File[" 989 << imageFileName <<
"]." 999 _log.Level (30) << fv->ExampleFileName () <<
" " << fv->OrigSize () << endl;
1001 numOfNewFeatureExtractions++;
1003 if ((numOfNewFeatureExtractions % 100) == 0)
1004 cout << numOfNewFeatureExtractions <<
" Images Extracted." << endl;
1009 if (numImagesFoundInOrigFeatureData != extractedFeatures->QueueSize ())
1010 _changesMade =
true;
1014 if ((_changesMade) && (!_cancelFlag))
1032 delete fvProducer; fvProducer = NULL;
1033 delete fileNameList; fileNameList = NULL;
1034 delete origFeatureData; origFeatureData = NULL;
1036 _log.Level (10) <<
"FeatureDataReSink Exiting Dir: " << _dirName << endl;
1038 return extractedFeatures;
KKStr(kkint32 size)
Creates a KKStr object that pre-allocates space for 'size' characters.
void ExampleFileName(const KKStr &_exampleFileName)
Name of source of feature vector, ex: file name of image that the feature vector was computed from...
void PushOnBack(FeatureVectorPtr image)
Overloading the PushOnBack function in KKQueue so we can monitor the Version and Sort Order...
void GetToken(std::istream &_in, const char *_delimiters, KKStr &_token, bool &_eof, bool &_eol)
Will retrieve the next token from the input stream.
void AddQueue(const FeatureVectorList &examplesToAdd)
Add the contents of 'examplesToAdd' to the end of this list.
Provides a detailed description of the attributes of a dataset.
static FileDescPtr GetExistingFileDesc(FileDescPtr fileDesc)
Returns a pointer to an existing instance of 'fileDesc' if it exists, otherwise will use one being pa...
MLClassPtr GetUnKnownClass()
Return a pointer to the MLClass object that represents the unknown Class in the list.
KKB::DateTime osGetLocalDateTime()
Returned the current local date and time.
FeatureVectorPtr BinarySearchByName(const KKStr &_imageFileName) const
Will search for the example with the same name as '_imageFileName'.
virtual kkint16 Version() const =0
Keeps track of selected features.
KKStr & operator=(const char *src)
Represents a "Class" in the Machine Learning Sense.
FeatureNumList AllFeatures()
Will return a FeatureNumList instance with all features selected.
const FileDescPtr FileDesc() const
FeatureNumList const FeatureNumListConst
bool operator==(const char *rtStr) const
static KKStr GetClassNameFromDirName(const KKStr &subDir)
static MLClassPtr GetUnKnownClassStatic()
KKStrListPtr osGetListOfFiles(const KKStr &fileSpec)
Returns a list of files that match the provided file specification.
KKStr operator+(const char *right) const
void GetLine(std::istream &_in, KKStr &_line, bool &_eof)
bool SupportedImageFileFormat(const KKStr &imageFileName)
unsigned __int32 kkuint32
RasterPtr ReadImage(const KKStr &imageFileName)
bool operator==(const FileDesc &rightSize) const
Returns true if file description on the right size is identical.
FeatureVectorListPtr LoadInSubDirectoryTree(FactoryFVProducerPtr _fvProducerFactory, KKStr _rootDir, MLClassList &_mlClasses, bool _useDirectoryNameForClassName, VolConstBool &_cancelFlag, bool _rewiteRootFeatureFile, RunLog &_log)
Creates a feature vector list of all images located in the specified sub-directory tree...
virtual FeatureVectorListPtr LoadFeatureFile(const KKStr &_fileName, MLClassList &_mlClasses, kkint32 _maxCount, VolConstBool &_cancelFlag, bool &_successful, bool &_changesMade, RunLog &_log)
Loads the contents of a feature data file and returns a ImageFeaturesList container object...
KKStr & operator=(KKStr &&src)
void SaveFeatureFileMultipleParts(const KKStr &_fileName, FeatureNumListConst &_selFeatures, FeatureVectorList &_examples, VolConstBool &_cancelFlag, bool &_successful, RunLog &_log)
Saves the feature file in multiple parts with no one single part larger that 64k examples.
static void FinalCleanUp()
Before you terminate your application and after all FeatureFileIO activity is done call this method t...
Container class for FeatureVector derived objects.
KKB::KKStr osAddSlash(const KKStr &fileSpec)
virtual const type_info * FeatureVectorListTypeId() const =0
Returns the 'type_info' of the FeatureVectorList that this instance of 'FactoryFVProducer' will creat...
KKStr(const KKStr &str)
Copy Constructor.
FeatureFileIO * FeatureFileIOPtr
virtual FeatureVectorListPtr ManufacturFeatureVectorList(bool owner, RunLog &runLog) const
Manufactures a instance of a derived 'FeatureVectorList' class that is appropriate for containing ins...
Base class for all FeatureFileIO classes.
void SortByRootName(bool reversedOrder=false)
void ReportError(RunLog &log, const KKStr &fileName, const KKStr &funcName, kkint32 lineCount, const KKStr &errorDesc)
virtual FeatureVectorProducerPtr ManufactureInstance(RunLog &runLog)=0
Derived classes will instantiate appropriate instances of 'FeatureVectorProducer'.
virtual void SaveFeatureFile(const KKStr &_fileName, FeatureNumListConst &_selFeatures, FeatureVectorList &_examples, kkuint32 &_numExamplesWritten, VolConstBool &_cancelFlag, bool &_successful, RunLog &_log)
Save examples to 'fileName'.
static KKStr Concat(const std::vector< std::string > &values)
Concatenates the list of 'std::string' strings.
virtual FeatureVectorPtr ComputeFeatureVector(const Raster &image, const MLClassPtr knownClass, RasterListPtr intermediateImages, float priorReductionFactor, RunLog &runLog)=0
Compute a FeatureVector for the supplied 'image'.
static VectorKKStr RegisteredDriverNames(bool canRead, bool canWrite)
MLClassPtr MLClass() const
Class that is example is assigned to.
void MLClass(MLClassPtr _mlClass)
Assign a class to this example.
static FeatureNumList AllFeatures(FileDescPtr fileDesc)
Create a FeatureNumList object where all features are selected, except ones that are flagged as Ignor...
KKStr osGetRootNameOfDirectory(KKStr fullDirName)
void Sort(bool _reversedOrder)
static void RegisterFeatureFileIODriver(FeatureFileIOPtr _driver)
For each feature file format register the appropriate driver through this static method.
const KKStr & Name() const
static FeatureFileIOPtr FileFormatFromStr(const KKStr &_fileFormatStr)
KKStr operator+(const KKStr &right) const
static KKStr FileFormatsWrittenOptionsStr()
KKStrListPtr osGetListOfDirectories(KKStr fileSpec)
KKStr & operator=(const KKStr &src)
KKB::DateTime osGetFileDateTime(const KKStr &fileName)
Used for logging messages.
void EncodeProblem(const struct svm_paramater ¶m, struct svm_problem &prob_in, struct svm_problem &prob_out)
static KKStr FileFormatsReadOptionsStr()
virtual MLClassPtr GetMLClassPtr(const KKStr &_name)
return pointer to instance with '_name'; if none exists, create one and add to list.
FeatureFileIO * FeatureFileIOPtr
FeatureVectorProducer * FeatureVectorProducerPtr
Maintains a list of MLClass instances.
static KKStr FileFormatsReadAndWriteOptionsStr()
virtual FeatureVectorListPtr FeatureDataReSink(FactoryFVProducerPtr _fvProducerFactory, const KKStr &_dirName, const KKStr &_fileName, MLClassPtr _unknownClass, bool _useDirectoryNameForClassName, MLClassList &_mlClasses, VolConstBool &_cancelFlag, bool &_changesMade, KKB::DateTime &_timeStamp, RunLog &_log)
Synchronizes the contents of a feature data file with a directory of images.
Maintains one instance of a GoalKeeper object that can be used anywhere in the application.
virtual FileDescPtr FileDesc() const =0
static void RegisterDriver(FeatureFileIOPtr driver)
void Version(kkint16 _version)
void AppendToFile(const KKStr &_fileName, FeatureNumListConst &_selFeatures, FeatureVectorList &_examples, kkuint32 &_numExamplesWritten, VolConstBool &_cancelFlag, bool &_successful, RunLog &log)
const KKStr & DriverName()
FeatureFileIO(const KKStr &_driverName, bool _canRead, bool _canWrite)
const KKStr & ExampleFileName() const
Name of file that this FeatureVector was computed from.
KKStr osGetRootName(const KKStr &fullFileName)
DateTime & operator=(const DateTime &right)
static FeatureFileIOPtr FileFormatFromStr(const KKStr &_fileFormatStr, bool _canRead, bool _canWrite)
volatile const bool VolConstBool
void osAddLastSlash(KKStr &fileSpec)
Will add the appropriate Directory separator character to the end of fileSpec if one is not there alr...