Exemple #1
0
ISAlignStrms::ISAlignStrms(ISamples *samples)
	: ISMergeDim(samples)
{
	ssi_wrn("class 'ISAlignStrms' has been replaced by 'ISMergeDim'");
}
bool WeightedMajorityVoting::forward (ssi_size_t n_models,
	IModel **models,
	ssi_size_t n_streams,
	ssi_stream_t *streams[],
	ssi_size_t n_probs,
	ssi_real_t *probs) {

	if (!isTrained ()) {
		ssi_wrn ("not trained");
		return false;
	}

	if (n_streams != _n_streams) {
		ssi_wrn ("#streams (%u) differs from #streams (%u)", n_streams, _n_streams);
		return false;
	}

	if (_n_streams != n_models) {
		ssi_wrn ("#models (%u) differs from #streams (%u)", n_models, _n_streams);
		return false;
	}

	if (_n_classes != n_probs) {
		ssi_wrn ("#probs (%u) differs from #classes (%u)", n_probs ,_n_classes);
		return false;
	}

	bool found_data = false;

	IModel *model = 0;
	ssi_stream_t *stream = 0;

	//calculate actual models
	ssi_size_t miss_counter = 0;
	ssi_size_t *available = new ssi_size_t[n_models];
	for (ssi_size_t n_model = 0; n_model < n_models; n_model++) {
		stream = streams[n_model];
		if (stream->num > 0) {
			found_data = true;
			available[n_model] = 1;
		}
		else{
			miss_counter++;
			available[n_model] = 0;
		}
	}
	ssi_size_t counter = 0;
	ssi_size_t *models_actual = new ssi_size_t[(n_models - miss_counter)];
	for (ssi_size_t n_model = 0; n_model < n_models; n_model++) {
		if(available[n_model] == 1){
			models_actual[counter] = n_model;
			counter++;
		}
	}

	if(found_data){

		ssi_size_t *votes = new ssi_size_t[(n_models - miss_counter)];

		for (ssi_size_t n_model = 0; n_model < (n_models - miss_counter); n_model++) {
			model = models[models_actual[n_model]];
			stream = streams[models_actual[n_model]];
			model->forward (*stream, n_probs, probs);

			ssi_size_t max_ind = 0;
			ssi_real_t max_val = probs[0];
			
			for (ssi_size_t i = 1; i < n_probs; i++) {
				if (probs[i] > max_val) {
					max_val = probs[i];
					max_ind = i;
				}
			}
			votes[n_model] = max_ind;

			if (ssi_log_level >= SSI_LOG_LEVEL_DEBUG) {
				for (ssi_size_t num_probs = 0; num_probs < n_probs; num_probs++){
					ssi_print("%f ", probs[num_probs]);
				}
				ssi_print("- vote: %d\n", max_ind);
			}

		}

		//clear probs
		for (ssi_size_t num_probs = 0; num_probs < n_probs; num_probs++){
			probs[num_probs] = 0;
		}

		//fill probs with votes
		ssi_char_t weighting_method = 'a';
		//a = average
		//c = class
		for(ssi_size_t n_model = 0; n_model < (n_models - miss_counter); n_model++){
			switch (weighting_method)
			{
			case ('a'):
				probs[votes[n_model]] = (probs[votes[n_model]])+(_weights[models_actual[n_model]][_n_classes]);
				break;
			case ('c'):
				probs[votes[n_model]] = (probs[votes[n_model]])+(_weights[models_actual[n_model]][votes[n_model]]);
				break;
			}
		}

		if (ssi_log_level >= SSI_LOG_LEVEL_DEBUG) {
			ssi_print("\n");
		}

		if(votes){
			delete[] votes;
			votes = 0;
		}
	}

	if(available){
		delete [] available;
		available = 0;
	}
	if(models_actual){
		delete [] models_actual;
		models_actual = 0;
	}
		
	/// is there a draw ? ///
	ssi_size_t max_ind = 0;
	ssi_size_t max_ind_draw = 0;
	ssi_real_t max_val = probs[0];
	bool draw = false;

	for (ssi_size_t i = 1; i < n_probs; i++) {
		if (probs[i] >= max_val) {
			if(probs[i] == max_val){
				draw = true;
				max_ind_draw = i;
			}
			max_val = probs[i];
			max_ind = i;
		}
	}
	
	if(draw && (max_ind == max_ind_draw)){
		return false;
	}else{
		return found_data;
	}
}
Exemple #3
0
ssi_sample_t *FileSamplesIn::next () {

	if (!_file_data || !_file_info) {
		ssi_wrn ("files not open");
		return 0;
	}
	if (_sample_count++ >= _n_samples) {
		return 0;
	}

	switch (_version) {

		case File::V2: {

			switch (_file_data->getType ()) {

				case File::ASCII: {
			
					if (!_file_data->readLine (SSI_MAX_CHAR, _string)) {
						ssi_wrn ("could not read <user_id> <class_id> <time> <prob> <num>");
						return 0;
					}
					sscanf (_string, "%u %u %lf %f %u", &_sample.user_id, &_sample.class_id, &_sample.time, &_sample.prob, &_sample.num);

					break;
				} 

				case File::BINARY: {
	
					if (!_file_data->read (&_sample.user_id, sizeof (_sample.user_id), 1)) {
						ssi_wrn ("could not read <user_id>");
						return 0;
					}

					if (!_file_data->read (&_sample.class_id, sizeof (_sample.class_id), 1)) {
						ssi_wrn ("could not read <class_id>");
						return 0;
					}

					if (!_file_data->read (&_sample.time, sizeof (_sample.time), 1)) {
						ssi_wrn ("could not read <time>");
						return 0;
					}

					if (!_file_data->read (&_sample.prob, sizeof (_sample.prob), 1)) {
						ssi_wrn ("could not read <prob>");
						return 0;
					}

					if (!_file_data->read (&_sample.num, sizeof (_sample.num), 1)) {
						ssi_wrn ("could not read <num>");
						return 0;
					}

					break;
				}
			}

			for (ssi_size_t i = 0; i < _sample.num; i++) {

				ssi_size_t num = 0;

				switch (_file_data->getType ()) {

					case File::ASCII: {

						if (!_file_data->readLine (SSI_MAX_CHAR, _string)) {
							ssi_wrn ("could not read <num>");
							return 0;
						}
						sscanf (_string, "%u", &num);

						break;
					} 

					case File::BINARY: {
		
						if (!_file_data->read (&num, sizeof (num), 1)) {
							ssi_wrn ("could not read <num>");
							return 0;
						}

						break;
					}
				}

				if (num > 0) {

					ssi_stream_adjust (*_sample.streams[i], num);
					_file_data->setType (_sample.streams[i]->type);	
					if (num > 0) {
						if (!_file_data->read (_sample.streams[i]->ptr, _sample.streams[i]->byte, num * _sample.streams[i]->dim)) {
							ssi_wrn ("could not read <data>");
							return 0;
						}
					}
				} else {
					_sample.streams[i]->num = 0;
				}
			}

			break;
		}

		case File::V3: {

			switch (_file_data->getType ()) {

				case File::ASCII: {
			
					if (!_file_data->readLine (SSI_MAX_CHAR, _string)) {
						ssi_wrn ("could not read <user_id> <class_id> <prob> <time>");
						return 0;
					}
					sscanf (_string, "%u %u %f %lf", &_sample.user_id, &_sample.class_id, &_sample.prob, &_sample.time);

					break;
				} 

				case File::BINARY: {
	
					if (!_file_data->read (&_sample.user_id, sizeof (_sample.user_id), 1)) {
						ssi_wrn ("could not read <user_id>");
						return 0;
					}

					if (!_file_data->read (&_sample.class_id, sizeof (_sample.class_id), 1)) {
						ssi_wrn ("could not read <class_id>");
						return 0;
					}

					if (!_file_data->read (&_sample.prob, sizeof (_sample.prob), 1)) {
						ssi_wrn ("could not read <prob>");
						return 0;
					}

					if (!_file_data->read (&_sample.time, sizeof (_sample.time), 1)) {
						ssi_wrn ("could not read <time>");
						return 0;
					}

					break;
				}
			}

			for (ssi_size_t i = 0; i < _sample.num; i++) {
				_file_streams[i].read (*_sample.streams[i], _sample_count-1);
			}

			break;
		}
		
	}

	return &_sample;
}
Exemple #4
0
bool SimpleKNN::forward (ssi_stream_t &stream,
	ssi_size_t n_probs,
	ssi_real_t *probs) {

	if (!_data) {
		ssi_wrn ("not trained");
		return false;
	}

	if (n_probs != _n_classes) {
		ssi_wrn ("#classes differs");
		return false;
	}

	if (stream.type != SSI_REAL) {
		ssi_wrn ("type differs");
		return false;
	}

	if (stream.dim != _n_features) {
		ssi_wrn ("feature dimension differs");
		return false;
	}

	ssi_size_t k = _options.k;
	DistanceMeasureFunc dist_fptr;
	switch (_options.dist) {
		case SimpleKNN::EUCLIDIAN:
			dist_fptr = SimpleKNN::EuclideanSquaredReal;
			break;
		default:
			ssi_err ("unkown distance measure function");
			return false;			
	}

	std::multimap<ssi_real_t, ssi_size_t> closestSamplesMap;
	typedef std::pair<ssi_real_t, ssi_size_t> samplePair;
	std::multimap<ssi_real_t, ssi_size_t>::iterator mapIter;
	
	ssi_real_t *probptr = probs;
	for (ssi_size_t i = 0; i < n_probs; i++)
	{
		*probptr++ = 0;
	}
	
	ssi_real_t *data_ptr = _data;	
	ssi_size_t *class_ptr = _classes;
	ssi_real_t currentMaxDistance = 0.0f;
	ssi_real_t currentDistance = 0.0f;
	ssi_real_t *sample_ptr = ssi_pcast (ssi_real_t, stream.ptr);

	for (ssi_size_t i = 0; i < k; ++i)
	{		
		currentDistance = (*dist_fptr) (sample_ptr, data_ptr, _n_features);
		closestSamplesMap.insert (samplePair (currentDistance, *class_ptr));
		currentMaxDistance = max (currentMaxDistance, currentDistance);

		class_ptr++;
		data_ptr += _n_features;
	}

	for (ssi_size_t i = k; i < _n_samples; ++i)
	{
		currentDistance = (*dist_fptr) (sample_ptr, data_ptr, _n_features);
		if (currentDistance < currentMaxDistance)
		{
			closestSamplesMap.insert (samplePair (currentDistance, *class_ptr));
			mapIter = --closestSamplesMap.end();
			closestSamplesMap.erase (mapIter--);
			currentMaxDistance = mapIter->first;
		}

		class_ptr++;
		data_ptr += _n_features;
	}

	probptr = probs;
	for (mapIter = closestSamplesMap.begin(); mapIter != closestSamplesMap.end(); ++mapIter)
	{
		ssi_size_t index = mapIter->second;
		*(probptr + index) += 1.0f;
	}
	// normalize
	probptr = probs;
	for (ssi_size_t i = 0; i < n_probs; i++)
	{
		*probptr++ /= k;
	}

	return true;
}
Exemple #5
0
bool ISNorm::LoadParams(const ssi_char_t *path, Params &params) {

	FilePath fp(path);
	ssi_char_t *path_xml;
	ssi_char_t *path_data;
	if (ssi_strcmp(fp.getExtension(), ".norm", false)) {
		path_xml = ssi_strcpy(path);
	}
	else {
		path_xml = ssi_strcat(path, ".norm");
	}
	path_data = ssi_strcat(path_xml, "~");

	TiXmlDocument doc;
	if (!doc.LoadFile(path_xml)) {
		ssi_wrn("failed loading trainer from file '%s' (r:%d,c:%d)", path_xml, doc.ErrorRow(), doc.ErrorCol());
		return false;
	}

	TiXmlElement *body = doc.FirstChildElement();
	if (!body || strcmp(body->Value(), "norm") != 0) {
		ssi_wrn("tag <norm> missing");
		return false;
	}

	TiXmlElement *element = 0;
	
	element = body->FirstChildElement("method");
	const ssi_char_t *method_s = element->GetText();
	bool found = false;
	METHOD::List method;
	for (ssi_size_t i = 0; i < METHOD::NUM; i++) {
		if (ssi_strcmp(method_s, METHOD_NAMES[i], false)) {
			method = (METHOD::List) i;
			found = true;
		}
	}
	if (!found) {
		ssi_wrn("unkown method '%s'", method_s);
		return false;
	}

	ISNorm::ZeroParams(params, method);

	element = body->FirstChildElement("dim");
	const ssi_char_t *dim_s = element->GetText();	
	ssi_size_t dim;
	if (sscanf(dim_s, "%u", &dim) != 1) {
		ssi_wrn("could not parse dimension '%s'", dim_s);
		return false;
	}
	ISNorm::InitParams(params, dim);

	if (method == METHOD::SCALE) {
		element = body->FirstChildElement("limits");
		const ssi_char_t *limits_s = element->GetText();
		if (sscanf(limits_s, "%f %f", params.limits, params.limits + 1) != 2) {
			ssi_wrn("could not parse limits '%s'", limits_s);
			return false;
		}
	}

	element = body->FirstChildElement("type");
	const ssi_char_t *type_s = element->GetText();
	found = false;
	File::TYPE type;
	if (ssi_strcmp(type_s, File::TYPE_NAMES[File::ASCII], false)) {
		type = File::ASCII;
		found = true;
	} else if (ssi_strcmp(type_s, File::TYPE_NAMES[File::BINARY], false)) {
		type = File::BINARY;
		found = true;
	}
 	
	if (!found) {
		ssi_wrn("unkown type '%s'", type_s);
		return false;
	}

	if (method != METHOD::NONE) {
		FILE *fp = fopen(path_data, type == File::BINARY ? "rb" : "r");
		if (fp) {
			switch (params.method) {
			case METHOD::NONE:
				break;
			case METHOD::SCALE:
				if (type == File::BINARY) {				
					fread(params.mins, params.n_features, sizeof(ssi_real_t), fp);
					fread(params.maxs, params.n_features, sizeof(ssi_real_t), fp);
				} else {
					ssi_real_t *mins = params.mins;
					ssi_real_t *maxs = params.maxs;
					for (ssi_size_t i = 0; i < params.n_features; i++) {
						fscanf(fp, "%f %f\n", mins++, maxs++);
					}
				}
				break;
			case METHOD::ZSCORE:
				if (type == File::BINARY) {
					fread(params.mean, params.n_features, sizeof(ssi_real_t), fp);
					fread(params.stdv, params.n_features, sizeof(ssi_real_t), fp);
				} else {
					ssi_real_t *mean = params.mean;
					ssi_real_t *stdv = params.stdv;
					for (ssi_size_t i = 0; i < params.n_features; i++) {
						fscanf(fp, "%f %f\n", mean++, stdv++);
					}
				}
				break;
			}
			fclose(fp);
		}
		else {
			ssi_wrn("could not open file '%s'", path_data);
			return false;
		}
	}

	delete[] path_xml;
	delete[] path_data;

	return true;
}
Exemple #6
0
bool ISNorm::setNorm (ssi_size_t index,
	Params &params) {

	if (index >= _n_streams) {
		ssi_wrn("index exceeds #streams (%u != %u)", index, _n_streams);
		return false;
	}

	if (params.inialized && params.n_features != _n_features[index]) {
		ssi_wrn("precomputed parameters are bad #features (%u != %u)", params.n_features, _n_features[index]);
		return false;
	}

	_params[index] = &params;	
	if (!params.inialized) {

		InitParams(params, _n_features[index]);

		if (params.method != METHOD::NONE) {

			ssi_real_t **matrix;
			ssi_size_t *classes;

			ModelTools::CreateSampleMatrix(_samples, index, _n_samples, params.n_features, &classes, &matrix);

			switch (params.method) {
			case METHOD::SCALE: {
				ssi_minmax(_n_samples, params.n_features, matrix[0], params.mins, params.maxs);
				ssi_real_t *aptr = params.mins;
				ssi_real_t *bptr = params.maxs;
				for (ssi_size_t j = 0; j < params.n_features; j++) {
					*bptr -= *aptr++;
					if (*bptr == 0.0f) {
						ssi_wrn("zero interval '%u'", j);
						*bptr = 1.0f;
					}
					bptr++;
				}
				break;
			}

			case METHOD::ZSCORE: {
				ssi_mean(_n_samples, params.n_features, matrix[0], params.mean);
				ssi_stdv(_n_samples, params.n_features, matrix[0], params.stdv);
				ssi_real_t *bptr = params.stdv;
				for (ssi_size_t j = 0; j < params.n_features; j++) {
					*bptr = sqrt(*bptr);
					if (*bptr == 0.0f) {
						ssi_wrn("zero stdv '%u'", j);
						*bptr = 1.0f;
					}
					bptr++;
				}
				break;
			}
			}

			ModelTools::ReleaseSampleMatrix(_n_samples, classes, matrix);
		}
		params.inialized = true;
	}

	return true;
}
Exemple #7
0
void Evaluation::print (FILE *file, PRINT::List format) {

	if (!_conf_mat_ptr) {
		ssi_wrn ("nothing to print");
		return;
	}
		
	ssi_size_t max_label_len = 0;
	for (ssi_size_t i = 0; i < _n_classes; ++i) {
		ssi_size_t len = ssi_cast (ssi_size_t, strlen (_class_names[i]));
		if (len > max_label_len) {
			max_label_len = len;
		}
	}

	if (format == PRINT::CSV || format == PRINT::CSV_EX) {

		File *tmp = File::Create(File::ASCII, File::WRITE, 0, file);
		tmp->setType(SSI_UINT);
		tmp->setFormat(";", "");

		ssi_fprint(file, "#classes;%u\n", _n_classes);
		ssi_fprint(file, "#total;%u\n", _n_classified + _n_unclassified);
		ssi_fprint(file, "#classified;%u\n", _n_classified);
		ssi_fprint(file, "#unclassified;%u\n", _n_unclassified);

		for (ssi_size_t i = 0; i < _n_classes; ++i) {
			ssi_fprint(file, ";%s", _class_names[i]);
		}

		ssi_fprint(file, "\n");
		for (ssi_size_t i = 0; i < _n_classes; ++i) {
			ssi_fprint(file, "%s;", _class_names[i]);
			tmp->write(_conf_mat_ptr[i], 0, _n_classes);
			ssi_fprint(file, "%f\n", 100 * get_class_prob(i));
		}
		for (ssi_size_t i = 0; i < _n_classes; ++i) {
			ssi_fprint(file, "; ");
		}
		ssi_fprint(file, ";%f;%f\n", 100 * get_classwise_prob(), 100 * get_accuracy_prob());

		if (format == PRINT::CSV_EX) {
			ssi_fprint(file, "\ntruth;prediction\n");
			ssi_size_t *ptr = _result_vec;
			for (ssi_size_t i = 0; i < _n_total; i++) {
				ssi_fprint(file, "%u;%u\n", ptr[0], ptr[1]);
				ptr += 2;
			}
		}

	} else {

		File *tmp = File::Create(File::ASCII, File::WRITE, 0, file);
		tmp->setType(SSI_UINT);
		tmp->setFormat(" ", "6");

		ssi_fprint(file, "#classes:      %u\n", _n_classes);
		ssi_fprint(file, "#total:        %u\n", _n_classified + _n_unclassified);
		ssi_fprint(file, "#classified:   %u\n", _n_classified);
		ssi_fprint(file, "#unclassified: %u\n", _n_unclassified);

		if (format != PRINT::CONSOLE_EX) {
			for (ssi_size_t j = 0; j < max_label_len + 3; j++) {
				ssi_fprint(file, " ");
			}
			ssi_char_t cut[7];
			for (ssi_size_t i = 0; i < _n_classes; ++i) {
				cutString(_class_names[i], 7, cut);
				ssi_fprint(file, " %6s", cut);
			}
		}
		ssi_fprint(file, "\n");
		for (ssi_size_t i = 0; i < _n_classes; ++i) {
			ssi_fprint(file, "%*s: ", max_label_len, _class_names[i]);
			tmp->write(_conf_mat_ptr[i], 0, _n_classes);
			ssi_fprint(file, "   -> %8.2f%%\n", 100 * get_class_prob(i));
		}
		ssi_fprint(file, "   %*s  => %8.2f%% | %.2f%%\n", max_label_len + _n_classes * 7, "", 100 * get_classwise_prob(), 100 * get_accuracy_prob());
		delete tmp;
	}

	fflush (file);
}
Exemple #8
0
bool ISNorm::SaveParams(const ssi_char_t *path, Params &params, File::TYPE type) {

	ssi_char_t string[SSI_MAX_CHAR];

	FilePath fp(path);
	ssi_char_t *path_xml;
	ssi_char_t *path_data;
	if (ssi_strcmp(fp.getExtension(), "norm", false)) {
		path_xml = ssi_strcpy(path);
	} else {
		path_xml = ssi_strcat(path, ".norm");
	}
	path_data = ssi_strcat(path_xml, "~");

	TiXmlElement norm("norm");
	
	TiXmlElement norm_method("method");
	norm_method.InsertEndChild(TiXmlText(METHOD_NAMES[params.method]));
	norm.InsertEndChild(norm_method);

	if (params.method == METHOD::SCALE) {
		TiXmlElement norm_limits("limits");
		ssi_sprint(string, "%f %f", params.limits[0], params.limits[1]);
		norm_limits.InsertEndChild(TiXmlText(string));
		norm.InsertEndChild(norm_limits);
	}

	TiXmlElement norm_dim("dim");
	ssi_sprint(string, "%u", params.n_features);
	norm_dim.InsertEndChild(TiXmlText(string));
	norm.InsertEndChild(norm_dim);

	TiXmlElement norm_type("type");	
	norm_type.InsertEndChild(TiXmlText(File::TYPE_NAMES[type]));
	norm.InsertEndChild(norm_type);
	
	TiXmlDocument doc;
	TiXmlDeclaration head("1.0", "", "");
	doc.InsertEndChild(head);
	doc.InsertEndChild(norm);	
	doc.SaveFile(path_xml);

	if (params.method != METHOD::NONE) {
		FILE *fp = fopen(path_data, type == File::BINARY ? "wb" : "w");
		if (fp) {
			switch (params.method) {			
			case METHOD::SCALE:
				if (type == File::BINARY) {
					fwrite(params.mins, params.n_features, sizeof(ssi_real_t), fp);
					fwrite(params.maxs, params.n_features, sizeof(ssi_real_t), fp);
				} else {
					ssi_real_t *mins = params.mins;
					ssi_real_t *maxs = params.maxs;
					for (ssi_size_t i = 0; i < params.n_features; i++) {
						ssi_fprint(fp, "%f %f\n", *mins++, *maxs++);
					}
				}
				break;
			case METHOD::ZSCORE:
				if (type == File::BINARY) {
					fwrite(params.mean, params.n_features, sizeof(ssi_real_t), fp);
					fwrite(params.stdv, params.n_features, sizeof(ssi_real_t), fp);
				}
				else {
					ssi_real_t *mean = params.mean;
					ssi_real_t *stdv = params.stdv;
					for (ssi_size_t i = 0; i < params.n_features; i++) {
						ssi_fprint(fp, "%f %f\n", *mean++, *stdv++);
					}
				}
				
				break;
			}
		}
		else {
			ssi_wrn("could not open file '%s'", path_data);
			return false;
		}
		fclose(fp);
	}

	delete[] path_data;
	delete[] path_xml;

	return true;
}
Exemple #9
0
ssi_size_t ElanTier::split (ElanTier &tier, ElanTier &inverse , String inverseValue, ssi_size_t framesize, ssi_size_t deltasize, ssi_size_t dropsize, ssi_size_t tiersize) {
	
	if (dropsize >= framesize) {
		ssi_wrn ("dropsize '%u' > framesize '%u'", framesize, dropsize);
		return 0;
	}

	if (size () == 0) {
		return 0;
	}

	ssi_size_t n_added = 0;

	ssi_size_t pos = 0;	
	ssi_size_t maxsize = (end ()-1)->to;
	ssi_size_t n_frames = (maxsize - (framesize-deltasize)) / framesize;
	ElanAnnotation a;
	ElanTier::iterator current = begin ();
	for (ssi_size_t i = 0; i < n_frames; i++, pos += framesize) {

		if (pos >= current->to) {
			current++;
		}

		if (current->from >= pos + framesize) {
			a.from = pos;
			a.to = pos + framesize + deltasize;
			a.value = inverseValue;
			inverse.push_back (a);			
			continue;
		}
		
		ssi_size_t real_from = max (current->from, pos);
		ssi_size_t real_to = min (current->to, pos + framesize + deltasize);		

		if (real_to - real_from >= dropsize) {
			a.from = pos;
			a.to = pos + framesize + deltasize;
			a.value = current->value;
			tier.push_back (a);
			++n_added;
		} else {
			a.from = pos;
			a.to = pos + framesize + deltasize;
			a.value = inverseValue;
			inverse.push_back (a);
		}
	}

	if (tiersize > pos) {
		ssi_size_t tailsize = tiersize - pos;
		if (tailsize > framesize-deltasize) {
			n_frames = (tailsize - (framesize-deltasize)) / framesize;
			for (ssi_size_t i = 0; i < n_frames; i++, pos += framesize) {
				a.from = pos;
				a.to = pos + framesize + deltasize;
				a.value = inverseValue;
				inverse.push_back (a);					
			}
		}
	}

	return n_added;
}
Exemple #10
0
    void Tensorflow::listen_enter() {

        if (!_is_loaded && !loadTrainer()) {
            ssi_wrn("could not load trainer '%s'", _options.trainer);
        }
    }
