python 基于深度学习的行人车辆多目标实时检测与跟踪系统 ui
文章目录
- 1. 环境搭建
- 安装依赖
- 2. 数据准备
- 数据集结构
- 3. 模型训练
- 训练配置文件
- 训练模型
- 4. 目标跟踪
- OCTrack配置
- 5. UI设计与结果展示
- 设计界面
- 主程序代码
- 6. 运行与测试
行人车辆多目标实时检测与跟踪系统
(UI界面,Python代码)
使用深度学习中的YOLOv5和OCTrack算法实现车辆、行人等多目标的实时检测和跟踪,并利用PyQt5设计了简约的系统UI界面。选择自己的视频文件进行检测和跟踪,可通过电脑自带的摄像头进行实时处理。
行人车辆多目标实时检测与跟踪系统
涉及多个步骤:模型训练、推理代码、目标跟踪算法以及UI设计
关键代码示例:
1. 环境搭建
确保你的开发环境已经安装了必要的库和工具。
安装依赖
# 创建并激活虚拟环境conda create-nmulti_target_trackingpython=3.8conda activate multi_target_tracking# 安装YOLOv5和相关库pipinstalltorch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113 pipinstallopencv-python PyQt5 numpy scipy filterpygitclone https://github.com/ultralytics/yolov5.gitcdyolov5 pipinstall-rrequirements.txt# 安装OCTrackgitclone https://github.com/your-octrack-repo.gitcdoctrack pipinstall-rrequirements.txt2. 数据准备
收集和标注包含行人和车辆的数据集。使用Labelimg进行标注,并将标注文件保存为YOLO格式。
数据集结构
dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ └── labels/ ├── train/ ├── val/ └── test/3. 模型训练
使用YOLOv5进行模型训练。
训练配置文件
创建一个data.yaml文件,定义数据集和类别信息。
train:dataset/images/trainval:dataset/images/valtest:dataset/images/testnc:2names:['person','car']训练模型
使用以下命令进行模型训练。
python train.py--img640--batch16--epochs100--datadata.yaml--weightsyolov5s.pt4. 目标跟踪
使用OCTrack进行目标跟踪。
OCTrack配置
根据需要调整OCTrack的参数和配置。
fromoctrackimportOCTrackdefinit_tracker():returnOCTrack()defupdate_tracker(tracker,detections):tracker.update(detections)returntracker.get_tracks()5. UI设计与结果展示
使用PyQt5设计用户界面,并展示检测和跟踪结果。
设计界面
使用Qt Designer设计界面,并导出为.ui文件,然后使用pyuic5转换为Python代码。
pyuic5-xyour_design.ui-oui_design.py主程序代码
importsysfromPyQt5.QtWidgetsimportQApplication,QMainWindow,QFileDialogfromPyQt5.QtGuiimportQImage,QPixmapfromPyQt5.QtCoreimportQTimerimportcv2fromyolov5.models.experimentalimportattempt_loadfromyolov5.utils.datasetsimportLoadStreams,LoadImagesfromyolov5.utils.generalimportnon_max_suppression,scale_coordsfromyolov5.utils.torch_utilsimportselect_devicefromoctrackimportOCTrackfromui_designimportUi_MainWindowclassMultiTargetTrackingApp(QMainWindow,Ui_MainWindow):def__init__(self):super().__init__()self.setupUi(self)self.device=select_device('0')self.model=attempt_load('best.pt',map_location=self.device)self.tracker=init_tracker()self.loadImageButton.clicked.connect(self.load_image)self.loadVideoButton.clicked.connect(self.load_video)self.startCameraButton.clicked.connect(self.start_camera)self.saveButton.clicked.connect(self.save_results)self.exitButton.clicked.connect(self.close)self.timer=QTimer()self.timer.timeout.connect(self.update_frame)self.cap=Nonedefload_image(self):file_name,_=QFileDialog.getOpenFileName(self,"选择图片文件","","Images (*.png *.xpm *.jpg)")iffile_name:self.detect_and_track(file_name)defload_video(self):file_name,_=QFileDialog.getOpenFileName(self,"选择视频文件","","Videos (*.mp4 *.avi)")iffile_name:self.cap=cv2.VideoCapture(file_name)self.timer.start(30)defstart_camera(self):self.cap=cv2.VideoCapture(0)self.timer.start(30)defupdate_frame(self):ret,frame=self.cap.read()ifret:results=self.detect_and_track(frame)annotated_frame=self.plot_results(results,frame)height,width,channel=annotated_frame.shape bytes_per_line=3*width q_img=QImage(annotated_frame.data,width,height,bytes_per_line,QImage.Format_RGB888)self.imageLabel.setPixmap(QPixmap.fromImage(q_img))defdetect_and_track(self,image):img=cv2.resize(image,(640,640))img=img[:,:,::-1].transpose(2,0,1)# BGR to RGB, to 3x416x416img=np.ascontiguousarray(img)img=torch.from_numpy(img).to(self.device)img=img.float()/255.0# 0 - 255 to 0.0 - 1.0ifimg.ndimension()==3:img=img.unsqueeze(0)pred=self.model(img,augment=False)[0]pred=non_max_suppression(pred,conf_thres=0.25,iou_thres=0.45,classes=None,agnostic=False)detections=[]fordetinpred:iflen(det):det[:,:4]=scale_coords(img.shape[2:],det[:,:4],image.shape).round()for*xyxy,conf,clsinreversed(det):x1,y1,x2,y2=map(int,xyxy)detections.append([x1,y1,x2,y2,float(conf),int(cls)])tracks=update_tracker(self.tracker,detections)returntracksdefplot_results(self,tracks,image):fortrackintracks:x1,y1,x2,y2,id=map(int,track[:5])cv2.rectangle(image,(x1,y1),(x2,y2),(0,255,0),2)cv2.putText(image,f'ID:{id}',(x1,y1-10),cv2.FONT_HERSHEY_SIMPLEX,0.9,(0,255,0),2)returnimagedefsave_results(self):file_name,_=QFileDialog.getSaveFileName(self,"保存结果","","Text Files (*.txt)")iffile_name:withopen(file_name,'w')asf:fortrackinself.tracks:f.write(f'{track}\n')if__name__=='__main__':app=QApplication(sys.argv)window=MultiTargetTrackingApp()window.show()sys.exit(app.exec_())6. 运行与测试
运行主程序,加载图片、视频或启动摄像头进行检测和跟踪,并展示检测和跟踪结果及可视化。
关键代码示例,仅供参考。