侵权投诉

如何使用Transformer来做物体检测?

中科院长春光机所 2021-04-25 10:45 次阅读

导读

本文为一个Facebook的目标检测Transformer (DETR)的完整指南,详细介绍了DETR架构的内部工作方式以及代码。

介绍

DEtection TRansformer (DETR)是Facebook研究团队巧妙地利用了Transformer 架构开发的一个目标检测模型。在这篇文章中,我将通过分析DETR架构的内部工作方式来帮助提供一些关于它的含义。下面,我将解释一些结构,但是如果你只是想了解如何使用模型,可以直接跳到代码部分。

结构

DETR模型由一个预训练的CNN骨干(如ResNet)组成,它产生一组低维特征集。这些特征被格式化为一个特征集合并添加位置编码,输入一个由Transformer组成的编码器和解码器中,和原始的Transformer论文中描述的Encoder-Decoder的使用方式非常的类似。解码器的输出然后被送入固定数量的预测头,这些预测头由预定义数量的前馈网络组成。每个预测头的输出都包含一个类预测和一个预测框。损失是通过计算二分匹配损失来计算的。

de1e84951e16f003cad41eb9d065b884.png

该模型做出了预定义数量的预测,并且每个预测都是并行计算的。

CNN主干

假设我们的输入图像,有三个输入通道。CNN backbone由一个(预训练过的)CNN(通常是ResNet)组成,我们用它来生成_C_个具有宽度W和高度H的低维特征(在实践中,我们设置_C_=2048, W=W₀/32和H=H₀/32)。这留给我们的是C个二维特征,由于我们将把这些特征传递给一个transformer,每个特征必须允许编码器将每个特征处理为一个序列的方式重新格式化。这是通过将特征矩阵扁平化为H⋅W向量,然后将每个向量连接起来来实现的。

287bf2488bbde18c1bec3c4f78fd9329.png

扁平化的卷积特征再加上空间位置编码,位置编码既可以学习,也可以预定义。

The Transformer

Transformer几乎与原始的编码器-解码器架构完全相同。不同之处在于,每个解码器层并行解码N个(预定义的数目)目标。该模型还学习了一组N个目标的查询,这些查询是(类似于编码器)学习出来的位置编码。

cfa6d245dd8b156b006edab65640f0a8.png

目标查询

下图描述了N=20个学习出来的目标查询(称为prediction slots)如何聚焦于一张图像的不同区域。

964d2f602f92857bcc5274b7d0774bf1.png

“我们观察到,在不同的操作模式下,每个slot 都会学习特定的区域和框大小。“ —— DETR的作者

理解目标查询的直观方法是想象每个目标查询都是一个人。每个人都可以通过注意力来查看图像的某个区域。一个目标查询总是会问图像中心是什么,另一个总是会问左下角是什么,以此类推。

使用PyTorch实现简单的DETR

import torchimport torch.nn as nnfrom torchvision.models import resnet50class SimpleDETR(nn.Module):“”“Minimal Example of the Detection Transformer model with learned positional embedding”“” def __init__(self, num_classes, hidden_dim, num_heads, num_enc_layers, num_dec_layers): super(SimpleDETR, self).__init__() self.num_classes = num_classes self.hidden_dim = hidden_dim self.num_heads = num_heads self.num_enc_layers = num_enc_layers self.num_dec_layers = num_dec_layers # CNN Backbone self.backbone = nn.Sequential( *list(resnet50(pretrained=True).children())[:-2]) self.conv = nn.Conv2d(2048, hidden_dim, 1) # Transformer self.transformer = nn.Transformer(hidden_dim, num_heads, num_enc_layers, num_dec_layers) # Prediction Heads self.to_classes = nn.Linear(hidden_dim, num_classes+1) self.to_bbox = nn.Linear(hidden_dim, 4) # Positional Encodings self.object_query = nn.Parameter(torch.rand(100, hidden_dim)) self.row_embed = nn.Parameter(torch.rand(50, hidden_dim // 2) self.col_embed = nn.Parameter(torch.rand(50, hidden_dim // 2)) def forward(self, X): X = self.backbone(X) h = self.conv(X) H, W = h.shape[-2:] pos_enc = torch.cat([ self.col_embed[:W].unsqueeze(0).repeat(H,1,1), self.row_embed[:H].unsqueeze(1).repeat(1,W,1)], dim=-1).flatten(0,1).unsqueeze(1) h = self.transformer(pos_enc + h.flatten(2).permute(2,0,1), self.object_query.unsqueeze(1)) class_pred = self.to_classes(h) bbox_pred = self.to_bbox(h).sigmoid() return class_pred, bbox_pred

