Open zhjikoshlizhzc opened 3 years ago
如果你是想测试单张图片的话可以自己写个脚本,就是按照demo.py 里边 test_oneimage 那个方法,把相关的方法不要以import的形式而是复制到自己的脚本里边。我写的是这样的,你可以借鉴一下:
from data.config import widerface_640
from data.widerface import WIDERFace_CLASSES
from face_ssd import build_ssd
from data import TestBaseTransform
import matplotlib.pyplot as plt
import numpy as np
import torch
import cv2
from torch.autograd import Variable
def bbox_vote(det):
order = det[:, 4].ravel().argsort()[::-1]
det = det[order, :]
dets = np.zeros((0, 5),dtype=np.float32)
while det.shape[0] > 0:
# IOU
area = (det[:, 2] - det[:, 0] + 1) * (det[:, 3] - det[:, 1] + 1)
xx1 = np.maximum(det[0, 0], det[:, 0])
yy1 = np.maximum(det[0, 1], det[:, 1])
xx2 = np.minimum(det[0, 2], det[:, 2])
yy2 = np.minimum(det[0, 3], det[:, 3])
w = np.maximum(0.0, xx2 - xx1 + 1)
h = np.maximum(0.0, yy2 - yy1 + 1)
inter = w * h
o = inter / (area[0] + area[:] - inter)
# get needed merge det and delete these det
merge_index = np.where(o >= 0.3)[0]
det_accu = det[merge_index, :]
det = np.delete(det, merge_index, 0)
if merge_index.shape[0] <= 1:
continue
det_accu[:, 0:4] = det_accu[:, 0:4] * np.tile(det_accu[:, -1:], (1, 4))
max_score = np.max(det_accu[:, 4])
det_accu_sum = np.zeros((1, 5))
det_accu_sum[:, 0:4] = np.sum(det_accu[:, 0:4], axis=0) / np.sum(det_accu[:, -1:])
det_accu_sum[:, 4] = max_score
try:
dets = np.row_stack((dets, det_accu_sum))
except:
dets = det_accu_sum
dets = dets[0:750, :]
return dets
def write_to_txt(f, det , event , im_name):
f.write('{:s}\n'.format(event + '/' + im_name))
f.write('{:d}\n'.format(det.shape[0]))
for i in range(det.shape[0]):
xmin = det[i][0]
ymin = det[i][1]
xmax = det[i][2]
ymax = det[i][3]
score = det[i][4]
f.write('{:.1f} {:.1f} {:.1f} {:.1f} {:.3f}\n'.
format(xmin, ymin, (xmax - xmin + 1), (ymax - ymin + 1), score))
def infer(net , img , transform , thresh , cuda , shrink):
if shrink != 1:
img = cv2.resize(img, None, None, fx=shrink, fy=shrink, interpolation=cv2.INTER_LINEAR)
x = torch.from_numpy(transform(img)[0]).permute(2, 0, 1)
x = Variable(x.unsqueeze(0) , volatile=True)
if cuda:
x = x.cuda()
#print (shrink , x.shape)
y = net(x) # forward pass
detections = y.data
# scale each detection back up to the image
scale = torch.Tensor([ img.shape[1]/shrink, img.shape[0]/shrink,
img.shape[1]/shrink, img.shape[0]/shrink] )
det = []
for i in range(detections.size(1)):
j = 0
while detections[0, i, j, 0] >= thresh:
score = detections[0, i, j, 0]
#label_name = labelmap[i-1]
pt = (detections[0, i, j, 1:]*scale).cpu().numpy()
coords = (pt[0], pt[1], pt[2], pt[3])
det.append([pt[0], pt[1], pt[2], pt[3], score])
j += 1
if (len(det)) == 0:
det = [ [0.1,0.1,0.2,0.2,0.01] ]
det = np.array(det)
keep_index = np.where(det[:, 4] >= 0)[0]
det = det[keep_index, :]
return det
def infer_flip(net , img , transform , thresh , cuda , shrink):
img = cv2.flip(img, 1)
det = infer(net , img , transform , thresh , cuda , shrink)
det_t = np.zeros(det.shape)
det_t[:, 0] = img.shape[1] - det[:, 2]
det_t[:, 1] = det[:, 1]
det_t[:, 2] = img.shape[1] - det[:, 0]
det_t[:, 3] = det[:, 3]
det_t[:, 4] = det[:, 4]
return det_t
def infer_multi_scale_sfd(net , img , transform , thresh , cuda , max_im_shrink):
# shrink detecting and shrink only detect big face
st = 0.5 if max_im_shrink >= 0.75 else 0.5 * max_im_shrink
det_s = infer(net , img , transform , thresh , cuda , st)
index = np.where(np.maximum(det_s[:, 2] - det_s[:, 0] + 1, det_s[:, 3] - det_s[:, 1] + 1) > 30)[0]
det_s = det_s[index, :]
# enlarge one times
bt = min(2, max_im_shrink) if max_im_shrink > 1 else (st + max_im_shrink) / 2
det_b = infer(net , img , transform , thresh , cuda , bt)
# enlarge small iamge x times for small face
if max_im_shrink > 2:
bt *= 2
while bt < max_im_shrink:
det_b = np.row_stack((det_b, infer(net , img , transform , thresh , cuda , bt)))
bt *= 2
det_b = np.row_stack((det_b, infer(net , img , transform , thresh , cuda , max_im_shrink) ))
# enlarge only detect small face
if bt > 1:
index = np.where(np.minimum(det_b[:, 2] - det_b[:, 0] + 1, det_b[:, 3] - det_b[:, 1] + 1) < 100)[0]
det_b = det_b[index, :]
else:
index = np.where(np.maximum(det_b[:, 2] - det_b[:, 0] + 1, det_b[:, 3] - det_b[:, 1] + 1) > 30)[0]
det_b = det_b[index, :]
return det_s, det_b
def vis_detections(im, dets, image_name , thresh=0.5):
'''Draw detected bounding boxes.'''
class_name = 'face'
inds = np.where(dets[:, -1] >= thresh)[0]
if len(inds) == 0:
return
print (len(inds))
im = im[:, :, (2, 1, 0)]
fig, ax = plt.subplots(figsize=(12, 12))
ax.imshow(im, aspect='equal')
for i in inds:
bbox = dets[i, :4]
score = dets[i, -1]
ax.add_patch(
plt.Rectangle((bbox[0], bbox[1]),
bbox[2] - bbox[0],
bbox[3] - bbox[1], fill=False,
edgecolor='red', linewidth=2.5)
)
'''
ax.text(bbox[0], bbox[1] - 5,
'{:s} {:.3f}'.format(class_name, score),
bbox=dict(facecolor='blue', alpha=0.5),
fontsize=10, color='white')
'''
ax.set_title(('{} detections with '
'p({} | box) >= {:.1f}').format(class_name, class_name,
thresh),
fontsize=10)
plt.axis('off')
plt.tight_layout()
savename = '/home/junrui123/face/tencent/res/' + image_name
plt.savefig(savename, dpi=fig.dpi)
def test_oneimage():
# load net
cfg = widerface_640
num_classes = len(WIDERFace_CLASSES) + 1 # +1 background
net = build_ssd('test', cfg['min_dim'], num_classes) # initialize SSD
trained_model = './weights/WIDERFace_DSFD_RES152.pth'
net.load_state_dict(torch.load(trained_model))
net.cuda()
net.eval()
print('Finished loading model!')
# evaluation
cuda = True
transform = TestBaseTransform((104, 117, 123))
thresh=cfg['conf_thresh']
#save_path = args.save_folder
#num_images = len(testset)
# load data
path = './data/test.jpg'
# path = './data/worlds-largest-selfie.jpg'
img_id = 'face'
img = cv2.imread(path, cv2.IMREAD_COLOR)
max_im_shrink = ( (2000.0*2000.0) / (img.shape[0] * img.shape[1])) ** 0.5
shrink = max_im_shrink if max_im_shrink < 1 else 1
det0 = infer(net , img , transform , thresh , cuda , shrink)
det1 = infer_flip(net , img , transform , thresh , cuda , shrink)
# shrink detecting and shrink only detect big face
st = 0.5 if max_im_shrink >= 0.75 else 0.5 * max_im_shrink
det_s = infer(net , img , transform , thresh , cuda , st)
index = np.where(np.maximum(det_s[:, 2] - det_s[:, 0] + 1, det_s[:, 3] - det_s[:, 1] + 1) > 30)[0]
det_s = det_s[index, :]
# enlarge one times
factor = 2
bt = min(factor, max_im_shrink) if max_im_shrink > 1 else (st + max_im_shrink) / 2
det_b = infer(net , img , transform , thresh , cuda , bt)
# enlarge small iamge x times for small face
if max_im_shrink > factor:
bt *= factor
while bt < max_im_shrink:
det_b = np.row_stack((det_b, infer(net , img , transform , thresh , cuda , bt)))
bt *= factor
det_b = np.row_stack((det_b, infer(net , img , transform , thresh , cuda , max_im_shrink) ))
# enlarge only detect small face
if bt > 1:
index = np.where(np.minimum(det_b[:, 2] - det_b[:, 0] + 1, det_b[:, 3] - det_b[:, 1] + 1) < 100)[0]
det_b = det_b[index, :]
else:
index = np.where(np.maximum(det_b[:, 2] - det_b[:, 0] + 1, det_b[:, 3] - det_b[:, 1] + 1) > 30)[0]
det_b = det_b[index, :]
det = np.row_stack((det0, det1, det_s, det_b))
det = bbox_vote(det)
vis_detections(img , det , img_id, 0.3)
if __name__ == "__main__":
test_oneimage()
腾讯的这个repo代码写的如此的垃圾,真给腾讯丢脸。。。
当我运行如下命令时:python demo.py 报错如下: Traceback (most recent call last): File "D:\Anaconda3\envs\DSFD36\lib\site-packages\scipy\io\matlab\mio.py", line 39, in _open_file return open(file_like, mode), True FileNotFoundError: [Errno 2] No such file or directory: '/data/wider_face_split\wider_face_val.mat'
During handling of the above exception, another exception occurred:
Traceback (most recent call last): File "demo.py", line 28, in
from widerface_val import bbox_vote
File "D:\DSFD_win10\FaceDetection-DSFD\widerface_val.py", line 236, in
testset = WIDERFaceDetection(args.widerface_root, 'val' , None, WIDERFaceAnnotationTransform())
File "D:\DSFD_win10\FaceDetection-DSFD\data\widerface.py", line 150, in init
self.f = scipy.io.loadmat(osp.join(self.path_to_label, self.fname))
File "D:\Anaconda3\envs\DSFD36\lib\site-packages\scipy\io\matlab\mio.py", line 222, in loadmat
with _open_file_context(file_name, appendmat) as f:
File "D:\Anaconda3\envs\DSFD36\lib\contextlib.py", line 81, in enter
return next(self.gen)
File "D:\Anaconda3\envs\DSFD36\lib\site-packages\scipy\io\matlab\mio.py", line 17, in _open_file_context
f, opened = _open_file(file_like, appendmat, mode)
File "D:\Anaconda3\envs\DSFD36\lib\site-packages\scipy\io\matlab\mio.py", line 45, in _open_file
return open(file_like, mode), True
FileNotFoundError: [Errno 2] No such file or directory: '/data/wider_face_split\wider_face_val.mat'
事实上,我已经将wider_face_split.zip成功解压缩到data下。我在windows10平台下进行了上述测试。