Skip to content

Instantly share code, notes, and snippets.

@jayrambhia
Created April 16, 2013 22:52
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jayrambhia/5400347 to your computer and use it in GitHub Desktop.
Save jayrambhia/5400347 to your computer and use it in GitHub Desktop.
Update utility for FaceRecognize Moudle in SimpleCV.
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