IndexError: l'index 14708 est hors limites pour l'axe 0 avec la taille 295
Nov 26 2020
J'essaie de créer un logiciel de détection d'objets avec yolo et cette erreur apparaît et je suis tellement perdu, s'il vous plaît, quelqu'un peut-il m'aider !! (le code n'est pas complet et désolé s'il y a des erreurs dans ce post car je suis nouveau Stackoverflow) .le tutoriel est d' ici
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: l'index 14708 est hors limites pour l'axe 0 avec la taille 295
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
Réponses
VascoCansadoCarvalho Nov 26 2020 at 19:13
Il semble que vous rencontriez un problème car np.argmax
cela vous donnera le nombre brut de l'élément max au lieu de l'index. Donc, si vous avez une matrice 3x3, la fonction argmax traitera la matrice comme une ligne 9x1 au lieu d'un carré 3x3.
# The matrix:
[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
#will be treated as:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
La documentation suggère la solution ci-dessous:
classId = np.unravel_index(np.argmax(scores, axis=None), scores.shape)
KuliduDavid Nov 27 2020 at 17:53
Maintenant ça surgit
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