zerohertzLib.util

Util

다양한 format의 data를 hadling하는 함수 및 class들

class zerohertzLib.util.Json(path=None)[source]

Bases: object

JSON 형식 file을 읽고 사용하기 위한 class

객체 생성 시 path 를 입력하지 않을 시 현재 경로에 존재하는 JSON file을 읽고 path 를 경로로 입력하면 해당 경로에 존재하는 JSON file을 읽는다.

Parameters:

path (Optional[str]) – JSON file의 경로

name

JSON file 이름

Type:

str

keys

직렬화된 JSON의 key 값들

Type:

List[str]

__len__()[source]
Returns:

읽어온 JSON file의 길이

Return type:

int

__getitem__()[source]

읽어온 JSON file에 key 값 입력

Parameters:

key (Union[int, str]) – 읽어온 JSON file에서 불러올 key 값

Returns:

Key에 따른 value 값

Return type:

Any

_get_key()[source]

Key의 경로를 찾아주는 method

Parameters:

key (str) – 읽어온 JSON file에서 불러올 key 값 (깊이 무관)

Returns:

/ 으로 깊이를 표시한 key 값

Return type:

str

_get_value()[source]

Json._get_key 로 생성된 key 값을 입력 받아 value return

Parameters:

key (str) – Json._get_key 로 생성된 key 값

Returns:

Key에 따른 value

Return type:

Any

Examples

>>> js = zz.util.Json()
>>> js["title"]
'[v0.2.3] Release'
>>> key = js._get_key("color")
>>> key
'labels/LIST/color'
>>> js._get_value(key)
'd73a4a'
>>> js.name
'65.json'
>>> js.keys
['url', 'id', ..., 'assignees/LIST/login', ..., 'active_lock_reason']
get(key)[source]

Json._get_key 로 생성된 key 값을 입력 받아 value return

Parameters:

key (str) – 읽어온 JSON file에서 불러올 key 값 (깊이 무관)

Returns:

Key에 따른 value

Return type:

Any

Examples

