当前位置: 首页 > article >正文

正点原子RK3588(二)——lenet测试和modelzoo模型

文章目录

  • 一、lenet
  • 二、modelzoo模型
    • 2.1 介绍
    • 2.2 测试

一、lenet

import cv2
import numpy as np
from rknnlite.api import RKNNLite
RKNN_MODEL = 'LeNet5_mnist_model.rknn'

def show_top5(result):
    output = result[0].reshape(-1)
    output_sorted = sorted(output, reverse=True)
    top5_str = 'LeNet\n-----TOP 5-----\n'
    for i in range(5):
        value = output_sorted[i]
        index = np.where(output == value)
        for j in range(len(index)):
            if (i + j) >= 5:
                break
            if value > 0:
                topi = '{}: {}\n'.format(index[j], value)
            else:
                topi = '-1: 0.0\n'
            top5_str += topi
    print(top5_str)

if __name__ == '__main__':
    rknn_model = RKNN_MODEL
    rknn_lite = RKNNLite()
    # load RKNN model
    print('--> Load RKNN model')
    ret = rknn_lite.load_rknn(rknn_model)
    if ret != 0:
        print('Load RKNN model failed')
        exit(ret)
    print('done')
    ori_img = cv2.imread('./5.png')
    img = cv2.cvtColor(ori_img, cv2.COLOR_RGB2GRAY)
    img = np.expand_dims(img,0)
    img = np.expand_dims(img,0)
    # init runtime environment
    print('--> Init runtime environment')
    ret = rknn_lite.init_runtime()
    if ret != 0:
        print('Init runtime environment failed')
        exit(ret)
    # Inference
    print('--> Running model')
    outputs = rknn_lite.inference(inputs=[img])
    show_top5(outputs)
    print('done')
    rknn_lite.release()

在这里插入图片描述
在这里插入图片描述

二、modelzoo模型

2.1 介绍

modelzoo提供了大量模型转换与部署的示例代码,旨在帮助用户快速在搭载瑞芯微芯片的开发板上运行各种模型。

2.2 测试

刚刚运行了
python3 mobilenet.py --target rk3588发现缺少numpy,运行conda install numpy,安装即可
嗯,少个cv2,pip install opencv-python、有少个rknn

感觉不对劲,我又把rknn-toolkit2给装了,装玩之后,运行python3 mobilenet.py --target rk3588,运行成功。想了想我在windows底下安装的pytorch,算了,好像不需要这个toolkit。

import torch
import cv2
import numpy as np
import matplotlib.pyplot as plt
import os
import pandas as pd

# 加载YOLOv5模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)

# 定义观测区域的长度(单位:米),假设为100米
observation_length = 100


def process_video_yolov5(video_path):
    cap = cv2.VideoCapture(video_path)
    if not cap.isOpened():
        print(f"无法打开视频文件 {video_path}")
        return

    fps = int(cap.get(cv2.CAP_PROP_FPS))  # 获取视频帧率
    frame_count = 0
    vehicle_count_per_5_seconds = []
    current_5s_vehicle_count = 0
    total_vehicle_count = 0

    speed_per_5_seconds = []
    density_per_5_seconds = []

    while True:
        ret, frame = cap.read()
        if not ret:
            break

        # 使用YOLOv5进行检测
        results = model(frame)

        # 解析检测结果,results.pandas().xyxy 返回检测结果的 DataFrame
        detections = results.xyxy[0].cpu().numpy()  # [x1, y1, x2, y2, conf, cls]
        current_frame_speeds = []

        for *box, conf, cls in detections:
            # 检测类别ID,2: 汽车, 3: 摩托车, 5: 公共汽车, 7: 卡车
            if int(cls) in [2, 3, 5, 7]:
                x1, y1, x2, y2 = map(int, box)
                current_5s_vehicle_count += 1  # 累计每帧中检测到的车辆
                total_vehicle_count += 1

                # 假设简单的速度估计(可以根据车辆框的大小或位移进一步优化)
                width = x2 - x1
                speed = (width / observation_length) * fps  # 简单估计速度
                current_frame_speeds.append(speed)

                # 在图像上绘制检测框
                cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)

        frame_count += 1

        # 每5秒钟(fps * 5 帧),记录一次车辆流量和速度
        if frame_count % (fps * 5) == 0:
            vehicle_count_per_5_seconds.append(current_5s_vehicle_count)
            print(f"第{len(vehicle_count_per_5_seconds) * 5}秒,车辆流量: {current_5s_vehicle_count}")

            # 车流密度计算(每5秒的车辆数 / 观测区域长度)
            density = current_5s_vehicle_count / observation_length
            density_per_5_seconds.append(density)

            # 车速计算(当前帧车辆速度的平均值)
            avg_speed = np.mean(current_frame_speeds) if current_frame_speeds else 0
            speed_per_5_seconds.append(avg_speed)

            current_5s_vehicle_count = 0  # 重置当前5秒的车辆计数

        # 显示结果
        cv2.imshow('Vehicle Detection with YOLOv5', frame)

        # 按 'q' 键退出
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()
    print(f"视频 {video_path} 处理完成,车辆总数: {total_vehicle_count}")

    return vehicle_count_per_5_seconds, density_per_5_seconds, speed_per_5_seconds


