YOLOv8-pose+streamlit 实现人体关键点检测/姿态估计系统(后续可用于健身时的姿态估计,训练纠正等....)
人体关键点检测系统
- 一、安装与配置
- 1.1 安装 Streamlit
- 1.2 配置文件
- 1.3 运行Streamlit应用
- 1.4 找模板
- 二、人体关键点检测算法
- 2.1 关键点序号
- 2.2 YOLOv8-pose图像推理
- 三、将YOLOv8-pose算法内置到streamlit中
- 3.1 整体结构
- 3.2 常见问题
- - RGB通道颠倒
- - Numpy与OpenCV之间的转换
- 四、效果展示
- 五、源码获取
一、安装与配置
1.1 安装 Streamlit
在命令行直接输入下方指令即可:
pip install streamlit
1.2 配置文件
在本地的C:\Users\Administrator.streamlit这个位置新建==.streamlit==文件,复制下面的代码段即可
[server]
port = 8501
enableCORS = false
[browser]
serverAddress = "localhost"
gatherUsageStats = false
[runner]
magicEnabled = false
1.3 运行Streamlit应用
运行streamlit演示项目:
streamlit hello
看到如下图web文件代表安装成功。
1.4 找模板
可以上https://streamlit.io/官网,查找一下适合自己的模板,下载到本地后,运行如下指令,进行部署查看
streamlit run streamli/bg_remove.py
我们使用的模板样式如下图所示:
二、人体关键点检测算法
2.1 关键点序号
以YOLOv8-pose人体姿态估计为例,在COCO数据集上身体的每一个关节具有一个序号,共17个点:
COCO_keypoint_indexes = {
0: 'nose',
1: 'left_eye',
2: 'right_eye',
3: 'left_ear',
4: 'right_ear',
5: 'left_shoulder',
6: 'right_shoulder',
7: 'left_elbow',
8: 'right_elbow',
9: 'left_wrist',
10: 'right_wrist',
11: 'left_hip',
12: 'right_hip',
13: 'left_knee',
14: 'right_knee',
15: 'left_ankle',
16: 'right_ankle'
}
如下图所示:
2.2 YOLOv8-pose图像推理
为了方便,将训练好的模型直接用YOLOv8的内置方法进行推理:model.predict
使用result.plot直接将推理出的目标及关键点画到原图像上去,得到keypoint_image文件。(这里对该方法进行了封装,以便后续调用使用)
def predctImg(source):
# Load a model
model = YOLO(r'weights/yolov8x-pose-p6.pt', task='pose')
# Perform prediction
results = model.predict(source=source, save=False, show=False)
for result in results:
keypoint_image = result.plot() # This method will create an image with keypoints drawn
return keypoint_image
三、将YOLOv8-pose算法内置到streamlit中
3.1 整体结构
核心其实是围绕以下这个引用展开的,涉及了st中几个简单的API,具体内容还是在官网中都有。
import streamlit as st
import cv2
import streamlit as st
from PIL import Image
from io import BytesIO
st.set_page_config(layout="wide", page_title="Image Background Remover")
st.write("## :dog: Human Critical Point Detection :grin:")
st.sidebar.write("## Upload and download :gear:")
from ultralytics import YOLO
def predctImg(source):
# Load a model
model = YOLO(r'weights/yolov8x-pose-p6.pt', task='pose')
# Perform prediction
results = model.predict(source=source, save=False, show=False)
for result in results:
keypoint_image = result.plot() # This method will create an image with keypoints drawn
return keypoint_image
import numpy as np
def convert_image(img):
buf = BytesIO()
# 将Numpy矩阵转换成OpenCV图像
img = Image.fromarray(np.uint8(img))
img.save(buf, format="PNG")
byte_im = buf.getvalue()
return byte_im
def fix_image(upload):
image = Image.open(upload)
col1.write("Original Image :camera:")
col1.image(image)
fixed = predctImg(image)
fixed = cv2.cvtColor(fixed,cv2.COLOR_BGR2RGB)
col2.write("Fixed Image :wrench:")
col2.image(fixed)
st.sidebar.markdown("\n")
st.sidebar.download_button("Download fixed image", convert_image(fixed), "fixed.png", "image/png")
col1, col2 = st.columns(2)
my_upload = st.sidebar.file_uploader("Upload an image", type=["png", "jpg", "jpeg"])
if my_upload is not None:
fix_image(upload=my_upload)
else:
fix_image("D:\pythonCode\\two_wheel_vehicle_det\\ultralytics-main\\ultralytics-main\images\img.png")
3.2 常见问题
- RGB通道颠倒
看到图像颜色变得很奇怪时(RGB三通道颠倒),可以尝试改变一下三色通道
fixed = cv2.cvtColor(fixed,cv2.COLOR_BGR2RGB)
- Numpy与OpenCV之间的转换
Numpy转OpenCV图像
# 将Numpy矩阵转换成OpenCV图像
img = Image.fromarray(np.uint8(img))
Numpy的优点:
- 高效:Numpy内部使用C语言编写,执行速度快。
- 功能丰富:提供了大量的数学函数和数组操作。
- 易于集成:可以与Python的其他科学计算库无缝集成。
四、效果展示
左侧选择上传图片,上传后自动传输给后端YOLO文件进行目标检测和关键点检测推理,处理好图像之后将结果返回并在右侧进行展示,还可进行保存操作。
推理图像前后端版本:
视频推理:
五、源码获取
q 1831255794