質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

676閲覧

どこが足りていないのか、教えてほしい

okudenaihito

総合スコア1

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/12/14 04:26

編集2022/12/14 15:22

前提

google colaboratory(python)でLobeを使った画像解析のシステムを作っています。
お試しでじゃんけんの手を認識しようとした際にエラーメッセージが発生しました。

実現したいこと

  • ウェブカメラで撮影し、予測結果の出力しじゃんけんで勝つソフトを作る予定(google colaboratoryにて動作するものを作りたい)
  • None値になっているが、そもそもウェブカメラがちゃんと動いてない恐れあり。

 →できれば、google colaboratoryでウェブカメラをちゃんと動かす方法も知りたい。

発生している問題・エラーメッセージ

AttributeError Traceback (most recent call last)
<ipython-input-1-302c9809989e> in <module>
32 #画像を認識し、補正する
33 #PILを使用して画像をリサイズする
---> 34 image = Image.fromarray(frame)
35 image = image.resize((input_width, input_height))
36 image = np.asarray(image)

/usr/local/lib/python3.7/dist-packages/PIL/Image.py in fromarray(obj, mode)
2702 .. versionadded:: 1.1.6
2703 """
-> 2704 arr = obj.array_interface
2705 shape = arr["shape"]
2706 ndim = len(shape)

AttributeError: 'NoneType' object has no attribute 'array_interface'

該当のソースコード

import json
import numpy as np
import tensorflow as tf
import cv2
from PIL import Image

#ファイルのパスを修正
with open("/content/drive/MyDrive/TensorFlow/signature.json", "r") as f:#signature.jsonの位置を確認し入力(必要に応じて変更必要)
signature = json.load(f)

inputs = signature.get('inputs')
outputs = signature.get('outputs')

#TensorFlowのセッションを作成
session = tf.compat.v1.Session(graph=tf.Graph())

#モデルをロード
tf.compat.v1.saved_model.loader.load(
sess=session,
tags=signature.get("tags"),
export_dir='/content/drive/MyDrive/TensorFlow/'#saved_modelの入っているファイルを探す(必要に応じて変更必要)
)

#入力画像のサイズを取得
input_width, input_height = inputs["Image"]["shape"][1:3]

#OpenCVを使ってウェブカメラから画像を取得する
cap = cv2.VideoCapture(0)

ret, frame = cap.read()

#画像を認識し、補正する
#PILを使用して画像をリサイズする
image = Image.fromarray(frame)
image = image.resize((input_width, input_height))
image = np.asarray(image)

#画像を補正する
image = image.rotate(0) # 画像を45度回転させる(必要に応じて変更必要)
#また、必要に応じて、画像の平行移動やモノクロ化なども可能

#numpy配列に変換する
image = np.asarray(image)

#画像を入力としてTensorFlowを実行する
#入力と出力を定義
feed_dict = {inputs["Image"]["name"]: [image]}
fetches = [(key, output["name"]) for key, output in outputs.items()]
#実行
output = session.run(fetches=[name for _, name in fetches], feed_dict=feed_dict)

#出力から、認識された画像を取得する
recognized_image = output[0][0]

#出力を確認する
#print(output)
#今回は確認のため追加

#認識された画像をOpenCVで表示する
cv2.imshow("Recognized Image", recognized_image)

#出力から、じゃんけんの結果を取得する
result = output[0][0]

#最大値を取得
#出力から、じゃんけんの結果を取得する
#例えば、グーなら"rock"、チョキなら"scissors"など
result = ["unknown", "rock", "parer", "scissors"][np.argmax(output[0][0])]

#結果を表示する
print(f'じゃんけんの結果は{result}です。')

#キーを押すまで画面を表示する
cv2.waitKey(0)

#終了時の処理
cap.release()
cv2.destroyAllWindows()

#セッションをクローズする
session.close()

試したこと

Lobe(TensorFlow)とpythonだけで動かし、画像を基に動かしたときは、特に問題なく動いた

以下:動かしたときのコード
import json
import numpy as np
import tensorflow as tf
import cv2
from PIL import Image

#ファイルのパスを修正
with open("/content/drive/MyDrive/TensorFlow/signature.json", "r") as f:#signature.jsonの位置を確認し入力
signature = json.load(f)

inputs = signature.get('inputs')
outputs = signature.get('outputs')

#TensorFlowのセッションを作成
session = tf.compat.v1.Session(graph=tf.Graph())

#モデルをロード
tf.compat.v1.saved_model.loader.load(
sess=session,
tags=signature.get("tags"),
export_dir='/content/drive/MyDrive/TensorFlow/'#saved_modelの入っているファイルを探す
)

#入力画像のサイズを取得
input_width, input_height = inputs["Image"]["shape"][1:3]
#入力画像のサイズを取得
input_width, input_height = inputs["Image"]["shape"][1:3]

#画像を開いてリサイズする
image = Image.open('/content/drive/MyDrive/output/hand/gu/IMG_5993.JPG')#検証につき画像ファイル選択(gu-)
image = image.resize((input_width, input_height))
image = np.asarray(image) / 255.0

#入力と出力を定義
feed_dict = {inputs["Image"]["name"]: [image]}
fetches = [(key, output["name"]) for key, output in outputs.items()]

#実行
output = session.run(fetches=[name for _, name in fetches], feed_dict=feed_dict)

#出力を確認する
print(output)#今回は確認のためですが、実用時は消せます。

#出力から、じゃんけんの結果を取得する
result = output[0][0]

#最大値を取得
#出力から、じゃんけんの結果を取得する
#例えば、グーなら"rock"、チョキなら"scissors"など
result = ["unknown", "rock", "parer", "scissors"][np.argmax(output[0][0])]

#結果を表示する
print(f'じゃんけんの結果は{result}です。')

補足情報(FW/ツールのバージョンなど)

環境:google colaboratory
TensorFlowは、じゃんけんの画像を基に作っており、精度は全体的に60%程度のものを使用中

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/12/14 22:35

まず、Google colabだと「cap = cv2.VideoCapture(0)」が機能しません。なので、capが恐らくNoneで、retもframeも使えない値が入ってしまい、結果としてPILでコケています。 この関数が機能するとすれば、Google colabのサーバーにUSB接続のWEBカメラを接続した時でしょうが、Googleのサーバールームにアクセスできる人はおそらくteratailに居ないですよね?――ということで「cap = cv2.VideoCapture(0)」を排除した実装を考える必要があります。 例えば、「"URLで接続する"WEBカメラ」を用意する(市販のパッケージでもない限り認証がメンドクサイor自力でサーバーを立てる…これができればGoogle colabでやらないでしょうね)か「画像をローカルから適宜アップロードする(連続動作向きではなさそうです)」か、「Google colabをやめる(完全にローカルのPythonで動かす)」でしょうか。 どうしたいかで難易度が変わります。上記の候補は初めから順番に難易度が下がっていきます。
okudenaihito

2022/12/15 00:59

コメントをありがとうございます。 そうですね、そこまで難しい事はしたくないので、今回はローカルpythonに変更しようと思います。 ローカルに変えた時のコードの変更部分とかありますか?
退会済みユーザー

退会済みユーザー

2022/12/15 13:20

たぶんローカルであれば(ファイル操作のパス以外は)変更なしのポン付けで行けると思います。 ※Ubuntuの場合、cap = cv2.VideoCaptrure(0,cv2.CAP_V4L)みたいなおまじないがいるかもです。
guest

回答1

0

自己解決

ローカル環境に合わせて、コードを組み換えまして、どうにかなりました。
皆様ありがとうございました。

投稿したものを元に作ってますので、その後の変更と削除について書いておきます

削除した部分
・角度変更はしない(削除して良いが、もし誰かが方向を整えるプログラムなどを作り出したときに入れ替える為に残しときます)

変更点
・TENSORFLOWの文字列を読み込む際にUTF-8にするように追加
・変に表示をするとプログラムが止まらない事があったので、文字分(#をつけるもの)に変更
・パッケージインストールは忘れずに

投稿2022/12/21 05:56

編集2022/12/21 05:58
okudenaihito

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問