代码编织梦想

1. 前言

        之前看到openpose的时候,想pt转onnx再转rknn,但是精度总是有问题,看到原来的openpose是caffe训练的,找了找caffe的模型,尝试转了rknn,没想到成功了,现在记录一下转化时候的坑!!!有坑的!!!

2. 模型和配置文件准备

        可以去下载资源caffe-openpose模型,使用里面的模型,具体的代码细节参考博文中的代码!!!

3. 转换模型

(1) 修改pose_deploy_linevec.prototxt文件

        特别重要!需要修改!!输入的w和h可以根据自己的需求设置,当然w和h大一点更加准确,可以自己尝试,大概在368就还不错,想要推理快一点设置288!!!

layer {
  name:"image"
  type:"Input"
  top:"image"
  input_param {
    shape {
      dim: 1
      dim: 3
      dim: 368
      dim: 368
    }
  }
}

(2) rknn_toolkit_1模型转换

from rknn.api import RKNN


if __name__ == '__main__':

    # Create RKNN object
    rknn = RKNN()

    # pre-process config
    print('--> config model')
    # 调整为BGR
    rknn.config(channel_mean_value='0 0 0 255', reorder_channel='2 1 0')
    print('done')

    # Load tensorflow model
    print('--> Loading model')

    # 如有不同路径,请自行修改
    ret = rknn.load_caffe(model='./pose_deploy_linevec.prototxt', proto='caffe',
                            blobs='./pose_iter_440000.caffemodel')
    if ret != 0:
        print('Load model failed!')
        exit(ret)
    print('done')

    # Build model
    print('--> Building model')
    ret = rknn.build(do_quantization=True, dataset='./dataset.txt')
    # 开启预编译,可以更快的初始化和推理
    # ret = rknn.build(do_quantization=True, dataset='./dataset.txt', pre_compile=True)

    if ret != 0:
        print('Build model failed!')
        exit(ret)
    print('done')
    # Export rknn model
    print('--> Export RKNN model')
    ret = rknn.export_rknn('./pose_muti_pre.rknn')
    if ret != 0:
        print('Export model failed!')
        exit(ret)
    print('done')

    rknn.release()

(3)rknn_toolkit_2模型转换

from rknn.api import RKNN



if __name__ == '__main__':

    # Create RKNN object
    rknn = RKNN()

    # pre-process config
    print('--> config model')
    # 调整为BGR
    rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], quant_img_RGB2BGR=True, target_platform='rk3588')
    print('done')

    # Load tensorflow model
    print('--> Loading model')

    # 如有不同路径,请自行修改
    ret = rknn.load_caffe(model='./pose_deploy_linevec.prototxt', blobs='./pose_iter_440000.caffemodel')
    if ret != 0:
        print('Load model failed!')
        exit(ret)
    print('done')

    # Build model
    print('--> Building model')

    ret = rknn.build(do_quantization=True, dataset='./dataset.txt')
    if ret != 0:
        print('Build model failed!')
        exit(ret)
    print('done')

    # Export rknn model
    print('--> Export RKNN model')
    ret = rknn.export_rknn('./pose_3588_288.rknn')
    if ret != 0:
        print('Export model failed!')
        exit(ret)
    print('done')
    # Ret = rknn.accuracy_analysis(inputs=['./single.jpeg'])
    # if ret != 0:
    #     print('Accuracy analysis failed!')
    # exit(ret)

    rknn.release()

4.模型推理

(1) rknn_toolkit_1模型推理

注意两点需要根据模型的输入尺寸进行修改!!!

1)输入尺寸
inWidth = 368
inHeight = 3682)

2)输出shape

output = output.reshape(1, 57, 46, 46)

from rknn.api import RKNN
import cv2
import time
import numpy as np

