【三維重建工具】NeRFStudio、3D GaussianSplatting、Colmap安裝與使用指南

目錄
  • 一、NeRFStudio安裝
    • 1.安裝(ubuntu系統)
    • 2.安裝(windows系統)
  • 二、安裝tinycudann
  • 三、Colmap安裝與使用
    • 1. 安裝依賴
    • 2. 安裝colmap
    • 3.使用colmap
    • 3.1 可視化界面使用
    • 3.2 Nerfstudio命令行調用Colmap
    • 3.3 colmap結果不準時的修復
    • 3.4 colmap 校正地面
    • 3.5 colmap 分塊計算位姿
  • 四、使用NeRFStudio進行三維重建
  • 四*、gsplat使用
  • 五、3D GaussianSplatting安裝與使用
    • 5.1 安裝
    • 5.2 使用
  • 五* CUDA安裝(附C++編譯器說明)

場景/物體三維重建過程:首先用colmap估計圖像位姿,而后以圖像和位姿作為出入,用NeRF或Gaussian Splatting進行三維重建

一、NeRFStudio安裝

??簡介:Nerfstudio,一個用于NeRF開發的模塊化PyTorch框架。框架中用于實現基于NeRF的方法的組件即插即用,使得研究人員和相關從業者可以輕松地將NeRF集成到自己的項目中。框架的模塊化設計支持實時可視化工具,導入用戶真實世界捕獲的數據集外(in-the-wild)數據,以及導出為視頻,點云和網格表示的工具。近期,還導入了InstantNGP、3D Gaussian Splatting等最新重建算法。

在這里插入圖片描述

1.安裝(ubuntu系統)

??下載項目代碼到本地:

git clone https://github.com/nerfstudio-project/nerfstudio.git
AI寫代碼javascript
運行
  • 1

??可以去github直接下載zip文件,也可以按照以上命令git。網絡不好可以去gitee(碼云)加速。

cd nerfstudio
pip install --upgrade pip setuptools
pip install -e .
AI寫代碼javascript
運行
  • 1
  • 2
  • 3

2.安裝(windows系統)

2.1.安裝vs2019 + cuda 11.6;
2.2.通過conda創建虛擬環境nerfstudio,依次執行如下命令:

conda create --name nerfstudio -y python=3.8
conda activate nerfstudio
python -m pip install --upgrade pip
AI寫代碼javascript
運行
  • 1
  • 2
  • 3

3.3.安裝依賴:
??(1).pytorch 1.13.1, 執行如下命令:

pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 -f https://download.pytorch.org/whl/torch_stable.html
AI寫代碼javascript
運行
  • 1

??(2).tinycudann, 執行如下命令:

pip install ninja git+https://github.com/NVlabs/tiny-cuda-nn/#subdirectory=bindings/torch
AI寫代碼javascript
運行
  • 1

3.4.安裝nerfstudio,依次執行如下命令:

git clone git@github.com:nerfstudio-project/nerfstudio.git
cd nerfstudio
pip install --upgrade pip setuptools
pip install -e .
AI寫代碼javascript
運行
  • 1
  • 2
  • 3
  • 4

5.安裝ffmpeg, 執行如下命令:

conda install -c conda-forge ffmpeg
AI寫代碼javascript
運行
  • 1

6.安裝colmap, 執行如下命令:

conda install -c conda-forge colmap
conda install -c conda-forge mpir
AI寫代碼javascript
運行
  • 1
  • 2

7.安裝hloc,依次執行如下命令: 可選,windwos上不支持pycolmap

cd ..
git clone --recursive https://github.com/cvg/Hierarchical-Localization/
cd Hierarchical-Localization/
pip install pycolmap # windows不支持
python -m pip install -e .
AI寫代碼javascript
運行
  • 1
  • 2
  • 3
  • 4
  • 5

二、安裝tinycudann

pip install git+https://github.com/NVlabs/tiny-cuda-nn/#subdirectory=bindings/torch
AI寫代碼javascript
運行
  • 1

??這句命令不成功的,請切換gcc與g++版本,方法見最后

三、Colmap安裝與使用

?? colmap是用來對一系列圖像進行位姿匹配,從而生成場景的三維模型(點云)。也就是你對一個場景拍攝了很多照片,colmap可以估計出每張照片的相機位置(pose,是NeRF的輸入),并利用SFM算法生成三維模型。使用NeRF和Gaussian Splatting進行三維重建必備的工具。

