我对此很陌生,所以请告诉我,我正在使用 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)
任何人有其他方法可以做到这一点或任何其他替代方案?预先感谢!
您的预测数组似乎是空的(它没有找到任何对象),但您的代码在尝试从中读取第一个元素之前没有检查空数组。
你可以添加
if len(prediction) == 0: return
就在您的
print(prediction.json())
行之后,只有在预测到某些情况时才会继续。
在这种情况下,您可能仍然想要执行
imshow
和 fps 文本,因此另一个选择是跳过尝试绘制第一个对象的块。
另请查看监督,这使得可视化这些预测变得更加容易。