
使用深度学习框架yolo训练COCO2017人体姿势关键点检测数据集 基于YOLOv8的人体姿势关键点检测系统并使用PyQt6编写GUI界面支持图片、视频和摄像头实时检测文章目录使用深度学习框架yolo训练COCO2017人体姿势关键点检测数据集 基于YOLOv8的人体姿势关键点检测系统并使用PyQt6编写GUI界面支持图片、视频和摄像头实时检测1. 数据准备和格式转换1.1 将COCO2017数据集转换为YOLO格式2. 训练YOLO模型2.1 创建数据配置文件 data.yaml2.2 训练脚本 train.py3. 检测与推理3.1 修改 detect.py 支持关键点绘制4. PyQt6 GUI界面4.1 界面布局和功能实现以下文字及代码可供参考。COCO2017人体姿势关键点检测数据集的yolo格式。17个关键点。可yolo系列模型训练训练集56599张验证集2346张。gui界面利用PyQt6编写。支持摄像头、图片和视频检测1利用OCO2017人体姿势关键点检测数据集构建一个基于YOLO系列模型的检测系统并且使用PyQt6编写GUI界面我们需要完成以下步骤1. 数据准备和格式转换1.1 将COCO2017数据集转换为YOLO格式COCO2017数据集包含人体关键点信息但YOLO模型主要用于目标检测。为了将关键点检测任务转化为目标检测任务我们可以将每个关键点视为一个小的目标框。假设我们只关注人体检测即person类别并且需要在检测到的人体上绘制关键点。# utils.pyimportjsonimportosfromPILimportImagedefcoco_to_yolo(coco_json,output_dir):withopen(coco_json)asf:datajson.load(f)forimg_infoindata[images]:img_idimg_info[id]img_widthimg_info[width]img_heightimg_info[height]img_filenameimg_info[file_name]yolo_labels[]forannindata[annotations]:ifann[image_id]img_idandann[category_id]1:# category_id1 表示 personbbox_2dann[bbox]keypointsann[keypoints]x_center(bbox_2d[0]bbox_2d[2]/2)/img_width y_center(bbox_2d[1]bbox_2d[3]/2)/img_height widthbbox_2d[2]/img_width heightbbox_2d[3]/img_height yolo_labels.append(f0{x_center}{y_center}{width}{height})# 添加关键点坐标foriinrange(0,len(keypoints),3):xkeypoints[i]/img_width ykeypoints[i1]/img_height visiblekeypoints[i2]ifvisible0:yolo_labels.append(f{i//31}{x}{y}0 0)label_fileos.path.join(output_dir,img_filename.replace(.jpg,.txt))withopen(label_file,w)asf:f.write(\n.join(yolo_labels))# 调用函数进行转换coco_train_jsonpath/to/coco/annotations/person_keypoints_train2017.jsonoutput_train_dirpath/to/output/train/labelsos.makedirs(output_train_dir,exist_okTrue)coco_to_yolo(coco_train_json,output_train_dir)coco_val_jsonpath/to/coco/annotations/person_keypoints_val2017.jsonoutput_val_dirpath/to/output/val/labelsos.makedirs(output_val_dir,exist_okTrue)coco_to_yolo(coco_val_json,output_val_dir)2. 训练YOLO模型2.1 创建数据配置文件data.yamltrain:path/to/output/train/imagesval:path/to/output/val/imagesnc:18# 1个person类别 17个关键点类别names:[person,keypoint1,keypoint2,...,keypoint17]2.2 训练脚本train.py# train.pyfromultralyticsimportYOLO modelYOLO(yolov8s.pt)resultsmodel.train(datadata.yaml,epochs50,imgsz640,batch16,namepose_detector)3. 检测与推理3.1 修改detect.py支持关键点绘制# detect.pyfromultralyticsimportYOLOimportcv2importnumpyasnpdefdraw_keypoints(image,results):forresultinresults:boxesresult.boxes.xyxy.cpu().numpy()keypointsresult.keypoints.data.cpu().numpy()forbox,kpsinzip(boxes,keypoints):x1,y1,x2,y2map(int,box)cv2.rectangle(image,(x1,y1),(x2,y2),(0,255,0),2)forkpinkps:ifnotnp.isnan(kp).any():x,ymap(int,kp[:2])cv2.circle(image,(x,y),5,(0,0,255),-1)returnimagedefprocess_video(video_path,model):capcv2.VideoCapture(video_path)whilecap.isOpened():ret,framecap.read()ifnotret:breakresultsmodel(frame)annotated_framedraw_keypoints(frame.copy(),results)cv2.imshow(Video Detection,annotated_frame)ifcv2.waitKey(1)0xFFord(q):breakcap.release()cv2.destroyAllWindows()if__name____main__:video_pathpath/to/video.mp4modelYOLO(runs/detect/pose_detector/weights/best.pt)process_video(video_path,model)4. PyQt6 GUI界面4.1 界面布局和功能实现# gui.pyimportsysfromPyQt6.QtWidgetsimportQApplication,QMainWindow,QPushButton,QVBoxLayout,QWidget,QLabel,QFileDialog,QSlider,QHBoxLayout,QComboBoxfromPyQt6.QtGuiimportQImage,QPixmapfromPyQt6.QtCoreimportQt,QTimerimportcv2fromdetectimportmodel,draw_keypointsclassMainWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle(YOLOv8 Pose Detection)self.setGeometry(100,100,1280,720)self.central_widgetQWidget()self.setCentralWidget(self.central_widget)self.layoutQVBoxLayout()self.central_widget.setLayout(self.layout)self.image_labelQLabel(self)self.layout.addWidget(self.image_label)self.control_layoutQHBoxLayout()self.layout.addLayout(self.control_layout)self.open_image_buttonQPushButton(Open Image,self)self.open_image_button.clicked.connect(self.open_image)self.control_layout.addWidget(self.open_image_button)self.open_video_buttonQPushButton(Open Video,self)self.open_video_button.clicked.connect(self.open_video)self.control_layout.addWidget(self.open_video_button)self.open_camera_buttonQPushButton(Open Camera,self)self.open_camera_button.clicked.connect(self.open_camera)self.control_layout.addWidget(self.open_camera_button)self.model_comboQComboBox(self)self.model_combo.addItem(yolov8-baseline.pt)self.control_layout.addWidget(self.model_combo)self.iou_sliderQSlider(Qt.Orientation.Horizontal,self)self.iou_slider.setMinimum(1)self.iou_slider.setMaximum(100)self.iou_slider.setValue(45)self.control_layout.addWidget(self.iou_slider)self.conf_sliderQSlider(Qt.Orientation.Horizontal,self)self.conf_slider.setMinimum(1)self.conf_slider.setMaximum(100)self.conf_slider.setValue(25)self.control_layout.addWidget(self.conf_slider)self.timerQTimer(self)self.timer.timeout.connect(self.update_frame)self.capNonedefopen_image(self):file_dialogQFileDialog()file_path,_file_dialog.getOpenFileName(self,Open Image,,Images (*.png *.xpm *.jpg *.bmp *.gif))iffile_path:imgcv2.imread(file_path)resultsmodel(img)annotated_imgdraw_keypoints(img.copy(),results)self.display_image(annotated_img)defopen_video(self):file_dialogQFileDialog()file_path,_file_dialog.getOpenFileName(self,Open Video,,Videos (*.mp4 *.avi))iffile_path:self.capcv2.VideoCapture(file_path)self.timer.start(30)defopen_camera(self):self.capcv2.VideoCapture(0)self.timer.start(30)defupdate_frame(self):ret,frameself.cap.read()ifret:resultsmodel(frame)annotated_framedraw_keypoints(frame.copy(),results)self.display_image(annotated_frame)else:self.timer.stop()self.cap.release()defdisplay_image(self,img):qimgQImage(img.data,img.shape[1],img.shape[0],QImage.Format.Format_BGR888)pixmapQPixmap.fromImage(qimg)self.image_label.setPixmap(pixmap)if__name____main__:appQApplication(sys.argv)windowMainWindow()window.show()sys.exit(app.exec())基于YOLOv8的人体姿势关键点检测系统并使用PyQt6编写GUI界面支持图片、视频和摄像头实时检测。同学仅供参考。