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]
- __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'
- 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]
- __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]
- 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:
- 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:
- 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:
- 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:
- 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, "정보": [ "아무", "거나" ] }, ...