[轉]CNN目標檢測(一):Faster RCNN詳解

https://blog.csdn.net/a8039974/article/details/77592389

?

Faster RCNN github : https://github.com/rbgirshick/py-faster-rcnn

Faster RCNN paper :?https://arxiv.org/abs/1506.01497

Bound box regression詳解 : http://download.csdn.net/download/zy1034092330/9940097(來源:王斌_ICT)

?

縮進經過RCNN和Fast RCNN的積淀,Ross B. Girshick在2016年提出了新的Faster RCNN,在結構上,Faster RCN已經將特征抽取(feature extraction),proposal提取,bounding box regression(rect refine),classification都整合在了一個網絡中,使得綜合性能有較大提高,在檢測速度方面尤為明顯。

圖1 Faster CNN基本結構(來自原論文)

縮進依作者看來,如圖1,Faster RCNN其實可以分為4個主要內容:

  1. Conv layers。作為一種CNN網絡目標檢測方法,Faster RCNN首先使用一組基礎的conv+relu+pooling層提取image的feature maps。該feature maps被共享用于后續RPN層和全連接層。
  2. Region Proposal Networks。RPN網絡用于生成region proposals。該層通過softmax判斷anchors屬于foreground或者background,再利用bounding box regression修正anchors獲得精確的proposals。
  3. Roi Pooling。該層收集輸入的feature maps和proposals,綜合這些信息后提取proposal?feature maps,送入后續全連接層判定目標類別。
  4. Classification。利用proposal?feature maps計算proposal的類別,同時再次bounding box regression獲得檢測框最終的精確位置。

所以本文以上述4個內容作為切入點介紹Faster RCNN網絡。

縮進圖2展示了python版本中的VGG16模型中的faster_rcnn_test.pt的網絡結構,可以清晰的看到該網絡對于一副任意大小PxQ的圖像,首先縮放至固定大小MxN,然后將MxN圖像送入網絡;而Conv layers中包含了13個conv層+13個relu層+4個pooling層;RPN網絡首先經過3x3卷積,再分別生成foreground anchors與bounding box regression偏移量,然后計算出proposals;而Roi Pooling層則利用proposals從feature maps中提取proposal feature送入后續全連接和softmax網絡作classification(即分類proposal到底是什么object)。

path:${py-faster-rcnn-root}/models/pascal_voc/VGG16/faster_rcnn_alt_opt/faster_rcnn_test.pt

圖2 faster_rcnn_test.pt網絡結構

1 Conv layers

縮進Conv layers包含了conv,pooling,relu三種層。以python版本中的VGG16模型中的faster_rcnn_test.pt的網絡結構為例,如圖2,Conv layers部分共有13個conv層,13個relu層,4個pooling層。這里有一個非常容易被忽略但是又無比重要的信息,在Conv layers中:

  1. 所有的conv層都是:kernel_size=3,pad=1
  2. 所有的pooling層都是:kernel_size=2,stride=2

為何重要?在Faster RCNN Conv layers中對所有的卷積都做了擴邊處理(pad=1,即填充一圈0),導致原圖變為(M+2)x(N+2)大小,再做3x3卷積后輸出MxN。正是這種設置,導致Conv layers中的conv層不改變輸入和輸出矩陣大小。如圖3:

圖3

類似的是,Conv layers中的pooling層kernel_size=2,stride=2。這樣每個經過pooling層的MxN矩陣,都會變為(M/2)*(N/2)大小。綜上所述,在整個Conv layers中,conv和relu層不改變輸入輸出大小,只有pooling層使輸出長寬都變為輸入的1/2。

縮進那么,一個MxN大小的矩陣經過Conv layers固定變為(M/16)x(N/16)!這樣Conv layers生成的featuure map中都可以和原圖對應起來。

?

2 Region Proposal Networks(RPN)

縮進經典的檢測方法生成檢測框都非常耗時,如OpenCV adaboost使用滑動窗口+圖像金字塔生成檢測框;或如RCNN使用SS(Selective Search)方法生成檢測框。而Faster RCNN則拋棄了傳統的滑動窗口和SS方法,直接使用RPN生成檢測框,這也是Faster RCNN的巨大優勢,能極大提升檢測框的生成速度。

