Fast R-CNN(論文閱讀)

論文名:Fast R-CNN
論文作者:Ross Girshick
期刊/會議名:ICCV 2015
發表時間:2015-9
?論文地址:https://arxiv.org/pdf/1504.08083
源碼:https://github.com/rbgirshick/fast-rcnn

摘要

這篇論文提出了一個快速的R-CNN網絡,也就是Fast R-CNN用于目標檢測任務。Fast R-CNN使用了深度卷積神經網絡來高效地對候選區域進行分類。并且與之前的工作相比,Fast R-CNN既能提高訓練和測試時的速度,又能增加檢測的精度。在當時比較典型的目標檢測算法就是R-CNN和SPPnet,所以接下來就舉了R-CNN和SPPnet這兩個例子,來對比說明Fast R-CNN速度有多快。比如與R-CNN相比,Fast R-CNN在訓練時能夠快9倍,在測試時快了213倍。與SPPnet相比,Fast R-CNN訓練時快了3倍,測試時快了10倍。所以說Fast R-CNN在當時與其他的目標點這模型相比,速度又快,精度又高,在當時是一個比較優秀的算法。

1.引言

1.1.R-CNN and SPPnet

分別寫了R-CNN和SPPnet的缺點。

比如在這里先是R-CNN有一些缺點,然后在下面這里又寫了SPPnet也有一些缺點。因此作者提出了一種新的訓練方法來解決R-CNN和SPPnet的這個缺點,這個新的方法也被稱為Fast R-CNN。

先來看一下R-CNN具體的這三個缺點,其中前兩條都是在算法訓練時的缺點,第三條是算法測試時的缺點。我們之前在講R-CNN論文的時候,有提到AlexNet的算法在訓練時是分了不同的多個階段的。首先是訓練了一個CNN用來提取候選區域的特征。等這個cnn訓練好后再提取整個數據集上所有區域的特征,然后利用特征來額外訓練一個SVM網絡來對候選區域進行分類。如果是R-CNN BB算法的話,它還會有第三個階段,也就是訓練一個框回歸的模型用來回歸出候選框的精確位置。所以說整個網絡的訓練過程是一個多階段的訓練過程,因為它要先訓練CNN再訓練SVM,最后還要訓練一個框回歸器,在訓練svm和框回歸模型的時候,是不是需要把每一張圖片上的每一個候選框的這個特征都給它去提取出來,等這些特征都被提取出來后才能訓練后續的模型,所以利用CNN提取到這個特征需要先把它寫到磁盤里,供后續訓練使用。所以在訓練過程中會耗費大量的空間來存特征,會耗費大量的時間來提取特征。

R-CNN測試流程:

對于一張測試圖片,R-CNN也需要先產生2000個候選區域,每個候選區域都需要通過這個CNN的前向傳播來提特征,因此測試一張圖片的速度也會特別慢,導致一張圖的測試時間可能會達到47秒。通過剛剛對這三條的分析,我們可以看出來,R-CNN它之所以慢,是不是很大程度上都是因為它需要使用一個CNN來前向傳播,提取每一個候選區域的特征,沒有用到共享計算。因此后續提出的SPPnet這個網絡,就嘗試通過共享計算來加速R-CNN的訓練和測試過程。

?SPPnet的改進思路:

這里是SPPnet論文里的一個網絡結構圖。它的核心其實就是引入了一個這個spp層,也叫空間金字塔池化層。R-CNN里的CNN它其實就是AlexNet或者VGG這種圖像分類網絡,它本質上就是幾個CNN跟上一個最大尺化層,幾個CNN跟上一個最大石化層,然后這樣不斷堆疊的這種形式,最后再跟上幾個全連接層的形式,然后在這里是橫著把這個網絡畫出來了。然后在SPPnet這里它是豎著畫了一個網絡,在這里也是這種卷積層加上最大石化層,不斷的堆疊,...,在最后再跟上了幾個全連接層的形式。所以說SPPnet的這個網絡結構跟R-CNN里的CNN其實幾乎是一樣的,它們唯一的區別就是R-CNN里的這個CNN,它在原先的這個全連接層的前面是一個最大值化層,但是在SPPnet這個網絡里,全連接層前面的最后一個最大石化給替換成了一個空間金字塔池化層,這個空間金字塔紙化層的優點就是當你傳入一張圖片,通過一些卷積層和池化層,在最后通過一個卷積層的時候,假如得到了一個13x13x256通道的這么一個特征圖,在這里只畫了其中的一個通道。

