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

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

新規登録して質問してみよう
ただいま回答率
85.37%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Python

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

Q&A

1回答

230閲覧

AndroidStudioでのChaquopyで画像認識の結果処理時にエラーが出てアプリが落ちる

keita_kkk

総合スコア17

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Python

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

0グッド

0クリップ

投稿2024/10/09 11:28

実現したいこと

Androidで画像認識をしたいです。モデルはmobilenet-ssdです。MainActivityでカメラで写真を撮る機能を実装しました。撮った写真に対してmobilenet-ssdを用いて物体検出を行いたいです。

発生している問題・分からないこと

モデルの出力結果からboxes, labels, probsのような結果の変数を作成する際のPythonファイル内でエラーが発生しました。

エラーメッセージ

error

1 AndroidRuntime com.android.example.cameraxapp E FATAL EXCEPTION: main 2Process: com.android.example.cameraxapp, PID: 2658 3com.chaquo.python.PyException: IndexError: too many indices for tensor of dimension 1 4at <python>.inference.run_inference(inference.py:71) 5at <python>.chaquopy_java.call(chaquopy_java.pyx:354) 6at <python>.chaquopy_java.Java_com_chaquo_python_PyObject_callAttrThrowsNative(chaquopy_java.pyx:326) 7at com.chaquo.python.PyObject.callAttrThrowsNative(Native Method) 8at com.chaquo.python.PyObject.callAttrThrows(PyObject.java:232) 9at com.chaquo.python.PyObject.callAttr(PyObject.java:221) 10at com.android.example.cameraxapp.MainActivity.analize_img(MainActivity.kt:179) 11at com.android.example.cameraxapp.MainActivity.onCreate$lambda$1(MainActivity.kt:88) 12at com.android.example.cameraxapp.MainActivity.$r8$lambda$lcE-7xHOtuzYSUf8T8i6-AVABIU(Unknown Source:0) 13at com.android.example.cameraxapp.MainActivity$$ExternalSyntheticLambda1.onClick(D8$$SyntheticClass:0) 14at android.view.View.performClick(View.java:7729) 15at android.view.View.performClickInternal(View.java:7706) 16at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0) 17at android.view.View$PerformClick.run(View.java:30484) 18at android.os.Handler.handleCallback(Handler.java:959) 19at android.os.Handler.dispatchMessage(Handler.java:100) 20at android.os.Looper.loopOnce(Looper.java:232) 21at android.os.Looper.loop(Looper.java:317) 22at android.app.ActivityThread.main(ActivityThread.java:8501) 23at java.lang.reflect.Method.invoke(Native Method) 24at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) 25at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:878)

該当のソースコード

Python

1import torch 2from torchvision import transforms 3from PIL import Image 4import numpy as np 5 6# モデルをロードする関数 7def load_model(model_path): 8 model = torch.jit.load(model_path) 9 model.eval() 10 return model 11 12def iou_of(boxes0, boxes1, eps=1e-5): 13 overlap_left_top = torch.max(boxes0[..., :2], boxes1[..., :2]) 14 overlap_right_bottom = torch.min(boxes0[..., 2:], boxes1[..., 2:]) 15 16 overlap_area = area_of(overlap_left_top, overlap_right_bottom) 17 area0 = area_of(boxes0[..., :2], boxes0[..., 2:]) 18 area1 = area_of(boxes1[..., :2], boxes1[..., 2:]) 19 return overlap_area / (area0 + area1 - overlap_area + eps) 20 21def area_of(left_top, right_bottom) -> torch.Tensor: 22 hw = torch.clamp(right_bottom - left_top, min=0.0) 23 return hw[..., 0] * hw[..., 1] 24 25# 推論を行う関数 26def run_inference(model_path, image_path): 27 image = Image.open(image_path).convert("RGB") 28 # 画像の前処理 29 transform = transforms.Compose([ 30 transforms.Resize((300, 300)), 31 transforms.ToTensor(), 32 transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), 33 ]) 34 img_tensor = transform(image).unsqueeze(0) # バッチ次元を追加 35 36 with torch.no_grad(): 37 model = load_model(model_path) 38 scores, boxes = model(img_tensor) # score box 39 print('scores:',scores.shape, 'boxes:', boxes.shape) 40 #print("len:",len(output)) 41 print('hello3') 42 # こっからPredictor 43 filter_threshold=0.05 44 boxes = boxes[0] 45 scores = scores[0] 46 prob_threshold = filter_threshold 47 picked_box_probs = [] 48 picked_labels = [] 49 for class_index in range(1, scores.size(1)): 50 probs = scores[:, class_index] 51 mask = probs > prob_threshold 52 probs = probs[mask] 53 if probs.size(0) == 0: 54 continue 55 subset_boxes = boxes[mask, :] 56 box_probs = torch.cat([subset_boxes, probs.reshape(-1, 1)], dim=1) 57 nms_method = 'hard' 58 iou_threshold=0.45 59 sigma = 0.5 60 score_threshold=prob_threshold 61 top_k = -1 62 candidate_size = 200 63 print('hello2') 64 # nmsの中身 65 box_scores = box_probs 66 scores = box_scores[:, -1] 67 boxes = box_scores[:, :-1] 68 picked = [] 69 _, indexes = scores.sort(descending=True) 70 indexes = indexes[:candidate_size] 71 print('hello1.7') 72 while len(indexes) > 0: 73 current = indexes[0] 74 picked.append(current.item()) 75 if 0 < top_k == len(picked) or len(indexes) == 1: 76 break 77 current_box = boxes[current, :] 78 indexes = indexes[1:] 79 rest_boxes = boxes[indexes, :] 80 iou = iou_of( 81 rest_boxes, 82 current_box.unsqueeze(0), 83 ) 84 print('hello1.65') 85 indexes = indexes[iou <= iou_threshold] 86 87 box_probs = box_scores[picked, :] 88 89 90 print('hello1.6') 91 picked_box_probs.append(box_probs) 92 print('hello1.55') 93 print('class_index', class_index) 94 print('box_probs.size(0)', box_probs.size(0)) 95 print('multiple', [class_index] * box_probs.size(0)) 96 print('hello1.53') 97 picked_labels += [class_index] * box_probs.size(0) 98 print('hello1.5') 99 if not picked_box_probs: 100 return torch.tensor([]), torch.tensor([]), torch.tensor([]) 101 picked_box_probs = torch.cat(picked_box_probs) 102 height, width, _ = image.shape 103 picked_box_probs[:, 0] *= width 104 picked_box_probs[:, 1] *= height 105 picked_box_probs[:, 2] *= width 106 picked_box_probs[:, 3] *= height 107 boxes, labels, probs = picked_box_probs[:, :4], torch.tensor(picked_labels), picked_box_probs[:, 4] 108 print('hello1') 109 110 111 112 class_names = ['BACKGROUND', 'apple'] 113 max_prob = 0 # 一番確率の高い予測 114 if boxes.size(0) > 0: 115 for i in range(boxes.size(0)): 116 if probs[i] > max_prob: 117 max_prob = probs[i] # 最大確率の更新 118 max_index = i # 最大値インデックスの保存 119 max_label = class_names[labels[max_index]] # 最も確率のたかいラベルを取り出す 120 mlabel_cnt = 0 121 for i in range(boxes.size(0)): # 確率最大のラベルの数 122 if class_names[labels[i]] == max_label: 123 mlabel_cnt += 1 124 125 detect_objects = labels.size(0) # 認識したもの 126 label = max_label # 認識ラベル 127 max_cnt = mlabel_cnt # ラベルの数 128 129 130 print('hello') 131 return [detect_objects, label, max_cnt] 132

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