Exemple #11
0
    void Tensorflow::consume(IConsumer::info consume_info,
                             ssi_size_t stream_in_num,
                             ssi_stream_t stream_in[]) {

        ssi_real_t *dataptr = ssi_pcast(ssi_real_t, stream_in[0].ptr);

        tensorflow::Session *session;
        tensorflow::Status status = NewSession(tensorflow::SessionOptions(), &session);
        if (!status.ok()) {
            ssi_wrn("status: %s \n", status.ToString().c_str());
            return;
        }

        tensorflow::GraphDef graph_def;

#if __ANDROID__
        status = ReadTextProto(tensorflow::Env::Default(), "/sdcard/android_xmlpipe/frozen_graph.pb", &graph_def);
#else
        status = ReadTextProto(tensorflow::Env::Default(),
                               "/home/mainuser/code/SSI/mobileSSI/plugins/tensorflow/test_files/frozen_graph.pb",
                               &graph_def);
#endif

        if (!status.ok()) {
            ssi_wrn("status: %s \n", status.ToString().c_str());
            return;
        }

        status = session->Create(graph_def);
        if (!status.ok()) {
            ssi_wrn("status: %s \n", status.ToString().c_str());
            return;
        }

        int number_dim = stream_in[0].dim;
        int number_test = stream_in[0].num; // 4072
        int number_classes = 4;

        tensorflow::Tensor input_tensor(tensorflow::DT_FLOAT, tensorflow::TensorShape({number_test, number_dim}));
        auto dst = input_tensor.flat<float>().data();
        for (int i = 0; i < stream_in[0].num; i++) {
            std::copy_n(dataptr + i * number_dim, number_dim, dst);
            dst += number_dim;
        }

        std::vector<std::pair<std::string, tensorflow::Tensor>> inputs = {{"input_TT", input_tensor}};
        std::vector<tensorflow::Tensor> outputs;
        status = session->Run(inputs, {"output_TT"}, {}, &outputs);
        if (!status.ok()) {
            ssi_wrn("status: %s \n", status.ToString().c_str());
            return;
        }

        std::vector<int> number_hits(number_classes, 0);
        for (std::vector<tensorflow::Tensor>::iterator it = outputs.begin(); it != outputs.end(); ++it) {
            auto items = it->shaped<float, 2>({number_test, number_classes});
            for (int i = 0; i < number_test; i++) {
                int arg_max = 0;
                float val_max = items(i, 0);
                for (int j = 0; j < number_classes; j++) {
                    if (items(i, j) > val_max) {
                        arg_max = j;
                        val_max = items(i, j);
                    }
                }
                for (int i = 0; i < number_classes; i++) {
                    if (arg_max == i) {
                        number_hits[i]++;
                    }
                }
            }
        }

        std::string classes[] = {"ambient_animals", "rain", "running_water", "traffic"};
        for (int i = 0; i < number_classes; i++) {
            float accuracy = (float) number_hits[i] / number_test;
            ssi_wrn("accuracy for class %s : %f \n", classes[i].c_str(), accuracy);
            _probs[i] = accuracy;
        }
        session->Close();

        _handler->handle(consume_info.time, consume_info.dur, 4, 0, _probs, _class_names, 0, 0);
    }
