HLS学习入门(FFT(快速傅里叶变换))
本节介绍了FFT(快速傅里叶变换)的HLS实现,使用tcl脚本创建HLS工程的过程,以及如何在vivado中使用生成的IP。
一、FFT原理
FFT 是离散傅立叶变换的快速算法,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,
但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用 FFT 变换的原因。另外,FFT 可以将一
个信号的频谱提取出来,这在频谱分析方面也是经常用的。
FFT 结果的物理意义网上有一大神圈圈对此做了详细的描述,我们在这里摘录如下方便大家理解 FFT。
一个模拟信号,经过 ADC 采样之后,就变成了数字信号。根据采样定理,采样频率要大于信号频率的两倍。采
样得到的数字信号,就可以做 FFT 变换了。N 个采样点,经过 FFT 之后,就可以得到 N 个点的 FFT 结果。为了方便
进行 FFT 运算,通常 N 取 2 的整数次方。
假设采样频率为 Fs,信号频率 F,采样点数为 N。那么 FFT 之后结果就是一个为 N 点的复数。每一个点就对应
着一个频率点。这个点的模值,就是该频率值下的幅度特性。具体跟原始信号的 ...
HLS学习入门(索贝尔算子1)
本节介绍了一种使用 HLS 实现 Sobel 检测的方法
一、Sobel 原理介绍
索贝尔算子(Sobel operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函
数的灰度之近似值。在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量。
Sobel 卷积因子为:
该算子包含两组 3x3 的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差
分近似值。如果以 A 代表原始图像,Gx 及 Gy 分别代表经横向及纵向边缘检测的图像灰度值,其公式如下:
具体计算如下:
Gx = (-1)*f(x-1, y-1) + 0*f(x,y-1) + 1*f(x+1,y-1)
+(-2)*f(x-1,y) + 0*f(x,y)+2*f(x+1,y)
+(-1)*f(x-1,y+1) + 0*f(x,y+1) + 1*f(x+1,y+1)
= [f(x+1,y-1)+2*f(x+1,y)+f(x+1,y+1)]-[f(x-1,y-1)+2*f(x-1,y)+f(x-1,y+ ...
HLS学习入门(霍夫圆检测)
学习使用 HLS 设计一个基于 Hough 变换的圆检测算法
一、Hough变换原理
霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,该过程在一个参数空间中通过计算累计结果
的局部最大值得到一个符合该特定形状的集合作为霍夫变换结果。霍夫变换于 1962 年由 Paul Hough 首次提出,后
于 1972 年由 Richard Duda 和 Peter Hart 推广使用,经典霍夫变换用来检测图像中的直线,后来霍夫变换扩展到
任意形状物体的识别,多为圆和椭圆。霍夫变换运用两个坐标空间之间的变换将在一个空间中具有相同形状的曲线
或直线映射到另一个坐标空间的一个点上形成峰值,从而把检测任意形状的问题转化为统计峰值问题。
1.Hough 变换直线检测
简单的说,就是:图像空间中的直线与参数空间中的点是一一对应的,参数空间中的直线与图像空间中的点也是一一对应的
说实话我不是很懂百度或者原文中的原理解释,我的理解就是图像空间中的直线由两个参数(k,b)决定,这两个参数在参数空间反映为1点。反之同理
简单的说,比如如图的黑色直线,假定它的参数是[k, ...
HLS学习入门(肤色检测)
本节通过设计一个肤色检测的算法对前面几章的内容进行了巩固和验证,通过一组仿真验证了整个算法的有
效性。
一、肤色检测原理
肤色作为人的体表显著特征之一,尽管人的肤色因为人种的不同有差异,呈现出不同的颜色,但是在排除了亮度
和视觉环境等对肤色的影响后,皮肤的色调基本一致,这就为利用颜色信息来做肤色分割提供了理论的依据。
在肤色识别中,常用的颜色空间为 YCbCr 颜色空间。在 YCbCr 颜色空间中,Y 代表亮度,Cb 和 Cr 分别代表蓝色分
量和红色分量,两者合称为色彩分量。YCbCr 颜色空间具有将色度与亮度分离的特点,在 YCbCr 色彩空间中,肤色的聚
类特性比较好,而且是两维独立分布,能够比较好地限制肤色的分布区域,并且受人种的影响不大。对比 RGB 颜色空
间和 YCbCr 颜色空间,当光强发生变化时,RGB 颜色空间中(R,G,B)会同时发生变化,而 YCbCr 颜色空间中受光强相对
独立,色彩分量受光强度影响不大,因此 YCbCr 颜色空间更适合用于肤色识别。
由于肤色在 YCbCr 空间受亮度信息的影响较小,本算法直接考虑 YCbCr 空间的 CbC ...
HLS学习入门(图像加载)
学习如何加载图片,视频;一些常用的API。
一、前言
创建工程的步骤见上一节,这里注意一下,执行C仿真之前,不需要添加源文件,只需要添加test文件。另外注意不要opencv_top.cpp文件,否则仿真失败。
二、图片数据的获取
1. 通过 cvLoadImage 函数加载图片
cvSaveImage函数
格式:
通过 cvLoadImage 函数加载图片格式如下
IplImage* src = cvLoadImage(INPUT_IMAGE);
cvShowImage(“src”,src);
函数cvSaveImage保存图像到指定文件。 图像格式的的选择依赖于filename的扩展名,请参考 cvLoadImage。只有8位单通道或者3通道(通道顺序为’BGR’ )可以使用这个函数保存。如果格式,深度或者通道不符合要求,请先用cvCvtScale 和 cvCvtColor转换;或者使用通用的cvSave保存图像为XML或者YAML格式。
方法1 cvLoadImage函数加载图片
IplImage* src = cvLoadImage(INPUT_IMAG ...
HLS学习入门(流水灯)
通过流水灯示例来说明HLS工程创建、综合、优化、仿真的流程,以及使用hls工具生成的IP核。
一、工作流程
1.创建工程
(1)选择路径,添加source、test文件(暂不添加)
(2)选择芯片,这里选择xc78020c1g484-1xc78020c1g484-1(随便选的)
2.添加source以及test文件
3.添加顶层函数
4.综合
5.查看分析报告
6.优化
点击directive选择加入优化,可以看到几个优化选项,在官方文档:ug902-vivado-high-level-synthesis中可以查看相应的说明:
destination选择source file则会对当前目录所有solution都作同样优化;选directive file只对当前solution作优化:
可以看到程序中已经生成了一条优化的指令:ap_ovld意义同样可以在官方文档中找到,这里不放贴图了。
#pragma HLS INTERFACE ap_ovld port=led_o
7.再次综合
可以在综合结果中查看资源的使用情况来看优化的效果:
8. ...
yolov5+csl旋转目标检测代码解析——总结篇
本篇主要记录学习yolov5+csl旋转目标检测的原理,对前几篇文章作一个总结,添加一些细节。参考知乎 略略略 https://zhuanlan.zhihu.com/p/358441134; yangxue https://zhuanlan.zhihu.com/p/111493759
一、训练部分
1.数据加载
加载数据的主要过程都在create_dataloader这个方法里。
下面是该方法的返回值:
return loader(dataset,
batch_size=batch_size,
shuffle=shuffle and sampler is None,
num_workers=nw,
sampler=sampler,
pin_memory=True,
collate_fn=LoadImagesAndLabels.collate_fn4 if quad else LoadImagesAndLabels.collate ...
yolov5+csl旋转目标检测代码解析3
本篇主要记录学习yolov5+csl旋转目标检测的原理,主要是探究代码中pred的生成过程。参考知乎 略略略 https://zhuanlan.zhihu.com/p/358441134; yangxue https://zhuanlan.zhihu.com/p/111493759
一、debug记录
首先train.py这里改变图片尺寸(/255)作归一化,给tensor处理,同时改为浮点类型,shape不变
这里把图片(图片shape[b, 3, height, width], RGB)喂给网络,
然后在forward里迭代网络的各个层(卷积、C3等)
经过第一层卷积:
Conv(
(conv): Conv2d(3, 48, kernel_size=(6, 6), stride=(2, 2), padding=(2, 2), bias=False)
(bn): BatchNorm2d(48, eps=0.001, momentum=0.03, affine=True, track_running_stats=True)
(act): SiLU ...
yolov5+csl旋转目标检测代码解析2
本篇主要记录学习yolov5+csl旋转目标检测的原理,主要是探究代码中如何得到theta/gauss_theta的target。参考知乎 略略略 https://zhuanlan.zhihu.com/p/358441134; yangxue https://zhuanlan.zhihu.com/p/111493759
一、debug记录
经过dataloader之后的数据格式如图,cls已经转化为id。此时仍是原本的表示方法。
在plot_labels里面会有完整的标签格式转换以及高斯窗的csl方法,但是这个函数并没有返回
即最后一个参数为True时,使用csl,并且采用高斯窗函数,csl部分代码是直接从yangxue大佬那里拿来用的。
def poly2rbox(polys, num_cls_thata=180, radius=6.0, use_pi=False, use_gaussian=False):
"""
Trans poly format to rbox format.
Args:
...
yolov5+csl旋转目标检测代码解析1
本篇主要记录学习yolov5+csl旋转目标检测的原理,主要是代码中损失函数部分的细节。参考知乎 略略略 https://zhuanlan.zhihu.com/p/358441134; yangxue https://zhuanlan.zhihu.com/p/111493759
一、Define criteria
源码位置:utils/loss.py
# Define criteria
BCEcls = nn.BCEWithLogitsLoss(pos_weight=torch.tensor([h['cls_pw']], device=device))
BCEtheta = nn.BCEWithLogitsLoss(pos_weight=torch.tensor([h['theta_pw']], device=device))
BCEobj = nn.BCEWithLogitsLoss(pos_weight=torch.tensor([h['obj_pw']], device=device))
# BCEtheta是相对于yolov5自加的,csl基于角度分类的部分。
...