Как я могу использовать функцию tf.image.ssim для захвата видео OpenCV, покадрово? - PullRequest
0 голосов
/ 13 июня 2019

Я хочу рассчитать индекс 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()
...