Exemple #12
0
bool FileStreamIn::open (ssi_stream_t &data,
	const ssi_char_t *path,
	ssi_size_t &n_meta,
	void **meta) {

	ssi_msg (SSI_LOG_LEVEL_DETAIL, "open stream file '%s'", path);	

	if (_file_info || _file_data) {
		ssi_wrn ("stream already open");
		return false;
	}

	if (path == 0 || path[0] == '\0') {
		ssi_wrn ("'%s' is not a valid path", path);
		return false;
	}

	FilePath fp (path);
	ssi_char_t *path_info = 0;
	if (strcmp (fp.getExtension (), SSI_FILE_TYPE_STREAM) != 0) {
		path_info = ssi_strcat (path, SSI_FILE_TYPE_STREAM);
	} else {
		path_info = ssi_strcpy (path);
	}	
	_path = ssi_strcpy (path_info);

	_file_info = File::CreateAndOpen (File::ASCII, File::READ, path_info);
	if (!_file_info) {
		ssi_wrn ("could not open info file '%s'", path_info);
		return false;
	}

	TiXmlDocument doc;
	if (!doc.LoadFile (_file_info->getFile ())) {
		ssi_wrn ("failed loading stream from file '%s'", path_info);
		return false;
	}

	TiXmlElement *body = doc.FirstChildElement();	
	if (!body || strcmp (body->Value (), "stream") != 0) {
		ssi_wrn ("tag <stream> missing");
		return false;	
	}

	int v = 0;
	if (body->QueryIntAttribute ("ssi-v", &v) != TIXML_SUCCESS) {
		ssi_wrn ("attribute <ssi-v> in tag <stream> missing");
		return false;	
	}
	_version = ssi_cast (File::VERSION, v);

	if (_version < File::V2) {
		ssi_wrn ("version < V2 not supported");
		return false;
	}
	
	TiXmlElement *element = body->FirstChildElement ("info");
	if (!element || strcmp (element->Value (), "info") != 0) {
		ssi_wrn ("tag <info> missing");
		return false;
	}

	ssi_time_t sample_rate = 0;
	if (element->QueryDoubleAttribute ("sr", &sample_rate) != TIXML_SUCCESS) {
		ssi_wrn ("attribute <sr> missing in tag <info>");
		return false;
	}

	int sample_dimension = 0;
	if (element->QueryIntAttribute ("dim", &sample_dimension) != TIXML_SUCCESS) {
		ssi_wrn ("attribute <dim> missing in tag <info>");
		return false;
	}

	int sample_byte = 0;
	if (element->QueryIntAttribute ("byte", &sample_byte) != TIXML_SUCCESS) {
		ssi_wrn ("attribute <byte> missing in tag <info>");
		return false;
	}

	const char *type = element->Attribute ("type");
	if (!type) {
		ssi_wrn ("attribute <type> missing in tag <info>");
		return false;
	}
	ssi_type_t sample_type;
	if (!ssi_name2type (type, sample_type)) {
		ssi_wrn ("could not parse type from '%s'", type);
		return false;
	}

	const char *ftype_name = element->Attribute ("ftype");
	if (!ftype_name) {
		ssi_wrn ("attribute <ftype> missing in tag <info>");
		return false;
	}
	File::TYPE ftype;
	if (strcmp (ftype_name, File::TYPE_NAMES[0]) == 0) {
		ftype = File::BINARY;
	} else if (strcmp (ftype_name, File::TYPE_NAMES[1]) == 0) {
		ftype = File::ASCII;
	} else {
		ssi_wrn ("attribute <ftype> has invalid value '%s' in tag <info>", ftype_name);
		return false;
	}

	*meta = 0;
	n_meta = 0;

	element = body->FirstChildElement ("meta");
	if (element && strcmp (element->Value (), "meta") == 0) {

		switch (sample_type) {
			case SSI_IMAGE: {
				n_meta = sizeof (ssi_video_params_t);
				ssi_video_params_t *params = new ssi_video_params_t ();
				*meta = params;
				if (element->QueryIntAttribute ("width", &params->widthInPixels) != TIXML_SUCCESS) {
					ssi_wrn ("attribute <width> missing in tag <meta>");
					return false;
				}
				if (element->QueryIntAttribute ("height", &params->heightInPixels) != TIXML_SUCCESS) {
					ssi_wrn ("attribute <height> missing in tag <meta>");
					return false;
				}
				if (element->QueryIntAttribute ("depth", &params->depthInBitsPerChannel) != TIXML_SUCCESS) {
					ssi_wrn ("attribute <depth> missing in tag <meta>");
					return false;
				}
				if (element->QueryIntAttribute ("channels", &params->numOfChannels) != TIXML_SUCCESS) {
					ssi_wrn ("attribute <channels> missing in tag <meta>");
					return false;
				}
				int flip = 0;
				if (element->QueryIntAttribute ("channels", &flip) != TIXML_SUCCESS) {
					ssi_wrn ("attribute <flip> missing in tag <meta>");
				}
				params->flipImage = flip != 0;
		
				break;
			}
			default:
				ssi_wrn ("type '%s' doesn't support meta information", SSI_TYPE_NAMES[sample_type]);
				break;
		}
	}

	ssi_char_t *path_data = ssi_strcat (path_info, "~");			
	_file_data = File::CreateAndOpen (ftype, File::READ, path_data);
	if (!_file_data) {
		ssi_wrn ("could not open data file '%s'", path_data);
		return false;
	}

	ssi_stream_init (data, 0, sample_dimension, sample_byte, sample_type, sample_rate, 0);
	ssi_stream_init (_stream, 0, sample_dimension, sample_byte, sample_type, sample_rate, 0);

	// count chunks
	_n_chunks = 0;	
	_next_chunk = 0;
	element = body->FirstChildElement ("chunk");
	if (element) {
		do {
			_n_chunks++;
			element = element->NextSiblingElement ("chunk");
		} while (element);
	}

	// read in chunks
	_n_samples = 0;
	_samples = new ssi_size_t[_n_chunks];
	_time = new ssi_time_t[_n_chunks];
	_bytes = new ssi_size_t[_n_chunks];	
	element = body->FirstChildElement ("chunk");
	ssi_size_t n = 0;
	if (element) {
		do {
			ssi_time_t time = 0;
			if (element->QueryDoubleAttribute ("from", &time) != TIXML_SUCCESS) {
				ssi_wrn ("attribute <time> missing in tag <chunk>");
				return false;
			}
			_time[n] = time;
			int bytes = 0;
			if (element->QueryIntAttribute ("byte", &bytes) != TIXML_SUCCESS) {
				ssi_wrn ("attribute <bytes> missing in tag <chunk>");
				return false;
			}
			_bytes[n] = ssi_cast (ssi_size_t, bytes);
			int samples = 0;
			if (element->QueryIntAttribute ("num", &samples) != TIXML_SUCCESS) {
				ssi_wrn ("attribute <time> missing in tag <chunk>");
				return false;
			}
			_n_samples += ssi_cast (ssi_size_t, samples);
			_samples[n++] = ssi_cast (ssi_size_t, samples);
			element = element->NextSiblingElement ("chunk");
		} while (element);
	}

	delete[] path_info;
	delete[] path_data;

	return true;
};
Exemple #13
0
bool SVM::train (ISamples &samples,
	ssi_size_t stream_index) {

	if (_options.seed > 0) {
		srand(_options.seed);
	} else {
		srand(ssi_time_ms());
	}

	ISamples *s_balance = 0;
	switch (_options.balance) {
	case BALANCE::OFF: {
		s_balance = &samples;
		break;
	}
	case BALANCE::OVER: {		
		s_balance = new ISOverSample(&samples);
		ssi_pcast(ISOverSample, s_balance)->setOver(ISOverSample::RANDOM);
		ssi_msg(SSI_LOG_LEVEL_BASIC, "balance training set '%u' -> '%u'", samples.getSize(), s_balance->getSize());
		break;
	}
	case BALANCE::UNDER: {		
		s_balance = new ISUnderSample(&samples);
		ssi_pcast(ISUnderSample, s_balance)->setUnder(ISUnderSample::RANDOM);
		ssi_msg(SSI_LOG_LEVEL_BASIC, "balance training set '%u' -> '%u'", samples.getSize(), s_balance->getSize());
		break;
	}
	}

	_n_samples = s_balance->getSize();

	if (_n_samples == 0) {
		ssi_wrn ("empty sample list");
		return false;
	}

	if (isTrained ()) {
		ssi_wrn ("already trained");
		return false;
	}

	_n_classes = s_balance->getClassSize();
	_n_features = s_balance->getStream(stream_index).dim;
	ssi_size_t elements = _n_samples * (_n_features + 1);

	init_class_names(*s_balance);

	_problem = new svm_problem;
	_problem->l = ssi_cast (int, _n_samples);
	_problem->y = new double[_problem->l];
	_problem->x = new svm_node *[_problem->l];	

	s_balance->reset();
	ssi_sample_t *sample;
	int n_sample = 0;
	float *ptr = 0;
	svm_node *node = 0;
	while (sample = s_balance->next()) {
		ptr = ssi_pcast (float, sample->streams[stream_index]->ptr);		
		_problem->x[n_sample] = new svm_node[_n_features + 1];
		_problem->y[n_sample] = ssi_cast (float, sample->class_id);
		node = _problem->x[n_sample];
		for (ssi_size_t nfeat = 0; nfeat < _n_features; nfeat++) {
			node->index = nfeat+1;
            node->value = *ptr;
            ptr++;
			++node;
		}
		node->index = -1;		
		++n_sample;
	}

	if(_options.params.gamma == 0 && _n_features > 0) {
		_options.params.gamma = 1.0 / _n_features;
	}
	
	if (_options.params.kernel_type == PRECOMPUTED) {
		int max_index = ssi_cast (int, _n_features);
		for (int i = 0; i < _problem->l; i++) {
			if (_problem->x[i][0].index != 0) {
				ssi_err ("wrong input format: first column must be 0:sample_serial_number");				
			}
			if ((int)_problem->x[i][0].value <= 0 || (int)_problem->x[i][0].value > max_index) {
				ssi_err ("wrong input format: sample_serial_number out of range");
			}
		}
	}