YOLOV5 自动瞄准(OpenVino)(附源码)

文章讲述了如何通过OpenVINO将YOLOv5模型部署到12700H+3060Laptop的笔记本核显上,以减少对独显的依赖。作者发现numpy到Tensor的转换是瓶颈,导致帧率为60fps左右。使用OpenVINO的异步推理API能将流程时间压缩到20ms左右,但numpy转Tensor的耗时问题仍存在。文章还提到了模型量化到int8对提升帧率效果有限。
摘要由CSDN通过智能技术生成

参考文章:基于OpenVINOTM2022.2和蝰蛇峡谷优化并部署YOLOv5模型_openvino

前篇文章:基于YOLOV5的自动瞄准(附代码)_yolov5 自瞄_RedWhiteLuo的博客

之前已经通过Pytroch 调用 NVIDIA GPU 进行推理,但是在实际使用中,独显肯定是最好空闲出来的, 因此我们可以利用闲置的硬件——核显, 我是手上的设备的配置是 12700h 3060Laptop 的笔记本。

因此,我们可以用过INTEL 推出的Openvino 工具,将推理的设备设置为核显,让独显空闲出来。

利用推理的流程在之前的帖子里已经谈及过,这里就不多赘述。这里主要记录一下遇到的问题,希望各位够帮我优化代码逻辑,相互交流

  • 值得一提的是,通过openvino官方的benchmark中的测试数据可以得出,其异步推理速度近90fps

  • 并且openvino 有官方的 异步推理的api(multiprocessing


先说结论: numpy 转 Tensor 的耗时太长,导致帧率只有60fps不到,但是能够放空独显


OpenVino 环境部署:

Download Intel® Distribution of OpenVINO™ Toolkit

pip install openvino-dev==2022.3.0

YOLOV5 模型转换:

python export.py --weights yolov5s.pt --include onnx [将yolov5s.pt 转换为 onnx 格式]

mo --input_model yolov5s.onnx --data_type FP16 [将 onnx 格式文件转换为 xml 和 bin 格式]

OpenVino 性能测试:

benchmark_app -m yolov5s.xml -d AUTO:-CPU -hint cumulative_throughput

benchmark_app -m yolov5s.xml -d AUTO:-CPU -api sync

benchmark_app -m yolov5s.xml -d AUTO:-CPU -api async

运行流程(12700H):

前处理:【win32api 获取图片 5.5ms】,【图片维度转换+ 图片缩放 = 2ms】

【numpy 2 tensor = 9.5ms】合计 17ms

推理: 将数据送进神经网络到输出大概需要 11ms

后处理: 即将神经网络输出的内容进行转换,数据标注等,大概需要4ms

因此,一个完整流程需要32ms,但是通过提供的异步推理接口能压缩到20ms左右

实际上,openvino 推理过程还可以通过pot工具进行int8量化,但是这种np2tensor的耗时太长,int8量化的对帧率提升用处不大

注:本源码没有加入自动瞄准的部分,但是已经放入了函数,有需要可以自行开启

YOLO/Auto_Aiming_OV_async.py at main · RedWhiteLuo/YOLO (github.com)

要实现 YOLOv5 自动瞄准,需要进行以下步骤: 1. 使用 YOLOv5 模型进行目标检测,获取图像中物体的位置和类别。可以使用 PyTorch 官方提供的 YOLOv5 模型或者从 GitHub 上下载其他开源实现。 2. 根据检测到的目标位置和图像中心位置计算出目标相对于中心点的偏移量。 3. 根据偏移量计算出需要调整的云台角度,可以使用串口或者其他通信方式将控制信号发送至云台。 4. 不断重复上述过程,实现自动瞄准的功能。 以下是一个简单的 Python 代码示例,用于实现基于 YOLOv5自动瞄准: ```python import cv2 import numpy as np import serial # 初始化串口通信 ser = serial.Serial('/dev/ttyUSB0', 9600) # 加载 YOLOv5 模型 model = cv2.dnn.readNet('yolov5s.onnx') while True: # 读取图像 ret, frame = cap.read() # 进行目标检测 blob = cv2.dnn.blobFromImage(frame, 1/255.0, (416, 416), swapRB=True, crop=False) model.setInput(blob) outputs = model.forward(model.getUnconnectedOutLayersNames()) # 解析检测结果 boxes, confidences, class_ids = [], [], [] for output in outputs: for detection in output: scores = detection[5:] class_id = np.argmax(scores) confidence = scores[class_id] if confidence > 0.5: center_x = int(detection[0] * frame.shape[1]) center_y = int(detection[1] * frame.shape[0]) width = int(detection[2] * frame.shape[1]) height = int(detection[3] * frame.shape[0]) left = int(center_x - width / 2) top = int(center_y - height / 2) boxes.append([left, top, width, height]) confidences.append(float(confidence)) class_ids.append(class_id) # 判断是否检测到目标 if len(boxes) > 0: # 计算目标相对于中心点的偏移量 cx, cy = frame.shape[1] / 2, frame.shape[0] / 2 target_x, target_y, target_w, target_h = boxes[0] dx, dy = target_x + target_w / 2 - cx, target_y + target_h / 2 - cy # 计算需要调整的云台角度 pan_angle = dx / cx * 90 tilt_angle = dy / cy * 90 # 发送控制信号至云台 ser.write(b'P{:.2f}T{:.2f}'.format(pan_angle, tilt_angle)) ``` 注意,这只是一个简单的示例代码,实际应用中还需要考虑许多因素,例如相机和云台的校准、目标跟踪算法的优化等。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值