| import os | |
| import numpy as np | |
| import pickle | |
| import tensorflow as tf | |
| from tqdm import tqdm | |
| from keras.preprocessing import image | |
| from keras.layers import GlobalMaxPooling2D | |
| from keras.applications.resnet50 import ResNet50, preprocess_input | |
| from numpy.linalg import norm | |
| model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3)) | |
| model.trainable = False | |
| model = tf.keras.Sequential([ | |
| model, | |
| GlobalMaxPooling2D() | |
| ]) | |
| def extract_features(img_path, model): | |
| img = image.load_img(img_path, target_size=(224, 224)) | |
| img_array = image.img_to_array(img) | |
| expanded_img_array = np.expand_dims(img_array, axis=0) | |
| preprocessed_img = preprocess_input(expanded_img_array) | |
| result = model.predict(preprocessed_img).flatten() | |
| normalized_result = result / norm(result) | |
| return normalized_result | |
| root_folder = 'kitpotproduct' | |
| feature_list = [] | |
| filenames = [] | |
| for root, dirs, files in os.walk(root_folder): | |
| for file in tqdm(files): | |
| if file.lower().endswith(('.png', '.jpg', '.jpeg','PNG','JPG','JPEG')): | |
| img_path = os.path.join(root, file) | |
| try: | |
| img = image.load_img(img_path, target_size=(224, 224)) | |
| filenames.append(img_path) | |
| feature_list.append(extract_features(img_path, model)) | |
| except (OSError, IOError, ValueError, Exception) as e: | |
| print(f"Error processing file: {img_path}") | |
| print(f"Error message: {str(e)}") | |
| continue | |
| with open('res_vector_embeddings.pkl', 'wb') as f: | |
| pickle.dump(feature_list, f) | |
| with open('res_filenames.pkl', 'wb') as f: | |
| pickle.dump(filenames, f) |