|
import os |
|
import argparse |
|
|
|
import onnxruntime as ort |
|
from utils import * |
|
|
|
|
|
CFG = { |
|
"name": "mobilenet0.25", |
|
"min_sizes": [[16, 32], [64, 128], [256, 512]], |
|
"steps": [8, 16, 32], |
|
"variance": [0.1, 0.2], |
|
"clip": False, |
|
} |
|
INPUT_SIZE = [608, 640] |
|
DEVICE = torch.device("cpu") |
|
|
|
|
|
def save_result(img_name, dets, save_folder): |
|
"""Save detection results |
|
Args: |
|
img_name: origin image name |
|
dets: detection results |
|
save_folder: results path |
|
""" |
|
if not os.path.exists(save_folder): |
|
os.makedirs(save_folder) |
|
save_name = save_folder + img_name[:-4] + ".txt" |
|
dirname = os.path.dirname(save_name) |
|
if not os.path.isdir(dirname): |
|
os.makedirs(dirname) |
|
with open(save_name, "w") as fw: |
|
bboxs = dets |
|
file_name = os.path.basename(save_name)[:-4] + "\n" |
|
bboxs_num = str(len(bboxs)) + "\n" |
|
fw.write(file_name) |
|
fw.write(bboxs_num) |
|
for box in bboxs: |
|
x = int(box[0]) |
|
y = int(box[1]) |
|
w = int(box[2]) - int(box[0]) |
|
h = int(box[3]) - int(box[1]) |
|
confidence = str(box[4]) |
|
line = (str(x) + " " + str(y) + " " + str(w) + " " + str(h) + " " + confidence + " \n") |
|
fw.write(line) |
|
|
|
|
|
def Retinaface_evalute(run_ort, args): |
|
"""Retinaface_evalute function |
|
Args: |
|
run_ort : run_ort to evaluate. |
|
args : parser parameter. |
|
Returns: |
|
predict result : under "--save_folder" path. |
|
""" |
|
|
|
testset_folder = args.dataset_folder |
|
testset_list = args.dataset_folder[:-7] + "wider_val.txt" |
|
|
|
with open(testset_list, "r") as fr: |
|
test_dataset = fr.read().split() |
|
num_images = len(test_dataset) |
|
|
|
|
|
for i, img_name in enumerate(test_dataset): |
|
image_path = testset_folder + img_name |
|
img_raw = cv2.imread(image_path, cv2.IMREAD_COLOR) |
|
|
|
img, scale, resize = preprocess(img_raw, INPUT_SIZE, DEVICE) |
|
|
|
img = np.transpose(img, (0, 2, 3, 1)) |
|
|
|
outputs = run_ort.run(None, {run_ort.get_inputs()[0].name: img}) |
|
|
|
dets = postprocess(CFG, img, outputs, scale, resize, args.confidence_threshold, args.nms_threshold, DEVICE) |
|
|
|
|
|
save_result(img_name, dets, args.save_folder) |
|
print("im_detect: {:d}/{:d}".format(i + 1, num_images)) |
|
|
|
|
|
if __name__ == '__main__': |
|
parser = argparse.ArgumentParser(description="Retinaface") |
|
parser.add_argument( |
|
"-m", |
|
"--trained_model", |
|
default="./weights/RetinaFace_int.onnx", |
|
type=str, |
|
help="Trained state_dict file path to open", |
|
) |
|
parser.add_argument( |
|
"--save_folder", |
|
default="./widerface_evaluate/widerface_txt/", |
|
type=str, |
|
help="Dir to save txt results", |
|
) |
|
parser.add_argument( |
|
"--dataset_folder", |
|
default="./data/widerface/val/images/", |
|
type=str, |
|
help="dataset path", |
|
) |
|
parser.add_argument( |
|
"--confidence_threshold", |
|
default=0.02, |
|
type=float, |
|
help="confidence_threshold", |
|
) |
|
parser.add_argument( |
|
"--nms_threshold", |
|
default=0.4, |
|
type=float, |
|
help="nms_threshold", |
|
) |
|
parser.add_argument( |
|
"--ipu", |
|
action="store_true", |
|
help="Use IPU for inference.", |
|
) |
|
parser.add_argument( |
|
"--provider_config", |
|
type=str, |
|
default="vaip_config.json", |
|
help="Path of the config file for seting provider_options.", |
|
) |
|
|
|
args = parser.parse_args() |
|
if args.ipu: |
|
providers = ["VitisAIExecutionProvider"] |
|
provider_options = [{"config_file": args.provider_config}] |
|
else: |
|
providers = ['CUDAExecutionProvider', 'CPUExecutionProvider'] |
|
provider_options = None |
|
|
|
print("Loading pretrained model from {}".format(args.trained_model)) |
|
run_ort = ort.InferenceSession(args.trained_model, providers=providers, provider_options=provider_options) |
|
|
|
Retinaface_evalute(run_ort, args) |