>>> js["title"]
'[v0.2.3] Release'
>>> js.get("title")
'[v0.2.3] Release'
>>> js["color"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/zerohertz/Zerohertz/zerohertzLib/zerohertzLib/util/json.py", line 107, in __getitem__
KeyError: 'color'
>>> js.get("color")
'd73a4a'
tree()[source]

JSON의 구조를 출력하는 method

Examples

>>> js.tree()
├── url
...
├── user
│   ├── login
...
│   └── site_admin
├── body
...
├── assignee
│   ├── login
...
│   └── site_admin
├── assignees
│   └── LIST
│       ├── login
...
│       └── site_admin
...
└── active_lock_reason
class zerohertzLib.util.JsonDir(path='')[source]

Bases: object

입력된 경로에 존재하는 JSON 형식 file들을 읽고 사용하기 위한 class

객체 생성 시 path 를 입력하지 않을 시 현재 경로에 존재하는 JSON file들을 읽는다.

Parameters:

path (Optional[str]) – JSON file의 경로

name

읽어온 JSON file의 이름들

Type:

str

data

File 이름에 따른 Json 객체 배열

Type:

Dict[str, zerohertzLib.util.Json]

__len__()[source]
Returns:

읽어온 JSON file들의 수

Return type:

int

__getitem__()[source]

읽어온 JSON file들을 list와 같이 indexing

Parameters:

idx (int) – 입력 index

Returns:

Index에 따른 Json instance

Return type:

zerohertzLib.util.Json

_get_key()[source]

Key의 경로를 찾아주는 method

Parameters:

key (str) – 읽어온 JSON file에서 불러올 key 값 (깊이 무관)

Returns:

/ 으로 깊이를 표시한 key 값

Return type:

str

Examples

>>> jsd = zz.util.JsonDir()
100%|█████████████| 5/5 [00:00<00:00, 3640.26it/s]
>>> len(jsd)
5
>>> jsd[0]
<zerohertzLib.util.json.Json object at 0x7f2562b83d00>
>>> jsd[0]["title"]
'[v0.2.3] Release'
>>> jsd._get_key("color")
'labels/LIST/color'
tree()[source]

JSON의 구조를 출력하는 method

Examples

>>> jsd.tree()
├── url
...
├── user
│   ├── login
...
│   └── site_admin
├── body
...
├── assignee
│   ├── login
...
│   └── site_admin
├── assignees
│   └── LIST
│       ├── login
...
│       └── site_admin
...
└── active_lock_reason
unique(key)[source]

읽어온 JSON data들의 유일한 값을 return하는 method

Parameters:

key (str) – 읽어온 JSON file에서 불러올 key 값

Returns:

Key에 따른 유일한 값들의 집합

Return type:

Set[str]

Examples

>>> jsd.unique("label")
{'Zerohertz:docs', 'Zerohertz:dev-v0.2.3', 'Zerohertz:docs-v0.2.2'}
>>> jsd.unique("sha")
{'dfd53a0bfc73221dbe96d5e44a49c524d5a8596b', 'bc33235424e89cbbf23434b2a824ea068d167c7d', '97f52f9b81ba885fe69b9726632e580f5cba94be', '768c7711f94af0be00cd55e0ce7b892465cfa64a', '97e103788359f0361f4ec0e138a14218f28eddd4'}
class zerohertzLib.util.MakeData(start_data_path, start_json_path, json_key, target_path, end_data_dir='data', end_json_dir='json')[source]

Bases: ABC

JSON file 내 값에 따라 data를 구축하는 class

Note

Abstract Base Class: Data 구축 시 filtering 될 조건을 정의하는 abstract method condition 정의 후 사용

Parameters:
  • start_data_path (str) – 목표 data가 존재하는 directory 경로

  • start_json_path (str) – 목표 JSON file이 존재하는 directory 경로

  • json_key (str) – start_json 에서 data의 file 이름을 나타내는 key 값

  • target_path (str) – Data 구축 경로

  • end_data_dir (Optional[str]) – 구축될 data file들의 directory 이름

  • end_json_dir (Optional[str]) – 구축될 JSON file들의 directory 이름

json

JSON file들을 읽어 data 구축 시 활용

Type:

zerohertzLib.util.JsonDir

end_data_path

{target_path}/{end_data_dir}

Type:

str

end_json_path

{target_path}/{end_json_dir}

Type:

str

abstract condition(json_instance)[source]

Data 구축 시 filtering 될 조건

Parameters:

json_instance (zerohertzLib.util.Json) – Json instance

Returns:

Data 포함 여부

Return type:

bool

아래와 같이 상속을 통해 조건을 설정할 수 있다.

Examples

Condition:
class MakeDataCar(zz.util.MakeData):
    def condition(self, json_instance):
        key = json_instance._get_key("supercategory_name")
        category = json_instance._get_value(key)
        return category == "CityCar" or category == "Mid-size car"
Condition & Make Data:
class MakeDataCarDamage(zz.util.MakeData):
    def condition(self, json_instance):
        annotations = json_instance.get("annotations")
        return (annotations[0]["color"] in ["White", "Black"]) and (
            json_instance.get("supercategory_name") == "CityCar"
        )
    def make_data(self, json_instance, data_name):
        img = cv2.imread(os.path.join(self.start_data_path, data_name))
        for i, ant in enumerate(json_instance["annotations"]):
            label = ant["damage"]
            if not label is None:
                poly = ant["segmentation"]
                poly = np.array(poly[0][0])
                tmp = zz.vision.cutout(img, poly)
                h, w, _ = tmp.shape
                if 100 <= h <= 300 and 100 <= w <= 300:
                    file_name = ".".join(data_name.split(".")[:-1]) + f"_{i}"
                    xm, ym = poly[:, 0].min(), poly[:, 1].min()
                    poly -= (xm, ym)
                    cv2.imwrite(
                        os.path.join(
                            self.end_data_path,
                            f"{file_name}.png",
                        ),
                        tmp,
                    )
                    zz.util.write_json(
                        {"name": f"{file_name}.png", "poly": poly.tolist()},
                        os.path.join(self.end_json_path, file_name),
                    )
Make Data:
class MakeDataCarAugment(zz.util.MakeData):
    def make_data(self, json_instance, data_name):
        img = cv2.imread(
            random.choice(glob("*"))
        )
        target = cv2.imread(
            os.path.join(self.start_data_path, data_name), cv2.IMREAD_UNCHANGED
        )
        H, W, _ = img.shape
        h, w, _ = target.shape
        x, y = random.randrange(100, W - w - 100), random.randrange(100, H - h - 100)
        box = [x, y, x + w, y + h]
        img = zz.vision.paste(img, target, box, False, False)
        file_name = ".".join(data_name.split(".")[:-1])
        cv2.imwrite(
            os.path.join(
                self.end_data_path,
                f"{file_name}.png",
            ),
            img,
        )
make()[source]

Data 구축 실행

Warning

실행 시 target_path 삭제 후 구축 진행

Examples

>>> md = MakeData(start_data_path, start_json_path, json_key, target_path)
>>> md.make()
100%|█████████████| 403559/403559 [00:54<00:00, 7369.96it/s]
====================================================================================================
DATA PATH:       /.../data
JSON PATH:       /.../json
====================================================================================================
100%|█████████████| 403559/403559 [01:04<00:00, 6292.39it/s]
make_data(json_instance, data_name)[source]

Data 구축 방법 정의

Parameters:
  • json_instance (zerohertzLib.util.Json) – Json instance

  • data_name (str) – json_key 에 의해 출력된 data의 이름

Returns:

end_data_path, end_json_path 와 본 함수를 통해 data 구축

Return type:

None

zerohertzLib.util.find_ext(path='')[source]

경로 내 확장자의 수 탐색

Parameters:

path (Optional[str]) – 확장자를 찾을 경로

Returns:

확장자에 따른 file의 수

Return type:

Dict[str, int]

Examples

>>> zz.util.find_ext("test/data/")
defaultdict(<class 'int'>, {'test/data/json': 1, 'json': 2, 'jpg': 1, 'mov': 1})
zerohertzLib.util.read_csv(path, header=True)[source]

CSV (Comma-Separated Values) 혹은 TSV (Tab-Separated Values)를 작성하는 함수

Parameters:
  • path (str) – 입력될 CSV 혹은 TSV 경로 및 file 이름

  • header (Optional[bool]) – Header의 존재 유무

Returns:

Header의 값을 기반으로 column에 따라 List 로 구성

Return type:

Dict[Union[int, str], List[str]]

Note

Header가 존재하지 않는 경우 0 부터 차례대로 key 값 정의

Examples

>>> zz.util.read_csv("star_craft.csv")
defaultdict(<class 'list'>, {'id': ['5hi9', 'gor2', 'gk03'], 'Races': ['Protoss', 'Terran', 'Zerg'], 'Scores': ['1248', '2309', '291']})
>>> zz.util.read_csv("star_craft.tsv")
defaultdict(<class 'list'>, {'id': ['5hi9', 'gor2', 'gk03'], 'Races': ['Protoss', 'Terran', 'Zerg'], 'Scores': ['1248', '2309', '291']})
>>> zz.util.read_csv("star_craft.csv", header=False)
defaultdict(<class 'list'>, {0: ['id', '5hi9', 'gor2', 'gk03'], 1: ['Races', 'Protoss', 'Terran', 'Zerg'], 2: ['Scores', '1248', '2309', '291']})
>>> zz.util.read_csv("star_craft.tsv", header=False)
defaultdict(<class 'list'>, {0: ['id', '5hi9', 'gor2', 'gk03'], 1: ['Races', 'Protoss', 'Terran', 'Zerg'], 2: ['Scores', '1248', '2309', '291']})
zerohertzLib.util.rmtree(path)[source]

지정한 경로의 file을 삭제하고 다시 생성하는 함수

Parameters:

path (str) – 삭제 후 생성할 경로

Returns:

None

Examples

>>> os.listdir("tmp")
['test']
>>> zz.util.rmtree("tmp")
>>> os.listdir("tmp")
[]
zerohertzLib.util.sort_dict(target, order=None)[source]

Dictionary를 순서에 맞춰 재배열하는 함수

Parameters:
  • target (Dict) – 입력 dictionary

  • order (Optional[List]) – 재배열 순서

Returns:

재배열이 완료된 dictionary

Return type:

Dict

Examples

>>> zz.util.sort_dict({3: 6, 4: 2, 2: 7})
{2: 7, 3: 6, 4: 2}
>>> zz.util.sort_dict({3: 6, 4: 2, 2: 7}, [4, 2, 3])
{4: 2, 2: 7, 3: 6}
>>> zz.util.sort_dict({"C": 6, "D": 2, "A": 7})
{'A': 7, 'C': 6, 'D': 2}
>>> zz.util.sort_dict({"C": 6, "D": 2, "A": 7}, ["D", "C"])
{'D': 2, 'C': 6}
zerohertzLib.util.write_csv(data, path, tsv=False)[source]

CSV (Comma-Separated Values) 혹은 TSV (Tab-Separated Values)를 작성하는 함수

Parameters:
  • data (List[List[Any]]) – 입력 data (header 포함 무관)

  • path (str) – 출력될 CSV 혹은 TSV 경로 및 file 이름

  • tsv (Optional[bool]) – TSV 작성 여부

Returns:

File의 절대 경로

Return type:

str

Examples

>>> zz.util.write_csv([["id", "Races", "Scores"], ["5hi9", "Protoss", 1248], ["gor2", "Terran", 2309], ["gk03", "Zerg", 291]], "zerohertzLib/star_craft")
'/.../star_craft.csv'
>>> zz.util.write_csv([["id", "Races", "Scores"], ["5hi9", "Protoss", 1248], ["gor2", "Terran", 2309], ["gk03", "Zerg", 291]], "zerohertzLib/star_craft", True)
'/.../star_craft.tsv'
zerohertzLib.util.write_json(data, path)[source]

JSON (JavaScript Object Notation)을 작성하는 함수

Parameters:
  • data (Union[Dict[Any, Any], List[Dict[Any, Any]]]) – 입력 data (header 포함 무관)

  • path (str) – 출력될 JSON file의 경로 및 이름

Returns:

File의 절대 경로

Return type:

str

Examples

>>> zz.util.write_json([{"id": "4169", "전투력": 4209, "정보": ["아무", "거나"]}]*100, "zerohertzLib/star_craft")
'/.../star_craft.json'
[
    {
        "id": "4169",
        "전투력": 4209,
        "정보": [
            "아무",
            "거나"
        ]
    },
    {
        "id": "4169",
        "전투력": 4209,
        "정보": [
            "아무",
            "거나"
        ]
    },
...