【IQA技術專題】紋理相似度圖像評價指標DISTS

在這里插入圖片描述

紋理一致性圖像評價指標: Image Quality Assessment: Unifying Structure and Texture Similarity(2020 PAMI)

  • 專題介紹
  • 一、研究背景
  • 二、方法總覽
    • 2.1 初始變換
    • 2.2 紋理表示和結構表示
    • 2.3 DISTS指標
    • 2.4 優化DISTS指標
  • 三、實驗結果
  • 四、總結

本文將對統一圖像結構和圖像紋理的評價指標DISTS進行講解。這篇主要的亮點在于作者開發了一個具有明確容忍紋理重采樣的全參考質量評價模型,參考資料如下:
[1]. 論文地址
[2]. 代碼地址
[3]. IQA-pytorch代碼路徑
[4]. 作者視頻講解地址


專題介紹

圖像質量評價(Image Quality Assessment, IQA)是圖像處理、計算機視覺和多媒體通信等領域的關鍵技術之一。IQA不僅被用于學術研究,更在影像相關行業內實現了完整的商業化應用,涉及影視、智能手機、專業相機、安防監控、工業質檢、醫療影像等。IQA與圖像如影隨形,其重要程度可見一斑。

但隨著算法側的能力不斷突破,AIGC技術發展火熱,早期的IQA或已無法準確評估新技術的能力。另一方面,千行百業中各類應用對圖像質量的需求也存在差異和變化,舊標準也面臨著適應性不足的挑戰。

本專題旨在梳理和跟進IQA技術發展內容和趨勢,為讀者分享有價值、有意思的IQA。希望能夠為底層視覺領域內的研究者和從業者提供一些參考和思路。

系列文章如下:
【1】🔥IQA綜述
【2】PSNR&SSIM
【3】Q-Insight
【4】VSI
【5】LPIPS


一、研究背景

作者研究的動機,可以用以下的圖來直觀明確的表達。
在這里插入圖片描述
圖中(a)、(b)、(c)分別是原圖,原圖進行jpeg壓縮的圖像,以及重新在同樣的草上采樣的圖(這里作者用的詞叫resample)。從人類的認知上來說,會覺得(c)和(a)會更相像,然而這里所有的常規的IQA方法都失效了,包含前面提到的PSNR、SSIM以及LPIPS等,這里失敗的原因也很明顯,作者想要捕捉的是紋理上的感知一致性,而紋理具有不規則的情況,對于人類的感知來說并不需要像素級別的完全對其或一致,以前的方法對于這種情況的紋理不太具有容忍度,與實際人類的感知是不一樣的。

基于此,作者開發了一個能夠在圖像結構和圖像紋理上都具有與人類相同感知判斷的指標,在此之上,還希望紋理能夠resample(不需要像素級對齊)之后也是一樣的,另外區分開退化(JPEG,JPEG會損失紋理)。總的來說,作者的貢獻如下(作者沒有明確分點,博主這里做一個簡單總結):

  1. 開發了第一個具有明確容忍紋理resample的全參考圖像質量評價模型。
  2. 設計特征空間的均值作為圖像紋理統計特征,引入全局SSIM作為結構相似性指標,結合這兩點在多尺度特征上利用不同的權重得到一個綜合評價的指標。
  3. 通過最小化從相同紋理圖像裁剪的子圖像之間的相似距離,進一步優化了同一紋理判斷的魯棒性。
  4. 優化后的方法在傳統的圖像評價數據集和紋理相似數據集上都更接近人類的判斷結果,該方法在紋理分類和檢索任務上表現優異,最后該方法還對幾何變化(平移和擴張)不敏感且不需要專門的訓練或數據增強。

二、方法總覽

博主先對該方法做一個大概的流程總結,后續會按照這個流程進行描述,整體博主認為可以分為4個步驟:

  1. 對圖像進行一個初始的變換,從像素空間變換到特征空間。
  2. 對特征提取所謂紋理的表示,對特征提取所謂結構的表示。
  3. 利用紋理和結構的表示,加入一些可學習的權重綜合計算一個評價指標。
  4. 利用這個評價指標,進一步優化權重得到紋理區域resample不敏感的指標,且能夠有結構和紋理上做感知相似度的模型。

