如何提高 YOLOv3 检测时间? (OpenCV + Python)

How to improve YOLOv3 detection time? (OpenCV + Python)

我正在使用 YOLOv3 自定义训练模型和 OpenCV 4.2.0,使用 CUDA 编译。当我在 Python 中测试代码时,我在 GPU (GTX1050 Ti) 上使用 OpenCV,但对单个图像 (416px x 416px) 的检测需要 0.055 秒 (~20 FPS)。我的配置文件设置为小物体检测,因为我需要在 2500px x 2000px 图像上检测 ~ 10px x 10px 物体,所以我将原始图像分成 30 个小块。我的目标是在 416px x 416px 图像上达到 0.013 s (~80 FPS)。在 Python 中可以使用 OpenCV 吗?如果没有,如何以正确的方式做到这一点?

PS。目前检测占用了 CPU 的 50%、5GB RAM 和 6% GPU。

使用已训练的 Yolov3 模型改进检测时间的一些首选方法是:

  • 量化:运行 使用 INT8 而不是 FP32 进行推理。您可以将此 repo 用于此目的。
  • 在 TensorRT7 上使用推理加速器,例如 TensorRT since you're using Nvidia's GPU. The tool includes good amount of inference oriented optimisations along with quantisation optimisations INT8 and FP16 to reduce detection time. This thread talks about Yolov3 inference with TensorRT5. Use this Yolov3 的 repo。
  • 使用推理库,例如 tkDNN,这是一个使用 cuDNN 和 tensorRT 基元构建的深度神经网络库,特别适合在 NVIDIA Jetson Boards 上运行。

如果您愿意进行模型训练,除了上述选项之外,还有其他几个选项:

  • 您可以使用更小的版本而不是完整的 Yolo 版本来训练模型,当然这是以减少 accuracy/mAP 为代价的。你可以训练 tiny-yolov4 (latest model) or train tiny-yolov3.
  • 模型修剪 - 如果您可以根据神经元的贡献程度对网络中的神经元进行排名,则可以从网络中删除排名较低的神经元,从而产生更小更快的网络。 Pruned yolov3 research paper and it's implementation. This 是另一个经过修剪的 Yolov3 实现。