Example #1
0
def nima_classifier(**kwargs):
    # read parameters
    population = kwargs.get('population')
    generation = kwargs.get('generation')
    tensors = kwargs.get('tensors')
    f_path = kwargs.get('f_path')
    objective = kwargs.get('objective')
    _resolution = kwargs.get('resolution')
    _stf = kwargs.get('stf')

    images = True

    fn = f_path + "gen" + str(generation).zfill(5)
    fitness = []
    best_ind = 0

    # set objective function according to min/max
    fit = 0
    if objective == 'minimizing':
        condition = lambda: (fit < max_fit)  # minimizing
        max_fit = float('inf')
    else:
        condition = lambda: (fit > max_fit)  # maximizing
        max_fit = float('-inf')

    number_tensors = len(tensors)
    with tf.device('/CPU:0'):

        # NIMA classifier
        x = np.stack(
            [tensors[index].numpy() for index in range(number_tensors)],
            axis=0)
        x = preprocess_input_mob(x)
        scores = model.predict(x, batch_size=number_tensors, verbose=0)

        # scores
        for index in range(number_tensors):

            if generation % _stf == 0:
                save_image(tensors[index], index, fn, 3)  # save image

            mean = mean_score(scores[index])
            std = std_score(scores[index])
            # fit = mean - std
            fit = mean

            if condition():
                max_fit = fit
                best_ind = index
            fitness.append(fit)
            population[index]['fitness'] = fit

    # save best indiv
    if images:
        save_image(tensors[best_ind], best_ind, fn, 3, addon='_best')
    return population, population[best_ind]
def nima_nasnet(_dir, progress=False):
    target_size = (224, 224)
    imgs = Path(_dir).files('*.png')
    imgs += Path(_dir).files('*.jpg')
    imgs += Path(_dir).files('*.jpeg')

    with tf.device('/GPU:0'):
        base_model = NASNetMobile((224, 224, 3),
                                  include_top=False,
                                  pooling='avg',
                                  weights=None)
        x = Dropout(0.75)(base_model.output)
        x = Dense(10, activation='softmax')(x)

        model = Model(base_model.input, x)
        model.load_weights('weights/nasnet_weights.h5')

        score_list = []
        total_imgs = len(imgs)
        for i, img_path in enumerate(imgs):
            img = load_img(img_path, target_size=target_size)
            x = img_to_array(img)
            x = np.expand_dims(x, axis=0)

            x = preprocess_input(x)

            scores = model.predict(x, batch_size=1, verbose=0)[0]

            mean = mean_score(scores)
            std = std_score(scores)

            file_name = Path(img_path).name.lower()
            score_list.append((file_name, mean, std))

            if progress and i % 100 == 0:
                sys.stdout.write("\r%d/%d" % (i, total_imgs))
                sys.stdout.flush()

            # print("Evaluating : ", img_path)
            # print("NIMA Score : %0.3f +- (%0.3f)" % (mean, std))

        return sorted(score_list, key=lambda x: int(x[0].split('.')[0]))
