Day05 Pose Proposal Netwroks(更快速的人體姿態預估)


前言

一位日本學者關井大氣將YOLOv3加上bottom-up的想法運用在姿態預測的方法,首先先將輸入影像大小重新統一,經過CNN輸出人體關節位置、關節連接訊息,再針對兩種訊息的候選區域用NMS將單人對應生成人體動作預測資訊

這個方法是目前看到的人體姿態預測中運行時間是最快的,比起openpose快了100個數量級,是可以將人體姿態預測做到即時的重要成果

Demo影片
Poster

雖然速度上表現優異,但是在姿態預測的準確上仍有許多進步空間:

  1. 少見的姿勢
  2. 連接錯誤
  3. 在多人下沒有偵測到的部位
  4. 在兩人模式下連接錯誤

內容

翻譯內容:
Taiki Sekii, "Pose Proposal Networks", Konica Minolta, Inc.
http://taikisekii.com/PDF/Sekii_ECCV18.pdf

0. 摘要

我們提出了一種新穎的方法來實時檢測未知數量的關節式2D姿勢。 為了將像素級身體部位檢測器的運行時復雜度與卷積神經網絡(CNN)特徵圖分辨率分離開來,我們的方法(稱為姿態提議網絡)引入了一種最新的單發物體檢測範例,它使用了網格方式圖像 自底向上姿勢檢測場景中的特徵映射。 身體部位建議(表示為區域建議)和肢體直接通過單次CNN檢測。 專門針對此類檢測,概率重新設計了自下而上的貪婪解析步驟,以考慮全局情況。 在MPII Multi-Person基準測試上的實驗結果證實,與使用最新的自下而上方法相比,我們的方法可達到72.8%的mAP,而使用GeForce GTX1080Ti卡的總運行時間可達5.6 ms(180 FPS), 超過了最新方法中觀察到的瓶頸運行時。

圖1.通過基於ResNet-18的PPN進行的多人姿勢檢測結果示例。 使用單次CNN直接從輸入圖像(a)中檢測零件邊界框(b)和肢體(c),並將其解析為單個人(d)(請參閱§3)

1. 介紹

如圖1所示,檢測人類並同時估計其鉸接式姿勢(我們稱為姿勢)的問題已成為計算機視覺中一項重要且高度實用的任務,這歸功於深度學習的最新進展。 儘管此任務在運動分析和人機交互等領域具有廣泛的應用,但其測試時間的計算成本仍然可能成為實時系統的瓶頸。 人體姿勢估計被定義為解剖學關鍵點或地標(我們稱為部分)的定位,並根據最終目標和做出的假設使用各種方法來解決:
–使用單個或順序圖像作為輸入;
–使用(或不使用)深度信息作為輸入;
–在2D或3D空間中零件的本地化; 和
–單人或多人姿勢的估計。

本文著重於從2D靜態圖像進行多人2D姿勢估計。 特別地,我們不假定提供了人物實例的地面真實位置和比例,因此,我們需要檢測未知數量的姿勢,即,我們需要實現人體姿勢檢測。 在這種更具挑戰性的環境中(稱為“野外”),我們追求可以實時執行的端到端檢測框架。

先前的方法[1-13]可以分為以下兩種類型:一種首先檢測人的實例,然後將單人姿勢估計器應用於每個檢測,另一種首先檢測部分,然後將其解析為每個人的實例。這些分別稱為自上而下和自下而上的方法。這種最先進的方法在運行時間和準確性上都顯示出競爭優勢。但是,自上而下方法的運行時間與人數成正比,這給實時性能帶來了挑戰,而自下而上方法則需要瓶頸零件關聯程序,該程序提取零件之間的上下文線索並將零件檢測結果解析為單個人。此外,大多數最新技術都旨在預測圖像中逐像素的零件置信度圖。這些圖迫使卷積神經網絡(CNN)提取具有更高特徵的圖維持健壯性和架構加速(例如縮小)必不可少的解決方案架構)受到干擾,具體取決於應用程序。

