智慧巡检-基于改进RT-DETR的道路交通小目标检测系统含UI界面、yolov8、Python代码、数据集外接摄像头实时检测识别。以官方yolov8为主干实现对道路交通小目标检测识别OpenCV实现对交通目标的检测训练的分类模型识别对小目标种类的检测且利用PyQt5设计了简约的系统UI界面。在界面中您可以选择自己的视频文件、图片文件进行检测。此外您还可以更换自己训练的主干模型进行自己数据的检测。它具备多目标实时检测同时可以自由选择感兴趣的检测目标。数据集为VisDrone2019-DET-train训练集6417张验证集548张测试集130张种类10种 ‘pedestrian’, ‘people’, ‘bicycle’, ‘car’, ‘van’, ‘truck’, ‘tricycle’, ‘awning-tricycle’, ‘bus’, ‘motor’构建该系统的核心代码包含模型加载、推理逻辑以及仿照你截图设计的 PyQt5 界面。1. 环境依赖首先你需要安装必要的库。请在终端运行以下命令# 基础库pipinstalltorch torchvision opencv-python numpy pandas matplotlib# 界面库pipinstallPyQt5# 目标检测库 (支持 YOLOv8 和 RT-DETR)pipinstallultralytics2. 核心代码实现 (main.py)将以下代码保存为main.py。这段代码实现了模型加载自动检测并加载 RT-DETR 或 YOLOv8 权重。多源输入支持图片、视频、摄像头实时检测。可视化界面左侧控制面板右侧视频流显示底部数据表格。数据记录实时记录检测到的目标信息。importsysimporttimeimportcv2importtorchimportnumpyasnpimportpandasaspdfromPyQt5.QtWidgetsimport(QApplication,QMainWindow,QWidget,QVBoxLayout,QHBoxLayout,QLabel,QPushButton,QTableWidget,QTableWidgetItem,QFileDialog,QMessageBox,QComboBox,QHeaderView)fromPyQt5.QtGuiimportQImage,QPixmap,QFont,QIconfromPyQt5.QtCoreimportQt,QThread,pyqtSignal,QTimerfromultralyticsimportRTDETR,YOLO# --- 配置参数 ---MODEL_PATHbest.pt# 你的训练好的权重文件 (rtdetr.pt 或 yolov8.pt)USE_RTDETRTrue# 设置为 True 使用 RT-DETRFalse 使用 YOLOv8# VisDrone 类别名称CLASS_NAMES[pedestrian,people,bicycle,car,van,truck,tricycle,awning-tricycle,bus,motor]classDetectThread(QThread):# 定义信号用于传输处理后的图像和检测结果change_pixmap_signalpyqtSignal(np.ndarray)update_table_signalpyqtSignal(list)def__init__(self,model,source0):super().__init__()self.modelmodel self.sourcesource self.runningTruedefrun(self):capcv2.VideoCapture(self.source)whileself.runningandcap.isOpened():ret,framecap.read()ifret:# 推理resultsself.model(frame,verboseFalse)resultresults[0]# 解析结果boxesresult.boxes.xyxy.cpu().numpy()confsresult.boxes.conf.cpu().numpy()classesresult.boxes.cls.cpu().numpy()detected_data[]# 绘制框forbox,conf,clsinzip(boxes,confs,classes):x1,y1,x2,y2map(int,box)labelf{CLASS_NAMES[int(cls)]}{conf:.2f}# 随机颜色colortuple(np.random.randint(0,255,3).tolist())cv2.rectangle(frame,(x1,y1),(x2,y2),color,2)cv2.putText(frame,label,(x1,y1-10),cv2.FONT_HERSHEY_SIMPLEX,0.5,color,2)detected_data.append({class:CLASS_NAMES[int(cls)],conf:f{conf:.2f},x1:x1,y1:y1,x2:x2,y2:y2})# 发送信号self.change_pixmap_signal.emit(frame)self.update_table_signal.emit(detected_data)else:breakcap.release()defstop(self):self.runningFalseself.wait()classMainWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle(基于改进RT-DETR的道路交通小目标检测系统)self.setGeometry(100,100,1200,800)# 加载模型self.load_model()# UI 初始化self.init_ui()self.threadNonedefload_model(self):try:ifUSE_RTDETR:self.modelRTDETR(MODEL_PATH)else:self.modelYOLO(MODEL_PATH)print(模型加载成功)exceptExceptionase:QMessageBox.critical(self,错误,f模型加载失败:{e})sys.exit()definit_ui(self):# 主布局main_widgetQWidget()main_layoutQHBoxLayout()main_widget.setLayout(main_layout)self.setCentralWidget(main_widget)# --- 左侧控制面板 ---left_panelQWidget()left_layoutQVBoxLayout()left_panel.setFixedWidth(250)left_panel.setStyleSheet(background-color: #f0f0f0; padding: 10px;)# 按钮样式btn_styleQPushButton { background-color: #4a90e2; color: white; border: none; padding: 10px; border-radius: 5px; font-size: 14px; }\QPushButton:hover { background-color: #357abd; }self.btn_imgQPushButton(选择图片文件)self.btn_img.setStyleSheet(btn_style)self.btn_img.clicked.connect(self.load_image)self.btn_videoQPushButton(选择视频文件)self.btn_video.setStyleSheet(btn_style)self.btn_video.clicked.connect(self.load_video)self.btn_camQPushButton(打开摄像头)self.btn_cam.setStyleSheet(btn_style)self.btn_cam.clicked.connect(self.open_camera)self.btn_stopQPushButton(结束运行)self.btn_stop.setStyleSheet(QPushButton { background-color: #e74c3c; color: white; padding: 10px; border-radius: 5px; })self.btn_stop.clicked.connect(self.stop_detection)left_layout.addWidget(self.btn_img)left_layout.addWidget(self.btn_video)left_layout.addWidget(self.btn_cam)left_layout.addSpacing(20)left_layout.addWidget(self.btn_stop)left_layout.addStretch()# --- 右侧显示区域 ---right_panelQWidget()right_layoutQVBoxLayout()# 视频显示标签self.video_labelQLabel()self.video_label.setFixedSize(900,600)self.video_label.setStyleSheet(background-color: #000;)# 结果表格self.tableQTableWidget()self.table.setColumnCount(6)self.table.setHorizontalHeaderLabels([序号,类别,置信度,X1,Y1,X2,Y2])self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)right_layout.addWidget(self.video_label)right_layout.addWidget(self.table)# 添加到主布局main_layout.addWidget(left_panel)main_layout.addWidget(right_panel)defload_image(self):fname,_QFileDialog.getOpenFileName(self,Open file,.,Image files (*.jpg *.png))iffname:self.run_detection(sourcefname,is_imageTrue)defload_video(self):fname,_QFileDialog.getOpenFileName(self,Open file,.,Video files (*.mp4 *.avi))iffname:self.run_detection(sourcefname,is_imageFalse)defopen_camera(self):self.run_detection(source0,is_imageFalse)defrun_detection(self,source,is_image):ifself.threadisnotNone:self.thread.stop()self.threadDetectThread(self.model,source)self.thread.change_pixmap_signal.connect(self.update_image)self.thread.update_table_signal.connect(self.update_table)self.thread.start()defstop_detection(self):ifself.threadisnotNone:self.thread.stop()self.threadNoneself.video_label.clear()self.table.setRowCount(0)defupdate_image(self,cv_img):将 OpenCV 图像转换为 Qt 图像并显示rgb_imagecv2.cvtColor(cv_img,cv2.COLOR_BGR2RGB)h,w,chrgb_image.shape bytes_per_linech*w convert_to_Qt_formatQImage(rgb_image.data,w,h,bytes_per_line,QImage.Format_RGB888)pconvert_to_Qt_format.scaled(900,600,Qt.KeepAspectRatio)self.video_label.setPixmap(QPixmap.fromImage(p))defupdate_table(self,data):self.table.setRowCount(0)# 清空表格如果是实时视频流通常只保留当前帧或累积# 这里为了演示如果是视频流每次更新会覆盖如果是图片则显示所有forrow_num,row_datainenumerate(data):self.table.insertRow(row_num)self.table.setItem(row_num,0,QTableWidgetItem(str(row_num1)))self.table.setItem(row_num,1,QTableWidgetItem(row_data[class]))self.table.setItem(row_num,2,QTableWidgetItem(row_data[conf]))self.table.setItem(row_num,3,QTableWidgetItem(str(row_data[x1])))self.table.setItem(row_num,4,QTableWidgetItem(str(row_data[y1])))self.table.setItem(row_num,5,QTableWidgetItem(str(row_data[x2])))self.table.setItem(row_num,6,QTableWidgetItem(str(row_data[y2])))if__name____main__:appQApplication(sys.argv)windowMainWindow()window.show()sys.exit(app.exec_())3. 代码功能详解模型兼容性代码中使用了ultralytics库。通过USE_RTDETR True代码会自动调用RTDETR类加载模型。如果你需要切换回 YOLOv8只需将USE_RTDETR改为False即可。多线程处理 (DetectThread)为了防止界面卡顿视频读取和推理过程被放在了一个单独的线程中。使用pyqtSignal将处理后的图像numpy数组发送回主线程进行显示。界面布局左侧是操作区选择文件、打开摄像头、停止采用了固定宽度和背景色模仿了截图中的风格。右侧上方是视频显示区下方是数据表格实时展示检测到的目标类别、坐标和置信度。数据导出虽然截图中有一个“导出数据”按钮为了保持代码简洁核心逻辑已包含在表格更新中。你可以使用pandas将detected_data列表保存为 CSV 文件。4. 如何训练你的模型VisDrone 数据集同学你需要先训练一个模型。创建一个train.pyfromultralyticsimportRTDETR# 加载预训练模型modelRTDETR(rtdetr-l.pt)# 或者 rtdetr-x.pt# 训练model.train(datapath/to/visdrone.yaml,# 你的数据集配置文件路径epochs100,imgsz640,batch8,# 根据显存调整namertdetr_visdrone_v1)训练完成后将生成的best.pt放在项目根目录下即可运行main.py进行检测。以上即为构建该道路交通小目标检测系统的完整代码与训练指南。