|
From: Gustavo P. B. <gb...@us...> - 2005-06-23 23:19:55
|
Update of /cvsroot/kimageprocess/kimageprocess/src/plugins/snns In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32338/src/plugins/snns Modified Files: snns.cpp snns.h Log Message: All calculation (features extraction, normalization, etc) are now done in KTCalculation which provides us a better way to add new classifiers Index: snns.cpp =================================================================== RCS file: /cvsroot/kimageprocess/kimageprocess/src/plugins/snns/snns.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- snns.cpp 23 Jun 2005 18:30:07 -0000 1.6 +++ snns.cpp 23 Jun 2005 23:19:43 -0000 1.7 @@ -39,17 +39,6 @@ KTSNNSPlugin::KTSNNSPlugin(QObject *parent, const char* name, const QStringList&) : KTClassifBackend(parent, name) { - m_generateTrainingPattern = new KAction(i18n("&Generate Training Pattern"), 0, - this, SLOT(slotGenerateTrainingPattern()), - actionCollection(), "snns_generate_training_pattern"); - - m_generateTesingPattern = new KAction(i18n("Generate &Testing Pattern"), 0, - this, SLOT(slotGenerateTestingPattern()), - actionCollection(), "snns_generate_testing_pattern"); - - setInstance(KGenericFactory<KTSNNSPlugin>::instance()); - setXMLFile("kimageprocess_snns.rc"); - m_tempFile = 0; } @@ -57,22 +46,18 @@ KTSNNSPlugin::~KTSNNSPlugin() { } -void KTSNNSPlugin::slotGenerateTrainingPattern() +void KTSNNSPlugin::doTraining(const QValueList<dataEntry>& data, int inputs, int outputs) { KURL dest = KFileDialog::getSaveURL(QString::null,i18n("*.pat|Pattern files"),0,i18n("Save pattern")); if (!dest.isEmpty()) { m_sampleImage = dest; - m_patternCount = 0; KTempFile tmpHeaderFile; tmpHeaderFile.setAutoDelete(false); m_tempFile = new KTempFile(); m_tempFile->setAutoDelete(false); - m_input = KTImageManager::self()->activeFeaturesCount(); - m_output = KTImageManager::self()->sampleCount(); - if (tmpHeaderFile.file()->isOpen() && m_tempFile->file()->isOpen()) { QTextStream streamData(tmpHeaderFile.file()); @@ -81,9 +66,9 @@ m_contents += "generated at " + QDateTime::currentDateTime().toString(); m_contents += "\n\n\n"; m_contents += "No. of patterns : %1\n"; - m_contents += "No. of input units : " + QString::number( m_input ); + m_contents += "No. of input units : " + QString::number( inputs ); m_contents += "\n"; - m_contents += "No. of output units : " + QString::number( m_output ); + m_contents += "No. of output units : " + QString::number( outputs ); m_contents += "\n\n"; QStringList names = KTImageManager::self()->activeFeatureNames(); @@ -96,53 +81,31 @@ m_stream.setDevice(m_tempFile->file()); - m_first = true; - m_patterns.clear(); - m_max.resize(m_input, 0); - m_min.resize(m_input, 0); - KTImageManager::self()->calculateSampleData(0, this); - - QValueList<pattern>::iterator end = m_patterns.end(); - - float dif[m_input]; - for (int i=0; i < m_input; ++i) - dif[i] = m_max[i] - m_min[i]; + QValueList<dataEntry>::ConstIterator end = data.constEnd(); - for (QValueList<pattern>::iterator it = m_patterns.begin(); it != end; ++it) - { - QString line = ""; - for ( int i=0; i < m_input; ++i ) - { - line += " " + QString::number((*it).inputs[i]); - (*it).inputs[i] = ((*it).inputs[i] - m_min[i]) * 100 / dif[i]; - } - kdDebug() << line << endl; - } - - for (QValueList<pattern>::iterator it = m_patterns.begin(); it != end; ++it) + for (QValueList<dataEntry>::ConstIterator it = data.constBegin(); it != end; ++it) { QString line = ""; - for ( int i=0; i < m_input; ++i ) + for ( int i=0; i < inputs; ++i ) line.sprintf("%s %.5f", line.ascii(), (*it).inputs[i]); m_stream << line.stripWhiteSpace() << endl; QString temp=""; - for (int j = 1; j <= m_output; j++) + for (int j = 1; j <= outputs; j++) if (j == (*it).sampleClass) temp += "1 "; else temp += "0 "; m_stream << temp.stripWhiteSpace() << endl << endl; - m_patternCount++; } //save the pattern file QTextStream streamHeader(tmpHeaderFile.file()); - streamHeader << m_contents.arg(m_patternCount); + streamHeader << m_contents.arg(data.count()); m_tempFile->file()->reset(); // place the cursor in the beginning of file while (!m_stream.atEnd()) { @@ -159,17 +122,13 @@ } } -void KTSNNSPlugin::slotGenerateTestingPattern() +void KTSNNSPlugin::doClassify(const QValueList<dataEntry>& data, int inputs, int outputs) { KURL dest = KFileDialog::getSaveURL(QString::null,i18n("*.pat|Pattern files"),0,i18n("Save pattern")); if (!dest.isEmpty()) { - m_input = KTImageManager::self()->activeFeaturesCount(); - m_output = KTImageManager::self()->sampleCount(); - m_sampleImage = dest; - m_patternCount = 0; KTempFile tmpHeaderFile; tmpHeaderFile.setAutoDelete(false); m_tempFile = new KTempFile(); @@ -183,7 +142,7 @@ m_contents += "generated at " + QDateTime::currentDateTime().toString(); m_contents += "\n\n\n"; m_contents += "No. of patterns : %1\n"; - m_contents += "No. of input units : " + QString::number( KTImageManager::self()->activeFeaturesCount() ); + m_contents += "No. of input units : " + QString::number( inputs ); m_contents += "\n"; m_contents += "No. of output units : 0\n"; m_contents += "\n\n"; @@ -198,36 +157,16 @@ m_stream.setDevice(m_tempFile->file()); - m_patterns.clear(); - m_max.resize(m_input, 0); - m_min.resize(m_input, 0); - m_first = true; - KTImageManager::self()->calculateTestData(0, this); - - float dif[m_input]; - for (int i=0; i < m_input; ++i) - dif[i] = m_max[i] - m_min[i]; - - QValueList<pattern>::iterator end = m_patterns.end(); - for (QValueList<pattern>::iterator it = m_patterns.begin(); it != end; ++it) - { - QString line = ""; - for ( int i=0; i < m_input; ++i ) - { - line += " " + QString::number((*it).inputs[i]); - (*it).inputs[i] = ((*it).inputs[i] - m_min[i]) * 100 / dif[i]; - } - kdDebug() << line << endl; - } - - for (QValueList<pattern>::iterator it = m_patterns.begin(); it != end; ++it) + QValueList<dataEntry>::ConstIterator end = data.constEnd(); + int m_patternCount = 0; + for (QValueList<dataEntry>::ConstIterator it = data.constBegin(); it != end; ++it) { QString line = ""; //append the count (just for debuggin purposes ) m_stream << "#" << ++m_patternCount << endl; - for ( int i=0; i < m_input; ++i) + for ( int i=0; i < inputs; ++i) line.sprintf("%s %.5f", line.ascii(), (*it).inputs[i]); line = line + "\n"; @@ -237,7 +176,7 @@ //save the pattern file QTextStream streamHeader(tmpHeaderFile.file()); - streamHeader << m_contents.arg(m_patternCount); + streamHeader << m_contents.arg(data.count()); m_tempFile->file()->reset(); // place the cursor in the beginning of file while (!m_stream.atEnd()) { temp = m_stream.readLine(); @@ -258,72 +197,4 @@ //connect signals/slots here } -void KTSNNSPlugin::parseResults(const QValueList<float> &results) -{ - float *inputs = new float[m_input]; - - QValueList<float>::const_iterator it; - - if (m_first) - { - for (int j = 0; j < m_input; ++j) - m_min[j] = m_max[j] = inputs[j]; - m_first = false; - } - - int i = 0; - - //prepare the input - for ( it = results.begin(); it != results.end(); ++it) - { - inputs[i] = (*it); - if (inputs[i] > m_max[i]) - m_max[i] = inputs[i]; - else if (inputs[i] < m_min[i]) - m_min[i] = inputs[i]; - ++i; -} - - pattern pat; - pat.inputs = inputs; - pat.sampleClass = 0; - m_patterns.append(pat); - -} - -void KTSNNSPlugin::parseSampleResults(const QValueList<float> &results, int sampleClass) -{ - float *inputs = new float[m_input]; - - QValueList<float>::const_iterator it; - - - if (m_first) - { - for (int j = 0; j < m_input; ++j) - m_min[j] = m_max[j] = inputs[j]; - m_first = false; - } - - int i = 0; - - //prepare the input - for ( it = results.begin(); it != results.end(); ++it) - { - inputs[i] = (*it); - if (inputs[i] > m_max[i]) - m_max[i] = inputs[i]; - else if (inputs[i] < m_min[i]) - m_min[i] = inputs[i]; - ++i; - } - - pattern pat; - pat.inputs = inputs; - pat.sampleClass = sampleClass; - m_patterns.append(pat); - -} - - #include "snns.moc" Index: snns.h =================================================================== RCS file: /cvsroot/kimageprocess/kimageprocess/src/plugins/snns/snns.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- snns.h 23 Jun 2005 18:30:07 -0000 1.6 +++ snns.h 23 Jun 2005 23:19:44 -0000 1.7 @@ -25,6 +25,7 @@ #include <qvaluelist.h> #include <qvaluevector.h> +#include <qstring.h> #include <kurl.h> @@ -32,12 +33,6 @@ class KTImage; class KTempFile; -typedef struct -{ - float *inputs; - int sampleClass; -} pattern; - /** A SNNS backend plugin @author Gustavo Pichorim Boiko @@ -53,10 +48,10 @@ void setupPlugin(); // Reimplemented from KTClassifBackends - void parseResults(const QValueList<float> &results); - - void parseSampleResults(const QValueList<float> &results, int sampleClass); + void doTraining(const QValueList<dataEntry>& data, int inputs, int outputs); + void doClassify(const QValueList<dataEntry>& data, int inputs, int outputs); + QString classifierName() { return "snns"; } private: KAction *m_generateTrainingPattern; KAction *m_generateTesingPattern; @@ -68,21 +63,7 @@ KTempFile *m_tempFile; QTextStream m_stream; - - QValueList<pattern> m_patterns; - - int m_input; - int m_output; - QValueVector<float> m_min; - QValueVector<float> m_max; - bool m_first; - -private slots: - void slotGenerateTrainingPattern(); - // for now assume we are using one test image for each project. - // TODO: Fix that (will require API change) - void slotGenerateTestingPattern(); - + }; #endif |