def main():

    print_debug(DEBUG)
    # for dataset in [train_image_dir, test_image_dir]:
    for dataset in [test_image_dir, train_image_dir]:
        print(
            '========================================================================'
        )
        print('INCEPTIONNET')
        print('PROCESSING', dataset)
        print(
            '========================================================================'
        )

        df = pd.DataFrame(columns=['item_id', 'mean', 'std'])

        print("Loading images from directory : ", dataset)
        imgs = Path(dataset).files('*.png')
        imgs += Path(dataset).files('*.jpg')
        imgs += Path(dataset).files('*.jpeg')

        N = len(imgs)
        i = 0
        # with tf.device("CPU:0"):
        with tf.device("/device:GPU:0"):
            print('>> init')
            base_model = InceptionResNetV2(input_shape=(None, None, 3),
                                           include_top=False,
                                           pooling='avg',
                                           weights=None)
            x = Dropout(0.75)(base_model.output)
            x = Dense(10, activation='softmax')(x)

            print('>> load weights')
            model = Model(base_model.input, x)
            model.load_weights('weights/inception_resnet_weights.h5')

            score_list = []

            df_temp = pd.DataFrame()
            if DEBUG: STEP = 3
            else: STEP = 1000
            if dataset == train_image_dir: todir = train_filename
            else: todir = test_filename

            for img_path in imgs:
                if i % STEP == 0:
                    end_step = time.time()
                    print('----------------------------')
                    print('{}/{}'.format(i, N))
                    if i > 0:
                        print('time elapse:', end_step - start_step)
                        df = pd.concat([df, df_temp], axis=0)
                        save_pickle(df, todir)
                        df_temp = pd.DataFrame()
                    start_step = time.time()
                if DEBUG: print("\n>> Evaluating : ", img_path)

                img = load_img(img_path, target_size=target_size)
                x = img_to_array(img)
                x = np.expand_dims(x, axis=0)

                x = preprocess_input(x)

                scores = model.predict(x, batch_size=1, verbose=0)[0]

                mean = mean_score(scores)
                std = std_score(scores)

                file_name = Path(img_path).name.lower()
                score_list.append((file_name, mean))

                if DEBUG: print("NIMA Score : %0.3f +- (%0.3f)" % (mean, std))

                filename_w_ext = os.path.basename(img_path)
                filename, file_extension = os.path.splitext(filename_w_ext)

                temp = pd.DataFrame({
                    'item_id': [filename],
                    'mean': [mean],
                    'std': [std]
                })
                if DEBUG: print(temp)

                df = pd.concat([df, temp], axis=0)

                i = i + 1

        df = pd.concat([df, df_temp], axis=0)
        df = df.reset_index(drop=True)
        print(df)
        save_pickle(df, todir)
    model.load_weights('weights/mobilenet_weights.h5')

    score_list = []

    total_score_mean = []
    total_score_std = []
    for img_path in imgs:
        img = load_img(img_path, target_size=target_size)
        x = img_to_array(img)
        x = np.expand_dims(x, axis=0)

        x = preprocess_input(x)

        scores = model.predict(x, batch_size=1, verbose=0)[0]

        mean = mean_score(scores)
        std = std_score(scores)

        if mean < 1000:
            score_mean = mean
            score_std = std
        file_name = Path(img_path).name.lower()
        score_list.append((file_name, mean))

        print("Evaluating : ", img_path)
        print("NIMA Score : %0.3f +- (%0.3f)" % (mean, std))
        print()
        total_score_mean.append(score_mean)
        total_score_std.append(score_std)

    if rank_images:
        print("Reading new file: " + csv_file_path)

        csv_file = pd.read_csv(csv_file_path,
                               sep=';',
                               header=None,
                               names=['id', 'url', 'score'])
        csv_file = csv_file.fillna(0.)  # set nan values in score col to 0
        rows_in_file = csv_file.shape[0]
        # find first row with score 0
        index_list = csv_file.index[csv_file['score'] == 0.]
        if len(index_list) == 0:
            print("everything already predicted")
            total_predicted += rows_in_file
            continue

        chunk_size = CHUNK_SIZE
        offset = index_list[0]
        total_predicted += offset
        urls_list = csv_file['url'].tolist()[offset:]
        total_urls = len(urls_list)
        print("Found {} urls with score 0. Predicting ...".format(total_urls))
        for chunk in gen_batches(urls_list, chunk_size):
            scores = inference_from_urls(model, chunk, batch_size=BATCH_SIZE)
            mean_scores = mean_score(scores)
            csv_file.loc[offset:offset + len(chunk) - 1, 'score'] = mean_scores
            offset += len(chunk)
            total_predicted += len(chunk)
            print("\n{}/{} | Total: {} Saving to {}".format(
                offset, rows_in_file, total_predicted, csv_file_path))
            csv_file.to_csv(csv_file_path, sep=';', header=False)
Example #6
0
def generate_scores(parser):
    
    # get the model name
    model_name = parser.net
    
    # check folder 
    if parser.file is None and parser.folder is None:
        raise Exception('Indicate a file or a folder path')
    
    # list the files to evaluate
    if parser.folder is not None and isdir(parser.folder):
        files = [join(parser.folder, file) for file in listdir(parser.folder)]
    else:
        files = []
    
    # check if the file exists
    if parser.file is not None and len(files) == 0 and isfile(parser.file):
        files = [parser.file]
    
    # if there is not folder or file raise exception
    if len(files) == 0:
        raise Exception('File or folder doesn\'t exists')
    
    # print the files to evaluate
    if parser.vb == 1:
        print('---------- Files to evaluate ----------')
        for i in range(len(files)):
            print('{}: {}'.format(i, files[i]))
        print('---------------------------------------')

    # create vgg, mobilenet or inception
    if model_name == 'vgg_16':
        model = create_VGG()
    elif model_name == 'mobilenet':
        model = create_MobileNet()
    elif model_name == 'inception':
        model = create_Inception()
    
    # load the weights of the network
    model.load_weights('./weights/{}.h5'.format(model_name))
    
    images = []
    # load the images into memmory
    for file in files:
        image = cv2.resize(cv2.cvtColor(cv2.imread(file, 1), cv2.COLOR_BGR2RGB), (224, 224))/255
        images.append(image)
        
    # convert list into numpy array
    images = np.array(images)
    
    y_pred = model.predict(images)
    mean_scores = [mean_score(pred) for pred in y_pred]
    std_scores = [std_score(pred) for pred in y_pred]
    
    print('-------------- Evaluation --------------')
    for i in range(len(files)):
        score = '{} ({}{})'.format(round(mean_scores[i], 3), chr(177), round(std_scores[i], 3))
        print('{}: {} \n\t{}'.format(i, files[i], score))
    print('----------------------------------------')
    
    # save the predictions
    if parser.save:
        data = np.stack([files, mean_scores, std_scores], axis = 1)
        df = pd.DataFrame(data = data, columns = ['file', 'mean', 'std'])
        df.to_csv('evaluations.csv', index = False)