Я хочу рассчитать индекс SSIM двух кадров в ряд, поступающих с веб-канала (с использованием OpenCV).Использование compare_ssim
из skimage.measure
полностью зависит от процессора и является трудной задачей для изображений с высоким разрешением.Поэтому, чтобы использовать ускорение GPU (у меня есть графический процессор с поддержкой CUDA и я успешно установил модуль tensorflow-gpu
), я хочу использовать метод tf.image.ssim
.
Исходя из документации на веб-сайте Tensorflow, https://www.tensorflow.org/api_docs/python/tf/image/ssim, для кода требуются версии изображений в градациях серого, для которых необходимо вычислить SSIM, хранящиеся на вашем диске.Выполнение этого для канала веб-камеры позволяет захватывать кадр и преобразовывать его в оттенки серого, но, сохраняя его на диск и затем перечитывая его, для использования функции tf.decode_png()
, добавляются высокие затраты на чтение и чтение.Я хочу иметь возможность захватывать кадр из канала веб-камеры и передавать его в функцию decode_png()
, не сохраняя его на диске.
# Code in tensorflow documentation
im1 = tf.decode_png('path/to/im1.png')
im2 = tf.decode_png('path/to/im2.png')
# Compute SSIM over tf.uint8 Tensors.
ssim1 = tf.image.ssim(im1, im2, max_val=255)
# my current workaround for colored images saved on disk looks like this
import tensorflow as tf
import cv2
sess = tf.Session()
#extra read/write overhead here (how do I do this without writing images
#to disk?)
cv2.imwrite('grayA.png', cv2.cvtColor(cv2.imread('pic1.png'),
cv2.COLOR_BGR2GRAY))
cv2.imwrite('grayB.png', cv2.cvtColor(cv2.imread('pic2.png'),
cv2.COLOR_BGR2GRAY))
contentsA = ' '
with open('grayA.png', 'rb') as f1:
contentsA = f1.read()
decoded_imgA = tf.image.decode_png(contentsA)
contentsB = ' '
with open('grayB.png', 'rb') as f2:
contentsB = f2.read()
decoded_imgB = tf.image.decode_png(contentsB)
ssim_tf = tf.image.ssim(decoded_imgA, decoded_imgB, max_val= 255)
ssim_score = ssim_tf.eval(session = sess)
sess.close()