1. 安裝依賴

sudo apt-get install \git \cmake \ninja-build \build-essential \libboost-program-options-dev \libboost-filesystem-dev \libboost-graph-dev \libboost-system-dev \libeigen3-dev \libflann-dev \libfreeimage-dev \libmetis-dev \libgoogle-glog-dev \libgtest-dev \libsqlite3-dev \libglew-dev \qtbase5-dev \libqt5opengl5-dev \libcgal-dev \libceres-dev
AI寫代碼javascript
運行
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

2. 安裝colmap

git clone https://github.com/colmap/colmap.git
cd colmap
mkdir build
cd build
sudo cmake .. \-D CMAKE_CUDA_COMPILER="/usr/local/cuda-11.3/bin/nvcc" ../CMakeLists.txt \-D CMAKE_CUDA_ARCHITECTURES='89'    
cd ..
sudo make -j24 
sudo make install
AI寫代碼javascript
運行
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

??注意:
??更改以上命令中cuda路徑,以及最后的顯卡算力(75代表Turing架構,如RTX 20系列;80代表Ampere架構,如RTX 30系列;89為RTX4080 顯卡等)

3.使用colmap

3.1 可視化界面使用

使用命令打開colmap

colmap gui
AI寫代碼javascript
運行
  • 1

打開界面如下:

在這里插入圖片描述1.創建 project_cat 文件夾,把圖片放 project_cat/images 下
2.執行 Automatic reconstruction 重建,如下:‘
在這里插入圖片描述
在這里插入圖片描述
??需要等待比較久的時間,最開始比較占用CPU,大概執行的是特征點計算和匹配一類的,后面會占用比較大的GPU使用率,GPU內存占用大概2G.

??到下面的界面后表明完成。

在這里插入圖片描述
??同時介紹了可視化sparse, dense, mesh 模型結果的方法。最終效果如下:

在這里插入圖片描述
一些參數說明:

Rotate model: Left-click and drag.
Shift model: Right-click or -click (-click) and drag.
Zoom model: Scroll.
Change point size: -scroll (-scroll).
Change camera size: -scroll. (紅色的表示相機拍攝位置的符號)
Adjust clipping plane: -scroll. (距離觀察視點一定距離的點會被 clipped)
Select point: Double-left-click point (change point size if too small). The green lines visualize the projections into the images that see the point. The opening window shows the projected locations of the point in all images.

3.2 Nerfstudio命令行調用Colmap

??除以上可視化界面直接計算圖片的pose以外,還可以用Nerfstudio調用colmap:

ns-process-data images --sfm-tool hloc --feature-type superpoint --matcher-type superglue --data '/path/to/IMG'  --output-dir '/path/to/IMG' 
AI寫代碼javascript
運行
  • 1

??其優點是利用superpoint 和 superglue深度特征,替代原始的sift提取特征

3.3 colmap結果不準時的修復

1.在終端 colmap gui命令打開可視化界面,先新建項目,將sparse/0中的database.db和圖片路徑輸入,再import項目,輸入sparse/0文件夾,就能顯示以下界面
2.在可視化界面中,import model之前不準的結果路徑(sparse/0文件夾)
3.在可視化界面中,雙擊選中不準的圖片,直接刪除(中間這幾個相機擠在一起,明顯有問題)

在這里插入圖片描述刪除完以后,export model,直接放在一個新文件夾里

4.更新clmap計算出的點云:

colmap point_triangulator   
--database_path /home/data/garden/colmap/sparse/0/database.db  
--image_path /home/data/garden/images      
--input_path /home/data/garden/colmap/sparse/0     
--output_path /home/data/garden/colmap/sparse/1    # 新生成的點云保存路徑,可以提前創建好,替代原來的sparse/0
AI寫代碼javascript
運行
  • 1
  • 2
  • 3
  • 4
  • 5

5.重新增量式把刪除的圖片計算進來(可選):

colmap mapper   --database_path /home/xzz/instruct-gs2gs/data/liangcang2-2copy/distorted/sparse/0/database.db  
--image_path /home/data/garden/images    
--input_path /home/data/garden/colmap/sparse/0     
--output_path /home/data/garden/colmap/sparse/0+    # 新生成的0+路徑,可以替代原始的sparse/0
--Mapper.fix_existing_images 1
AI寫代碼javascript
運行
  • 1
  • 2
  • 3
  • 4
  • 5

