SkyNet嵌入式系统目标检测实践测试分析

news2024/11/13 11:01:35

目标检测和跟踪对于资源受限的嵌入式系统来说是具有挑战性的任务。尽管这些任务是人工智能领域中计算量最大的任务之一,但它们在嵌入式设备上只能使用有限的计算和内存资源。与此同时,这种资源受限的实现通常需要满足额外的苛刻要求,如实时响应、高吞吐量性能和可靠的推理精度。SkyNet是一种硬件高效的神经网络,为嵌入式系统提供最先进的检测精度和速度。SkyNet没有遵循常见的自上而下的紧凑深度神经网络(DNN)设计流程,而是提供了一种自下而上的DNN设计方法,从一开始就全面理解硬件约束,以提供硬件高效的DNN。SkyNet的有效性通过在第56届IEEE/ACM设计自动化会议(DAC-SDC)的低功耗目标检测系统设计竞赛中获胜得到了证明,SkyNet显著优于其他100多名竞争对手:它在TX2嵌入式GPU上实现了0.731的交并比(IoU)和67.33帧每秒(FPS);在Ultra96嵌入式FPGA上实现了0.716的IoU和25.05 FPS。SkyNet的评估还扩展到了GOT-10K,这是一个最近的大规模高多样性通用对象跟踪基准。对于使用ResNet-50作为骨干网络的最先进目标跟踪器SiamRPN++和SiamMask,使用SkyNet作为骨干DNN的实现在一台1080Ti GPU上运行时,速度分别提高了1.60倍和1.73倍,并且在参数大小上小了37.20倍,显著改善了内存和存储占用。

在前文中:

《SkyNet:一种用于嵌入式系统目标检测和跟踪的硬件高效方法》

我们通过对作者研究内容的学习了解了SkyNet的相关内容,这里本文的主要目的是想要基于SkyNet目标检测模型来进行对应的应用实践测试分析,对其推理时间效率进行分析。

首先加载模型:

def load_net(fname, net):
    with h5py.File(fname, 'r') as h5f:
        for k, v in net.state_dict().items():
            try:
                param = torch.from_numpy(np.asarray(h5f[k]))
            except KeyError:
                pass
                # print("no value")
            else:
                v.copy_(param)

之后进行加载:

modeltype = "SkyNet()"
weightfile = "dac.weights"
model = eval(modeltype)
region_loss = model.loss
load_net(weightfile, model)

之后划分设定网格:

grid_x = (
    torch.linspace(0, w - 1, w)
    .repeat(h, 1)
    .repeat(batch_size * num_anchors, 1, 1)
    .view(batch_size * num_anchors * h * w)
)
grid_y = (
    torch.linspace(0, h - 1, h)
    .repeat(w, 1)
    .t()
    .repeat(batch_size * num_anchors, 1, 1)
    .view(batch_size * num_anchors * h * w)
)

计算锚框数据:

anchor_w = (
    torch.Tensor(anchors)
    .view(num_anchors, anchor_step)
    .index_select(1, torch.LongTensor([0]))
)
anchor_h = (
    torch.Tensor(anchors)
    .view(num_anchors, anchor_step)
    .index_select(1, torch.LongTensor([1]))
)

之后是构建数据处理流程:

trans = transforms.Compose(
    [
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.25, 0.25, 0.25]),
    ]
)

单张图像推理实现:

def single(pic="test.jpg"):
    global width, height, video
    img = cv2.imread(pic)
    width, height = img.shape[1], img.shape[0]
    resImg = inference(img)
    save_path = pic.split("/")[-1].split(".")[0] + "_result.jpg"
    cv2.imwrite(save_path, resImg)

批处理测试:

def batchTest(dataDir="samples/"):
    count = 0
    start = time.time()
    for one_pic in os.listdir(dataDir):
        one_path = dataDir + one_pic
        print("Loading Image: ", one_path)
        single(pic=one_path)
        count += 1
    end = time.time()
    delta = end - start
    avg = delta / count
    print("TimeConsume: ", delta)
    print("AvgTimeConsume: ", avg)

随机选取构建的图像用于模型测试:

在我本地的PC机上面进行推理测试,测试结果输出如下所示:

大概每张图像66ms的时间消耗,速度是蛮快的。

接下来简单看下实例推理效果:

感兴趣的话也可以自行动手实践下,这里我主要是结合前文论文的阅读实践做了一些基础性的尝试分析。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2237837.html

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

相关文章

「OC」SDWebimage的学习

「OC」SDWebimage的学习 前言 在知乎日报这个项目之中,我在很多情况下都会进行图片资源的网络申请。通过上网搜索我了解到了SDWebimage这个功能丰富的第三方库,进行了较为浅层的学习。因为SDWebimage这个库之中的相关内容还是较为多且复杂的&#xff0…

SIwave:释放 SIwizard 求解器的强大功能

SIwave 是一种电源完整性和信号完整性工具。SIwizard 是 SIwave 中 SI 分析的主要工具,也是本博客的主题。 SIwizard 用于研究 RF、clock 和 control traces 的信号完整性。该工具允许用户进行瞬态分析、眼图分析和 BER 计算。用户可以将 IBIS 和 IBIS-AMI 模型添加…

Kafka 可观测性最佳实践

