SVM к распознаванию пола

Эти недели я работал над проектом по распознаванию пола (на питоне), используя сначала: Fisherfaces как метод извлечения признаков и классификатор 1-NN с евклидовым расстоянием, но теперь я, хотя он был недостаточно надежным (по моему скромному мнению), поэтому я Я собираюсь использовать SVM, но я потерялся, когда мне нужно создать и обучить модель, чтобы использовать ее в моем наборе данных изображений, но я не могу найти решение для нужных мне команд в http://scikit-learn.org. Я пробовал с этим кодом, но он не работает, не знаю, почему у меня возникает эта ошибка при выполнении:

  File "prueba.py", line 46, in main
    clf.fit(R, r)
  File "/Users/Raul/anaconda/lib/python2.7/site-packages/sklearn/svm/base.py", line 139, in fit    
 X = check_array(X, accept_sparse='csr', dtype=np.float64, order='C')
  File "/Users/Raul/anaconda/lib/python2.7/site-packages/sklearn/utils/validation.py", line 350, in check_array
    array.ndim)
ValueError: Found array with dim 3. Expected <= 2

И это мой код:

import os, sys
import numpy as np
import PIL.Image as Image
import cv2
from sklearn import svm


def read_images(path, id, sz=None):
    c = id
    X,y = [], []
    for dirname, dirnames, filenames in os.walk(path):
        for subdirname in dirnames:
            subject_path = os.path.join(dirname, subdirname)
            for filename in os.listdir(subject_path):
                try:
                    im = Image.open(os.path.join(subject_path, filename))
                    im = im.convert("L")
                    # resize to given size (if given)
                    if (sz is not None):
                        im = im.resize(sz, Image.ANTIALIAS)
                    X.append(np.asarray(im, dtype=np.uint8))
                    y.append(c)
                except IOError as e:
                    print "I/O error({0}): {1}".format(e.errno, e.strerror)
                except:
                    print "Unexpected error:", sys.exc_info()[0]
                    raise
                        #c = c+1
    return [X,y]


def main():
    # check arguments
    if len(sys.argv) != 3:
        print "USAGE: example.py </path/to/images/males> </path/to/images/females>"
        sys.exit()
    # read images and put them into Vectors and id's
    [X,x] = read_images(sys.argv[1], 1)
    [Y, y] = read_images(sys.argv[2], 0)
    # R all images and r all id's
    [R, r] = [X+Y, x+y]
    clf = svm.SVC()
    clf.fit(R, r)





if __name__ == '__main__':
    main()

Я был бы признателен за любую помощь в том, как я могу распознать пол с помощью SVM. Спасибо за чтение.


person Raul S    schedule 29.04.2015    source источник


Ответы (1)


X.append(np.asarray(im, dtype=np.uint8))

Я предполагаю, что это добавление 2d-массива. Возможно, вы захотите сгладить его перед добавлением, чтобы каждый экземпляр выглядел следующим образом:

array([255, 255, 255, ..., 255, 255, 255], dtype=uint8)

вместо:

array([
   [255, 255, 255, ..., 255, 255, 255],
   [255, 255, 255, ..., 255, 255, 255],
   [255,   0,   0, ...,   0,   0,   0],
   ..., 
   [255,   0,   0, ...,   0,   0,   0],
   [255, 255, 255, ..., 255, 255, 255],
   [255, 255, 255, ..., 255, 255, 255]], dtype=uint8)

Попробуй это:

X.append(np.asarray(im, dtype=np.uint8).ravel())
person greeness    schedule 30.04.2015
comment
Спасибо @greeness, теперь я могу создать модель, чтобы делать прогнозы. Теперь все, что мне нужно сделать, это загрузить изображение лица, которое я хочу проанализировать, и сделать clf.predict (изображения), и если результат, который я получаю, равен 1, мужчина и женщина, если я получаю 0? Спасибо за ответ - person Raul S; 30.04.2015