Created
April 16, 2013 22:52
-
-
Save jayrambhia/5400347 to your computer and use it in GitHub Desktop.
Update utility for FaceRecognize Moudle in SimpleCV.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def update(self, images=None, labels=None, csvfile=None, delimiter=";"): | |
""" | |
**SUMMARY** | |
Update the training set of the face recognizer. | |
**PARAMETERS** | |
* *images* - A list of Images or ImageSet. All the images must be of | |
same size. | |
* *labels* - A list of labels(int) corresponding to the image in | |
images. There must be at least two different labels. | |
* *csvfile* - You can also provide a csv file with image filenames | |
and labels instead of providing labels and images | |
separately. | |
* *delimiter* - The delimiter used in csv files. | |
**RETURNS** | |
Nothing. None. | |
**EXAMPLES** | |
>>> f = FaceRecognizer() | |
>>> imgs1 = ImageSet(path/to/images_of_type1) | |
>>> labels1 = ["type1"]*len(imgs1) | |
>>> imgs2 = ImageSet(path/to/images_of_type2) | |
>>> labels2 = ["type2"]*len(imgs2) | |
>>> imgs3 = ImageSet(path/to/images_of_type3) | |
>>> labels3 = ["type3"]*len(imgs3) | |
>>> imgs = imgs1 + imgs2 + imgs3 | |
>>> labels = labels1 + labels2 + labels3 | |
>>> f.train(imgs, labels) | |
>>> img = Image("some_image_of_any_of_the_above_type") | |
>>> print f.predict(img) | |
>>> imgs4 = ImageSet(path/to/some_more_images_of_type1) | |
>>> labels4 = ["type1"]*len(imgs4) | |
>>> imgs5 = ImageSet(path/to/some_more_images_of_type2) | |
>>> labels5 = ["type2"]*len(imgs4) | |
>>> newimgs = imgs4 + imgs5 | |
>>> newlabels = labels4 + labels5 | |
>>> f.update(newimgs, newlabels) | |
>>> img1 = Image("some_image_of_any_of_the_above_type") | |
>>> print f.predict(img1) | |
Save New Fisher Training Data | |
>>> f.save("new_trainingdata.xml") | |
Load Fisher Training Data to update. | |
>>> f1 = FaceRecognizer() | |
>>> f1.load("trainingdata.xml") | |
>>> img = Image("some_image_of_any_of_the_above_type") | |
>>> print f1.predict(img) | |
>>> f1.load("new_trainingdata.xml") | |
>>> img1 = Image("some_image_of_any_of_the_above_type") | |
>>> print f1.predict(img1) | |
#Now Use CSV files for update | |
>>> f1.update(csvfile="CSV_file_name", delimiter=";") | |
>>> img2 = Image("some_image_of_any_of_the_above_type") | |
>>> print f1.predict(img2) | |
""" | |
if not self.supported: | |
warnings.warn("Fisher Recognizer is supported by OpenCV >= 2.4.4") | |
return None | |
if csvfile: | |
images = [] | |
labels = [] | |
import csv | |
try: | |
f = open(csvfile, "rb") | |
except IOError: | |
warnings.warn("No such file found. Update not inititated.") | |
return None | |
self.csvfiles.append(csvfiles) | |
filereader = csv.reader(csvfile, delimiter=delimiter) | |
for row in filereader: | |
images.append(Image(row[0])) | |
labels.append(row[1]) | |
labels_set = list(set(labels)) | |
i = 0 | |
for label in labels_set: | |
self.labels_dict.update({label: i}) | |
self.labels_dict_rev.update({i: label}) | |
i += 1 | |
self.labels_set = list(set(self.labels_set + labels_set)) | |
if isinstance(labels, type(None)): | |
warnings.warn("Labels not provided. Update not inititated.") | |
return None | |
if len(images) != len(labels): | |
warnings.warn("Mismatch in number of labels and number of" / | |
"training images. Update not initiated.") | |
return None | |
w, h = self.imageSize | |
images = [img if img.size() == self.imageSize else img.resize(w, h) | |
for img in images] | |
int_labels = [self.labels_dict[key] for key in labels] | |
self.int_labels += int_labels | |
self.train_labels += labels | |
labels = np.array(int_labels) | |
self.train_imgs += images | |
cv2imgs = [img.getGrayNumpyCv2() for img in images] | |
# self.model.update(cv2imgs, labels) # not yet supported | |
self.model.update(cv2imgs, labels) | |
# Not yet supported | |
# self.eigenValues = self.model.getMat("eigenValues") | |
# self.eigenVectors = self.model.getMat("eigenVectors") | |
# self.mean = self.model.getMat("mean") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment