admin管理员组

文章数量:1665131

 一、目标检测基础

 

目标检测(Object Detection)_图像算法AI的博客-CSDN博客_目标检测

1、 什么是目标检测及目标检测的任务

目标检测是找出图像中感兴趣的目标,确定它们的类别和位置。

有四大任务:分类、识别、检测(分类+识别)、分割

2、one-stage和two-stage目标检测的区别,各自的优缺点

  • one-stage任务流程:特征提取–> 分类/定位回归

速度快,准确性低,代表网络yolo系列 、SSD

  • two-stage任务流程:特征提取 --> 生成候选区域 --> 分类/定位回归

准确、速度慢,代表网络rcnn系列

3、候选区域如何产生的

(1)滑窗法:首先对输入图像进行不同窗口大小的滑窗进行从左往右、从上到下的滑动。每次滑动时候对当前窗口执行分类器(分类器是事先训练好的)。如果当前窗口得到较高的分类概率,则认为检测到了物体。

(2)选择搜索
step0:生成区域集R
step1:计算区域集R里每个相邻区域的相似度S={s1, s2,…}
step2:找出相似度最高的两个区域,将其合并为新集,添加进R
step3:从S中移除所有与step2中有关的子集
step4:计算新集与所有子集的相似度
step5:跳至step2,直至S为空

计算效率优于滑窗法:滑窗法类似穷举进行图像子区域搜索,但是一般情况下图像中大部分子区域是没有物体的。学者们自然而然想到只对图像中最有可能包含物体的区域进行搜索以此来提高计算效率

4、评估指标

预测边框、实际边框交集和并集的比

5、简单讲讲RCNN系列

RCNN:

(1)预训练模型。选择一个预训练神经网络(如VGG)

(2)重新训练全连接层。使用需要检测的目标重新训练全连接层
(3)提取 proposals并计算CNN 特征。利用选择性搜索(Selective Search)算法提取所有proposals,调整它们成固定大小,以满足 CNN输入要求(因为全连接层的限制),然后将feature map 保存到本地磁盘。
(4)训练SVM。利用feature map 训练SVM来对目标和背景进行分类
(5)边界框回归

缺点:

(1)重复计算,每个region proposal,都需要经过一个VGG特征提取
(2)selective search方法生成region proposal,对一帧图像,需要花费2秒
(3)三个模块(提取、分类、回归)是分别训练的,对于存储空间消耗较大

Fast RCNN:

通过SPPnets只进行一次图像特征提取(而不是每个候选区域计算一次),然后根据算法,将候选区域特征图映射到整张图片特征图中,避免重复进行特征提取,但依旧采用选择搜索来提取候选区域

Faster RCNN:

用RPN取代选择搜索来生成候选区域,在结构上将特征抽取、region proposal提取, bbox regression,分类都整合到了一个网络中。但还是无法实时监测目标。

   

6、简单说下YOLOv1,v2,v3,v4各自的特点与发展史

YOLOv1将物体检测任务直接当作回归问题处理,大幅提升运行速度,实时性好,但准确率和对小目标的检测能力比较差。

YOLOv1的基本思想是把一副图片,首先reshape成448×448大小,将图片划分为7*7个网格,每个网格允许预测出2个边框,总共49*2个bounding box,可以理解为98个候选区域来预测检测框和每个框的Confidence以及每个格子预测一共C个类别的概率分数

YOLOv2对YOLOv1采取了很多改进措施,以提高模型mAP,比如添加BN层加速收敛,引入Anchors提高对重叠物体的检测,YOLOv3在YOLOv2的基础上做了一些改进,其中有两个值得一提的亮点,一个是使用残差模型,进一步加深了网络结构;另一个是使用FPN架构实现多尺度检测。yolov4保留了yolov3的head部分,修改了主干网络为CSPDarknet53,同时采用了SPP


二、Kaggle新冠疫情

介绍一下你的项目

近几年新冠疫情非常流行,医学影像信息学协会为了帮助更多患者得到有效治疗,在kaggle上举办了这个比赛。

在比赛中,一个患者可以做多次检查,每次检查对应多张医学影像图像,而这些图像就是我们的比赛数据,比赛要求对图像预测出新冠病毒的位置,对检查要求预测出是哪一种新冠病毒,我对图像用YOLOv5去做目标检测,对检查用了efficientnet去做分类。

