推理期间索引错误使用 Roboflow Docker 和 cv2 使用 Picamera2

问题描述 投票:0回答:1

我对此很陌生,所以请告诉我,我正在使用 roboflow 库和 cv2 库作为我的对象检测模型,我将其与带有树莓派的 docker 一起使用,但我收到了此错误并且试图思考我的下一步行动应该是什么。任何有知识的人都可以给我很大的帮助,因为这是我的论文研究。

import cv2
import time
from picamera2 import Picamera2
from inference import InferencePipeline
from roboflow import Roboflow
import pandas as pd
import cvzone
import numpy as np

picam2a = Picamera2(0)
picam2b = Picamera2(1)

picam2a.preview_configuration.sensor.output_size = (640,480)
picam2b.preview_configuration.sensor.output_size = (640,480)

picam2a.preview_configuration.sensor.bit_depth = 10
picam2b.preview_configuration.sensor.bit_depth = 10

picam2a.preview_configuration.main.format = "RGB888"
picam2b.preview_configuration.main.format = "RGB888"

picam2a.preview_configuration.controls.FrameRate = 30
picam2b.preview_configuration.controls.FrameRate = 30

picam2a.configure("preview")
picam2b.configure("preview")

picam2a.start()
picam2b.start()

rf = Roboflow(api_key="~~~~~~~~~~~")
project = rf.workspace().project("~~~~~~~~~~~")
model = project.version(3, local="http:~~~~~~~~~~~~~/").model
classes = ['Ripe','Unripe','Overripe']
data = classes
class_list = data
count=0

fps = 0

while True:
    tStart = time.time()
    im= picam2a.capture_array()
    im2= picam2b.capture_array()

    count += 1
    if count % 3 != 0:
        continue
    im=cv2.flip(im,0) # type: ignore
    prediction=model.predict(im,confidence=40, overlap=30)
    print(prediction.json())
    a=prediction[0].boxdata
    px=pd.DataFrame(a).astype("float")

    for index,row in px.iterrows():
#        print(row)

        x1=int(row[0])
        y1=int(row[1])
        x2=int(row[2])
        y2=int(row[3])
        d=int(row[5])
        c=class_list[d]
        
        cv2.rectangle(im,(x1,y1),(x2,y2),(0,0,255),2)
        cvzone.putTextRect(im,f'{c}',(x1,y1),1,1)
    cv2.imshow("Camera1", im)

    im2=cv2.flip(im2,0) # type: ignore
    prediction=model.predict(im2, confidence=40, overlap=30)
    print(prediction.json())
    a=prediction[0].boxdata
    px=pd.DataFrame(a).astype("float")
    
    for index,row in px.iterrows():
#        print(row)
 
        x1=int(row[0])
        y1=int(row[1])
        x2=int(row[2])
        y2=int(row[3])
        d=int(row[5])
        c=class_list[d]
        
        cv2.rectangle(im2,(x1,y1),(x2,y2),(0,0,255),2)
        cvzone.putTextRect(im2,f'{c}',(x1,y1),1,1)
    cv2.imshow("Camera2", im2)
    
    if cv2.waitKey(30)==ord('q'):
        break
    tEnd = time.time()
    loopTime = tEnd-tStart
    fps = .9*fps + .1*(1/loopTime)
    print(int(fps))
cv2.destroyAllWindows()

这是我一直在构建的代码,我之前已经使用 YOLO 进行了测试,它工作得很好,但是我在使用本地机器训练数据时遇到了一些麻烦,所以我已经转移到 Roboflow docker,这是我收到输出错误。

File "/home/ACSIPGuro/rpi-bookworm-yolov8/cam_3.py", line 53, in <module>
    a=prediction[0].boxdata
      ~~~~~~~~~~^^^
  File "/home/ACSIPGuro/.local/lib/python3.11/site-packages/roboflow/util/prediction.py", line 421, in __getitem__
    return self.predictions[index]
           ~~~~~~~~~~~~~~~~^^^^^^^
IndexError: list index out of range

我尝试删除这些行并且它有效,但是如果我不定义框框架,则显示其检测到的内容的框不会显示。

 a=prediction[0].boxdata
    px=pd.DataFrame(a).astype("float")
    
    for index,row in px.iterrows():
#        print(row)
 
        x1=int(row[0])
        y1=int(row[1])
        x2=int(row[2])
        y2=int(row[3])
        d=int(row[5])
        c=class_list[d]
        
        cv2.rectangle(im2,(x1,y1),(x2,y2),(0,0,255),2)
        cvzone.putTextRect(im2,f'{c}',(x1,y1),1,1)

任何人有其他方法可以做到这一点或任何其他替代方案?预先感谢!

opencv raspberry-pi roboflow picamera2
1个回答
0
投票

您的预测数组似乎是空的(它没有找到任何对象),但您的代码在尝试从中读取第一个元素之前没有检查空数组。

你可以添加

if len(prediction) == 0: return

就在您的

print(prediction.json())
行之后,只有在预测到某些情况时才会继续。

在这种情况下,您可能仍然想要执行

imshow
和 fps 文本,因此另一个选择是跳过尝试绘制第一个对象的块。

另请查看监督,这使得可视化这些预测变得更加容易。

© www.soinside.com 2019 - 2024. All rights reserved.