# 绘制并保存车流密度、流量、速度的折线图到桌面,并生成Excel文件
def save_to_excel_and_plot(vehicle_counts, density_counts, speed_counts):
    time_points = list(range(5, len(vehicle_counts) * 5 + 1, 5))  # X轴为5秒的时间点

    # 创建DataFrame
    df = pd.DataFrame({
        'Time (seconds)': time_points,
        'Vehicle Count (Flow)': vehicle_counts,
        'Vehicle Density': density_counts,
        'Average Speed (m/s)': speed_counts
    })

    # 获取桌面路径
    desktop_path = os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop')  # Windows
    save_dir = desktop_path

    if not os.path.exists(save_dir):
        os.makedirs(save_dir)

    # 保存Excel文件
    excel_path = os.path.join(save_dir, 'vehicle_data.xlsx')
    df.to_excel(excel_path, index=False)
    print(f"数据已保存到 {excel_path}")

    # 绘制折线图
    plt.figure(figsize=(10, 6))

    # 绘制车辆流量
    plt.plot(time_points, vehicle_counts, marker='o', linestyle='-', color='b', label='Vehicle Flow')

    # 绘制车流密度
    plt.plot(time_points, density_counts, marker='x', linestyle='--', color='r', label='Vehicle Density')

    # 绘制平均速度
    plt.plot(time_points, speed_counts, marker='s', linestyle='-', color='g', label='Average Speed')

    plt.title('Vehicle Data over Time')
    plt.xlabel('Time (seconds)')
    plt.ylabel('Value')
    plt.grid(True)
    plt.legend()

    # 保存图表到桌面
    save_path = os.path.join(save_dir, 'vehicle_data_plot.png')
    plt.savefig(save_path)
    print(f"图表已保存到 {save_path}")

    plt.show()


# 处理视频
video_paths = ['20240501_20240501125647_20240501140806_125649.mp4']
for video_path in video_paths:
    vehicle_counts, density_counts, speed_counts = process_video_yolov5(video_path)
    save_to_excel_and_plot(vehicle_counts, density_counts, speed_counts)

在这里插入图片描述
测试完毕


http://www.kler.cn/news/314876.html

相关文章:

  • linux系统蓝牙框架
  • 查看VSFTPD配置的服务器路径和linux系统有哪些用户
  • 关于加强银行业保险业移动互联网应用程序管理的通知
  • 分布式光伏充换电站相关建议
  • 【MySQL】—— mysqlcheck表维护程序
  • 数据结构和算法|排序算法系列(五)|排序总结(时间复杂度和是否稳定)
  • 前端-js例子:定时器
  • HarmonyOS开发实战( Beta5.0)使用GTest测试C++案例
  • QT开发: Qt 框架中字符串核心类QString详解
  • ARM/Linux嵌入式面经(三五):诺瓦星云提前批
  • dpdk课程学习之练习笔记八(dpvs的了解)
  • unity3d入门教程九
  • 【Java】全面理解Java8特性
  • SpinalHDL之结构(三)
  • JavaScript高级—— js 是单线程运行的
  • 无人机+自组网:中继通信增强技术详解
  • 论文解读《MmAP : Multi-Modal Alignment Prompt for Cross-Domain Multi-Task Learning》
  • C#开发基础之单例模式下的集合数据,解决并发访问读写冲突的问题
  • PostgreSQL常用表操作SQL脚本整理
  • java重点学习-JVM类加载器+垃圾回收
  • 从一到无穷大 #35 Velox Parquet Reader 能力边界
  • 计算机基础知识笔记
  • 基于协同过滤+python+django+vue的音乐推荐系统
  • 鸿蒙Harmony-Next 徒手撸一个日历控件
  • Qt中样式表常用的属性名称定义
  • 利用Python与Ansible实现高效网络配置管理
  • 【Harmony】轮播图特效,持续更新中。。。。
  • Ubuntu24.04 安装ssh开启22端口及允许root用户远程登录
  • 【Flink实战】flink消费http数据并将数组展开多行
  • linux-虚拟化与容器化-虚拟化