可以檢查一下0+的相機位置對不對,還是不對的話就舍棄0+

3.4 colmap 校正地面

# 1.windows命令:
E:\COLMAP-3.9.1-windows-cuda\COLMAP.bat model_orientation_alignerhel --help  
# 2.ubuntu命令:
colmap model_orientation_aligner --help
# (大概需要 --image_path arg   --input_path sparse/0   --output path arg  三個輸入參數 )
AI寫代碼javascript
運行
  • 1
  • 2
  • 3
  • 4
  • 5

3.5 colmap 分塊計算位姿

0.premilinary:input1路徑下的圖片轉fl1.txt

import os

def write_filenames_to_txt(folder_path, output_txt_path):

# 獲取文件夾中所有文件(不包含子文件夾里的文件)

filenames = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))]

# 寫入到txt文件中

with open(output_txt_path, ‘w’, encoding=‘utf-8’) as f:

for name in sorted(filenames):

f.write(f“{name}\n”)

print(f“已將 {len(filenames)} 個文件名寫入 {output_txt_path}”)

# 示例路徑(請替換為你自己的)

folder_path = r‘/home/xzz/視頻/xytgarden/input1’

output_txt_path = r‘/home/xzz/視頻/xytgarden/fl1.txt’

write_filenames_to_txt(folder_path, output_txt_path)

1.對兩個文件夾一起跑 特征提取,得到new.db。然后跑colmap mapper 得到稀疏點云(input1 圖片路徑,fl1.txt為以上perliminary代碼生成)

colmap mapper
database_path /home/xzz/視頻/xytgarden/514/new.db
image_path /home/xzz/視頻/xytgarden/input1
image_list /home/xzz/視頻/xytgarden/fl1.txt
output_path /home/xzz/視頻/xytgarden/sparse/1

2.同理跑另一個文件夾input1 ,然后合并兩個稀疏點云sparse1與sparse2

colmap model_merger
input_path1 /home/xzz/視頻/xytgarden/sparse/0/0
input_path2 /home/xzz/視頻/xytgarden/sparse/1/0
output_path /home/xzz/視頻/xytgarden/01

AI寫代碼javascript
運行
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

四、使用NeRFStudio進行三維重建

4.1.通過colmap生成數據集,也可從網上,如https://data.nerf.studio/nerfstudio/ 下載lego 樂高玩具測試集,并拷貝到nerfstudio的data/nerfstudio目錄下,data/nerfstudio需自己創建;

4.2.將colmap數據轉化為transforms.json(需要在nerfstudio環境下):

ns-process-data images --data data/liangcang4k/images --output_dir data/liangcang4k/ns --skip_colmap --skip_image_processing --colmap_model_path colmap/sparse/0

備用命令:

ns-process-data images data data/nerfstudio/lego/train output-dir data/nerfstudio/lego camera-type perspective matching-method exhaustive sfm-tool colmap crop-factor 0.0 0.0 0.0 0.0

AI寫代碼javascript
運行
  • 1
  • 2
  • 3
  • 4

4.3.訓練命令如下:迭代產生的checkpoint存儲在outputs/lego/nerfacto目錄下

ns-train nerfacto --data data/nerfstudio/lego --vis viewer --max-num-iterations 50000
AI寫代碼javascript
運行
  • 1

參數為數據路路徑,迭代次數等。還可添加其他參數,用命令ns-render --help查看官方文檔

??訓練進度如下圖所示:

在這里插入圖片描述
訓練結束后,會顯示本地瀏覽地址。打開web實時預覽: https://viewer.nerf.studio/versions/23-04-10-0/?websocket_url=ws://localhost:7007 ,如下圖所示:

在這里插入圖片描述加載預訓練模型,繼續訓練命令為:

ns-train nerfacto --data data/nerfstudio/person --load-dir outputs/person/nerfacto/2023-08-23_152364/nerfstudio_models
AI寫代碼javascript
運行
  • 1

加載預訓練模型進行可視化查看:

ns-viewer --load-config outputs/person/nerfacto/2023-04-23_152364/config.yml
AI寫代碼javascript
運行
  • 1

