I work with python and images of watches (examples: watch_1, watch_2, watch_3). My aim is to take a photo of a random watch and then find the most similar watches to it in my database. Obviously, one main feature which distinguishes the watches are their shape (square, rectangular, round, oval) but there are also other ones.
For now, I am just running a PCA and a KNN on rgb images of watches to find the most similar ones among them. My source code is the following:
import cv2 import numpy as np import os from glob import glob from sklearn.decomposition import PCA from sklearn import neighbors from sklearn import preprocessing data =  # Read images from file for filename in glob('Watches/*.jpg'): img = cv2.imread(filename) height, width = img.shape[:2] img = np.array(img) # Check that all my images are of the same resolution if height == 529 and width == 940: # Reshape each image so that it is stored in one line img = np.concatenate(img, axis=0) img = np.concatenate(img, axis=0) data.append(img) # Normalise data data = np.array(data) Norm = preprocessing.Normalizer() Norm.fit(data) data = Norm.transform(data) # PCA model pca = PCA(0.95) pca.fit(data) data = pca.transform(data) # K-Nearest neighbours knn = neighbors.NearestNeighbors(n_neighbors=4, algorithm='ball_tree', metric='minkowski').fit(data) distances, indices = knn.kneighbors(data) print(indices)
However when I try to run this script for more than 1500 rgb images then I get a
MemoryError at the point where the data are processed by the PCA method.
Is this normal for a pc with 24GB RAM and 3.6GHz Intel Core CPU without any discrete GPU?
How can I overcome this?
Shall I use another method like Incremental PCA (or a deep learning algorithm) or simply shall I buy a discrete GPU?