|
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) |