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