我通过旋转、平移等数据增强方法提升了模型效果,另外还有一个trick的点就是用efficient对图像进行分类,类别是图像中是否存在新冠异常区域,将efficient的分类结果去和YOLOV5的检测结果做融合,如果effcient认为图像中不存在新冠病毒异常区域,那YOLOV5的检测结果就作废,此外还训练多个YOLOv5模型和efficientnet模型做模型融合来提升mAP

EDA部分

  1. 1、样本是什么样

有2个医学影像dcm格式存储的训练集和测试集,(pydicom来载入处理dicom文件,通过pixel_array来查看病人医疗影像图),2个csv文件存储样本标签信息,1个csv文件标明submission上传格式

  • 2、标签是什么样的

对于每一张图像如果有新冠标注opacity、置信度、预测框xmin、ymin、xmax、ymax,如果没有新冠就输出none 1 0 0 1 1 

对于每一次检查是非新冠肺炎患者;典型新冠肺炎症状;不确定是否患病症状;非典型新冠肺炎患者症状中的一类,格式如Negative 1 0 0 1 1 。

study,series,image,patients对应关系: 一个患者(patient)可以做多次检查(study),一次检查包含多个检查部位(series) ,而每个检查部位都有一张或多张相应的影像图像(image)

  • 3、样本量有多大

训练数据6054个,测试数据样本数1214

  • 4、样本里除了图片还有哪些信息?用到模型里了没

还有姓名、性别等一些患者基本信息,没有用到模型里,这些信息都是一些保密信息

5、数据清洗、数据增强、类别平衡,与前几名差距在哪,有没有尝试集成的方法

没有做数据清洗工作,它的数据是正常的;

数据增强部分做了旋转放缩、平移

类别平衡:使用focal loss来增加类别少、难分样本的权重

训练的模型还不够多,模型还不够先进

模型融合做法是直接加权平均,几个模型权重和为1,不断尝试

6、mAP怎么计算

AP: PR曲线下面积,mAP: 即各类别AP的平均值

7、你是把测试集所有图片都送入yolov5去预测位置吗

是的,将submission.csv表格image_id就对应所有图像,全部送入yolov5;study_id对应的图片送入efficientnet,如果一个study对应多张图像,就随便用一张。

yolo部分

1、参数设置

超参(网格搜索法):学习率 10^-3 / 优化器 Adam / batch_size 16 / epoch 10 /

image size 512 / study size 600

2、你是根据什么来做的earlying stop/学习率衰减

如果连续2个epoch验证集的loss不下降就停止训练

设置学习率的衰减率,超过2个epoch的vaild loss不下降就降低LR

只要模型是收敛的,那么训练loss和验证loss一定是在下降的

过拟合:训练loss越来越小,验证loss越来越大

欠拟合:训练loss、验证loss居高不下

3、图片输入前怎么做的归一化 / 为什么不用零均值归一化呢

线性归一化 / 因为图像的像素值全都是正数,用线性归一化将其归一化到0-1之间比0均值归一化(会有负值)更符合实际物理意义

4、你是怎么使用的yolov5

在kaggle里使用命令行下载yolov5然后进行训练后在后台服务器输出对应txt文档

5、yolo的依赖每次都要重新下载吗

是的,每次重新运行这个kernel都要重新下载

6、你yolo只训练这么短的时间,有做什么预训练吗

用的是yolov5公开的预训练模型(就是已经训练好的模型)做初始化,数据集使用的是coco(80个类别)

7、yolo你是只用了512的尺寸去做训练吗

不是,尝试了多个尺寸,比如256,通过这种方式来增加数据量(efficientnet是用固定尺寸600)

8、yolo的预测框如果没有输出怎么办

产生的txt文档中输出NONE值

9、为什么不用别的目标检测模型做模型融合?多个YOLO V5模型的预测结果不是差不多吗,为什么还要用它们做模型融合?

时间不充裕/可以提高泛化能力,增强模型稳定性

10、如果一张图片有多个预测的目标框,在txt是存的一行还是多行

多行

11、1个study_id如果对应多个image_id怎么办

任取一个image_id预测的类型给study_id

12、训练的时候训练集存放在哪里

将kaggle的训练集存放到yolo要求的层级结构里