訓練結果可以導出為 (1).渲染視頻; (2).點云;(3).mesh.

支持的自定義數據集類型:https://docs.nerf.studio/en/latest/quickstart/custom_dataset.html
ns-process-data各參數說明:https://docs.nerf.studio/en/latest/reference/cli/ns_process_data.html
官方提供的數據集:https://drive.google.com/drive/folders/19TV6kdVGcmg3cGZ1bNIUnBBMD-iQjRbG

colmap結果轉nerfstudio輸入:
一般nerfstudio結果需要有sparse_pc.ply與transforms.json,如何將colmap的結果轉成這種格式?只需以下命令:

ns-process-data images   --data liangcang2-2copy/images  --output-dir lc2  --skip-colmap   --colmap-model-path colmap/sparse/0

AI寫代碼javascript
運行
  • 1
  • 2
  • 3

查看訓練好的模型:
ns-viewer --load-config outputs/lc2/splatfacto/2024-09-25_174814/config.yml

四*、gsplat使用

python .\examples\simple_trainer.py _3dgs --enable_viewer --use_bilateral_grid  --data_dir "E:\BaiduNetdiskDownload\uav\$_" --result_dir "E:\BaiduNetdiskDownload\uav\$_" --steps-scaler 1.5
AI寫代碼javascript
運行
  • 1

五、3D GaussianSplatting安裝與使用

5.1 安裝

??首先,克隆代碼到本地(–recursive是為了添加SIBR的可視化庫,用于顯示結果)

git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive
AI寫代碼javascript
運行
  • 1

??然后,cd目錄到gaussian-splatting 下,按照yml創建環境:

cd gaussian-splatting
SET DISTUTILS_USE_SDK=1                   # 只有 Windows 需要
conda env create --file environment.yml
conda activate gaussian_splatting
AI寫代碼javascript
運行
  • 1
  • 2
  • 3
  • 4

安裝整體比較簡單,基本一鍵式安裝

5.2 使用

??首先,自帶的庫可以把視頻,處理成圖片。例如:

ffmpeg -i -qscale:v1-qmin1-vffps C:Users\data\crane.mov -qscale:v 1 -qmin 1-vf fps= %04d.jpg
AI寫代碼javascript
運行
  • 1

??然后,是用colmap處理圖像,獲得每張圖像的pose:

python convert.py -s data/crane
AI寫代碼javascript
運行
  • 1

由于我已經用colmap處理好了圖像,因此需要修改以上代碼。首先,需要創建 ‘ distorted’文件夾,并將 ‘colmap’中的‘spase’ 文件夾復制進去;然后復制 ‘images’文件夾,并重命名為‘input’。然后執行修改后的命令:

python convert.py -s 'data/crane' --skip_matching
AI寫代碼javascript
運行
  • 1

得到的數據集格式如下:
在這里插入圖片描述
??最后,開始訓練:

python train.py -s 'data/crane' --data_device cpu  --iterations  30000
AI寫代碼javascript
運行
  • 1

以上參數可選gpu或cpu,一般訓練30k就能收斂。想細節更好,建議往100k訓練。500張圖,4080gup,30k大概需要半小時內(但是colmap需要一小時)。以下是訓練截圖:
在這里插入圖片描述
最上面一行output那,顯示了保存路徑。

??結果可視化:

./SIBR_viewers/install/bin/SIBR_gaussianViewer_app -m ./output/ee33ed94-3
AI寫代碼javascript
運行
  • 1

以上命令,需要將路徑改為自己的。可視化效果如下:

在這里插入圖片描述

??可以通過鍵盤的‘wsad’進行移動,‘ikjl’鍵來切換視角。只要照片拍的好,效果就好。具體數據采集問題,可以咨詢博主。

常用命令匯總

# 拷貝環境
sudo mount machine3:/nfs/gs_env ~/anaconda3/envs/gs

矯正

python convert.py -s ‘data/indoor3’ skip_matching (必須有input文件夾,以及包含sparse的distorted文件夾)

colmap image_undistorter image_path input_path(put “0” into folder) output_path

train

python train.py -s ‘data/center’ data_device cpu -r 1 iterations 100000 densify_until 60000 densification_interval 250 cache-path ‘path’

實時渲染

