目标检测模型mAP计算
环境列表如下:Win10系统,tensorflow版本为1.13,python版本3.6,模型框架SSD。
1,模型训练
首先对于目标检测模型进行训练,生成ckpt文件,相关训练过程可以参考如下博客:
https://www.cnblogs.com/kxqblog/p/16129549.html
2,修改BUG
在 ssd-tensorflow文件夹下的tf_extended/metrics.py文件中 Line 51下,将
return variables.Variable
改为
return variables.VariableV1
3,修改eval_ssd_network.py
对于eval_ssd_network.py 文件,其路径在ssd-tensorflow-master文件夹下,在其 def main 前面插入一个函数,如下:
# paste by dbt
def flatten(x):
result = []
for el in x:
if isinstance(el, tuple):
result.extend(flatten(el))
else:
result.append(el)
return result
然后,全文查找eval_op,修改原文中的2处代码。
num_evals=num_batches,
# eval_op=list(names_to_updates.values()),
eval_op=flatten(list(names_to_updates.values())),
4,单次ckpt计算mAP的命令
制作test数据,类似于之前生成train数据的tfrecord,在tensorflow环境下ssd-tensorflow-master下执行以下命令即可:
python tf_convert_data.py --dataset_name=pascalvoc --dataset_dir=D:\TensorflowModels\ImageData\Pascal_VOC\ --output_name=voc_2007_test --output_dir=D:\TensorflowModels\mobilnetv3_ssd\SSD-Tensorflow-Test\test_cat_tfrecord_1\
再执行以下命令计算mAP,命令如下:
python eval_ssd_network.py --eval_dir=D:\TensorflowModels\mobilnetv3_ssd\SSD-Tensorflow-Test\eva_test\ --dataset_dir=D:\TensorflowModels\mobilnetv3_ssd\SSD-Tensorflow-Test\test_cat_tfrecord_1\ --dataset_name=pascalvoc_2007 --dataset_split_name=test --model_name=ssd_300_vgg --checkpoint_path=D:\TensorflowModels\mobilnetv3_ssd\SSD-Tensorflow-Test\cat_models\model.ckpt-22105 --batch_size=1
各个参数意义为:
eval_dir为执行测试命令后日志等文件保存的目录,可以任意位置新建一个,最好是在ssd-tensorflow-master下
dataset_dir为之前保存测试tfrecord文件的位置
dataset_name为数据名的前缀,一般不用更改
dataset_split_name需要与之前生成tfrecord文件的文件名中第三个单词保持一致,本例中为test,区别于之前的train
model_name为加载的模型的名字,这里为ssd_300_vgg,与之前执行训练时的模型名字是一致的。
checkpoint_path为之前保存的训练模型的路径
batch_size为表示批量处理的数量
由于我之前的模型训练时间较短(约20min),因此平均准确率不高,训练结果如下所示:
至此,测试完毕。
参考博客:
https://blog.csdn.net/u014710355/article/details/100283899
https://blog.csdn.net/weixin_41817383/article/details/100747468