在本文中,為了將人體姿勢檢測的運行時復雜度與CNN的特徵圖分辨率分離開來並提高性能,我們依賴於一種最新的單發目標檢測範例,該範例大致提取了網格方向目標相對置信度使用相對較小的CNN映射到圖像中。我們從區域建議(RP)框架2 [14-17]中受益,並將人體姿勢檢測重新構造為對象檢測問題,如圖2所示,從圖像像素回歸到人物實例和零件的RP。在以前的為像素級零件建議設計的零件關聯中,我們的框架使用單發CNN直接檢測肢體3,並通過一種新穎的概率貪婪解析步驟從這種檢測中生成姿態建議,其中考慮了全局上下文。零件RP被定義為邊界框檢測,其大小與人員比例成比例,並且可以僅使用公共關鍵點註釋進行監督。整個架構是由具有相對較低分辨率特徵圖的單個完整CNN構成的,並使用為姿勢檢測性能而設計的損失函數直接對端到端進行了優化;我們稱這種架構為提案網絡(PPN)

2. 相關工作

我們將簡要回顧一下單人和多人姿勢估計的最新進展,以將我們的貢獻納入實際情況。

單人姿勢估計 大多數用於單人姿勢估計的早期經典方法[18-23]都假定該人主導圖像內容,並且所有肢體都是可見的。這些方法主要是在各種概念(例如,圖形結構模型[18、19],層次模型[22]和非樹模型[[ 20、21、23]。由於基於深度學習的模型[24-26]使問題變得易於處理,因此基準測試結果已通過各種基本架構(例如卷積姿態機(CPM)[27],殘差網絡(ResNets)[ 28、11]和堆疊的沙漏網絡(SHN)[29]。這些模型著重於考慮到大型詳細空間上下文的堅固部分檢測器,並在最先進的單人[30-33]和多人上下文[1、2、2, 9]。

多人姿勢估計 通過引入空間變換器網絡[2,34]或RoIAlign [4],在人類檢測器和姿勢估計器之間形成層。

相反,標準的自下而上的方法[1、6、8、9、11、13]較少依賴人體檢測器,而是通過找到以一致的幾何構型出現的部分或成對的零件檢測來檢測姿勢。 因此,它們不受人體探測器的限制。 最近的自下而上的方法不僅使用CNN來檢測零件,而且還直接從圖像中提取零件之間的上下文線索,例如以圖像為條件的成對術語[6],零件親和力字段(PAF)[1]和關聯嵌入( AE)[9]。

自上而下和自下而上方法中的最新方法都可以實現實時性能。 他們對部分提案的“原始”是像素點。 但是,我們的方法與此類方法的不同之處在於,我們的圖元是對零件比例信息進行編碼的網格邊界框檢測。 我們簡化的網格明智的零件提議使淺層CNN可以直接檢測到肢體,每個零件提議最多可以用幾十種模式來表示。 專門針對這些檢測,可能重新設計了貪婪的解析步驟以對全局上下文進行編碼。 因此,我們的方法不需要耗時的像素級特徵提取或解析步驟,因此,其總運行時間超過了最新方法中觀察到的瓶頸運行時間。

3. 方法

人體姿勢檢測可通過以下步驟實現
1.將輸入圖像調整為CNN的輸入大小。
2.對CNN進行向前傳播,並獲取人員實例和部位以及肢體檢測的RP。
3.對這些RP執行非最大抑制(NMS)。
4.將合併的RP解析為個人,並生成姿勢建議。
圖2描述了我們框架的流程。 §3.1描述了步驟2和3中使用的人員實例和部位的RP檢測以及肢體檢測。§3.2描述了步驟4。

3.1 PPNs

我們利用RP框架之一YOLO [15,16],並將其概念應用於人體姿勢檢測任務。 PPN由單個CNN構成,並為輸入圖像上的每個檢測目標(人物實例或每個部分)生成固定大小的RP集合。 CNN將輸入圖像劃分為H×W網格,每個網格對應一個圖像塊,並為每個網格單元i∈G = {1,。。產生一組RP檢測{Bik}k∈K。 。 。 ,H×W}。 在此,K = {0,1,...。 。 。 ,K}是檢測目標的指標的集合,K是零件數。 代表總體人員實例的類的索引(人員實例類)由K中的k = 0給出。

Bik考慮到邊界框的置信度以及邊界框的坐標,寬度和高度,對這兩個概率進行編碼,如圖3所示,並由下式給出

其中R和I是二進制隨機變量。 在此,p(R | k,i)是代表網格單元i“負責”檢測k的概率。 如果k的地面真值邊界框的中心落入網格單元,則該網格單元對“ k”的檢測“負責”。 p(I | R,k,i)是一個條件概率,它表示i中預測的邊界框對k的擬合程度,並由預測邊界框和地面實況邊界框之間的聯合相交(IoU)進行監督。

oix,k,oiy,k坐標表示邊框相對於網格單元邊界的中心,比例尺通過單元的長度進行歸一化。 wik和hik分別通過圖像的寬度和高度進行歸一化。 人物實例的邊界框可以表示為圍繞整個身體或頭部的矩形。 與以前的按像素的部分檢測器不同,在我們的方法中按網格對部分進行檢測,並且根據人的比例(例如上半身的長度的五分之一或頭部的一半)對盒子的大小進行監督。 地面實況框監督有關邊界框的這些預測。

oix,k,oiy,k坐標表示邊框相對於網格單元邊界的中心,比例尺通過單元的長度進行歸一化。 wik和hik分別通過圖像的寬度和高度進行歸一化。 人物實例的邊界框可以表示為圍繞整個身體或頭部的矩形。 與以前的按像素的部分檢測器不同,在我們的方法中按網格對部分進行檢測,並且根據人的比例(例如上半身的長度的五分之一或頭部的一半)對盒子的大小進行監督。 地面實況框監督有關邊界框的這些預測。

相反,對於位於x處的每個網格單元i,CNN也會生成一組肢體檢測{Ck1k2}(k1,k2)∈L,其中L是構成肢體的一組檢測目標索引對。 Ck1k2編碼一組表示每個肢體存在的概率,並由下式給出:

來自x的肢僅到達以x為中心的局部H0×W0區域,並將X定義為相對於x的一組有限位移,其公式為

在此,Δx是相對於x的位置,因此,由於CNN具有平移不變性,因此可以使用CNN在每個網格單元上獨立估計p(C | k1,k2,x,x +Δx)。

每個上述預測對應於CNN產生的輸出3D張量的深度中的每個通道。 最後,CNN輸出H×W×{6(K +1)+ H0W0 | L |}張量。 在訓練過程中,我們優化了以下多部分損失功能:

中δik∈{1,0}是一個變量,指示i是否僅負責單個人的k,j是位於x + ∆x處的網格單元的索引,並且(λresp。,λIoU,λcoor。 (λsize,λlimb)是每個損失的權重。

3.2 產生預估姿勢

概述 對每個檢測目標的RP應用IoU閾值的標準NMS,我們可以獲得固定大小的合併RP子集。 然後,在這些RP中同時包含多個人的正確和錯誤肯定的條件下,通過在構成肢體的檢測目標之間將RP進行匹配和關聯來生成姿勢提議。 該解析步驟對應於K維匹配問題,已知為NP困難[35],並且存在許多鬆弛現象。

在本文中,受[1]的啟發,我們介紹了兩種能夠實時生成一致匹配的鬆弛。首先,選擇最少數量的邊緣以獲得鉸接式姿勢的生成樹骨架,其節點和邊緣分別代表檢測目標和它們之間的肢體檢測的合併RP子集,而不是使用完整的圖。該樹由有向邊組成,並且其根節點屬於人員實例類。其次,將匹配問題進一步分解為一組二分匹配子問題,並獨立確定相鄰樹節點中的匹配,如圖4所示。 [1]證明了這種最小的貪婪推理可以以很小的計算成本很好地逼近全局解,並得出結論,非相鄰樹節點之間的關係可以在其成對部分關聯分數中進行隱式建模,而CNN則對它們進行建模。與它們的方法相比,為了使用接收域較窄的相對較淺的CNN,並降低了計算成本,我們提出了一種考慮非相鄰樹節點之間關係的概率貪婪解析算法。

信心分数 给定检测目标的合并RP,我们为k的第n个RP的检测定义了置信度得分,如下所示:

等式右邊的每個概率。 (5)由Bik在等式中編碼。 (1)。 n∈N= {1,。 。 。 ,N},其中N是每個檢測目標的合併RP數。 另外,通過使用等式定義肢體的置信度得分,即從在x處預測的k1的第n1個RP到在x + ∆x處預測的k2的第n2個RP的有向連接。 (2)如下:

零件關聯。 使用成對零件關聯得分的零件關聯通常可以定義為所有可能連接的最佳分配問題,

在所有可能的肢体检测中最大化置信度分数,该置信度分数近似于联合概率,

此,Zn1n2 k1k2是表示k1的第n1個RP和k2的第n2個RP是否已連接且滿足的二元變量。

使用式 (9)確保沒有多個邊緣共享一個節點,即,一個RP沒有連接到不同的多個RP。 在此圖匹配問題中,圖的節點都是檢測目標的所有合併RP,邊緣是構成肢體的RP之間的所有可能連接,肢體檢測的置信度得分為 邊緣。 我們的目標是在二分圖中找到匹配項,作為選擇的具有最大權重的邊的子集

在與上述兩個鬆弛相關的改進的零件關聯中,將人物實例用作根部分,並將每個部分的提議沿姿勢圖上的路線分配給人物實例提議。 二分匹配子問題
為構成肢體的每對檢測目標(k1,k2)定義一個,以便為k1和k2之間的一組連接找到最佳分配,

然後,

我們獲得最佳分配Zˆk1k2,如下所示:



在這裡,k1的節點比k2和k2的節點更靠近圖的路線上的人物實例的節點。

k0 不等於 k2表示另一個檢測目標已連接到k1。 nˆ0是k0的RP的索引,它與k1的第n1個RP連接並且滿足

這種優化使用式。 (14)需要從與人實例連接的部分中計算出來。 我們可以使用匈牙利算法[36]獲得最佳匹配。 最後,通過所有最佳分配,我們可以將共享相同RP的連接組裝成多人的全身姿勢

F在等式中的差異。 (8)和等式中的Fk1k2。 (13)是在使用等式進行的匹配中考慮了RP的置信度得分和從圖中的人物實例的節點出發的路線上的肢體檢測。 (12)。 與在解析中考慮CNN的接收域相比,這導致了更寬的圖像區域的全局上下文。 在§4中,我們顯示了詳細的比較結果,證明了當使用淺層CNN時,改進後的解析可以很好地近似全局解決方案。

4. 實驗

4.1 數據集

我們在具有挑戰性的公共“ MPII人類姿勢”數據集上評估了我們的方法[37],該數據集包含大約25K圖像,其中包含超過40K的帶註釋的人(其中四分之三可用於培訓)。 為了進行公平的比較,我們遵循正式的評估協議,並使用可公開獲得的評估腳本4對[1]中使用的驗證集進行自我比較。

首先,僅包含足夠分散的人員的“單人”子集用於評估建議的零件RP表示的純性能。 該子集包含一組6908人,並且每個人的大致位置和比例都是可用的。 對於此子集的評估,我們使用標準的“正確關鍵點百分比”評估指標(PCKh),其匹配閾值定義為頭部段長度的一半。

其次,為了評估PPN在野外進行人體姿勢檢測的全部性能,我們使用了“多人”子集,該子集包含一組1758組多個重疊的人,這些人在高度關節的姿勢中具有可變數量的零件。 這些組取自[11]中概述的測試集。 在此子集中,即使每個組佔據的區域和每個組中所有人員的平均規模都可用,也沒有提供有關人數或各個人員規模的信息。 對於此子集的評估,我們使用了Pishchulin等人概述的評估指標。 [11],計算零件檢測的平均精度(AP)。

4.2 改善

RP的設置 如圖2所示,人員實例的RP和零件的RP分別定義為以頭部和每個部位為中心的正方形檢測。 對於人員實例,這些長度定義為頭部長度的兩倍,而對於零件,則定義為頭部長度的一半。 因此,可以從兩個給定的頭部關鍵點計算所有地面真相框。 對於肢體檢測,兩個頭部關鍵點被定義為連接到人物實例,其他連接的定義類似於[1]。 因此,| L | 設置為15。

建築 作為基礎架構,我們使用在ImageNet 1000類競賽數據集上預先訓練的18層標準ResNet [38]。 該體系結構中的平均池層和完全連接層被三個附加的新卷積層取代。 在此設置下,第3.1節中所述的CNN在圖像上的輸出網格像元大小對應於32×32 px2,並且對於384×384的歸一化輸入大小,(H,W)=(12,12)。 訓練中使用的CNN。 與以前的像素部分檢測器相比,該圖像上的網格單元大小相當大(通常為4×4 px2或8×8)。

最後添加的捲積層使用線性激活函數,其他添加的層使用以下泄漏校正線性激活:

所有添加的圖層都使用1像素的步幅,並且權重都被隨機初始化。 添加的層中的第一層使用批處理規範化。 除最後一層以外的添加層的濾鏡大小和濾鏡數分別設置為3×3和512。 在最後一層中,濾波器的大小設置為1×1,如第3.1節所述,濾波器的數量設置為6(K +1)+ H0W0 | L |。 = 1311,其中(H0,W0)設置為(9,9)。 K設置為15,類似於[1]中使用的值。

訓練 在訓練過程中,為了對384×384個輸入樣本進行歸一化,我們首先調整圖像大小以使樣本大小大致相同(wrt 200 px人身高),然後根據中心位置和粗略估計對圖像進行裁剪或填充 在數據集中提供。 然後,除了多人任務的係數[0.35,2.5]和[1.0,2.0]的比例縮放以外,我們還以[−40,40]的旋轉度,偏移擾動和水平翻轉隨機擴展數據。 用於單人任務。

(λresp。,λIoU,λcoor。,λsize) 將(4)設置為(0.25、1、5、5),並且在多人任務中將λlimb設置為0.5,在單人任務中將λlimb設置為0。 使用SGD對整個網絡進行訓練,以在多人任務中進行260K迭代,在單人任務中進行130K迭代,在兩個GPU上的批處理大小為22,動量為0.9,權重衰減為0.0005。 兩個GPU上的260K迭代大致對應於訓練集的422個時期。 學習率l取決於迭代次數m線性降低,計算方式如下:

使用帶有兩塊GeForce GTX1080Ti卡,3.4 GHz Intel CPU和64 GB RAM的計算機,培訓大約需要1.8天。

測試 在測試我們的方法期間,調整了圖像的大小,以使目標人員的平均比例在多人任務中對應於1.43,在單人任務中對應於1.3。 然後,他們被圍繞在目標人群周圍。 先前方法的準確性摘自原始論文,或者使用其公開的評估代碼進行了複製。 在包括基線在內的所有方法的計時過程中,都將使用評估圖像時使用的每個平均分辨率來調整圖像的大小。 在上述機器上使用相同的單個GPU卡和深度學習框架(Caffe [39])報告了計時,這些計時是對每種方法執行最快的批處理大小進行平均的。 除了CNN的正向傳播外,我們的檢測步驟在CPU上運行。

4.3 人體部位預測

我們將PPN的零件檢測與先進的方法在單人和多人環境中使用的幾個像素級零件檢測器進行比較。 使用逐像素檢測器的預測和PPN的預測分別是給定零件的熱圖的最大激活位置和每個零件的最大激活RP的位置。

表1和2比較了PCKh性能以及單人測試儀上PPN和其他檢測器的速度,並列出了每種方法中使用的網絡的屬性。 注意[6]在處理多人姿勢估計時提出了部分檢測器。 他們使用與PPN相同的基於ResNet的體系結構,它的深度(152層)是我們的PPN的幾倍,並且與我們的不同之處僅在於網絡規模龐大,可以生成逐像素的零件建議。 我們發現,檢測器的速度和FLOP計數(相加)使所有其他檢測器不堪重負,即使考慮到其PCKh稍低(百分之幾),也至少快11倍。 特別是,使用與我們相同的架構,PPN達到了與基於ResNet的零件檢測器[6]相當的PCKh,這一事實表明,在探索速度/精度之間的權衡時,零件RP有效地充當了零件原語。

4.4 人體姿態預測

表3和表4比較了PPN的完整實現和以前的方法在288個測試圖像的同一子集(如[11]中)和整個多人測試集之間的平均AP(mAP)性能。在圖7中可以看到通過我們的方法所作的預測。請注意,[1]是使用未貼標籤人員的非正式遮罩(在圖6中報告為w / o / o / o遮罩)訓練的,並以良好的等級進行排序根據原始論文的數據,可以得到百分之幾的mAP利潤,並且我們的方法可以通過用50層和101層ResNet代替基本體系結構進行調整。儘管檢測到粗糙的零件,但我們方法的最深模式(報告為帶有ResNet101)在上半身部位上仍能達到最佳性能。此快速PPN的總運行時間達到5.6 ms(180 FPS),超過了下面描述的最新瓶頸運行時間。使用CNN和解析步驟進行正向傳播的運行時間分別為4 ms和0.3 ms。剩餘的運行時間(1.3毫秒)主要由零件提案NMS佔用。


圖5是一個散點圖,顯示了我們方法的mAP性能和速度以及使用可公開獲得的實施方法或原始論文報告的前3種方法的速度。彩色點線分別對應於先前的方法之一,表示總處理中的速度極限,作為除CNN向前傳播(例如調整CNN特徵圖的大小[1、2、9],零件[1,9]和NMS在人類檢測[2]或零件建議[1,9]中(顏色代表每種方法)。此類瓶頸步驟已在一定程度上被GPU優化或加速。在不損失準確性的情況下改進基礎架構不會幫助每種最新方法超出其速度極限,而又不會保留冗餘的逐像素或自上而下的策略。同樣清楚的是,當所有基於CNN的方法的加速速度達到速度極限時,它們的性能都會大大降低。與最先進的方法相比,我們的方法平均要快一個數量級以上,並且可以克服上述瓶頸速度限制。

另外,為了更詳細地將我們的方法與最新方法進行比較,我們基於其公開的評估代碼重現了最新的自下而上方法[1],並通過調整 多級卷積的數量和尺度搜索。 圖6是一個散點圖,顯示了我們的方法和[1]中提出的方法的mAP性能和速度,可以通過幾種模式進行調整。 通常,我們觀察到我們的方法平均可以實現更快,更準確的預測。 上面與先前方法的比較表明,當探索速度/精度權衡時,我們的方法可以使整個算法的計算成本最小化。

表5列出了我們方法的幾種不同版本的mAP性能。首先,當等式中的p(I | R,k,i)。 (1)並不是由像素部分檢測器估算的,在我們的方法中會被忽略(即,當p(I | R,k,i)替換為1時),並且當我們的NMS遵循先前的像素時-明智的方案是在部分置信度圖中找到最大值(報告為w / o標度),其性能會比完整實現的性能降低(報告為Full)。這表明速度/精度的權衡得到了有關零件比例的附加信息的改進,該附加信息是從零件建議為邊界框這一事實獲得的。其次,當零件關聯中僅考慮本地上下文時(報告為w / o glob。),即,Snˆ0n1 k0k1在等式中被Dn1k1代替。 (14),我們最淺的架構ResNet-18的性能比最深的架構ResNet-101的性能進一步惡化(-2.2%vs -0.3%)。這表明我們的上下文感知解析對於淺層CNN有效。

4.5 限制

我們的方法可以為每個網格單元的每個檢測目標預測一個RP,因此這種空間限制限制了我們的模型可以在每個網格單元內預測的附近人員的數量。 如圖8(c)所示,這使我們的方法難以與諸如人群擁擠的場景之類的人群抗爭。 具體來說,我們觀察到我們的方法在包含大量變化(例如,附近的小人物)的“ COCO”數據集[40]上的效果較差。 即使解決此問題的方法是增大CNN的輸入大小,但這又會導致速度/精度之間的權衡取捨,具體取決於其應用。

總結

我們提出了一種檢測人並同時從2D靜止圖像估計2D關節姿勢的方法。 我們改善速度/精度權衡的主要創新是將一種最新的單發物體檢測範例引入自下而上的姿態檢測場景,並將零件建議表示為RP。 此外,直接使用CNN來檢測肢體,並針對這種檢測概率重新設計貪婪的解析步驟,以對全局上下文進行編碼。 在MPII Human Pose數據集上的實驗結果證實,我們的方法具有與最新的自下而上的方法相當的準確性,並且速度更快,同時提供了端到端的培訓框架5。 在未來的研究中,為了提高對粗網格預測造成的空間約束的性能,我們計劃探索一種算法,以協調從這兩個方面的最新架構中獲得的高級和低級特徵 檢測和零件關聯。

參考資料

Taiki Sekii, "Pose Proposal Networks", Konica Minolta, Inc.
http://taikisekii.com/PDF/Sekii_ECCV18.pdf
http://taikisekii.com/

#Computer Vision #AI #Human Pose Estimation #Pose Proposal Networks #Deep Learning







你可能感興趣的文章

Advanced iOS App Architecture (Second Edition): Real-World App Architecture in Swift

Advanced iOS App Architecture (Second Edition): Real-World App Architecture in Swift

如何阻擋android原生的statusBar

如何阻擋android原生的statusBar

ASP.NET Core Web API 入門教學 - 參數化並過濾接受值

ASP.NET Core Web API 入門教學 - 參數化並過濾接受值






留言討論