Kafka 概述 Kafka 是由 LinkedIn 开发一个分布式的基于发布订阅模式的消息队列,是一个实时数据处理系统,可以横向扩展。与 RabbitMQ、RockerMQ 等中间件一样拥有几大特点: 异步处理服务解耦流量削峰 监控 Kafka 是非常重要的,因…

342--358作业整理(错误 + 重点)

目录 1. 在需要运行的类中 定义 main 方法 2. this 。访问逻辑:先访问本类中,再访问父类中可以访问的成员(不包括和本类中重名的成员) 3. super 。访问逻辑:super(父类对象)直接访问父类及以…

Android自启动管控

1. 自启动管控需求来源 自启动、关联启动、交叉启动、推送启动等现象的泛滥除了对个人信息保护带来隐患外,还会导致占用过多的系统CPU和内存资源,造成系统卡顿、发热、电池消耗过快;还可能引入一些包含“恶意代码”的进程在后台隐蔽启动&…

智能的编织:C++中auto的编织艺术

在C的世界里,auto这个关键字就像是一个聪明的助手,它能够自动帮你识别变量的类型,让你的代码更加简洁和清晰。下面,我们就来聊聊auto这个关键字的前世今生,以及它在C11标准中的新用法。 auto的前世 在C11之前&#x…

函数式编程Stream流(通俗易懂!!!)

重点:只关注传入的参数列表和方法体(数据操作) 1.Lambda表达式 本质是匿名内部类的优化,先写匿名内部类 1.1 基本用法 public class lambdaTest {public static void main(String[] args) { // int i calculateNum((…

C#里对数组的排序操作

一般情况下是采用 Array.Sort(a) 来进行排序。 例子代码如下: /** C# Program to Sort a String using Predefined Function*/ using System; class linSearch {public static void Main(){Console.WriteLine("Enter Number of Elements you Want to Hold in the Arra…

算法每日双题精讲——双指针(移动零,复写零)

🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟 别再犹豫了!快来订阅我们的算法每日双题精讲专栏,一起踏上算法学习的精彩之旅吧!💪…

【Android】View—基础知识,滑动,弹性滑动

基础知识 什么是View 在 Android 中,View 是用户界面(UI)中的基本组件,用于绘制图形和处理用户交互。所有的 UI 组件(如按钮、文本框、图片等)都是 View 的子类。可以说,View 是构建 Android …

【Unity】Game Framework框架学习使用

前言 之前用过一段时间的Game Framework框架,后来有那么一段时间都做定制小软件,框架就没再怎么使用了。 现在要做大型项目了,感觉还是用框架好一些。于是又把Game Framework拾起来了。 这篇文章主要是讲Game Framework这个框架是怎么用的…

【SoC设计指南 基于Arm Cortex-M】学习笔记1——AMBA

AMBA简介 先进微控制器总线架构(Advanced Microcontroller Bus Architecture,AMBA)是用在arm处理器上的片上总线协议规范集。 AMBA总线协议规范集包含AHB、APB、AXI等。 AHB:先进高性能总线(Advanced High-performance Bus) APB&…

pytorch模型转onnx的动态batch转换说明

将PyTorch模型(.pth)转换为ONNX格式时,通常需要指定一个batch size。这是因为ONNX模型需要一个固定的输入形状,而批处理大小是输入形状的一部分。 下面是一个简单的转换示例,假设你已经加载了一个PyTorch模型&#xff…

【王木头】最大似然估计、最大后验估计

目录 一、最大似然估计(MLE) 二、最大后验估计(MAP) 三、MLE 和 MAP 的本质区别 四、当先验是均匀分布时,MLE 和 MAP 等价 五、总结 本文理论参考王木头的视频: 贝叶斯解释“L1和L2正则化”&#xff…

从0到1基于LangChain制作一个AI猫娘

前言: 看到B站上的AIVtuber的项目落地了,就心血来潮想制作一个AI的猫娘供自己使用,顺便出一个简单的教程,跳过理论,直接实践,作者也还在学习摸索中,所以有错误可以直接在评论区指正。&#xff0…

Vue全栈开发旅游网项目(7)-搜索界面开发及其接口联调

1.搜索界面开发 1.1 模糊查询 文件地址:pycharm- class SightListView(ListView):paginate_by 5def get_queryset(self):#is_validTrue:表中is_valid列,有值则被查询出来query Q(is_validTrue)#1.获得热门景点is_hot self.request.GET.…

python识别ocr 图片和pdf文件

#识别图片 pip3 install paddleocr pip3 install paddlepaddle#识别pdf pip3 install PyMuPDF 重点:路径不能有中文,不然pdf文件访问不了 from paddleocr import PaddleOCR from rest_framework.response import Response from rest_framework.views im…

量化分析工具日常操作日记-5-通合科技

使用量化分析微信小程序工具“梦想兔企业智能风险分析助手”日常操作日记-5-军工-通合科技(300491)。 周末国家新政策,要大力支持军工行业,我用工具挖掘了两个低位股,供大家参考。通合科技(300491&#xff…

详解基于C#开发Windows API的SendMessage方法的鼠标键盘消息发送

在C#中,SendMessage方法是一个强大的工具,它允许我们与Windows API交互,模拟键盘和鼠标事件。本文将详细介绍如何使用SendMessage方法来发送鼠标和键盘消息。 1. SendMessage方法概述 SendMessage是Windows API中的一个函数,它用…