1、不考虑crop后物体与crop前的IoU:
def crop_im_annos(self, data):
pim = cv2.imread(data["filename"])
height, width = pim.shape[0:2]
lugg_anno = copy.deepcopy(data["luggage_annos"])
if len(data["luggage_annos"]) > 1:
ped_anno = copy.deepcopy(data["pedestrain_annos"])
ped_box = [ped_anno["x"], ped_anno["y"], ped_anno["x"] + ped_anno["width"] - 1,
ped_anno["y"] + ped_anno["height"] - 1]
left_xcoord = max(0, ped_anno["x"] - 0.65 * ped_anno["width"])
right_xcoord = min(width, ped_anno["x"] + ped_anno["width"] - 1 + 0.65 * ped_anno["width"])
right_ycoord = min(height,
ped_anno["y"] + ped_anno["height"] - 1 + 0.15 * ped_anno["height"])
pim = pim[int(ped_anno["y"]):int(right_ycoord), int(left_xcoord):int(right_xcoord)]
for la in lugg_anno:
offset = la["x"] - left_xcoord
la["x"] = max(0, offset)
la["y"] = max(0, la["y"] - ped_anno["y"])
if la["x"] > ped_anno["x"] - left_xcoord:
la["width"] = min(la["width"], (right_xcoord - left_xcoord) - la["x"])
la["height"] = min(la["height"], (right_ycoord - ped_anno["y"]) - la["y"])
else:
if la["x"] == 0:
la["width"] = la["width"] + offset
la["height"] = min(la["height"], (right_ycoord - ped_anno["y"]) - la["y"])
return pim, lugg_anno
2、考虑crop后物体与crop前的IoU:
def crop_im_annos(self, data):
pim = cv2.imdecode(np.fromfile(data["filename"]), 1)
if pim is None:
pim = cv2.imread(data["filename"], 1)
anno = copy.deepcopy(data["annotations"])
height, width = pim.shape[0:2]
if len(data["pedes_annotations"]) > 0:
ped_anno = copy.deepcopy(data["pedes_annotations"])[0]
knife_anno = copy.deepcopy(data["knife_annotations"])[0]
ped_box = [ped_anno["x"], ped_anno["y"], ped_anno["x"] + ped_anno["width"] - 1,
ped_anno["y"] + ped_anno["height"] - 1]
left_xcoord = max(0, ped_anno["x"] - 0.25 * ped_anno["width"])
right_xcoord = min(width, ped_anno["x"] + ped_anno["width"] - 1 + 0.25 * ped_anno["width"])
left_ycoord = max(0,
ped_anno["y"] - 0.15 * ped_anno["height"])
res_pim = pim[int(left_ycoord):int(ped_anno["y"] + ped_anno["height"]), int(left_xcoord):int(right_xcoord)]
for i, s_anno in enumerate(anno):
s_anno["x1"] = s_anno["x"]
s_anno["y1"] = s_anno["y"]
s_anno["x2"] = s_anno["x"] + s_anno["width"] - 1
s_anno["y2"] = s_anno["y"] + s_anno["height"] - 1
s_anno["x1"] = max(0, s_anno["x1"] - left_xcoord)
s_anno["y1"] = max(0, s_anno["y1"] - left_ycoord)
s_anno["x2"] = min(right_xcoord - left_xcoord, s_anno["x2"] - left_xcoord)
s_anno["y2"] = max(0, s_anno["y2"] - left_ycoord)
g_anno_w = data["annotations"][i]["width"]
g_anno_h = data["annotations"][i]["height"]
s_anno_w = s_anno["x2"] - s_anno["x1"]
s_anno_h = s_anno["y2"] - s_anno["y1"]
if s_anno_w * s_anno_h / g_anno_w * g_anno_h > 0.7:
s_anno["x"] = s_anno["x1"]
s_anno["y"] = s_anno["y1"]
s_anno["width"] = s_anno["x2"] - s_anno["x1"]
s_anno["height"] = s_anno["y2"] - s_anno["y1"]
else:
if knife_anno["x"] > ped_anno["x"]:
for s_pb in ped_box:
ped_box[0] = max(0, min(ped_box[0], s_pb["x"]))
ped_box[1] = max(0, min(ped_box[1], s_pb["y"]))
ped_box[2] = min(pim.shape[1] - 1, max(ped_box[2], s_pb["x"] + s_pb["width"] - 1))
ped_box[3] = min(pim.shape[0] - 1, max(ped_box[3], s_pb["y"] + s_pb["height"] - 1))
ped_box = [int(b) for b in ped_box]
res_pim = pim[ped_box[1]:ped_box[3], int(left_xcoord):ped_box[2]]
for sa in anno:
sa["x"] -= ped_box[0]
sa["y"] -= left_xcoord
else:
for s_pb in ped_box:
ped_box[0] = max(0, min(ped_box[0], s_pb["x"]))
ped_box[1] = max(0, min(ped_box[1], s_pb["y"]))
ped_box[2] = min(pim.shape[1] - 1, max(ped_box[2], s_pb["x"] + s_pb["width"] - 1))
ped_box[3] = min(pim.shape[0] - 1, max(ped_box[3], s_pb["y"] + s_pb["height"] - 1))
ped_box = [int(b) for b in ped_box]
res_pim = pim[ped_box[1]:ped_box[3], ped_box[0]:int(right_xcoord)]
for sa in anno:
sa["x"] -= ped_box[0]
sa["y"] -= ped_box[1]
return res_pim, anno
3、IoU代码:
def IoU(self, boxA, boxB):
boxA = [int(x) for x in boxA]
boxB = [int(x) for x in boxB]
xA = max(boxA[0], boxB[0])
yA = max(boxA[1], boxB[1])
xB = min(boxA[2], boxB[2])
yB = min(boxA[3], boxB[3])
interArea = max(0, xB - xA + 1) * max(0, yB - yA + 1)
boxAArea = (boxA[2] - boxA[0] + 1) * (boxA[3] - boxA[1] + 1)
boxBArea = (boxB[2] - boxB[0] + 1) * (boxB[3] - boxB[1] + 1)
iou = interArea / float(boxAArea + boxBArea - interArea)
return iou