圖4 RPN網絡結構

上圖4展示了RPN網絡的具體結構。可以看到RPN網絡實際分為2條線,上面一條通過softmax分類anchors獲得foreground和background(檢測目標是foreground),下面一條用于計算對于anchors的bounding box regression偏移量,以獲得精確的proposal。而最后的Proposal層則負責綜合foreground anchors和bounding box regression偏移量獲取proposals,同時剔除太小和超出邊界的proposals。其實整個網絡到了Proposal Layer這里,就完成了相當于目標定位的功能。

2.1 多通道圖像卷積基礎知識介紹

縮進在介紹RPN前,還要多解釋幾句基礎知識,已經懂的看官老爺跳過就好。
  1. 對于單通道圖像+單卷積核做卷積,第一章中的圖3已經展示了;
  2. 對于多通道圖像+多卷積核做卷積,計算方式如下:
圖5 多通道+多卷積核做卷積示意圖(摘自Theano教程)
縮進如圖5,輸入圖像layer m-1有4個通道,同時有2個卷積核w1和w2。對于卷積核w1,先在輸入圖像4個通道分別作卷積,再將4個通道結果加起來得到w1的卷積輸出;卷積核w2類似。所以對于某個卷積層,無論輸入圖像有多少個通道,輸出圖像通道數總是等于卷積核數量!
縮進對多通道圖像做1x1卷積,其實就是將輸入圖像于每個通道乘以卷積系數后加在一起,即相當于把原圖像中本來各個獨立的通道“聯通”在了一起。

2.2 anchors

縮進提到RPN網絡,就不能不說anchors。所謂anchors,實際上就是一組由rpn/generate_anchors.py生成的矩形。直接運行作者demo中的generate_anchors.py可以得到以下輸出:

[[ -84.? -40.?? 99.?? 55.][-176.? -88.? 191.? 103.][-360. -184.? 375.? 199.][ -56.? -56.?? 71.?? 71.][-120. -120.? 135.? 135.][-248. -248.? 263.? 263.][ -36.? -80.?? 51.?? 95.][ -80. -168.?? 95.? 183.][-168. -344.? 183.? 359.]]

  

其中每行的4個值[x1,y1,x2,y2]代表矩形左上和右下角點坐標。9個矩形共有3種形狀,長寬比為大約為:width:height = [1:1, 1:2, 2:1]三種,如圖6。實際上通過anchors就引入了檢測中常用到的多尺度方法。

圖6 anchors示意圖

注:關于上面的anchors size,其實是根據檢測圖像設置的。在python demo中,會把任意大小的輸入圖像reshape成800x600(即圖2中的M=800,N=600)。再回頭來看anchors的大小,anchors中長寬1:2中最大為352x704,長寬2:1中最大736x384,基本是cover了800x600的各個尺度和形狀。

那么這9個anchors是做什么的呢?借用Faster RCNN論文中的原圖,如圖7,遍歷Conv layers計算獲得的feature maps,為每一個點都配備這9種anchors作為初始的檢測框。這樣做獲得檢測框很不準確,不用擔心,后面還有2次bounding box regression可以修正檢測框位置。

圖7

解釋一下上面這張圖的數字。

  1. 在原文中使用的是ZF model中,其Conv Layers中最后的conv5層num_output=256,對應生成256張特征圖,所以相當于feature map每個點都是256-d
  2. 在conv5之后,做了rpn_conv/3x3卷積且num_output=256,相當于每個點又融合了周圍3x3的空間信息(猜測這樣做也許更魯棒?反正我沒測試),同時256-d不變(如圖4和圖7中的紅框)
  3. 假設在conv5 feature map中每個點上有k個anchor(默認k=9),而每個anhcor要分foreground和background,所以每個點由256d feature轉化為cls=2k scores;而每個anchor都有[x, y, w, h]對應4個偏移量,所以reg=4k coordinates
  4. 補充一點,全部anchors拿去訓練太多了,訓練程序會在合適的anchors中隨機選取128個postive anchors+128個negative anchors進行訓練(什么是合適的anchors下文5.1有解釋)

