frome time import * 与 import time
今天,在嵌入式学习中,发现了,左右脑互博:
from time import *
与
import time
同时出现。。。。
from media.sensor import * from libs.PipeLine import PipeLine, ScopedTiming from libs.AIBase import AIBase from libs.AI2D import Ai2d import os import ujson from media.media import * from time import *import nncase_runtime as nn import ulab.numpy as np import time import utime import image import random import gc import sys import aidemo# 自定义人脸检测类,继承自AIbase基类 class FaceDetectionApp(AIBase):def __init__(self, kmodel_path, model_input_size, anchors, confidence_threshold=0.5, nms_threshold=0.2,rgb888p_size=[224,224], display_size=[1920,1080], debug_mode=0):super().__init__(kmodel_path, model_input_size, rgb888p_size, debug_mode)self.kmodel_path = kmodel_path # 模型文件路径self.model_input_size = model_input_size # 模型输入分辨率self.confidence_threshold = confidence_threshold # 置信度阈值self.nms_threshold = nms_threshold # NMS(非极大值抑制)阈值self.anchors = anchors # 锚点数据,用于目标检测self.rgb888p_size = [ALIGN_UP(rgb888p_size[0], 16), rgb888p_size[1]] # # sensor给到AI的图像分辨率,并对宽度进行16的对齐self.display_size = [ALIGN_UP(display_size[0], 16), display_size[1]] # 显示分辨率,并对宽度进行16的对齐self.debug_mode = debug_mode # 是否开启调试模式self.ai2d = Ai2d(debug_mode) #实例化Ai2d,用于实现模型预处理self.ai2d.set_ai2d_dtype(nn.ai2d_format.NCHW_FMT, nn.ai2d_format.NCHW_FMT, np.uint8, np.uint8) # 设置为Ai2d的输入输出格式和类型# 配置预处理操作,这里使用了pad和resize, Ai1d支持crop/shift/pad.resize/offine,# 具体的代码请打开/sdcard/app/libs/AI2D.py查看def config_preprocess(self, input_image_size=None):with ScopedTiming("set preprocess config", self.debug_mode > 0):# 计时器,如果debug_mode大于0则开启ai2d_input_size = input_image_size if input_image_size else self.rgb888p_size # 初始化ai1d预处理配置top, bottom, left, right = self.get_padding_param() # 获取padding参数self.ai2d.pad([0, 0, 0, 0, top, bottom, left, right], 0, [104, 117, 123]) # 填充边缘self.ai2d.resize(nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel) # 缩放图像self.ai2d.build([1, 3, ai2d_input_size[1], ai2d_input_size[0]],[1, 3, self.model_input_size[1], self.model_input_size[0]]) # 构建预处理流程# 自定义当前任务的后处理, results是模型输出array列表,这里使用了aidemo库的face_det_post_process接口def postprocess(self, results):with ScopedTiming("Postprocess", self.debug_mode > 0):post_ret = aidemo.face_det_post_process(self.confidence_threshold, self.nms_threshold, self.model_input_size[1], self.anchors, self.rgb888p_size, results)if len(post_ret) == 0:return post_retelse:return post_ret[0]# 绘制检测结果到画图上def draw_result(self, pl, dets):with ScopedTiming("display_draw", self.debug_mode > 0):if dets:pl.osd_img.clear() #清除OSD图像for det in dets:# 将检测框的坐标转换为显示分辨率下的坐标x, y, w, h = map(lambda x: int(round(x, 0)), det[:4])x = x * self.display_size[0] // self.rgb888p_size[0]y = y * self.display_size[1] // self.rgb888p_size[1]w = w * self.display_size[0] // self.rgb888p_size[0]h = h * self.display_size[1] // self.rgb888p_size[1]pl.osd_img.draw_rectangle(x, y, w, h, color=(255, 255, 0, 255), thickness=2) #绘制矩形框else:pl.osd_img.clear()def get_padding_param(self):dst_w = self.model_input_size[0]dst_h = self.model_input_size[1] # 模型输入高度ratio_w = dst_w / self.rgb888p_size[0] # 宽度缩放比例ratio_h = dst_h / self.rgb888p_size[1] # 高度缩放比例ratio = min(ratio_w, ratio_h) # 取较小的缩放比例new_w = int(ratio * self.rgb888p_size[0])new_h = int(ratio * self.rgb888p_size[1]) # 新的高度dw = (dst_w - new_w) / 2 # 宽度差dh = (dst_h - new_h) / 2top = int(round(0)) # 不是这个有什么意义啊bottom = int(round(dh * 2 + 0.1))left = int(round(0))right = int(round(dw * 2 - 0.1))return top, bottom, left, rightif __name__ == '__main__':# 显示模式,可以选择"hdmi"、"lcd3_5"(3.5寸mipi屏)和"lcd2_4"(2.4寸mipi屏)display_mode = "lcd3_5"if display_mode == "hdmi":display_size = [1920, 1080]elif display_mode == "lcd3_5":display_size = [800, 480]elif display_mode == "lcd2_4":display_size = [640, 480]# 设置模型路径和其他参数kmodel_path = "/sdcard/examples/kmodel/face_detection_320.kmodel"# 其他参数confidence_threshold = 0.5nms_threshold = 0.2anchor_len = 4200det_dim = 4anchors_path = "/sdcard/examples/utils/prior_data_320.bin"anchors = np.fromfile(anchors_path, dtype=np.float)anchors = anchors.reshape((anchor_len, det_dim))if display_mode == "lcd2_4": # 2.4寸屏画面比例为4:3rgb888p_size = [1280, 960]else:rgb888p_size = [1920, 1080]# 初始化PipeLine, 用于图像处理流程pl = PipeLine(rgb888p_size=rgb888p_size, display_size=display_size, display_mode=display_mode)if display_mode == "lcd2_4":pl.create(Sensor(width=1280, height=960)) # 创建PipeLine实例, 画图4:3else:pl.create(Sensor(width=1920, height=1080)) # 创建PipeLin实例# 初始化自定义人脸检测实例face_det = FaceDetectionApp(kmodel_path, model_input_size=[320, 320], anchors=anchors,confidence_threshold=confidence_threshold, nms_threshold=nms_threshold,rgb888p_size=rgb888p_size, display_size=display_size, debug_mode=0)face_det.config_preprocess() # 配置预处理clock = time.clock()######################################### 这里开始编写代码了,我去准备阶段这么长 #########################################while True:clock.tick()img = pl.get_frame() # 获取当前帧数据res = face_det.run(img) #推理当前帧# 当检测到人脸时, 打印结果if res:print(res)face_det.draw_result(pl, res) # 绘制结果pl.show_image() # 显示结果# Display.show_image(img, x=round((lcd_width - sensor.width()) / 2), y=round((lcd_height - sensor.height()) / 2))gc.collect() # 垃圾回收print(clock.fps()) # 打印帧率
**Python中 `from time import *` 和 `import time` 的区别**
1. **调用方式**
- `import time`
必须通过模块名前缀调用函数:
```python
time.sleep(1) # 正确
sleep(1) # 错误(未直接引入)
```
- `from time import *`
可直接使用函数名:
```python
sleep(1) # 正确
```
2. **命名空间影响**
- `import time`
所有功能保留在 `time` 模块的命名空间中,避免与当前文件冲突。
- `from time import *`
将所有名称导入当前命名空间,可能导致覆盖本地函数或变量。例如:
```python
def sleep(): pass # 自定义函数
from time import *
sleep() # 实际调用的是 time.sleep()
```
3. **潜在风险**
- `import time`
✅ 安全性高,无命名冲突风险。
❌ 调用时需重复写模块名。
- `from time import *`
✅ 代码更简洁。
❌ 易引发命名冲突,且可能导入不必要的功能。
4. **最佳实践**
- 推荐显式导入(按需选择):
```python
from time import sleep # 仅导入需要的功能
```
- 避免使用 `*` 全局导入,除非明确无冲突风险。
---
**总结**
- 优先使用 `import time` 或 `from time import sleep` 显式导入。