@IvanTRG

Как мне исправить ошибку KeyError: 18?

суть кода такова: я делю изображение на несколько зон разного размера и распознаю определённые объекты в этих зонах. Код работает, но через некоторое время выдаёт следующую ошибку: File "c:\programs\zony.py", line 40, in
class_name = classNames[class_id]
KeyError: 18.

может кто знает как бороться с ней?

import cv2
import numpy as np
import os
# Задаем количество и размеры зон
num_zones = 4
zone_width = 320
zone_height = 240
zone_width2 = 120
zone_height3 = 135
classNames = { 1: 'bicycle', 2: 'bus', 3: 'car', 4: 'chair', 
              5: 'motorbike', 6: 'person',
              7: 'pottedplant',  8: 'train', }
model = cv2.dnn.readNetFromCaffe('C:\programs\Real\MobileNetSSD_deploy.prototxt.txt', 'C:\programs\Real\MobileNetSSD_deploy.caffemodel')
# Создаем объект для видео
cap = cv2.VideoCapture(0)

while True:
    # Считываем кадр из видео
    ret, frame = cap.read()

    # Разделяем кадр на зоны
    for i in range(num_zones):
        # Вычисляем координаты верхнего левого угла зоны
        x = (i % 2) * zone_width
        y = (i // 2) * zone_height
        # Получаем изображение зоны
        zone = frame[y:y+zone_height, x:x+zone_width]

        # Отображаем изображение зоны

    frame_resized = cv2.resize(zone, (300, 300))
    blob = cv2.dnn.blobFromImage(frame_resized, 0.007843, (300, 300), (127.5, 127.5, 127.5), False)    
    model.setInput(blob)
    detections = model.forward()    
    for i in range(detections.shape[2]):
        confidence = detections[0, 0, i, 2]
        if confidence > 0.5:
            class_id = int(detections[0, 0, i, 1])
            class_name = classNames[class_id]
            box = detections[0, 0, i, 3:7] * np.array([frame.shape[1], frame.shape[0], frame.shape[1], frame.shape[0]])
            x1, y1, x2, y2 = box.astype('int')
            cv2.rectangle(zone, (x1, y1), (x2, y2), (0, 255, 0), 2)
            cv2.putText(zone, class_name, (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
        
        
        cv2.imshow("Z1", zone)    
    # Отображаем исходный кадр
    for i in range(num_zones):
        # Вычисляем координаты верхнего левого угла зоны
        x = (i % 2) * zone_width2
        y = (i // 2) * zone_height3

        # Получаем изображение зоны
        zone2 = frame[y:y+zone_height3, x:x+zone_width2]

        # Отображаем изображение зоны
        cv2.imshow("Z2", zone2)


    # Если нажата клавиша 'q', выходим из цикла
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# Освобождаем ресурсы
cap.release()
cv2.destroyAllWindows()
  • Вопрос задан
  • 130 просмотров
Пригласить эксперта
Ответы на вопрос 1
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Хорошо бы понять, откуда в class_id попадает невалидное значение ключа?
  1. Если такого быть не должно, надо искать причину.
  2. Если такое возможно, надо обрабатывать это исключение через try/except KeyError, либо предварительно валидизировать значение class_id
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы