TensorFlowの「in raise_from_not_ok_status raise core._status_to_exception(e) from None # pylint: disable=protected-access」エラーを解消したい

10:00

前回、TensorFlowの例データを使って機械学習に成功した。
今回は自分のデータで学習しようと思ったけど、エラーが出た。

Traceback (most recent call last):
  File "/Users/tenna/Desktop/tensorflow/main.py", line 89, in <module>
    image_batch, labels_batch = next(iter(normalized_ds))
  File "/Users/tenna/Library/Python/3.9/lib/python/site-packages/tensorflow/python/data/ops/iterator_ops.py", line 814, in __next__
    return self._next_internal()
  File "/Users/tenna/Library/Python/3.9/lib/python/site-packages/tensorflow/python/data/ops/iterator_ops.py", line 777, in _next_internal
    ret = gen_dataset_ops.iterator_get_next(
  File "/Users/tenna/Library/Python/3.9/lib/python/site-packages/tensorflow/python/ops/gen_dataset_ops.py", line 3028, in iterator_get_next
    _ops.raise_from_not_ok_status(e, name)
  File "/Users/tenna/Library/Python/3.9/lib/python/site-packages/tensorflow/python/framework/ops.py", line 6656, in raise_from_not_ok_status
    raise core._status_to_exception(e) from None  # pylint: disable=protected-access
tensorflow.python.framework.errors_impl.InvalidArgumentError: {{function_node __wrapped__IteratorGetNext_output_types_2_device_/job:localhost/replica:0/task:0/device:CPU:0}} Unknown image file format. One of JPEG, PNG, GIF, BMP required.
         [[{{node decode_image/DecodeImage}}]] [Op:IteratorGetNext] name: 

"Unknown image file format. One of JPEG, PNG, GIF, BMP required."で調べてみて、下記コードを追加してみたけど効果なし。

num_skipped = 0
for folder_name in ("normal_2", "normal_4", "normal_6", "normal_8", "normal_10", "normal_12", "normal_14", "normal_6", "normal_8", "normal_20", "normal_22", "normal_24"):
    folder_path = os.path.join(data_dir, folder_name)
    for fname in os.listdir(folder_path):
        fpath = os.path.join(folder_path, fname)
        try:
            fobj = open(fpath, "rb")
            is_jfif = tf.compat.as_bytes("JFIF") in fobj.peek(10)
        finally:
            fobj.close()

        if not is_jfif:
            num_skipped += 1
            # Delete corrupted image
            os.remove(fpath)

そのエラーの前にこんなのもあるから、これを調べてみる

in raise_from_not_ok_status
raise core._status_to_exception(e) from None # pylint: disable=protected-access

何も出てこない

tensorflowなどを再度インストールしてみた
うまくいかなかったようで、エラーが出た。

tensorflow.python.framework.errors_impl.NotFoundError: dlopen(/Users/tenna/Library/Python/3.9/lib/python/site-packages/tensorflow-plugins/libmetal_plugin.dylib, 0x0006): symbol not found in flat namespace '_TF_GetInputPropertiesList'

Appleのガイドに従ってみる

main.pyを動かしてみると、matplotlibがないと言われた
ModuleNotFoundError: No module named 'matplotlib'

% pip3 install matplotlib
 で解決。またmain.pyを動かしてみる。


Traceback (most recent call last):
File "/Users/tenna/Desktop/integro/tensorflow/main.py", line 90, in <module>
image_batch, labels_batch = next(iter(normalized_ds))
File "/Users/tenna/venv-metal/lib/python3.9/site-packages/tensorflow/python/data/ops/iterator_ops.py", line 814, in next
return self._next_internal()
File "/Users/tenna/venv-metal/lib/python3.9/site-packages/tensorflow/python/data/ops/iterator_ops.py", line 777, in _next_internal
ret = gen_dataset_ops.iterator_get_next(
File "/Users/tenna/venv-metal/lib/python3.9/site-packages/tensorflow/python/ops/gen_dataset_ops.py", line 3028, in iterator_get_next
_ops.raise_from_not_ok_status(e, name)
File "/Users/tenna/venv-metal/lib/python3.9/site-packages/tensorflow/python/framework/ops.py", line 6656, in raise_from_not_ok_status
raise core._status_to_exception(e) from None  # pylint: disable=protected-access
tensorflow.python.framework.errors_impl.InvalidArgumentError: {{function_node _wrapped__IteratorGetNext_output_types_2_device/job:localhost/replica:0/task:0/device:CPU:0}} Unknown image file format. One of JPEG, PNG, GIF, BMP required.
[[{{node decode_image/DecodeImage}}]] [Op:IteratorGetNext] name: 

同じエラー。

12:30

ファイルはfirebase Storageにアップロードしてるから、アップロードしたタイミングで破損したのかもしれない。ローカルファイルで試してみよう。(
上記で破損ファイルにも対応してるつもりだけど念の為)

2回連続でやると、前回のtgzファイルを使ってるっぽくて意味ないから、前回のデータを消したい。Terminalを一回閉じて再度開いた。

Traceback (most recent call last):
File "/Users/tenna/Desktop/tensorflow/main.py", line 17, in <module>
import tensorflow as tf
File "/Users/tenna/Library/Python/3.9/lib/python/site-packages/tensorflow/init.py", line 439, in <module>
_ll.load_library(_plugin_dir)
File "/Users/tenna/Library/Python/3.9/lib/python/site-packages/tensorflow/python/framework/load_library.py", line 151, in load_library
py_tf.TF_LoadLibrary(lib)
tensorflow.python.framework.errors_impl.NotFoundError: dlopen(/Users/tenna/Library/Python/3.9/lib/python/site-packages/tensorflow-plugins/libmetal_plugin.dylib, 0x0006): symbol not found in flat namespace '_TF_GetInputPropertiesList'

なんかさっきも見たエラー。
またこれやる。

main.pyを走らせると、同じエラーに戻った

Traceback (most recent call last):
File "/Users/tenna/Desktop/integro/tensorflow/main.py", line 90, in <module>
image_batch, labels_batch = next(iter(normalized_ds))
File "/Users/tenna/venv-metal/lib/python3.9/site-packages/tensorflow/python/data/ops/iterator_ops.py", line 814, in next
return self._next_internal()
File "/Users/tenna/venv-metal/lib/python3.9/site-packages/tensorflow/python/data/ops/iterator_ops.py", line 777, in _next_internal
ret = gen_dataset_ops.iterator_get_next(
File "/Users/tenna/venv-metal/lib/python3.9/site-packages/tensorflow/python/ops/gen_dataset_ops.py", line 3028, in iterator_get_next
_ops.raise_from_not_ok_status(e, name)
File "/Users/tenna/venv-metal/lib/python3.9/site-packages/tensorflow/python/framework/ops.py", line 6656, in raise_from_not_ok_status
raise core._status_to_exception(e) from None  # pylint: disable=protected-access
tensorflow.python.framework.errors_impl.InvalidArgumentError: {{function_node _wrapped__IteratorGetNext_output_types_2_device/job:localhost/replica:0/task:0/device:CPU:0}} Unknown image file format. One of JPEG, PNG, GIF, BMP required.
[[{{node decode_image/DecodeImage}}]] [Op:IteratorGetNext] name: 

https://www.reddit.com/r/computervision/comments/q6iuqx/image_processing/?rdt=47339

こんなこと言ってる人がいた。
Try running a script that converts all jpegs to use the "jpg" extension and the problem might just disappear...

面倒だけど他に案もないからやってみよう。。

from PIL import Image 
import glob, os
directory = os.path.abspath("./cups")
new_directory = os.path.abspath("./new_cups")


for folder_name in ("normal_2", "normal_4", "normal_6", "normal_8", "normal_10", "normal_12", "normal_14", "normal_6", "normal_8", "normal_20", "normal_22", "normal_24"):
    folder_path = os.path.join(directory, folder_name)
    new_folder_path = os.path.join(new_directory, folder_name)
    for fname in os.listdir(folder_path):
        fpath = os.path.join(folder_path, fname)
        im = Image.open(fpath)
        rgb_im = im.convert("RGB")
        new_fpath = os.path.join(new_folder_path, fname).replace('.jpeg', '.jpg')
        print("new_fpath",new_fpath)
        rgb_im.save(new_fpath)

こんなpyファイルを作って走らせてみた。cups_newをtgzに変換して、またmain.pyを走らせてみる。

また同じエラーが出たけど、また前回のデータを使ってるのが原因だと思うのでTerminalを再起動(他に何かいい方法はあるんだろうけど、、)

でもエラー変わらず。。

行き止まりになってしまったので、githubに投稿して今日は終了

https://github.com/tensorflow/tflite-support/issues/944

次の日

画像フォルダー名のアンダースコアをなくして(多分関係ない)
違う名前でtgzファイルを作って再度トライしたらエラー出なくなった。
何がいかんかったんだ。。

この記事が気に入ったらサポートをしてみませんか?