13、kaggle的label与yolo的label不一致如何处理

做转换,将kaggle的转为yolo的

efficientnet部分

1、什么是k折交叉验证,作用是什么

提高了训练结果的稳定性(训练了k次取平均结果)

2、你是怎么使用的efficientnet

可以作为python一个包来使用


三、文本检测部分

1、弯曲形变的文字识别时需要怎么处理?

通过仿射变换后变成不弯曲的图像

2、使用常规的目标检测如YOLO、Faster-RCNN作为文本检测模型有什么局限性?效果和专门的文本检测有什么区别?

常规的目标检测算法检测的都是生活中常见长宽比的目标,而文本长宽比一般特别大,普通的目标检测算法在不经过特殊的改进是无法解决的。

3、OCR领域常用的评估指标是什么

检测阶段是大于某个IOU阈值的准确率、召回率,识别阶段是准确率

4、单张图上多语种并存识别(如单张图印刷和手写文字并存),应该如何处理?

尝试”1个检测模型+1个N分类模型+N个识别模型”的解决方案:其中不同类型文本共用同一个检测模型,N分类模型指额外训练一个分类器,将检测到的文本进行分类,如手写+印刷的情况就是二分类,N种语言就是N分类,在识别的部分,针对每个类型的文本单独训练一个识别模型,如手写+印刷的场景,就需要训练一个手写体识别模型,一个印刷体识别模型,如果一个文本框的分类结果是手写体,那么就传给手写体识别模型进行识别,其他情况同理。

5、CRNN能否识别两行的文字?

只能识别一行

6、怎么判断文本行图像是否颠倒?

训练一个正常图像和颠倒图像的方向分类器进行判断。

7、对于一些在识别时稍微模糊的文本,有没有一些图像增强的方式?

在人类肉眼可以识别的前提下,可以考虑图像处理中的均值滤波、中值滤波或者高斯滤波等模糊算子尝试。

8、目标检测中如果目标是倒着的怎么办?

加入另外一条网络,判断目标是正着还是倒着,如果是倒着,就把目标旋转180度。

9、90%的准确率是指什么,是mAP吗?你是怎么得出来的?

预测为文本框且实际也为文本框的数量/预测为文本框的数量

10、文本检测和文本识别怎么衔接起来

文本检测得到的预测框进行裁剪后送入文本识别模型进行训练


训练相关

1、你从项目中学到了什么

(1)学到了如何把理论运行到实践,切实体会到了深度学习如何应用到我们实际生活中

(2)也知道了怎么把一个生活中的实际问题进行数学建模,并通过计算机科学的知识来解决

人类医生如何判断->图像中是否有异常区域->计算机是否能够完成这个任务呢->目标检测

2、代码量有多少

平均每个项目大概有一两千行,在看官方源码的时候也会把一些重要部分跟着敲一遍

3、遇到过什么样的挑战?怎么解决的

万事开头难,刚开始实际接触一个项目,不知道怎么入手,很多时候代码也看不懂。比如刚开始参加kaggle连比赛规则都读不懂。我的解决办法就是坚持,并想尽一切办法克服困难解决问题,包括求助老师,在论坛提问等

4、你做了哪些工作

新冠:首先对数据进行了分析,看数据有没有缺失、异常值,分析数据的分布,将数据处理为yolov5和efficientnet要求的格式,设置参数后用yolov5和efficientnet进行训练和预测,再将结果处理为比赛要求的格式进行提交

文字识别:主要是复现论文,训练,调试

5、训练时间

一个epoch是把所有样本运行一遍

yolo每次训练时间:3 hours

训练1个epoch大概半小时(设置了10个epoch)

effientnet每次训练时间:2 hours

训练1个epoch大概6~7分钟(设置了20个epoch)

6、训练集怎么来的

yolo:kaggle提供的数据集,也可以自己上传数据集,不过自己没这样做

文本检测:来自天池一个相关的文字检测的数据集

7、你有什么自己的创新吗?

yolo:

(1)通过旋转、平移等数据增强方法提升了模型效果

(2)用efficient对图像进行分类,类别是图像中是否存在新冠异常区域,将efficient的分类结果去和YOLOV5的检测结果做融合,如果effcient认为图像中不存在新冠病毒异常区域,那YOLOV5的检测结果就作废

