paddledetection推理结果保存为txt

1、通常的推理结果保存方法

在PaddleDetection2中通过infer.py可以进行单个文件的推理,也可以进行多个文件的推理。

单个文件推理命令:python tools/infer.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml \
                    --infer_img=demo/road554.png \
                    --output_dir=infer_output/ \
                    --draw_threshold=0.5 \
                    -o weights=output/yolov3_mobilenet_v1_roadsign/model_final \
                    --use_vdl=Ture

文件夹推理命令:python3 tools/infer.py -c ~/PaddleDetection/configs/yolox/yolox_s_300e_coco.yml \
    -o weights=/home/aistudio/PaddleDetection/output/yolox_s_300e_coco/best_model.pdparams \
    --infer_dir=/home/aistudio/test_img \
    --save_results=True\
    --output_dir ./result

通过save_results参数可以保存结果,但是无法精确到特定文件。通过save_results保存的结果由bbox.json和系列jpg文件所构成,具体输出信息如下所示。

2、保存结果的格式 

bbox.json 是一个json对象,包含了所有图像,所有的预测框。但是却是以id来代表特定jpg图片的,也就是说通过bbox.json可以获取结果,但是无法知道这个结果是哪个jpg图片的。通过下面可以可以输出bbox的信息,输出的信息如图2所示。

import json
path_example = r'/home/aistudio/PaddleDetection/result/bbox.json'
with open(path_example, 'r') as load_f:
    load_dict = json.load(load_f)
    print(len(load_dict))
    for i in range(10):
        print(load_dict[i])

paddet保存的图像如下所示,其中标注框的颜色是随机的,不同的图片中标注框颜色有所不同。

 

 3、保存txt方法

博主对infer.py的代码进行分析,没有找到保存结果为txt的参数设置。因此,需要在Paddledetection/ppdet/engine/trainer.py的class Trainer(object)前定义保存txt结果的方法。具体代码如下所示,其中class_label需要按照个人label的实际情况进行调整。

class_label=['背景','shoot']
def save_result_txt(save_path,boxs,threshold=0.5):#,tszie=640,osize=608
    with open(save_path,'w') as f:
        for msg in boxs:
            if msg['score']>threshold:
                bbox=msg['bbox']
                x1,y1,w,h=bbox
                bbox=np.array([x1,y1,x1+w,y1+h])
                #bbox=bbox*(tszie/osize)
                bbox=bbox.astype(np.int32)
                x1,y1,x2,y2=bbox
                strs='%s %s %s %s %s %s\n'%(class_label[msg['category_id']],msg['score'],x1,y1,x2,y2)
                f.write(strs)

 添加完保存代码后,需要在Trainer的predict中进行调用,具体调用代码如下所示

                save_path = os.path.splitext(save_name)[0] + '.txt'
                save_result_txt(save_path,bbox_res,threshold=0.5)

4、校验txt结果

进行上述代码修改后,重新进行推理,这样子jpg和txt结果就会保存到特定目录。 

通过以下代码,随机选取一个图像,将其txt结果进行可视化,可以发现保存的txt结果是完全正确的(ppdet绘制的红色框与加载txt绘制的蓝色框完全重合)。且,保存结果时不用考虑图像分辨的变化(如图像分辨率是608,而模型输入的分辨率是640),通过infer推理出的结果内置了分辨率调整。

from PIL import Image,ImageDraw
from imgutils import *
path='/home/aistudio/PaddleDetection/result/shoot16_4.jpg'
im=Image.open(path)
draw = ImageDraw.Draw(im)
with open(path.replace('.jpg','.txt')) as f:
    lines=f.readlines()
    print(lines)
    for line in lines:
        alls=line.split(' ')[2:]
        alls=[int(s) for s in alls]
        x,y,w,h=alls
        draw.rectangle([x,y,w,h], outline ="blue")
myimshow(np.array(im),size=12)

 

猜你喜欢

转载自blog.csdn.net/a486259/article/details/125727805