У нас есть ИИ, написаный на Python который работает на принципе конволюционной нейронной сети, и должен служить для улучшения качества видео. Но встаёт вопрос как его применить после обучения
Python:
import cv2
import os
import tensorflow as tf
import numpy as np
from tensorflow import keras
from keras.layers import Conv2D, UpSampling2D, Input
from keras.models import Model
from keras.optimizers import Adam
from keras.losses import MeanSquaredError
from keras.callbacks import ModelCheckpoint
def create_super_resolution_model(input_shape=(144, 256, 3)):
input_img = Input(shape=input_shape)
# Сверточные слои для извлечения признаков
x = Conv2D(64, (3, 3), activation='relu', padding='same')(input_img)
x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
# Увеличение разрешения изображения
x = UpSampling2D((2, 2))(x)
# Еще несколько сверточных слоев
x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
# Выходной слой с тремя каналами (RGB)
x = Conv2D(3, (3, 3), activation='relu', padding='same')(x)
# Создание модели
model = Model(inputs=input_img, outputs=x)
return model
def convert_video_to_images(video_path, output_folder):
# Проверяем, существует ли папка для сохранения изображений, и создаем ее, если она не существует
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# Открываем видеофайл
cap = cv2.VideoCapture(video_path)
frame_count = 0
# Перебираем кадры видео
while True:
ret, frame = cap.read()
# Если кадры закончились, завершаем цикл
if not ret:
break
# Сохраняем кадр как изображение .jpg
img_filename = os.path.join(output_folder, f"frame_{frame_count:04d}.jpg")
cv2.imwrite(img_filename, frame)
frame_count += 1
# Закрываем видеофайл
cap.release()
def load_and_preprocess_images(folder_path):
images = []
for filename in sorted(os.listdir(folder_path)):
if filename.endswith(".jpg"):
img_path = os.path.join(folder_path, filename)
img = cv2.imread(img_path)
img = cv2.resize(img, (256, 144)) # Масштабируем изображение
images.append(img)
return np.array(images)
# Путь к видеофайлу
video_path = '63_480.mp4'
# Папка для сохранения изображений
output_folder = 'frames'
# Папка с предобработанными изображениями
image_folder = 'preprocessed_images'
# Создаем модель
model = create_super_resolution_model()
# Компилируем модель
model.compile(optimizer=Adam(learning_rate=0.001), loss=MeanSquaredError())
# Создаем папку для сохранения весов модели
if not os.path.exists('model_weights'):
os.makedirs('model_weights')
# Создаем колбэк для сохранения весов модели
checkpoint_callback = ModelCheckpoint(
'model_weights/super_resolution_model_weights.h5',
monitor='val_loss',
save_best_only=True,
save_weights_only=True,
mode='min',
verbose=1
)
# Преобразуем видео в изображения
convert_video_to_images(video_path, output_folder)
# Предобрабатываем изображения и загружаем их
preprocessed_images = load_and_preprocess_images(output_folder)
# Нормализуем изображения к диапазону [0, 1]
preprocessed_images = preprocessed_images / 255.0
# Обучаем модель на предобработанных изображениях
history = model.fit(
preprocessed_images,
preprocessed_images,
batch_size=16,
epochs=50, # Установите желаемое количество эпох
validation_split=0.1,
callbacks=[checkpoint_callback]
)
# Сохраняем обученную модель
model.save('super_resolution_model.h5')