web-dev-qa-db-ja.com

python opencvマット画像をtensorflow画像データに変換する

pythonとopencvを使用してビデオからフレームをキャプチャし、キャプチャしたマット画像をテンソルフローで分類したい。問題は、deMat形式を3Dテンソルに変換する方法がわからないことです。変数。これは、テンソルフロー(ファイルから画像をロードする)で現在行っている方法です:

image_data = tf.gfile.FastGFile(imagePath, 'rb').read()
with tf.Session() as sess:
    softmax_tensor = sess.graph.get_tensor_by_name('final_result:0')
    predictions = sess.run(softmax_tensor,
                           {'DecodeJpeg/contents:0': image_data})

よろしくお願いします、よろしくお願いします

8
Txeif

Imreadを使用してOpenCVイメージをロードし、それをnumpy配列に変換します。

Inception v3にフィードするには、エントリポイントとしてMult:0 Tensorを使用する必要があります。これには、次のレイアウトの4次元テンソルが必要です。[バッチインデックス、幅、高さ、チャネル]最後の3つはcvから完全に問題ありません。 :マット、最初の画像は0である必要があります。これは、画像のバッチではなく、単一の画像をフィードするためです。コードは次のようになります。

#Loading the file
img2 = cv2.imread(file)
#Format for the Mul:0 Tensor
img2= cv2.resize(img2,dsize=(299,299), interpolation = cv2.INTER_CUBIC)
#Numpy array
np_image_data = np.asarray(img2)
#maybe insert float convertion here - see edit remark!
np_final = np.expand_dims(np_image_data,axis=0)

#now feeding it into the session:
#[... initialization of session and loading of graph etc]
predictions = sess.run(softmax_tensor,
                           {'Mul:0': np_final})
#fin! 

敬具、

クリス

編集:開始ネットワークが浮動小数点数として[-0.5,0.5]に正規化された強度値を必要としていることに気付いたので、RGB画像を作成する前に次のコードを使用して変換してください。

np_image_data=cv2.normalize(np_image_data.astype('float'), None, -0.5, .5, cv2.NORM_MINMAX)
11
Chris VdoP

DecodeJpeg/contents:0という名前のテンソルを持つ事前トレーニングおよび事前定義されたInceptionモデルを使用しているように見えます。その場合、このテンソルはJPEG画像のバイトを含むスカラー文字列を期待します。

いくつかのオプションがあります。1つは、JPEGがマトリックスに変換されるノードをネットワークでさらに調べることです。 MAT形式が何であるかはわかりませんが、これは[height, width, colour_depth]表現になります。その形式で画像を取得できる場合は、DecodeJpeg...文字列をフィード先のノードの名前に置き換えることができます。

もう1つのオプションは、画像をJPEGに変換し、直接フィードすることです。

4
Mark McDonald

次のように、opencvマット形式をnumpy配列に変換できるはずです。

np_image_data = np.asarray(image_data)

データをnumpy配列として取得したら、@ thesonyman101が参照したリンクのように、 フィードメカニズム を介してテンソルフローにデータを渡すことができます。

feed_dict = {some_tf_input:np_image_data}
predictions = sess.run(some_tf_output, feed_dict=feed_dict)
1
RobR

私の場合、ファイルから画像を読み取り、いくつかの処理を行ってから、最後のレイヤーと呼ばれる機能レイヤーからの戻り値を取得するために開始に挿入する必要がありました。私の解決策は短いですが効果的です。

        img = cv2.imread(file)
        ... do some processing 
        img_as_string = cv2.imencode('.jpg', img)[1].tostring()
        features = sess.run(last_layer, {'DecodeJpeg/contents:0': img_as_string})

Tensorflow2.0とOpenCV4.2.0では、次の方法で変換できます。

import numpy as np
import tensorflow as tf
import cv2 as cv

width = 32
height = 32

#Load image by OpenCV
img = cv.imread('img.jpg')

#Resize to respect the input_shape
inp = cv.resize(img, (width , height ))

#Convert img to RGB
rgb = cv.cvtColor(inp, cv.COLOR_BGR2RGB)

#Is optional but i recommend (float convertion and convert img to tensor image)
rgb_tensor = tf.convert_to_tensor(rgb, dtype=tf.float32)

#Add dims to rgb_tensor
rgb_tensor = tf.expand_dims(rgb_tensor , 0)

#Now you can use rgb_tensor to predict label for exemple :

#Load pretrain model, made from: https://www.tensorflow.org/tutorials/images/cnn
model = tf.keras.models.load_model('cifar10_model.h5')

#Create probability model 
probability_model = tf.keras.Sequential([model, 
                                     tf.keras.layers.Softmax()])
#Predict label
predictions = probability_model.predict(rgb_tensor, steps=1)
0
Bensuperpc