SVM Sklearn Bagging всегда возвращает тот же прогноз

Я извлекаю гистограммы HSV и LBP из изображения и передаю их классификатору Sklearn Bagging, который использует SVC в качестве базовой оценки для определения пола. Я создал файл csv с этими гистограммами, сохраненными в виде векторов подряд. Обучил модель на% 80 этого набора данных, получил точность 0,92 в тестовом наборе данных. Но когда я пытаюсь запустить модель в другом коде Python, классификатор всегда возвращает один и тот же результат.

Я попытался загрузить модель обратно в блокнот jupyter и протестировал с тем же набором данных, чтобы увидеть, есть ли проблемы с процессами сохранения / загрузки. Проверил функции, извлеченные в реальном времени, и увидел, что все они разные.

Функции для извлечения упомянутых функций и создания прогнозов (функция feature_extractor - это та же функция, которая использовалась для создания набора данных для обучения):

from skimage import feature
import image_slicer as slicah
import cv2
import numpy as np
import joblib

gender_classifier = joblib.load('models/bagging92.sav')

NumberOfGrids = 16
numPoints = 11## Parameters for LBP
radius = 2

hue_bins = 24
swh_hist = np.zeros(hue_bins)
bin_edges = np.linspace(0,360,hue_bins)  # Calculate bin edges

slope = hue_bins / (bin_edges[-1] + 0.01)  ## Interpolates hue values in degrees to bin labels when multiplied


def feature_extractor(image):
    grids_PIL = slicah.slice_from_array(image, NumberOfGrids, save=False) ## Split image into grids
    feature_vect, blockFeatures, hsv_feature_vect = [], [], []
    w, h, _ = np.shape(grids_PIL[0].image) # Drop the rgb channel
    norm_factor = w * h

    for grid in grids_PIL:  ## Loop through grids
        temp_img = cv2.cvtColor(np.array(grid.image, dtype=np.uint8),
                                cv2.COLOR_BGR2GRAY)  ## Convert PIL image object to np array
        hsv_img = cv2.cvtColor(np.array(grid.image), cv2.COLOR_BGR2HSV) ## Convert to HSV color space

        non_uni = 0

        lbp = feature.local_binary_pattern(temp_img, numPoints, radius, method='uniform') ## get uniform lbp
        lbp2 = feature.local_binary_pattern(temp_img, numPoints, radius)  ## Get non uniform LBP

        # Map hue from 0-180 between 0-360                    # Map sat from 0-255 between 0-100
        hue, sat = hsv_img[:, :, 0].astype(np.float16) * 2, hsv_img[:, :, 1].astype(np.float16) * 0.39215686274509803

        for jj in range(temp_img.shape[1]):
            for ii in range(temp_img.shape[0]):
                swh_hist[int(hue[ii][jj] * slope)] += sat[ii][jj]  ## Create SWH Histogram for the individual grid
                if not uniformity(lbp2[ii][jj]):
                    non_uni += 1 ## Count non uni LBP pixels in the grid

        hsv_feature_vect = np.append(hsv_feature_vect, swh_hist)

        hist, _ = np.histogram(lbp, bins=31)
        hist = np.append(hist, non_uni) / norm_factor

        blockFeatures.append(hist)

    feature_vect = list(np.concatenate(blockFeatures))
    hsv_feature_vect = np.array([hsv_feature_vect]) / (norm_factor)
    hsv_feature_vect = list(np.concatenate(hsv_feature_vect))
    features = np.array(np.append(feature_vect, hsv_feature_vect))
    return (np.around(features, decimals=3))

def classify_gender(face_features):

    prediction = gender_classifier.predict(face_features.reshape(1,-1))

    return prediction

Как я использую эти функции:

import cv2, argparse
import utils_gender


ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,
    help="path to the video to be processed")
args = vars(ap.parse_args())

image = cv2.imread(args["image"])

head_features = utils_gender.feature_extractor(image)

gender = utils_gender.classify_gender(head_features)

print(gender)

Ссылка на привод ниже содержит модель, набор данных и записную книжку, которые я использовал во всех упомянутых мною материалах.

https://drive.google.com/open?id=1Sc5ANjomztd6quqqkAx4HMLEXAHyhZcf

Выходы должны варьироваться между мужчинами и женщинами, но в каждом случае я получаю только женские.


person Orcun Deniz    schedule 06.09.2019    source источник


Ответы (1)


Вы должны предоставить описание того, как была обучена модель.

Если вы фактически использовали 20% «тестовых» данных в качестве набора для проверки, это означало бы, что ваша модель, возможно, ничего не узнала и просто переоснащается.

person brandoldperson    schedule 06.09.2019