前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >两种常见的人体姿态评估显示方式

两种常见的人体姿态评估显示方式

作者头像
OpenCV学堂
发布2024-06-11 16:08:06
1720
发布2024-06-11 16:08:06
举报
文章被收录于专栏:贾志刚-OpenCV学堂
两种效果

人体姿态评估中有两种常见的显示方式,分别是火柴人效果与BodyPix效果。其中火柴人效果本质就是基于关键点的深度学习模型推理以后的显示效果;Bodypix本质就就是语义分割模型,基于Deeplabv3+ 与ResNet34构建的一个人体语义分割模型。

火柴人

主要是基于关键点的人体姿态评估显示方式,基于YOLOv8等人体姿态评估的关键点模型均可以实现,演示代码运行效果如下:

BodyPix

主要是基于语义分割的人体姿态评估显示方式,支持对人体分割为10或者15个标签,演示代码运行效果如下:

实现代码

我把相关的代码使用PyQT5封装为一个线程,相关的代码如下:

代码语言:javascript
复制
class InferenceThread(QtCore.QThread):
    fire_stats_signal = QtCore.pyqtSignal(dict)

    def __init__(self, settings):
        super(InferenceThread, self).__init__()
        self.settings = settings
        self.detector = None
        if self.settings.model_type == 0:
            self.detector = YOLOv8ORTPose(settings)
            self.detector.show_skeleton = True
        if self.settings.model_type == 1:
            self.detector = YOLOv8ORTPose(settings)
            self.detector.show_skeleton = True
        if self.settings.model_type == 2:
            weight_file_path = "D:/projects/body_part_best.onnx"
            self.detector = BodyPixSegment(weight_file_path)
        self.input_image = settings.input_image

    def run(self):
        if self.detector is None:
            return
        if self.input_image.endswith(".mp4"):
            cap = cv.VideoCapture(self.input_image)
            while True:
                ret, frame = cap.read()
                if ret is True:
                    dst = self.detector.infer_image(frame)
                    self.fire_stats_signal.emit({"result": frame, "mask":dst})
                else:
                    break
        else:
            frame = cv.imread(self.input_image)
            dst = self.detector.infer_image(frame)
            self.fire_stats_signal.emit({"result": frame, "mask":dst})
        self.fire_stats_signal.emit({"done": "done"})
        return

点击【开始推理】按钮的执行代码如下:

代码语言:javascript
复制
def on_yolov8_infer(self):
    image_file = self.image_file_edit.text()
    label_file = self.label_file_path.text()
    model_file = self.weight_file_path.text()
    if len(image_file) == 0 or len(label_file) == 0 or len(model_file) == 0:
        QtWidgets.QMessageBox.warning(self, "警告", "参数文件未选择...")
        return
    settings = DLInferSettings()
    settings.weight_file_path = self.weight_file_path.text()
    settings.label_map_file_path = self.label_file_path.text()
    settings.score_threshold = self.conf_spinbox.value()
    settings.input_image = image_file
    settings.model_type = 0
    if self.rbtn0.isChecked():
        settings.model_type = 0
    if self.rbtn1.isChecked():
        settings.model_type = 1
    if self.rbtn2.isChecked():
        settings.model_type = 2
    settings.target_deploy = 1
    self.work_thread = InferenceThread(settings)
    self.work_thread.fire_stats_signal.connect(self.on_update_result_image)
    self.work_thread.finished.connect(self.work_thread.deleteLater)
    self.work_thread.start()
    self.startBtn.setStyleSheet("background-color:gray; color: white")
    self.startBtn.setEnabled(False)
    self.stopBtn.setStyleSheet("background-color:cyan; color: black")
    self.stopBtn.setEnabled(True)

运行结果如下:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档