./SIBR_viewers/install/bin/SIBR_gaussianViewer_app -m ./output/f80f5f1f-3

python render.py -m ./output/4e756cf2-4 skip_train

遇到錯誤

OSError: [Errno 24] Too many open files: 在終端執行 ulimit -n 4096

無法識別數據中的子文件夾(比如images下面還有123等子圖像文件夾)

scene/dataset_readers.py中的 line 96,將如下第一行修改為第二行:

image_path = os.path.join(images_folder, os.path.basename(extr.name))

image_path = os.path.join(images_folder, extr.name)

地面校準

colmap model_orientation_aligner help

AI寫代碼javascript
運行
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

五* CUDA安裝(附C++編譯器說明)

提示:安裝cuda前,首先要確保gcc與g++編譯器的版本,與cuda版本相匹配。不確定的先看第5節

1、查看已安裝的CUDA版本

??所有已安裝的CUDA版本默認保存在/usr/local路徑下,cd到該路徑下通過ls命令查看:

在這里插入圖片描述

2、查看當前使用的CUDA版本

??在/usr/local路徑下通過 stat cuda 命令查看當前使用的CUDA版本:

3、安裝新的CUDA版本——CUDA11.3為例

3.1、下載對應版本的CUDA安裝包: 鏈接(選擇下載runfile文件)

3.2、在下載文件的目錄下,通過命令進行安裝:

sudo sh cuda_10.0.130_410.48_linux.run
## 安裝時去掉對顯卡驅動的安裝,如下圖中去掉第一行
AI寫代碼javascript
運行
  • 1
  • 2

在這里插入圖片描述
3.3、修改環境變量
??系統環境中修改cuda版本。執行以下命令,打開環境路徑,在最后添加并保存:

gedit ~/.bashrc
AI寫代碼javascript
運行
  • 1
## 默認為以上軟連接的路徑
export PATH=/usr/local/cuda/bin:$PATH  
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
export CUDA_HOME=/usr/local/cuda

也可以指定具體路徑

export PATH=/usr/local/cuda-11.3/bin:PATHexportLDLIBRARYPATH=/usr/local/cuda?11.3/lib64:PATH export LD_LIBRARY_PATH=/usr/local/cuda-11.3/lib64:PATHexportLDL?IBRARYP?ATH=/usr/local/cuda?11.3/lib64:LD_LIBRARY_PATH

AI寫代碼
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

保存環境變量:

source ~/.bashrc
AI寫代碼javascript
運行
  • 1

4、CUDA版本的切換

4.1、刪除原版本的cuda軟連接

sudo rm -rf /usr/local/cuda
AI寫代碼javascript
運行
  • 1

4.2、建立新的指向cuda-10.0的軟連接

sudo ln -s /usr/local/cuda-10.0 /usr/local/cuda
AI寫代碼javascript
運行
  • 1

5.切換gcc與g++版本

??cuda支持的最高版gcc與g++如下表,大部分人都需要降級gcc:

在這里插入圖片描述

??安裝對應版本gcc與g++(這里以cuda11.3對應的9.5為例):

sudo apt-get install gcc-9
sudo apt-get install g++-9
AI寫代碼javascript
運行
  • 1
  • 2

??隨后,進入/usr/bin目錄下刪除舊版本gcc/g++文件(這里只是刪除了軟連接):

cd /usr/bin
sudo rm gcc g++
AI寫代碼javascript
運行
  • 1
  • 2

??最后,將gcc/g++和新安裝的gcc-9/g+±9關聯起來:

sudo ln -s gcc-9 gcc
sudo ln -s g++-9 g++
AI寫代碼javascript
運行
  • 1
  • 2

??查看最新版本:

gcc -V
AI寫代碼javascript
運行
  • 1

??其他切換版本方法:gcc版,默認使用優先級最高的版本。設置gcc 10優先級為100,設置gcc 9優先級為70。那么默認使用gcc10。

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 --slave /usr/bin/g++ g++ /usr/bin/g++-10 --slave /usr/bin/gcov gcov /usr/bin/gcov-10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 70 --slave /usr/bin/g++ g++ /usr/bin/g++-9 --slave /usr/bin/gcov gcov /usr/bin/gcov-9
AI寫代碼javascript
運行
  • 1
  • 2

??隨后,使用以下命令來選擇版本(默認選擇第1行的,序號為0)