試行1:print('hello')とpythonコード内の様々な箇所に入れることでエラー発生行を特定
結果1:picked_labels += [class_index] * box_probs.size(0)の行であると確認
理由:logcat上でのhello出力の結果が

logcat

1hello1.65 2hello1.65 3hello1.65 4hello1.6 5hello1.55 6hello1.53

となったため。

試行2:特定した行の各変数の中身を確認
結果2:
class_index 1
box_probs.size(0) 17
[class_index] * box_probs.size(0) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

試行3:モデルの出力結果scores, boxesをshapeを確認
結果3:scores: torch.Size([1, 3000, 21]) boxes: torch.Size([1, 3000, 4])
これはgitで公開され、PCのカメラを使った時の正常な動作を確認しているmobilenet-ssdモデルと一致

試行4:picked_labels = [1]にする
結果:変化なし

補足

参考にしているmobilenet-ssdのgit (https://github.com/qfgaohao/pytorch-ssd)
chaquopyバージョン:15.0.1

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

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

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

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

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

fiveHundred

2024/10/10 08:37

以下のURLを見る限り、単純なshapeの不一致だと思いますので、確認してみてください。 https://stackoverflow.com/questions/73535661/why-i-am-getting-this-too-many-indices-for-tensor-of-dimension-1-error-and-how > 結果1:picked_labels += [class_index] * box_probs.size(0)の行であると確認 提示のエラーメッセージでは > at <python>.inference.run_inference(inference.py:71) となっています。 コードがエラー発生時とおそらく異なっており、こちらでは厳密な確認はできませんが、「結果1」の行は97行目付近なので、全く違う行だと思われます。
guest

回答1

0

Androidで画像認識を行うためにmobilenet-ssdを使用する手順は次の通りです:モデルを読み込み、MainActivityでカメラ機能を使って撮影した写真を取得し、画像をモデルに入力するために適切な形式に変換します。モデルに画像を入力し、出力を取得したら、出力結果からboxes、labels、probsなどの変数を作成します。エラーが発生する場合、モデルの読み込みや画像の前処理が正しく行われているか、モデルの出力形式が期待通りかを確認してください。具体的なエラー内容を教えていただければ、より詳細なサポートができます。

投稿2024/10/10 08:20

jeffrey597doss

総合スコア34

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

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

fiveHundred

2024/10/10 09:21

なんか機械的な回答ですが、AIで生成した回答ですか? もしAIで生成した回答であれば、以下をお守りください。 (違ったらすみません) > AIが生成した回答・コメントについて > - AIが生成した回答・コメントを投稿する場合は、1行目に「[アルゴリズム/サービス名]により生成された文章です」と明記する必要があります。明記されていない場合は運営チームで削除させていただく場合がございます。 > - 投稿する場合は、内容が正しいかを精査してください。 引用元:https://teratail.com/help#about-ai-terms
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問