注意,在本文講解中使用的VGG conv5 num_output=512,所以是512d,其他類似.....

2.3 softmax判定foreground與background

?

縮進一副MxN大小的矩陣送入Faster RCNN網絡后,到RPN網絡變為(M/16)x(N/16),不妨設W=M/16,H=N/16。在進入reshape與softmax之前,先做了1x1卷積,如圖8:
圖8 RPN中判定fg/bg網絡結構
該1x1卷積的caffe prototxt定義如下:
layer {name: "rpn_cls_score"type: "Convolution"bottom: "rpn/output"top: "rpn_cls_score"convolution_param {num_output: 18   # 2(bg/fg) * 9(anchors)kernel_size: 1 pad: 0 stride: 1}
}

  

可以看到其num_output=18,也就是經過該卷積的輸出圖像為WxHx18大小(注意第二章開頭提到的卷積計算方式)。這也就剛好對應了feature maps每一個點都有9個anchors,同時每個anchors又有可能是foreground和background,所有這些信息都保存WxHx(9x2)大小的矩陣。為何這樣做?后面接softmax分類獲得foreground anchors,也就相當于初步提取了檢測目標候選區域box(一般認為目標在foreground anchors中)。
縮進那么為何要在softmax前后都接一個reshape layer?其實只是為了便于softmax分類,至于具體原因這就要從caffe的實現形式說起了。在caffe基本數據結構blob中以如下形式保存數據:
blob=[batch_size, channel,height,width]
對應至上面的保存bg/fg anchors的矩陣,其在caffe blob中的存儲形式為[1, 2*9, H, W]。而在softmax分類時需要進行fg/bg二分類,所以reshape layer會將其變為[1, 2, 9*H, W]大小,即單獨“騰空”出來一個維度以便softmax分類,之后再reshape回復原狀。貼一段caffe softmax_loss_layer.cpp的reshape函數的解釋,非常精辟:
"Number of labels must match number of predictions; "
"e.g., if softmax axis == 1 and prediction shape is (N, C, H, W), "
"label count (number of labels) must be N*H*W, "
"with integer values in {0, 1, ..., C-1}.";

  

綜上所述,RPN網絡中利用anchors和softmax初步提取出foreground anchors作為候選區域。

2.4 bounding box regression原理

縮進介紹bounding box regression數學模型及原理。如圖9所示綠色框為飛機的Ground Truth(GT),紅色為提取的foreground anchors,那么即便紅色的框被分類器識別為飛機,但是由于紅色的框定位不準,這張圖相當于沒有正確的檢測出飛機。所以我們希望采用一種方法對紅色的框進行微調,使得foreground anchors和GT更加接近。

圖9

縮進對于窗口一般使用四維向量(x, y, w, h)表示,分別表示窗口的中心點坐標和寬高。對于圖 10,紅色的框A代表原始的Foreground Anchors,綠色的框G代表目標的GT,我們的目標是尋找一種關系,使得輸入原始的anchor A經過映射得到一個跟真實窗口G更接近的回歸窗口G',即:給定anchor A=(Ax, Ay, Aw, Ah),GT=[Gx, Gy, Gw, Gh],尋找一種變換F:使得F(Ax, Ay, Aw, Ah)=(G'x, G'y, G'w, G'h),其中(G'x, G'y, G'w, G'h)≈(Gx, Gy, Gw, Gh)。

圖10

那么經過何種變換F才能從圖6中的anchor A變為G'呢? 比較簡單的思路就是:

縮進?1. 先做平移

縮進?2. 再做縮放

縮進觀察上面4個公式發現,需要學習的是dx(A),dy(A),dw(A),dh(A)這四個變換。當輸入的anchor A與GT相差較小時,可以認為這種變換是一種線性變換, 那么就可以用線性回歸來建模對窗口進行微調(注意,只有當anchors A和GT比較接近時,才能使用線性回歸模型,否則就是復雜的非線性問題了)。對應于Faster RCNN原文,平移量(tx, ty)與尺度因子(tw, th)如下:

縮進接下來的問題就是如何通過線性回歸獲得dx(A),dy(A),dw(A),dh(A)了。線性回歸就是給定輸入的特征向量X, 學習一組參數W, 使得經過線性回歸后的值跟真實值Y非常接近,即Y=WX。對于該問題,輸入X是一張經過卷積獲得的feature map,定義為Φ;同時還有訓練傳入的GT,即(tx,?ty, tw, th)。輸出是dx(A),dy(A),dw(A),dh(A)四個變換。那么目標函數可以表示為:

其中Φ(A)是對應anchor的feature map組成的特征向量,w是需要學習的參數,d(A)是得到的預測值(*表示 x,y,w,h,也就是每一個變換對應一個上述目標函數)。為了讓預測值(tx, ty,?tw,?th)與真實值差距最小,設計損失函數:

函數優化目標為:

2.5 對proposals進行bounding box regression

縮進在了解bounding box regression后,再回頭來看RPN網絡第二條線路,如圖11。

?

圖11 RPN中的bbox reg

先來看一看上圖11中1x1卷積的caffe prototxt定義:

layer {name: "rpn_bbox_pred"type: "Convolution"bottom: "rpn/output"top: "rpn_bbox_pred"convolution_param {num_output: 36   # 4 * 9(anchors)kernel_size: 1 pad: 0 stride: 1}
}

  

可以看到其num_output=36,即經過該卷積輸出圖像為WxHx36,在caffe blob存儲為[1, 36, H, W],這里相當于feature maps每個點都有9個anchors,每個anchors又都有4個用于回歸的[dx(A),dy(A),dw(A),dh(A)]變換量。

2.6 Proposal Layer

縮進Proposal Layer負責綜合所有[dx(A),dy(A),dw(A),dh(A)]變換量和foreground anchors,計算出精準的proposal,送入后續RoI Pooling Layer。還是先來看看Proposal Layer的caffe prototxt定義:
layer {name: 'proposal'type: 'Python'bottom: 'rpn_cls_prob_reshape'bottom: 'rpn_bbox_pred'bottom: 'im_info'top: 'rois'python_param {module: 'rpn.proposal_layer'layer: 'ProposalLayer'param_str: "'feat_stride': 16"}
}

  

Proposal Layer有3個輸入:fg/bg anchors分類器結果rpn_cls_prob_reshape,對應的bbox reg的[dx(A),dy(A),dw(A),dh(A)]變換量rpn_bbox_pred,以及im_info;另外還有參數feat_stride=16,這和圖4是對應的。
縮進首先解釋im_info。對于一副任意大小PxQ圖像,傳入Faster RCNN前首先reshape到固定MxN,im_info=[M, N, scale_factor]則保存了此次縮放的所有信息。然后經過Conv Layers,經過4次pooling變為WxH=(M/16)x(N/16)大小,其中feature_stride=16則保存了該信息,用于計算anchor偏移量。
圖12
縮進Proposal Layer forward(caffe layer的前傳函數)按照以下順序依次處理:
  1. 生成anchors,利用[dx(A),dy(A),dw(A),dh(A)]對所有的anchors做bbox regression回歸(這里的anchors生成和訓練時完全一致)
  2. 按照輸入的foreground softmax scores由大到小排序anchors,提取前pre_nms_topN(e.g. 6000)個anchors,即提取修正位置后的foreground anchors。
  3. 利用im_info將fg anchors從MxN尺度映射回PxQ原圖,判斷fg anchors是否大范圍超過邊界,剔除嚴重超出邊界fg anchors。
  4. 進行nms(nonmaximum suppression,非極大值抑制)
  5. 再次按照nms后的foreground softmax scores由大到小排序fg anchors,提取前post_nms_topN(e.g. 300)結果作為proposal輸出。
之后輸出proposal=[x1, y1, x2, y2],注意,由于在第三步中將anchors映射回原圖判斷是否超出邊界,所以這里輸出的proposal是對應MxN輸入圖像尺度的,這點在后續網絡中有用。另外我認為,嚴格意義上的檢測應該到此就結束了,后續部分應該屬于識別了~
RPN網絡結構就介紹到這里,總結起來就是:
生成anchors -> softmax分類器提取fg anchors?-> bbox reg回歸fg anchors -> Proposal Layer生成proposals

3 RoI pooling

縮進而RoI Pooling層則負責收集proposal,并計算出proposal feature maps,送入后續網絡。從圖3中可以看到Rol pooling層有2個輸入:

  1. 原始的feature maps
  2. RPN輸出的proposal boxes(大小各不相同)

3.1 為何需要RoI Pooling

縮進先來看一個問題:對于傳統的CNN(如AlexNet,VGG),當網絡訓練好后輸入的圖像尺寸必須是固定值,同時網絡輸出也是固定大小的vector or matrix。如果輸入圖像大小不定,這個問題就變得比較麻煩。有2種解決辦法:

  1. 從圖像中crop一部分傳入網絡
  2. 將圖像warp成需要的大小后傳入網絡

圖13 crop與warp破壞圖像原有結構信息

兩種辦法的示意圖如圖13,可以看到無論采取那種辦法都不好,要么crop后破壞了圖像的完整結構,要么warp破壞了圖像原始形狀信息。回憶RPN網絡生成的proposals的方法:對foreground anchors進行bound box regression,那么這樣獲得的proposals也是大小形狀各不相同,即也存在上述問題。所以Faster RCNN中提出了RoI Pooling解決這個問題(需要說明,RoI Pooling確實是從SPP發展而來,但是限于篇幅這里略去不講,有興趣的讀者可以自行查閱相關論文)。

3.2 RoI Pooling原理

縮進分析之前先來看看RoI Pooling Layer的caffe prototxt的定義:

layer {name: "roi_pool5"type: "ROIPooling"bottom: "conv5_3"bottom: "rois"top: "pool5"roi_pooling_param {pooled_w: 7pooled_h: 7spatial_scale: 0.0625 # 1/16}
}

  

其中有新參數pooled_w=pooled_h=7,另外一個參數spatial_scale=1/16應該能夠猜出大概吧。

縮進RoI Pooling layer forward過程:在之前有明確提到:proposal=[x1, y1, x2, y2]是對應MxN尺度的,所以首先使用spatial_scale參數將其映射回(M/16)x(N/16)大小的feature maps尺度(這里來回多次映射,是有點繞);之后將每個proposal水平和豎直都分為7份,對每一份都進行max pooling處理。這樣處理后,即使大小不同的proposal,輸出結果都是7x7大小,實現了fixed-length output(固定長度輸出)。

?

圖14 proposal示意圖

?

4 Classification

縮進Classification部分利用已經獲得的proposal feature maps,通過full connect層與softmax計算每個proposal具體屬于那個類別(如人,車,電視等),輸出cls_prob概率向量;同時再次利用bounding box regression獲得每個proposal的位置偏移量bbox_pred,用于回歸更加精確的目標檢測框。Classification部分網絡結構如圖15。
圖15?Classification部分網絡結構圖

從PoI Pooling獲取到7x7=49大小的proposal feature maps后,送入后續網絡,可以看到做了如下2件事:

  1. 通過全連接和softmax對proposals進行分類,這實際上已經是識別的范疇了
  2. 再次對proposals進行bounding box regression,獲取更高精度的rect box
這里來看看全連接層InnerProduct layers,簡單的示意圖如圖16,

圖16 全連接層示意圖

其計算公式如下:

其中W和bias B都是預先訓練好的,即大小是固定的,當然輸入X和輸出Y也就是固定大小。所以,這也就印證了之前Roi Pooling的必要性。到這里,我想其他內容已經很容易理解,不在贅述了。

5 Faster RCNN訓練

縮進Faster CNN的訓練,是在已經訓練好的model(如VGG_CNN_M_1024,VGG,ZF)的基礎上繼續進行訓練。實際中訓練過程分為6個步驟:
  1. 在已經訓練好的model上,訓練RPN網絡,對應stage1_rpn_train.pt
  2. 利用步驟1中訓練好的RPN網絡,收集proposals,對應rpn_test.pt
  3. 第一次訓練Fast RCNN網絡,對應stage1_fast_rcnn_train.pt
  4. 第二訓練RPN網絡,對應stage2_rpn_train.pt
  5. 再次利用步驟4中訓練好的RPN網絡,收集proposals,對應rpn_test.pt
  6. 第二次訓練Fast RCNN網絡,對應stage2_fast_rcnn_train.pt

可以看到訓練過程類似于一種“迭代”的過程,不過只循環了2次。至于只循環了2次的原因是應為作者提到:"A similar alternating training can be run for more iterations, but we have observed negligible improvements",即循環更多次沒有提升了。接下來本章以上述6個步驟講解訓練過程。

5.1 訓練RPN網絡

縮進在該步驟中,首先讀取RBG提供的預訓練好的model(本文使用VGG),開始迭代訓練。來看看stage1_rpn_train.pt網絡結構,如圖17。

圖17 stage1_rpn_train.pt

(考慮圖片大小,Conv Layers中所有的層都畫在一起了,如紅圈所示,后續圖都如此處理)

與檢測網絡類似的是,依然使用Conv Layers提取feature maps。整個網絡使用的Loss如下:

上述公式中,i表示anchors index,pi表示foreground softmax?predict概率,pi*代表對應的GT predict概率(即當第i個anchor與GT間IoU>0.7,認為是該anchor是foreground,pi*=1;反之IoU<0.3時,認為是該anchor是background,pi*=0;至于那些0.3<IoU<0.7的anchor則不參與訓練);t代表predict bounding box,t*代表對應foreground anchor對應的GT box。可以看到,整個Loss分為2部分:

  1. cls loss,即rpn_cls_loss層計算的softmax loss,用于分類anchors為forground與background的網絡訓練
  2. reg loss,即rpn_loss_bbox層計算的soomth L1 loss,用于bounding box regression網絡訓練。注意在該loss中乘了pi*,相當于只關心foreground anchors的回歸(其實在回歸中也完全沒必要去關心background)。

縮進由于在實際過程中,Ncls和Nreg差距過大,用參數λ平衡二者(如Ncls=256,Nreg=2400時設置λ=10),使總的網絡Loss計算過程中能夠均勻考慮2種Loss。這里比較重要是Lreg使用的soomth L1 loss,計算公式如下:

縮進了解數學原理后,反過來看圖17:

  1. 在RPN訓練階段,rpn-data(python AnchorTargetLayer)層會按照和test階段Proposal層完全一樣的方式生成Anchors用于訓練
  2. 對于rpn_loss_cls,輸入的rpn_cls_scors_reshape和rpn_labels分別對應p與p*,Ncls參數隱含在p與p*的caffe blob的大小中
  3. 對于rpn_loss_bbox,輸入的rpn_bbox_pred和rpn_bbox_targets分別對應t于t*,rpn_bbox_inside_weigths對應p*,rpn_bbox_outside_weights對應λ,Nreg同樣隱含在caffe blob大小中

這樣,公式與代碼就完全對應了。特別需要注意的是,在訓練和檢測階段生成和存儲anchors的順序完全一樣,這樣訓練結果才能被用于檢測!

5.2 通過訓練好的RPN網絡收集proposals

縮進在該步驟中,利用之前的RPN網絡,獲取proposal rois,同時獲取foreground softmax probability,如圖18,然后將獲取的信息保存在python pickle文件中。該網絡本質上和檢測中的RPN網絡一樣,沒有什么區別。

圖18 rpn_test.pt

5.3 訓練Fast RCNN網絡

縮進讀取之前保存的pickle文件,獲取proposals與foreground?probability。從data層輸入網絡。然后:

  1. 將提取的proposals作為rois傳入網絡,如圖19藍框
  2. 將foreground?probability作為bbox_inside_weights傳入網絡,如圖19綠框
  3. 通過caffe blob大小對比,計算出bbox_outside_weights(即λ),如圖19綠框

這樣就可以訓練最后的識別softmax與最終的bounding regression了,如圖19。

圖19 stage1_fast_rcnn_train.pt

之后的訓練都是大同小異,不再贅述了。

?

PS:我知道你們想問,畫圖工具:http://ethereon.github.io/netscope/#/editor

?

--------------------------------------------------------------------------

Faster RCNN的分析就結束了,之后會緩慢更新YOLO,YOLO V2,SSD,Mask RCNN等內容,敬請期待~

轉載于:https://www.cnblogs.com/wlzy/p/9432830.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451019.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451019.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451019.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Class.forName和ClassLoader

&#xff08;1&#xff09;ClassLoader是用來加載類數據的&#xff08;加載的方式由具體的加載器決定&#xff09;。類加載器根據類的全限定名加載類的二進制字節流&#xff0c;然后將字節流轉換成jvm方法區中的運行時數據結構&#xff0c;并在方法區生成一個代表該類的Class對…

狗窩里的小日子- 8 ...

來&#xff0c;把平時作的菜菜整理下&#xff1a; 81. 82. 83. 84. 85. 86. 87. 88.

PHPSTORM破解版激活方式方法

方法一. 通過Licence Server 激活PHPStorm&#xff08;快速&#xff09;方法原理是通過搭建服務器激活,不過網上有許多搭建好的。http://idea.goxz.gqhttp://v2mc.net:1017http://idea.imsxm.com&#xff08;2016版&#xff09;http://idea.ibdyr.com注&#xff1a;不一定長期有…

BZOJ1911 特別行動隊

目錄 BZOJ1911 特別行動隊題解&#xff43;&#xff4f;&#xff44;&#xff45;BZOJ1911 特別行動隊 題目傳送門 題解 典型的斜率優化\(Dp\)。首先如果我們記\(sum[i]\)表示前\(i\)個士兵的戰斗力之和&#xff0c;那么我們比較容易的可以得出\(O(n^2)\)的\(Dp\)&#xff1a;\…

硅谷創業者中被遮蔽的“中國現象”

摘要&#xff1a;他們關心互聯網和移動&#xff0c;但更關心公共設施的信息化、環境污染和氣候變暖、清潔能源的利用&#xff0c;以及農業和食物的改良。但至少目前看上去&#xff0c;他們贏得的來自硅谷的學術機構、風險投資界的認可與尊敬&#xff0c;似乎要更多。 他們關心互…

【模式識別與機器學習】——3.9勢函數法:一種確定性的非線性分類方法

目的 用勢函數的概念來確定判別函數和劃分類別界面。 基本思想 假設要劃分屬于兩種類別ω1和ω2的模式樣本&#xff0c;這些樣本可看成是分布在n維模式空間中的點xk。 把屬于ω1的點比擬為某種能源點&#xff0c;在點上&#xff0c;電位達到峰值。 隨著與該點距離的增大&a…

超詳細 - SVN下載安裝及使用教程

SVN簡介&#xff1a; 為什么要使用SVN&#xff1f; 程序員在編寫程序的過程中&#xff0c;每個程序員都會生成很多不同的版本&#xff0c;這就需要程序員有效的管理代碼&#xff0c;在需要的時候可以迅速&#xff0c;準確取出相應的版本。 Subversion是什么&#xff1f; 它是一…

TW實習日記:第16天

前端的樣式bug實在是太太太莫名其妙了&#xff0c;尤其是封裝好的組件&#xff0c;一層套一層的&#xff0c;根本不知道是哪一層出了問題...除了改bug就是做新功能&#xff0c;真想吐槽一下這個項目的留言板&#xff0c;根本沒人會用吧...這功能實在是太老舊了... 感覺每一天都…

重載與重寫(overload and override)

在java編程中經常會遇到重載和重寫&#xff0c;剛接觸java的時候對這對概念比較懵比&#xff0c;也不能理解其中的區別&#xff0c;后來在逐漸的學習中更加深刻的理解了其中的原理。哎&#xff0c;說來還是基礎知識學的不扎實&#xff0c;這些都是大學期間偷懶欠下的帳。 &…

洛谷P4114 Qtree1(樹鏈剖分+線段樹)

傳送門 LCT秒天秒地用什么樹剖 這題可以算是樹剖的比較裸的題目了 把每一條邊的權值下放到他兩邊的點中深度較深的那個 然后直接用樹剖線段樹帶進去亂搞就可以了 1 //minamoto2 #include<bits/stdc.h>3 using namespace std;4 template<class T>inline bool cmax(T…

什么是CDN ,CDN的作用

轉自&#xff1a;https://baike.baidu.com/item/CDN/420951?fraladdin 簡介 CDN是構建在網絡之上的內容分發網絡&#xff0c;依靠部署在各地的邊緣服務器&#xff0c;通過中心平臺的負載均衡、內容分發、調度等功能模塊&#xff0c;使用戶就近獲取所需內容&#xff0c;降低網…

docker 中不能用vim編輯文件

2019獨角獸企業重金招聘Python工程師標準>>> docker 中不能用vim編輯文件 2017年08月28日 16:54:29 閱讀數&#xff1a;2061 更新來源 apt-get update 1安裝vim apt-get install -y vim 轉載于:https://my.oschina.net/u/3367404/blog/1923901

使用final修飾局部變量???

在編程中我們偶爾會看到如下的代碼&#xff1a; public void foo(final int arg){final int localData 0;// ...}以及與之相似的代碼 public void foo(int arg){int localData 0;// ...}這兩段代碼的主要區別就是&#xff1a;局部變量是否使用了final關鍵字修飾。有同學可能會…

視頻編解碼概述

視頻編解碼概述 1. 常用的基本知識 基本概念 編解碼 編解碼器&#xff08;codec&#xff09;指的是一個能夠對一個信號或者一個數據流進行變換的設備或者程序。這里指的變換既包括將信號或者數據流進行編碼&#xff08;通常是為了傳輸、存儲或者加密&#xff09;或者提取得到…

洛谷 2759 奇怪的函數

【題解】 取個對數然后二分即可。對于一個數x&#xff0c;x^x的位數就是(int)(lg(x)*x1). 1 #include<cstdio>2 #include<cstring>3 #include<algorithm>4 #include<cmath>5 #define LL long long6 #define rg register7 #define N 2000108 using name…

區塊鏈技術怎么構架落地應用?

自從區塊鏈技術火爆起來之后&#xff0c;越來越多的金融機構和金融科技公司宣布探索區塊鏈在金融上的運用&#xff0c;國內區塊鏈技術服務商跟隨金融機構的腳步&#xff0c;一方面是基于以太坊智能合約作為底層架構&#xff0c;通過提供中間層工具及協議和應用層的身份驗證、證…

JVM中GC Root對象有哪些?

眾所周知&#xff0c;我們目前最常用的虛擬機hotspot使用可達性分析來進行垃圾回收&#xff0c;而可達性分析需要依賴GC Root。下面我就來介紹下可以作為GC Root的對象。 &#xff08;一&#xff09;虛擬機棧中引用的對象 虛擬機棧中的引用的對象可以作為GC Root。我們程序在虛…

IPv6 解說 ,與IPv4的同異

見&#xff1a;https://baike.baidu.com/item/IPv6/172297 IPv6 IPv6是Internet Protocol Version 6的縮寫&#xff0c;其中Internet Protocol譯為“互聯網協議”。IPv6是IETF&#xff08;互聯網工程任務組&#xff0c;Internet Engineering Task Force&#xff09;設計的用于替…

USACO Training Section 5.1 Fencing the Cows 圈奶牛(凸包)

夫約翰想要建造一個圍欄用來圍住他的奶牛&#xff0c;可是他資金匱乏。他建造的圍欄必須包括他的奶牛喜歡吃草的所有地點。對于給出的這些地點的坐標&#xff0c;計算最短的能夠圍住這些點的圍欄的長度。 輸入 輸入數據的第一行包括一個整數 N。N&#xff08;0 < N < 10,…

Linux各發行版本簡介

Linux的發行版本可以大體分為兩類&#xff0c;一類是商業公司維護的發行版本&#xff0c;一類是社區組織維護的發行版本&#xff0c;前者以著名的Redhat&#xff08;RHEL&#xff09;為代表&#xff0c;后者以Debian為代表。 1、Redhat&#xff0c;應該稱為Redhat系列&#xff…