作者展示了這個評價指標做損失函數優化隨機噪聲和帶JPEG噪聲做輸入的效果。可以看到本文的方法可以精準捕捉結構和紋理,優化后的效果在跟原圖感知相似度上對比其他方法是最高的。
在這里插入圖片描述
其他方法有些在輸入為隨機噪聲時,連結構信息都被丟失了,最好表現的LPIPS在紋理上表現不如DISTS。
下面根據上面提到的幾點根據順序進行講解。

2.1 初始變換

作者最后使用的是在ImageNet上訓練的VGG16網絡來對圖像進行預處理,轉換到特征空間,原因在于pixel空間不好對比感知距離。但是這個對于選取的變換,提到2個很重要的點:

  1. 下采樣時需要抗混疊:作者描述的原因比較學術,博主這里做一些比較形象的描述,混疊現象一般會給圖像的高頻區域帶來2個最常見的問題是,空間上的鋸齒現象以及通道上的偽彩現象,這些是不抗混疊帶來的artifact現象。那在這里,VGG16也是需要下采樣的,下采樣VGG16中使用到的算子是Maxpool,一個不抗混疊的算子,解決這個問題的方法非常簡單,作者直接替換了這個算子引入了一個g濾波器,最后的表現形式名為L2-pooling,如下式所示。P(x)=g?(x?x)P(x)=\sqrt{g*(x*x)}P(x)=g?(x?x)?g是一個Hanning window,具體表現為數值,大家可以參考后續的代碼講解,是一個較為低頻的濾波器。
  2. 集合必須是單射(Injection):單射的意思就是不同的輸入應該映射到不同的輸出,一個對一個,不能一個特征的輸出,對應著多個輸入。例子就是當IQA指標最高時,對應的最佳輸入不是參考圖像,前面展示的一些方法(GTI-CNN等),就不滿足這個性質,那么優化后的結果就很可能跟原圖差距很大,損失大量結構信息或是紋理上的問題,這里LPIPS也是如此,沒有嚴格的滿足這個性質,所以在紋理上優化后也是存在一定的問題。作者對于DISTS的設計上為了滿足這個性質,引入一個輸入x,相當于預處理變換中引入一個identity變換,這樣就能保證滿足這個性質。即提取的預處理特征集合是:
    f(x)={xj(i);i=0,…,m;j=1,…,nif(x)=\{x_j^{(i)}; i = 0,\ldots,m; j = 1,\ldots,n_if(x)={xj(i)?;i=0,,m;j=1,,ni? f(y)={y~j(i);i=0,…,m;j=1,…,nif(y)=\{\tilde{y}_j^{(i)}; i = 0,\ldots,m; j = 1,\ldots,n_if(y)={y~?j(i)?;i=0,,m;j=1,,ni?
    此兩個分別代表輸入和參考圖像的預處理特征集合,是用VGG16提取的多個層的結果,對應conv1_2,conv2_2, conv3_3, conv4_3, and conv5_3,這里m=5,對應的x0和y0是identity變換。

2.2 紋理表示和結構表示

  • 首先是紋理的部分,這里作者引用了很多研究,結論是一個僅包含CNN通道均值和方差的簡化統計集合足以用于紋理分類或風格轉移任務,因此作者使用了一個簡單的集合來表示紋理,只包含特征映射的空間均值(總共1475個統計數據),為視覺紋理提供了一個有效的參數化模型,如下式所示。
    l(x~j(i),y~j(i))=2μx~j(i)μy~j(i)+c1(μx~j(i))2+(μy~j(i))2+c2l(\tilde{x}_j^{(i)}, \tilde{y}_j^{(i)}) = \frac{2\mu_{\tilde{x}_j}^{(i)}\mu_{\tilde{y}_j}^{(i)} + c_1}{(\mu_{\tilde{x}_j}^{(i)})^2 + (\mu_{\tilde{y}_j}^{(i)})^2 + c_2}l(x~j(i)?,y~?j(i)?)=(μx~j?(i)?)2+(μy~?j?(i)?)2+c2?2μx~j?(i)?μy~?j?(i)?+c1??
    這里的μ\muμ就是我們一直講到的均值,ccc是一個防除零的值。
    作者為了驗證這個模型的可行性,用以下的公式來優化了以該特征的隨機噪聲輸入。
    y?=argmin?yD(x,y)=argmin?y∑i,j(μx~j(i)?μy~j(i))2y^\star = \underset{y}{\mathrm{arg}\min} D(x, y) = \underset{y}{\mathrm{arg}\min} \sum_{i, j} (\mu_{\tilde{x}_j}^{(i)} - \mu_{\tilde{y}_j}^{(i)})^2y?=yargmin?D(x,y)=yargmin?i,j?(μx~j?(i)??μy~?j?(i)?)2

可視化的優化結果表明該模型是有意義的,如下圖所示。
在這里插入圖片描述
(b)和(f)是用了多層((b)指只用到最淺層的VGG,( c)指只用到第二層VGG),只不過層數逐漸增大,(g)-(k)是只使用了VGG的某一層,可以看到多層的效果要明顯優于單層的,(f)的效果與原圖(a)很相像了,也是DISTS指標使用到的,通過看單層的效果可以發現,淺層的均值更多與圖像基本的強度和顏色相關,深層的與形狀和結構更加相關。作者還對比了其他紋理提取方法的效果:
在這里插入圖片描述
這里(a)是原圖,(b)圖是一個不熟悉的方法,(c)是圖像復原領域中感知損失中關于風格損失的部分,使用gram矩陣統計的紋理相關性,(d)是本文的方法,可以看到本文的方法得到的效果和gram_matrix的效果不相上下,但本文使用到的特征數相比gram_matrix是大大減小的,不會有太多的冗余。

  • 結構的部分:使用了一個特征的相關系數,觀察公式可以發現跟SSIM關于結構特征的定義是一樣的,這里不同之處在于作者使用的global,全局的,因此可以理解為SSIM中窗口的尺寸跟特征圖尺寸一樣。
    s(x~j(i),y~j(i))=2σx~jy~j(i)+c2(σx~j(i))2+(σy~j(i))2+c2s(\tilde{x}_j^{(i)}, \tilde{y}_j^{(i)}) = \frac{2\sigma_{\tilde{x}_j\tilde{y}_j}^{(i)} + c_2}{(\sigma_{\tilde{x}_j}^{(i)})^2 + (\sigma_{\tilde{y}_j}^{(i)})^2 + c_2}s(x~j(i)?,y~?j(i)?)=(σx~j?(i)?)2+(σy~?j?(i)?)2+c2?2σx~j?y~?j?(i)?+c2??
    這個沒什么特別需要描述的,比較重要的點就是SSIM是分窗口計算,最后做平均,這里就是全局窗口,計算完一次就結束。

2.3 DISTS指標

DISTS指標的總覽如下:l(x~j(i),y~j(i))=2μx~j(i)μy~j(i)+c1(μx~j(i))2+(μy~j(i))2+c1l(\tilde{x}_j^{(i)}, \tilde{y}_j^{(i)}) = \frac{2\mu_{\tilde{x}_j}^{(i)}\mu_{\tilde{y}_j}^{(i)} + c_1}{(\mu_{\tilde{x}_j}^{(i)})^2 + (\mu_{\tilde{y}_j}^{(i)})^2 + c_1}l(x~j(i)?,y~?j(i)?)=(μx~j?(i)?)2+(μy~?j?(i)?)2+c1?2μx~j?(i)?μy~?j?(i)?+c1?? s(x~j(i),y~j(i))=2σx~jy~j(i)+c2(σx~j(i))2+(σy~j(i))2+c2,s(\tilde{x}_j^{(i)}, \tilde{y}_j^{(i)}) = \frac{2\sigma_{\tilde{x}_j\tilde{y}_j}^{(i)} + c_2}{(\sigma_{\tilde{x}_j}^{(i)})^2 + (\sigma_{\tilde{y}_j}^{(i)})^2 + c_2},s(x~j(i)?,y~?j(i)?)=(σx~j?(i)?)2+(σy~?j?(i)?)2+c2?2σx~j?y~?j?(i)?+c2??, D(x,y;α,β)=1?∑i=0m∑j=1ni(αijl(x~j(i),y~j(i))+βijs(x~j(i),y~j(i)))D(x, y; \alpha, \beta) = 1 - \sum_{i = 0}^{m} \sum_{j = 1}^{n_i} \left( \alpha_{ij} l(\tilde{x}_j^{(i)}, \tilde{y}_j^{(i)}) + \beta_{ij} s(\tilde{x}_j^{(i)}, \tilde{y}_j^{(i)}) \right)D(x,y;α,β)=1?i=0m?j=1ni??(αij?l(x~j(i)?,y~?j(i)?)+βij?s(x~j(i)?,y~?j(i)?))
對紋理和結構的對比結果進行一個α\alphaαβ\betaβ的加權求和,最后進行一個減法,即相似度越高,值越小。
作者這里還講了下這個指標滿足的一些數學性質:非負性、對稱性、三角不等式、唯一最小值,論文中有證明,感興趣的讀者可以看一下。

2.4 優化DISTS指標

自然,因為DISTS指標已經定義完畢,我們首先可以針對數據集進行一個L1的距離的優化。
E1(x,y;α,β)=∣D(x,y;α,β)?q(y)∣E_1(x, y; \alpha, \beta) = \left| D(x, y; \alpha, \beta) - q(y) \right|E1?(x,y;α,β)=D(x,y;α,β)?q(y)
這里的q(y)q(y)q(y)是數據的分數標記。
為了使得容忍紋理resample更有效,作者還加入了一個正則項,顯式的強制模型以數據驅動的方式來解決這個問題,最小化從同一紋理區域z中采樣的兩個patch(z1、z2)之間的距離。
E2(z;α,β)=D(z1,z2;α,β)E_2(z; \alpha, \beta) = D(z_1, z_2; \alpha, \beta)E2?(z;α,β)=D(z1?,z2?;α,β)
那么總的優化函數就可以寫作:
E(Q,T;α,β)=1∣Q∣∑x,y∈QE1(x,y;α,β)+λ1∣T∣∑z∈TE2(z;α,β)E(\mathcal{Q}, \mathcal{T}; \alpha, \beta) = \frac{1}{|\mathcal{Q}|} \sum_{x, y \in \mathcal{Q}} E_1(x, y; \alpha, \beta) + \lambda \frac{1}{|\mathcal{T}|} \sum_{z \in \mathcal{T}} E_2(z; \alpha, \beta)E(Q,T;α,β)=Q1?x,yQ?E1?(x,y;α,β)+λT1?zT?E2?(z;α,β)
這里是從兩個不同數據集上采樣的mini-batch,分別優化我們前面講到的內容,有分數的數據集優化E1E_1E1?損失,紋理一致的數據集提供正則項E2E_2E2?損失。
后續作者對比了其他的IQA方法,大概講了下聯系和區別,這個地方內容比較多,博主也不能完全講明白,僅作一個拋磚引玉:

  1. SSIM和SSIM變種:都存在一個多尺度的操作,并且也可以調整多尺度給到最后結果的比例,SSIM也有能夠解決輕微幾何變換的能力,DISTS通過優化紋理不變性,這部分是相同的,但是前面也講到SSIM是窗口的,DISTS是全局的,這個是比較大的一個區別。
  2. 自適應線性系統框架:這里是指一些將圖像分離結構和非結構的方法,包含很多IQA模型,比如說MSE和空間頻率加權的方法,方法上細節上肯定是存在一些不同。
  3. 圖像內容和風格分離的方法:這個指的是常見的感知損失,圖像內容的定義感知損失用的是特征之間的差值,風格的損失使用的是gram_matrix,計算的特征的相關性,作者認為這兩個分量都存在大量冗余且不滿足前面提到的變換唯一最小值的一個約束。
  4. 其他圖像復原的損失:計算的pixel_loss,或者說跟感知損失的一個組合損失形式(開發中時常會使用到的情況,多個損失的組合),作者認為這種組合雖然說可以讓模型復原的圖像盡可能生成一些感知上有意義的結果,但沒有達到作者想要的紋理不變性的水平。

三、實驗結果

本篇文章的實驗非常詳細。

  • 最基本的功能,分數預測。
    在這里插入圖片描述
    針對數據集進行一個分數的擬合,在主觀平均意見分數(MoSs)的散點圖上,DISTS基本上是線性的,存在明顯優勢。
    定量的實驗上的表現:
    在這里插入圖片描述
    在前面提到的LPIPS的數據集上進行了對比,效果也是在前列的,當然在分數預測上跟LPIPS沒有明顯優勢。

  • 紋理相似性:優勢明顯,對比其他方法。
    在這里插入圖片描述
    紋理的失真量化,可以做排序的應用。
    在這里插入圖片描述
    從(a)到(p)是質量逐漸遞減的,(a)是原圖。
    紋理的分類和檢索:紋理分類是將未知樣本圖像分類到已知紋理類的一種,紋理檢索是在大型數據庫上進行一個搜索,找到相似的圖像。結果也是比較好的。
    在這里插入圖片描述

  • 幾何的形變:除了紋理上的相似度外,當原始圖像跟退化圖像存在全局或局部的錯配時,大多數的全參考IQA方法會嚴重受損,根本原因他們需要像素對齊,當然配準可以解決這個問題,但是會帶來更多的計算負擔,且無法適應嚴重失真,本文提出的方法可以解決這個問題。
    定量的實驗,有明顯優勢。
    在這里插入圖片描述
    定性的實驗表現如下:
    在這里插入圖片描述
    其中(a)時原圖,(b)做了translate平移,(c)做了dilate擴展,(d)做了旋轉,(e)做了云層的移動,(f)做了高斯噪聲,(g)高斯模糊,(h)jpeg壓縮,(i)jpeg2000壓縮,可以明顯看到DISTS對幾何形變更魯棒,這跟人類的感知會更相像。

  • 消融實驗:作者做了以下的實驗:
    (a):原始LPIPS;(b):(a)基礎上替換L2 pooling;(c):添加indentity,輸入圖像;(d):在(c)之上將LPIPS中的L2距離替換為局部的SSIM計算,窗口為11x11;(e):在(c)之上將LPIPS中的L2距離替換為全局的SSIM計算;(f):在(c)的基礎上加上紋理不變性的正則;(g):在(d)的基礎上加入紋理不變的正則;(h):在(e)的基礎上添加紋理不變的正則。
    實驗結果如下:
    在這里插入圖片描述
    從中可以得到幾個結論:

  • L2 pooling優于maxpool。

  • 將輸入圖像加入到其中對性能影響不大,但它保證了最小值唯一的情況,有利于感知優化。

  • 全局的SSIM距離由于歐式距離,特別是比較紋理相似性和幾何變換的不變性上。滑動窗口11x11一樣是存在這個問題,效果會下降。

  • 紋理不變正則項的訓練,對于幾何變換的不變性以及紋理的不變性有很大作用,盡管它會略微損失一部分對于分數評估的性能。

以上可以說明作者的DISTS中各個改進都是有益的。

四、總結

DISTS針對紋理和結構的全參考感知評估提供了一個新的方法,并且它還能對紋理resample和幾何形變有一定容忍,更加靠近人類圖像質量感知。不過還存在一些問題是:

  • 預處理網絡的特征提取部分還是一個黑盒子,對于提取的那些紋理和屬性是未知的。
  • 級聯卷積和采樣得到的多尺度特征對于最終結果的重要程度,如果我們可以量化它們,就可以針對性的定義距離,自適應的去使用,而不是現在這種固定的情況。

代碼部分將會單起一篇進行解讀。(未完待續)


感謝閱讀,歡迎留言或私信,一起探討和交流,如果對你有幫助的話,也希望可以給博主點一個關注,謝謝。

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

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

相關文章

windows下Docker安裝路徑、存儲路徑修改

一、命令行指定安裝路徑? ??下載安裝包??:從Docker官網獲取安裝程序(如Docker Desktop Installer.exe)。??運行PowerShell??: & "H:\Docker Desktop Installer.exe" install --installation-dir"F:…

thingsboard 自定義動作JS編程

在 ThingsBoard 中實現 自定義動作(Custom Action)的 JavaScript 編程,主要通過“Custom action (with HTML template)”方式完成,適用于創建彈窗、編輯實體、控制設備等交互行為。 實現步驟(以添加設備或資…

Spring Boot 簡單接口角色授權檢查實現

一、背景與目標在Spring Boot應用開發中,接口級別的權限控制是系統安全的重要組成部分。本文將介紹一種簡單直接的接口角色授權檢查實現方案,適合快速開發和安全合規檢查場景。二、技術方案概述本方案采用自定義注解攔截器的方式實現,具有以下…

PytorchLightning最佳實踐日志篇

在 PyTorch Lightning(PL)中,日志系統是 “煉丹” 過程中復現實驗、對比效果、排查問題的核心工具。結合實際工程經驗,總結以下最佳實踐和技巧,幫助提升實驗效率: 一、日志工具的選擇與配置 PL 通過統一的s…

基于JavaWeb的兼職發布平臺的設計與實現

開發語言:Java框架:springbootJDK版本:JDK1.8服務器:tomcat7數據庫:mysql 5.7數據庫工具:Navicat12開發軟件:eclipse/myeclipse/ideaMaven包:Maven3.6系統展示系統首頁用戶登錄招聘信…

Linux學習--C語言(指針3)

1.指針函數和函數指針1.1 指針函數指針函數是函數&#xff0c;函數的返回值是指針不能返回局部變量的地址指針函數返回的地址可以作為下一個函數調用的參數1.2 函數指針函數指針是指針&#xff0c;指針指向一個函數#include <stdio.h>int Add(int x, int y) {return x y…

【JAVA EE初階】多線程(上)

目錄 1.預備知識 1.1 馮諾依曼體系結構&#xff1a; 1.2 現代CPU主要關心指標&#xff08;和日常開發密切相關的&#xff09; 1.3 計算機中&#xff0c;一個漢字占幾個字節&#xff1f; 1.4 Windows和Linux的區別 1.5 PCB的一些關鍵要點 2.線程和進程 2.1 創建線程的寫法…

用互聯網思維擴展電商后臺的 CRUD 功能

一、自定義實現MyBatis-Plus逆向工程 多數據源的問題解決了&#xff0c;接下來開始進行實際開發時&#xff0c;你會發現&#xff0c;最麻煩的一件事情就是要創建與數據庫表對應的POJO了。這些沒什么難度&#xff0c;但是繁瑣的內容會占據大量的開發時間。比如一個PmsProducr對…

無代碼測試平臺ATECLOUD全場景測試方案

ATECLOUD 智能云測試平臺是有納米軟件開發的一款以無代碼架構與彈性擴展體系為核心的自動化測試平臺&#xff0c;通過數據模型驅動的創新設計&#xff0c;為研發、產線等多場景提供高效可控的測試解決方案。?無代碼架構 ATECLOUD 打破傳統技術壁壘&#xff0c;構建完全可視化的…

當 AI 重構審計流程,CISA 認證為何成為破局關鍵

在南京審計大學最新發布的《面向審計行業 DeepSeek 大模型操作指南》中&#xff0c;一組數據引發行業深思&#xff1a;通過自動化數據處理、智能風險識別和定制化報告生成&#xff0c;AI 大模型能幫助審計人員降低 40% 以上的人工成本&#xff0c;同時將風險識別準確率提升至 9…

NAT技術、代理服務器

NAT/NAPT技術NAT的全稱是network address translation&#xff0c;網絡地址轉換。NAT 能在對外通信時夠將源 IP 轉為新源 IP&#xff0c;對內通信時將目的ip轉換成新目的ip&#xff0c;實現這個操作&#xff0c;靠的是地址轉換表但NAT的說法其實是不準確的&#xff0c;因為多個…

【硬件-筆試面試題】硬件/電子工程師,筆試面試題-45,(知識點:負反饋的作用,基礎理解,干擾和噪聲的抑制)

目錄 1、題目 2、解答 步驟一&#xff1a;明確負反饋的作用原理 步驟二&#xff1a;逐一分析選項 3、相關知識點 一、負反饋的基本原理 二、負反饋對干擾和噪聲的抑制機制 三、選項分析與答案 四、擴展思考&#xff1a;如何抑制不同位置的干擾&#xff1f; 總結 題目…

Flutter藍牙BLE開發完全指南(內含高級功能擴展)

Flutter藍牙BLE開發完全指南 我將為您提供一個完整的Flutter藍牙BLE實現方案,包含UI設計、權限處理、設備掃描、連接通信等完整功能。 完整實現方案 1. 添加依賴與權限配置 pubspec.yaml dependencies:flutter:sdk: flutterflutter_blue_plus: ^1.10.0permission_handler…

使用 Canvas 替代 <video> 標簽加載并渲染視頻

在部分瀏覽器環境或業務場景下&#xff0c;直接使用 <video> 標簽加載視頻會出現首幀延遲的情況。以下方法通過 WebGPU Canvas 2D 將視頻幀繪制到自定義 Canvas 上&#xff0c;讓 <video> 只做解碼&#xff0c;WebGPU 接管渲染&#xff0c;通過最小化對象創建 精…

基于Flask的智能停車場管理系統開發實踐

在現代城市中&#xff0c;停車難已成為一個普遍問題。為了解決這一問題&#xff0c;我開發了一個基于Python Flask框架的智能停車場管理系統。該系統集成了車牌識別、車位狀態監控、收費管理等多項功能&#xff0c;為停車場的智能化管理提供了完整的解決方案。系統功能概述該停…

【C#獲取高精度時間】

在C#中&#xff0c;有幾種方法可以獲取高精度時間&#xff08;高分辨率時間戳&#xff09;&#xff0c;適用于性能測量、計時等需要高精度的場景。以下是幾種常用方法&#xff1a; 1. 使用 Stopwatch 類&#xff08;推薦&#xff09; Stopwatch 類提供了最高精度的時間測量&…

Spring Boot + React 打造現代化高校成績管理系統實戰記錄

作者: 笙囧同學 發布時間: 2025年7月 技術棧: Spring Boot 3.2.3 React 18 TypeScript 華為云GaussDB 項目類型: 全棧Web應用 開發周期: 30天 代碼量: 15000 行 &#x1f4d6; 前言 大家好&#xff0c;我是笙囧同學&#xff01;&#x1f64b;?♂? 作為一名計算機科學與技…

形參表不匹配(BUG)

在您的代碼中&#xff0c;存在兩個主要問題導致"形參表中不匹配"的錯誤&#xff1a;erase() 函數中的成員變量名錯誤iterator erase(iterator pos) {// ...size--; // ? 錯誤&#xff1a;成員變量名為 _size 而非 sizereturn iterator(next); }修正&#xff1a;ite…

Spring循環依賴以及三個級別緩存

Spring循環依賴以及三個級別緩存 什么是循環依賴&#xff1f; 循環依賴&#xff0c;顧名思義&#xff0c;就是指兩個或多個 Spring Bean 之間相互依賴&#xff0c;形成一個閉環。 最常見也是 Spring 能夠“解決”的循環依賴是構造器注入 和 setter 注入 混合或單獨使用時&…

《零基礎入門AI:OpenCV圖像預處理進一步學習》

本文全面講解OpenCV圖像預處理的七大核心技術&#xff08;插值方法、邊緣填充、圖像矯正&#xff08;透視變換&#xff09;、圖像掩膜、ROI切割、圖像添加水印、圖像噪點消除&#xff09;&#xff0c;每個知識點都配有詳細解釋和實用代碼示例&#xff0c;幫助初學者建立系統的圖…