在做目标检测的时候,模型总是会学到一些局部信息,比如总把红色的东西识别成灭火器。为了构造对抗样本,考虑在标注范围内随机裁剪子区域作为负样本。
name = 'test'
label_path = path_label + name + '.txt'
img_path = path_img + name + '.jpg'
# print(img_path)
img_none=cv2.imread(img_path)
# print(img_none)
ww, hh = img_none.shape[0], img_none.shape[1]
# print(ww, hh)
label_ = []
with open(label_path, mode='r', encoding = "utf-8") as fin:
finl = fin.readlines()
for i in finl: #这部分是把yolov5的标注进行复原
il = i.replace('\n','')
il = i.split(' ')
# print(int(il[0]))
x,y,w,h = float(il[1]), float(il[2]), float(il[3]), float(il[4])
x *= ww
w *= ww
y *= hh
h *= hh
x_max = int(((x+1)*2+w)/2)
x_min = int(((x+1)*2-w)/2)
y_max = int(((y+1)*2+h)/2)
y_min = int(((y+1)*2-h)/2)
label_.append([x_min, x_max, y_min, y_max])
# print(x_min, x_max, y_min, y_max)
j = -1
for ll in label_:
j += 1
x_min, x_max, y_min, y_max = ll[0], ll[1], ll[2], ll[3]
# print(x_min, x_max, y_min, y_max)
sw = int((x_max-x_min)*0.2)
sh = int((y_max-y_min)*0.2)
for i in range(3): # 取3个子区域
x=random.randint(x_min, x_max-sw)
y=random.randint(y_min, y_max-sh)
# print('({},{})'.format(x,y))
res=img_none[x:x+sw,y:y+sh] #子区域
cv2.imwrite(out_path+name+'_'+str(j)+'_'+str(i)+'.jpg',res)
参考:https://blog.csdn.net/a272881819/article/details/121979255