Untitled
python
2 months ago
5.0 kB
10
Indexable
Never
def calculate_similarity1(image1, image2): mse = tf.reduce_mean(tf.abs(image1 - image2) / 255) return mse %matplotlib inline from PIL import Image import numpy as np import matplotlib.pyplot as plt import tensorflow as tf from tensorflow.keras import layers, models # Создание модели (аналогично предыдущим примерам) model = models.Sequential() #сверточный слой к модели model.add(layers.Conv2D(250, (15, 15), activation='relu', input_shape=(70, 70, 3))) #слой подвыборки (max pooling), который уменьшает размерность данных, сохраняя наиболее значимые значения model.add(layers.MaxPooling2D((5,5))) # слой "сплющивания", преобразует многомерные данные в одномерный вектор перед подачей на полносвязные слои model.add(layers.Flatten()) #полносвязный слой с 500 нейронами и функцией активации ReLU model.add(layers.Dense(1000, activation='relu')) # полносвязный слой с 14700 нейроном 70х70х3 и линейной функцией активации. # Это используется для регрессии, где модель предсказывает непрерывное числовое значение. model.add(layers.Dense(14700, activation='linear')) # Компиляция модели #model.compile(optimizer='adam', loss='mean_squared_error', metrics=['mae']) model.compile(optimizer='Nadam', loss=calculate_similarity1, metrics=['mae']) model.summary() k=0 while True: k+=1 # Загрузите изображение image_path = 'probe.jpg' original_image = Image.open(image_path).resize((70, 70)) # Загрузка и изменение размера original_img_array = np.array(original_image) / 255.0 # Преобразование массива в ожидаемую размерность preprocessed_image = original_img_array.reshape(1, 70, 70, 3) # Примените модель к изображению processed_image = model.predict(preprocessed_image) processed_img_array = (processed_image.reshape(70, 70, 3) * 255).astype(np.uint8) # Вычисление процентного совпадения между изображениями similarity = calculate_similarity1(original_img_array*255, processed_img_array) print(f'Итерация №{k}. Совпадение: {similarity:.2f}%') if (similarity <= threshold_similarity)or((k%10)==0): # Отобразить исходное изображение и результат plt.imshow(original_img_array) plt.title("Исходное изображение") plt.show() plt.imshow(processed_img_array) plt.title("Обработанное изображение") plt.show() if similarity <= threshold_similarity: print("Изображения достаточно похожи. Пожалуйста, оцените изображение в диапазоне 1-100.") user_rating = input("Оценка (от 1 до 100): ") print(f'----------{user_rating}----------') # Проверка на завершение цикла if user_rating == 'exit': break else: user_rating = float(user_rating) # Обновление модели на основе оценки пользователя model.fit(preprocessed_image, np.array([user_rating]), epochs=10) else: print(f"Изображения недостаточно похожи. Обучение модели автоматическое") model.fit(preprocessed_image, np.array([similarity]), epochs=5) ---------------------------------------------------------------------------------------- Вывод логов обучения: Итерация №30. Совпадение: 0.22% <Тут исходное изображение> <Тут сгенерированное изображение> Изображения недостаточно похожи. Обучение модели автоматическое Epoch 1/5 1/1 [==============================] - 0s 294ms/step - loss: 2.8180e-04 - mae: 0.0719 Epoch 2/5 1/1 [==============================] - 0s 310ms/step - loss: 1.8626e-04 - mae: 0.0475 Epoch 3/5 1/1 [==============================] - 0s 359ms/step - loss: 7.1669e-05 - mae: 0.0183 Epoch 4/5 1/1 [==============================] - 0s 308ms/step - loss: 9.7977e-05 - mae: 0.0250 Epoch 5/5 1/1 [==============================] - 0s 303ms/step - loss: 5.6402e-05 - mae: 0.0144 1/1 [==============================] - 0s 32ms/step