二分匹配损失 (Optional)

让为预测的集合,其中是包括了预测类别(可以是空类别)和包围框的二元组,其中上划线表示框的中心点, 和表示框的宽和高。设y为ground truth集合。假设y和_ŷ_之间的损失为L,每一个yᵢ和_ŷ_ᵢ之间的损失为Lᵢ。由于我们是在集合的层次上工作,损失L必须是排列不变的,这意味着无论我们如何排序预测,我们都将得到相同的损失。因此,我们想找到一个排列,它将预测的索引映射到ground truth目标的索引上。在数学上,我们求解:

86dc5236fcca1b7bd7080630260c36d6.png

计算的过程称为寻找最优的二元匹配。这可以用匈牙利算法找到。但为了找到最优匹配,我们需要实际定义一个损失函数,计算和之间的匹配成本。

回想一下,我们的预测包含一个边界框和一个类。现在让我们假设类预测实际上是一个类集合上的概率分布。那么第_i_个预测的总损失将是类预测产生的损失和边界框预测产生的损失之和。作者在http://arxiv.org/abs/1906.05909中将这种损失定义为边界框损失和类预测概率的差异:

992dad5a7a1dc3075cbcd33f150d10f7.png

其中,是的argmax,是是来自包围框的预测的损失,如果,则表示匹配损失为0。

框损失的计算为预测值与ground truth的L₁损失和的GIOU损失的线性组合。同样,如果你想象两个不相交的框,那么框的错误将不会提供任何有意义的上下文(我们可以从下面的框损失的定义中看到)。

183c84881c17d3e38dced802e8291566.png

其中,λᵢₒᵤ和是超参数。注意,这个和也是面积和距离产生的误差的组合。为什么会这样呢?

可以把上面的等式看作是与预测相关联的总损失,其中面积误差的重要性是λᵢₒᵤ,距离误差的重要性是。现在我们来定义GIOU损失函数。定义如下:

1d3224e47d3956fe8afbefa144918b38.png

由于我们从已知的已知类的数目来预测类,那么类预测就是一个分类问题,因此我们可以使用交叉熵损失来计算类预测误差。我们将损失函数定义为每N个预测损失的总和:

0b00557f7e5daf116fe7264009ad9421.png

为目标检测使用DETR

在这里,你可以学习如何加载预训练的DETR模型,以便使用PyTorch进行目标检测。

加载模型

首先导入需要的模块。

# Import required modulesimport torchfrom torchvision import transforms as T import requests # for loading images from webfrom PIL import Image # for viewing imagesimport matplotlib.pyplot as plt

下面的代码用ResNet50作为CNN骨干从torch hub加载预训练的模型。其他主干请参见DETR github:https://github.com/facebookresearch/detr

detr = torch.hub.load(‘facebookresearch/detr’, ‘detr_resnet50’, pretrained=True)

加载一张图像

要从web加载图像,我们使用requests库:

url = ‘https://www.tempetourism.com/wp-content/uploads/Postino-Downtown-Tempe-2.jpg’ # Sample imageimage = Image.open(requests.get(url, stream=True).raw) plt.imshow(image)plt.show()

设置目标检测的Pipeline

为了将图像输入到模型中,我们需要将PIL图像转换为张量,这是通过使用torchvision的transforms库来完成的。

transform = T.Compose([T.Resize(800), T.ToTensor(), T.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])

上面的变换调整了图像的大小,将PIL图像进行转换,并用均值-标准差对图像进行归一化。其中[0.485,0.456,0.406]为各颜色通道的均值,[0.229,0.224,0.225]为各颜色通道的标准差。我们装载的模型是预先在COCO Dataset上训练的,有91个类,还有一个表示空类(没有目标)的附加类。我们用下面的代码手动定义每个标签:

CLASSES = [‘N/A’, ‘Person’, ‘Bicycle’, ‘Car’, ‘Motorcycle’, ‘Airplane’, ‘Bus’, ‘Train’, ‘Truck’, ‘Boat’, ‘Traffic-Light’, ‘Fire-Hydrant’, ‘N/A’, ‘Stop-Sign’, ‘Parking Meter’, ‘Bench’, ‘Bird’, ‘Cat’, ‘Dog’, ‘Horse’, ‘Sheep’, ‘Cow’, ‘Elephant’, ‘Bear’, ‘Zebra’, ‘Giraffe’, ‘N/A’, ‘Backpack’, ‘Umbrella’, ‘N/A’, ‘N/A’, ‘Handbag’, ‘Tie’, ‘Suitcase’, ‘Frisbee’, ‘Skis’, ‘Snowboard’, ‘Sports-Ball’, ‘Kite’, ‘Baseball Bat’, ‘Baseball Glove’, ‘Skateboard’, ‘Surfboard’, ‘Tennis Racket’, ‘Bottle’, ‘N/A’, ‘Wine Glass’, ‘Cup’, ‘Fork’, ‘Knife’, ‘Spoon’, ‘Bowl’, ‘Banana’, ‘Apple’, ‘Sandwich’, ‘Orange’, ‘Broccoli’, ‘Carrot’, ‘Hot-Dog’, ‘Pizza’, ‘Donut’, ‘Cake’, ‘Chair’, ‘Couch’, ‘Potted Plant’, ‘Bed’, ‘N/A’, ‘Dining Table’, ‘N/A’,‘N/A’, ‘Toilet’, ‘N/A’, ‘TV’, ‘Laptop’, ‘Mouse’, ‘Remote’, ‘Keyboard’, ‘Cell-Phone’, ‘Microwave’, ‘Oven’, ‘Toaster’, ‘Sink’, ‘Refrigerator’, ‘N/A’, ‘Book’, ‘Clock’, ‘Vase’, ‘Scissors’, ‘Teddy-Bear’, ‘Hair-Dryer’, ‘Toothbrush’]

如果我们想输出不同颜色的边框,我们可以手动定义我们想要的RGB格式的颜色

COLORS = [ [0.000, 0.447, 0.741], [0.850, 0.325, 0.098], [0.929, 0.694, 0.125], [0.494, 0.184, 0.556], [0.466, 0.674, 0.188], [0.301, 0.745, 0.933] ]

格式化输出

我们还需要重新格式化模型的输出。给定一个转换后的图像,模型将输出一个字典,包含100个预测类的概率和100个预测边框。每个包围框的形式为(x, y, w, h),其中(x,y)为包围框的中心(包围框是单位正方形[0,1]×[0,1]), w, h为包围框的宽度和高度。因此,我们需要将边界框输出转换为初始和最终坐标,并重新缩放框以适应图像的实际大小。下面的函数返回边界框端点:

# Get coordinates (x0, y0, x1, y0) from model output (x, y, w, h)def get_box_coords(boxes): x, y, w, h = boxes.unbind(1) x0, y0 = (x - 0.5 * w), (y - 0.5 * h) x1, y1 = (x + 0.5 * w), (y + 0.5 * h) box = [x0, y0, x1, y1] return torch.stack(box, dim=1)

我们还需要缩放了框的大小。下面的函数为我们做了这些:

# Scale box from [0,1]x[0,1] to [0, width]x[0, height]def scale_boxes(output_box, width, height): box_coords = get_box_coords(output_box) scale_tensor = torch.Tensor( [width, height, width, height]).to( torch.cuda.current_device()) return box_coords * scale_tensor

现在我们需要一个函数来封装我们的目标检测pipeline。下面的detect函数为我们完成了这项工作。

# Object Detection Pipelinedef detect(im, model, transform): device = torch.cuda.current_device() width = im.size[0] height = im.size[1] # mean-std normalize the input image (batch-size: 1) img = transform(im).unsqueeze(0) img = img.to(device) # demo model only support by default images with aspect ratio between 0.5 and 2 assert img.shape[-2] 《= 1600 and img.shape[-1] 《= 1600, # propagate through the model outputs = model(img) # keep only predictions with 0.7+ confidence probas = outputs[‘pred_logits’].softmax(-1)[0, :, :-1] keep = probas.max(-1).values 》 0.85 # convert boxes from [0; 1] to image scales bboxes_scaled = scale_boxes(outputs[‘pred_boxes’][0, keep], width, height) return probas[keep], bboxes_scaled