正常在R-CNN的情況下,它會使用一個3x3大小,步長為2的一個最大池化層把13x13x256通道的特征圖變成6x6大小的一個特征圖,然后再把最后池化的這個結果拉平后,傳給全連接層,獲取最終的一個圖片特征。這個SPP層它本質上就是限制了輸出尺寸,也就是說它采用了一個動態的池化和尺寸。比如想從13x13的這個圖中得到4x4大小的特征圖,那么只需要使用13÷4,再向上取整的這么一個值來作為池化合的一個尺寸,也就是43÷4,再向下取整的這個值也就是三來作為池化后的步長,然后以這個尺寸為4,步長為3的一個池化后去在13x13的特征圖上做池化運算,最后就會產生一個4x4大小的輸出特征圖,這個2x2和1x11大小的輸出特征圖也是同理,通過這種方法可以算出來。所以說這個空間金字塔池化層的池化后的尺寸和步長是一個動態變化的過程,它會根據輸出特征圖的尺寸來動態的改變池化合的尺寸和步長,在得到4x4大小,2x2大小和1x1大小的一個特征圖之后,再把這些特征給拼接起來,就形成了一個固定長度的一個特征了,然后再把這個特征給傳給后續的全連接層來形成最終的一個候選區域的圖片特征。所以說有了這種空間金字塔池化層,就可以輸入任意大小的圖片了,因為輸入任意大小的圖片后,不管最后得到這個特征圖是多少,都可以通過這一層來把它產生一個固定大小的一個輸出,最后得到一個固定大小的一個特征。

既然不需要像R-CNN這樣去限制cnn的輸入尺寸了,那是不是可以換個思路就是不傳候選區域進去而是直接把整幅圖片給傳到CNN當中,比如在原圖上候選區域是這一部分區域,原圖最后產生的這個特征圖,它這個候選區域的特征也就是這一部分的區域,因此就可以直接把候選區域的特征圖摳出來就可以了,由于不同位置最后得到的候選區域的這個尺寸是不一樣的,但是正好可以利用這個SPP層把不同尺寸的特征圖給轉換成特定大小的一個輸出,就可以只用把一整張圖傳進去給CNN,然后在CNN里只使用這一整張圖進行一次前向傳播,然后計算整張圖的一個特征圖,最后再把各個候選區域的特征給摳出來就可以了,也就是在整張圖上共享計算了,這就是SPPnet最終采用的一個方法。

SPPnet不是像R-CNN一樣把每一個候選區摳出來后再傳給CNN去進行一次前向傳播提取特征。這就解決了R-CNN的第三個問題,也就是在測試圖片的時候不需要把每個區域都給傳入到CNN中進行預測了,只需要傳一整張圖進去就就可以了。雖然解決了第三個問題,但是SPPnet還是有一些缺點的,首先像R-CNN一樣,SPPnet的訓練過程還是一個多階段的過程,因為在最后利用全連接層提取到特征之后還是像R-CNN一樣額外單獨訓練一個分類器或者訓練一個回歸模型。所以它還是一個多階段的訓練過程,并沒有解決R-CNN的第一個問題。既然是多階段的,那么所有特征還是需要先存下來,寫到磁盤里,以便后續訓練使用,所以R-CNN的第二個問題也沒有得到解決,并且雖然第三個問題通過特征共享解決了,但是它又引入了一個新的問題就是SPPnet的微調算法很難去更新這個卷積層。

因此本文就提出了Fast R-CNN的方法來嘗試解決上述R-CNN和SPPnet的缺點,Fast R-CNN有非常多的優點:

1.2.Fast R-CNN的貢獻

第一,它比R-CNN和SPPnet具有更高的一個檢測精度。第二,它的訓練過程是一個單階段的過程而不再是多階段了。第三,訓練能更新所有的網絡層而不是像SPPnet的第三個缺點不能更新卷積層。第四,由于訓練過程變成單階段了,所以說他也就不需要額外的磁盤空間來緩存特征了。

