|
import argparse |
|
import json |
|
import os |
|
|
|
train_rate = 0.6 |
|
val_rate = 0.2 |
|
test_rate = 0.2 |
|
|
|
|
|
def save_json(content, path, filename): |
|
if not os.path.exists(path): |
|
os.makedirs(path, exist_ok=True) |
|
dst_file_name = os.path.join(path, filename) |
|
with open(dst_file_name, "w+") as fp: |
|
json.dump(content, fp, indent=4, separators=(",", ":")) |
|
|
|
|
|
def generate_labels(data_path, output_path): |
|
""" |
|
Loading a model by name. |
|
|
|
Args: |
|
data_path: path to classification dataset, which must contain `inbody` and `outbody` directories. |
|
output_path: path to save labels |
|
""" |
|
|
|
data_list = [os.path.join(root, x) for root, _, filenames in os.walk(data_path) for x in filenames if "jpg" in x] |
|
label_list = [int("outbody" in os.path.basename(os.path.dirname(x))) for x in data_list] |
|
data_label_json = [{"image": x, "label": y} for x, y in zip(data_list, label_list)] |
|
inbody_list = list(filter(lambda x: x["label"] == 0, data_label_json)) |
|
outbody_list = list(filter(lambda x: not (x["label"] == 0), data_label_json)) |
|
inbody_train_len = int(len(inbody_list) * train_rate) |
|
outbody_train_len = int(len(outbody_list) * train_rate) |
|
inbody_val_len = int(len(inbody_list) * (train_rate + val_rate)) |
|
outbody_val_len = int(len(outbody_list) * (train_rate + val_rate)) |
|
inbody_train_list = inbody_list[:inbody_train_len] |
|
outbody_train_list = outbody_list[:outbody_train_len] |
|
inbody_val_list = inbody_list[inbody_train_len:inbody_val_len] |
|
outbody_val_list = outbody_list[outbody_train_len:outbody_val_len] |
|
inbody_test_list = inbody_list[inbody_val_len:] |
|
outbody_test_list = outbody_list[outbody_val_len:] |
|
train_list = inbody_train_list + outbody_train_list |
|
val_list = inbody_val_list + outbody_val_list |
|
test_list = inbody_test_list + outbody_test_list |
|
save_json(train_list, out_path, "train_samples.json") |
|
save_json(val_list, out_path, "val_samples.json") |
|
save_json(test_list, out_path, "test_samples.json") |
|
|
|
|
|
if __name__ == "__main__": |
|
parser = argparse.ArgumentParser() |
|
|
|
parser.add_argument( |
|
"--datapath", |
|
type=str, |
|
default=r"/workspace/data/endoscopic_inbody_classification", |
|
help="The root path of the inbody classification dataset.", |
|
) |
|
|
|
|
|
parser.add_argument("--outpath", type=str, default=r"./label", help="The output path of labels.") |
|
|
|
args = parser.parse_args() |
|
data_path = args.datapath |
|
out_path = args.outpath |
|
|
|
if not os.path.exists(out_path): |
|
os.makedirs(out_path, exist_ok=True) |
|
generate_labels(data_path, out_path) |
|
|