sudo update-alternatives --config gcc
AI寫代碼javascript
運行
  • 1
  • 批量修改文件名(先cd到對應路徑):
    for i in KaTeX parse error: Expected group after '_' at position 42: …d group after '_?' at position 2…{i}.png ${i}.png 2>/dev/null; done

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

??

1.colmap對齊校正:
colmap model_orientation_aligner --image_path arg   --input_path arg   --output_path arg  三個輸入參數 )

2.裁減colmap:
python split_colmap/split_colmap_v2.py input 0 output 00 xmin -6.6 xmax -2.04 zmin -13.3 zmax 8.7 threshold .5

3.裁減ply:
python clip_model.py in-path heyangblock2/point_cloud/iteration_60000/point_cloud.ply out-path heyangblock2/clipped.ply xmin -2.04 xmax 1.74

4.合并所有clipped.ply
python merge_models.py in-paths */clipped.ply out-path heyang.ply

python trainer/gstrainer/train.py data.path ‘/home/xzz/Pixel-GS/data/xytdoor’ save.path /tmp/unused auto-exp.enable

清理電腦根目錄:

df -h
sudo du -ahx / | sort -rh | head -n 20

原文鏈接:https://blog.csdn.net/qq_45752541/article/details/136658887

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

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

相關文章

Mybatis05-動態sql

一、應用場景MyBatis 的 動態 SQL 是指根據不同的條件動態拼接生成 SQL 語句的能力。它的最大優勢是:避免寫多個 XML 映射語句、避免 SQL 冗余、提升代碼復用性和可維護性。示例1:用戶可以通過勾選框,勾選不同的數據進行批量刪除,…

VSCODE 選中多行 需要同時按住alt鍵才可以

在 VS Code 中,如果你發現 必須按住 Alt 鍵才能選中多行(即“列選擇”或“塊選擇”模式),而直接拖動鼠標無法多選,可能是由于以下原因導致的:1. 檢查是否啟用了“列選擇模式”VS Code 默認情況下&#xff1…

2025前端面試真題以及答案-不斷整理中,問題來源于牛客真題

