人世繁华|处理帧数不等的视频的批处理代码
训练和测试一个有效的机器学习模型最重要的一步是收集大量数据并使用这些数据对其进行有效训练 。 小批量(Mini-batches)有助于解决这个问题 , 在每次迭代中使用一小部分数据进行训练 。
但是 , 随着大量的机器学习任务在视频数据集上执行 , 存在着对不等长视频进行有效批处理的问题 。 大多数方法依赖于将视频裁剪成相等的长度 , 以便在迭代期间提取相同数量的帧 。 但在我们需要从每一帧获取信息来有效地预测某些事情的场景中 , 这并不是特别有用 , 特别是在自动驾驶汽车和动作识别的情况下 。
我们可以创建一个可以处理不同长度视频的处理方法 。
在Glenn Jocher的Yolov3中() , 我用**LoadStreams**作为基础 , 创建了LoadStreamsBatch类 。
类初始化def __init__(self, sources='streams.txt', img_size=416, batch_size=2, subdir_search=False):self.mode = 'images'self.img_size = img_sizeself.def_img_size = Nonevideos = []if os.path.isdir(sources):if subdir_search:for subdir, dirs, files in os.walk(sources):for file in files:if 'video' in magic.from_file(subdir + os.sep + file, mime=True):videos.append(subdir + os.sep + file)else:for elements in os.listdir(sources):if not os.path.isdir(elements) and 'video' in magic.from_file(sources + os.sep + elements, mime=True):videos.append(sources + os.sep + elements)else:with open(sources, 'r') as f:videos = [x.strip() for x in f.read().splitlines() if len(x.strip())]n = len(videos)curr_batch = 0self.data = http://kandian.youth.cn/index/[None] * batch_sizeself.cap = [None] * batch_sizeself.sources = videosself.n = nself.cur_pos = 0# 启动线程从视频流中读取帧for i, s in enumerate(videos):if curr_batch == batch_size:breakprint('%g/%g: %s... ' % (self.cur_pos+1, n, s), end='')self.cap[curr_batch] = cv2.VideoCapture(s)try:assert self.cap[curr_batch].isOpened()except AssertionError:print('Failed to open %s' % s)self.cur_pos+=1continuew = int(self.cap[curr_batch].get(cv2.CAP_PROP_FRAME_WIDTH))h = int(self.cap[curr_batch].get(cv2.CAP_PROP_FRAME_HEIGHT))fps = self.cap[curr_batch].get(cv2.CAP_PROP_FPS) % 100frames = int(self.cap[curr_batch].get(cv2.CAP_PROP_FRAME_COUNT))_, self.data[i] = self.cap[curr_batch].read()# guarantee first framethread = Thread(target=self.update, args=([i, self.cap[curr_batch], self.cur_pos+1]), daemon=True)print(' success (%gx%g at %.2f FPS having %g frames).' % (w, h, fps, frames))curr_batch+=1self.cur_pos+=1thread.start()print('')# 新的一行if all( v is None for v in self.data ):return# 检查常见形状s = np.stack([letterbox(x, new_shape=self.img_size)[0].shape for x in self.data], 0)# 推理的形状self.rect = np.unique(s, axis=0).shape[0] == 1if not self.rect:print('WARNING: Different stream shapes detected. For optimal performance supply similarly-shaped streams.')在__init__函数中 , 接受四个参数 。 虽然img_size与原始版本相同 , 但其他三个参数定义如下:
- sources:它以目录路径或文本文件作为输入 。
- batch_size:所需的批大小
- subdir_search:可以切换此选项 , 以确保在将目录作为sources参数传递时搜索所有子目录中的相关文件
推荐阅读
- 扬子晚报网|两车同属违停处理却相异,市民投诉交警要“说法”
- 扬子晚报|两车同属违停处理却相异,市民投诉交警要“说法”
- 铁剑帮帮主|抄底麒麟处理器?
- 华为|最坑的三款华为千元机,搭载最弱的5G处理器,价格却高达1700元!
- 华光环能|好消息!华光环能:子公司中标污水处理总承包项目
- 蓝色星晨|继续打磨14nm!英特尔下一代桌面处理器明年Q1发布
- 显卡|装完就后悔系列②,10600K可能真的不是我想要的i5处理器
- 挖贝网|全国股转公司8月处理102宗违规:万源生态、朱老六未及时披露提交精选层辅导材料被警示
- 杭州住保房管|11户家庭因提供虚假购房报名资料被通报处理
- 与史说今|皇帝每餐要吃多少道菜呢,剩饭剩菜如何处理?,在古代
