嘉楠科技
直播中

李英

8年用户 1538经验值
私信 关注
[问答]

使用micropython的ulab.numpy切片将RGB888的NHWC格式转换为RGBP888的NCHW格式,速度非常慢怎么解决?

转换代码如下.每次转换需要花费200ms以上.
rgb888_img_np = rgb888_img.to_numpy_ref()rgb888p_img_np = np.zeros((3, rgb888_img_np.shape[0], rgb888_img_np.shape[1]), dtype=np.uint8)with Scopedtiming("convert",debug_mode > 0):    rgb888p_img_np[0] = rgb888_img_np[:, :, 0]  # R通道    rgb888p_img_np[1] = rgb888_img_np[:, :, 1]  # G通道    rgb888p_img_np[2] = rgb888_img_np[:, :, 2]  # B通道rgb888p_img = image.Image(rgb888p_img_np.shape[2], rgb888p_img_np.shape[1], image.RGBP888, data=rgb888p_img_np)我找到一个快一些的方法
img_hwc=rgb888_img.to_numpy_ref()shape=img_hwc.shapeimg_tmp = img_hwc.reshape((shape[0] * shape[1], shape[2]))img_tmp_trans = img_tmp.transpose()img_res=img_tmp_trans.copy()img_return=img_res.reshape((shape[2],shape[0],shape[1]))这个转换只要120ms,但是还是觉得很慢.

回帖(2)

姬中岩

2025-2-8 10:33:48
该问题是因为ulab无法像numpy一样灵活的进行transpose,我们后续优化会考虑是否封装接口。
举报

杨言

2025-2-8 18:13:10
在MicroPython中,性能通常受到限制,因为它是为微控制器设计的,这些微控制器的计算能力有限。然而,您可以尝试以下方法来提高代码的执行速度:

1. **优化循环**:尽量避免在循环中使用复杂的操作,因为它们会显著降低性能。在您的代码中,您可以尝试使用更简单的索引操作来替换循环。

2. **减少函数调用**:函数调用可能会引入额外的开销。您可以尝试将多个操作合并到一个函数调用中,以减少调用次数。

3. **使用更快的数据结构**:在某些情况下,使用更快的数据结构(如数组)可能会提高性能。

4. **并行处理**:如果可能的话,尝试使用并行处理来加速计算。这可能需要使用特定的硬件或软件库。

5. **代码优化**:检查代码以查找可能的优化点,例如减少不必要的变量分配或使用更快的算法。

针对您的代码,您可以尝试以下优化:

```python
import numpy as np

rgb888_img_np = rgb888_img.to_numpy_ref()
rgb888p_img_np = np.zeros((3, rgb888_img_np.shape[0], rgb888_img_np.shape[1]), dtype=np.uint8)

with ScopedTiming("convert", debug_mode > 0):
    rgb888p_img_np[0] = rgb888_img_np[:, :, 0]  # R通道
    rgb888p_img_np[1] = rgb888_img_np[:, :, 1]  # G通道
    rgb888p_img_np[2] = rgb888_img_np[:, :, 2]  # B通道
```

您可以尝试将上述代码中的切片操作合并到一个操作中,以减少函数调用次数:

```python
import numpy as np

rgb888_img_np = rgb888_img.to_numpy_ref()
rgb888p_img_np = np.zeros((3, rgb888_img_np.shape[0], rgb888_img_np.shape[1]), dtype=np.uint8)

with ScopedTiming("convert", debug_mode > 0):
    rgb888p_img_np[:] = rgb888_img_np.transpose((2, 0, 1))
```

在这个优化版本中,我们使用`transpose`方法将RGB888格式的图像转换为RGBP888格式。这可以减少函数调用次数,从而提高性能。请注意,这只是一个示例,您可能需要根据您的具体需求进行调整。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分