一、项目简介
报名了百度大脑AIStudio练习赛AI识虫,有7类虫子数据,通过检测算法将检测结果按照一定格式保存到json,在线提交。具体https://aistudio.baidu.com/aistudio/competition/detail/24?_=1598419570312
二、提交格式
json文件中保存着测试结果,是包含所有图片预测结果的list,其构成如下:
[[img_name, [[label, score, x1, x2, y1, y2], …, [label, score, x1, x2, y1, y2]]], [img_name, [[label, score, x1, x2, y1, y2], …, [label, score, x1, x2, y1, y2]]], … [img_name, [[label, score, x1, x2, y1, y2],…, [label, score, x1, x2, y1, y2]]]]
list中的每一个元素是一张图片的预测结果,list的总长度等于图片的数目 。
每张图片预测结果的格式是:
[img_name, [[label, score, x1, x2, y1, y2],…, [label, score, x1, x2, y1, y2]]]
其中第一个元素是图片名称image_name,第二个元素是包含该图片所有预测框的list,
预测框列表:[[label, score, x1, x2, y1, y2],…, [label, score, x1, x2, y1, y2]]
预测框列表中每个元素[label, score, x1, x2, y1, y2]描述了一个预测框,label是预测框所属类别标签,score是预测框的得分;x1, x2, y1, y2对应预测框左上角坐标(x1, y1),右下角坐标(x2, y2)。每张图片可能有很多个预测框,则将其全部放在预测框列表中。
三、发现问题
按照课程代码生成的“pred_results.json”,在线提交没问题,但是自己本地训练,按照上述“二、提交格式”代码实现生成json上传,在线测评结果很差,不敢相信。检测结果打印图上还是能看出有不少正确的,提交得分烂透了,于是考虑可能是保存格式问题。
最初,我是完全按照“二、提交格式” [label, score, x1, x2, y1, y2] 左上角坐标(x1, y1),右下角坐标(x2, y2) 进行保存的,提交结果如上图所示,score:0、0.00959、4.94523、5.46591,Amazing !
后来,下载在线训练的结果,将结果按照 [label, score, x1, x2, y1, y2] 打印到原图,结果乱糟糟的,这不应该啊!
def draw_paddlejson(paddlejson, images):
with open(paddlejson, "r") as f_r:
datas_list = json.load(f_r)
for data_list in datas_list:
img_id = data_list[0]
img_path = os.path.join(images, img_id + ".jpeg")
img = cv2.imread(img_path)
objects = data_list[1]
for j, obj in enumerate(objects):
label, score, xmin, xmax, ymin, ymax = list(map(int, obj)) #按照提交格式
cv2.rectangle(img, (xmin, ymin), (xmax, ymax), (0, 0, 255), 1, 1)
cv2.putText(img, str(label), (xmin, ymin), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 20*j), 2)
cv2.namedWindow("image", 0)
cv2.imshow("image", img)
cv2.waitKey(0)
这说明,在线训练保存的格式和要求的“二、提交格式”是不一样的。于是尝试调整:xywh、xyxy
def draw_paddlejson(paddlejson, images):
with open(paddlejson, "r") as f_r:
datas_list = json.load(f_r)
for data_list in datas_list:
img_id = data_list[0]
img_path = os.path.join(images, img_id + ".jpeg")
img = cv2.imread(img_path)
objects = data_list[1]
for j, obj in enumerate(objects):
# label, score, xmin, xmax, ymin, ymax = list(map(int, obj)) #按照提交格式
label, score, xmin, ymin, xmax, ymax = list(map(int, obj)) #更正后,正确格式
cv2.rectangle(img, (xmin, ymin), (xmax, ymax), (0, 0, 255), 1, 1)
cv2.putText(img, str(label), (xmin, ymin), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 20*j), 2)
cv2.namedWindow("image", 0)
cv2.imshow("image", img)
cv2.waitKey(0)
检测结果是OK的了!
于是将保存格式调整:[label, score, x1, y1, x2, y2] 左上角坐标(x1, y1),右下角坐标(x2, y2),这是正确格式!从新提交,得分正常了。
四、总结
得分不高不低!结果不重要,重要的是过程@_@(OS:是为了学习,不是为了得高分拿奖品,好吧!我酸了!)