Ошибка с типом данных float в numpy
Возникла проблема при создании кода по теме метрик качества видео. Возникает ошибка с типом данных float в numpy. Код написан в colab
, там же видна попытка установить версию 1.10 numpy - увы, затея так себе. В колабе нельзя выбрать конкретную версию библиотеки, даже если установлена 1.10, обработка идет с последней версией.
Код:
# Установка необходимых библиотек
!pip install scikit-video scikit-image numpy==1.10.1 openpyxl
import skvideo.io
import skvideo.measure
from skimage.metrics import peak_signal_noise_ratio as psnr
from skimage.metrics import structural_similarity as ssim
from skimage import img_as_float
import numpy as np
def calculate_metrics(ref_video_path, dist_video_path):
# Загрузка видеофайлов
try:
ref_video = skvideo.io.vread(ref_video_path)
dist_video = skvideo.io.vread(dist_video_path)
except Exception as e:
print(f"Ошибка при загрузке видеофайлов: {e}")
return None, None, None, None
# Проверка, что видео имеют одинаковую длину
if ref_video.shape != dist_video.shape:
print("Видео должны иметь одинаковую форму!")
return None, None, None, None
num_frames = ref_video.shape[0]
psnr_values = []
ssim_values = []
for i in range(num_frames):
ref_frame = img_as_float(ref_video[i])
dist_frame = img_as_float(dist_video[i])
try:
# Рассчет PSNR
psnr_value = psnr(ref_frame, dist_frame, data_range=ref_frame.max() - ref_frame.min())
psnr_values.append(psnr_value)
# Рассчет SSIM
ssim_value = ssim(ref_frame, dist_frame, multichannel=True, data_range=ref_frame.max() - ref_frame.min())
ssim_values.append(ssim_value)
except Exception as e:
print(f"Ошибка при расчете метрик PSNR/SSIM для кадра {i}: {e}")
return None, None, None, None
# Средние значения PSNR и SSIM по всем кадрам
avg_psnr = np.mean(psnr_values)
avg_ssim = np.mean(ssim_values)
try:
# Рассчет NIQE и BRISQUE
niqe_values = [skvideo.measure.niqe(dist_frame) for dist_frame in dist_video]
brisque_values = [skvideo.measure.brisque(dist_frame) for dist_frame in dist_video]
niqe_value = np.mean(niqe_values)
brisque_value = np.mean(brisque_values)
except Exception as e:
print(f"Ошибка при расчете метрик NIQE/BRISQUE: {e}")
return avg_psnr, avg_ssim, None, None
return avg_psnr, avg_ssim, niqe_value, brisque_value
# Пример использования функции
ref_video_path = "/content/drive/MyDrive/Colab Notebooks/output_noisy_video.mp4"
dist_video_path = "/content/drive/MyDrive/Colab Notebooks/output_gray_video.mp4"
metrics = calculate_metrics(ref_video_path, dist_video_path)
if metrics:
psnr_value, ssim_value, niqe_value, brisque_value = metrics
print(f"PSNR: {psnr_value}")
print(f"SSIM: {ssim_value}")
print(f"NIQE: {niqe_value}")
print(f"BRISQUE: {brisque_value}")
else:
print("Не удалось рассчитать метрики.")
Выдает ошибку следующего рода:
module 'numpy' has no attribute 'float'.
np.float
was a deprecated alias for the builtinfloat
. To avoid this error in existing code, usefloat
by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, usenp.float64
here. The aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at:
Часть кода с PSNR и SSIM работает, проблемы возникают при чтении видео и обработке других метрик. Полагаю, проблемы в совместимости версий numpy и skvideo. В pycharm код в принципе не работает - оно попросту не видит файл и выдает странную ошибку.