主要分为3部分:
1.数据输入部分:
1.因原始测试代码只是单张测试图片(测试格式:安霸平台离线转的bin文件),现在的问题是:如何输入数据流?会不会涉及到字节对齐问题,如何与之前高位(1126平台)数据类型对接?(只移植npu部分,动了数据类型,涉及的改动太大)
具体操作:
1)兼容高位车牌识别(1126)数据类型,统一用如下形式
2)注意cv22是32字节对齐
如输入车牌识别大小是50*200的,cv22是按照宽长度对齐,最终对齐为50*224
3)输入数据处理
与1126对比有一些差异,但本质相同。cv22先把数据传给一个指针存储,然后进行前向推理,如直接nnctrl_run_net推理,只有一个网络ID号。(具体内部如何实现推理去拿到数据的,暂时未知其中的原理)
现在输入数据流方式如下:
bin为cv22的数据格式,有数据对齐等操作,这里冗余性较高,如多次memcopy操作,后期会优化。
2.模型初始化部分:
1.cv22的初始化很多,相对1126要复杂,初始化没搞好,容易出现内存泄漏,前向推理拿不到结果。
注意1:如下初始化只能做一次。
注意2:涉及到内存问题
我用static变量控制,只做一次。涉及到的两次内存申请函数:
alloc_cv_mem 和nnctrl_iniy_net(一定要注意,不要多次申请)
注意3:做完前向推理后,拿到结果,要屏蔽掉nnctrl_exit_net,要不然会出现第二次前向拿到的结果会怀疑人生(痛苦的记忆)。
模型结果输出部分:
1.注意1: 32字节对齐问题
如高位的ctc,正常最后拿到的结果是1*20*1*74,由于是32字节对齐,后面取结果1*20*1*80。
2.之前还以为cv22在数据输入上有大小限制,最后排查出是本公司画出的pcb板子在内存上有问题。
以上移植的cv22 高位车牌识别作为baseline版本,现在在三部正在测试,调试中。也许其中还有坑没有踩到,但是该版本能正常运行,无内存泄漏。代码上还有很大的冗余性,需要后期进一步的精简以及优化。移植不难,主要实现如下函数就行。思路清晰。
具体的后处理、如何拿到yolo的结果、模型的转换等相关问题可参考文档。