【openpcdet中yaml文件的DATA_AUGMENTOR學習】

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔

文章目錄

  • 前言
  • 一、代碼
  • 二、詳細解釋
    • DISABLE_AUG_LIST
    • AUG_CONFIG_LIST
      • 1. gt_sampling
      • 2. random_world_flip
      • 3. random_world_rotation
      • 4. random_world_scaling
  • 總結


前言

提示:這里可以添加本文要記錄的大概內容:

openpcdet中yaml文件的DATA_AUGMENTOR學習


提示:以下是本篇文章正文內容,下面案例可供參考

一、代碼

DATA_AUGMENTOR:DISABLE_AUG_LIST: ['placeholder']AUG_CONFIG_LIST:- NAME: gt_samplingUSE_ROAD_PLANE: TrueDB_INFO_PATH:- kitti_dbinfos_train.pklPREPARE: {filter_by_min_points: ['Car:5', 'Pedestrian:5', 'Cyclist:5'],filter_by_difficulty: [-1],}SAMPLE_GROUPS: ['Car:15','Pedestrian:15', 'Cyclist:15']NUM_POINT_FEATURES: 4DATABASE_WITH_FAKELIDAR: FalseREMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0]LIMIT_WHOLE_SCENE: False- NAME: random_world_flipALONG_AXIS_LIST: ['x']- NAME: random_world_rotationWORLD_ROT_ANGLE: [-0.78539816, 0.78539816]- NAME: random_world_scalingWORLD_SCALE_RANGE: [0.95, 1.05]

二、詳細解釋

這個DATA_AUGMENTOR配置主要用于3D目標檢測或點云處理的數據增強。

以下是對這段配置的詳細解釋:

DISABLE_AUG_LIST

'placeholder':這里是一個占位符,表示沒有禁用任何數據增強方法。通常,這個列表會包含那些你希望禁用的數據增強方法的名稱。

AUG_CONFIG_LIST

這是一個列表,包含了多個數據增強的配置。

1. gt_sampling

NAME: gt_sampling
表示這種數據增強方法的名字是gt_sampling,通常用于從數據庫(DB)中采樣真值(ground truth)對象并將其放置在場景中。

USE_ROAD_PLANE: True 表示在采樣過程中會考慮道路平面。

DB_INFO_PATH:
這是一個列表,包含了數據庫信息(如對象的3D邊界框、類別等)的路徑。在這里,它指向了一個名為kitti_dbinfos_train.pkl的文件。

PREPARE:
filter_by_min_points: 這是一個列表,指定了每個類別對象所需的最小點數。例如,Car:5表示只考慮點數大于或等于5的汽車對象。
filter_by_difficulty: 這是一個列表,指定了過濾對象的難度級別。在這里,-1表示不過濾任何難度級別的對象。
SAMPLE_GROUPS: 這是一個列表,指定了每個類別對象在場景中應該被采樣的數量。例如,Car:15表示應該采樣15個汽車對象。

NUM_POINT_FEATURES: 表示每個點云點的特征數量,這里是4個。

DATABASE_WITH_FAKELIDAR: False 表示不使用模擬的激光雷達數據。

REMOVE_EXTRA_WIDTH: 一個列表,指定了在采樣對象時從對象的邊界框中移除的額外寬度(以x, y, z方向為順序)。在這里,沒有移除任何額外寬度。

LIMIT_WHOLE_SCENE: False 表示不限制整個場景的大小或內容。

2. random_world_flip

NAME: random_world_flip 表示這種數據增強方法的名字是隨機翻轉整個世界場景。

ALONG_AXIS_LIST: [‘x’] 表示只在x軸方向上進行隨機翻轉。

當采用random_world_flip這種數據增強方法后,數據會發生以下改變:

方向性變化:

原本的三維場景或對象會在指定的軸上(如x軸)進行隨機翻轉。這意味著場景或對象的方向會發生變化,可能是向左翻、向右翻,或者是上下翻轉(如果沿z軸翻轉)。

標簽和注釋的相應調整:

如果場景或對象帶有標簽或注釋(例如目標檢測任務中的邊界框或語義分割任務中的語義標簽),那么這些標簽和注釋也需要進行相應的翻轉調整,以確保它們仍然正確地與翻轉后的場景或對象對應。

數據多樣性的增加:

