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

news2024/11/14 18:53:07

文章目录

  • 一、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.coloradmin.cn/o/2155445.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序教程:如何在个人中心实现头像贴纸功能

在微信小程序中,个性化设置是提升用户体验的重要手段。本文将详细介绍如何在个人中心模块中实现头像贴纸功能,让用户可以自由地装饰自己的头像。 头像贴纸功能允许用户在个人头像上添加装饰性贴纸,增加个性化表达。以下是实现该功能的主要步骤…

设计模式-行为型模式-命令模式

1.命令模式的定义 命令模式将请求封装为一个对象,这样可以使用不同的请求参数化其他对象(将不同请求依赖注入到其他对象),并且能够支持请求的排队执行、记录日志、撤销等功能; 1.1 命令模式优缺点 优点 降低系统的耦…

独立站如何批量查收录,如何进行独立站的批量收录查询的详细操作

对于独立站(即自主搭建的网站)进行批量收录查询,是网站优化与管理中的一项重要工作,它有助于了解网站在搜索引擎中的表现情况,从而制定更有效的SEO策略。介绍如何进行独立站的批量收录查询: 一、准备阶…

C++:数组与字符串

一、数组 数组是一种存储若干元素的数据类型,在诸多编程语言中存在,其显著的特点是元素通常是在物理层面上连续存储的(逻辑上的数组,比如链表,可能不是),并且具有极快的元素访问速度。 数组通常…

Nuxt Kit API :路径解析工具

title: Nuxt Kit API :路径解析工具 date: 2024/9/22 updated: 2024/9/22 author: cmdragon excerpt: 摘要:本文介绍了Nuxt Kit中用于解析路径的API工具,包括resolvePath、resolveAlias、findPath和createResolver。这些工具助力开发者处理模块路径、别名、文件扩展名,提…

跨站请求伪造(CSRF)漏洞详解

免责申明 本文仅是用于学习检测自己搭建的DVWA靶场环境有关CSRF的原理和攻击实验,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其所在国家地区相关法…

你了解system V的ipc底层如何设计的吗?消息队列互相通信的原理是什么呢?是否经常将信号量和信号混淆呢?——问题详解

前言:本节主要讲解消息队列, 信号量的相关知识。 ——博主主要是以能够理解为目的进行讲解, 所以对于接口的使用或者底层原理很少涉及。 主要的讲解思路就是先讨论消息队列的原理, 提一下接口。 然后讲解ipc的设计——这个设计一些…

【Godot4.3】点数据简易表示法和Points2D

概述 在构造多点路径时我们会用到PackedVector2Array,并使用Vector2()来构造点。在手动创建多点数据时,这种写法其实很难看,有大量重复的Vector2(),比如下面这样: var points [Vector2(100,100),Vector2(200,200),V…

240922-MacOS终端访问硬盘

A. 最终效果 B. 操作步骤 在macOS中,可以通过命令行使用Terminal访问硬盘的不同位置。你可以按照以下步骤操作: 打开终端(Terminal): 在应用程序中打开终端,或者使用 Spotlight 搜索“Terminal”来启动。 …

WebLogic 靶场攻略

后台弱⼝令GetShell 步骤一:环境部署 cd vulhub-master/weblogic/weak_password docker-compose up -d docker ps 步骤二:漏洞复现 默认账号密码:weblogic/Oracle123 步骤二:进行登录 http://192.168.10.190:7001/console/…

thinkphp8 从入门到放弃(后面会完善用到哪里写到哪)

thinkphp8 从入门到放弃 引言 thinkphp* 大道至简一、 thinkphp8 安装安装Composerthinkphp 安装命令(tp-项目名称)多应用安装(一个项目不会只有一个应用)安装完文件目录如下本地部署配置伪静态好了项目可以run 二、架构服务(Service&#xf…

【C++ Primer Plus习题】17.2

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> #include <fstream> using namesp…

【树莓派】通过HTTP服务器实时传输视频流

前言一、树莓派端的代码二、网页端网址展示总结 前言 树莓派3B的通过HTTP服务器实时传输MJPEG视频流 一、树莓派端的代码 注意在先安装完库 pip install Flask picameraFlask 是一个用 Python 编写的轻量级 web 框架。它主要用于构建 web 应用和 web 服务。Flask 提供了许多…

【无标题】HG6201M路由的超级管理密码获取

这里写自定义目录标题 1、开启telnet http://192.168.1.1/cgi-bin/telnetenable.cgi?telnetenable1&keyXXXXX 注意&#xff1a;此处的XXXXX为路由背面标签的MAC地址&#xff0c;去掉“-”&#xff0c;且大写。 成功后会显示&#xff1a;telnet开启 2、登录telnet 此处采…

C++异常(基本知识)、C++模板类(基本知识)

什么是异常和异常处理&#xff1f; 异常就是程序运行过程中出现的问题。“异常”问题并不经常出现&#xff08;按道理来说我们写好的正常的程序是不应该频繁出现异常的&#xff09;&#xff1b;异常处理技术使得我们可以写程序解决出现的异常问题。很多情况下&#xff0c;处理异…

有女朋友后,怎么养成贤内助?为自己找个好伴侣,为孩子找个好妈妈,为母亲找个好儿媳

有女朋友后&#xff0c;怎么养成贤内助&#xff1f;为自己找个好伴侣&#xff0c;为孩子找个好妈妈&#xff0c;为母亲找个好儿媳 时代背景女生有点作怎么办&#xff1f;大商家族的爱情观 时代背景 一块钱的东西&#xff0c;赋予俩块钱的意义&#xff0c;三块钱卖出去。 用商…

【垃圾识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目选题+TensorFlow+图像识别

一、介绍 垃圾识别分类系统。本系统采用Python作为主要编程语言&#xff0c;通过收集了5种常见的垃圾数据集&#xff08;‘塑料’, ‘玻璃’, ‘纸张’, ‘纸板’, ‘金属’&#xff09;&#xff0c;然后基于TensorFlow搭建卷积神经网络算法模型&#xff0c;通过对图像数据集进…

vscode -ssh免密登陆

1.生成ssh使用的公钥/密钥对 请从客户端上的 PowerShell 或 cmd 提示符运行以下命令&#xff0c;具体使用方法详细见&#xff1a;微软官方 ssh-keygen -t rsa 一路回车&#xff0c;秘钥会生成到C:\Users\name\.ssh 2.将私钥配置到vscode的ssh中&#xff1a; 3.将本地公钥配置…

【计算机网络篇】数据链路层 功能|组帧|流量控制与可靠传输机制

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【计算机网络】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 系列文章目录 【计算机网络篇】计算机网络概述 【计算机网络篇…

最新免费域名申请

在互联网时代&#xff0c;每个码农都想拥有一个免费的域名&#xff0c;方便开发调试&#xff0c;也可用作自己网站等。如何申请一个免费的域名&#xff0c;时间上先错过了freenom&#xff0c;后面又错过nic.eu.org申请(现在申请时间长且很难通过)&#xff0c;直到最近又有免费的…