Source code for ibeis.algo.detect.classifier.classifier

#!/usr/bin/env python2.7
from __future__ import absolute_import, division, print_function
import ibeis
from os.path import isfile, join, exists, expanduser
from ibeis.algo.detect.classifier.model import Classifier_Model
from os import listdir
import utool as ut
import vtool as vt
import numpy as np
import cv2
try:
    from jpcnn.core import JPCNN_Network, JPCNN_Data
except:
    print('[ibeis.algo.detect] WARNING: Could not load CNN library for some detectors (ignore for now)')
    pass

print, print_, printDBG, rrr, profile = ut.inject(
    __name__, '[classifier]')

MODEL_DOMAIN = 'https://lev.cs.rpi.edu/public/models/'

MODEL_URLS = {
    'v1' : 'classifier.v1.npy',
}


[docs]def load_classifier(source_path=None, source_name='classifier', cache_data_filename='data.npy', cache_labels_filename='labels.npy', cache=True, **kwargs): if source_path is None: source_path = expanduser(join('~', 'Desktop', 'extracted')) cache_data_filepath = join(source_path, source_name, cache_data_filename) cache_labels_filepath = join(source_path, source_name, cache_labels_filename) if exists(cache_data_filepath) and exists(cache_labels_filepath) and cache: data_list = np.load(cache_data_filepath) label_list = np.load(cache_labels_filepath) return data_list, label_list label_filepath = join(source_path, source_name, 'labels', 'labels.csv') label_dict = {} with open(label_filepath) as labels: label_list = labels.read().split() for label in label_list: label_list = label.strip().split(',') filename = label_list[0] class_ = label_list[1] label_dict[filename] = class_ background_path = join(source_path, source_name, 'raw') filename_list = [ f for f in listdir(background_path) if isfile(join(background_path, f)) ] assert len(label_dict.keys()) == len(filename_list) data_list = [] label_list = [] print('Loading images...') filename_list = filename_list for index, filename in enumerate(filename_list): if index % 1000 == 0: print(index) label = label_dict[filename] filepath = join(background_path, filename) data = cv2.imread(filepath) # data = cv2.resize(data, (128, 128)) data_list.append(data) label_list.append(label) data_list = np.array(data_list, dtype=np.uint8) label_list = np.array(label_list) np.save(cache_data_filepath, data_list) np.save(cache_labels_filepath, label_list) return data_list, label_list
[docs]def train_classifier(output_path, **kwargs): print('[classifier] Loading the classifier training data') data_list, label_list = load_classifier(**kwargs) print('[classifier] Loading the data into a JPCNN_Data') data = JPCNN_Data() data.set_data_list(data_list) data.set_label_list(label_list) print('[classifier] Create the JPCNN_Model used for training') model = Classifier_Model() print('[classifier] Create the JPCNN_network and start training') net = JPCNN_Network(model, data) model_path = net.train( output_path, train_learning_rate=0.01, train_batch_size=64, train_max_epochs=40, train_mini_batch_augment=False, ) return model_path
[docs]def load_images(cache_data_filename='test_data.npy', cache_labels_filename='test_labels.npy', cache=True): cache_data_filepath = join('.', cache_data_filename) cache_labels_filepath = join('.', cache_labels_filename) if exists(cache_data_filepath) and exists(cache_labels_filepath) and cache: data_list = np.load(cache_data_filepath) label_list = np.load(cache_labels_filepath) return data_list, label_list ibs = ibeis.opendb(dbdir='/media/danger/GGR/GGR-IBEIS-TEST/') gid_list = ibs.get_valid_gids() filepath_list = ibs.get_image_paths(gid_list) data_list = [] label_list = [] for index, (gid, filepath) in enumerate(zip(gid_list, filepath_list)): if index % 25 == 0: print(index) data = vt.imread(filepath, orient='auto') data = cv2.resize(data, (192, 192), interpolation=cv2.INTER_LANCZOS4) aid_list = ibs.get_image_aids(gid) species_list = ibs.get_annot_species_texts(aid_list) shared_set = set(species_list) & set(['zebra_grevys', 'zebra_plains']) label = 'positive' if len(shared_set) > 0 else 'negative' data_list.append(data) label_list.append(label) data_list = np.array(data_list, dtype=np.uint8) label_list = np.array(label_list) np.save(cache_data_filepath, data_list) np.save(cache_labels_filepath, label_list) return data_list, label_list # def test_classifier(output_path): # print('[classifier] Loading the classifier training data') # data_list, label_list = load_images() # print('[mnist] Loading the data into a JPCNN_Data') # data = JPCNN_Data() # data.set_data_list(data_list) # data.set_label_list(label_list) # print('[classifier] Create the JPCNN_Model used for testing') # model = Classifier_Model('model.npy') # print('[mnist] Create the JPCNN_network and start testing') # net = JPCNN_Network(model, data) # test_results = net.test(output_path, best_weights=True) # prediction_list = test_results['label_list'] # confidence_list = test_results['confidence_list'] # best_errors = np.inf # # conf_list = [ _ / 100.0 for _ in range(0, 101) ] # # conf_list = [ 0.81 ] # FOR MODEL.5.NPY # conf_list = [ 0.96 ] # MODEL.6.NPY # for conf in conf_list: # failure_path = join(output_path, 'failures') # ut.ensuredir(failure_path) # error_list = [0, 0, 0, 0] # zipped = zip(data_list, label_list, prediction_list, confidence_list) # for index, (data, label, prediction, confidence) in enumerate(zipped): # if prediction == 'negative' and confidence < conf: # prediction = 'positive' # confidence == 1.0 - confidence # if label == prediction and label == 'positive': # error_list[0] += 1 # elif label == prediction and label == 'negative': # error_list[1] += 1 # elif label != prediction: # if label == 'positive': # error_list[2] += 1 # elif label == 'negative': # error_list[3] += 1 # args = (confidence, index, label, prediction) # failure_filename = 'failure_%0.05f_%06d_%s_%s.png' % args # failure_filepath = join(failure_path, failure_filename) # cv2.imwrite(failure_filepath, data) # errors = error_list[2] + error_list[3] # total = sum(error_list) # if errors < best_errors: # best_errors = errors # print(error_list) # args = (conf, errors / total, errors, total, ) # print('Error rate %0.2f: %0.03f [ %d / %d ]' % args)
[docs]def classify_thumbnail_list(thumbnail_list, model='v1'): print('[classifier] Loading the classifier training data') data_list = np.array(thumbnail_list, dtype=np.uint8) print('[mnist] Loading the data into a JPCNN_Data') data = JPCNN_Data() data.set_data_list(data_list) print('[classifier] Create the JPCNN_Model used for testing') url = MODEL_DOMAIN + MODEL_URLS[model] model_path = ut.grab_file_url(url, appname='ibeis') model = Classifier_Model(model_path) print('[mnist] Create the JPCNN_network and start testing') net = JPCNN_Network(model, data) test_results = net.test('.', best_weights=True) prediction_list = test_results['label_list'] confidence_list = test_results['confidence_list'] result_list = list(zip(confidence_list, prediction_list)) # Release memory data = None model = None net = None return result_list
if __name__ == '__main__': OUTPUT_PATH = '.' # Train network on Classifier training data train_classifier(OUTPUT_PATH) # Test network on Classifier training data # test_classifier(OUTPUT_PATH)