IndexError: Der Index 14708 ist für die Achse 0 mit der Größe 295 außerhalb der Grenzen

Nov 26 2020

Ich versuche mit yolo eine Objekterkennungssoftware zu erstellen und dieser Fehler tritt auf und ich bin so verloren, bitte kann mir jemand helfen !! (Der Code ist nicht vollständig und es tut mir leid, wenn dieser Beitrag Fehler enthält, da ich ein neuer Stackoverflow bin.) Das Tutorial stammt von hier

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: Der Index 14708 ist für die Achse 0 mit der Größe 295 außerhalb der Grenzen

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

Antworten

VascoCansadoCarvalho Nov 26 2020 at 19:13

Es scheint, dass Sie auf ein Problem np.argmaxstoßen, da Sie die Rohnummer des max-Elements anstelle des Index erhalten. Wenn Sie also eine 3x3-Matrix haben, behandelt die Argmax-Funktion die Matrix als 9x1-Linie anstelle eines 3x3-Quadrats.

# The matrix:
[[1, 2, 3],
 [4, 5, 6],
 [7, 8, 9]]

#will be treated as:
[1, 2, 3, 4, 5, 6, 7, 8, 9]

Die Dokumentation schlägt die folgende Lösung vor:

classId = np.unravel_index(np.argmax(scores, axis=None), scores.shape)
KuliduDavid Nov 27 2020 at 17:53

Jetzt taucht das auf

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