(3)训练多个YOLOv5模型和efficientnet模型做模型融合来提升mAP

文本检测:

(1)数据扩增部分用到旋转、裁剪、翻转这些操作,

(2)由于基础网络是用的FCN,所以输入图片可以是任意大小,于是做了将图片从128*128到768*768每次增大128像素。不进行该数据扩增,valid_loss在0.54左右,做了数据扩增之后降到0.33左右。(从别的论文上看到的这个做法)
(2)测试时发现尺寸较大的图比尺寸小的图检测效果好,所以测试时在输入之前先调整图片大小,再送入测试。

8、如果再做一次,有什么改进的地方

可以尝试一些更先进的网络结构,多做一些模型融合

9、选择什么设备做的

kaggle提供的TPU,且只有1个TPU,每个TPU最多可以加载16张图

文本项目是GPU(用的kaggle每个月的免费时长)

10、kaggle有哪些设备可以选择

CPU,GPU,TPU

11、各项参数以及超参存放在哪里

yolov5是存放在yaml里,east是存放在config.py

12、输入输出

新冠:

yolo:

  • 输入:原图resize到512*512(32的倍数,5次下采样)
  • 输出:类别概率、置信度、预测框坐标

efficientnet:

预测新冠类型

  • 输入:原图resize到600*600(B0尺寸是224,B7是600)
    • 为什么是600*600?:网络结构含有全连接层,全连接层本质是特征和权重矩阵相乘运算,权重矩阵的大小是确定的,由此倒推出输入必须是600*600
  • 输出:4分类(哪个概率最大)

预测是否有新冠

  • 输出:2分类
    • sigmoid输出一个值,大于一定阈值为正,否则为负样本
    • softmax输出两个值,找最大

文本:

advanced_EAST

  • 输入:32倍数(5个卷积块)
  • 输出:7通道

CRNN

  • 按照预测框坐标对原图进行裁剪后送入CRNN
  • 文字序列,通过beam search得到

14、卷积怎么调整维度到全连接层

1个卷积核提取一张图像的某些特征,通过多个卷积核来提取一张图像的多种特征,丰富特征提取能力。一个卷积核和原图卷积相乘得到一片特征映射图,多个卷积核和原图相乘得到一块特征映射图(长方体w*h*c),将w*h*c的特征映射resize成1*whc

15、yolov5的输出存在哪里/efficientnet输出~

存为txt / 直接输出

16、public board和private board区别

public排名是比赛前看到的,他只用了测试集的部分来进行评估,以防有人拟合这些数据来获得高排名,private board是最终放出的榜,用到了所有的测试集

17、你说的mAP的提升是在public还是private上的提升

public

组面问题整理

1、检测新冠使用bounding box框出来吗,如果是的话后面用efficientnet做分类,是对整张图做分类吗?那这样是两个过程吗

这是两个独立的过程,yolo和efficientnet都是对整张resize后的图做处理然后输出,所以对每个过程来说是one-stage的

2、efficientnet的输入是怎么确定的,因为它一般是一个224*224的input然后你yolov5检测bounding box的shape不一定是这样的,这里你是怎么做的

3、我想知道这个评价指标为什么是mAP(又准又全)

AP是PR曲线的面积,所以计算AP需要得到PR值,对于分类问题我们我们将大于一定阈值的设为正样本,否则为负样本,对于回归问题我们将预测框与真实框IOU大于一定阈值(设置的是0.5)的设为正样本,然后kaggle自动会计算出mAP的值并进行排名

4、你的这个模型融合是怎么样的一个融合过程?你这个是在哪里进行计算的

调用库函数得到每个模型结果后进行加权平均,在kaggle的notebook上进行计算

5、训练一个epoch要多久

6、海豚和鲸鱼比赛做得怎么样了

7、鲸鱼比赛的数据量

训练集5万多张,测试集将近3万张

8、为什么用的是arcface,是指loss还是network architecture

9、你是一个人参加比赛的吗

10、kaggle金、银、铜怎么分区的

0.1% 金、5% 银、10%铜

11、你是去年毕业的,那你去年到今年是一直在准备考研的内容吗

12、你对我们实验室有什么了解吗/你对工研院有什么了解吗

13、你对以后的研究生读完有什么规划吗,比如硕士毕业会选择就业还是读博

本文标签: