YOLOv10改進 | 損失函數篇 | InnerIoU、InnerSIoU、InnerWIoU、FocusIoU等損失函數

一、本文介紹

本文給大家帶來的是YOLOv10最新改進,為大家帶來最近新提出的InnerIoU的內容同時用Inner的思想結合SIoU、WIoU、GIoU、DIoU、EIOU、CIoU等損失函數,形成?InnerIoU、InnerSIoU、InnerWIoU、等新版本損失函數,同時還結合了Focus和AIpha思想形成的新的損失函數,其中Inner的主要思想是:引入了不同尺度的輔助邊界框來計算損失,(該方法在處理非常小目標的檢測任務時表現出良好的性能(但是在其它的尺度檢測時也要比普通的損失要好)文章會詳細探討這些損失函數如何提高YOLOv10在各種檢測任務中的性能,包括提升精度、加快收斂速度和增強模型對復雜場景的適應性。

?專欄回顧:YOLOv10改進系列專欄——本專欄持續復習各種頂會內容——科研必備?

目錄

一、本文介紹

二、各種損失函數的基本原理?

2.1 交集面積和并集面積

2.2 InnerIoU的思想?

2.2.1結合InnerIoU各種損失函數的效果圖?

2.3 InnerSIoU

2.4 InnerWioU

2.5 InnerGIoU

2.6 InnerDIoU

2.7 InnerEIoU

2.8 InnerCIoU

2.9 FocusLoss?

三、InnerIoU等損失函數代碼塊

3.1 代碼一

四、添加InnerIoU等損失函數到模型中

4.1 步驟一?

4.2 步驟二

4.3 步驟三?

4.4 什么時候使用損失函數改進

五、本文總結


二、各種損失函數的基本原理?

論文地址:官方Inner-IoU論文地址點擊即可跳轉

官方代碼地址官方代碼地址-官方只放出了兩種結合方式CIoU、SIoU

本文改進地址: 文末提供完整代碼塊-包括InnerEIoU、InnerCIoU、InnerDIoU等七種結合方式和其Focus變種


2.1 交集面積和并集面積

在理解各種損失函數之前我們需要先來理解一下交集面積和并集面積,在數學中我們都學習過集合的概念,這里的交集和并集的概念和數學集合中的含義是一樣的。


2.2 InnerIoU的思想?

Inner-IoU(內部交并比)的主要思想是:改進目標檢測中邊界框回歸(BBR)的準確性,特別是在處理高度重疊的目標時。傳統的IoU(交并比)計算方法考慮了預測邊界框和真實邊界框的整體重疊區域,而Inner-IoU則專注于邊界框內部的重疊部分。它通過引入輔助邊界框,這些輔助框是原始邊界框的縮小版本,來計算損失函數。

這種方法的優點包括:

  1. 針對性優化:Inner-IoU通過關注邊界框的核心部分而非整體,提供了對重疊區域更加精確的評估。
  2. 調整尺度:通過控制輔助邊界框的大小,Inner-IoU允許對不同的數據集和檢測任務進行微調。
  3. 提高泛化能力:實驗證明,Inner-IoU在不同的數據集上顯示出比傳統IoU更好的泛化性能。
  4. 處理高低IoU樣本:對于高IoU樣本,使用較小的輔助框可以加速模型學習;而對于低IoU樣本,使用較大的輔助框可以改善回歸性能。

總結:Inner-IoU是一種更細致、更專注于目標中心的性能評估指標,它通過輔助框的尺度調整提高了目標檢測任務的精確度和效率。

2.2.1結合InnerIoU各種損失函數的效果圖?

上面的圖片展示了CIoU 和 Inner-CIoU 方法。圖中從左至右分別表示 CIoU 方法,以及不同比例(0.7、0.75 和 0.8)的 Inner-CIoU 方法的檢測結果?

這個圖片可以看出這個Innner的思想在小目標檢測的時候效果能夠達到極致(最適用于小范圍但是其它的情況也能夠有效但是小目標是效果最好的情景)?

PS:下面介紹的是融合的各種思想就是將其中的IoU替換為我們上面求出來的InnerIoU即可和其中的參數也替換為InnerIoU的思想,其中各種損失函數的本身思想并沒有改變,只是改變了其中的 參數。


2.3 InnerSIoU

論文地址:SIoU: More Powerful Learning for Bounding Box Regression

適用場景:適用于需要高精度邊界框對齊的場景,如精細的物體檢測和小目標檢測。

概念:SIoU損失通過融入角度考慮和規模敏感性,引入了一種更為復雜的邊界框回歸方法,解決了以往損失函數的局限性,SIoU損失函數包含四個組成部分:角度損失、距離損失、形狀損失和第四個未指定的組成部分。通過整合這些方面,從而實現更好的訓練速度和預測準確性。


2.4 InnerWioU

論文地址:WIoU: Bounding Box Regression Loss with Dynamic Focusing Mechanism

適用場景:適用于需要動態調整損失焦點的情況,如不均勻分布的目標或不同尺度的目標檢測。

概念:引入動態聚焦機制的IoU變體,旨在改善邊界框回歸損失。


2.5 InnerGIoU

論文地址:GIoU: A Metric and A Loss for Bounding Box Regression

適用場景:適合處理有重疊和非重疊區域的復雜場景,如擁擠場景的目標檢測。

概念:在IoU的基礎上考慮非重疊區域,以更全面評估邊界框


2.6 InnerDIoU

論文地址:DIoU: Faster and Better Learning for Bounding Box Regression

適用場景:適用于需要快速收斂和精確定位的任務,特別是在邊界框定位精度至關重要的場景。

概念:結合邊界框中心點之間的距離和重疊區域。


2.7 InnerEIoU

論文地址:EIoU:Loss for Accurate Bounding Box Regression

適用場景:可用于需要進一步優化邊界框對齊和形狀相似性的高級場景。

概念:EIoU損失函數的核心思想在于提高邊界框回歸的準確性和效率。它通過以下幾個方面來優化目標檢測:

1. 增加中心點距離損失:通過最小化預測框和真實框中心點之間的距離,提高邊界框的定位準確性。

2. 考慮尺寸差異:通過懲罰寬度和高度的差異,EIoU確保預測框在形狀上更接近真實框。

3. 結合最小封閉框尺寸:將損失函數與包含預測框和真實框的最小封閉框的尺寸相結合,從而使得損失更加敏感于對象的尺寸和位置。

EIoU損失函數在傳統IoU基礎上增加了這些考量,以期在各種尺度上都能獲得更精確的目標定位,尤其是在物體大小和形狀變化較大的場景中。


2.8 InnerCIoU

論文地址:CIoU:Enhancing Geometric Factors in Model Learning

適用場景:適合需要綜合考慮重疊區域、形狀和中心點位置的場景,如復雜背景或多目標跟蹤。

概念:綜合考慮重疊區域、中心點距離和長寬比。


2.9 FocusLoss?

論文地址:Focal Loss for Dense Object Detection

適用場景:適用于需要高精度邊界框對齊的場景,如精細的物體檢測和小目標檢測。?

Focal Loss由Kaiming He等人在論文《Focal Loss for Dense Object Detection》中提出,旨在解決在訓練過程中正負樣本數量極度不平衡的問題,尤其是在一些目標檢測任務中,背景類別的樣本可能遠遠多于前景類別的樣本。

Focal Loss通過修改交叉熵損失,增加一個調整因子這個因子降低了那些已經被正確分類的樣本的損失值,使得模型的訓練焦點更多地放在難以分類的樣本上。這種方式特別有利于提升小目標或者在復雜背景中容易被忽視的目標的檢測性能。簡而言之,Focal Loss讓模型“關注”(或“專注”)于學習那些對提高整體性能更為關鍵的樣本。


三、InnerIoU等損失函數代碼塊

3.1 代碼一

此代碼塊塊的基礎版本來源于Github的開源版本,我在其基礎上將Inner的思想加入其中形成了各種Inner的思想同時融合各種改良版本的損失函數形成對應版本的InnerIoU、InnerCIoU等損失函數。

import numpy as np
import torch
import math
from ultralytics.utils import opsclass WIoU_Scale:''' monotonous: {None: origin v1True: monotonic FM v2False: non-monotonic FM v3}momentum: The momentum of running mean'''iou_mean = 1.monotonous = False_momentum = 1 - 0.5 ** (1 / 7000)_is_train = Truedef __init__(self, iou):self.iou = iouself._update(self)@classmethoddef _update(cls, self):if cls._is_train: cls.iou_mean = (1 - cls._momentum) * cls.iou_mean + \cls._momentum * self.iou.detach().mean().item()@classmethoddef _scaled_loss(cls, self, gamma=1.9, delta=3):if isinstance(self.monotonous, bool):if self.monotonous:return (self.iou.detach() / self.iou_mean).sqrt()else:beta = self.iou.detach() / self.iou_meanalpha = delta * torch.pow(gamma, beta - delta)return beta / alphareturn 1def bbox_iou(box1, box2, xywh=True, GIoU=False, DIoU=False, CIoU=False, EIoU=False, SIoU=False, WIoU=False, ShapeIoU=False,hw=1, mpdiou=False, Inner=False, alpha=1, ratio=0.7, eps=1e-7, scale=0.0):"""Calculate Intersection over Union (IoU) of box1(1, 4) to box2(n, 4).Args:box1 (torch.Tensor): A tensor representing a single bounding box with shape (1, 4).box2 (torch.Tensor): A tensor representing n bounding boxes with shape (n, 4).xywh (bool, optional): If True, input boxes are in (x, y, w, h) format. If False, input boxes are in(x1, y1, x2, y2) format. Defaults to True.GIoU (bool, optional): If True, calculate Generalized IoU. Defaults to False.DIoU (bool, optional): If True, calculate Distance IoU. Defaults to False.CIoU (bool, optional): If True, calculate Complete IoU. Defaults to False.EIoU (bool, optional): If True, calculate Efficient IoU. Defaults to False.SIoU (bool, optional): If True, calculate Scylla IoU. Defaults to False.eps (float, optional): A small value to avoid division by zero. Defaults to 1e-7.Returns:(torch.Tensor): IoU, GIoU, DIoU, or CIoU values depending on the specified flags."""if Inner:if not xywh:box1, box2 = ops.xyxy2xywh(box1), ops.xyxy2xywh(box2)(x1, y1, w1, h1), (x2, y2, w2, h2) = box1.chunk(4, -1), box2.chunk(4, -1)b1_x1, b1_x2, b1_y1, b1_y2 = x1 - (w1 * ratio) / 2, x1 + (w1 * ratio) / 2, y1 - (h1 * ratio) / 2, y1 + (h1 * ratio) / 2b2_x1, b2_x2, b2_y1, b2_y2 = x2 - (w2 * ratio) / 2, x2 + (w2 * ratio) / 2, y2 - (h2 * ratio) / 2, y2 + (h2 * ratio) / 2# Intersection areainter = (b1_x2.minimum(b2_x2) - b1_x1.maximum(b2_x1)).clamp_(0) * \(b1_y2.minimum(b2_y2) - b1_y1.maximum(b2_y1)).clamp_(0)# Union Areaunion = w1 * h1 * ratio * ratio + w2 * h2 * ratio * ratio - inter + epsiou = inter / union# Get the coordinates of bounding boxeselse:if xywh:  # transform from xywh to xyxy(x1, y1, w1, h1), (x2, y2, w2, h2) = box1.chunk(4, -1), box2.chunk(4, -1)w1_, h1_, w2_, h2_ = w1 / 2, h1 / 2, w2 / 2, h2 / 2b1_x1, b1_x2, b1_y1, b1_y2 = x1 - w1_, x1 + w1_, y1 - h1_, y1 + h1_b2_x1, b2_x2, b2_y1, b2_y2 = x2 - w2_, x2 + w2_, y2 - h2_, y2 + h2_else:  # x1, y1, x2, y2 = box1b1_x1, b1_y1, b1_x2, b1_y2 = box1.chunk(4, -1)b2_x1, b2_y1, b2_x2, b2_y2 = box2.chunk(4, -1)w1, h1 = b1_x2 - b1_x1, b1_y2 - b1_y1 + epsw2, h2 = b2_x2 - b2_x1, b2_y2 - b2_y1 + eps# Intersection areainter = (b1_x2.minimum(b2_x2) - b1_x1.maximum(b2_x1)).clamp_(0) * \(b1_y2.minimum(b2_y2) - b1_y1.maximum(b2_y1)).clamp_(0)# Union Areaunion = w1 * h1 + w2 * h2 - inter + eps# IoUiou = inter / unionif CIoU or DIoU or GIoU or EIoU or SIoU or ShapeIoU or mpdiou or WIoU:cw = b1_x2.maximum(b2_x2) - b1_x1.minimum(b2_x1)  # convex (smallest enclosing box) widthch = b1_y2.maximum(b2_y2) - b1_y1.minimum(b2_y1)  # convex heightif CIoU or DIoU or EIoU or SIoU or mpdiou or WIoU or ShapeIoU:  # Distance or Complete IoU https://arxiv.org/abs/1911.08287v1c2 = cw ** 2 + ch ** 2 + eps  # convex diagonal squaredrho2 = ((b2_x1 + b2_x2 - b1_x1 - b1_x2) ** 2 + (b2_y1 + b2_y2 - b1_y1 - b1_y2) ** 2) / 4  # center dist ** 2if CIoU:  # https://github.com/Zzh-tju/DIoU-SSD-pytorch/blob/master/utils/box/box_utils.py#L47v = (4 / math.pi ** 2) * (torch.atan(w2 / h2) - torch.atan(w1 / h1)).pow(2)with torch.no_grad():alpha = v / (v - iou + (1 + eps))return iou - (rho2 / c2 + v * alpha)  # CIoUelif EIoU:rho_w2 = ((b2_x2 - b2_x1) - (b1_x2 - b1_x1)) ** 2rho_h2 = ((b2_y2 - b2_y1) - (b1_y2 - b1_y1)) ** 2cw2 = cw ** 2 + epsch2 = ch ** 2 + epsreturn iou - (rho2 / c2 + rho_w2 / cw2 + rho_h2 / ch2) # EIoUelif SIoU:# SIoU Loss https://arxiv.org/pdf/2205.12740.pdfs_cw = (b2_x1 + b2_x2 - b1_x1 - b1_x2) * 0.5 + epss_ch = (b2_y1 + b2_y2 - b1_y1 - b1_y2) * 0.5 + epssigma = torch.pow(s_cw ** 2 + s_ch ** 2, 0.5)sin_alpha_1 = torch.abs(s_cw) / sigmasin_alpha_2 = torch.abs(s_ch) / sigmathreshold = pow(2, 0.5) / 2sin_alpha = torch.where(sin_alpha_1 > threshold, sin_alpha_2, sin_alpha_1)angle_cost = torch.cos(torch.arcsin(sin_alpha) * 2 - math.pi / 2)rho_x = (s_cw / cw) ** 2rho_y = (s_ch / ch) ** 2gamma = angle_cost - 2distance_cost = 2 - torch.exp(gamma * rho_x) - torch.exp(gamma * rho_y)omiga_w = torch.abs(w1 - w2) / torch.max(w1, w2)omiga_h = torch.abs(h1 - h2) / torch.max(h1, h2)shape_cost = torch.pow(1 - torch.exp(-1 * omiga_w), 4) + torch.pow(1 - torch.exp(-1 * omiga_h), 4)return iou - 0.5 * (distance_cost + shape_cost) + eps # SIoUelif ShapeIoU:#Shape-Distance    #Shape-Distance    #Shape-Distance    #Shape-Distance    #Shape-Distance    #Shape-Distance    #Shape-Distanceww = 2 * torch.pow(w2, scale) / (torch.pow(w2, scale) + torch.pow(h2, scale))hh = 2 * torch.pow(h2, scale) / (torch.pow(w2, scale) + torch.pow(h2, scale))cw = torch.max(b1_x2, b2_x2) - torch.min(b1_x1, b2_x1)  # convex widthch = torch.max(b1_y2, b2_y2) - torch.min(b1_y1, b2_y1)  # convex heightc2 = cw ** 2 + ch ** 2 + eps                            # convex diagonal squaredcenter_distance_x = ((b2_x1 + b2_x2 - b1_x1 - b1_x2) ** 2) / 4center_distance_y = ((b2_y1 + b2_y2 - b1_y1 - b1_y2) ** 2) / 4center_distance = hh * center_distance_x + ww * center_distance_ydistance = center_distance / c2#Shape-Shape    #Shape-Shape    #Shape-Shape    #Shape-Shape    #Shape-Shape    #Shape-Shape    #Shape-Shape    #Shape-Shapeomiga_w = hh * torch.abs(w1 - w2) / torch.max(w1, w2)omiga_h = ww * torch.abs(h1 - h2) / torch.max(h1, h2)shape_cost = torch.pow(1 - torch.exp(-1 * omiga_w), 4) + torch.pow(1 - torch.exp(-1 * omiga_h), 4)return iou - distance - 0.5 * shape_costelif mpdiou:d1 = (b2_x1 - b1_x1) ** 2 + (b2_y1 - b1_y1) ** 2d2 = (b2_x2 - b1_x2) ** 2 + (b2_y2 - b1_y2) ** 2return iou - d1 / hw.unsqueeze(1) - d2 / hw.unsqueeze(1)  # MPDIoUelif WIoU:self = WIoU_Scale(1 - iou)dist = getattr(WIoU_Scale, '_scaled_loss')(self)return iou * dist  # WIoU https://arxiv.org/abs/2301.10051return iou - rho2 / c2  # DIoUc_area = cw * ch + eps  # convex areareturn iou - (c_area - union) / c_area  # GIoU https://arxiv.org/pdf/1902.09630.pdfreturn iou  # IoU


四、添加InnerIoU等損失函數到模型中

4.1 步驟一?

上面的代碼我們首先找到'ultralytics/utils/metrics.py'文件,然后其中有一個完全同名字的方法,原始樣子如下,我們將我們的代碼完整替換掉這個代碼,記得是全部替換這個方法內的代碼。


4.2 步驟二

替換成功后,我們找到另一個文件'ultralytics/utils/loss.py'然后找到如下一行代碼原始樣子下面的圖片然后用我給的代碼替換掉其中的紅框內的一行即可。

        iou = bbox_iou(pred_bboxes[fg_mask], target_bboxes[fg_mask],xywh=False, GIoU=False, DIoU=False, CIoU=False, EIoU=False, SIoU=False,WIoU=False, ShapeIoU=False Inner=False,ratio=0.75, eps=1e-7, scale=0.0)

上面的代碼我來解釋一下,我把所有的能選用的參數都寫了出來,其中IoU很好理解了,對應的參數設置為True就是使用的對應的IoU包括本文的IoU,需要注意的是Inner這個參數,比如我Inner設置為True然后Shape_IoU也設置為True那么此時使用的就是Inner_Shape_IoU,其它的都是,其中ratio和eps是inner的參數大家可以自己嘗試我這里定義了兩個基本值。?

替換完后的樣子如下->

4.3 步驟三?

我們還需要修改一處,找到如下的文件''ultralytics/utils/tal.py''然后找到其中下面圖片的代碼,用我給的代碼替換紅框內的代碼。

        overlaps[mask_gt] = bbox_iou(gt_boxes, pd_boxes, xywh=False, GIoU=False, DIoU=False, CIoU=False,EIoU=False, SIoU=False, WIoU=True, ShapeIoU=False, Inner=False,ratio=0.7, eps=1e-7, scale=0.0).squeeze(-1).clamp_(0)

此處和loss.py里面的最好是使用同一個參數。


4.4 什么時候使用損失函數改進

在這里多說一下,就是損失函數的使用時間,當我們修改模型的時候,損失函數是作為一種保底的存在,就是說當其它模型結構都修改完成了,已經無法在提升精度了,此時就可以修改損失函數了,不要上來先修改損失函數,當然這是我個人的建議,具體還是由大家自己來選擇。

YOLOv10調用YOLOv8損失函數計算修改了YOLOv8的損失函數即代表修改了YOLOv10!?


五、本文總結

到此本文的正式分享內容就結束了,在這里給大家推薦我的YOLOv10改進有效漲點專欄,本專欄目前為新開的平均質量分98分,后期我會根據各種最新的前沿頂會進行論文復現,也會對一些老的改進機制進行補充,如果大家覺得本文幫助到你了,訂閱本專欄,關注后續更多的更新~

?專欄回顧:

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

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

相關文章

LeetCode42(接雨水)[三種解法:理解動態規劃,雙指針,單調棧]

接雨水 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之后能接多少雨水。 這是一道困難題,難度確實有點層次.我們先來樸素思想走一波. 要求能接多少雨水,我們可以具化到每個硅谷,每個硅谷能存多少雨水,那么答案就是每個…

PDA:Prompt-based Distribution Alignment for Unsupervised Domain Adaptation

文章匯總 式中, y s y^s ys表示源域數據的one-hot ground-truth, K K K為類數, w i w_i wi?和 z ~ s \tilde{z}_s z~s?分別表示源域經過提示調優的最終文本表示和最終圖像表示的第 i i i類。 同理,為了進一步利用目標領域的數據…

防火墻詳解(USG6000V)

0、防火墻組網模式 防火墻能夠工作在三種模式下分別是路由模式、透明模式、旁路檢測模式、混合模式 0.1、路由模式 路由模式:防火墻全部以第三層對外連接,即接口具有IP 地址。一般都用在防火墻是邊界的場景下 防火墻需要的部署/配置: 接…

【入門篇】STM32尋址范圍(更新中)

寫在前面 STM32的尋址范圍涉及存儲器映射和32位地址線的使用。并且STM32的內存地址訪問是按字節編址的,即每個存儲單元是1字節(8位)。 一、尋址大小與范圍 地址線根數 地址編號(二進制) 地址編號數(即內存大小) <

實現基于Elasticsearch的搜索服務

實現基于Elasticsearch的搜索服務 大家好&#xff0c;我是微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 1. Elasticsearch簡介 Elasticsearch是一個開源的分布式搜索引擎&#xff0c;提供強大的全文搜索和分析功能。本文…

10、DDD分層架構

微服務架構模型有很多種&#xff0c;例如洋蔥架構、CQRS和六邊形架構等。雖然這些架構模式提出的時代和背景不同&#xff0c;但其核心理念都是為了設計出“高內聚&#xff0c;低耦合”的微服務&#xff0c;輕松實現微服務的架構演進。DDD分層架構的出現&#xff0c;使微服務的架…

什么是ThreadLocal以及內存泄漏問題、hash沖突問題

ThreadLocal是什么 ThreadLocal類用來提供線程內部的局部變量 它主要有三大特性&#xff1a; 線程安全: 在多線程并發的場景下保證線程安全傳遞數據&#xff1a;通過ThreadLocal在同一線程傳遞公共變量線程隔離&#xff1a;每個線程的變量都是獨立的&#xff0c;不會互相影響…

這次讓我們從幾個點認識一下Mysql的Innodb

MySQL 的 InnoDB 存儲引擎是 MySQL 默認和最常用的存儲引擎之一。它主要關注的是高可靠性、性能以及完整的事務支持。以下是對 InnoDB 存儲引擎的詳細介紹&#xff1a; 1. 數據庫特性 1.1 事務支持 InnoDB 是完全支持事務的存儲引擎&#xff0c;支持四種主要的事務隔離級別&…

【uniapp-ios】App端與webview端相互通信的方法以及注意事項

前言 在開發中&#xff0c;使用uniapp開發的項目開發效率是極高的&#xff0c;使用一套代碼就能夠同時在多端上線&#xff0c;像筆者之前寫過的使用Flutter端和webview端之間的相互通信方法和問題&#xff0c;這種方式本質上實際上是h5和h5之間的通信&#xff0c;網上有非常多…

ios身份證實名認證接口開發示例助力電商物流實名認證

為了更好的利用貨車資源&#xff0c;也方便企業正常的運送貨物&#xff0c;“互聯網電商”平臺可謂風起云涌。貨車司機和有發貨需求的人們可以在物流平臺注冊&#xff0c;貨車司機接單為有運送需求的用戶提供有償貨運服務。那么&#xff0c;如何讓企業放心的將貨物安心的交予貨…

物聯網實訓室建設可行性報告

一、建設物聯網實訓室的目的和意義 隨著信息技術的快速發展&#xff0c;物聯網&#xff08;IoT&#xff09;已成為推動社會進步和經濟發展的關鍵技術之一。物聯網技術的集成應用&#xff0c;不僅能夠提高生產效率&#xff0c;還能促進智慧城市、智能家居、智能農業等多個領域的…

python04——類(基礎new)

類其實也是一種封裝的思想&#xff0c;類就是把變量、方法等封裝在一起&#xff0c;然后可以通過不同的實例化對其進行調用操作。 1.類的定義 class 類名&#xff1a; 變量a def __init__ (self,參數2&#xff0c;參數2...)&#xff1a;初始化函數&#xff01;&#xff01;&…

vivado DELAY_VALUE_XPHY、DIFF_TERM

延遲_值_XPHY PORT對象上的DELAY_VALUE_XPHY屬性指定要添加的延遲量 Versal XPHY邏輯接口的輸入或輸出路徑。在的早期階段 opt_design在重新生成高級I/O向導IP時 DELAY_VALUE_XPHY值將從PORT復制到的XPHY實例上 輸入或輸出路徑。Vivado設計套件中存在DRCs&#xff0c;以確保 DE…

簡單實現聯系表單Contact Form自動發送郵件

如何實現簡單Contact Form自動郵件功能&#xff1f;怎樣簡單設置&#xff1f; 聯系表單不僅是訪客與網站所有者溝通的橋梁&#xff0c;還可以收集潛在客戶的信息&#xff0c;從而推動業務的發展。AokSend將介紹如何簡單實現一個聯系表單&#xff0c;自動發送郵件的過程&#x…

java Collections類介紹

Java 的 java.util.Collections 類提供了一組靜態方法&#xff0c;用于操作或返回集合&#xff08;如列表、集合和映射&#xff09;。Collections 類是一個實用工具類&#xff0c;旨在為集合提供便捷的算法和操作。以下是對 Collections 類及其常用方法的介紹。 常用方法總結 …

【游戲客戶端】大話slg玩法架構(一)滾動基類

【游戲客戶端】大話slg玩法架構&#xff08;一&#xff09;滾動基類 大家好&#xff0c;我是Lampard家杰~~ 今天我們兌現諾言&#xff0c;給大家分享SLG玩法的實現j架構&#xff0c;關于SLG玩法的介紹可以參考這篇上一篇文章&#xff1a;【游戲客戶端】制作率土之濱Like玩法 PS…

保險理論與實踐

《保險理論與實踐》是由中國保險學會主辦的學術集刊&#xff0c;于2016年1月正式創辦&#xff0c;致力于發表權威、嚴謹、高質量的理論研究、政策研究和實務研究成果&#xff0c;強調學術性與政策性、理論性與實踐性的有機結合。本刊由中國金融出版社公開出版&#xff0c;每月下…

postmessage()在同一域名下,傳遞消息給另一個頁面

這里是同域名下&#xff0c;getmessage.html&#xff08;發送信息&#xff09;傳遞消息給index.html&#xff08;收到信息&#xff0c;并回傳收到信息&#xff09; index.html頁面 <!DOCTYPE html> <html><head><meta http-equiv"content-type"…

機器學習統計學基礎 - 最大似然估計

最大似然估計&#xff08;Maximum Likelihood Estimation, MLE&#xff09;是一種常用的參數估計方法&#xff0c;其基本原理是通過最大化觀測數據出現的概率來尋找最優的參數估計值。具體來說&#xff0c;最大似然估計的核心思想是利用已知的樣本結果&#xff0c;反推最有可能…

Java并發編程工具包(JUC)詳解

在現代軟件開發中&#xff0c;多線程編程是一個不可避免的話題。為了更好地管理和利用多線程&#xff0c;Java提供了一個強大的工具包——java.util.concurrent&#xff08;簡稱JUC&#xff09;。JUC包含了許多用于并發編程的類和接口&#xff0c;幫助開發者高效、安全地處理線…