(八)fastai 目标检测 object detection

(八)fastai 目标检测 object detection,第1张

0. 参考资料 fastai course: fastai2018 part2 lesson8~9 是目标检测专题。只是dl2的jupyter notebook全是基于fastai0.7的版本的。在fastai1的环境下,也可以执行。只要是插入了fastai0.7的源码库就可以了。可以运行 https://nbviewer.org/github/fastai/fastai1/tree/master/courses/jav将这些在fastai1的库环境中实现了,并进行了优化,有三个版本v1,v2,v3三个版本,还加上了新的数据增强的方法。https://forums.fast.ai/t/ssd-object-detection-in-v1/52512/14IceVision 是一个CV库;还有一个fastai目标检测库:Metrics | fastai_object_detection

Howard 教授在 2018 年高级课程(第 2 部分)中展示了 SSD Single Shot Object Detection 的示例。这是一个非常有趣但很复杂的笔记本;不幸的是,它是用 Fastai V0.7 编写的。我已将 SSD 笔记本移植到 Fastai V1 中,效果非常好。您可以在我的 GitHub 中找到它,网址为 https://colab.research.google.com/github/jav0927/course-v3/blob/master/SSD_Object_Detection.ipynb 212这是课程中最具挑战性的模型,也是一个很好的学习工具。我希望它对社区有价值。在开发模型时,我受到了 Henin 之前工作的启发。
1. 调试记录

为了方便作比较,先写metric函数,计算目标检测中的mAP指标。

【YOLO学习】召回率(Recall),精确率(Precision),平均正确率(Average_precision(AP) ),交除并(Intersection-over-Union(IoU))_Joe_quan-DevPress官方社区

precision和recall,调整阈值 Precision-recall 曲线

如果你想评估一个分类器的性能,一个比较好的方法就是:观察当阈值变化时,Precision与Recall值的变化情况。如果一个分类器的性能比较好,那么它应该有如下的表现:被识别出的图片中飞机所占的比重比较大,并且在识别出大雁之前,尽可能多地正确识别出飞机,也就是让Recall值增长的同时保持Precision的值在一个很高的水平。而性能比较差的分类器可能会损失很多Precision值才能换来Recall值的提高。通常情况下,文章中都会使用Precision-recall曲线,来显示出分类器在Precision与Recall之间的权衡。

目标检测(Object Detection)中性能衡量指标mean Average Precision(mAP)的含义与计算_asasasaababab的博客-CSDN博客

 ① 不同的排序,precision就不一样。② 

 

 

1.1 mAP metric实现

参考资料:https://fastai1.fast.ai/metrics.html 在fastai1中自定义metric的实现方法

mAP fastai 实现 GitHub - rbrtwlz/fastai_object_detection: Extension of the fastai library to include object detection.GitHub - bes-dev/mean_average_precision: Mean Average Precision for Object Detection

mean_average_precision 代码阅读:目标检测mAP

http://www.kaotop.com/file/tupian/20220919/5af8d43fa7204ab09fe4b02ca683ef7a.png

 

https://www.jianshu.com/p/82be426f776e?u_atoken=92f1a4ac-1f38-424e-bd5d-e13ae75eca06&u_asession=01MvY9RNeNKwQlYnMD9Hc_K3eX6exil6XSk_X4_wWZz0_LZRfZ9R9ZQmxJo6YLqJquX0KNBwm7Lovlpxjd_P_q4JsKWYrT3W_NKPr8w6oU7K9ftvHNHiPBVlg33AaBaFhpCvvWHyhA8I9G3hxoTho1LGBkFo3NEHBv0PZUm6pbxQU&u_asig=05tZzfVi1GOV4qK6fh5h9Gg0CQEsM4j3i7J0ECfvAn5RiOj8400gbKYtvl3pud9waa9YpWWkFQdASvdk_UXLWFrUQjJwawMWwm9WEnGPOyqUD9R9a-imlIWQHmOnXxzB815E-9WTWOdh6FHU9YrpOzF7rpdbkP2u41mr2nrhHbssr9JS7q8ZD7Xtz2Ly-b0kmuyAKRFSVJkkdwVUnyHAIJzfoNu94mvcy7Lbsw_tvtWXTp3s9_xExIa5wcJrmlNdnsChTz2MQxpCmDDGYlh3aZze3h9VXwMyh6PgyDIVSG1W_1F70odfP7dqZSPD-SupvBMcP86Dpk-9o5WW2hT6bxqnLVjL3gJGcIUWUdcOMi4KpUXppGBbE7EV6HNvNEWtsNmWspDxyAEEo4kbsryBKb9Q&u_aref=fVQ8LZgBzeAw4fqILwiJYD%2BtNLo%3D

 目标检测中的mAP是什么含义? - 知乎

 

import numpy as np
from mean_average_precision import MetricBuilder

# [xmin, ymin, xmax, ymax, class_id, difficult, crowd]
gt = np.array([
    [439, 157, 556, 241, 0, 0, 0],
    [437, 246, 518, 351, 0, 0, 0],
    [515, 306, 595, 375, 0, 0, 0],
    [407, 386, 531, 476, 0, 0, 0],
    [544, 419, 621, 476, 0, 0, 0],
    [609, 297, 636, 392, 0, 0, 0]
])

# [xmin, ymin, xmax, ymax, class_id, confidence]
preds = np.array([
    [429, 219, 528, 247, 0, 0.460851],
    [433, 260, 506, 336, 0, 0.269833],
    [518, 314, 603, 369, 0, 0.462608],
    [592, 310, 634, 388, 0, 0.298196],
    [403, 384, 517, 461, 0, 0.382881],
    [405, 429, 519, 470, 0, 0.369369],
    [433, 272, 499, 341, 0, 0.272826],
    [413, 390, 515, 459, 0, 0.619459]
])

# print list of available metrics
print(MetricBuilder.get_metrics_list())

# create metric_fn
metric_fn = MetricBuilder.build_evaluation_metric("map_2d", async_mode=True, num_classes=1)

# add some samples to evaluation
for i in range(10):
    metric_fn.add(preds, gt)

# compute PASCAL VOC metric
print(f"VOC PASCAL mAP: {metric_fn.value(iou_thresholds=0.5, recall_thresholds=np.arange(0., 1.1, 0.1))['mAP']}")

# compute PASCAL VOC metric at the all points
print(f"VOC PASCAL mAP in all points: {metric_fn.value(iou_thresholds=0.5)['mAP']}")

# compute metric COCO metric
print(f"COCO mAP: {metric_fn.value(iou_thresholds=np.arange(0.5, 1.0, 0.05), recall_thresholds=np.arange(0., 1.01, 0.01), mpolicy='soft')['mAP']}")
1.2 fastai 2018 lesson9 SSD

mAP在fastai 2.x版本中如何运行的?如何实现网络到nms,到最后的检测框这一步的?

fit_one_cycle->learn.fit->

callback主要有两个:TrainEvalCallback和Recorder

TrainEvalCallback一般没有太多工作,就是记录epoch的个数,当前的训练进度,到了第几个epoch的第几个batch之类的。进度控制等。

fit的逻辑:

 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/2989914.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-23
下一篇 2022-09-23

发表评论

登录后才能评论

评论列表(0条)

保存