(八)fastai 目标检测 object detection

news/2024/9/8 5:03:41/
  •  首先fastai使用SSD在VOC2007数据集上,源于fastai2018 course part2, lesson8和lesson9。这两课的学习笔记为:(七)fastai 2018 lesson8 目标检测 ~ lesson9 目标检测__helen_520的博客-CSDN博客
  •  对应的代码为:环境是fastai0.7 即,fastai1/old  https://nbviewer.org/github/fastai/fastai1/tree/master/courses/
    • 很多函数是自己写的,可以详细研究怎么做的。
    • pascal.ipynb, pascal_multi.ipynb 是自己写的dataloader,代码更详细
  • jav将其改为fastai1.0的版本,使用fastai1.0的dataloader库,数据块用的现成的。但是训练效果更好,利于研究。自己需要把mAP的指标加上去。
  • 下面研究fastai1.0的SSD.ipynb代码是具体咋实现的,以及和paper的逻辑对应。
    • 更重要的是:要一点点的提高mAP指标。

0. 参考资料

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

https://img-blog.csdnimg.cn/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的逻辑:

 

二、SSD代码阅读记录

  •  Howard 教授在 2018 年高级课程(第 2 部分)中展示了 SSD Single Shot Object Detection 的示例。这是一个非常有趣但很复杂的笔记本;不幸的是,它是用 Fastai V0.7 编写的。
  • Jav0927已将 SSD 笔记本移植到 Fastai V1 中,效果非常好。您可以在我的 GitHub 中找到它,网址为 https://colab.research.google.com/github/jav0927/course-v3/blob/master/SSD_Object_Detection.ipynb 212
  • 基于fastai v1,VOC,SSD网络

 2.1 dataloader部分

  • Rectangle的bbox格式:[xcol, yrow, width, height]
  • VOC原始标签中的格式也是 [xcol, yrow, width, height]
  • fastai的格式为:[y1, x1, y2, x2]

 

  •  数据做的内容

    • 见  <三、函数关系图>