现在,我们需要做的是运行以下程序来获得我们想要的输出:

probs, bboxes = detect(image, detr, transform)

绘制结果

现在我们有了检测到的目标,我们可以使用一个简单的函数来可视化它们。

# Plot Predicted Bounding Boxesdef plot_results(pil_img, prob, boxes,labels=True): plt.figure(figsize=(16,10)) plt.imshow(pil_img) ax = plt.gca() for prob, (x0, y0, x1, y1), color in zip(prob, boxes.tolist(), COLORS * 100): ax.add_patch(plt.Rectangle((x0, y0), x1 - x0, y1 - y0, fill=False, color=color, linewidth=2)) cl = prob.argmax() text = f‘{CLASSES[cl]}: {prob[cl]:0.2f}’ if labels: ax.text(x0, y0, text, fontsize=15, bbox=dict(facecolor=color, alpha=0.75)) plt.axis(‘off’) plt.show()

现在可以可视化结果:

plot_results(image, probs, bboxes, labels=True)

英文原文:https://medium.com/swlh/object-detection-with-transformers-437217a3d62e

编辑:jq

原文标题:实操教程|如何使用Transformer来做物体检测?DETR模型完整指南

文章出处:【微信号:cas-ciomp,微信公众号:中科院长春光机所】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

怎么才能知道单片机程序占了多少字节

对于单片机程序占了多少字节?单片机还剩多少存储空间?想必你看到这篇文章时对这两个问题也很迷糊吧,接下....
的头像 MCU开发加油站 发表于 06-12 18:18 48次 阅读
怎么才能知道单片机程序占了多少字节

Lombok开发插件使用小技巧

0x01:Lombok简介 Lombok 是一款 Java开发插件,使得 Java 开发者可以通过其....
的头像 电子发烧友网工程师 发表于 06-12 18:07 43次 阅读
Lombok开发插件使用小技巧

为什么要用C语言实现面向对象呢?

不知道有多少人去了解过语言的发展史,早期C语言的语法功能其实比较简单。随着应用需求和场景的变化,C语....
的头像 硬件攻城狮 发表于 06-12 17:55 26次 阅读
为什么要用C语言实现面向对象呢?

解析C语言结构体字节如何对齐

01 默认字节对齐 C语言结构体字节对齐是老生常谈的问题了,也是高频面试题,现在我们来深入研究这个问....
的头像 电子发烧友网工程师 发表于 06-12 17:42 20次 阅读
解析C语言结构体字节如何对齐

简述那些JDK中坑你没商量的方法

前言 JDK 作为我们每天必备的调用类库,里面大量提供了基础类供我们使用。可以说离开 JDK ,我们....
的头像 电子发烧友网工程师 发表于 06-12 17:36 17次 阅读
简述那些JDK中坑你没商量的方法

浅谈RTL设计风格及Verilog编码规范