通過隨機翻轉,原始數據集中的每個場景或對象都會產生多個不同方向的變體,從而增加了數據的多樣性。這有助于訓練出更加魯棒和泛化能力更強的模型。

def random_world_flip(self, data_dict=None, config=None):if data_dict is None:return partial(self.random_world_flip, config=config)gt_boxes, points = data_dict['gt_boxes'], data_dict['points']for cur_axis in config['ALONG_AXIS_LIST']:assert cur_axis in ['x', 'y']gt_boxes, points, enable = getattr(augmentor_utils, 'random_flip_along_%s' % cur_axis)(gt_boxes, points, return_flip=True)data_dict['flip_%s'%cur_axis] = enableif 'roi_boxes' in data_dict.keys():num_frame, num_rois,dim = data_dict['roi_boxes'].shaperoi_boxes, _, _ = getattr(augmentor_utils, 'random_flip_along_%s' % cur_axis)(data_dict['roi_boxes'].reshape(-1,dim), np.zeros([1,3]), return_flip=True, enable=enable)data_dict['roi_boxes'] = roi_boxes.reshape(num_frame, num_rois,dim)data_dict['gt_boxes'] = gt_boxesdata_dict['points'] = pointsreturn data_dict
gt_boxes, points, enable = getattr(augmentor_utils, 'random_flip_along_%s' % cur_axis)(gt_boxes, points, return_flip=True)  

這段代碼定義了一個名為random_world_flip的函數,它用于對三維點云數據及其對應的標簽(通常是目標邊界框)進行隨機的軸翻轉。

以下是對該代碼的詳細解釋:

函數定義

def random_world_flip(self, data_dict=None, config=None):
self: 表示這是一個類的方法,可能是一個數據增強類的一部分。
data_dict: 一個字典,包含點云數據(points)和對應的目標邊界框(gt_boxes)等信息。
config: 一個配置字典,其中包含了翻轉時要考慮的軸列表(ALONG_AXIS_LIST)。

主體部分
參數檢查

if data_dict is None:  return partial(self.random_world_flip, config=config)
如果data_dict是None,則返回一個偏函數(partial function),該函數在稍后可以被調用,并自動傳入config參數。

數據遍歷和翻轉

for cur_axis in config['ALONG_AXIS_LIST']:  
...
遍歷配置中指定的軸列表,對每個軸進行翻轉操作。

翻轉斷言

assert cur_axis in ['x', 'y']
確保當前軸只能是'x'或'y'。這通常是因為在三維空間中,沿z軸翻轉可能不符合物理世界的情況(如重力方向)。

調用翻轉函數

gt_boxes, points, enable = getattr(augmentor_utils, 'random_flip_along_%s' % cur_axis)(  gt_boxes, points, return_flip=True  
)
使用getattr從augmentor_utils模塊中動態獲取翻轉函數(如random_flip_along_x或random_flip_along_y),并傳入gt_boxes、points和return_flip=True。該函數會對數據進行翻轉,并返回翻轉后的數據以及一個布爾值enable,表示是否實際進行了翻轉。

def random_flip_along_x(gt_boxes, points, return_flip=False, enable=None):"""Args:gt_boxes: (N, 7 + C), [x, y, z, dx, dy, dz, heading, [vx], [vy]]points: (M, 3 + C)Returns:"""if enable is None:enable = np.random.choice([False, True], replace=False, p=[0.5, 0.5])if enable:gt_boxes[:, 1] = -gt_boxes[:, 1]gt_boxes[:, 6] = -gt_boxes[:, 6]points[:, 1] = -points[:, 1]if gt_boxes.shape[1] > 7:gt_boxes[:, 8] = -gt_boxes[:, 8]if return_flip:return gt_boxes, points, enablereturn gt_boxes, points

這段代碼定義了一個函數 random_flip_along_x,用于沿x軸隨機翻轉三維數據(如點云和目標邊界框)。

下面是對該代碼的詳細解釋:

函數定義

def random_flip_along_x(gt_boxes, points, return_flip=False, enable=None):
gt_boxes: 是一個形狀為 (N, 7 + C) 的二維數組,其中N表示目標邊界框的數量,7表示每個邊界框的基本屬性(x, y, z, dx, dy, dz, heading),C表示額外的屬性(如速度vx, vy等)。points: 是一個形狀為 (M, 3 + C) 的二維數組,其中M表示點的數量,3表示每個點的三維坐標(x, y, z),C表示額外的屬性。return_flip: 一個布爾值,如果為True,則除了返回翻轉后的gt_boxes和points外,還返回是否執行了翻轉的標志enable。enable: 一個布爾值,如果傳入,則指定是否執行翻轉。如果為None,則隨機決定是否執行翻轉。