path = Path('/home/helen/dataset/pascal_2007')
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') trn_im_names, trn_truths = get_annotations(path/'train.json')
val_im_names, val_truths = get_annotations(path/'valid.json')
tst_im_names, tst_truths = get_annotations(path/'test.json') tot_im_names, tot_truths = [trn_im_names + val_im_names, trn_truths + val_truths]
# Create a dictionary containing the composite of the above
img_y_dict = dict(zip(tot_im_names, tot_truths))
# Define a function, based on the dictionary created above, to use in a Fastai Data Block to structure the input data
truth_data_func = lambda o: img_y_dict[o.name]sz=224       # Image size
bs=128        # Batch sizenp.random.seed(35) # cutout,在图像上随机挖几个洞;
tfms = get_transforms(cutout(n_holes=(1,4), length=(10, 160), p=.5), max_rotate=4., max_zoom=1.1, p_affine=0.5, p_lighting=0.5 )
data = (ObjectItemList.from_folder(path/'train')#get_files->ImageList.split_by_rand_pct(0.02)#->ItemLists.label_from_func(truth_data_func) # ->LabelLists.transform(tfms=[],size=sz,tfm_y=True,resize_method=ResizeMethod.SQUISH).databunch(bs=bs,collate_fn=bb_pad_collate,num_workers=8,pin_memory=False)#->ImageDataBunch.normalize(imagenet_stats))

2.2 loss函数的设计

  • 分类任务有助于回归任务的。

  • 由于loss分为两部分,可以分别计算两个loss的值。 
    • 参考pascal.ipynb的detn_l1好detn_acc的metric设计,可以将l1-loss单独打印出来。可以看出每个epoch的l1-loss和bbox-loss、clas-loss单独是怎样的。占多少比重。
    • 在fastai1的版本中,如何添加自定义的metric呢。
  • 2.2.1 fastai1 自定义metric设计

  • https://fastai1.fast.ai/metrics.html

 训练指标

用于训练 fastai 模型的指标只是简单的函数,它接受inputtarget张量,并返回一些感兴趣的训练指标。Learner您可以通过定义该类型的函数并将其传递给参数来编写自己的指标metrics,或者使用以下预定义函数之一。

  •  metric的参数表为:(input, target)。
  • 查看代码后,发现可以写为Learn.metrics,给metrics增加就可以。可以写loss,可以写metrics
    • 所以去看下在哪里调用的metrics计算,又如何调用的,接口怎么

  •   与上面对照起来看,如果传递常规的函数,就是用AverageCallback回调函数,同时只在valid阶段来调用。
    • AverageCallback.func就是用来添加func的;
  • 调用的时候,在CallbackHandler的__call__函数中,就会来调用。先调用metirc计算,再调用其他callbacks

三、函数关系图

对fastai1的fastai文件夹进行类图分析:

  • python:利用Graphviz和pyreverse 分析类文件自动生成UML图_一从际发的博客-CSDN博客 python:利用Graphviz和pyreverse 分析类文件自动生成UML图
  • Python自动绘制UML类图、函数调用图(Call Graph)_虾米小馄饨的博客-CSDN博客_python 类图 PyllPython自动绘制UML类图、函数调用图(Call Graph)
# linux端
sudo apt install graphviz
conda install python-graphviz
pip install pylint
# https://blog.csdn.net/qq_36879201/article/details/126244459 pycallgraph 安装失败,一直报subprocess-exited-with-error
pip show setuptools
pip install --upgrade setuptools==57.5.0
pip install pycallgraph
# 使用方法:
pyreverse -o png -p fastai ~/fastai1/fastai

生成了两个图:package_fastai.png classes_fastai.png,下图是 package_fastai.png,包关系依赖图。

https://download.csdn.net/download/haronchou/86868480 fastai类关系图继承图。

下面是fastai的一个大概图:

SSD.py的源码部分的数据加载:

 数据加载的类的继承关系图

 

 

ImageDataBunch继承自DataBunch 

 

x,y=next(iter(data.train_dl)) 所以去的是LabelList的数据,LabelList(x,y), x为ObjectItem类型,y为ObjectCategory类型。

  • dl.dataset的getitem调用 x的getitem ,依次调用ImageList的get函数,再调用爷类的ItemList的getitem。
    • 爷类负责获取图片路径;父类ImageList负责open图像;子类ObjectItemList负责transform
  • dl.dataset的getitem调用x的aply_transform。
  • y在进行transform的时候,进行bbox的create,其中bbox进行了归一化,为[-1,-1]
    • bbox的格式为:fastai进去的时候为[y1,x1,y2,x2],归一化之后,[y1,x1,y2,x2]/hs*2, /ws*2。就是[-1,1]
    • 由于没有padding,所以是直接缩放的。

附录:UML类图的箭头含义

四、调试记录

  • 有tfms数据增强,无数据增强,在Loss的体现上,差别是很大的。 有了数据增强后,loss小了好多。
  • 有数据增强后,第一次只训练head的mAP也提高了一些。0.138提高到0.186

 

五、paper

SSD paper地址:https://arxiv.org/pdf/1512.02325.pdf

  • 我跑的结果是:大目标要好一些,但是小目标还是不太行。

 

六、VOC2007 Leaderboard

PASCAL VOC 2007 Benchmark (Object Detection) | Papers With Code

  • 我一下就释然了。虽然我才训练的40%多,任重而道远。但目标并不是95%,而是70~80%即可。 

 

 


http://www.ppmy.cn/news/841226.html

相关文章

1024程序员节最新福利之2018最全java资料集合

前言 有好久没有写博客了,主要这段时间都沉迷学习无法自拔了,哈哈.自吹一波. 前两天不是1024节吗,所以就有很多福利出现了,当然每个人能都获得的信息都有所不同,这就是所谓的信息差.秉着好东西需要分享和开源的好习惯,所以来给你们送福利了. 其他福利 一、1024程序员节最新福利…

【CS学习笔记】24、C2lints实例演示

0x00 前言 续上一节&#xff0c;在GitHub 上有一些配置文件的示例&#xff0c;项目地址&#xff1a;https://github.com/rsmudge/Malleable-C2-Profiles 这一节将使用该项目中的 Malleable-C2-Profiles/APT/havex.profile 配置文件作为示例。 0x01 测试配置文件是否有效 可…

【已解决】Tomcat 运行报错: XXX has been compiled by a more recent version of the Java Runtime

问题&#xff1a; jakarta.servlet.ServletException: java.lang.UnsupportedClassVersionError: com/companyabc/xxw/demo/SimpleBean has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only r…

合工大实验一 Java开发环境使用与面向对象编程

《Java语言程序设计》实验报告 实验一&#xff1a; 2021年09月 日 学院 软件学院 专业班级 姓名 成绩 课程 名称 Java语言程序设计 实验项目 名 称 Java开发环境使用与面向对象编程 指导教师 路…

java边缘检测算子代码_图像边缘检测(Canny 算法)的Java实现

快速排序 一、 算法描述 快速排序是对冒泡排序的一种改进。在冒泡排序中&#xff0c;记录每次都是与相邻位置上的数据作比较&#xff0c;因此每次只能移动一个位置。而在快速排序中&#xff0c;记录的比较和移动都是从两端向中间进行的。 其主要思想&#xff1a;首先在待排序数…

深入理解HashMap

摘要 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK&#xff08;Java Developmet Kit&#xff09;版本的更新&#xff0c;JDK1.8对HashMap底层的实现进行了优化&#xff0c;例如引入红黑树的数据结构和扩容的优化等。本文结合JDK1.7和JDK1.8的区…

idea java opts_IntelliJ IDEA 2017.1 JDK 8 性能调优

IntelliJ IDEA 问题描述 IntelliJ IDEA 在 多窗口、多项目协作开发时&#xff0c;MacBook Pro的散热风扇凶猛地转动&#xff0c;相关配置如下&#xff1a; MacBook Pro 配置 MacBook Pro (Retina, 15-inch, Mid 2015) 型号名称&#xff1a; MacBook Pro 型号标识符&#xff1a;…

Java9

Java9 &#xff08;一&#xff09;、stream流1.1 Stream流的中间方法和终结方法 &#xff08;二&#xff09;、方法引用2.1 方法引用的分类 &#xff08;三&#xff09;、异常3.1 编译时异常和运行时异常3.2 异常的作用3.3 异常的处理方式3.4 异常中的常见方法3.5 自定义异常 &…

JAV API 之 --- StringBuffer类、Array类、基本类型包装类

JAVA API 之 — StringBuffer类、Array类、基本类型包装类 StringBuffer类&#xff1a; 概念引入&#xff1a; 前面我们对字符串进行操作&#xff0c;一旦定义字符串之后&#xff0c;其长度是不可变的&#xff0c;如果对字符串进行拼接操作&#xff0c;采用号大量拼串&#xf…

基于SpringBoot的公司财务管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;Java韩立 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &#x1f345;文末获…

7.12剑指 Offer II. 左右两边子数组的和相等

给你一个整数数组 nums &#xff0c;请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端&#xff0c;那么左侧数之和视为 0 &#xff0c;因为在下标的左侧不存在元素。这一点…

夏洛特的网 ——看《夏洛特的网》

夏洛特的网 ——看《夏洛特的网》一般的话会起一个更贴近自己想要表达物象的一个题目&#xff0c;结果发现小说本身的题目就是最好的那个。 只是一张简单的网&#xff0c;网住来往的昆虫蚊蝇&#xff0c;网住忠诚智慧的夏洛特&#xff0c;网住威尔伯原本在夏天就要死去的生命&…

车载以太网之SOME/IP-SD专题篇

前言 首先,请问大家几个小小问题,你清楚: 你知道什么是SOME/IP SD吗?SOME/IP-SD报文是如何发送与接收的呢?SOME/IP-SD 存在哪几种Entry Type呢?SOME/IP-SD内部状态机转换又是如何?今天,我们就来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲: 目录…

Comparable/Comparator

现在有一个自定义学生的学生类,里面有name属性,和age属性,我们如何去比较大小? class Student{public String name;public int age;public Student(String name, int age) {this.name name;this.age age;}Overridepublic String toString() {return "Student{" &…

闭包意义与使用

闭包是一个编程概念&#xff0c;指的是一个函数可以访问其定义时所在的词法作用域中的变量&#xff0c;即使该函数在其定义时已经离开了该作用域。这意味着&#xff0c;如果一个函数引用了一个外部变量&#xff0c;那么该变量会被自动捕获到闭包中&#xff0c;并在函数执行时可…

256GB+65W+90Hz,从4599元跌至3699元,12GB运存顶尖旗舰加速退场

手机8GB运行内存已经够用的情况下&#xff0c;你们会选择入手12GB运行内存的高配版吗&#xff1f;尽管12GB运行内存已经出来了接近两年&#xff0c;但是真正使用上12GB运行内存手机的人却并不多&#xff0c;因为8GB足以应付日常使用&#xff0c;追求12GB运行内存的高配版所带来…

hdu 4599 Dice

题目&#xff1a;hdu 4599 Dice tag &#xff1a;概率dp 思路&#xff1a;跟上次多校一样的思路&#xff1a;click here 所以知道&#xff1a;F(n)(6^n-1)/5 H(n)6*F(n) G(n)6*n 所以要求的是&#xff1a;m>(6^n-1)/30 所以最小的m是 &#xff08;6^n24&#xff09;/3…

Spring Boot---(7)SpringBoot多线程

前提&#xff1a; 日常开发&#xff0c;有很多场景会使用到多线程&#xff0c;比如&#xff0c;我们解析Excel&#xff0c;如果解析出一个3万条数据的Excel表格&#xff0c;需要两部&#xff1a; 1.我们需要先异步解析出所有的数据&#xff0c;前面写过了如何异步处理任务&…

Docker Quickstart Terminal启动报错“Unable to verify the Docker daemon”和步骤“Finalize”出错

Docker Quickstart Terminal启动报错“Unable to verify the Docker daemon”和步骤“Finalize”出错 1、Unable to verify the Docker daemon is listening: Maximum number of retries (10) exceeded2、Looks like something went wrong in step Finalize... Press any key t…

linux 挂载大容量硬盘

在linux中对于大于2T的硬盘&#xff0c;需要使用parted进行分区。 #1.确认要挂载的硬盘 fdisk -l Disk /dev/sdb: 10.9 TiB, 11999064883200 bytes, 23435673600 sectors Units: sectors of 1 * 512 512 bytes Sector size (logical/physical): 512 bytes / 4096 byt…