Editsprings@163.com (周一至周日,9:00-23:00) | (周一至周日,9:00-23:00)

yolo2源码解读翻译,EditSprings,艾德思

网络 | 2019/03/13 11:21:15  | 110 次浏览



版权声明:本文为博主原创论文,未经博主允许不得转载.

yolo2 最重要的就是框的设计和loss的设计,

前言 这里汇总三篇博客,作为对本篇博客的基础. :

该博客给出了具体的源码,但没有loss

翻译地址

本着对开源博客的尊重,只为学习,请勿随意转载,希望路过的各位移步原创.

Loss设计 先上图,结合图看代码:接下来在代码中体现这5个loss

region_layer . c

 

该函数提取框

box get_region_box ( float * x , float * biases , int n , int index , int i , int j , int w , int h , int stride ) {

box b ;

b . x = ( i + x [ index + 0 * stride ] ) / w ;

b . y = ( j + x [ index + 1 * stride ] ) / h ;

b . w = exp ( x [ index + 2 * stride ] ) * biases [ 2 * n ] / w ;

b . h = exp ( x [ index + 3 * stride ] ) * biases [ 2 * n + 1 ] / h ; // printf ( "%f/%d/%d - %f/%f/%f/%f\n" , x [ index + 2 * stride ] , w , h , b . x , b . y , b . w , b . h ) ; return b ; }

该函数计算iou,并保存iou loss到delta

float delta_region_box ( box truth , float * x , float * biases , int n , int index , int i , int j , int w , int h , float * delta , float scale , int stride ) {

box pred = get_region_box ( x , biases , n , index , i , j , w , h , stride ) ; float iou = box_iou ( pred , truth ) ; float tx = ( truth . x * w - i ) ; float ty = ( truth . y * h - j ) ; float tw = log ( truth . w * w / biases [ 2 * n ] ) ; float th = log ( truth . h * h / biases [ 2 * n + 1 ] ) ;

 

delta [ index + 0 * stride ] = scale * ( tx - x [ index + 0 * stride ] ) ;

delta [ index + 1 * stride ] = scale * ( ty - x [ index + 1 * stride ] ) ;

delta [ index + 2 * stride ] = scale * ( tw - x [ index + 2 * stride ] ) ;

delta [ index + 3 * stride ] = scale * ( th - x [ index + 3 * stride ] ) ; return iou ; }

 

void forward_region_layer ( ) { . . . for ( b = 0 ; b < l . batch ; + + b ) { if ( l . softmax_tree ) { // 没执行

} // 下面的 for 循环是计算没有物体的 box 的 confidence 的 loss

// 1 , 遍历所有格子以及每个格子的 box,计算每个 box 与真实 box 的 best_iou

// 2 , 先不管三七二十一,把该 box 当成没有目标来算 confidence 的 loss

// 3 , 如果当前 box 的 best_iou > 阈值,则说明该 box 是有物体的,于是上面哪行计算的 loss 就不算数,因此把刚才计算的 confidence 的 loss 清零.

// 假设图片被分成了 13 * 13 个格子,那 l . h 和 l . w 就为 13 // 于是要遍历所有的格子,因此下面就要循环 13 * 13 次

for ( j = 0 ; j < l . h ; + + j ) { for ( i = 0 ; i < l . w ; + + i ) { // 每个格子会预测 5 个 boxes,因此这里要循环 5 次

for ( n = 0 ; n < l . n ; + + n ) { // 获得 box 的 index

int box_index = entry_index ( l , b , n * l . w * l . h + j * l . w + i , 0 ) ; // 获得 box 的预测 x , y , w , h,注意都是相对值,不是真实坐标

box pred = get_region_box ( l . output , l . biases , n , box_index , i , j , l . w , l . h , l . w * l . h ) ; float best_iou = 0 ; // 下面的循环 30 次我是这么理解的:

// 假设一张图片中最多包含 30 个物体,于是对每一个物体求 iou

// 30 设定值,"假设一张图片中最多包含 30 个物体'.

for ( t = 0 ; t < 30 ; + + t ) { // get truth_box's x , y , w , h

box truth = float_to_box ( net . truth + t * 5 + b * l . truths , 1 ) ;

printf ( "\ti=%d, j=%d, n=%d, t=%d\n" , i , j , n , t ) ; // 遍历完图片中的所有物体后退出

if ( !truth . x ) { break ; } float iou = box_iou ( pred , truth ) ; if ( iou > best_iou ) {

best_iou = iou ; } } // 获得预测结果中保存 confidence 的 index

int obj_index = entry_index ( l , b , n * l . w * l . h + j * l . w + i , 4 ) ;

avg_anyobj += l . output [ obj_index ] ; // 这里先不管三七二十一,直接把该 box 当成没有目标来算 loss 了.第一个loss

l . delta [ obj_index ] = l . noobject_scale * ( 0 - l . output [ obj_index ] ) ; // 然后再做个判断,如果当期 box 计算的 best_iou > 阈值的话,则说明该 box 是有物体的,于是上面哪行计算的 loss 就不算数,因此清零.

if ( best_iou > l . thresh ) {

l . delta [ obj_index ] = 0 ; } // 查了查代码,这里是"如果已经训练的图片数量 < 12800 的话则进入循环',为什么要判断这玩意 . . . . if ( * ( net . seen ) < 12800 ) { // 单纯的获取"以当前格子中心'为 x , y 的 box 作为 truth box

box truth = { 0 } ;

truth . x = ( i + .5 ) / l . w ;

truth . y = ( j + .5 ) / l . h ;

truth . w = l . biases [ 2 * n ] / l . w ;

truth . h = l . biases [ 2 * n + 1 ] / l . h ; // 将预测的 tx , ty , tw , th 和 实际box计算得出的 tx ',ty' , tw ', th' 的差存入 l . delta

/ 第二个loss,下面函数本身就是重写delta,最后在计算 sum

delta_region_box ( truth , l . output , l . biases , n , box_index , i , j , l . w , l . h , l . delta , .01 , l . w * l . h ) ; } } } } // 下面的循环 30 次中的 30 这个数我看了很久都没找到这个 30 能和什么关联上,于是猜测 30 的含义是:"假设一张图片中最多包含 30 个物体'

// 因此下面是"直接遍历一张图片中的所有已标记的物体的中心所在的格子,然后计算 loss',而不是"遍历那 13 * 13 个格子后判断当期格子有无物体,然后计算 loss'

for ( t = 0 ; t < 30 ; + + t ) { // get truth_box's x , y , w , h

box truth = float_to_box ( net . truth + t * 5 + b * l . truths , 1 ) ; // 如果本格子中不包含任何物体的中心,则跳过

if ( !truth . x ) break ; float best_iou = 0 ; int best_n = 0 ; // 假设图片被分成了 13 * 13 个格子,那 l . h 和 l . w 就为 13 // 于是要遍历所有的格子,因此下面就要循环 13 * 13 次

// 也因此,i 和 j 就是真实物品中心所在的格子的"行'和"列'

i = ( truth . x * l . w ) ;

j = ( truth . y * l . h ) ;

printf ( "%d %f %d %f\n" , i , truth . x * l . w , j , truth . y * l . h ) ;

box truth_shift = truth ; // 上面获得了 truth box 的 x , y , w , h,这里讲 truth box 的 x , y 偏移到 0 , 0 ,记为 truth_shift . x , truth_shift . y,这么做是为了方便计算 iou

truth_shift . x = 0 ;

truth_shift . y = 0 ;

printf ( "index %d %d\n" , i , j ) ; // 每个格子会预测 5 个 boxes,因此这里要循环 5 次

for ( n = 0 ; n < l . n ; + + n ) { // 获得预测结果中 box 的 index

int box_index = entry_index ( l , b , n * l . w * l . h + j * l . w + i , 0 ) ; // 获得 box 的预测 x , y , w , h,注意都是相对值,不是真实坐标

box pred = get_region_box ( l . output , l . biases , n , box_index , i , j , l . w , l . h , l . w * l . h ) ; // 这里用 anchor box 的值 / l . w 和 l . h 作为预测的 w 和 h

// ps : 我打印了下 l . bias_match,它的值是 1 ,说明是能走到里面的,而之所以这么做的原因我是这么理解的:

// 在 yolo v2 的文章中提到:预测 box 的 w , h 是根据 anchors 生成 ( anchors 是用 k - means 聚类得出的最优结果 ) ,即:

// w = exp ( tw ) * l . biases [ 2 * n ] / l . w

// h = exp ( th ) * l . biases [ 2 * n + 1 ] / l . h

// 不过为什么把 exp ( ) 部分省去还有些疑惑,希望有知道原因的大佬能帮忙解答下.

if ( l . bias_match ) {

pred . w = l . biases [ 2 * n ] / l . w ;

pred . h = l . biases [ 2 * n + 1 ] / l . h ; }

printf ( "pred: (%f, %f) %f x %f\n" , pred . x , pred . y , pred . w , pred . h ) ; // 上面 truth box 的 x , y 移动到了 0 , 0 ,因此预测 box 的 x , y 也要移动到 0 , 0 ,这么做是为了方便计算 iou

pred . x = 0 ;

pred . y = 0 ; float iou = box_iou ( pred , truth_shift ) ; if ( iou > best_iou ) {

best_iou = iou ;

best_n = n ; } }

printf ( "%d %f (%f, %f) %f x %f\n" , best_n , best_iou , truth . x , truth . y , truth . w , truth . h ) ; // 根据上面的 best_n 找出 box 的 index

int box_index = entry_index ( l , b , best_n * l . w * l . h + j * l . w + i , 0 ) ; // 计算 box 和 truth box 的 iou 第三个loss

float iou = delta_region_box ( truth , l . output , l . biases , best_n , box_index , i , j , l . w , l . h , l . delta , l . coord_scale * ( 2 - truth . w * truth

. h ) , l . w * l . h ) ; // 如果 iou > .5 ,recall + 1 if ( iou > .5 ) recall += 1 ;

avg_iou += iou ; // 根据 best_n 找出 confidence 的 index

int obj_index = entry_index ( l , b , best_n * l . w * l . h + j * l . w + i , 4 ) ;

avg_obj += l . output [ obj_index ] ; // 因为运行到这里意味着该格子中有物体中心,所以该格子的 confidence 就是 1 , 而预测的 confidence 是 l . output [ obj_index ] ,所以根据公式有下式

// 以下即第四个loss

l . delta [ obj_index ] = l . object_scale * ( 1 - l . output [ obj_index ] ) ; if ( l . rescore ) { // 用 iou 代替上面的 1 ( 经调试,l . rescore = 1 ,因此能走到这里 )

l . delta [ obj_index ] = l . object_scale * ( iou - l . output [ obj_index ] ) ; } // 获得真实的 class int class = net . truth [ t * 5 + b * l . truths + 4 ] ; if ( l . map ) class = l . map [ class ] ; // 获得预测的 class 的 index

int class_index = entry_index ( l , b , best_n * l . w * l . h + j * l . w + i , 5 ) ; // 把所有 class 的预测概率与真实 class 的 0 / 1 的差 * scale,然后存入 l . delta 里相应 class 序号的位置

第五个loss

delta_region_class ( l . output , l . delta , class_index , class , l . classes , l . softmax_tree , l . class_scale , l . w * l . h , & avg_cat ) ; + + count ; + + class_count ; } }

printf ( "\n" ) ; // 现在,l . delta 中的每一个位置都存放了 class /confidence/x , y , w , h 的差,于是通过 mag_array 遍历所有位置,计算每个位置的平方的和后开根

// 然后利用 pow 函数求平方

* ( l . cost ) = pow ( mag_array ( l . delta , l . outputs * l . batch ) , 2 ) ;

printf ( "Region Avg IOU: %f, Class: %f, Obj: %f, No Obj: %f, Avg Recall: %f, count: %d\n" , avg_iou / count , avg_cat / class_count , avg_obj / count , a

vg_anyobj / ( l . w * l . h * l . n * l . batch ) , recall / count , count ) ; 翻译 文章地址:YOLO9000:Better, Faster, Stronger 项目主页:YOLO: Real-Time Object Detection

摘要: 我们介绍YOLO9000,一个最先进的,实时目标检测系统,可以检测超过9000个目标类别.首先,我们提出对YOLO检测方式的各种改进方式,包括新颖的和从以前的工作中得出的.改进的模型YOLOv2在如PASCAL VOC和COCO标准检测任务是最先进的.使用一种新颖的多尺度训练方式,相同的YOLOv2模型可以运行在不同的大小的图片上,提供速度和精度之间的轻松权衡.在67 FPS时,YOLOv2在VOC 2007上获得76.8 mAP.在40 FPS时,YOLOv2获得78.6 mAP,性能优于最先进的方式,例如使用ResNet的faster RCNN和SSD,同时运行速度明显更快.最后,我们提出了一种联合训练目标检测和分类的方式.使用这种方式,我们在COCO检测数据集和ImageNet分类数据集上同时训练YOLO9000.我们的联合训练方式允许YOLO9000预测没有标记检测数据的目标类的检测.我们在ImageNet检测数据集上验证我们的方式.YOLO9000在ImageNet检测验证集上获得19.7 mAP,尽管只有200个类中的44类检测数据.在不在COCO的156类中,YOLO9000获得16.0 mAP.但是YOLO可以检测超过200个类;它预测超过9000个不同目标类别的检测.它仍然实时运行.

1/引言 通用目标检测应该快速,准确,并且能够识别各种各样的目标.自从引入神经网络以来,检测框架已经变得越来越快速和准确.然而,大多数检测方式仍然局限于一小组目标.

与分类和标记等其他任务的数据集相比,当前目标检测数据集是有限的.最常见的检测数据集包含数十到数十万的图像,具有几十到几百个标签.分类数据集具有数百万个具有数十或数十万类别的图像.

我们希望检测可以缩放到目标分类的级别.然而,用于检测的标记图像比用于分类或标记的标记(标签通常由用户免费提供)昂贵得多.因此,我们不太可能在不久的将来看到与分类数据集相同规模的检测数据集.

我们提出了一种新方式来利用我们已经拥有的大量分类数据,并使用它来扩大当前检测系统的范围.我们的方式使用目标分类的层次视图,允许我们将不同的数据集合在一起.

我们还提出了联合训练算法,允许我们在检测和分类数据上训练目标检测器.我们的方式利用标记的检测图像来学习精确地定位目标,同时使用分类图像来增加其词汇和鲁棒性.

使用这种方式,我们训练YOLO9000,一个实时目标检测器,可以检测超过9000不同的目标类别.首先,我们改进基本的YOLO检测系统,以产生YOLOv2,一个最先进的,实时检测器.然后我们使用我们的数据集组合方式和联合训练算法来训练来自ImageNet的超过9000个类的模型以及来自COCO的检测数据.

我们的所有代码和预训练模型都可以在在线获得.

 

2/更好

相对于现有技术的检测系统,YOLO具有各种缺点.与fast RCNN相比,YOLO的误差分析显示YOLO产生大量的定位误差.此外,与基于候选区域的方式相比,YOLO具有相对较低的召回率率.因此,我们主要集中在改进召回率和定位,同时保持分类精度.

计算机视觉通常趋向于更大,更深的网络.更好的性能通常取决于训练更大的网络或将多个模型组合在一起.然而,使用YOLOv2,我们需要一个更加精确的检测器使得它仍然很快.我们不是扩展我们的网络,而是简化网络,使表示更容易学习.我们从过去的工作中融合了我们自己的新概念的各种想法,以提高YOLO的性能.结果总结可以在表2中找到.

批量标准化.批量归一化导致收敛的显着改善,而不需要其他形式的正则化.通过在YOLO中的所有卷积层上添加批量归一化,我们在mAP中获得超过2%的改进效果.批量规范化也有助于规范模型.使用批次标准化,我们可以从模型中dropout,而不会过度拟合.

高分辨率分类器.所有最先进的检测方式使用ImageNet预训练分类器.从AlexNet开始,大多数分类器对小于256×256的输入图像进行操作[8].原来的YOLO在224×224分辨率上训练分类器网络,并将分辨率增加到448以用于检测.这意味着网络必须同时切换到学习目标检测并调整到新的输入分辨率.

对于YOLOv2,我们首先在分辨率为448×448的分辨率下对ImageNet上的10个epoch进行微调.这种网络时间可以在较高分辨率输入上调整滤波器.然后我们在检测时微调所得到的网络.这种高分辨率分类网络使我们增加了近4%的mAP.

使用anchor box进行卷积.YOLO直接使用卷积特征提取器顶部的完全连接的层来预测边界框的坐标.相比于直接预测坐标,faster RCNN使用手动挑选的先验预测边界框[15]来预测左边.仅使用卷积层,faster RCNN中的区域意见网络(RPN)预测anchor box的偏移和置信度.由于预测层是卷积的,因此RPN在特征图中的每个位置处预测这些偏移.预测偏移而不是预测坐标简化了问题,并使网络更容易学习.

我们从YOLO中删除全连接层,并使用anchor box预测边界框.首先,我们消除一个池化层,使网络的卷积层的输出更高的分辨率.我们还缩小网络将输入尺寸为416而不是448×448.我们这样做是因为我们想要特征图中大小为奇数,所以有一个中心单元格.目标,特别是大目标,倾向于占据图像的中心,所以在中心有一个单一的位置是很好的预测这些目标,而不是四个位置都在中心附近.YOLO的卷积层将图像下采样32倍,所以通过使用输入图像416,我们得到13×13的输出特征图.

当我们移动到anchor box时,我们也将类预测机制与空间位置解耦,而代之以预测每个anchor box的类和目标.在YOLO之后,目标预测在假设有一个目前提下仍然预测ground truth的IOU和提出的框和类预测预测该类的条件概率.

使用anchor box我们得到一个小的精度下降.YOLO每个图像只预测98个box,但使用anchor box我们的模型预测超过一千个box.没有anchor box,我们的中间模型获得69.5 mAP,召回率为81%.使用anchor box我们的模型获得69.2 mAP,召回率为88%,mAP少量减少,召回率的增加意味着我们的模型有更多的改进空间.

维度集群.当使用YOLO时,我们遇到两个关于anchor box的问题.第一个是box尺寸是手工挑选的.网络可以学习适当地调整框,但如果我们选择更好的先验网络开始,我们可以使网络更容易学习预测良好的检测.

我们不是手动选择先验,而是在训练集边界框上运行k-means聚类,以自动找到好的先验.如果我们使用标准的k均值与欧几里德距离较大box会产生比较小的box更多的误差.然而,我们真正想要的是先进的,导致良好的IOU分数,这是独立的box的大小.因此,对于我们的距离,我们使用下面的公式:

d(box,centroid)=1-IOU(box,centroid)

我们对k的不同值运行k-means,并绘制具有最接近质心的平均IOU,参见图2.我们选择k = 5作为模型复杂性和高召回率之间的良好权衡.聚类中心与手工挑选的anchor box有很大不同.有更少的短的宽的box和更多的高的窄的box.

图2:VOC和COCO的聚类框尺寸.我们在边界框的维度上运行k均值聚类以获得我们的模型的先验.左图显示了对于k的各种选择得到的平均IOU.我们发现k = 5给出了召回率和模型复杂性的良好权衡.右图显示了VOC和COCO的相对质心.两种方式都有利于更薄,更高的盒子,而COCO在尺寸上比VOC有更大的变化.

我们将平均IOU与我们的聚类策略和表1中的精选anchor box进行比较.只有5个先验的质心类似于9个anchor box,平均IOU为,而9个anchor box为.如果我们使用9个质心,我们看到一个高得多的平均IOU.这表明使用k-means生成边界框以更好的表示开始模型,并使任务更容易学习.

表1:VOC 2007上最接近的先验的平均IOU.VOC 2007上目标的平均IOU,与使用不同生成方式的其最接近的未修改先验.聚类提供比使用手挑选的先验更好的结果.

直接位置预测.当YOLO使用anchor box时我们遇到第二个问题:模型不稳定,特别是在早期迭代时.大多数不稳定性来自预测box的(x,y)位置.在候选区域网络中,网络预测值tx和ty和(x,y)中心坐标计算为:

x=(tx*wa)-xa,y=(ty*ha)-ya

例如,tx= 1的预测将使框向右移动anchor box的宽度, tx= -1的预测将使其向左移动相同的量.

这种公式是不受约束的,因此任何anchor box可以在图像中的任何点结束,而不管预测box的位置.使用随机初始化模型需要很长时间才能稳定到预测可感知的偏移.

相比于预测偏移,我们遵循YOLO的方式并预测相对于网格单元的位置的位置坐标.这将ground truth限制在0和1之间.我们使用逻辑激活函数来约束网络的预测落在该范围内.

网络预测输出要点图中每个单元格的5个边界框.网络为每个边界框预测tx,ty,th,tw和to这5个坐标.如果单元从图像的左上角偏移(x,y)并且边界框先前具有宽度和高度,,则预测对应于:

由于我们约束位置预测,参数化更容易学习,使得网络更稳定.使用维度集群以及直接预测边界框中心位置使YOLO比具有anchor box的版本提高了近5%的mAP.

细粒度特征.该修改的YOLO版本在13×13特征图上检测.虽然这对于大目标是足够的,但是它可以从用于定位较小目标的更细粒度特征中受益.Faster RCNN和SSD在网络中的各种特征映射上运行它们的提议网络以获得一系列分辨率.我们采取不同的方式,只是添加一个传递层,这个层能够将其他26×26分辨率的层融合起来.

传递层通过将相邻特征堆叠到不同的通道而不是堆叠到空间位置,将较高分辨率特征与低分辨率特征相连,类似于ResNet中的标识映射.这将26×26×512特征映射转换为13×13×2048特征映射,其可以与原始特征连接.我们的检测器在这个扩展的特征图的顶部运行,以便它可以访问细粒度的特征.这给出将近1%的性能提高. 图3:具有维度先验和位置预测的边界框.我们将box的宽度和高度预测为来自聚类中心的偏移.我们使用sigmoid函数预测框相对于过滤器应用的位置的中心坐标.

多尺度训练.原始的YOLO使用448×448的输入分辨率.添加anchor box后,我们将分辨率更改为416×416.然而,由于我们的模型只使用卷积层和池化层,它可以在运行中调整大小.我们希望YOLOv2能够在不同大小的图像上运行,因此我们将其训练到模型中.

相比于固定输入图像大小,我们每隔几次迭代更改网络.每迭代10个batch我们的网络随机选择一个新的图像尺寸大小.由于我们的模型以32的因子下采样,我们从以下32的倍数中抽取:{320,352,…,608}.因此,最小的选项是320×320,最大的是608×608.我们调整网络的大小,并继续训练.

这种训练方式迫使网络学习在各种输入维度上很好地预测.这意味着相同的网络可以预测不同分辨率的检测.网络在更小的尺寸下运行更快,因此YOLOv2在速度和精度之间提供了一个简单的折衷.

在低分辨率下,YOLOv2作为一个便宜且相当准确的检测器.在288×288分辨率下它运行超过90 FPS而且mAP几乎与Fast RCNN一样好.这使其成为较小的GPU,高帧率视频或多个视频流的理想选择.

在高分辨率下,YOLOv2是一种最先进的检测器,在VOC 2007上具有78.6 mAP,同时仍然在实时速度以上运行.YOLOv2与其他框架在VOC 2007上的比较见表3. 进一步的实验.我们训练YOLOv2在VOC 2012上进行检测.表4显示了YOLOv2与其他现有技术检测系统的比较性能.YOLOv2得到73.4 mAP,而运行速度远远快于其他方式.我们还对COCO进行训练,并与表5中的其他方式进行比较.在VOC指标(IOU = )上,YOLOv2获得44.0 mAP,与SSD和faster RCNN相当. 表3:P ASCAL VOC 2007的检测框架.YOLOv2比现有检测方式更快,更准确.它也可以运行在不同的分辨率上,以便在速度和精度之间轻松权衡.每个YOLOv2条目实际上是相同的训练模型具有相同的权重,只是在不同的大小进行评估.所有的时间信息是在Geforce GTX Titan X(原始,而不是Pascal模型).

3/更快

快速检测.我们希望检测准确,但我们也希望检测速度快.大多数检测应用,如机器人或自动驾驶汽车,都依赖于低延迟预测.为了最大化性能,我们设计YOLOv2从头开始快.

大多数检测框架依赖于VGG-16作为基本特征提取器[17].VGG-16是一个功能强大,精确的分类网络,但它是不必要的复杂.VGG-16的卷积层需要亿浮点操作用于在224×224分辨率的单个图像上的单次通过.

YOLO框架使用基于Googlenet架构的自定义网络[19].这个网络比VGG-16快,只使用亿次操作进行正向传递.但是,它的精度略差于VGG-16.对于单一目标,在224×224分辨率上的top-5精度,YOLO的定制模型ImageNet获得%,而VGG-16为%.

Darknet-19.我们提出了一个新的分类模型作为YOLOv2的基础.我们的模型建立在网络设计的先前工作以及在该领域的常识基础上.类似于VGG模型,我们使用大多数3×3的过滤器,并在每个池化步骤后将通道数量加倍[17].在网络中的网络(NIN)中的工作之后,我们使用全局平均池进行预测以及1×1滤波器以压缩3×3卷积之间的特征表示[9].我们使用批次归一化来稳定训练,加速收敛,并规则化模型[7].

我们的最终模型,称为Darknet-19,有19卷积层和5个最大池化层.有关完整说明,请参见表6. Darknet-19只需要亿次操作来处理图像,但在ImageNet上实现了%的top-1精度和%的top-5精度.

为分类器训练.我们使用以的起始学习速率的随机梯度下降,使用4的幂的多项式速率衰减,的权重衰减和的动量,我们使用Darknet神经网络框架在标准ImageNet 1000类分类数据集上训练网络[13]160个时期.在训练期间,我们使用标准数据增加技巧,包括随机作物,旋转,以及色调,饱和度和曝光移位.

如上所述,在我们对224×224的图像的初始训练之后,我们在更大的尺寸如448上微调我们的网络.对于这种微调,我们用上述参数训练,但是仅仅10个时期,并且以的收益率开始.在这个更高的分辨率下,我们的网络实现了top-1精度为%,top-5精度为%.

为检测器训练.我们通过去除最后的卷积层并且替代地添加具有1024个滤波器的三个3×3卷积层来修改该网络,每个随后是具有我们需要检测所需的输出数量的最后的1×1卷积层.对于VOC,我们预测5个box,每个具有5个坐标,每个box20个类,因此125个过滤器.我们还添加了从最后的3×3×512层到第二到最后的卷积层的传递层,使得我们的模型可以使用细粒度特征.

我们训练网络160个时期,开始学习率为,在60和90个时期将其除以10.我们使用的重量衰减和的动量.我们使用类似的数据增强YOLO和SSD随机作物,颜色转移等.我们使用相同的培训策略COCO和VOC.

表2:从YOLO到YOLOv2的路径.大多数列出的设计决定导致mAP的显着增加.两个例外是切换到具有anchor box和使用新网络的完全卷积网络.切换到anchor box样式方式增加了召回率,而不改变mAP,而使用新的网络切割计算33%.

表4:PASCAL VOC2012测试检测结果.YOLOv2的表现与最先进的检测器比较,如加上ResNet网络的faster RCNN和SSD512,并且是2 - 10倍.

表5:COCO测试的结果-dev2015.表改编自[11]

表6 darknet-19

4/更强大

我们提出了一个关于分类和检测数据的联合训练机制.我们的方式使用标记为检测的图像来学习检测特定信息,如边界框坐标预测和目标以及怎样分类常见目标.它使用只有类标签的图像来扩展它可以检测的类别数.

在训练期间,我们混合来自检测和分类数据集的图像.当我们的网络看到标记为检测的图像时,我们可以基于完整的YOLOv2损失函数反向传播.当它看到一个分类图像,我们只反向传播从结构的分类特定部分的损失.

这种方式提出了一些挑战.检测数据集只有常用目标和常规标签,如"dog'或"boat'.分类数据集具有更宽和更深的标签范围.ImageNet有超过一百多种品种的狗,包括"诺福克梗犬',"约克夏犬'和"贝灵顿梗犬'.如果我们想训练两个数据集,我们需要一种连贯的方法来合并这些标签.

大多数分类方式在所有可能的类别中使用softmax层来计算最终的概率分布.使用softmax假定类是互斥的.这提出了组合数据集的问题,例如,您不想使用此模型组合ImageNet和COCO,因为类"Norfolk terrier'和"dog'不是互斥的.

我们可以使用多标签模型来组合不承担互斥的数据集.这种方式忽略了我们所知道的关于数据的所有结构,例如所有的COCO类是相互排斥的.

分层分类.ImageNet标签是从WordNet中提取的,WordNet是一个语言数据库,用于构建概念及其关系[12].在WordNet中,"诺福克犬'和"约克夏犬'都是"猎犬'的下位词,"猎犬'是一种"猎犬',是一种"狗',是一种"犬'分类假设一个平面结构到标签,但是对于组合数据集,结构正是我们需要的.

WordNet被构造为有向图,而不是树,因为语言是复杂的.例如,"狗'既是"犬'的一种类型,也是"家畜'的类型,它们都是WordNet中的同义词.不是使用完整的图结构,我们通过从ImageNet中的概念构建层次树来简化问题.

为了构建这个树,我们检查ImageNet中的视觉名词,看看他们通过WordNet图到根节点的路径,在这种情况下是"物理目标'.许多synsets只有一条路径通过图,所以首先我们添加所有这些路径到我们的树.然后我们迭代地检查我们剩下的概念,并添加尽可能少地生长树的路径.因此,如果一个概念有两个到根的路径,一个路径会给我们的树添加三个边,而另一个只添加一个边,我们选择较短的路径.

最终的结果是WordTree,一个视觉概念的层次模型.要使用WordTree执行分类,我们预测在每个节点的条件概率的给定synset的同义词的每个下位词的概率.例如,在"terrier'节点,我们预测:

如果我们要计算特定节点的绝对概率,我们只需遵循通过树到达根节点的路径,并乘以条件概率.因此,如果我们想知道图片是否是诺福克梗犬,我们计算:

为了分类的目的,我们假设图像包含一个目标:Pr(物理目标)= 1.

为了验证这种方式,我们训练使用1000类ImageNet构建的WordTree上的Darknet-19模型.为了构建WordTree1k,我们在所有的中间节点中添加将标签空间从1000扩展到1369.在训练期间,我们沿着树传播ground truth标签,以便如果图像被标记为"诺福克梗犬',它也被标记为"狗'和"哺乳动物'等.为了计算条件概率,我们的模型预测了1369个值的向量,并且我们计算作为相同概念的下位词的所有系统的softmax,参见图5.

使用与以前相同的训练参数,我们的分层Darknet-19实现%的top-1精度和%的top-5精度.尽管增加了369个附加概念,并且我们的网络预测了一个树结构,我们的准确度只有轻微下降.以这种方法执行分类也具有一些益处.性能在新的或未知的目标类别上正常降级.例如,如果网络看到一只狗的图片,但不确定它是什么类型的狗,它仍然会预测具有高信度的"狗',但具有较低的置信度散布在上下义词.

这个公式也用于检测.现在,不是假设每个图像都有一个目标,我们使用YOLOv2的目标预测器来给我们Pr(物理目标)的值.检测器预测边界框和概率树.我们遍历树,在每个分割中采用最高置信度路径,直到我们达到某个阈值,我们预测目标类.

图5:ImageNet对WordTree的预测.大多数ImageNet模型使用一个大的softmax来预测概率分布.使用WordTree,我们对同义词执行多个softmax操作.

与WordTree的数据集组合.我们可以使用WordTree以合理的方法将多个数据集组合在一起.我们只需将数据集中的类别映射到树中的同义词.图6显示了使用WordTree组合来自ImageNet和COCO的标签的示例.WordNet极其多样化,因此我们可以将此技术用于大多数数据集.

联合分类和检测.现在我们可以使用WordTree组合数据集,我们可以训练我们的分类和检测联合模型.我们要训练一个极大尺度的检测器,因此我们使用COCO探测数据集和来自完整ImageNet版本的前9000类创建组合数据集.我们还需要评估我们的方式,所以我们添加在ImageNet还没有包括任何类的检测挑战集.WordTree数据集相应的具有9418个类.ImageNet是一个更大的数据集,因此我们通过对COCO进行过采样来平衡数据集,使ImageNet只有4:1的倍数.

我们使用此数据集训练YOLO9000.我们使用基本的YOLOv2架构,但只有3个先验,而不是5,以限制输出大小.当我们的网络看到检测图像时,我们回传正常的损失.对于分类损失,我们只反向传播损失在或高于标签的相应水平.例如,如果标签是"狗',我们会在树中"德国牧羊犬'和"金毛猎犬'的预测中分配任何错误,因为我们没有这些信息.

图6:使用WordTree层次结构组合数据集.使用WordNet概念图,我们构建了一个视觉概念的分层树.然后我们可以通过将数据集中的类映射到树中的synsets来将数据集合并在一起.这是WordTree的简化视图用于说明的目的.

当它看到一个分类图像,我们只反向分配损失.为此,我们只需找到预测该类的最高概率的边界框,然后仅计算其预测树上的损失.我们还假设预测框与grountruth标签重叠的IOU至少,并且基于该假设反向传播物体损失.

使用这种联合训练,YOLO9000使用COCO中的检测数据学习找到图像中的目标,并使用ImageNet中的数据学习分类各种各样的这些目标.

我们在ImageNet检测任务上评估YOLO9000.ImageNet的检测任务共享44个具有COCO的目标类别,这意味着YOLO9000只看到大多数测试图像的分类数据,而不是检测数据.YOLO9000获得19.7 mAP整体与16.0 mAP对不相交的156目标类,它从未见过任何标记的检测数据.这个mAP高于DPM实现的结果,但YOLO9000是在不同的数据集训练,只有部分监督[4].它还同时检测9000个其他目标类别,都是实时的.

当我们分析YOLO9000在ImageNet上的性能时,我们看到它学习了新的物种,但很难学习类别,如服装和设备.

新动物更容易学习,因为目标预测与COCO中的动物很好地一致.相反,COCO没有任何类型的衣服的边界框标签,只有人,所以YOLO9000努力模拟类似"太阳镜'或"游泳裤'的类别.

表7:ImageNet上的YOLO9000最佳和最差类.具有来自156个弱监督类的最高和最低AP的类.YOLO9000学习各种动物的好模型,但努力与新的类,如服装或设备.

5/结论

我们介绍YOLOv2和YOLO9000,实时检测系统.YOLOv2是最先进的,并且比其他检测系统在各种检测数据集中更快.此外,它可以以各种图像大小运行,以提供速度和精度之间的平滑权衡.

YOLO9000是一个通过联合优化检测和分类检测9000多个目标类别的实时框架.我们使用WordTree来组合来自各种来源的数据和我们的联合优化技术同时训练ImageNet和COCO.YOLO9000是关闭检测和分类之间的数据集大小差距的强大步骤.

我们的许多技术泛化到目标检测之外.ImageNet的ImageTree表示为图像分类提供了更丰富,更详细的输出空间.使用分层分类的地形组合在分类和分割领域将是有用的.诸如多尺度训练的训练技术可以在各种视觉任务中提供益处.

对于未来的工作,我们希望使用类似的技术弱监督图像分割.我们还计划使用更强大的匹配策略来改进我们的检测结果,以在训练期间将弱标签分配给分类数据.计算机视觉有大量的标记数据.我们将继续寻找方式,将不同的数据源和结构的数据结合在一起,形成更强大的视觉世界模型.

 

 

更多科研论文服务,动动手指,请戳 论文润色投稿期刊推荐论文翻译润色论文指导及修改论文预审

语言不过关被拒?美国EditSprings--专业英语论文润色翻译修改服务专家帮您!

上一篇:【严正申明】关于我公司网站被恶意抄袭严正声明

下一篇:Nature清华大学江鹏课题组揭示癌细胞通过p53调节氨代谢机制Nature报道专区,EditSprings,艾德思

特别声明:本文转载仅仅是出于传播信息的需要,并不意味着代表本网站观点或证实其内容的真实性;如其他媒体、网站或个人从本网站转载使用,须保留本网站注明的“来源”,并自负版权等法律责任;作者如果不希望被转载或者联系转载稿费等事宜,请与我们接洽。

凡注明来源为“EditSprings”的论文,如需转载,请注明来源EditSprings并附上论文链接。

最热论文