# import cv2 | |
# from os.path import isfile, join | |
# import subprocess | |
# import os | |
# from RealESRGAN import RealESRGAN | |
# import torch | |
# import gradio as gr | |
# IMAGE_FORMATS = ('.png', '.jpg', '.jpeg', '.tiff', '.bmp', '.gif') | |
# def inference_image(image, size): | |
# global model2 | |
# global model4 | |
# global model8 | |
# if image is None: | |
# raise gr.Error("Image not uploaded") | |
# width, height = image.size | |
# if width >= 5000 or height >= 5000: | |
# raise gr.Error("The image is too large.") | |
# if torch.cuda.is_available(): | |
# torch.cuda.empty_cache() | |
# if size == '2x': | |
# try: | |
# result = model2.predict(image.convert('RGB')) | |
# except torch.cuda.OutOfMemoryError as e: | |
# print(e) | |
# model2 = RealESRGAN(device, scale=2) | |
# model2.load_weights('weights/RealESRGAN_x2.pth', download=False) | |
# result = model2.predict(image.convert('RGB')) | |
# elif size == '4x': | |
# try: | |
# result = model4.predict(image.convert('RGB')) | |
# except torch.cuda.OutOfMemoryError as e: | |
# print(e) | |
# model4 = RealESRGAN(device, scale=4) | |
# model4.load_weights('weights/RealESRGAN_x4.pth', download=False) | |
# result = model2.predict(image.convert('RGB')) | |
# else: | |
# try: | |
# result = model8.predict(image.convert('RGB')) | |
# except torch.cuda.OutOfMemoryError as e: | |
# print(e) | |
# model8 = RealESRGAN(device, scale=8) | |
# model8.load_weights('weights/RealESRGAN_x8.pth', download=False) | |
# result = model2.predict(image.convert('RGB')) | |
# print(f"Frame of the Video size ({device}): {size} ... OK") | |
# return result | |
# # assign directory | |
# directory = 'videos' #PATH_WITH_INPUT_VIDEOS | |
# zee = 0 | |
# def convert_frames_to_video(pathIn,pathOut,fps): | |
# global INPUT_DIR | |
# cap = cv2.VideoCapture(f'/{INPUT_DIR}/videos/input.mp4') | |
# fps = cap.get(cv2.CAP_PROP_FPS) | |
# frame_array = [] | |
# files = [f for f in os.listdir(pathIn) if isfile(join(pathIn, f))] | |
# #for sorting the file names properly | |
# files.sort(key = lambda x: int(x[5:-4])) | |
# size2 = (0,0) | |
# for i in range(len(files)): | |
# filename=pathIn + files[i] | |
# #reading each files | |
# img = cv2.imread(filename) | |
# height, width, layers = img.shape | |
# size = (width,height) | |
# size2 = size | |
# print(filename) | |
# #inserting the frames into an image array | |
# frame_array.append(img) | |
# out = cv2.VideoWriter(pathOut,cv2.VideoWriter_fourcc(*'DIVX'), fps, size2) | |
# for i in range(len(frame_array)): | |
# # writing to a image array | |
# out.write(frame_array[i]) | |
# out.release() | |
# for filename in os.listdir(directory): | |
# f = os.path.join(directory, filename) | |
# # checking if it is a file | |
# if os.path.isfile(f): | |
# print("PROCESSING :"+str(f)+"\n") | |
# # Read the video from specified path | |
# #video to frames | |
# cam = cv2.VideoCapture(str(f)) | |
# try: | |
# # PATH TO STORE VIDEO FRAMES | |
# if not os.path.exists(f'/{INPUT_DIR}/upload/'): | |
# os.makedirs(f'/{INPUT_DIR}/upload/') | |
# # if not created then raise error | |
# except OSError: | |
# print ('Error: Creating directory of data') | |
# # frame | |
# currentframe = 0 | |
# while(True): | |
# # reading from frame | |
# ret,frame = cam.read() | |
# if ret: | |
# # if video is still left continue creating images | |
# name = f'/{INPUT_DIR}/upload/frame' + str(currentframe) + '.jpg' | |
# # writing the extracted images | |
# cv2.imwrite(name, frame) | |
# # increasing counter so that it will | |
# # show how many frames are created | |
# currentframe += 1 | |
# print(currentframe) | |
# else: | |
# #deletes all the videos you uploaded for upscaling | |
# #for f in os.listdir(video_folder): | |
# # os.remove(os.path.join(video_folder, f)) | |
# break | |
# # Release all space and windows once done | |
# cam.release() | |
# cv2.destroyAllWindows() | |
# #apply super-resolution on all frames of a video | |
# # Specify the directory path | |
# all_frames_path = f"/{INPUT_DIR}/upload/" | |
# # Get a list of all files in the directory | |
# file_names = os.listdir(all_frames_path) | |
# # process the files | |
# for file_name in file_names: | |
# inference_image(f"/{INPUT_DIR}/upload/{file_name}") | |
# #convert super res frames to .avi | |
# pathIn = f'/{INPUT_DIR}/results/restored_imgs/' | |
# zee = zee+1 | |
# fName = "video"+str(zee) | |
# filenameVid = f"{fName}.avi" | |
# pathOut = f"/{INPUT_DIR}/results_videos/"+filenameVid | |
# convert_frames_to_video(pathIn, pathOut, fps) | |
# #convert .avi to .mp4 | |
# src = f'/{INPUT_DIR}/results_videos/' | |
# dst = f'/{INPUT_DIR}/results_mp4_videos/' | |
# for root, dirs, filenames in os.walk(src, topdown=False): | |
# #print(filenames) | |
# for filename in filenames: | |
# print('[INFO] 1',filename) | |
# try: | |
# _format = '' | |
# if ".flv" in filename.lower(): | |
# _format=".flv" | |
# if ".mp4" in filename.lower(): | |
# _format=".mp4" | |
# if ".avi" in filename.lower(): | |
# _format=".avi" | |
# if ".mov" in filename.lower(): | |
# _format=".mov" | |
# inputfile = os.path.join(root, filename) | |
# print('[INFO] 1',inputfile) | |
# outputfile = os.path.join(dst, filename.lower().replace(_format, ".mp4")) | |
# subprocess.call(['ffmpeg', '-i', inputfile, outputfile]) | |
# except: | |
# print("An exception occurred") | |
from PIL import Image | |
import cv2 as cv | |
import torch | |
from RealESRGAN import RealESRGAN | |
import tempfile | |
import numpy as np | |
import tqdm | |
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') | |
def infer_image(img: Image.Image, size_modifier: int ) -> Image.Image: | |
if img is None: | |
raise Exception("Image not uploaded") | |
width, height = img.size | |
if width >= 5000 or height >= 5000: | |
raise Exception("The image is too large.") | |
model = RealESRGAN(device, scale=size_modifier) | |
model.load_weights(f'weights/RealESRGAN_x{size_modifier}.pth', download=False) | |
result = model.predict(img.convert('RGB')) | |
print(f"Image size ({device}): {size_modifier} ... OK") | |
return result | |
def infer_video(video_filepath: str, size_modifier: int) -> str: | |
model = RealESRGAN(device, scale=size_modifier) | |
model.load_weights(f'weights/RealESRGAN_x{size_modifier}.pth', download=False) | |
cap = cv.VideoCapture(video_filepath) | |
tmpfile = tempfile.NamedTemporaryFile(suffix='.mp4', delete=False) | |
vid_output = tmpfile.name | |
tmpfile.close() | |
vid_writer = cv.VideoWriter( | |
vid_output, | |
fourcc=cv.VideoWriter.fourcc(*'mp4v'), | |
fps=cap.get(cv.CAP_PROP_FPS), | |
frameSize=(int(cap.get(cv.CAP_PROP_FRAME_WIDTH)) * size_modifier, int(cap.get(cv.CAP_PROP_FRAME_HEIGHT)) * size_modifier) | |
) | |
n_frames = int(cap.get(cv.CAP_PROP_FRAME_COUNT)) | |
# while cap.isOpened(): | |
for _ in tqdm.tqdm(range(n_frames)): | |
ret, frame = cap.read() | |
if not ret: | |
break | |
frame = cv.cvtColor(frame, cv.COLOR_BGR2RGB) | |
frame = Image.fromarray(frame) | |
upscaled_frame = model.predict(frame.convert('RGB')) | |
upscaled_frame = np.array(upscaled_frame) | |
upscaled_frame = cv.cvtColor(upscaled_frame, cv.COLOR_RGB2BGR) | |
print(upscaled_frame.shape) | |
vid_writer.write(upscaled_frame) | |
vid_writer.release() | |
print(f"Video file : {video_filepath}") | |
return vid_output | |