一、同步设计 1.1 时钟的同步设计 关注问题: (1)设计中尽可能使用单时钟和单时钟边沿触发 (2....
的头像 FPGA之家 发表于 06-12 17:20 16次 阅读
浅谈RTL设计风格及Verilog编码规范

你们知道为什么航天器、导弹喜欢用单片机,而不是嵌入式系统吗

一、前言 前几天和一个在某研究所的发小聊天,他说:现在的航空、航天和导弹等武器装备中,控制系统几乎都....
的头像 硬件攻城狮 发表于 06-12 17:18 24次 阅读
你们知道为什么航天器、导弹喜欢用单片机,而不是嵌入式系统吗

怎么在Vitis中设定Kernel的频率?

在Vitis 统一软件平台中使用Alveo系列开发板设计加速Kernel时,系统会自动为Kernel....
的头像 FPGA之家 发表于 06-12 14:19 25次 阅读
怎么在Vitis中设定Kernel的频率?

基于使用双极点RC低通滤波器推导代数传递函数

对于某些非常简单的电路(在本例中为双极点RC低通滤波器),可以非常容易地推导出代数传递函数,并查看电....
发表于 06-12 09:07 8次 阅读
基于使用双极点RC低通滤波器推导代数传递函数

基于CNN和LSTM的蛋白质亚细胞定位研究对比

基于CNN和LSTM的蛋白质亚细胞定位研究对比
发表于 06-11 14:16 6次 阅读
基于CNN和LSTM的蛋白质亚细胞定位研究对比

一个函数究竟能不能超过50行呢?

有些读者可能看到过类似这样的描述,而自己做项目时,很多函数都比较多(超过50行),就会怀疑自己这样写....
的头像 strongerHuang 发表于 06-11 12:46 112次 阅读
一个函数究竟能不能超过50行呢?

基于卷积神经网络的相似度计算模型

在智能客服问答系统中,用户所提问句具有咨询意图复杂、上下文相关性弱以及口语化等特点,导致问句相似度计....
发表于 06-11 10:59 7次 阅读
基于卷积神经网络的相似度计算模型

ios15正式版发布时间 什么时候发布

6月8号凌晨,苹果举行了一年一度的WWDC21开发者大会,发布了全新的iOS15、iPadOS 15....
的头像 牵手一起梦 发表于 06-11 09:25 2407次 阅读
ios15正式版发布时间 什么时候发布

matlab升级2021a版本后有哪些函数需要替换?

之前有文章提到了randi函数替换randint函数,但还有很多函数也已经不用了。我之前曾经用过rc....
的头像 通信工程师专辑 发表于 06-10 16:44 112次 阅读
matlab升级2021a版本后有哪些函数需要替换?

使用跨界模型Transformer来做物体检测!

这是一个Facebook的目标检测Transformer (DETR)的完整指南。 介绍 DEtec....
的头像 新机器视觉 发表于 06-10 16:04 124次 阅读
使用跨界模型Transformer来做物体检测!

用生成模型来做图像恢复的介绍和回顾

导读 本文给出了图像恢复的一般性框架,编解码器 + GAN,后面的图像复原基本都是这个框架。 本文会....
的头像 新机器视觉 发表于 06-10 15:56 105次 阅读
用生成模型来做图像恢复的介绍和回顾

一步一步教你如何去发布Python项目开源包?

注意:本文假设你在 GitHub 上已经有一个想要打包和发布的项目。
的头像 马哥Linux运维 发表于 06-10 14:22 52次 阅读
一步一步教你如何去发布Python项目开源包?

世界上最先进分布式版本控制系统Git介绍

前言 Git是目前最流行的版本控制工具,Linux,Android都是使用git进行管理。Githu....
的头像 FPGA之家 发表于 06-09 17:40 144次 阅读
世界上最先进分布式版本控制系统Git介绍

探究音频冗余的主要表现形式

数字信号有自身相应的缺点,即存储容量需求的增加及传输时信道容量要求的增加。以CD为例,其采样率为44....
的头像 讯维官方公众号 发表于 06-09 15:57 95次 阅读
探究音频冗余的主要表现形式

在目前深度学习中比较普及的“物件检测”应用

接下来的重点,就是在目前深度学习中比较普及的“物件检测”应用,重点主要有以下三部分: 1. 简单说明....
的头像 NVIDIA英伟达企业解决方案 发表于 06-09 15:46 121次 阅读
在目前深度学习中比较普及的“物件检测”应用

二维材料系统可实现单光子发射器和自旋量子比特

二维材料系统可实现单光子发射器和自旋量子比特,为新型量子现象和技术应用开辟了一个崭新的舞台。例如,二....
的头像 知社学术圈 发表于 06-09 11:52 263次 阅读
二维材料系统可实现单光子发射器和自旋量子比特

浅析图解算法之冒泡排序

03 冒泡排序 为描述方便,用下面的数组模拟小朋友的交换过程。 核心思想(升序): 从首位置开始,依....
的头像 Linux爱好者 发表于 06-08 16:43 85次 阅读
浅析图解算法之冒泡排序

手把手教你如何自制轮式机器人

击上方“果果小师弟”,选择“置顶/星标公众号” 摘要:制作这个项目的起因是大一下学期那会儿我通过学校....
的头像 硬件攻城狮 发表于 06-07 15:36 294次 阅读
手把手教你如何自制轮式机器人

白盒模糊测试的隐藏路径搜索方案综述

针对白盒模糊测试中的环境交互问题,提岀一种基于外部函数探测和校正的隐藏路径搜索方案 HPSBEF。利....
发表于 06-07 14:56 10次 阅读
白盒模糊测试的隐藏路径搜索方案综述

教你们怎么生成BRAM初始值的coe文件

Vivado中BRAM IP核是经常会用到的,而一种比较简便的给RAM赋初值的方式就是通过一个coe....
的头像 FPGA之家 发表于 06-07 11:52 191次 阅读
教你们怎么生成BRAM初始值的coe文件

贴片压敏电阻常用封装可以用哪几种尺寸代码来表示?

贴片压敏电阻常用封装可以用哪几种尺寸代码来表示?...
发表于 06-07 07:16 0次 阅读
贴片压敏电阻常用封装可以用哪几种尺寸代码来表示?

为什么要用C语言实现面向对象呢

不知道有多少人去了解过语言的发展史,早期C语言的语法功能其实比较简单。随着应用需求和场景的变化,C语....
的头像 硬件攻城狮 发表于 06-04 17:44 344次 阅读
为什么要用C语言实现面向对象呢

深度解读epoll 的原理

epoll 可以说是编写高性能服务端程序必不可少的技术,在介绍 epoll 之前,我们先来了解一下 ....
的头像 Linux爱好者 发表于 06-04 16:56 180次 阅读
深度解读epoll 的原理

关于Python 的11种经典数据降维算法

网上关于各种降维算法的资料参差不齐,同时大部分不提供源代码。这里有个 GitHub 项目整理了使用 ....
的头像 数据分析与开发 发表于 06-04 15:03 93次 阅读
关于Python 的11种经典数据降维算法

do{...} while(0U) 这种代码的作用和意义

在一些项目中,我们可能看到过很多,在学习的时候没有见过的代码,比如 do{...} while(0U....
的头像 strongerHuang 发表于 06-04 14:00 142次 阅读
do{...} while(0U) 这种代码的作用和意义

华芯微特MCU的嵌套向量中断控制器与外部中断/事件控制器的使用方法

01. 嵌套向量中断控制器(NVIC) NVIC的全称是Nested vectoredinterru....
的头像 电子发烧友网工程师 发表于 06-04 12:08 228次 阅读
华芯微特MCU的嵌套向量中断控制器与外部中断/事件控制器的使用方法

全面解读目前LVGL的应用小知识

概述 本文介绍目前LVGL的应用小知识,希望对采用MCU设计UI界面的用户有所启发,开发出界面更友好....
的头像 电子发烧友网工程师 发表于 06-04 12:01 423次 阅读
全面解读目前LVGL的应用小知识

简述RT-Thread Studio烧写国产MCU(SWM32S)固件的方法

笔者最近在试用一款华芯微特的MCU,SWM32SRET6。其片上有FLASH 512KB, RAM ....
的头像 电子发烧友网工程师 发表于 06-04 11:24 271次 阅读
简述RT-Thread Studio烧写国产MCU(SWM32S)固件的方法

十六进制数的表示方法

十六进制数的基数是16,采用的数码是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。....
的头像 倩倩 发表于 06-04 11:02 284次 阅读
十六进制数的表示方法

基于可编程哈希函数的HIBE加密方案

在标准模型下,格上基于分级身份的加密(HBE)方案的陷门生成计算复杂度较高。针对该问题,提出种基于可....
发表于 06-03 15:57 14次 阅读
基于可编程哈希函数的HIBE加密方案

设计一个登录接口我们要考虑哪些地方?

大家学写程序时,第一行代码都是hello world。但是当你开始学习WEB后台技术时,很多人的第一....
的头像 算法与数据结构 发表于 06-03 09:36 135次 阅读
设计一个登录接口我们要考虑哪些地方?

通信原理与matlab仿真v3:如何确定回溯长度呢

一起来看接收机的程序。这里的重点内容是vitdec函数的使用!本文给出硬判决下的误码性能!后续会给出....
的头像 通信工程师专辑 发表于 06-03 09:21 156次 阅读
通信原理与matlab仿真v3:如何确定回溯长度呢

代码优化的目的是什么?具体方法包括哪几种?

代码优化的目的是什么?具体方法包括哪几种? 代码优化工作有什么创新点? ...
发表于 06-03 06:17 0次 阅读
代码优化的目的是什么?具体方法包括哪几种?

如何在CC2430上加入特定的PAN ID入网?

如何在CC2430上加入特定的PAN ID入网?
发表于 06-03 06:16 0次 阅读
如何在CC2430上加入特定的PAN ID入网?

那些迷之代码缩写你知道哪几个?

就像你可能不知道现充其实是现实生活很充实的人生赢家的缩写一样#xff0c;我们经常看到 Github....
的头像 Geant4模拟学习交流 发表于 06-02 18:15 163次 阅读
那些迷之代码缩写你知道哪几个?

基于轻量级CNN等的恶意软件家族分类模型

现有基于卷积神经网络(CNN)的恶意代码分类方法存在计算资源消耗较大的问题。为降低分类过程中的计算量....
发表于 06-02 15:40 19次 阅读
基于轻量级CNN等的恶意软件家族分类模型

任务函数及任务调用

发表于 06-02 14:14 202次 阅读
任务函数及任务调用

golang反射和接口是如何工作 使用反射有什么注意点?

【导读】golang反射和接口是如何工作?使用反射有什么注意点?本文对go反射做了详细介绍。 反射用....
的头像 Linux爱好者 发表于 06-02 11:44 187次 阅读
golang反射和接口是如何工作 使用反射有什么注意点?

计算机天才1个月写了个操作系统

1983 年,美国计算机协会将图灵奖授予肯·汤普森和与丹尼斯·里奇。 获奖理由是:“For thei....
的头像 Linux爱好者 发表于 06-02 11:29 200次 阅读
计算机天才1个月写了个操作系统

基于zigbee的温度烟雾传输单片机代码

基于zigbee的温度烟雾传输单片机代码。
发表于 06-02 10:05 12次 阅读
基于zigbee的温度烟雾传输单片机代码

探究海康威视摄像机中的重大漏洞

前言 虹科Vdoo的安全研究团队对领先的物联网产品和安全设备进行了大规模的安全研究,为了提高效率和透....
的头像 电子发烧友网工程师 发表于 06-01 15:40 339次 阅读
探究海康威视摄像机中的重大漏洞

恶意代码动态流量伪装框架StealthyFlow综述

恶意代码问题使国家安全面临严重威胁。随着TⅠS协议快速普及,恶意代码呈现岀流量加密化的趋势,通信内容....
发表于 06-01 14:30 13次 阅读
恶意代码动态流量伪装框架StealthyFlow综述

迅为RK3399开发板人工智能深度学习框架

迅为率先在RK3399 开发板上支持了Docker、TensorFlow目标检测API、OpenCV、Keras、scikit-learn、pytorch和Python等...
发表于 05-21 17:28 1212次 阅读
迅为RK3399开发板人工智能深度学习框架

ARM Cortex-A9中断处理及代码实现

一、中断概念操作系统中,中断是很重要的组成部分。出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情...
发表于 05-14 06:30 1212次 阅读
ARM Cortex-A9中断处理及代码实现

求Endat2.1接口的verilog代码

发表于 05-08 20:19 1318次 阅读
求Endat2.1接口的verilog代码

ASIC到FPGA的代码是怎样进行转换的?

原型验证过程中的ASIC到FPGA的代码是怎样进行转换的?...
发表于 05-08 09:16 0次 阅读
ASIC到FPGA的代码是怎样进行转换的?

OpenHarmony+ Neptune开发板旧键盘有线变无线v0.1创意项目源代码

OpenHarmony+ Neptune开发板旧键盘有线变无线v0.1创意项目源代码 ...
发表于 04-30 16:37 405次 阅读
OpenHarmony+ Neptune开发板旧键盘有线变无线v0.1创意项目源代码

Verilog的打印系统函数有哪几类? 在使用Verilog时有哪些注意事项?

Verilog的打印系统函数有哪几类? 在使用Verilog时有哪些注意事项? ...
发表于 04-30 06:30 0次 阅读
Verilog的打印系统函数有哪几类? 在使用Verilog时有哪些注意事项?