目标检测(六)YOLOv2__YOLO9000: Better, Faster, Stronger
Abstract
在该论文中,作者首先介绍了对YOLOv1检测系统的各种改进措施。改进后得到的模型被称为YOLOv2,它使用了一种新颖的多尺度训练方法,使得模型可以在不同尺寸的输入上运行,并在速度和精度上很容易找到平衡。当处理速度为40FPS时,YOLOv2取得76.8mAP的成绩,超过了当时最好的检测方法Faster RCNN with ResNet和SSD
接着,作者提出了一种在object detection和classification两个任务上进行联合训练的方法。借助该方法,作者同时在COCO检测数据集和ImageNet分类数据集上训练YOLO9000,最终使得YOLO9000能够检测在dectection dataset中不存在相应数据但是在cassification dataset中存在的classes
1. Introduction
通用的目标检测算法应该速度快、精度高,并且能够识别a wide variety of objects。虽然目前的detection frameworks已经变得足够fast and accuracy,但是绝大多数方法的检测范围仍局限于小部分objects
作者发现,与分类和tagging任务的数据集相比,当前用于目标检测的数据集非常受限。通常使用的目标检测数据集有几千到几十万张图像,对应几十到几百个tags,而分类数据集有几百万张图像,对应几万到几十万种categories。作者希望目标检测的范围能够达到目标分类那样的水平,可是标记检测使用的images比标记分类用的images要expensive很多,因此想得到拥有大量categories的目标检测数据集是不可能的
为了解决这个问题,作者在论文中提出了一种数据集结合法(dataset combination method)来利用现有的大量分类数据扩大当前检测系统的检测范围。该方法使用目标分类的分层视图(hierarchical view )将不同的数据集结合在一起
同时,作者提出了一种联合训练算法(joint training algorithm),使得object detection model能够同时在检测和分类数据集上训练。Model使用带标签的detection images来学习精确地定位objects,同时使用classification images来增加可检测的categories,提高鲁棒性
最终,使用数据集结合法和联合训练算法训练得到的YOLO9000可以实时检测超过9000种不同的object categories
后面的内容分为两部分:一部分是基于base yolo检测算法改进得到YOLOv2的过程;另一部分是使用数据集结合法和联合训练法训练YOLO9000的过程
第一部分:对YOLOv1的改进
在记录此部分之前我们先来简单地回顾下yolo模型的大致检测步骤:
- 将输入图像划分成S*S的网格(论文中使用7*7 grid,通过设置输出shape实现划分);
- 每个网格cell预测输入图像对应位置上的B个bounding boxes(通过对相同shape的labels进行回归训练实现对应位置的预测;没有使用anchor boxes,因为仅是指定了每个cell预测的数量,没有指定先验框);
- 根据设置的confidence score阈值去除预测得到的S*S*B个bounding boxes中score较低的bboxes,再利用非极大值抑制去除冗余的bounding boxes(避免多个bbox对应一个object)
2. Better
与Fast RCNN相比,YOLOv1有较多的定位误差;与基于region proposals的目标检测算法相比,YOLOv1的召回率比较低。因此作者关注如何在保持分类精度的同时提高回召率与定位精度
计算机视觉中一般倾向于使用更大更深的网络,因为训练larger networks或者集成多个模型能够带来更好的性能。但是,作者希望YOLOv2在做到更精确的同时,仍能够保持很快的速度。因此,作者没有采用扩大网络的方法,相反地,作者简化了网络,使得representation更容易学习。为此,作者基于以往的工作提出了一系列ideas来改善YOLOv1的性能。总的结果如Table 2所示:
具体如下:
- Batch Normalization
CNN在训练过程中网络每层输入的分布一直在改变,这会使训练过程难度加大,但可以通过 normalize 每层的输入解决这个问题。Batch normalization 可以显著改善收敛性,同时不需要其他形式的 regularization。通过在 YOLOv1 的所有卷积层中添加 batch normalization,mAP可以获得超过2%的提升。同时,batch normalization也有助于regularize the model。借助batch normalization,model可以不使用dropout减少overfitting - High Resolution Classifier
目前所有的 state-of-the-art 目标检测方法都使用在 ImageNet 上预训练的 classifier,YOLOv1 也不例外。从 AlexNet 网络开始,大多数 classifiers 的输入图像都小于256*256。同样,原始的 yolov1在224*224的输入图像上训练classifier network,然后增加图像的分辨率至448*448训练detection network。这就意味着在转换分辨率后网络需要同时学习object detetion和适应新的input resolution。
在YOLOv2中,作者先在ImageNet数据集上以448*448的分辨率fine tune 分类网络(classification network)10个epochs。这样就给了网络一定的时间来调整filters,以便在更高的分辨率输入上work better。接着作者在detection dataset上fine tune 网络。实验证实,作者使用的high resolution classification network给mAP带来几乎4%的提升。 - Convolutional With Anchor Boxes
YOLOv1使用feature extractor后面的fully connected layers直接预测bounding boxes的坐标,使得网络丢失较多的空间信息,从而定位不准。与直接预测坐标不同,Faster RCNN使用hand-picked priors预测bounding boxes。Faster RCNN中的region proposal network(RPN)只使用卷积层预测anchor boxes的offsets和confidences(RPN先在feature maps的每个位置预测出k个尺寸为achor boxes的region proposals,然后通过后面的 detection network 对 region proposals 进行分类和边框回归,以获得更逼近 ground truth boxes 的 bounding boxes)。因为预测层是卷积层,所以RPN会在 feature maps 的每个location都预测出offsets。显然,预测offsets而不是coordinates简化了问题,并且使得网络更容易学习。
作者为了在YOLOv2使用anchor boxes来预测bounding boxes,移除了YOLOv1网络中的全连接层。首先,作者除去了后面的一层pooling layer以便网络的卷积层输出有更高的resolution。同时,作者将输入图像的尺寸由 448*448 缩小到 416*416,这么做是为了在 feature maps 中获得奇数个 locations(448/32=14,426/32=13),从而使 feature maps 中只存在一个 center cell。作者发现图像的 objects,尤其是large objects,往往位于图像的中心。所以在feature maps的中心由一个location预测这些objects要优于4个locations 进行预测。
当使用anchor boxes之后,作者没有使用空间位置对应类别预测的机制,而是为每个anchor box预测 class 和 objectness。与YOLOv1相同,objectness prediction仍然预测ground truth与 proposed box的IOU值;class predictions预测在有object的情况下类的条件概率(是不是没有采用Faster中的做法而是采用了V1的做法)
采用anchor boxes以后虽然在精度上有所损失,但是带来的好处也是明显的。YOLOv1在每幅图像中只预测98个boxes(7*7*2),但是使用anchor boxes之后中间模型(intermediate model)预测出超过一千个boxes。此外,没有使用anchor boxes时中间模型的mAP为69.5,召回率为81%。使用anchor boxes之后,模型的mAP为69.2,召回率为88%。可见,虽然mAP降低了,但是上升的召回率意味着模型还有很大的提升空间。 - Dimension Clusters
作者在使用anchor boxes时遇到两个问题。第一个是box dimensions(anchor boxes的尺寸)是hand picked。网络能够学会适当地调整boxes,但是如果我们为网络找到better priors,那么网络可以更容易地学习预测good detections
在这个问题上作者没有像 Faster RCNN 中那样手动选择 priors,而是使用 k-means clustering 在训练数据集中的 bounding boxes 上自动寻找good priors。作者没有使用标准的k-means(使用Euclidean distance),因为那样会导致 large boxes 比 smaller boxes 产生更多error。考虑到需要的priors应该能够带来good IOU scores,并且独立于size of box,作者就使用了如下的距离度量:
既然使用了k-means来确定priors,那么超参数k的取值必然应该合理地选取。论文中作者尝试了不同取值的k,并且绘制了曲线图来直观表明聚类后各box与最近重心(centroid)的IOU的均值变化,如Fig.2所示:
作者在权衡模型复杂度与高召回率之后选择 k=5。通过对比发现,聚类得到的 cluster centriods 与手动精选(hand-picked)的 anchor boxes 有很大不同。聚类得到的 cluster centroids有更少的short,wide boxes,更多的tall,thin boxes。此外,作者还将k-means的聚类结果与hand-picked anchor boxes与数据集中boxes的IOU的均值做了比较,如Table 1所示。从表中可知,在仅有5个priors时,centroids的表现就能与9个anchor boxes类似(平均 IOU 61.0 vs 60.9)。如果使用9个centroids的话,会得到一个高得多的average IOU。这表明,使用k-means来生成边界框意味着使用了更好的表示方式启动模型,并使任务更容易学习 - Direct location prediction
使用anchor boxes时遇到的第二个问题是:model instability,尤其在early iterations期间。大部分不稳定性来自对 (x, y) 位置的预测。基于region proposals的网络预测 tx 和 ty 后按照如下公式计算中心坐标(x, y):
从公式可以看出,如果预测值 tx=1,那么box会向右移动一个anchor box的宽度;如果 tx=-1,那么box会向左移动一个anchor box的宽度。
该公式是无约束的,所以不管在什么位置预测box,任何一个bounding box可以出现在图像的任何一个位置。在随机初始化的情况下,模型需要耗费很长时间才能稳定地预测到合理地offsets。
上面的公式其实是错误的,应该将减号 “-” 换成 “+”,因为Faster RCNN中对anchor boxes坐标的计算如下,式中 x 是坐标预测值,xa 是anchor boxes的坐标(固定值,feature map中每个位置有9个anchor boxes),x*是坐标真实值(即训练数据的标注信息),其它变量与此类似。t 是偏移量:
在该论文中,作者没有像Faster RCNN中那样预测boxes相对整幅图像的offsets,而是采用YOLOv1的方法,对boxes坐标相对于所在grid cell的offsets进行预测。这样就将 ground truth 的位置约束到了0-1范围内。但是网络预测到的输出并不一定在0-1范围内,为了解决这个问题作者对网络预测的输出使用了 logistic activation。
网络在输出的feature map中为每个grid cell 预测5个bounding boxes。每个bounding box包含5个坐标,tx,ty,tw,th 和 to。如果某个cell相对于图像左上角的offset是(cx , cy),并且bounding box prior的宽和高为pw,ph,那么网络的预测值计算如下:
由于对location prediction进行了约束,参数化更容易学习,使得网络更稳定。网络使用dimension clusters和direct location prediction与使用anchor boxes相比,在mAP上提升了5%。 - Fine-Grained Features
修改的YOLO在一个13*13的feature map上进行预测。虽然这足以胜任large objects的检测,但是用上细粒度特征的话,这可能对小尺度的物体检测有帮助。Faster RCNN和SSD都在不同分辨率的feature maps上使用proposal networks。在YOLOv2中,作者使用了一种不同的方法,只需添加一个passthrough layer(转移层)将浅层特征图(分辨率26*26)连接到深层特征图(分辨率13*13)
Passthrough layer将higher resolution features和low resolution features连接起来,连接方式是将相邻的特征堆叠到不同的通道而非空间位置,类似于ResNet中的identity mappings。该方法把26*26*512的feature map转换成13*13*2048的feature map,得到的feature map可以与原始的features相连。YOLOv2的detectors使用的就是经过扩展的feature map,目的是获得更好的 fine grained features。实验表明,该措施能给模型带来1%的性能提升。
关于passthrough layer,具体来说就是特征重排(不涉及参数学习),前面26*26*512的feature map使用按行和按列隔行采样的方法得到4个新的feature maps,维度都是13*13*512,然后进行连接操作,得到13*13*2048的feature maps,并将其拼接到后面的层,相当于做了一次特征融合,有利于检测小目标。 - Multi-Scale Training
YOLOv1的输入分辨率为448*448,使用anchor boxes以后作者将分辨率改为416*416(获得center grid cell)。但是,因为我们的模型只使用卷积层和池化层,所以它的输入分辨率可以动态调整(输入图像的尺寸可变化)。作者希望YOLOv2可以鲁棒地检测不同尺寸的images,因此使用了不同分辨率的输入图像训练模型。
训练时作者没有固定输入图像的尺寸,而是每 10 个batchs随机选择一个新的尺寸。因为模型降采样的参数是32,所以随机尺寸在如下32的倍数构成的列表中选择:{320,352,…..,608}。每次更换size相当于将网络resize成另一个dimension,然后继续训练。
该策略强迫网络学习更好地在不同输入维度上进行预测,这意味着同一个网络可以对不同分辨率的图像进行检测。同时,图像尺寸越小YOLOv2检测速度越快,这为模型在速度与精度之间提供了较为容易控制的平衡。在低分辨率时,v2是一个轻便且精度相当高的detector。在分辨率为288*288时,YOLOv2可以以90FPS的速度运行,且mAP几乎和Fast RCNN一样好。因此,在低分辨率时,V2非常适用于smaller GPUs,高帧率视频或multiple video streams。在高分辨率时,YOLOv2达到了先进水平,在VOC2007数据集上实时运行的同时mAP达到了78.6。从Table 3和Fig.4可见YOLOv2与其他网络在VOC 2007上的比较。
- Further Experiments
作者在VOC 2012上对YOLOv2进行了检测训练。Table 4 展示了YOLOv2与其他先进检测系统之间的性能比较。可见,YOLOv2在运行得比其它方法快很多的情况下mAP依然达到了73.4
作者还在COCO数据集上训练了YOLOv2,并且与其它方法进行了比较,如Table 5所示。在COCO数据集上(IOU=0.5),YOLOv2的mAP达到44.0,与SSD和Faster RCNN相当
3. Faster
作者希望网络的检测过程不仅精度高而且速度快。因为在大多数检测应用的场景中,比如机器人和自动驾驶,低延迟预测相当重要。为了最大化网络的性能,作者将YOLOv2的基础结构设计得速度很快(意思是使用了速度很快的Darknet-19分类器作为feature extractor)
大多数 detection frameworks 将 VGG-16 作为基础的 feature extractor,这是因为 VGG-16 是一个强大精确的 classification network,但是它的结构比较复杂。此外,VGG-16的卷积层对分辨率为224*224的单幅图像处理时需要进行30.69 billion次浮点运算。
YOLOv1将基于Googlenet architecture自定义的network用做特征提取器。该network比VGG-16快,且在前向传播过程中只使用8.52 billion次运算,但是,它的精度略低于VGG-16
- Darknet-19
作者提出了一种新的classification model用做YOLOv2的基础,即feature extractor。该classification model的设计参考了前人的设计经验和领域内的基础知识。比如,与VGG models类似,作者主要使用了 3*3 的filters,并且在每个池化操作之后将通道数加倍;参照 Network in Network,作者使用 Global average pooling 进行预测,并且使用 1*1 filters在 3*3 卷积之间压缩特征表示(feature representation);此外,作者还使用 batch normalization来稳定训练过程、加快收敛、规范化模型
最终的 model被称为 Darknet-19,它有19个卷积层和5个最大池化层,具体构成见 Table 6。Darknet-19在处理单幅图像时只需要5.58 billion次运算,但是却能在数据集 ImageNet 上取得 72.9% 的 top-1 accuracy和 91.2% 的 top-5 accuracy
- Training for classification
作者在标准 ImageNet 1000 class classification dataset 上使用梯度下降法训练 YOLOv2 160个epochs,其中初始学习速率为 0.1,多项式速率衰减的幂为4(polynimial rate decay with a power of 4),权重衰减系数为0.0005,动量为0.9,并且使用了Darknet网络。分类训练时作者使用了标准的数据增强技术(Standard data augmentation tricks),包括随机裁剪、旋转和色度(hue)、饱和度(saturation)、曝光度(exposure)偏移
在对分辨率为224*224的输入进行分类训练之后,作者开始在更大尺寸448*448的输入上对网络进行fine tune。这次 fine tune 会训练网络的所有参数,但是只会训练 10 个epochs,微调时学习速率为10e-3。微调完成后,网络在该分辨率的输入上进行分类时 top-1 精度达到76.5%,top-5 精度达到93.3% - Training for detection
第一次fine tune之后对网络结构进行修改,使之执行detection task。具体是将最后一层卷积层删除,然后添加 3 层带1024个filters的3*3卷积层,每层卷积层后面再添加一层1*1的卷积层(filters数目与需要检测的类别数相同,具体见Table 6)。如果使用VOC数据集进行检测训练,那么网络会在每个grid cell 预测5个boxes,每个box又有5个坐标和20个classes,所以需要125 个filters。同时,为了使模型能够使用细粒度特征(Fine grain features),在最后一个3*3*512卷积层和倒数第二个之间添加一层 Passthrough layer
网络结构修改完成以后对模型进行第二次 fine tune。微调共进行160 个epochs,而且在60次和90次的时候,学习率衰减为原来的十分之一。其中,初始学习速率设为 10e-3,权重衰减设为 0.0005,动量设为0.9。同样,训练时也使用了数据增强(Data augmentation),不过与YOLOv1和SSD类似,包括随机裁剪、颜色偏移等。采用的训练策略与在COC和VOC训练时相同。
第二部分:使用数据集结合法和联合训练法训练YOLO9000
4. Stronger
作者提出一种联合分类训练和检测训练的机制,使用该机制可使YOLOv2的检测种类扩充到数千种。这部分内容待必要时再做补充!!!
5. Conclusion
6. 个人总结
- 模型的使用分为train + test两大部分,有很大区别,首先就是Loss
- Faster RCNN中RPN先在卷积层输出的feature maps中的每个位置预测k个achor boxes,然后根据scores及其它操作筛选出 region proposals(由于anchors的尺寸已知,所以此时的region proposals的位置大致已知),最后通过后面的detection network对region proposals进行分类和边框回归,以获得更逼近ground truth boxes的bounding boxes。(从这里可以看出,在Faster RCNN中,RPN使用anchor boxes方法在feature maps上每个位置产生的是k个anchor boxes,经过筛选后的boxes才被称 region proposals,网络进行边框回归得到的是bounding boxes,需要注意名称的不同)
- Faster RCNN中anchor boxes用在RPN网络中,用来生成region proposals ,而YOLOv2用于回归检测
- Faster RCNN中的RPN网络没有将feature maps划分为grid,但使用了人工精选的(Hand-picked)anchor boxes(先验知识)。不过,在feature map的每个位置均预测 k个anchor boxes就相当于对特征图进行了划分。在训练时,需要先根据先验知识为训练集中标注的每个ground-truth box确定与之最匹配(根据IOU)的anchor box,然后将每个ground-truth box的bounding换成与最佳anchor box相同的size。这样处理使得网络在训练时很容易学习边框的定位;
YOLOv1将网络划分为 S*S 的 grid,但是没有使用anchor boxes,只是指定每个cell预测2个bbox。由于缺乏先验知识,在训练时不需要事先为训练集中的 ground-truth boxes寻找最佳anchor并转换成对应的size,只需要预测指定数量的bounding boxes即可;
YOLOv2将网络划分为 S*S 的 grid,并且使用了由 dimension cluster 得到的anchor boxes,指定每个grid cell 预测 k 个bounding boxes。因此,在训练时,需要先根据先验知识为训练集中标注的每个ground-truth box确定与之最匹配(根据IOU)的anchor box,并将每个ground-truth box的 size 换成与最佳anchor box相同的size。由于anchor boxes的尺寸是通过维度聚类得到的,优于人工精选的结果,所以YOLOv2比Faster RCNN更容易学习边框的定位。可见,YOLOv2与Faster RCNN使用的anchor boxes类似,除了anchor boxes在两个网络中的用处不同(RPN 和 回归预测)以外,仅在 grid 大小和 anchor boxes的 size上有区别。
anchor boxes作为先验知识有两方面的信息(个数,尺寸。Faster RCNN的尺寸是人工精选的,YOLOv2是维度聚类得到的):一是每个cell预测的bboxes的个数与anchors的个数一致;二是在训练时将原始数据中的ground-truth boxes调整到与anchors匹配的尺寸,这只是为了training更容易。另外,在inference(训练的正向过程)和test(模型训练结束后进行的测试过程)时不会使用尺寸信息,输出的是预测出的bounding boxes坐标 - YOLOv2没有像Faster RCNN那样预测bounding boxes相对整幅图像的offsets,而是采用YOLOv1的方法,对boxes坐标相对于所在grid cell的offsets进行预测
参考资料
目标检测(六)YOLOv2__YOLO9000: Better, Faster, Stronger的更多相关文章
- 目标检测(四)Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
作者:Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun SPPnet.Fast R-CNN等目标检测算法已经大幅降低了目标检测网络的运行时间. ...
- [目标检测] 从 R-CNN 到 Faster R-CNN
R-CNN 创新点 经典的目标检测算法使用滑动窗法依次判断所有可能的区域,提取人工设定的特征(HOG,SIFT).本文则预先提取一系列较可能是物体的候选区域,之后仅在这些候选区域上用深度网络提取特征, ...
- 目标检测论文解读4——Faster R-CNN
背景 Fast R-CNN中的region proposal阶段所采用的SS算法成为了检测网络的速度瓶颈,本文是在Fast R-CNN基础上采用RPN(Region Proposal Networks ...
- 第三十一节,目标检测算法之 Faster R-CNN算法详解
Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with region proposal network ...
- 基于深度学习的目标检测算法:SSD——常见的目标检测算法
from:https://blog.csdn.net/u013989576/article/details/73439202 问题引入: 目前,常见的目标检测算法,如Faster R-CNN,存在着速 ...
- Anchor-free目标检测综述 -- Keypoint-based篇
早期目标检测研究以anchor-based为主,设定初始anchor,预测anchor的修正值,分为two-stage目标检测与one-stage目标检测,分别以Faster R-CNN和SSD作 ...
- Anchor-free目标检测综述 -- Dense Prediction篇
早期目标检测研究以anchor-based为主,设定初始anchor,预测anchor的修正值,分为two-stage目标检测与one-stage目标检测,分别以Faster R-CNN和SSD作 ...
- AI佳作解读系列(二)——目标检测AI算法集杂谈:R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3
1 引言 深度学习目前已经应用到了各个领域,应用场景大体分为三类:物体识别,目标检测,自然语言处理.本文着重与分析目标检测领域的深度学习方法,对其中的经典模型框架进行深入分析. 目标检测可以理解为是物 ...
- 论文笔记:目标检测算法(R-CNN,Fast R-CNN,Faster R-CNN,FPN,YOLOv1-v3)
R-CNN(Region-based CNN) motivation:之前的视觉任务大多数考虑使用SIFT和HOG特征,而近年来CNN和ImageNet的出现使得图像分类问题取得重大突破,那么这方面的 ...
随机推荐
- PHP会员找回密码功能实现实例介绍
设置思路 1.用户注册时需要提供一个E-MAIL邮箱,目的就是用该邮箱找回密码. 2.当用户忘记密码或用户名时,点击登录页面的“找回密码”超链接,打开表单,并输入注册用的E-MAIL邮箱,提交. 3. ...
- react-native init的时候出现问题:npm WARN React-native@0.35.0 requires a peer of react@~15.3.1 but none was
react-native init的时候出现问题:npm WARN React-native@0.35.0 requires a peer of react@~15.3.1 but none was ...
- Win10 calc.exe 无法打开计算器的解决方法
先将所有程序关闭,以管理员身份运行 Windows PowerShell,之后输入以下命令 Get-AppXPackage -AllUsers | Foreach {Add-AppxPackage - ...
- Atitit php java python nodejs错误日志功能的比较
Atitit php java python nodejs错误日志功能的比较 1.1. Php方案 自带 1 1.2. Java解决方案 SLF4J 1 1.3. Python解决方案 自带lo ...
- C# 反射获取控件
Control control = Controls.Find(]; //object o = control.GetType().GetProperty("PropertyName&quo ...
- 【原创 Hadoop&Spark 动手实践 7】Spark 计算引擎剖析与动手实践
[原创 Hadoop&Spark 动手实践 7]Spark计算引擎剖析与动手实践 目标: 1. 理解Spark计算引擎的理论知识 2. 动手实践更深入的理解Spark计算引擎的细节 3. 通过 ...
- Jupyter/JupyterLab安装使用
一.介绍 Jupyther notebook(曾经的Ipython notebook),是一个可以把代码.图像.注释.公式和作图集于一处,实现可读性及可视化分析的工具,支持多种编程语言.官方使用手册. ...
- 【Java编码规范】《阿里巴巴Java开发手册(正式版)》【转载】
2017年开春之际,诚意献上重磅大礼:阿里巴巴Java开发手册,首次公开阿里官方Java代码规范标准.这套Java统一规范标准将有助于提高行业编码规范化水平,帮助行业人员提高开发质量和效率.大大降低代 ...
- centos6.5上安装ftp服务
这是之前搭建过,但没记录,因为昨天使用人过来说使用有问题,突然发现没有记录,好心慌,现在的记忆真的只有1周而已,穷和老都是原罪啊!! 环境准备:centos6.5 vm 安装ftp:
- java web (sevlet)请求之get,post,forward,redirect
[参考]web请求之get,post,forward,redirect 1,form表单:可以采用post或者get请求,客户端主动跳转,url地址会改变为提交后的地址 2,forward:forwa ...