Common subdirectories: modules/ml/src//.svn and modules/ml/src.update//.svn diff -c modules/ml/src//em.cpp modules/ml/src.update//em.cpp *** modules/ml/src//em.cpp Thu Sep 1 14:10:21 2011 --- modules/ml/src.update//em.cpp Thu Sep 1 12:42:16 2011 *************** *** 797,803 **** else { int max_count = 0; ! CV_CALL( class_ranges = cvCreateMat( 1, nclusters+1, CV_32SC1 )); if( nclusters > 1 ) { --- 797,803 ---- else { int max_count = 0; ! int nclusters_found; CV_CALL( class_ranges = cvCreateMat( 1, nclusters+1, CV_32SC1 )); if( nclusters > 1 ) { *************** *** 808,814 **** params.means ? 1 : 10, 0.5 ), params.means ); CV_CALL( cvSortSamplesByClasses( (const float**)train_data.data.fl, ! labels, class_ranges->data.i )); } else { --- 808,814 ---- params.means ? 1 : 10, 0.5 ), params.means ); CV_CALL( cvSortSamplesByClasses( (const float**)train_data.data.fl, ! labels, class_ranges->data.i, &nclusters_found )); } else { *************** *** 816,822 **** class_ranges->data.i[1] = nsamples; } ! for( i = 0; i < nclusters; i++ ) { int left = class_ranges->data.i[i], right = class_ranges->data.i[i+1]; max_count = MAX( max_count, right - left ); --- 816,822 ---- class_ranges->data.i[1] = nsamples; } ! for( i = 0; i < nclusters_found; i++ ) { int left = class_ranges->data.i[i], right = class_ranges->data.i[i+1]; max_count = MAX( max_count, right - left ); *************** *** 830,843 **** hdr[i] = hdr[0]; } ! for( i = 0; i < nclusters; i++ ) { int left = class_ranges->data.i[i], right = class_ranges->data.i[i+1]; int cluster_size = right - left; CvMat avg; ! if( cluster_size <= 0 ) ! continue; for( j = left; j < right; j++ ) hdr[j - left].data.fl = train_data.data.fl[j]; --- 830,842 ---- hdr[i] = hdr[0]; } ! for( i = 0; i < nclusters_found; i++ ) { int left = class_ranges->data.i[i], right = class_ranges->data.i[i+1]; int cluster_size = right - left; CvMat avg; ! // if( cluster_size <= 0 ) continue; for( j = left; j < right; j++ ) hdr[j - left].data.fl = train_data.data.fl[j]; *************** *** 847,852 **** --- 846,856 ---- &avg, CV_COVAR_NORMAL | CV_COVAR_SCALE )); weights->data.db[i] = (double)cluster_size/(double)nsamples; } + for( i = nclusters_found; i < nclusters; i++ ) + { + cvZero(covs[i]); + weights->data.db[i] = 0; + } } __END__; *************** *** 859,873 **** void CvEM::kmeans( const CvVectors& train_data, int nclusters, CvMat* labels, ! CvTermCriteria termcrit, const CvMat* /*centers0*/ ) { ! int i, nsamples = train_data.count, dims = train_data.dims; ! cv::Ptr temp_mat = cvCreateMat(nsamples, dims, CV_32F); ! for( i = 0; i < nsamples; i++ ) ! memcpy( temp_mat->data.ptr + temp_mat->step*i, train_data.data.fl[i], dims*sizeof(float)); ! ! cvKMeans2(temp_mat, nclusters, labels, termcrit, 10); } --- 863,1052 ---- void CvEM::kmeans( const CvVectors& train_data, int nclusters, CvMat* labels, ! CvTermCriteria termcrit, const CvMat* centers0 ) { ! CvMat* centers = 0; ! CvMat* old_centers = 0; ! CvMat* counters = 0; ! ! CV_FUNCNAME( "CvEM::kmeans" ); ! ! __BEGIN__; ! ! ! cv::RNG* rng = &cv::theRNG(); ! int i, j, k, nsamples, dims; ! int iter = 0; ! double max_dist = DBL_MAX; ! ! termcrit = cvCheckTermCriteria( termcrit, 1e-6, 100 ); ! termcrit.epsilon *= termcrit.epsilon; ! nsamples = train_data.count; ! dims = train_data.dims; ! nclusters = MIN( nclusters, nsamples ); ! ! CV_CALL( centers = cvCreateMat( nclusters, dims, CV_64FC1 )); ! CV_CALL( old_centers = cvCreateMat( nclusters, dims, CV_64FC1 )); ! CV_CALL( counters = cvCreateMat( 1, nclusters, CV_32SC1 )); ! cvZero( old_centers ); ! ! if( centers0 ) ! { ! CV_CALL( cvConvert( centers0, centers )); ! } ! else ! { ! for( i = 0; i < nsamples; i++ ) ! labels->data.i[i] = i*nclusters/nsamples; ! cvRandShuffle( labels, &rng->state ); ! } ! ! for( ;; ) ! { ! CvMat* temp; ! ! if( iter > 0 || centers0 ) ! { ! for( i = 0; i < nsamples; i++ ) ! { ! const float* s = train_data.data.fl[i]; ! int k_best = 0; ! double min_dist = DBL_MAX; ! ! for( k = 0; k < nclusters; k++ ) ! { ! const double* c = (double*)(centers->data.ptr + k*centers->step); ! double dist = 0; ! ! for( j = 0; j <= dims - 4; j += 4 ) ! { ! double t0 = c[j] - s[j]; ! double t1 = c[j+1] - s[j+1]; ! dist += t0*t0 + t1*t1; ! t0 = c[j+2] - s[j+2]; ! t1 = c[j+3] - s[j+3]; ! dist += t0*t0 + t1*t1; ! } ! ! for( ; j < dims; j++ ) ! { ! double t = c[j] - s[j]; ! dist += t*t; ! } ! ! if( min_dist > dist ) ! { ! min_dist = dist; ! k_best = k; ! } ! } ! ! labels->data.i[i] = k_best; ! } ! } ! ! if( ++iter > termcrit.max_iter ) ! break; ! ! CV_SWAP( centers, old_centers, temp ); ! cvZero( centers ); ! cvZero( counters ); ! ! // update centers ! for( i = 0; i < nsamples; i++ ) ! { ! const float* s = train_data.data.fl[i]; ! k = labels->data.i[i]; ! double* c = (double*)(centers->data.ptr + k*centers->step); ! ! for( j = 0; j <= dims - 4; j += 4 ) ! { ! double t0 = c[j] + s[j]; ! double t1 = c[j+1] + s[j+1]; ! ! c[j] = t0; ! c[j+1] = t1; ! ! t0 = c[j+2] + s[j+2]; ! t1 = c[j+3] + s[j+3]; ! ! c[j+2] = t0; ! c[j+3] = t1; ! } ! for( ; j < dims; j++ ) ! c[j] += s[j]; ! counters->data.i[k]++; ! } ! ! if( iter > 1 ) ! max_dist = 0; ! ! for( k = 0; k < nclusters; k++ ) ! { ! double* c = (double*)(centers->data.ptr + k*centers->step); ! if( counters->data.i[k] != 0 ) ! { ! double scale = 1./counters->data.i[k]; ! for( j = 0; j < dims; j++ ) ! c[j] *= scale; ! } ! else ! { ! const float* s; ! for( j = 0; j < 10; j++ ) ! { ! i = (*rng)(nsamples); ! if( counters->data.i[labels->data.i[i]] > 1 ) ! break; ! } ! s = train_data.data.fl[i]; ! for( j = 0; j < dims; j++ ) ! c[j] = s[j]; ! } ! ! if( iter > 1 ) ! { ! double dist = 0; ! const double* c_o = (double*)(old_centers->data.ptr + k*old_centers->step); ! for( j = 0; j < dims; j++ ) ! { ! double t = c[j] - c_o[j]; ! dist += t*t; ! } ! if( max_dist < dist ) ! max_dist = dist; ! } ! } ! ! if( max_dist < termcrit.epsilon ) ! break; ! } ! ! cvZero( counters ); for( i = 0; i < nsamples; i++ ) ! counters->data.i[labels->data.i[i]]++; ! ! // ensure that we do not have empty clusters ! for( k = 0; k < nclusters; k++ ) ! if( counters->data.i[k] == 0 ) ! for(;;) ! { ! i = (*rng)(nsamples); ! j = labels->data.i[i]; ! if( counters->data.i[j] > 1 ) ! { ! labels->data.i[i] = k; ! counters->data.i[j]--; ! counters->data.i[k]++; ! break; ! } ! } ! ! __END__; ! ! cvReleaseMat( ¢ers ); ! cvReleaseMat( &old_centers ); ! cvReleaseMat( &counters ); } Only in modules/ml/src.update/: em.cpp.original diff -c modules/ml/src//inner_functions.cpp modules/ml/src.update//inner_functions.cpp *** modules/ml/src//inner_functions.cpp Thu Sep 1 14:10:28 2011 --- modules/ml/src.update//inner_functions.cpp Wed Aug 31 14:03:20 2011 *************** *** 1026,1032 **** void cvSortSamplesByClasses( const float** samples, const CvMat* classes, ! int* class_ranges, const uchar** mask ) { CvSampleResponsePair* pairs = 0; CV_FUNCNAME( "cvSortSamplesByClasses" ); --- 1026,1032 ---- void cvSortSamplesByClasses( const float** samples, const CvMat* classes, ! int* const class_ranges, int* const num_classes_found, const uchar** mask ) { CvSampleResponsePair* pairs = 0; CV_FUNCNAME( "cvSortSamplesByClasses" ); *************** *** 1035,1041 **** int i, k = 0, sample_count; ! if( !samples || !classes || !class_ranges ) CV_ERROR( CV_StsNullPtr, "INTERNAL ERROR: some of the args are NULL pointers" ); if( classes->rows != 1 || CV_MAT_TYPE(classes->type) != CV_32SC1 ) --- 1035,1041 ---- int i, k = 0, sample_count; ! if( !samples || !classes || !class_ranges || !num_classes_found) CV_ERROR( CV_StsNullPtr, "INTERNAL ERROR: some of the args are NULL pointers" ); if( classes->rows != 1 || CV_MAT_TYPE(classes->type) != CV_32SC1 ) *************** *** 1068,1073 **** --- 1068,1075 ---- class_ranges[++k] = i+1; } + *num_classes_found = k; + __END__; cvFree( &pairs ); Only in modules/ml/src.update/: inner_functions.cpp.new Only in modules/ml/src.update/: inner_functions.cpp.original diff -c modules/ml/src//precomp.hpp modules/ml/src.update//precomp.hpp *** modules/ml/src//precomp.hpp Thu Sep 1 14:10:33 2011 --- modules/ml/src.update//precomp.hpp Wed Aug 31 14:02:54 2011 *************** *** 299,305 **** void cvSortSamplesByClasses( const float** samples, const CvMat* classes, ! int* class_ranges, const uchar** mask CV_DEFAULT(0) ); void cvCombineResponseMaps (CvMat* _responses, --- 299,305 ---- void cvSortSamplesByClasses( const float** samples, const CvMat* classes, ! int* const class_ranges, int* const num_classes_found, const uchar** mask CV_DEFAULT(0) ); void cvCombineResponseMaps (CvMat* _responses, Only in modules/ml/src.update/: precomp.hpp.original diff -c modules/ml/src//svm.cpp modules/ml/src.update//svm.cpp *** modules/ml/src//svm.cpp Thu Sep 1 14:10:24 2011 --- modules/ml/src.update//svm.cpp Thu Sep 1 13:38:56 2011 *************** *** 1396,1405 **** sample_count*sizeof(temp_samples[0]))); CV_CALL( temp_y = (schar*)cvMemStorageAlloc( temp_storage, sample_count)); ! class_ranges[class_count] = 0; ! cvSortSamplesByClasses( samples, responses, class_ranges, 0 ); //check that while cross-validation there were the samples from all the classes ! if( class_ranges[class_count] <= 0 ) CV_ERROR( CV_StsBadArg, "While cross-validation one or more of the classes have " "been fell out of the sample. Try to enlarge " ); --- 1396,1405 ---- sample_count*sizeof(temp_samples[0]))); CV_CALL( temp_y = (schar*)cvMemStorageAlloc( temp_storage, sample_count)); ! int class_count_found; ! cvSortSamplesByClasses( samples, responses, class_ranges, &class_count_found, 0 ); //check that while cross-validation there were the samples from all the classes ! if (class_count_found < class_count) CV_ERROR( CV_StsBadArg, "While cross-validation one or more of the classes have " "been fell out of the sample. Try to enlarge " ); Only in modules/ml/src.update/: svm.cpp.original