Yolov5对本地视频进行推理时,实现跳帧检测,提高推理效率

今天在使用Yolov5的detect.py对本地视频进行推理时,发现推理速度受硬件性能影响比较大,为提高检测效率,在部分没必要逐帧检测的情况下,可以考虑设置跳帧检测。

对detect.py观察了一番之后,发现视频读取靠的是dataloaders.py库,于是继续观察。

最终得出了以下解决方案:

 if self.video_flag[self.count]:
            # Read video
            self.mode = 'video'
            ret_val, img0 = self.cap.read()

            # 设置要读取的下一帧,这里表示每次跳 10 帧
            self.cap.set(cv2.CAP_PROP_POS_FRAMES, self.frame + 10)

            while not ret_val:
                self.count += 1  # 需要推理的文件序数
                self.cap.release()
                if self.count == self.nf:
                    raise StopIteration
                path = self.files[self.count]
                self.new_video(path)
                ret_val, img0 = self.cap.read()

            self.frame += 10
            s = f'video {self.count + 1}/{self.nf} ({self.frame}/{self.frames}) {path}: '

 a6e4a4f57cce4aee8477878889a7fd77.png

21b0177900af4d689c1798a220cef3eb.png

注意事项:dataloaders.py 里面,跳帧之后,记得加个self.frame加跳帧数之后是否大于self.frames总帧数的判断,如果大于,就跳到下一段媒体内容进行检测,不然偶尔会一直循环下去,加载帧数超过视频实际总帧数。

思路如下:

图中代码236行 while not 仅判断了ret_val,是否读取到视频帧,可以同时加个“或”条件:

self.frame+跳帧数>self.frames

保存的检测结果视频属性帧率不变,但由于跳了帧,所以呈现出加速效果,请根据实际需求酌情修改。

猜你喜欢

转载自blog.csdn.net/ghcony/article/details/126455625