2.Fast R-CNN的模型結構和訓練流程?

圖一展示了Fast R-CNN的模型結構,圖一對于一整張輸入圖片,Fast R-CNN會先通過一個深度卷積神經網絡來得到整張圖片的一個圖片特征,根據候選區域在原圖上的一個圖片位置,可以使用RoI投影來獲取到候選區域在特征圖上的這個候選區域特征,有了候選區域的特征圖之后再通過RoI池化層來把這個尺寸不固定的候選區域特征圖給轉換成特定尺寸的一個特征圖,然后再接上兩個全連接層來得到每一個區域的特征向量,有了每一個候選區域的特征后再額外接上兩個并行的全連接層,其中一個利用softmax函數負責預測類別,另一個直接預測和框的坐標相關的一個框回歸,這個預測類別的分支,輸出k+1個類別,也就是數據集的類別加上一個背景類。另一個預測坐標的分支直接輸出4乘以(k+1)個值,也就是每個類別對應的坐標。

回顧SPPnet的網絡結構,就可以發現他們兩個的區別是不是就兩點,第一點區別是SPPnet在最后一個卷積層后面跟上的是一個空間金字塔池化,但是Fast R-CNN在最后一個卷積層后面跟上的是一個RoI池化層。第二點區別就是SPPnet在提取到候選區域的特征之后會像R-CNN一樣額外訓練支持向量機進行分類或回歸,但是Fast R-CNN在這里是后面直接接了兩個并行的全連接層實現分類和回歸。

?2.1.RoI池化層

RoI池化層能將任意有效的候選區域內的這個特征給轉化成一個小的特征圖,并且這個小的特征圖具有特定的一個空間范圍,這不就是SPPnet的這個空間金字塔池化層所干的事嗎。因為它本質上就是使用最大池化把不規則的一個特征圖給轉換成一個特定尺寸的輸出,只不過在這個空間金字塔池化層這里,它是分別使用了三個不同的池化來得到三個不同大小的一個輸出。但是在Fast R-CNN這里,作者只用了一個池化來得到一個輸出,所以作者才在最后這里寫到RoI池化層僅僅是空間金字塔池化層的一種特殊情況,因為金字塔池化層是有三個輸出,但是RoI池化層在這里它只有一個輸出。

2.2.從預訓練的模型中初始化一個Fast R-CNN模型?

?作者試驗了三個預訓練的Imagenet網絡,每個網絡都具有五個最大池化層并且具有5到13個卷積層。這三個預訓練模型的具體結構會在4.1小節給詳細列出。

所以這個就是預訓練網絡,它其實指的就是在Imagenet上預訓練好的一個圖像分類模型,預訓練的分類模型它一般都是這種結構,也就是說先傳入一整張圖片,給一個深度卷積網絡然后這個深度卷積網絡會得到這一整張圖片的一個特征圖,然后接上一個固定尺寸的最大值化層來對這一個特征圖做最大池化,再接上幾個全連接層,最后再跟上一個全連接層和softmax函數來輸出Imagenet數據集上的1000個圖像類別。這里的這個初始化指的其實就是把一個預訓練的一個圖像分類網絡給變成Fast R-CNN網絡的這么一個過程。

也就是從上面這個模型變成下面這個模型的過程,在變換的過程中一共經歷了三個變換階段。第一步先把最后的一個最大池化層給替換成RoI池化層。第二步是把最后的一個全連接層和softmax層給替換成了兩個并行的全連接層,其中一個分支用來預測k+1個類別,另一個分支用來預測邊界框回歸。第三步是把網絡給修改成了兩個數據輸入,除了輸入圖片外還需要輸入圖片中的一系列候選區域坐標以便于在最終的這個特征圖中把這個根據這個候選區域的坐標,把這個候選區域的特征給提取出來。

2.3.在檢測任務上進行微調?

在初始化好模型之后就需要開始微調這個檢測模型了。微調模型其實就是使用反向傳播來訓練整個網絡的一個權重,Fast R-CNN具有很好的訓練權重的能力,但是SPPnet卻不能很好的更新網絡權重,為什么呢?這就需要涉及到訓練過程中樣本的一個采樣方法。

