Untitled

mail@pastecode.io avatarunknown
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