Skip to content

Commit 5b1c2f2

Browse files
committed
Support yolov5 to yolov8
1 parent b234e99 commit 5b1c2f2

11 files changed

+214
-1
lines changed

label_convert/yolov5_to_coco.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def _init_json(self):
8080
]
8181

8282
def append_bg_img(self, img_list):
83-
bg_dir = self.data_dir / "background_images"
83+
bg_dir = self.data_dir / "non_labels"
8484
if bg_dir.exists():
8585
bg_img_list = list(bg_dir.iterdir())
8686
for bg_img_path in bg_img_list:

label_convert/yolov5_to_yolov8.py

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
# -*- encoding: utf-8 -*-
2+
# @Author: SWHL
3+
# @Contact: [email protected]
4+
import argparse
5+
import shutil
6+
from pathlib import Path
7+
from typing import Tuple, Union
8+
9+
from tqdm import tqdm
10+
11+
ValueType = Union[str, Path, None]
12+
13+
14+
class YOLOV5ToYOLOV8:
15+
def __init__(self, data_dir: ValueType = None, save_dir: ValueType = None):
16+
if data_dir is None:
17+
raise ValueError("data_dir must not be None")
18+
self.data_dir = Path(data_dir)
19+
self.verify_exists(self.data_dir)
20+
21+
self.img_dir = self.data_dir / "images"
22+
self.verify_exists(self.img_dir)
23+
24+
self.label_dir = self.data_dir / "labels"
25+
self.verify_exists(self.label_dir)
26+
27+
if save_dir is None:
28+
save_dir = self.data_dir.parent / f"{Path(self.data_dir).name}_yolov8"
29+
self.save_dir = save_dir
30+
self.mkdir(self.save_dir)
31+
32+
self.save_img_dir = save_dir / "images"
33+
self.mkdir(self.save_img_dir)
34+
35+
self.save_label_dir = save_dir / "labels"
36+
self.mkdir(self.save_label_dir)
37+
38+
def __call__(self, mode_list: Tuple[str] = ("train", "val")):
39+
if not mode_list:
40+
raise ValueError("mode_list is empty!!")
41+
42+
for mode in tqdm(mode_list):
43+
txt_path = self.data_dir / f"{mode}.txt"
44+
self.verify_exists(txt_path)
45+
img_list = self.read_txt(txt_path)
46+
47+
save_mode_img_dir = self.save_img_dir / mode
48+
self.mkdir(save_mode_img_dir)
49+
50+
save_mode_label_dir = self.save_label_dir / mode
51+
self.mkdir(save_mode_label_dir)
52+
53+
# copy images to new img dir
54+
for img_path in img_list:
55+
img_full_path = self.data_dir / img_path
56+
shutil.copy(img_full_path, save_mode_img_dir)
57+
58+
label_path = self.label_dir / Path(img_path).with_suffix(".txt").name
59+
shutil.copy(label_path, save_mode_label_dir)
60+
61+
print(f"Successfully convert, detail in {self.save_dir}")
62+
63+
@staticmethod
64+
def read_txt(txt_path):
65+
with open(str(txt_path), "r", encoding="utf-8") as f:
66+
data = list(map(lambda x: x.rstrip("\n"), f))
67+
return data
68+
69+
@staticmethod
70+
def mkdir(dir_path):
71+
Path(dir_path).mkdir(parents=True, exist_ok=True)
72+
73+
@staticmethod
74+
def verify_exists(file_path: Union[Path, str]):
75+
if not Path(file_path).exists():
76+
raise FileNotFoundError(f"The {file_path} is not exists!!!")
77+
78+
79+
def main():
80+
parser = argparse.ArgumentParser("Datasets converter from YOLOV5 to COCO")
81+
parser.add_argument(
82+
"--data_dir",
83+
type=str,
84+
default="tests/test_files/yolov5_dataset",
85+
help="Dataset root path",
86+
)
87+
parser.add_argument("--save_dir", type=str, default=None)
88+
parser.add_argument(
89+
"--mode_list", type=str, default="train,val", help="generate which mode"
90+
)
91+
args = parser.parse_args()
92+
93+
converter = YOLOV5ToYOLOV8(args.data_dir, args.save_dir)
94+
converter(mode_list=args.mode_list.split(","))
95+
96+
97+
if __name__ == "__main__":
98+
main()