看一下模型結構,這里因為是測試一張圖片,所以只有一張圖片,但是在模型訓練時它是需要一批一批的圖片給這個卷積神經網絡的一次會傳入多張圖片。在反向傳播更新權重的時候是需要利用正向傳播得到的中間每一層的值去更新權重的。假如是SPPnet在訓練時,它傳入的多張圖片,一批樣本是通過隨機采樣得到的,比如說需要128個候選區,這128個區域它可能是來自不同的圖片,也就是說需要傳入128張這種類似的原圖進去,然后在128個特征圖中各自提取各自所需要的這個后面區域。在前向傳播和反饋傳播的過程中會占用大量的顯存,降低模型的訓練效率,但是Fast R-CNN采用的是另一種方法。

在Fast R-CNN的訓練過程中,隨機梯度下降的這個mini batch它是通過一種按層抽樣的方法,這里以n=2,r=128為例,它會首先采樣兩張圖片然后在每張圖片上各自采樣64個候選區域,這樣做的好處就是每次在前會傳播的時候只傳兩張圖片進去就可以了。因為每張圖片的64個區域都是在一張圖上去得到的,所以說只需要兩張原圖傳進去,然后在兩張原圖的特征圖上各自提取64個候選區域就可以了,而不是像SPPnet一樣需要去傳入128個原圖。這就大大提升了訓練效率,這也就是作者他為什么提到SPPnet不能夠更新空間,金字塔池化層之前的一個網絡權重,因為它因為它更新權重的效率實在太低了。

?2.4.多任務損失函數

Fast R-CNN網絡是有兩個并行的輸出層的。這第一個輸出用來產生k+1個類別,其中p0 就表示某個候選區域是背景類的概率,p1-pk就表示屬于k數據集類別的概率。第二個分支輸出的就是一個框回歸的一個偏移量,它預測出來的tx和ty就表示框的中心點歸一化后的偏移量,tw和th就表示跟邊界框的寬和高相關的一個值,它們四個的具體含義跟R-CNN中的定義是一樣的。

求損失函數的時候除了要有預測值之外,還需要有一個提前標注好的一個目標值,也就是ground truth。作者在這里把標注好的候選區域類別給用u這個符號給表示出來,把邊界框回歸的這個目標值給定義成v這個符號。多任務損失的公式就可以寫成這種形式,也就是類別損失和框回歸損失相加的一個形式?

在求類別損失的時候,它用到了類別的預測值和類別的一個目標值,類別損失的具體公式就寫成了這種形式,它相當于是求了du類預測概率的log損失來作為分類的一個損失,在求框回歸損失的時候,用到了du類目標的一個坐標,預測值和目標值,它的具體公式就寫成了這種形式

通過求x y w h這四個值的預測值和目標值之間的一個smooth L1損失來作為框回歸的一個損失公式,smooth L1的一個具體的公式就是下面的這種形式,在這里也回顧一下R-CNN中使用的L2 損失,L2損失是這種形式就是x平方,看一下它們的圖像:

如果使用L2 損失,就這條曲線它是可以向兩端無限延伸的。如果你預測出來的這個預測值和目標值偏差過大的話,就會導致這個x過大,這x過大的話就會導致你這個值一直無限的往上延伸,然后在這個圖像上,它的這個斜率其實就是梯度,當無限往上延伸的時候這個梯度就會趨向于無窮大,就會產生梯度爆炸現象,沒法訓練。所以這個smooth L1損失在x大于等于1的時候把它寫成了這種形式

因為這種形式它的梯度是恒等于1的,也就是說它相當于是給這個梯度它設置了一個上限就不會再像這種L2 損失是一樣產生梯度爆炸的。因為這個梯度是恒等于1的,當x絕對值小于1的時候,這里多乘了一個0.5的這一個系數是為了讓這個分段函數它在x等于1的這個點兩端的一個梯度值是連續的。在公式中還有一個超參數就是lambda,這個lambda它其實就是用來控制你的分類損失和回歸損失之間的一個平衡,這個lamba的值一般被設置為1。

在公式里面還有一個就是這個方括號,它表示只有當目標類別是大于等于1的時候,這個方框的值才等于1,表示需要去求這個回歸損失。如果u等于0的話就表示這是一個背景類,這個值也就是零。所以最后求出一下這個回歸損失就是0。因為背景類它是沒有預測框的,也就不需要去求后邊這個回歸損失。

