def classify_image(cc, img_idx, C=1.0, gamma=0.0, cls=None): """ Input: ClassifierConfig, img_idx Output: Score for given class; 20list of scores if cls=None """ feat_vect = get_feature_vector(cc, img_idx) if cls == None: score = {} for cls_idx, cls in enumerate(cc.d.classes): print '\tclassify %s for %s on %d'%(cc.d.images[img_idx].name, cls, comm_rank) path = config.get_classifier_svm_name(cls, C, gamma) if os.path.exists(path): clf = load_svm(path) score[cls_idx] = svm_predict(feat_vect, clf) else: clf = load_svm(config.get_classifier_svm_name(cls)) score = svm_predict(feat_vect, clf) return score
def classify_image(cc, img_idx, C=1.0, gamma=0.0, cls=None): """ Input: ClassifierConfig, img_idx Output: Score for given class; 20list of scores if cls=None """ feat_vect = get_feature_vector(cc, img_idx) if cls == None: score = {} for cls_idx, cls in enumerate(cc.d.classes): print '\tclassify %s for %s on %d' % (cc.d.images[img_idx].name, cls, comm_rank) path = config.get_classifier_svm_name(cls, C, gamma) if os.path.exists(path): clf = load_svm(path) score[cls_idx] = svm_predict(feat_vect, clf) else: clf = load_svm(config.get_classifier_svm_name(cls)) score = svm_predict(feat_vect, clf) return score
def train_image_classify_svm(cc, cls, C=1.0, gamma=0.0, force_new=False): current_fold = cc.d.current_fold filename = config.get_classifier_svm_name(cls, C, gamma, current_fold) if not force_new and os.path.exists(filename): print 'svm for class %s, C=%f, gamma=%f exists already' % (cls, C, gamma) return pyr_feat_size = get_pyr_feat_size(cc.L, cc.dense_codebook.shape[0]) cc.tictocer.tic('overall') print 'compute classifier(C=%f, gamma=%f) for class %s' % (C, gamma, cls) pos_images = cc.d.get_pos_samples_for_fold_class(cls) if pos_images.size == 0: return neg_images = cc.d.get_neg_samples_for_fold_class(cls, pos_images.size) # 1. extract all the pyramids # ======== POSTIVE IMAGES =========== print 'compute feature vector for positive images' num_slices = 3 pos_pyrs = np.zeros( (len(pos_images), pyr_feat_size + cc.sparse_codebook.shape[0] * (1 + num_slices))) for idx, img in enumerate(pos_images): pos_pyrs[idx, :] = get_feature_vector(cc, img) # ======== NEGATIVE IMAGES =========== print 'compute feature vector for negative images' neg_pyrs = np.zeros( (len(neg_images), pyr_feat_size + cc.sparse_codebook.shape[0] * (1 + num_slices))) for idx, img in enumerate(neg_images): neg_pyrs[idx, :] = get_feature_vector(cc, img) # 2. Compute SVM for class X = np.vstack((pos_pyrs, neg_pyrs)) Y = [1] * pos_pyrs.shape[0] + [-1] * neg_pyrs.shape[0] if X.shape[0] > 0: print 'train svm for class %s, C=%f, gamma=%f' % (cls, C, gamma) cc.tictocer.tic() clf = train_svm(X, Y, kernel='rbf', gamma=gamma, C=C) print '\ttook %f seconds' % cc.tictocer.toc(quiet=True) print 'save as', filename save_svm(clf, filename) else: print 'Don\'t compute SVM, no examples given' print 'training all classifier SVMs took:', cc.tictocer.toc( 'overall', quiet=True), 'seconds on', comm_rank
def classify_images(cc, images, C, gamma): res = np.zeros((images.shape[0], len(cc.d.classes))) for cls_idx, cls in enumerate(cc.d.classes): filename = config.get_classifier_svm_name(cls, C, gamma, cc.d.current_fold) if not os.path.exists(filename): continue clf = load_svm(filename, probability=False) for idx2, img_idx in enumerate(images): x = get_feature_vector(cc, img_idx) pred = svm_predict(x, clf) if pred.size > 0: res[idx2, cls_idx] = 1 return res*2-1
def classify_images(cc, images, C, gamma): res = np.zeros((images.shape[0], len(cc.d.classes))) for cls_idx, cls in enumerate(cc.d.classes): filename = config.get_classifier_svm_name(cls, C, gamma, cc.d.current_fold) if not os.path.exists(filename): continue clf = load_svm(filename, probability=False) for idx2, img_idx in enumerate(images): x = get_feature_vector(cc, img_idx) pred = svm_predict(x, clf) if pred.size > 0: res[idx2, cls_idx] = 1 return res * 2 - 1
def train_image_classify_svm(cc, cls, C=1.0, gamma=0.0, force_new=False): current_fold = cc.d.current_fold filename = config.get_classifier_svm_name(cls, C, gamma, current_fold) if not force_new and os.path.exists(filename): print 'svm for class %s, C=%f, gamma=%f exists already'%(cls,C,gamma) return pyr_feat_size = get_pyr_feat_size(cc.L, cc.dense_codebook.shape[0]) cc.tictocer.tic('overall') print 'compute classifier(C=%f, gamma=%f) for class %s'%(C, gamma, cls) pos_images = cc.d.get_pos_samples_for_fold_class(cls) if pos_images.size == 0: return neg_images = cc.d.get_neg_samples_for_fold_class(cls, pos_images.size) # 1. extract all the pyramids # ======== POSTIVE IMAGES =========== print 'compute feature vector for positive images' num_slices = 3 pos_pyrs = np.zeros((len(pos_images),pyr_feat_size + cc.sparse_codebook.shape[0]*(1+num_slices))) for idx, img in enumerate(pos_images): pos_pyrs[idx, :] = get_feature_vector(cc, img) # ======== NEGATIVE IMAGES =========== print 'compute feature vector for negative images' neg_pyrs = np.zeros((len(neg_images),pyr_feat_size + cc.sparse_codebook.shape[0]*(1+num_slices))) for idx, img in enumerate(neg_images): neg_pyrs[idx, :] = get_feature_vector(cc, img) # 2. Compute SVM for class X = np.vstack((pos_pyrs, neg_pyrs)) Y = [1]*pos_pyrs.shape[0] + [-1]*neg_pyrs.shape[0] if X.shape[0] > 0: print 'train svm for class %s, C=%f, gamma=%f'%(cls,C,gamma) cc.tictocer.tic() clf = train_svm(X, Y, kernel='rbf', gamma=gamma, C=C) print '\ttook %f seconds'%cc.tictocer.toc(quiet=True) print 'save as', filename save_svm(clf, filename) else: print 'Don\'t compute SVM, no examples given' print 'training all classifier SVMs took:', cc.tictocer.toc('overall', quiet=True), 'seconds on', comm_rank