一、 項目內存泄露react與vue的渲染機制有哪些不同react fiber架構vue2與3,為什么用proxy代替defineproperty性能優化有哪些三欄布局實現方式重排與重繪一個對話聊天框如何減少重排(我回答的是絕對定位,將聊天框定位在下面,類似于…

雷軍的 IP 革命:人格化力量如何重塑商業規則|創客匠人

小米 YU7 發布會 3 分鐘售罄 20 萬臺的奇跡,撕開了一個時代真相:當商業競爭進入深水區,決定勝負的不再是產品參數,而是創始人 IP 的人格穿透力。雷軍僅憑個人影響力撬動數十億級交易,這絕非偶然,而是人格化…

SpringBoot3:應對C10K并發挑戰的優化指南

嘿,哥們!還在為服務的并發量上不去而頭疼嗎?用戶量一上來,CPU、內存就告急,接口響應慢得像蝸牛?別慌,今天我們就來盤一盤,怎么用最新的Spring Boot 3,把服務性能調教到極…

響應式編程入門教程第三節:ReactiveCommand 與 UI 交互

響應式編程入門教程第一節:揭秘 UniRx 核心 - ReactiveProperty - 讓你的數據動起來! 響應式編程入門教程第二節:構建 ObservableProperty<T> — 封裝 ReactiveProperty 的高級用法 響應式編程入門教程第三節&#x…

500+技術棧覆蓋:Web測試平臺TestComplete的對象識別技術解析

在用戶界面(UI)測試領域,傳統的測試工具往往依賴于XPath或CSS選擇器來定位頁面元素。然而,在面對動態變化的界面、多語言支持或是跨越多種技術框架的應用時,這些傳統方法常導致腳本失效,增加了維護成本。 …

研究人員利用提示注入漏洞繞過Meta的Llama防火墻防護

Trendyol應用安全團隊發現了一系列繞過技術,使得Meta的Llama防火墻在面對復雜的提示注入攻擊時防護失效。這一發現引發了人們對現有大語言模型(LLM)安全措施準備情況的擔憂,并凸顯出在企業日益將大語言模型嵌入工作流程時&#xf…

Shell 腳本系統學習 · 第5篇:多命令順序執行的三種方式詳解(`;`、``、`||`)

在日常的 Linux 運維與腳本編寫中,我們經常需要依次執行多條命令。本篇將帶你徹底搞懂三種命令順序執行方式:;、&& 和 ||,并通過實用示例掌握它們的區別與應用場景。一、為什么要了解多命令執行方式? 在實際運維或腳本編寫…

K8s存儲系統(通俗易懂版)

Kubernetes中存儲中有四個重要的概念:Volume、PersistentVolume PV、PersistentVolumeClaim PVC、StorageClass一、存儲系統核心概念Volume(卷)定義:Kubernetes 中最基礎的存儲單元,用于將外部存儲掛載到 Pod 中的容器…

小白學Python,標準庫篇——隨機庫、正則表達式庫

一、隨機庫1.隨機生成數值在random庫中可以隨機生成數值的方法有uniform()、random()、randint()、randrange()等。(1)uniform()方法uniform(參數1, 參數2)方法用于生成參數1到參數2之間的隨機小數,其中參數的類型都為數值類型。示例代碼&…

Qt窗口:菜單欄

目錄 一、窗口預覽 二、菜單欄 快捷鍵 子菜單 分割線 圖標 內存泄露 一、窗口預覽 在前面幾篇文章中,或者說,Qt初學階段,接觸到的都是QWidget,QWidget指控件,往往作為一個窗口的一部分出現。所謂的窗口&#x…

STM32裸機開發(中斷,輪詢,狀態機)與freeRTOS

裸機:沒有操作系統,程序是單流程的(比如一個大循環里依次執行各個功能,或者用中斷嵌套處理事件)。優點是資源占用極少(幾乎不占 RAM/Flash)、執行流程直觀;但復雜項目里,…

電腦上如何查看WiFi密碼

打開控制面板>點擊網絡和Internet在查看網絡和共享中心找到網絡狀態和任務點擊進去點擊連接的WLAN在WLAN狀態中點擊無線屬性在無線網絡屬性中點擊安全,點擊顯示字符(H)就可以顯示密碼了

文心一言4.5企業級部署實戰:多模態能力與Docker容器化測評

隨著大語言模型在企業服務中的應用日益廣泛,如何選擇一款既能滿足多模態創作需求,又具備良好企業級適配性的AI模型成為了關鍵問題。文心一言4.5作為百度最新開源的大模型,不僅在傳統的文本處理上表現出色,更是在多模態理解和企業級…

VUE Promise基礎語法

目錄 異步和同步 異步的問題 new Promise語法 promise的狀態 promise.then() Promise.resolve() Promise.reject() Promise.all() Promise.race() Promise.catch() Promise.finally() 異步和同步 同步模式下,代碼按順序執行,前一條執行完畢后…

用TensorFlow進行邏輯回歸(六)

import tensorflow as tfimport numpy as npfrom tensorflow.keras.datasets import mnistimport time# MNIST數據集參數num_classes 10 # 數字0到9, 10類num_features 784 # 28*28# 訓練參數learning_rate 0.01training_steps 1000batch_size 256display_step 50# 預處…

【HTTP版本演變】

在瀏覽器中輸入URL并按回車之后會發生什么1. 輸入URL并解析輸入URL后,瀏覽器會解析出協議、主機、端口、路徑等信息,并構造一個HTTP請求(瀏覽器會根據請求頭判斷是否又HTTP緩存,并根據是否有緩存決定從服務器獲取資源還是使用緩存…

Android 16系統源碼_窗口動畫(一)窗口過渡動畫層級圖分析

一 窗口過渡動畫 1.1 案例效果圖1.2 案例源碼 1.2.1 添加權限 (AndroidManifest.xml) <!-- 系統懸浮窗權限&#xff08;Android 6.0需動態請求&#xff09; --> <uses-permission android:name"android.permission.SYSTEM_ALERT_WINDOW" />1.2.2 窗口顯示…

騰訊云WAF域名分級防護實戰筆記

基于業務風險等級、合規要求及騰訊云最佳實踐&#xff0c;提供可直接落地的配置方案&#xff0c;供學習借鑒&#xff1a;一、域名分級與防護原則1. ?域名分級清單&#xff08;核心資產&#xff09;???主域名??業務類型??風險等級??合規要求??防護等級?example.com…