?2.5.尺度不變性

尺度不變性指的就是有兩個相同的目標,一個目標比較大,一個目標比較小。如果這兩個目標都能夠被模型識別出來,就說明這個模型具有比較好的尺度不變性。

作者實現了兩種方法來實現目標檢測的尺度不變性,第一種brute force,可以把它理解成單尺度訓練,在單尺度訓練過程中每一張圖片都被處理成了一個預定義好的圖片尺寸來進行訓練或者是進行預測。它的目的是讓網絡來直接學會尺度不變形。第二種這種多尺度方法其實就是在訓練期間,每一張圖片都先被隨機采樣成一個特定的尺度而不是像第一種一樣是采用一個預定義的固定尺度,然后這種多尺度的訓練方法也是一種數據增強的方式。關于這兩種方法哪種好,在第五章的時候會有實驗結果做對比。

3.Fast R-CNN測試

一旦Fast R-CNN的網絡被微調好后就可以進行目標檢測了。整個網絡只需要接收兩個輸入,分別是一張圖片和這個圖片中的一系列目標候選區域,就能夠預測出候選區域的類別和精確坐標了。

3.1.截斷SVD以便更快地檢測??

對于圖像分類任務來說,花費在全連接層上的時間比花費在卷積層上的時間要小。相反的對于檢測任務來說,由于這個RoI的數量非常非常的大,因此幾乎一半的錢會傳播時間都被花費在了計算全連接層上,這是因為在測試一張圖片的時候只需要通過一次前向傳播把這一整張圖的一個特征圖給提取出來就可以了。但是在后面進行全連接層運算的時候需要把這一張圖上所有的候選區域摳出來后的這個候選區域特征圖都給通過后面的全連接層去進行運算。所以說后面這個全連接層會占據大量的一個測試時間,所以必須要對后面這個全連接層進行加速,大的全連接層的一個加速方法就是通過這種階段的奇異值分解方法

先理解這個SVD是什么?簡單來說假如有一個u乘v大小的一個矩陣,可以通過奇異值分解把它分解成一個u乘n大小的矩陣,乘上一個n乘n大小的一個對角矩陣,再乘上一個n乘v大小的一個矩陣,并且中間的這個對角矩陣其實有一個性質就越靠近左上角的這個值越重要,越靠近右下角的這個值越不重要,既然右下角的這個值不重要,那就可以直接把這些值給去掉,讓中間的這個矩陣它變成一個t乘t的一個矩陣,相當于把后面的元素都給去掉,然后只保留左上角這一部分變成一個t乘t的矩陣,相應的前面這個矩陣就把最后這幾列給去掉,變成u乘t的一個矩陣,然后后面這個矩陣就把最后的這幾行給去掉就變成一個t乘v的一個矩陣,相當于對原始的這么一個u乘v的矩陣做了一個壓縮。我們把這個公式用字母表示就可以表示成左邊的這種形式,也就是左邊的這個矩陣跟你右邊的這個壓縮后的矩陣,其實兩者是可以近似相等的。

現在回到全連接層的概念,全連接層本質上就是讓參數矩陣w和一個輸入特征x去進行相乘,既然左邊乘x的,那么右邊也可以乘上一個x,也就是說可以把單個全連接層w給替換成兩個全連接層,這兩個全連接層中的第一個是使用了一個權重矩陣,這個形式也就是這個來作為兩個全連接層中的第一個,然后兩個全連接層中的第二個就使用這個u來作為權重矩陣,也就是這個這個全中,這就可以把左邊的這個和全連接層用右邊兩個更小的全連接層近似替換了,然后在替換前左邊的這個參數是u乘w的參數,然后右邊壓縮后的參數其實是u乘t加上一個v乘t,并且在右邊這個壓縮的力度越大,最后在右邊的這個參數是越小的,參數越少,模型的運行速度就會越快。所以說通過這種截斷的奇異值分解法可以提高全連接層的一個推理速度。

4.實驗結果

證明1. State-of-the-art mAP on VOC07, 2010, and 2012

證明2. Fast training and testing compared to R-CNN, SPPnet?

