def select_clone(self, transform_set_ids): """ This method clones transform sets to new transform sets. :param list(int) transform_set_ids: The transform set IDs. :raises: CommandLineRouteHandlerError :rtype: None """ transform_set_model = TransformSetModel() for transform_set_id in transform_set_ids: result = transform_set_model.select(transform_set_id) if result is None: raise CommandLineRouteHandlerError( f'Transform set with ID {transform_set_id:08d} not found') for transform_set_id in transform_set_ids: result = transform_set_model.select(transform_set_id) self.select_merge([transform_set_id], name=result[1], fk_frame_sets=result[2], fk_prev_transform_sets=transform_set_id, rejected=True)
def test_delete(self): with deepstar_path(): VideoModel().insert('test1', 'test2') FrameSetModel().insert(1) transform_set_model = TransformSetModel() transform_set_model.insert('test', 1) result = transform_set_model.select(1) self.assertEqual(result, (1, 'test', 1, None)) result = transform_set_model.delete(1) self.assertTrue(result) result = transform_set_model.select(1) self.assertIsNone(result)
def select_extract(self, transform_set_ids, name, opts): """ This method runs a transformation plugin over previously created transform sets. :param list(int) transform_set_id: The transform set IDs. :param str name: The name of the transform set extraction plugin to use. :param dict opts: The dict of options. :raises: CommandLineRouteHandlerError :rtype: None """ transform_set_model = TransformSetModel() for transform_set_id in transform_set_ids: result = transform_set_model.select(transform_set_id) if result is None: raise CommandLineRouteHandlerError( f'Transform set with ID {transform_set_id:08d} not found') plugin = Plugin.get('transform_set_select_extract', name) if plugin is None: raise CommandLineRouteHandlerError( f"'{name}' is not a valid transform set extraction " f'plugin name') for transform_set_id in transform_set_ids: try: new_transform_set_id = plugin() \ .transform_set_select_extract(transform_set_id, opts) except ValueError as e: raise CommandLineRouteHandlerError(str(e)) result = transform_set_model.select(new_transform_set_id) debug( f'transform_set_id={result[0]}, name={result[1]}, ' f'fk_frame_sets={result[2]}, ' f'fk_prev_transform_sets={result[3]}', 3)
def select_merge_non_default(self, transform_set_ids, name, opts): """ This method merges multiple transform sets into one transform set. :param list(int) transform_set_ids: The transform set IDs. :param str name: The name of the transform set merge plugin to use. :raises: CommandLineRouteHandlerError :rtype: None """ transform_set_model = TransformSetModel() for transform_set_id in transform_set_ids: result = transform_set_model.select(transform_set_id) if result is None: raise CommandLineRouteHandlerError( f'Transform set with ID {transform_set_id:08d} not found') plugin = Plugin.get('transform_set_select_merge', name) if plugin is None: raise CommandLineRouteHandlerError( f"'{name}' is not a valid transform set merge plugin name") try: new_transform_set_id = plugin().transform_set_select_merge( transform_set_ids, opts) except ValueError as e: raise CommandLineRouteHandlerError(str(e)) result = transform_set_model.select(new_transform_set_id) debug( f'transform_set_id={result[0]}, name={result[1]}, ' f'fk_frame_sets={result[2]}, ' f'fk_prev_transform_sets={result[3]}', 3)
def select_extract(self, frame_set_ids, name, opts): """ This method extracts portions of frames to transform sets. :param list(int) frame_set_ids: The frame set IDs. :param str name: The name of the frame set extraction plugin to use. :param dict opts: The dict of options. :raises: CommandLineRouteHandlerError :rtype: None """ frame_set_model = FrameSetModel() for frame_set_id in frame_set_ids: result = frame_set_model.select(frame_set_id) if result is None: raise CommandLineRouteHandlerError( f'Frame set with ID {frame_set_id:08d} not found') plugin = Plugin.get('frame_set_select_extract', name) if plugin is None: raise CommandLineRouteHandlerError( f"'{name}' is not a valid frame set extraction plugin name") transform_set_model = TransformSetModel() for frame_set_id in frame_set_ids: transform_set_id = plugin().frame_set_select_extract( frame_set_id, opts) result = transform_set_model.select(transform_set_id) debug( f'transform_set_id={result[0]}, name={result[1]}, ' f'fk_frame_sets={result[2]}, ' f'fk_prev_transform_sets={result[3]}', 3)
def delete(self, transform_set_ids): """ This method deletes a transform set from the transform set collection. :param list(int) transform_set_ids: The transform set IDs. :raises: CommandLineRouteHandlerError :rtype: None """ transform_set_model = TransformSetModel() for transform_set_id in transform_set_ids: result = transform_set_model.select(transform_set_id) if result is None: raise CommandLineRouteHandlerError( f'Transform set with ID {transform_set_id:08d} not found') for transform_set_id in transform_set_ids: transform_set_model.delete(transform_set_id) shutil.rmtree(TransformSetSubDir.path(transform_set_id)) debug(f'Transform set {transform_set_id} was successfully deleted', 3)
def transform_set_select_extract(self, transform_set_id, opts): """ This method adjusts color for each transform in a transform set. :param int transform_set_id: The transform set ID. :param dict opts: The dict of options. :raises: ValueError :rtype: None """ r = opts.get('r', None) g = opts.get('g', None) b = opts.get('b', None) if r is None and g is None and b is None: raise ValueError( 'The r, g and/or b options are required but were not supplied') for channel in [r, g, b]: if channel is not None: if not re.match('^[+,\\-]\\d+$', channel): raise ValueError( 'A color adjustment option value must be formatted as ' '+/- followed by a number (e.g. --r=+10)') color_adjustments = [] for index, channel in enumerate([b, g, r]): if channel is not None: color_adjustments.append( [index, int(channel[1:]), True if (channel[:1] == '+') else False]) else: color_adjustments.append(None) transform_set_model = TransformSetModel() result = transform_set_model.select(transform_set_id) transform_set_id_ = TransformSetModel().insert('adjust_color', result[2], transform_set_id) p1 = TransformSetSubDir.path(transform_set_id_) os.makedirs(p1) p2 = TransformSetSubDir.path(transform_set_id) transform_model = TransformModel() length = int(os.environ.get('MODEL_LIST_LENGTH', '100')) offset = 0 while True: transforms = transform_model.list(transform_set_id, length=length, offset=offset, rejected=False) if not transforms: break for transform in transforms: transform_id = transform_model.insert(transform_set_id_, transform[2], transform[3], transform[4]) p3 = TransformFile.path(p2, transform[0], 'jpg') p4 = TransformFile.path(p1, transform_id, 'jpg') image = cv2.imread(p3) image = image.astype(np.short) for color_adjustment in color_adjustments: if color_adjustment is not None: image = adjust_color(image, color_adjustment[0], color_adjustment[1], color_adjustment[2]) cv2.imwrite(p4, image, [cv2.IMWRITE_JPEG_QUALITY, 100]) debug(f'Transform with ID {transform_id:08d} at {p4} ' f'extracted from transform with ID {transform[0]:08d} ' f'at {p3}', 4) offset += length return transform_set_id_
def transform_set_select_extract(self, transform_set_id, opts): """ This method crops each transform in a transform set. :param int transform_set_id: The transform set ID. :param dict opts: The dict of options. :raises: ValueError :rtype: None """ x1 = int(opts['x1']) if ('x1' in opts) else None y1 = int(opts['y1']) if ('y1' in opts) else None x2 = int(opts['x2']) if ('x2' in opts) else None y2 = int(opts['y2']) if ('y2' in opts) else None if x1 is None or y1 is None or x2 is None or y2 is None: raise ValueError( 'The x1, y1, x2 and y2 options are required but were not ' 'supplied') transform_set_model = TransformSetModel() result = transform_set_model.select(transform_set_id) transform_set_id_ = TransformSetModel().insert('crop', result[2], transform_set_id) p1 = TransformSetSubDir.path(transform_set_id_) os.makedirs(p1) p2 = TransformSetSubDir.path(transform_set_id) transform_model = TransformModel() length = int(os.environ.get('MODEL_LIST_LENGTH', '100')) offset = 0 while True: transforms = transform_model.list(transform_set_id, length=length, offset=offset, rejected=False) if not transforms: break for transform in transforms: transform_id = transform_model.insert(transform_set_id_, transform[2], transform[3], transform[4]) p3 = TransformFile.path(p2, transform[0], 'jpg') p4 = TransformFile.path(p1, transform_id, 'jpg') image_1 = cv2.imread(p3) image_2 = image_1[y1:y2, x1:x2] cv2.imwrite(p4, image_2, [cv2.IMWRITE_JPEG_QUALITY, 100]) debug( f'Transform with ID {transform_id:08d} at {p4} ' f'extracted from transform with ID {transform[0]:08d} ' f'at {p3}', 4) offset += length return transform_set_id_
def transform_set_select_extract(self, transform_set_id, opts): """ This method resizes each transform in a transform set. :param int transform_set_id: The transform set ID. :param dict opts: The dict of options. :raises: ValueError :rtype: None """ height = int(opts['height']) if ('height' in opts) else None width = int(opts['width']) if ('width' in opts) else None if height is None and width is None: raise ValueError( 'The height or width options are required but were not ' 'supplied') transform_set_model = TransformSetModel() result = transform_set_model.select(transform_set_id) transform_set_id_ = TransformSetModel().insert('resize', result[2], transform_set_id) p1 = TransformSetSubDir.path(transform_set_id_) os.makedirs(p1) p2 = TransformSetSubDir.path(transform_set_id) transform_model = TransformModel() length = int(os.environ.get('MODEL_LIST_LENGTH', '100')) offset = 0 while True: transforms = transform_model.list(transform_set_id, length=length, offset=offset, rejected=False) if not transforms: break for transform in transforms: transform_id = transform_model.insert(transform_set_id_, transform[2], transform[3], transform[4]) p3 = TransformFile.path(p2, transform[0], 'jpg') p4 = TransformFile.path(p1, transform_id, 'jpg') image_1 = cv2.imread(p3) if width is not None: image_2 = imutils.resize(image_1, width=width) else: image_2 = imutils.resize(image_1, height=height) cv2.imwrite(p4, image_2, [cv2.IMWRITE_JPEG_QUALITY, 100]) debug( f'Transform with ID {transform_id:08d} at {p4} ' f'extracted from transform with ID {transform[0]:08d} ' f'at {p3}', 4) offset += length return transform_set_id_
def transform_set_select_extract(self, transform_set_id, opts): """ This method extracts a slice from a transform set (a subset). :param int transform_set_id: The transform set ID. :param dict opts: The dict of opts. :raises: ValueError :rtype: int """ start = int(opts['start']) if ('start' in opts) else None end = int(opts['end']) if ('end' in opts) else None if start is None or end is None: raise ValueError( 'The start and end options are required but were not ' 'supplied') transform_set_model = TransformSetModel() result = transform_set_model.select(transform_set_id) transform_set_id_ = TransformSetModel().insert('slice', result[2], transform_set_id) p1 = TransformSetSubDir.path(transform_set_id_) os.makedirs(p1) p2 = TransformSetSubDir.path(transform_set_id) transform_model = TransformModel() length = int(os.environ.get('MODEL_LIST_LENGTH', '100')) offset = 0 flag = True while flag: transforms = transform_model.list(transform_set_id, length=length, offset=offset, rejected=False) if not transforms: break for transform in transforms: if transform[0] < start: continue if transform[0] > end: flag = False break transform_id = transform_model.insert(transform_set_id_, transform[2], transform[3], transform[4]) p3 = TransformFile.path(p2, transform[0], 'jpg') p4 = TransformFile.path(p1, transform_id, 'jpg') shutil.copy(p3, p4) debug( f'Transform with ID {transform_id:08d} at {p4} ' f'extracted from transform with ID {transform[0]:08d} ' f'at {p3}', 4) offset += length return transform_set_id_
def select_merge(self, transform_set_ids, name='merge', fk_frame_sets=None, fk_prev_transform_sets=None, rejected=False): """ This method merges multiple transform sets into one transform set. :param list(int) transform_set_ids: The transform set IDs. :param str name: The merged transform set's name. The default value is 'merge'. :param int fk_frame_sets: The frame set ID to which this transform set corresponds (if any). The default value is None. :param int fk_prev_transform_sets: The transform set ID the previous transform set in this series of transformations. The default value is None. :param bool rejected: True if should include rejected else False if should not. The default value is False. :raises: CommandLineRouteHandlerError :rtype: None """ transform_set_model = TransformSetModel() for transform_set_id in transform_set_ids: result = transform_set_model.select(transform_set_id) if result is None: raise CommandLineRouteHandlerError( f'Transform set with ID {transform_set_id:08d} not found') transform_set_id = transform_set_model.insert(name, fk_frame_sets, fk_prev_transform_sets) p1 = TransformSetSubDir.path(transform_set_id) os.makedirs(p1) transform_model = TransformModel() length = int(os.environ.get('MODEL_LIST_LENGTH', '100')) for transform_set_id_ in transform_set_ids: offset = 0 p2 = TransformSetSubDir.path(transform_set_id_) while True: transforms = transform_model.list(transform_set_id_, length=length, offset=offset, rejected=rejected) if not transforms: break for transform in transforms: transform_id = transform_model.insert( transform_set_id, transform[2], transform[3], transform[4]) p3 = TransformFile.path(p2, transform[0], 'jpg') p4 = TransformFile.path(p1, transform_id, 'jpg') shutil.copy(p3, p4) debug( f'Transform with ID {transform[0]:08d} at {p3} ' f'merged as ID {transform_id:08d} at {p4}', 4) offset += length result = transform_set_model.select(transform_set_id) debug( f'transform_set_id={result[0]}, name={result[1]}, ' f'fk_frame_sets={result[2]}, fk_prev_transform_sets={result[3]}', 3)
def select_export_dir(self, transform_set_ids, target_dir, opts={}): """ This method exports transform sets to a directory. :param list transform_set_ids: The list of transform set IDs. :param str target_dir: The directory to which to export the transform sets. :param dict opts: The dict of options. :raises: CommandLineRouteHandlerError :rtype: None """ transform_set_model = TransformSetModel() for transform_set_id in transform_set_ids: result = transform_set_model.select(transform_set_id) if result is None: raise CommandLineRouteHandlerError( f'Transform set with ID {transform_set_id:08d} not found') if not os.path.isdir(target_dir): raise CommandLineRouteHandlerError( f'{target_dir} is not a directory') transform_model = TransformModel() length = int(os.environ.get('MODEL_LIST_LENGTH', '100')) count = 0 for tid in transform_set_ids: offset = 0 transform_set_path = TransformSetSubDir.path(tid) while True: results = transform_model.list(tid, length=length, offset=offset, rejected=False) if not results: break for transform_id, _, _, _, _ in results: file_path = TransformFile().path(transform_set_path, transform_id, 'jpg') if 'format' in opts: filename = opts['format'] % transform_id else: filename = os.path.basename(file_path) target_path = os.path.join(target_dir, filename) shutil.copy(file_path, target_path) count += 1 debug( f'Transform with ID {transform_id:08d} at ' f'{file_path} exported to {target_path}', 4) offset += length debug(f'{count} transforms were successfully exported to {target_dir}', 3)