IndexError:インデックス14708は、サイズ295の軸0の範囲外です
Nov 26 2020
yoloでオブジェクト検出ソフトウェアを作成しようとしていますが、このエラーが表示され、迷子になっています。誰か助けてください。(コードは完全ではなく、この投稿に間違いがある場合は申し訳ありません。私は新しいStackoverflowです)チュートリアルはここからです
Traceback (most recent call last):
File "d:/opencv/objdetect_yolo.py", line 66, in <module>
findobj(output,img)
File "d:/opencv/objdetect_yolo.py", line 33, in findobj
cofidence = scores[classId]
IndexError: index 14708 is out of bounds for axis 0 with size 295
IndexError:インデックス14708は、サイズ295の軸0の範囲外です
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
whT = 320
classespath = 'coco.names.txt'
classes = []
with open(classespath,'rt')as f:
classes = f.read().rstrip('\n').split('\n')
#print (classes)
#print(len(classes))
modelConfiguration = 'yolov3.cfg'
modelWeights = 'yolov3.weights'
net = cv2.dnn.readNetFromDarknet(modelConfiguration, modelWeights)
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CPU)
def findobj(outputs,img):
hT, wT , cT = img.shape
bbox = []
classIds = []
confs = []
for output in outputs:
for det in outputs:
scores = det[5:]
classId = np.argmax(scores)
cofidence = scores[classId]
if float(0.5) < cofidence:
w,h = int(det[2]*wT),int(det[3]*hT)
x,y = int((det[0]*wT) - w/2), int((det[1]*hT) - h/2)
bbox.append([x,y,w,h])
classIds.append(classId)
confs.append(float(cofidence))
while True:
succes, img = cap.read()
blob = cv2.dnn.blobFromImage(img,1/255,(whT,whT),[0,0,0],1,crop=False)
net.setInput(blob)
layerNames = net.getLayerNames()
#print(layerNames)
outputNames = [layerNames[i[0]-1]for i in net.getUnconnectedOutLayers() ]
#print(outputNames)
#print(net.getUnconnectedOutLayers())
output = net.forward(outputNames)
findobj(output,img)
cv2.imshow("objdetect",img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
回答
VascoCansadoCarvalho Nov 26 2020 at 19:13
np.argmax
インデックスの代わりにmax要素の生の数が表示されるため、問題が発生しているようです。したがって、3x3行列がある場合、argmax関数は行列を3x3の正方形ではなく9x1の線として扱います。
# The matrix:
[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
#will be treated as:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
ドキュメントは怒鳴るソリューションを提案しています:
classId = np.unravel_index(np.argmax(scores, axis=None), scores.shape)
KuliduDavid Nov 27 2020 at 17:53
今これがポップアップします
Traceback (most recent call last):
File "d:/opencv/objdetect_yolo.py", line 67, in <module>
findobj(output,img)
File "d:/opencv/objdetect_yolo.py", line 38, in findobj
w,h = int(det[2]*wT),int(det[3]*hT)
TypeError: only size-1 arrays can be converted to Python scalars
[ WARN:1] global C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-h4wtvo23\opencv\modules\videoio\src\cap_msmf.cpp (435) `anonymous-namespace'::SourceReaderCB::~SourceReaderCB terminating async callback