|
本帖最后由 jefferyzhang 于 2023-2-9 09:03 编辑
Note:
1. 因为3588 PythonSDK是按最高性能设计,其中很多操作是0拷贝的实现,不像其他Python库返回都是多次拷贝,所以会产生很多逻辑陷阱。
2. 本示例从HDMI-IN获取数据,缩放后送入RKNNLite推理,并显示
3. 主要展示容易出问题的asarray()的用法,因为是0拷贝的实现,必须要保证源变量没有被析构,否则他所指向的内存就已经被释放了
4. 送入rknn前先缩放成模型输入尺寸避免性能消耗,这里由于rknnlite参数是numpy array类型,在rknn内部会有一次memcpy无法避免。
- from rknnlite.api import RKNNLite
- import toybrick as toy
- import numpy as np
- def init_rknn(model):
- rknn_lite = RKNNLite()
- ret = rknn_lite.load_rknn(model)
- if ret != 0:
- print('Load RKNN model failed')
- exit(ret)
- print('--> Init runtime environment')
- ret = rknn_lite.init_runtime(core_mask=RKNNLite.NPU_CORE_0_1_2)
- if ret != 0:
- print('Init runtime environment failed')
- exit(ret)
- print('done')
- return rknn_lite
- if __name__ == '__main__':
- rknn = init_rknn('./model.rknn')
- hdmi = toy.HdmiCapture()
- disp = toy.Display('', 1920, 1080, False)
- print("Connect display width = " + str(disp.width) + " ; height = " + str(disp.height))
- while True:
- ret, frame = hdmi.read(1920, 1080, toy.FMT_RGB888)
- if frame is not None:
- img = frame.resize(320, 320) # 这里的img是一个dma buffer
- npimg = img.asarray() # 必须要单独再用一个变量,保证img变量引用计数不会为0,因为这里的asarray是0拷贝构造,如果img被析构,npimg指向的内存空间就是错的了
- outputs = rknn.inference(inputs=[npimg])
- print(outputs)
|
|