函數體

隨機決定是否翻轉

if enable is None:  enable = np.random.choice([False, True], replace=False, p=[0.5, 0.5])
如果enable是None,則使用numpy的random.choice函數隨機選擇是否執行翻轉。默認情況下,翻轉和不翻轉的概率都是0.5。

執行翻轉

if enable:  gt_boxes[:, 1] = -gt_boxes[:, 1]  gt_boxes[:, 6] = -gt_boxes[:, 6]  points[:, 1] = -points[:, 1]  if gt_boxes.shape[1] > 7:  gt_boxes[:, 8] = -gt_boxes[:, 8]

如果決定執行翻轉:

邊界框的y坐標(索引為1)被取反,實現沿x軸的翻轉。邊界框的heading(索引為6)也被取反,因為heading通常表示目標的朝向,翻轉后朝向也會變化。點的y坐標(索引為1)也被取反。如果gt_boxes有額外的屬性(即C > 0),并且第一個額外屬性是速度vy(通常索引為8),則也將其取反(這取決于額外的屬性是否表示速度,并且vy是否是第一個)。

返回結果

if return_flip:  return gt_boxes, points, enable  
return gt_boxes, points
根據return_flip的值決定是否返回enable。如果return_flip為True,則返回翻轉后的gt_boxes、points和enable;否則只返回翻轉后的gt_boxes和points。

總結
這個函數允許你沿x軸隨機翻轉三維數據(如點云和目標邊界框),并可以返回是否執行了翻轉的標志。這在數據增強中很有用,可以幫助訓練出更魯棒的模型。


記錄翻轉狀態

data_dict[‘flip_%s’%cur_axis] = enable

將翻轉狀態記錄到data_dict中,以便后續處理。

處理ROI(Region of Interest)邊界框、

如果data_dict中包含'roi_boxes'鍵,則對ROI邊界框也進行相同的翻轉操作。這里,ROI邊界框可能是在多幀數據或特定區域中定義的邊界框。

更新數據字典

data_dict['gt_boxes'] = gt_boxes  
data_dict['points'] = points
最后,將翻轉后的gt_boxes和points更新回data_dict中。

返回值

函數返回更新后的data_dict。

總結

這個函數實現了對三維點云數據和目標邊界框的隨機軸翻轉,同時考慮了ROI邊界框的翻轉,并將翻轉狀態記錄到數據字典中。這種數據增強方法有助于提高三維目標檢測或場景理解模型的泛化能力

3. random_world_rotation

NAME: random_world_rotation 表示這種數據增強方法的名字是隨機旋轉整個世界場景。

WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] 表示旋轉角度的范圍,單位是弧度。這個范圍大約對應于-45度到45度。

def global_rotation(gt_boxes, points, rot_range, return_rot=False, noise_rotation=None):"""Args:gt_boxes: (N, 7 + C), [x, y, z, dx, dy, dz, heading, [vx], [vy]]points: (M, 3 + C),rot_range: [min, max]Returns:"""if noise_rotation is None: noise_rotation = np.random.uniform(rot_range[0], rot_range[1])points = common_utils.rotate_points_along_z(points[np.newaxis, :, :], np.array([noise_rotation]))[0]gt_boxes[:, 0:3] = common_utils.rotate_points_along_z(gt_boxes[np.newaxis, :, 0:3], np.array([noise_rotation]))[0]gt_boxes[:, 6] += noise_rotationif gt_boxes.shape[1] > 7:gt_boxes[:, 7:9] = common_utils.rotate_points_along_z(np.hstack((gt_boxes[:, 7:9], np.zeros((gt_boxes.shape[0], 1))))[np.newaxis, :, :],np.array([noise_rotation]))[0][:, 0:2]if return_rot:return gt_boxes, points, noise_rotationreturn gt_boxes, points

這段代碼定義了一個名為 global_rotation 的函數,其主要目的是對給定的 gt_boxes(真實邊界框)和
points(點云數據)進行全局旋轉。這里的旋轉是沿著 z 軸進行的。

下面是詳細的解釋:

輸入參數:

gt_boxes: 一個形狀為 (N, 7 + C) 的數組,其中 N 是邊界框的數量,7 是邊界框的基本屬性(x, y, z, dx, dy, dz, heading),C 是可選的額外屬性(如速度 vx, vy)。points: 一個形狀為 (M, 3 + C) 的數組,其中 M 是點的數量,3 是點的三維坐標(x, y, z),C 是可選的額外屬性。rot_range: 一個長度為 2 的列表,表示旋轉角度的范圍(即 [min, max])。return_rot: 一個布爾值,決定是否返回旋轉角度。noise_rotation: 可選的旋轉角度,如果為 None,則隨機從 rot_range 中選擇一個。

函數執行:
如果 noise_rotation 為 None,則從 rot_range 中隨機選擇一個旋轉角度。

使用 common_utils.rotate_points_along_z 函數對 points 進行旋轉。這個函數會沿著 z 軸旋轉點云數據,并返回旋轉后的結果。同樣地,使用 common_utils.rotate_points_along_z 函數對 gt_boxes 的前三維(x, y, z)進行旋轉,并更新 gt_boxes。更新 gt_boxes 的 heading(方向角)屬性,將其加上 noise_rotation。如果 gt_boxes 有額外的屬性(如速度 vx, vy),并且這些屬性是二維的(可能是速度向量),則也對它們進行旋轉。根據 return_rot 的值,決定是否返回旋轉角度 noise_rotation。

輸出:

如果 return_rot 為 True,則返回旋轉后的 gt_boxes、points 和旋轉角度 noise_rotation。如果 return_rot 為 False(或省略),則只返回旋轉后的 gt_boxes 和 points。

這個函數在三維目標檢測或點云處理中可能很有用,特別是當你需要模擬真實世界中的旋轉或對數據集進行增強時。

4. random_world_scaling

NAME: random_world_scaling 表示這種數據增強方法的名字是隨機縮放整個世界場景。

WORLD_SCALE_RANGE: [0.95, 1.05] 表示縮放因子的范圍。這意味著場景可以被縮放到原始大小的95%到105%之間。

def global_scaling(gt_boxes, points, scale_range, return_scale=False):"""Args:gt_boxes: (N, 7), [x, y, z, dx, dy, dz, heading]points: (M, 3 + C),scale_range: [min, max]Returns:"""if scale_range[1] - scale_range[0] < 1e-3:return gt_boxes, pointsnoise_scale = np.random.uniform(scale_range[0], scale_range[1])points[:, :3] *= noise_scalegt_boxes[:, :6] *= noise_scaleif gt_boxes.shape[1] > 7:gt_boxes[:, 7:] *= noise_scaleif return_scale:return gt_boxes, points, noise_scalereturn gt_boxes, points

這段代碼定義了一個名為global_scaling的函數,其主要功能是對給定的點云(points)和地面真值邊界框(gt_boxes)進行全局縮放。縮放的比例(noise_scale)是從指定的縮放范圍(scale_range)中隨機選擇的。

以下是該函數的詳細解釋:

參數

gt_boxes: 形狀為 (N, 7) 的數組,其中 N 是邊界框的數量。每個邊界框有7個元素,分別是 [x, y, z, dx, dy, dz, heading]。其中 (x, y, z) 是邊界框的中心坐標,(dx, dy, dz) 是邊界框的尺寸(寬度、長度和高度),而 heading 是邊界框的朝向。points: 形狀為 (M, 3 + C) 的數組,其中 M 是點的數量,3 表示每個點的三維坐標 (x, y, z),C 表示每個點的其他特征數量(如果有的話)。scale_range: 一個長度為2的列表或數組,表示縮放比例的取值范圍,即 [min, max]。return_scale: 一個布爾值,如果為 True,則函數還會返回縮放比例 noise_scale。

返回值

如果 return_scale 為 False,則返回縮放后的 gt_boxes 和 points。如果 return_scale 為 True,則返回縮放后的 gt_boxes、points 和縮放比例 noise_scale。	

功能

檢查縮放范圍:如果 scale_range 的兩個值之間的差小于 1e-3(即縮放范圍非常小),則不進行任何操作并直接返回原始的 gt_boxes 和 points。隨機選擇縮放比例:從 scale_range 中隨機選擇一個縮放比例 noise_scale。縮放點云:將 points 數組中的每個點的三維坐標 (x, y, z) 乘以縮放比例 noise_scale。縮放邊界框:將 gt_boxes 數組中的每個邊界框的中心坐標 (x, y, z) 和尺寸 (dx, dy, dz) 乘以縮放比例 noise_scale。如果 gt_boxes 的列數大于7(即存在額外的特征或屬性),則這些額外的特征或屬性也會被縮放。返回結果:根據 return_scale 的值,返回縮放后的 gt_boxes、points 和(可選的)縮放比例 noise_scale。

