基于YOLOv5+Deepsort的智能寻人系统 行人重识别+目标跟踪 QT界面
文章目录

1

1

构建基于YOLOv8和DeepSort的智能寻人系统,包括行人重识别(ReID)和目标跟踪,使用QT界面进行展示,
以下是一个完整的流程,从安装依赖、准备数据集、配置YOLOv8、训练模型、评估模型、推理代码到构建GUI应用程序。
仅供参考,
1. 安装依赖
确保已经安装了必要的Python库:
pip install ultralytics opencv-python-headless numpy torch torchvision scikit-learn
2. 准备数据集
数据集转换:VOC格式 → YOLO格式
假设你已经有了标注好的数据集,以下是转换脚本:
import os
import xml.etree.ElementTree as ET
def convert(size, box):
dw = 1. / size[0]
dh = 1. / size[1]
x = (box[0] + box[1]) / 2.0 - 1
y = (box[2] + box[3]) / 2.0 - 1
w = box[1] - box[0]
h = box[3] - box[2]
x = x * dw
w = w * dw
y = y * dh
h = h * dh
return (x, y, w, h)
def convert_annotation(xml_file, output_file, classes):
tree = ET.parse(xml_file)
root = tree.getroot()
size = root.find('size')
w = int(size.find('width').text)
h = int(size.find('height').text)
with open(output_file, 'w') as out_file:
for obj in root.iter('object'):
cls = obj.find('name').text
if cls not in classes:
continue
cls_id = classes.index(cls)
xmlbox = obj.find('bndbox')
b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text),
float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
bb = convert((w, h), b)
out_file.write(f"{cls_id} {' '.join(map(str, bb))}\n")
# 配置路径和类别
classes = ['person']
xml_dir = './path/to/voc/annotations'
output_dir = './path/to/yolo/labels'
os.makedirs(output_dir, exist_ok=True)
for xml_file in os.listdir(xml_dir):
if xml_file.endswith('.xml'):
convert_annotation(os.path.join(xml_dir, xml_file),
os.path.join(output_dir, xml_file.replace('.xml', '.txt')),
classes)
创建data.yaml
配置文件
创建一个data.yaml
文件,描述数据集路径和类别信息:
train: ./path/to/train/images
val: ./path/to/val/images
test: ./path/to/test/images
nc: 1
names: ['person']
3. 配置YOLOv8并训练模型
加载YOLOv8模型并开始训练
from ultralytics import YOLO
# 加载YOLOv8模型
model = YOLO('yolov8n.yaml') # 或者使用预训练权重:'yolov8n.pt'
# 开始训练
results = model.train(data='./path/to/data.yaml',
epochs=100,
imgsz=640, # 输入图像大小
batch=16) # 批次大小
模型评估
训练完成后,可以对验证集进行评估:
metrics = model.val() # 使用验证集评估模型
print(f"Validation mAP: {metrics.box.map}")
4. 推理代码
编写推理代码,用于检测单张图片中的行人:
from PIL import Image
import cv2
import torch
from deep_sort.deep_sort import DeepSort
def detect_image(image_path, model, deepsort):
results = model.predict(source=image_path, save=False) # 进行推理
image = cv2.imread(image_path)
detections = []
for pred in results:
boxes = pred.boxes.xyxy.cpu().numpy()
confs = pred.boxes.conf.cpu().numpy()
cls_ids = pred.boxes.cls.cpu().numpy()
for box, conf, cls_id in zip(boxes, confs, cls_ids):
if conf > 0.5: # 设置置信度阈值
detections.append((*box, conf))
# 使用DeepSort进行跟踪
outputs = deepsort.update(detections, image)
for track in outputs:
x1, y1, x2, y2, id = track
label = f'ID: {int(id)}'
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(image, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
return image
# 示例用法
image_path = './path/to/test/image.jpg'
model = YOLO('./path/to/best.pt') # 加载训练好的模型
deepsort = DeepSort("deep_sort/deep/checkpoint/ckpt.t7") # 初始化DeepSort
detected_image = detect_image(image_path, model, deepsort)
cv2.imshow('Detected Image', detected_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
5. 构建GUI应用程序
使用PyQt5构建一个简单的GUI应用程序,用于选择图片并展示检测结果:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QLabel, QFileDialog
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt
import cv2
from ultralytics import YOLO
from deep_sort.deep_sort import DeepSort
class App(QWidget):
def __init__(self):
super().__init__()
self.initUI()
# 加载模型
self.model = YOLO('./path/to/best.pt')
self.deepsort = DeepSort("deep_sort/deep/checkpoint/ckpt.t7")
def initUI(self):
self.setWindowTitle('智能寻人系统')
layout = QVBoxLayout()
self.image_label = QLabel(self)
layout.addWidget(self.image_label)
self.select_button = QPushButton('选择图片', self)
self.select_button.clicked.connect(self.select_image)
layout.addWidget(self.select_button)
self.setLayout(layout)
self.show()
def select_image(self):
options = QFileDialog.Options()
file_name, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "Image Files (*.jpg *.jpeg *.png)", options=options)
if file_name:
self.detect_and_show(file_name)
def detect_and_show(self, image_path):
image = cv2.imread(image_path)
detections = []
results = self.model.predict(source=image_path, save=False)
for pred in results:
boxes = pred.boxes.xyxy.cpu().numpy()
confs = pred.boxes.conf.cpu().numpy()
cls_ids = pred.boxes.cls.cpu().numpy()
for box, conf, cls_id in zip(boxes, confs, cls_ids):
if conf > 0.5:
detections.append((*box, conf))
outputs = self.deepsort.update(detections, image)
for track in outputs:
x1, y1, x2, y2, id = track
label = f'ID: {int(id)}'
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(image, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
height, width, channel = image.shape
bytes_per_line = 3 * width
q_img = QImage(image.data, width, height, bytes_per_line, QImage.Format_RGB888).rgbSwapped()
pixmap = QPixmap.fromImage(q_img)
self.image_label.setPixmap(pixmap)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
6. 运行
- 确保所有路径和参数正确无误。
- 运行上述代码,启动GUI应用程序。
- 在GUI中选择一张测试图片,程序会自动检测行人并显示结果。
总结 仅供参考
安装依赖、准备数据集、配置YOLOv8、训练模型、评估模型、推理代码到构建GUI应用程序的完整流程。同学,长点心,请根据实际需求调整路径、参数和代码细节。
仅供参考。