深度学习监控密集人群人头计数检测数据集 识别密集状态下的头部检测

发布时间:2026/10/12 2:28:12
深度学习监控密集人群人头计数检测数据集 识别密集状态下的头部检测
使用深度学习框架目标检测__yolov8训练使用 密集人群人头计数检测数据集 识别密集状态下的头部检测文章目录使用深度学习框架目标检测__yolov8训练使用 密集人群人头计数检测数据集 识别密集状态下的头部检测1. 数据集准备数据集结构2. 安装必要的依赖3. 模型训练训练脚本4. 优化与评估5. 构建人群计数系统可选密集人群人头计数检测数据集 3118张yolo和voc两种标注方式1类标注数量Head: 95408image num: 31181使用YOLOv8训练一个密集人群人头计数检测系统并利用给定的数据集包含3118张图像和95408个人头标注tx同学完成数据集准备、模型训练以及优化评估的全过程。以下是详细的步骤和代码示例帮助你从头开始构建这个系统。文章目录使用深度学习框架目标检测__yolov8训练使用 密集人群人头计数检测数据集 识别密集状态下的头部检测1. 数据集准备数据集结构2. 安装必要的依赖3. 模型训练训练脚本4. 优化与评估5. 构建人群计数系统可选文字及代码仅供参考。1. 数据集准备数据集结构确保你的数据集按照以下结构组织dataset/train/images/: 训练图像dataset/train/labels_yolo/: 对应的YOLO格式标签文件dataset/val/images/: 验证图像dataset/val/labels_yolo/: 对应的YOLO格式标签文件每个YOLO格式的标签文件中的每一行代表一个对象格式如下class_index x_center y_center width height其中坐标和尺寸已经归一化到[0, 1]之间。如果你的数据集是以VOC格式标注的首先需要将其转换为YOLO格式。下面是一个简单的Python脚本用于转换importosimportxml.etree.ElementTreeasETdefconvert_voc_to_yolo(voc_dir,yolo_dir):ifnotos.path.exists(yolo_dir):os.makedirs(yolo_dir)forxml_fileinos.listdir(voc_dir):ifnotxml_file.endswith(.xml):continuetreeET.parse(os.path.join(voc_dir,xml_file))roottree.getroot()widthint(root.find(size/width).text)heightint(root.find(size/height).text)withopen(os.path.join(yolo_dir,xml_file.replace(.xml,.txt)),w)asf:forobjinroot.findall(object):class_nameobj.find(name).textifclass_name!Head:continuexminint(obj.find(bndbox/xmin).text)yminint(obj.find(bndbox/ymin).text)xmaxint(obj.find(bndbox/xmax).text)ymaxint(obj.find(bndbox/ymax).text)x_center(xmin(xmax-xmin)/2)/width y_center(ymin(ymax-ymin)/2)/height bbox_width(xmax-xmin)/width bbox_height(ymax-ymin)/height f.write(f0{x_center}{y_center}{bbox_width}{bbox_height}\n)# 使用方法convert_voc_to_yolo(path/to/voc_labels/,path/to/yolo_labels/)创建一个data.yaml文件来描述数据集路径和类别信息train:./dataset/train/images/val:./dataset/val/images/nc:1# 类别数量names:[Head]# 类别名称2. 安装必要的依赖确保安装了必要的库pipinstallultralytics opencv-python3. 模型训练使用YOLOv8进行模型训练。以下是一个完整的Python脚本用于加载预训练的YOLOv8模型并开始训练过程。训练脚本fromultralyticsimportYOLOimportosdeftrain_yolov8_model():# 加载预训练的YOLOv8模型modelYOLO(yolov8n.pt)# 或者选择其他变体如yolov8s.pt, yolov8m.pt等# 开始训练resultsmodel.train(datapath/to/data.yaml,# 数据集配置文件路径epochs100,# 根据需要调整epoch数imgsz640,# 输入图像尺寸batch16,# 批次大小namecrowd_counting,# 实验名称saveTrue,# 自动保存最佳模型exist_okTrue,# 如果目录存在则不报错patience50,# 当验证损失不再改善时提前停止训练的轮数lr00.01,# 初始学习率lrf0.1,# 最终学习率lr0 * lrfoptimizerSGD,# 优化器类型augmentTrue,# 启用数据增强flipud0.0,# 上下翻转概率fliplr0.5,# 左右翻转概率mosaic1.0,# Mosaic数据增强的概率mixup0.0,# MixUp数据增强的概率degrees0.0,# 旋转角度范围translate0.1,# 平移比例范围scale0.5,# 缩放比例范围shear0.0,# 剪切变换角度范围perspective0.0,# 透视变换比例dropout0.0,# Dropout比例hsv_h0.015,# HSV色调变化比例hsv_s0.7,# HSV饱和度变化比例hsv_v0.4,# HSV亮度变化比例copy_paste0.0,# Copy-Paste数据增强的概率cacheTrue,# 使用缓存加速训练device,# 使用GPU或CPU (cuda or cpu)workers8,# 数据加载的工作线程数projectruns/detect,# 保存结果的项目目录entityNone,# WandB实体名upload_datasetFalse,# 是否上传数据集到WandBbbox_interval-1,# Bbox日志间隔artifact_aliaslatest,# 版本控制别名multi_scaleFalse,# 多尺度训练sync_bnFalse,# 同步BNcos_lrFalse,# 使用余弦退火学习率调度single_clsFalse,# 单类模式rectFalse,# 矩形训练resumeFalse,# 恢复训练freeze[0],# 冻结层的数量verboseTrue,# 显示详细输出seed0,# 随机种子linear_lrFalse,# 线性学习率overlap_maskTrue,# 掩码重叠mask_ratio4,# 掩码比例v5_metricFalse# 使用YOLOv5的评估指标)if__name____main__:train_yolov8_model()4. 优化与评估训练完成后可以使用验证集评估模型性能fromultralyticsimportYOLOdefvalidate_model():modelYOLO(runs/detect/crowd_counting/weights/best.pt)# 加载最佳模型metricsmodel.val()# 进行验证print(metrics.box.map)# 输出mAP值作为性能指标之一if__name____main__:validate_model()5. 构建人群计数系统可选如果需要将模型集成到一个实际应用中可以使用PyQt5构建用户界面支持视频、图片文件选择及摄像头实时检测importsysfromPyQt5.QtWidgetsimportQApplication,QWidget,QVBoxLayout,QPushButton,QLabel,QFileDialogfromPyQt5.QtGuiimportQPixmap,QImageimportcv2fromultralyticsimportYOLOclassCrowdCountingApp(QWidget):def__init__(self):super().__init__()self.initUI()self.modelYOLO(runs/detect/crowd_counting/weights/best.pt)# 加载训练好的模型definitUI(self):self.setWindowTitle(Crowd Counting System)layoutQVBoxLayout()self.imageLabelQLabel(self)layout.addWidget(self.imageLabel)btn_load_imageQPushButton(Load Image,self)btn_load_image.clicked.connect(self.loadImage)layout.addWidget(btn_load_image)btn_start_cameraQPushButton(Start Camera,self)btn_start_camera.clicked.connect(self.startCamera)layout.addWidget(btn_start_camera)self.setLayout(layout)defloadImage(self):fname,_QFileDialog.getOpenFileName(self,Open file,,Image files (*.jpg *.png))iffname:pixmapQPixmap(fname)self.imageLabel.setPixmap(pixmap.scaled(self.imageLabel.size(),aspectRatioMode1))self.detectHeads(fname)# 调用检测函数defdetectHeads(self,image_path):resultsself.model.predict(image_path,conf0.5)count0forresultinresults:forboxinresult.boxes:cls,confbox.cls.item(),box.conf.item()labelself.model.model.names[int(cls)]print(fDetected{label}with confidence{conf:.2f})count1print(fTotal heads detected:{count})defstartCamera(self):capcv2.VideoCapture(0)whileTrue:ret,framecap.read()ifnotret:breakresultsself.model.predict(frame,conf0.5)forresultinresults:forboxinresult.boxes:cls,confbox.cls.item(),box.conf.item()labelself.model.model.names[int(cls)]x1,y1,x2,y2map(int,box.xyxy)cv2.rectangle(frame,(x1,y1),(x2,y2),(0,255,0),2)cv2.putText(frame,f{label}{conf:.2f},(x1,y1-10),cv2.FONT_HERSHEY_SIMPLEX,0.9,(0,255,0),2)rgb_framecv2.cvtColor(frame,cv2.COLOR_BGR2RGB)h,w,chrgb_frame.shape bytes_per_linech*w convert_to_Qt_formatQImage(rgb_frame.data,w,h,bytes_per_line,QImage.Format_RGB888)pconvert_to_Qt_format.scaled(640,480,aspectRatioMode1)self.imageLabel.setPixmap(QPixmap.fromImage(p))ifcv2.waitKey(1)0xFFord(q):breakcap.release()cv2.destroyAllWindows()appQApplication(sys.argv)exCrowdCountingApp()ex.show()sys.exit(app.exec_())