0%

现象

使用非官方代码,在DJL框架内载入YOLOv5模型时报错,错误内容为”detect layer output is not supported yet, check correct YoloV5 export format”,采用不同格式包括Torchscript和ONNX格式均不能解决。调用原版YOLOv5模型能够正常运行,查看DJL源码以及模型输出发现是检测模型输出的张量大小不正确而报错。

问题原因

按照YOLO模型的结构,最后一层输出应该是包含对预测框的变换以及非极大值抑制,而这个版本的非官方代码并没有把这部分转换整合进入导出的模型中。
根据在YOLOv3的原始论文中提到,模型会在原始输入的32倍下采样,16倍下采样以及8倍下采样三个尺度上进行预测输出,每个尺度包含三个预测方框,而其中每个方框的参数包括方框位置和大小(左上角坐标以及长宽),是否存在物体(objectness)以及物体类别输出。以官方原版的YOLOv5为例,640*640的图像输入,共检测80类物体,则三个尺度的输出分别为(640/32)*(640/32)*(3*(4+1+80)),(640/16)*(640/16)*(3*(4+1+80)),(640/8)*(640/8)*(3*(4+1+80)),即输出的张量大小为20*20*255,40*40*255,80*80*255。这几个张量的值不能作为图像中的最终输出方框的坐标和大小,原版YOLOv5的模型会将这三个尺度的输出经过处理得到真实的方框,最终输出的经过拼接张量大小(忽略batch dim)为
(3*(640/32)*(640/32))*(4+1+80)+(3*(640/16)*(640/16))*(4+1+80)+(3*(640/8)*(640/8))*(4+1+80)=1200*85+4800*85+19200*85=25200*85。而DJL框架报错则是由于直接将未经过变换的三个尺度拼接(255*20*20+255*40*40+255*80*80),得到错误的张量大小,在检测到缺少detect layer后报错。

解决方案

阅读全文 »

静态方法

  • 手动估算训练算力与训练耗时
    Estimating Training Compute of Deep Learning Models
    draft report on transformative AI timelines
    定义上算力FLOP(浮点操作数)一般指一次浮点加减或者乘除,另外一个单位是FMA(Fused Multiply-Add)或MACs(Multiply-Accmulate)则明确包含一次乘除和一次加减,可以简单认为1FMA或1MACs=2FLOP。
    在训练里面反向传播和正向传播的算力比例按照经验近似为2:1,即训练所需算力大约为相同正向传播次数下的3倍。另外文中提到可以通过计算时间估计算力,该方法同样可以反过来计算训练耗时。
    在已知模型单次传播(正向+反向)所耗算力的情况下,可通过硬件平台的浮点运算速度估算时间。NVDIA GPU在数据手册上的数值为理论峰值,实际上由于内存数据传输等待的问题GPU利用率不可能达到100%,文中给出的经验值多GPU训练的利用率按照30%(LLM)或者40%(其他模型),而在一般没有刻意优化的情况下可低至10%。

  • torch-summary/torchinfo, thop 指定模型结构和输入大小,估算模型推理时内存占用以及所需算力

动态方法

  • Profiler记录运算耗费资源
    PyTorch Profiler With TensorBoard
    Pytorch提供原生Profiler跟踪运算,输出结果到TensorBoard或者Chrome Trace文件
  • 内存快照
    Understanding CUDA Memory Usage
    调用torch.cuda.memory._record_memory_history()启动内存快照记录,调用torch.cuda.memory._dump_snapshot()保存快照,在pytorch.org/memory_viz中载入保存的快照文件可以查看每一个时刻的内存分配情况。
    Windows下运行可能会出现报错"record_context_cpp is not support on non-linux non-x86_64 platforms",将调用参数改为不记录C++的栈回溯即可torch.cuda.memory._record_memory_history(enabled='all', stacks='python')

导入PCB与准备

  • Altium Designer可以直接导出HyperLynx的文件,但是铺铜区域丢失。这里使用导出ODB++文件的方法,在文件->制造输出->ODB++ Files导出文件夹,在HyperLynx内可直接打开ODB++的文件夹作为项目。
  • Allergo板图可以直接用HyperLynx打开导入。

导入时如果有些网络没有连接可能弹出警告”One or more nets are completely unrouted.”,直接选择No即可。

下面以STM32MP157评估板作为例子进行仿真,所需要的文件如下

  • STM32MP15x IBIS file
  • MB1272 Manufacturing files提取ODB++文件,或者选择下载MB1272 Board design project files打开PCB再进行导出
    需要注意的时这里生成ODB++时Pin name有误,需要在components文件中清除前缀U*-,否则后续仿真导入模型时引脚名称对应不上
  • 内存颗粒MT41J256M16TW的IBIS文件暂未找到,直接用HyperLynx自带的类似型号颗粒MT41J256M16HA的IBIS模型替代
