- 在network.py中修改anchor_scales,第262行:
def create_architecture(self, sess, mode, num_classes, tag=None, anchor_scales=(8, 16, 32), anchor_ratios=(0.5, 1, 2)):
修改之前,前三轮训练结果:
改为:
def create_architecture(self, sess, mode, num_classes, tag=None, anchor_scales=(3.125 , 12.5 , 21.875 , 31.25), anchor_ratios=(0.5, 1, 2)):
修改之后,前三轮训练结果:
- 将nms改为soft-nms
记得在所有文件中引入模块函数
首先,将proposal_layer.py中的第48行改为:
# keep = nms(np.hstack((proposals, scores)), nms_thresh)
keep = soft_nms(proposals , scores)
然后,在nms_wrapper.py中,加入:
# soft_nms
def soft_nms(dets, sc, sigma=0.5, Nt=0.3, threshold=0.001, method=2):
keep = cpu_soft_nms(np.ascontiguousarray(dets, dtype=np.float32),
np.ascontiguousarray(sc, dtype=np.float32),
np.float32(sigma),
np.float32(Nt),
np.float32(threshold),
np.uint8(method))
return keep
最后,在py_cpu_nms.py中,加入:
# soft_nms
def cpu_soft_nms(dets , sc, sigma=0.5, Nt=0.3, thresh=0.001, method=2):
"""
py_cpu_softnms
:param dets: boexs 坐标矩阵 format [y1, x1, y2, x2]
:param sc: 每个 boxes 对应的分数
:param Nt: iou 交叠门限
:param sigma: 使用 gaussian 函数的方差
:param thresh: 最后的分数门限
:param method: 使用的方法
:return: 留下的 boxes 的 index
"""
# indexes concatenate boxes with the last column
N = dets.shape[0]
indexes = np.array([np.arange(N)])
dets = np.concatenate((dets, indexes.T), axis=1)
# the order of boxes coordinate is [y1,x1,y2,x2]
y1 = dets[:, 0]
x1 = dets[:, 1]
y2 = dets[:, 2]
x2 = dets[:, 3]
scores = sc
areas = (x2 - x1 + 1) * (y2 - y1 + 1)
for i in range(N):
# intermediate parameters for later parameters exchange
tBD = dets[i, :].copy()
tscore = scores[i].copy()
tarea = areas[i].copy()
pos = i + 1
#
if i != N-1:
maxscore = np.max(scores[pos:], axis=0)
maxpos = np.argmax(scores[pos:], axis=0)
else:
maxscore = scores[-1]
maxpos = 0
if tscore < maxscore:
dets[i, :] = dets[maxpos + i + 1, :]
dets[maxpos + i + 1, :] = tBD
tBD = dets[i, :]
scores[i] = scores[maxpos + i + 1]
scores[maxpos + i + 1] = tscore
tscore = scores[i]
areas[i] = areas[maxpos + i + 1]
areas[maxpos + i + 1] = tarea
tarea = areas[i]
# IoU calculate
xx1 = np.maximum(dets[i, 1], dets[pos:, 1])
yy1 = np.maximum(dets[i, 0], dets[pos:, 0])
xx2 = np.minimum(dets[i, 3], dets[pos:, 3])
yy2 = np.minimum(dets[i, 2], dets[pos:, 2])
w = np.maximum(0.0, xx2 - xx1 + 1)
h = np.maximum(0.0, yy2 - yy1 + 1)
inter = w * h
ovr = inter / (areas[i] + areas[pos:] - inter)
# Three methods: 1.linear 2.gaussian 3.original NMS
if method == 1: # linear
weight = np.ones(ovr.shape)
weight[ovr > Nt] = weight[ovr > Nt] - ovr[ovr > Nt]
elif method == 2: # gaussian
weight = np.exp(-(ovr * ovr) / sigma)
else: # original NMS
weight = np.ones(ovr.shape)
weight[ovr > Nt] = 0
# print(scores.shape)
# print(np.array([weight]).T.shape)
scores[pos:] = scores[pos:] * np.array([weight]).T
# select the boxes and keep the corresponding indexes
inds = dets[:, 4][scores.flatten() > thresh]
keep = inds.astype(int)
return keep