C++硬件推理适配流程
核心:
1.核心在于推理,主要关注推理需要的参数是什么类型,应该怎么获取。
2.提前开辟输入的cpu和device空间,预处理之后的数据可以memcpy至cpu空间,然后MxBase::MemoryHelper::MxbsMemcpy至device空间,用于送入推理。
3.提前开辟输出的device空间,用于保存推理后的输出数据。
4.输入输出在正式使用时都需要进行重置memset(最好是),防止数据未被完全覆盖而被调用导致的错误。
疑惑:
Q
:为什么从cpu拷贝至device使用的是MxBase::MemoryHelper::MxbsMemcpy而非memcpy?
A:因为memcpy仅支持同侧的且cpu的拷贝。
Q
:为什么在转化模型时,对模型归一化,那么推理时送入接口的数据是UINT8。而对于未归一化的模型,送入的数据是Float32.
A:主要是由于归一化操作涉及了浮点运算。简单来说,读入图像并进行缩放后,图像的数值仍是在0-255之间,适合以uint8的数据格式存储。此时,由于模型进行了归一化,所以仅需将缩放后的图像数据送入推理皆可,归一化操作会在内部进行;而对于未归一化的模型,归一化操作需要手动使用代码完成,此时已经涉及到浮点运算,如果再保存为uint8的格式会损失精度,所以会以float32的格式送入推理。
Q
:为什么模型的输出节点一般是float32或int32(int),而不需要int64?
A:对于int64而言,其能表示的数值特别大,
2
64
2^{64}
264 字节,一般并不会用到,会造成浪费;可以将其强制转换为int,具体来说int64类型数值以二进制形式存储,占用连续的8个字节,即64比特(b63 … b0)。若直接进行强转int,则对丢弃高位的比特数,变为32比特(b31 … b0)。若有超过int32表示的数值强转为int32,则其值可能会变为-1。
数据类型:
数据类型 | 说明 |
---|---|
float32 | 单精度浮点数,占32位(也就是4个字节),可以提供约7位有效数字的精度。 |
int8 | 8位有符号整数类型,可以表示范围在-128到127之间的整数。 |
uint8 | 8位无符号整数类型,可以表示范围在0到255之间的整数(例如像素值 )。 |
int32 | 32位有符号整数类型,可以表示范围在-2147483648到2147483647之间的整数。 |
uint32 | 32位无符号整数类型,可以表示范围在0到4294967295之间的整数。 |
C++硬件解码适配流程
1. 安装AscendFFmpegPlugin(否则无法使用mxVision框架)。
2. 解码适配流程
核心与推理适配流程相同,最重要的是关注调用推理接口Decode时,需要的参数怎样获取或者构建。