阅读全文 »

本文主要大部分是对 ZHANG Z. A flexible new technique for camera calibration[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2000, 22(11): 1330-1334.的解释

相机模型

相机模型主要用于描述相机的像素平面坐标系和世界三维坐标系之间的坐标映射关系。相机成像的模型可以用下图表示,以透镜的光心作为空间光线的三维坐标系,坐标系的Z轴垂直与成像平面即图像传感器的平面。

可以简单地认为相机成像平面坐标系下的二维点是由相机坐标系下的三维坐标点投影而来,即物体点的XY坐标与成像点的XY坐标之间分别存在相同的比例关系,满足如下等式,其中f为成像焦距

相机成像平面坐标到像素坐标系的转换可以由缩放+平移的线性变换表示,写成齐次形式为

世界三维坐标系下的点到相机三维坐标系可由旋转与平移变换得到

结合上述方程可以列出世界坐标系下的点到像素坐标系下的转换关系

一般可以将前两个矩阵写为一个3*4的矩阵,这里记为,其中前一个矩阵由于只与相机内部的光学结构相关,一般称矩阵内的四个参数为相机的内部参数,而后一个矩阵则是与相机相对于世界的外部条件相关,称其为外部参数。

阅读全文 »

基本概念

强化学习是指机器通过与外部环境交互,学习最佳策略的过程。其中决策的主体被称为智能体(Agent),它能够根据环境反馈的状态(State),以及人为设计的描述输出动作好坏程度的奖励(Reward)做出相应的动作(Action)。这个过程的“最佳”体现在最终的目标是调整策略,使得总体奖励最大化。

  • 状态(State):时刻的状态记为,所有可能的状态取值组成的空间称为状态空间(State Space)
  • 动作(Action):时刻的动作记为,所有可能的动作取值组成的空间称为动作空间(Action Space)。输出的动作可分为随机性动作和确定性动作。随机性动作由随机策略(Stochastic Policies)产生,输出的动作服从某个可参数化的关于状态的分布即。确定性的动作由确定性策略(Deterministic Policies)产生,输出的动作可以描述为一个参数化的关于状态的函数
  • 奖励(回报,Reward):时刻的奖励记为,可由一个关于状态(或者状态和动作)的函数获得。
  • 轨迹:由各个时刻的组成的序列,记为
  • 总体奖励:描述一条轨迹中的总奖励,一种描述为限无衰减的总回报(finite-horizon undiscounted return)

    另一种无限有衰减的总回报(infinite-horizon discounted return)如下,其中\gamma为0到1之间的衰减系数。
  • 价值函数(Value Function),即从状态开始,按照策略输出动作的条件下奖励的数学期望
  • 动作-价值函数(Action-Value Function),即从状态开始并输出动作,随后按照策略输出动作的条件下奖励的数学期望

这里的状态(State),动作(Action),奖励(Reward)等变量是对真实系统中的变量的抽象。例如在倒立摆的控制问题中,状态是摆杆的角度、角速度、位移以及速度等参量,而动作则是输出到摆杆底端的水平方向驱动力的大小,奖励可能被人为设计为关于摆杆角度和保持直立的时间长短,摆杆的角度越小并且保持直立的时间越长奖励的值越大。

阅读全文 »

常见模型

贝叶斯模型

贝叶斯模型是经典统计学模型之一,其最为核心的思想就是著名的贝叶斯定理,即对于事件A和B

被称为后验概率,可以理解为事件B作为事件A的原因的情况下其因果关系的强弱。即在事件A发生的条件下事件B发生的概率,可以认为来自样本数据。而则为源于经验设定的先验概率,或者说在没有实际测量。 贝叶斯定理表明通过过去经验与样本数据对概率的修正,能够动态地调整后验概率。贝叶斯模型最主要的应用包括朴素贝叶斯算法和贝叶斯网络。
朴素贝叶斯(Naive Bayesian)算法完全基于贝叶斯定理,这里以分类器的例子解释其原理,首先假定某种分类与其属性或者特征之间的分布完全独立,根据贝叶斯定理可以计算出在拥有某种特征的条件下属于某种分类的结果,即

算法中的概率在样本足够多的情况下可以通过直接计数统计获得,则来源于先验经验,或者对大量样本直接统计其特征和分类的频率也可以获得。
贝叶斯网络(Bayesian network)则是用概率模拟推理过程中的因果关系,以有向无环图描述多个变量或者命题之间的因果关系。贝叶斯网络可以描述更为复杂的因果关系,并且建模时网络的节点可以作为隐变量,这样网络本身的结构也能够被学习。

高斯混合模型(GMM)

高斯混合模型常用于聚类算法,该模型认为数据的分布由若干个可参数化的高斯分布线性叠加而获得的分布,即将原始分布分解为不同参数的符合高斯分布的随机变量。这些变量可以是人为设定的,也可以是通过数据学习得到的隐变量。以连续变量为例,设第j个随机变量符合维的高斯分布,即

其中分别为第j个变量对应维的均值向量和大小的协方差矩阵,假设待求解的变量s由个高斯分布组合而成,则其的分布满足

为混合系数,为了确保的积分为1,所有混合系数之和应该为1。高斯混合模型的混合成分的参数可以通过下述的EM算法在给定的训练集上学习

阅读全文 »

介绍

ONNX(Open Neural Network Exchange)是神经网络的一种交换文件格式,它既能够储存网络结构也能够储存网络的所有参数,它可以被认为是目前生产环境下部署神经网络的主流文件格式。ONNX文件描述了网络的所有计算算过程,这就意味着实际上它的作用类似传统意义上的二进制文件,是“可执行”的代码,其运行环境就是本文描述的部署方法。下面列举导出方法,原生C/C++ Java环境的部署和运行以及低级嵌入式平台部署。

导出与查看

在Pytorch下导出模型及权重到ONNX文件的代码示例如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import torch
import onnxsim
# model为已经加载参数的模型变量,在定义模型结构后可以采用以下代码加载
# model.load_state_dict(torch.load('model_weights.pth'))
# model.eval()
# torch_input为模型输入参数大小,对于图片一般格式为N(Batch大小)*C(图像通道,灰度图像为1)*H(图像高)*W(图像宽)
# torch_input张量至少有两维,第一维必须是Batch大小
torch_input = torch.randn(1,1,28,28)
torch.onnx.export(model,torch_input,"model.onnx", export_params=True
,input_names=["input0"],output_names=["output0"],verbose=False)

# 重新加载并检查模型,自动化简模型
model_onnx = onnx.load("model.onnx")
onnx.checker.check_model(model_onnx)
model_onnx, check = onnxsim.simplify(model_onnx,
dynamic_input_shape=False,
input_shapes=None)
onnx.save(model_onnx, "model.onnx")
阅读全文 »

目前虽然在我的主机上已经安装了双系统Windows+Ubuntu,但是两个系统切换来切换去也比较麻烦。于是考虑在Window上装虚拟机的方案,不过以前虚拟机装Ubuntu 分配1GB内存应该是足够的,现在估计不行。另外用WSL2虽然性能上可以有所提升,但是除了避免不了内存占用大的通病外还不好管理,安装过程也不能够定制。于是这里尝试一种在虚拟机里安装精简版的Debian/Ubuntu(或者说手动制作一个WSL),实现极小的硬盘和内存占用。

基础环境

这里使用的是免费的虚拟机软件Virtualbox 6.1,为了节约安装的时间下载用的镜像是网络启动的最小镜像,后续所有的安装都需要联网(虽然需要下载,但是能够保证装完的系统不需要进行额外的更新),以下是可用一些安装镜像的方案

  • Ubuntu 18.08 LTS Minimal ISO 根据官方解释在18.04之后就不再提供最小安装ISO而用Ubuntu Server替代了
  • Ubuntu Server 这个是最新的服务器版本,实际上在安装选项里也可以选择最小安装,只不过它似乎最终安装出来硬盘占用比上面这个大
  • Ubuntu Cloud Image 一步到位的解决方案,直接下载VMDK镜像到虚拟机后直接启动,这也是WSL使用的Ubuntu镜像。不过需要插入Seed.iso镜像进行用户名和密码等的配置。

以下安装流程主要针对Minimal ISO的安装和Ubuntu Server版本的安装,Cloud Image的配置可以直接跳到最后系统配置一步。

阅读全文 »

方程求根

最简单的方程求根的问题可以描述为求令成立的的数值解,有以下几种常见方法

二分法

二分法是基于数学上根的存在性的条件,即若则在区间内至少存在一个根。二分法通过每次取根存在的一半,判断根存在于左半区间还是右半区间(\frac{a+b}{2},b),确定根存在的区间后再重复上述步骤搜索缩小后的区间。不断重复即可不断缩小搜索范围,当这个范围足够小时我们认为它是一个点,即找到了对应的根。
二分法在区间取值正确的情况下能够保证线性收敛,但是其缺点也很明显,就是收敛速度太慢了。对于选的比较宽的初始区间需要非常多次迭代才能够达到较为理想的精度。

阅读全文 »