總結

總的來說,這個DATA_AUGMENTOR配置定義了一系列數據增強方法,這些方法可以幫助模型更好地泛化并處理各種復雜的場景和對象。

在訓練3D目標檢測模型時,使用這些數據增強方法通常可以提高模型的性能和魯棒性。

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

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

相關文章

多線程(八)

一、wait和notify 等待 通知 機制 和join的用途類似,多個線程之間隨機調度,引入 wait notify 就是為了能夠從應用層面上,干預到多個不同線程代碼的執行順序.( 這里說的干預,不是影響系統的線程調度策略 內核里的線程調度,仍然是無序的. 相當于是在應用程序…

Pod容器資源限制和探針

目錄 一、資源限制 1.Pod和容器的資源請求和限制 2.CPU 資源單位 案例一 案例二 二、健康檢查&#xff0c;又稱為探針&#xff08;Probe&#xff09; 1.探針的三種規則 2.Probe支持三種檢查方法 3.探測獲得的三種結果 案例一&#xff1a;exec 案例二&#xff1a;htt…

OneMO同行 心級服務:中移物聯OneMO模組助力客戶終端寒冷環境下的穩定運行

中移物聯OneMO模組以客戶為中心&#xff0c;基于中國移動心級服務要求&#xff0c;開展“OneMO同行 心級服務 標定一流”高標服務主題活動&#xff0c;升級“服務內容““服務方式”和“服務意識”&#xff0c;為行業客戶提供全新的服務體驗。 近日&#xff0c;某車載監控設備…

Hive語法學習總結

Hive SQL語法學習總結 hive參數庫操作1.創建庫2.具體案例3.庫的其他操作 表和庫的路徑演示表的操作創建表插入數據 hive參數 一 hive常用交互命令hive -e sql語句hive -f sql文件 //文件中是sql語句二 參數的設置方式一&#xff1a;在客戶端中設置參數(當次有效)set 參數名參…

ACM實訓第十七天

Is It A Tree? 問題 考試時應該做不出來&#xff0c;果斷放棄 樹是一種眾所周知的數據結構&#xff0c;它要么是空的(null, void, nothing)&#xff0c;要么是一個或的集合滿足以下屬性的節點之間有向邊連接的節點較多。 ?只有一個節點&#xff0c;稱為根節點&#xff0c;它…

【Crypto】摩絲

文章目錄 一、摩斯解題感悟 一、摩斯 很明顯莫爾斯密碼 iloveyou還挺浪漫 小小flag&#xff0c;拿下 解題感悟 莫爾斯密碼這種題還是比較明顯的

【董曉算法】競賽常用知識之圖論3(最近公共祖先)

前言&#xff1a; 本系列是學習了董曉老師所講的知識點做的筆記 董曉算法的個人空間-董曉算法個人主頁-嗶哩嗶哩視頻 (bilibili.com) 動態規劃系列&#xff08;還沒學完&#xff09; 【董曉算法】動態規劃之線性DP問題-CSDN博客 【董曉算法】動態規劃之背包DP問題&#xff…

智能鎖千千萬,誰是你的NO.1,親身實測凱迪仕傳奇大師K70旗艦新品

智能鎖千千萬&#xff0c;誰是你的NO.1。歡迎來到智哪兒評測室&#xff0c;這次我們為大家帶來了凱迪仕傳奇大師K70系列的一款重磅新品。 在科技的浪潮中&#xff0c;家居安全領域正經歷著前所未有的變革。智能鎖越來越成為家的安全守護神&#xff0c;以及智能生活的得力助手。…

Android 11 Framework實時監聽Activity堆棧變化

核心類 Framework中有一個類SystemActivityMonitoringService專門用于監控Activity堆棧變化&#xff0c;屬于隱藏Api&#xff0c;應用側無法調用。此類位于 packages/services/Car/service/src/com/android/car/SystemActivityMonitoringService.java 方法 void registerTa…

Mysql信息脫敏

類似微信姓名脫敏&#xff1a; SELECT CONCAT( REPEAT(*, CHAR_LENGTH(real_name) -1 ), RIGHT(real_name, 1) ) name from user_info電話號脫敏&#xff1a; SELECT CONCAT(LEFT(mobile_phone, 3), REPEAT(*, 4 ), RIGHT(mobile_phone, 4) ) phone from user_info

大數據Hive中的UDF:自定義數據處理的利器(下)

在上一篇文章中&#xff0c;我們對第一種用戶定義函數&#xff08;UDF&#xff09;進行了基礎介紹。接下來&#xff0c;本文將帶您深入了解剩余的兩種UDF函數類型。 文章目錄 1. UDAF1.1 簡單UDAF1.2 通用UDAF 2. UDTF3. 總結 1. UDAF 1.1 簡單UDAF 第一種方式是 Simple(簡單…

每日一題《leetcode--382.鏈表隨機結點》

https://leetcode.cn/problems/linked-list-random-node/ 這道題我們首先看到題目中的要求&#xff1a;在單鏈表中隨機選取一個鏈表中的結點&#xff0c;要使每個結點被選取的概率是一樣的。 當我們看到隨機這兩個字時&#xff0c;應該就會想起rand()這個函數。接著我們把使用這…

[暈事]今天做了件暈事35 VM發送給gateway太多ARP,導致攻擊檢查?

最近遇到一個問題&#xff0c;說網關學不到新起來VM的mac地址&#xff0c;通過tshark抓包發現&#xff0c;VM已經發出去GARP了。而且連續發送了24個GARP。 就認為是網關的問題&#xff0c;為什么沒網關沒有學到&#xff1f;就讓測試同事開網絡設備的ticket。 后來聽同事說&…

自己搭建內網穿透

本文介紹使用最新版frp搭建內網穿透&#xff0c;最新版本的frp在配置上與之前有很大不同&#xff0c;需要使用.toml文件進行配置。其中主要問題出現在toml文件內部。 一、云服務器配置 下載frp sudo apt update sudo apt install wget wget https://github.com/fatedier/frp…

求出這行英文中最后一個單詞的長度

【題目描述】藍寶看到了一行奇怪的英文&#xff0c;這行英文由若干單詞組成&#xff0c;每個單詞前后用一些字符*隔開請幫助藍寶求出這行英文中最后一個單詞的長度。【輸入格式】 輸入一行&#xff0c;就就是藍寶看到的奇怪的英文。 【輸出格式】 輸出一行&#xff0c;是個整數…

文旅3d仿真數字人形象為游客提供全方位的便捷服務

在AI人工智能與VR虛擬現實技術的雙重驅動下&#xff0c;文旅3D數字代言人正以其獨特的魅力&#xff0c;頻頻亮相于各類文旅場景&#xff0c;為游客帶來前所未有的個性化服務體驗。他們不僅有趣有品&#xff0c;更能言善道&#xff0c;成為文旅業數字化發展的新亮點。 這些文旅3…

Android 文件加密解密(AES)

private static final String ALGORITHM "AES"; 文件加密 /*** 文件加密* param secretKey 文件加密密鑰* param oldFiles 原始文件列表&#xff0c;需要加密的* param newFiles 構造加密后的文件列表*&#xff08;選擇多個或者單個&#xff09;多個文件加密*/ Re…

我的文章分類合集目錄

文章目錄 Java相關基礎常規問題類Docker類RabbitMQ類分庫分表 網絡工程相關路由交換、Cisco Packet TracerIP地址 前端相關數據庫 Java相關 基礎 Java開發規范、項目開發流程 SpringBoot整合MyBatis實現增刪改查(簡單,詳細) SpringBoot整合MybatisPlus&#xff08;詳細&#…

【Muduo】TcpConnection類

Muduo網絡庫的TcpConnection類代表了TCP連接的一端&#xff0c;即服務器與遠程對等端之間的連接。TcpConnection類知道自身和對端的InetAddress、封裝了前面講過的Socket類和Channel類&#xff0c;并且保有管理自己的subLoop指針&#xff0c;還有多種事件處理函數和回調&#x…

【搜索】BFS

#include <iostream> #include <cstring> #include <queue>using namespace std;const int N 110;typedef pair<int, int> PII;int n, m; int g[N][N], d[N][N];//存放地圖//存每一個點到起點的距離int bfs() {queue< PII > q;q.push({0, 0});m…