Я извлекаю гистограммы 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
Выходы должны варьироваться между мужчинами и женщинами, но в каждом случае я получаю только женские.