训练数据集
https://blog.youkuaiyun.com/abysswatcher1/article/details/113463551
修改部分
首先对eval.py中的代码进行修改:
1.导入部分注释掉VOC和COCO,改为自己的数据集。
2.第一个在parser.add_argumen中,将路径改为之前训练好的模型的路径。
parser.add_argument('--trained_model',
default='C:/Users/25345/Desktop/pytorch_ssd-20200327T152054Z-001/weights/ssd300_COCO_5000.pth', type=str,
help='Trained state_dict file path to open')
3.annopath,imgpath,imgsetpath,devkit_path的内容也要进行相应的修改:
#annopath = os.path.join(args.voc_root, 'VOC2007', 'Annotations', '%s.xml')
#imgpath = os.path.join(args.voc_root, 'VOC2007', 'JPEGImages', '%s.jpg')
#imgsetpath = os.path.join(args.voc_root, 'VOC2007', 'ImageSets',
# 'Main', '{:s}.txt')
#YEAR = '2007'
#devkit_path = args.voc_root + 'VOC' + YEAR
mask_root = "C:/Users/25345/Desktop/pytorch_ssd-20200327T152054Z-001/pytorch_ssd/data/maskornot"
annopath = os.path.join(mask_root, 'Annotations', '%s.xml')
imgpath = os.path.join(mask_root, 'JPEGImages', '%s.jpg')
#imgsetpath = os.path.join(mask_root, 'ImageSets',
# 'Main', '{:s}.txt')
imgsetpath = os.path.join(mask_root, 'ImageSets','Main')+ os.sep + 'test.txt'
devkit_path = mask_root
在之后添加
set_type = 'test'
4.部分函数的修改:
def get_voc_results_file_template(image_set, cls):
# VOCdevkit/VOC2007/results/det_test_aeroplane.txt
filename = 'det_' + image_set + '_%s.txt' % (cls)
filedir = os.path.join(devkit_path, 'results')
#print(filedir)
if not os.path.exists(filedir):
os.mkdir(filedir)
path = os.path.join(filedir, filename)
return path
def write_voc_results_file(all_boxes, dataset):
for cls_ind, cls in enumerate(labelmap):
print('Writing {:s} MASK results file'.format(cls))
filename = get_voc_results_file_template(set_type, cls)
with open(filename, 'wt') as f:
for im_ind, index in enumerate(dataset.ids):
dets = all_boxes[cls_ind+1][im_ind]
if dets == []:
continue
# the VOCdevkit expects 1-based indices
for k in range(dets.shape[0]):
f.write('{:s} {:.3f} {:.1f} {:.1f} {:.1f} {:.1f}\n'.
format(index[1], dets[k, -1],
dets[k, 0] + 1, dets[k, 1] + 1,
dets[k, 2] + 1, dets[k, 3] + 1))
修改完成之后,即可运行eval.py进行测试,下面是我遇到的一个报错。
改错部分
RuntimeError: Legacy autograd function with non-static forward method is deprecated
原因
detection.py文件中,因为Detect类继承自Function类,在pytorch1.3及以后的版本需要规定forward方法为静态方法,所以在pytorch1.3以上的版本执行出错。
解决方法
1.可以将pytorch的版本降为1.2以下,即可解决,但是我的CUDA版本是11.0如果降低的话,CUDA也要重新装低版本的,这个方法不行。
2.代码修改
ssd.py中,
box_utils.py中,
第一个添加的部分:
第二个部分:
接下来就可以显示模型的效果了,
orange类的识别表现在测试集中的精确程度约为0.827,训练的效果还不错。