證明3. Fine-tuning conv layers in VGG16 improves mAP?

5.設計評價?

5.1多任務訓練有幫助嗎

實驗結果表明,這個多任務訓練的一個結果確實是要比這個多階段的訓練效果要好的。

5.2單尺度訓練和多尺度訓練的一個效果對比

?5.3Fast R-CNN是否需要更多的訓練數據

證明了對Fast R-CNN來說,更多的訓練數據確實會提高模型的精度而不會出現其他傳統模型出現了這種精度飽和的情況。

5.4支持向量機是否比soft max的訓練效果好

5.5候選區域是不是越多越好

參考視頻

目標檢測之Fast R-CNN論文精講,Fast RCNN_嗶哩嗶哩_bilibili

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

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

相關文章

WordPress禁止用戶注冊某些用戶名

不管在任何網站,用戶注冊時都有一個屏蔽非法關鍵詞,就是禁止注冊某些用戶名,原因是因為防止用戶使用一些特定的用戶名,例如管理員、官方等用戶名,還有就是那些攻擊性的詞語了。 加網站添加了屏蔽非法關鍵詞&#xff0…

BAT-致敬精簡

什么是bat bat是windows的批處理程序,可以批量完成一些操作,方便快速。 往往我們可以出通過 winR鍵來打開指令窗口,這里輸入的就是bat指令 這里就是bat界面 節約時間就是珍愛生命--你能想象以下2分鐘的操作,bat只需要1秒鐘 我…

考慮數據庫粒度的設計-提升效率

目錄 概要 場景 設計思路 小結 概要 公開的資料顯示,數據庫粒度是:“在數據庫領域,特別是數據倉庫的設計中,粒度是一個核心概念,它直接影響到數據分析的準確性和存儲效率。粒度的設定涉及到數據的詳細程度和精度&…

【JVM基礎篇】Java的四種垃圾回收算法介紹

文章目錄 垃圾回收算法垃圾回收算法的歷史和分類垃圾回收算法的評價標準標記清除算法優缺點 復制算法優缺點 標記整理算法(標記壓縮算法)優缺點 分代垃圾回收算法(常用)JVM參數設置使用Arthas查看內存分區垃圾回收執行流程分代GC算…

【SpringBoot】IDEA查看spring bean的依賴關系

前因:在研究springcloud config組件時,我發現config-server包下的EnvironmentController可以響應客戶端的請求,但EnvironmentController并不在啟動類所在的包路徑下,所以我推測它是作為某個Bean方法在生效,尋找bean的依…

vue-router 源碼分析——9.別名

這是對vue-router 3 版本的源碼分析。 本次分析會按以下方法進行: 按官網的使用文檔順序,圍繞著某一功能點進行分析。這樣不僅能學習優秀的項目源碼,更能加深對項目的某個功能是如何實現的理解。這個對自己的技能提升,甚至面試時…

DAY1: 實習前期準備

文章目錄 VS Code安裝的插件C/CCMakeGitHub CopilotRemote-SSH收獲 VS Code 下載鏈接:https://code.visualstudio.com 安裝的插件 C/C 是什么:C/C IntelliSense, debugging, and code browsing. 為什么:初步了解如何在VS Code里使用C輸出…

https創建證書

需要下載httpd模塊&#xff1a;yum install httpd -y 前提需要先搭建一個虛擬主機來測試證書創建的效果&#xff0c;以下面www.hehe.com為例&#xff0c;可以參考創建&#xff1a; [rootlocalhost conf.d]# vim vhost.conf <directory /www> allowoverride none requi…

關于小愛同學自定義指令執行

1.前言 之前買了小愛同學音響&#xff0c;一直想讓其讓我的生活變得更智能&#xff0c;編寫一些程序來完成一些自動化任務&#xff0c;但是經過搜索發現&#xff0c;官方開發者平臺不能用了&#xff0c;尋找api階段浪費了我很長時間。最后在github 開源項目發現了倆個比較關鍵…

13.SQL注入-寬字節

SQL注入-寬字節 含義&#xff1a; MySQL是用的PHP語言&#xff0c;然后PHP有addslashes()等函數&#xff0c;這類函數會自動過濾 ’ ‘’ null 等這些敏感字符&#xff0c;將它們轉義成’ ‘’ \null&#xff1b;然后寬字節字符集比如GBK它會自動把兩個字節的字符識別為一個漢…