label_convert/yolov8_to_yolov5.py

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
# -*- encoding: utf-8 -*-
2+
# @Author: SWHL
3+
# @Contact: [email protected]
4+
import argparse
5+
import shutil
6+
from pathlib import Path
7+
from typing import Tuple, Union
8+
9+
from tqdm import tqdm
10+
11+
ValueType = Union[str, Path, None]
12+
13+
14+
class YOLOV8ToYOLOV5:
15+
def __init__(self, data_dir: ValueType = None, save_dir: ValueType = None):
16+
if data_dir is None:
17+
raise ValueError("data_dir must not be None")
18+
self.data_dir = Path(data_dir)
19+
self.verify_exists(self.data_dir)
20+
21+
self.img_dir = self.data_dir / "images"
22+
self.verify_exists(self.img_dir)
23+
24+
self.label_dir = self.data_dir / "labels"
25+
self.verify_exists(self.label_dir)
26+
27+
if save_dir is None:
28+
save_dir = self.data_dir.parent / f"{Path(self.data_dir).name}_yolov8"
29+
self.save_dir = save_dir
30+
self.mkdir(self.save_dir)
31+
32+
self.save_img_dir = save_dir / "images"
33+
self.mkdir(self.save_img_dir)
34+
35+
self.save_label_dir = save_dir / "labels"
36+
self.mkdir(self.save_label_dir)
37+
38+
def __call__(self, mode_list: Tuple[str] = ("train", "val")):
39+
if not mode_list:
40+
raise ValueError("mode_list is empty!!")
41+
42+
for mode in tqdm(mode_list):
43+
txt_path = self.data_dir / f"{mode}.txt"
44+
self.verify_exists(txt_path)
45+
img_list = self.read_txt(txt_path)
46+
47+
save_mode_img_dir = self.save_img_dir / mode
48+
self.mkdir(save_mode_img_dir)
49+
50+
save_mode_label_dir = self.save_label_dir / mode
51+
self.mkdir(save_mode_label_dir)
52+
53+
# copy images to new img dir
54+
for img_path in img_list:
55+
img_full_path = self.data_dir / img_path
56+
shutil.copy(img_full_path, save_mode_img_dir)
57+
58+
label_path = self.label_dir / Path(img_path).with_suffix(".txt").name
59+
shutil.copy(label_path, save_mode_label_dir)
60+
61+
print(f"Successfully convert, detail in {self.save_dir}")
62+
63+
@staticmethod
64+
def read_txt(txt_path):
65+
with open(str(txt_path), "r", encoding="utf-8") as f:
66+
data = list(map(lambda x: x.rstrip("\n"), f))
67+
return data
68+
69+
@staticmethod
70+
def mkdir(dir_path):
71+
Path(dir_path).mkdir(parents=True, exist_ok=True)
72+
73+
@staticmethod
74+
def verify_exists(file_path: Union[Path, str]):
75+
if not Path(file_path).exists():
76+
raise FileNotFoundError(f"The {file_path} is not exists!!!")
77+
78+
79+
def main():
80+
parser = argparse.ArgumentParser("Datasets converter from YOLOV5 to COCO")
81+
parser.add_argument(
82+
"--data_dir",
83+
type=str,
84+
default="tests/test_files/yolov5_dataset",
85+
help="Dataset root path",
86+
)
87+
parser.add_argument("--save_dir", type=str, default=None)
88+
parser.add_argument(
89+
"--mode_list", type=str, default="train,val", help="generate which mode"
90+
)
91+
parser.add_argument("--yaml_path", type=str, default=None)
92+
args = parser.parse_args()
93+
94+
converter = YOLOV8ToYOLOV5(args.data_dir, args.save_dir)
95+
converter(mode_list=args.mode_list.split(","))
96+
97+
98+
if __name__ == "__main__":
99+
main()
21.2 KB
Loading
15.9 KB
Loading
17.3 KB
Loading
7.68 KB
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
0 0.3716715984375 0.41050295937500003 0.401257396875 0.3272928984375 0.41605029531250004 0.22744082968749998 0.35872780937500004 0.1756656796875 0.2921597640625 0.17011834374999998 0.238535503125 0.14977810625000001 0.20894970468750002 0.12019230781250001 0.1923076921875 0.11279585781250001 0.15162721875000001 0.11279585781250001 0.12019230781250001 0.123890534375 0.0924556203125 0.1386834328125 0.05917159843749999 0.17751479375 0.0480769234375 0.21819526718749999 0.0573224859375 0.3254437859375 0.1109467453125 0.390162721875 0.21449704062500002 0.43269230781249995 0.3716715984375 0.41050295937500003
2+
0 0.06841715937500001 0.8265532546875001 0.15902366875 0.867233728125 0.2625739640625 0.8468934906250001 0.3291420125 0.7618343203125 0.35318047343750003 0.669378696875 0.31989645 0.5898668625 0.2644230765625 0.571375740625 0.22928994062500002 0.5824704140625 0.1830621296875 0.552884615625 0.12019230781250001 0.560281065625 0.0314349109375 0.6065088750000001 0 0.7100591703125 0.0388313609375 0.78772189375 0.06841715937500001 0.8265532546875001
3+
0 0.5732248515625 0.519600590625 0.6508875749999999 0.528846153125 0.680473371875 0.501109465625 0.6841715984375 0.48076923125000004 0.7193047328125 0.4419378703125 0.7451923078125 0.40495562031250004 0.77847633125 0.3476331375 0.7766272187500001 0.330991125 0.76553254375 0.2736686390625 0.7451923078125 0.21449704062500002 0.713757396875 0.1756656796875 0.687869821875 0.1553254453125 0.6675295859375 0.13313609375 0.6471893484375 0.1183431953125 0.5954142015625 0.1183431953125 0.560281065625 0.123890534375 0.5159023671875 0.1664201171875 0.5094897671874999 0.2353555578125 0.5214497046875 0.286612425 0.48076923125000004 0.3254437859375 0.45673076874999996 0.377218934375 0.4678254453125 0.44563609375 0.510355028125 0.5122041421875 0.5732248515625 0.519600590625
4+
0 0.5954142015625 0.8949704140625 0.6268491125 0.8857248515625 0.689718934375 0.8487426031249999 0.7636834328125001 0.7377958578125 0.7525887578125 0.63239645 0.6915680484375 0.5510355031249999 0.6157544374999999 0.538091715625 0.545488165625 0.5436390531249999 0.4974112421875 0.560281065625 0.43823964374999996 0.6527366875 0.44748520625 0.7193047328125 0.4881656796875 0.78402366875 0.5232988171875 0.841346153125 0.5954142015625 0.8949704140625
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
0 0.274554 0.205357 0.388393 0.383929
2+
0 0.754464 0.207589 0.375000 0.379464
3+
0 0.504464 0.511161 0.339286 0.343750
4+
0 0.243304 0.792411 0.379464 0.379464
5+
0 0.774554 0.796875 0.370536 0.370536
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
0 0.0166420125 0.6231508875 0.040680473437499996 0.6582840234375 0.07211538437500001 0.6860207093749999 0.12204142031250001 0.6860207093749999 0.16457100468750002 0.6471893484375 0.12573964375 0.5898668625 0.079511834375 0.5399408296875 0.055473371875 0.5491863890625 0.012943785937499999 0.5843195265625 0.0166420125 0.6231508875
2+
0 0.46597633125 0.7433431953125 0.48076923125000004 0.739644971875 0.49371301718750005 0.693417159375 0.4585798828125 0.6490384609375 0.399408284375 0.6120562140625 0.3698224859375 0.6009615390625 0.3254437859375 0.5861686390624999 0.26627219062499996 0.6009615390625 0.2644230765625 0.6213017734374999 0.2644230765625 0.625 0.2699704140625 0.6749260359375 0.3291420125 0.713757396875 0.393860946875 0.7359467453125 0.46597633125 0.7433431953125
3+
0 0.704511834375 0.6860207093749999 0.7451923078125 0.636094675 0.7267011828125 0.588017753125 0.6860207093749999 0.526997040625 0.63239645 0.5510355031249999 0.571375740625 0.5972633125 0.5732248515625 0.6434911249999999 0.5935650890625 0.687869821875 0.661982246875 0.721153846875 0.704511834375 0.6860207093749999
4+
0 0.27181952656249997 0.41420118281249996 0.31989645 0.393860946875 0.3365384609375 0.3439349109375 0.3346893484375 0.301405325 0.3439349109375 0.28476331250000003 0.380917159375 0.24963017812500002 0.393860946875 0.19600591875 0.366124259375 0.1312869828125 0.30880177343750004 0.1017011828125 0.26627219062499996 0.1109467453125 0.20525147812500003 0.1090976328125 0.16272189374999999 0.13498520625 0.12019230781250001 0.16087278124999999 0.099852071875 0.257026628125 0.1368343203125 0.36427514843750003 0.17936390625 0.403106509375 0.22559171562500002 0.41605029531250004 0.27181952656249997 0.41420118281249996
5+
0 0.6009615390625 0.2810650890625 0.6268491125 0.24963017812500002 0.6342455625000001 0.22559171562500002 0.6545857984375 0.20525147812500003 0.6397928984375 0.1571745546875 0.61760355 0.11649408125 0.5639792906250001 0.105399409375 0.5048076921875 0.1553254453125 0.49926035625000004 0.188609465625 0.501109465625 0.247781065625 0.5343934906250001 0.2773668625 0.6009615390625 0.2810650890625
6+
0 0.9837278093749999 0.1997041421875 0.9948224859374999 0.1553254453125 0.9615384609375001 0.107248521875 0.9079142015624999 0.073964496875 0.8653846156249999 0.070266271875 0.79326923125 0.1183431953125 0.80251479375 0.16087278124999999 0.8450443796875 0.197855028125 0.919008875 0.20894970468750002 0.9837278093749999 0.1997041421875

0 commit comments

Comments
 (0)