if __name__ == '__main__':
    nPoints = 18

    # 18个关键点信息以及对应的点对,就是互相连接的关键点
    POSE_PAIRS = [ [1,0],[1,2],[1,5],[2,3],[3,4],[5,6],[6,7],[1,8],[8,9],[9,10],[1,11],[11,12],[12,13],[0,14],[0,15],[14,16],[15,17]]
    # Create RKNN object
    rknn = RKNN()

    # 装载模型
    rknn.load_rknn('./pose_deploy_linevec.rknn')

    # init runtime environment
    print('--> Init runtime environment')

    # 初始化,指定开发板的型号、设备的id
    ret = rknn.init_runtime(target='rk1808',)
    if ret != 0:
        print('Init runtime environment failed')
        exit(ret)
    print('done')

    # 输入尺寸是368x368
    inWidth = 368
    inHeight = 368

    # 使用本地视频测试,也可以使用摄像头测试,填上对应的id
    # cap = cv2.VideoCapture('1.mp4')
    # hasFrame, frame = cap.read()
    frame = cv2.imread('./group.jpg')
    frame = cv2.resize(frame, (inWidth, inHeight), interpolation=cv2.INTER_CUBIC)

    frameCopy = np.copy(frame)
    frameWidth = frame.shape[1]
    frameHeight = frame.shape[0]
    threshold = 0.1
    np.set_printoptions(threshold=np.inf)

    # Inference
    #print('--> Running model')
    frameinput = np.transpose(frame, [2, 0, 1])
    t = time.time()
    [output] = rknn.inference(inputs=[frameinput], data_format="nchw")
    # [output] = rknn.inference(inputs=[frameinput])
    elapsed = time.time() - t
    print('inference image: %.4f seconds.' % (elapsed))
    np.set_printoptions(threshold=np.inf)

    #print('done')
    output = output.reshape(1, 57, 46, 46)
    H = output.shape[2]
    W = output.shape[3]

    # Empty list to store the detected keypoints
    points = []

    for i in range(nPoints):
        # confidence map of corresponding body's part.
        probMap = output[0, i, :, :]

        # Find global maxima of the probMap.
        minVal, prob, minLoc, point = cv2.minMaxLoc(probMap)

        # Scale the point to fit on the original image
        x = (frameWidth * point[0]) / W
        y = (frameHeight * point[1]) / H

        if prob > threshold :
            cv2.circle(frame, (int(x), int(y)), 8, (0, 255, 255), thickness=-1, lineType=cv2.FILLED)
            cv2.putText(frame, "{}".format(i), (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2, lineType=cv2.LINE_AA)

            # Add the point to the list if the probability is greater than the threshold
            points.append((int(x), int(y)))
        else :
            points.append(None)

    # Draw Skeleton
    for pair in POSE_PAIRS:
        partA = pair[0]
        partB = pair[1]

        if points[partA] and points[partB]:
            # 关键点用实心圆表示,点对用直线连接
            cv2.line(frameCopy, points[partA], points[partB], (0, 255, 255), 2)
            cv2.circle(frameCopy, points[partA], 8, (0, 0, 255), thickness=-1, lineType=cv2.FILLED)

    Keypoint = 'Output-Keypoints'
    cv2.namedWindow(Keypoint, cv2.WINDOW_NORMAL)
    # cv2.imshow(Keypoint, frameCopy)
    cv2.imwrite('Output-Keypoints.jpg', frameCopy)
    # cv2.imwrite('Output-Skeleton.jpg', frame)
    # print("Total time taken : {:.3f}".format(time.time() - t))

    rknn.release()

(2) rknn_toolkit_2模型推理使用的是lite版本

        同样修改输入和输出的形状!!!

from rknnlite.api import RKNNLite
import cv2
import time
import numpy as np

if __name__ == '__main__':
    nPoints = 18

    # 18个关键点信息以及对应的点对,就是互相连接的关键点
    POSE_PAIRS = [ [1,0],[1,2],[1,5],[2,3],[3,4],[5,6],[6,7],[1,8],[8,9],[9,10],[1,11],[11,12],[12,13],[0,14],[0,15],[14,16],[15,17]]
    # Create RKNN object
    rknn_lite = RKNNLite()

    # 装载模型
    rknn_lite.load_rknn('./pose_deploy_linevec.rknn')

    # init runtime environment
    print('--> Init runtime environment')

    # 初始化,指定开发板的型号、设备的id
    ret = rknn_lite.init_runtime(target='rk1808',)
    if ret != 0:
        print('Init runtime environment failed')
        exit(ret)
    print('done')

    # 输入尺寸是368x368
    inWidth = 368
    inHeight = 368

    # 使用本地视频测试,也可以使用摄像头测试,填上对应的id
    # cap = cv2.VideoCapture('1.mp4')
    # hasFrame, frame = cap.read()
    frame = cv2.imread('./group.jpg')
    frame = cv2.resize(frame, (inWidth, inHeight), interpolation=cv2.INTER_CUBIC)

    frameCopy = np.copy(frame)
    frameWidth = frame.shape[1]
    frameHeight = frame.shape[0]
    threshold = 0.1
    np.set_printoptions(threshold=np.inf)

    # Inference
    #print('--> Running model')
    frameinput = np.transpose(frame, [2, 0, 1])
    t = time.time()
    # [output] = rknn_lite.inference(inputs=[frameinput], data_format="nchw")
    [output] = rknn_lite.inference(inputs=[frameinput])
    elapsed = time.time() - t
    print('inference image: %.4f seconds.' % (elapsed))
    np.set_printoptions(threshold=np.inf)

    #print('done')
    output = output.reshape(1, 57, 46, 46)
    H = output.shape[2]
    W = output.shape[3]

    # Empty list to store the detected keypoints
    points = []

    for i in range(nPoints):
        # confidence map of corresponding body's part.
        probMap = output[0, i, :, :]

        # Find global maxima of the probMap.
        minVal, prob, minLoc, point = cv2.minMaxLoc(probMap)

        # Scale the point to fit on the original image
        x = (frameWidth * point[0]) / W
        y = (frameHeight * point[1]) / H

        if prob > threshold :
            cv2.circle(frame, (int(x), int(y)), 8, (0, 255, 255), thickness=-1, lineType=cv2.FILLED)
            cv2.putText(frame, "{}".format(i), (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2, lineType=cv2.LINE_AA)

            # Add the point to the list if the probability is greater than the threshold
            points.append((int(x), int(y)))
        else :
            points.append(None)

    # Draw Skeleton
    for pair in POSE_PAIRS:
        partA = pair[0]
        partB = pair[1]

        if points[partA] and points[partB]:
            # 关键点用实心圆表示,点对用直线连接
            cv2.line(frameCopy, points[partA], points[partB], (0, 255, 255), 2)
            cv2.circle(frameCopy, points[partA], 8, (0, 0, 255), thickness=-1, lineType=cv2.FILLED)

    Keypoint = 'Output-Keypoints'
    cv2.namedWindow(Keypoint, cv2.WINDOW_NORMAL)
    # cv2.imshow(Keypoint, frameCopy)
    cv2.imwrite('Output-Keypoints.jpg', frameCopy)
    # cv2.imwrite('Output-Skeleton.jpg', frame)
    # print("Total time taken : {:.3f}".format(time.time() - t))

    rknn_lite.release()

5.检测结果展示

        这个是单人的姿态检测!!!多人不适用呢

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43999691/article/details/129833139

MDK案例Classify ---> 验证mask_rcnn仪表检测模型-爱代码爱编程

OpenVINO工具 参考链接: https://github.com/openvinotoolkit/open_model_zoo/tree/master/demos/mask_rcnn_demo#demo-output openvinotoolkit/open_model_zoo/demos/mask_rcnn_demo/ 编译API exam

ROS 从入门到放弃 - 入门-爱代码爱编程

ROS 从入门到放弃 - 入门 1. Installing and Configuring Your ROS Environment2. Navigating the ROS FilesystemPackages & Manifests:文件管理操作:3. Creating a ROS Package3.1 Package的组成:3.2 一

yolov5实战-利用yolov5实现口罩佩戴检测算法并转换瑞芯微模型_blueeyedboy521的博客-爱代码爱编程

目录 一、参考文献二、下载数据集三、转换数据集1、新建文件夹2、将txt的标注转换为xml3、划分训练集和验证集四、训练1、准备mask.yml2、修改models/yolov5l.yaml3、新建train_mask.py4、训练5、生成的模型五、推理验证1、新建detect_mask.py2、推理图片3、推理视频下载行人视频推理六、转换瑞芯微1

jetson嵌入式系列模型部署-1_爱听歌的周童鞋的博客-爱代码爱编程

目录 前言1. What、Why and How1.1 What1.2 Why1.3 How 2. tensorRT2.1 什么是tensorRT?2.2 tensorRT特性2.3 tensorRT工作流程

rknn量化hrnet流程【人体骨架点检测】-爱代码爱编程

最近在做骨架点识别,需要对pth模型进行一个量化。 1.首先是转onnx # Copyright (c) OpenMMLab. All rights reserved. import argparse import war

又快又稳,研究、落地全都要!姿态估计全能选手 rtmpose 来啦!-爱代码爱编程

背景介绍 在正式开讲之前,先给大家小段热舞: 姿态估计,计算机视觉的核心任务之一,还原纷繁外表之下的空间信息,洞察千姿百态背后的本征结构。 MMPose 作为 OpenMMLab 开源算法体系中的姿态估计算法库,自

深度学习理论基础-爱代码爱编程

A Neural Network Playground Batch_size Batch_size即一次训练所选取的样本数量,来源于小批量梯度下降(Mini-batch gradient descent),梯度下降法是常用的参数更新方法,而小批量梯度下降是对于传统梯度下降法的优化。 合适的batch size范围主要和收敛速度、随机梯度噪音有关。BA

《代码学习》如何上手看懂一篇论文的代码-爱代码爱编程

《代码学习》如何上手看懂一篇论文的代码 前言 论文原文 寻找代码 代码总览 概述 准备 训练

yolov7 瑞芯微rknn和地平线horizon芯片仿真测试部署_yolov7 rknn-爱代码爱编程

特别说明:参考官方开源的yolov7代码、瑞芯微官方文档、地平线的官方文档,如有侵权告知删,谢谢。 模型和完整仿真测试代码,放在github上参考链接 模型和代码。 1 模型和训练   训练代码参考官方开源的yolov

狗都能看懂的vae笔记_为什么vae的encoder 均值很小-爱代码爱编程

文章目录 自编码器普通Auto-Encoder的问题解决的方法如何运作数学细节 生成模型Auto-Encoder一直是一个非常有创造性的方向。期中的VAE变分编码器一直是我没搞懂的部分,在AI绘画

yolov5目标检测算法解析:基础网络模块_sppf模块全称-爱代码爱编程

    Yolov5的模型定义分两个阶段,分别是基础模块设计阶段和完整模型搭建阶段。基础模块设计阶段,是基于pytorch架构的基本神经网络算子,进一步构造成具有特定功能和含义的自定义神经网络模块。完整模型搭建阶段,是通过结构化文件,利用基础模块,以搭积木的形式,构建成一个完整的神经网络模型。其基础模块的设计如下所述: 1、标准卷积模块(Conv)  

基于elman神经网络预测计费系统的输出(matlab代码实现)_计费预测算法平台-爱代码爱编程

    目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述   简单循环网络(simple recurrent networks,简称SRN)又称为Elman network,是由Jeff Elman在1990年提出来的。Elman在Jordan network(1986)的基础上进行了创新,并且简