內容營銷專家劉鑫煒:網站排名需考慮哪些SEO優化技巧?

網站排名的SEO優化技巧包括&#xff1a; 1. 關鍵詞研究&#xff1a;了解目標受眾的搜索關鍵詞&#xff0c;將這些關鍵詞合理地應用在網站的標題、描述、正文和標簽中&#xff0c;有助于提高網站排名。 2. 內容優化&#xff1a;創建高質量、有價值的內容&#xff0c;可以吸引搜…

Qt源碼解析之QObject

省去大部分virtual和public方法后&#xff0c;Qobject主要剩下以下成員&#xff1a; //qobject.h class Q_CORE_EXPORT Qobject{Q_OBJECTQ_PROPERTY(QString objectName READ objectName WRITE setObjectName NOTIFY objectNameChanged)Q_DECLARE_PRIVATE(QObject) public:Q_I…

STM32-OC輸出比較和PWM

本內容基于江協科技STM32視頻內容&#xff0c;整理而得。 文章目錄 1. OC輸出比較和PWM1.1 OC輸出比較1.2 PWM&#xff08;脈沖寬度調制&#xff09;1.3 輸出比較通道&#xff08;高級&#xff09;1.4 輸出比較通道&#xff08;通用&#xff09;1.5 輸出比較模式1.6 PWM基本結…

MATLAB常用語句總結7

MATLAB總結7&#xff1a;常見錯誤歸納 本篇專門用于記錄一些應試技巧 文章目錄 MATLAB總結7&#xff1a;常見錯誤歸納前言一、一些小定義和小技巧二、蒙塔卡羅求解方法1.函數的定義2.函數引用3.代碼量較少的蒙塔卡羅 三、函數引用與多變量四、矩陣引用五、非線性函數&#xff…

14-39 劍和詩人13 - 頂級大模型測試分析和建議

????? 隨著對高級語言功能的需求不斷飆升&#xff0c;市場上涌現出大量語言模型&#xff0c;每種模型都擁有獨特的優勢和功能。然而&#xff0c;駕馭這個錯綜復雜的生態系統可能是一項艱巨的任務&#xff0c;開發人員和研究人員經常面臨選擇最適合其特定需求的模型的挑戰。…

哈弗架構和馮諾伊曼架構

文章目錄 1. 計算機體系結構 2. 哈弗架構&#xff08;Harvard Architecture&#xff09; 3. 改進的哈弗架構 4. 馮諾伊曼架構&#xff08;Von Neumann Architecture&#xff09; 5. 結構對比 1. 計算機體系結構 計算機體系結構是指計算機系統的組織和實現方式&#xff0c…

Python | Leetcode Python題解之第220題存在重復元素III

題目&#xff1a; 題解&#xff1a; class Solution(object):def containsNearbyAlmostDuplicate(self, nums, k, t):from sortedcontainers import SortedSetst SortedSet()left, right 0, 0res 0while right < len(nums):if right - left > k:st.remove(nums[left]…

Python基礎問題匯總

為什么學習Python&#xff1f; 易學易用&#xff1a;Python語法簡潔清晰&#xff0c;易于學習。廣泛的應用領域&#xff1a;適用于Web開發、數據科學、人工智能、自動化腳本等多種場景。強大的庫支持&#xff1a;擁有豐富的第三方庫&#xff0c;如NumPy、Pandas、TensorFlow等…

Sass 語法

文章目錄 編譯變量 \$嵌套 {} > \~導入 import注釋 // /*\* \**/混入 mixin/include繼承 extend數據類型運算控制 if/for/each/while函數 function媒體查詢 media根發出 at-root警告warn/錯誤error/調試debug 編譯 編譯命令 單文件轉換命令 sass input.scss output.css單…

數學基礎 -- 反函數

反函數技術文檔 反函數的定義 反函數&#xff08;inverse function&#xff09;是指一種將函數的輸出反過來作為輸入&#xff0c;從而恢復原來輸入的函數。具體來說&#xff0c;如果有一個函數 f f f&#xff0c;它把一個值 x x x 映射到一個值 y y y&#xff0c;即 f ( …