Esempio n. 1
0
    def __init__(self,
                 root,
                 relpath2data=None,
                 *,
                 reads=True,
                 prt=False,
                 fltr='json',
                 slt='json',
                 extdata=None):
        """
        :param root: 文件根目录
        :param relpath2data: {jsonfile: lmdict, ...},其中 lmdict 为一个labelme文件格式的标准内容
            如果未传入data具体值,则根据目录里的情况自动初始化获得data的值

            210602周三16:26,为了工程等一些考虑,删除了 is_labelme_json_data 的检查
                尽量通过 fltr、slt 的机制选出正确的 json 文件
        """
        super().__init__(root,
                         relpath2data,
                         reads=reads,
                         prt=prt,
                         fltr=fltr,
                         slt=slt,
                         extdata=extdata)

        # 已有的数据已经读取了,这里要补充空labelme标注
        if self.pathgs:
            for stem, suffixs in tqdm(self.pathgs.data.items(),
                                      f'{self.__class__.__name__}优化数据',
                                      disable=not prt):
                f = File(stem, suffix=slt)
                if reads and not f:
                    self.rp2data[f.relpath(self.root)] = LabelmeDict.gen_data(
                        File(stem, suffix=suffixs[0]))
Esempio n. 2
0
    def __init__(self,
                 root,
                 relpath2data=None,
                 *,
                 reads=True,
                 prt=False,
                 fltr=None,
                 slt=None,
                 extdata=None):
        """
        :param root: 数据所在根目录
        :param dict[str, readed_data] relpath2data: {relpath: data1, 'a/1.txt': data2, ...}
            如果未传入data具体值,则根据目录里的情况自动初始化获得data的值

            relpath是对应的File标注文件的相对路径字符串
            data1, data2 是读取的标注数据,根据不同情况,会存成不同格式
                如果是json则直接保存json内存对象结构
                如果是txt可能会进行一定的结构化解析存储
        :param extdata: 可以存储一些扩展信息内容
        :param fltr: filter的缩写,PathGroups 的过滤规则。一般用来进行图片匹配。
            None,没有过滤规则,就算不存在slt格式的情况下,也会保留分组
            'json'等字符串规则, 使用 select_group_which_hassuffix,必须含有特定后缀的分组
            judge(k, v),自定义函数规则
        :param slt: select的缩写,要选中的标注文件后缀格式
            如果传入slt参数,该 Basic 基础类只会预设好 file 参数,数据部分会置 None,需要后续主动读取

        >> BasicLabelData('textGroup/aabb', {'a.json': ..., 'a/1.json': ...})
        >> BasicLabelData('textGroup/aabb', slt='json')
        >> BasicLabelData('textGroup/aabb', fltr='jpg', slt='json')  # 只获取有对应jpg图片的json文件
        >> BasicLabelData('textGroup/aabb', fltr='jpg|png', slt='json')
        """

        # 1 基础操作
        root = Dir(root)
        self.root, self.rp2data, self.extdata = root, relpath2data or {}, extdata or {}
        self.pathgs = None

        if relpath2data is not None or slt is None:
            return

        # 2 如果没有默认data数据,以及传入slt参数,则需要使用默认文件关联方式读取标注
        relpath2data = {}
        gs = PathGroups.groupby(Dir(root).select_files('**/*'))
        if isinstance(fltr, str):
            gs = gs.select_group_which_hassuffix(fltr)
        elif callable(fltr):
            gs = gs.select_group(fltr)
        self.pathgs = gs

        # 3 读取数据
        for stem, suffixs in tqdm(gs.data.items(),
                                  f'{self.__class__.__name__}读取数据',
                                  disable=not prt):
            f = File(stem, suffix=slt)
            if reads and f:
                # dprint(f)  # 空json会报错:json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
                relpath2data[f.relpath(self.root)] = f.read()
            else:
                relpath2data[f.relpath(self.root)] = None

        self.rp2data = relpath2data