主頁 >  其他 > 基于AidLux的自動駕駛智能預警應用方案

基于AidLux的自動駕駛智能預警應用方案

2023-07-11 08:02:56 其他

1. 自動駕駛感知演算法及AidLux相關方案介紹

1.1自動駕駛

自動駕駛汽車,又稱無人駕駛車、電腦駕駛車、無人車、自駕車,是一種需要駕駛員輔助駕駛或者完全不需要操控的車輛,作為自動化載具,自動駕駛汽車可以不需要人類操作即能感知環境及導航,

1.2 自動駕駛系統的組成部分

1.2.1 環境感知系統

1.2.2 決策系統

1.3 安卓端部署平臺AidLux

AidLux平臺可快速部署在ARM64位智能設備上,手機也能變成邊緣計算設備,當服務器使用、做測驗、做練習,后續換設備落實實際專案,直接遷移,不需要重復開發,

2. 基于YOLOP的全景感知系統講解與實戰應用

2.1 YOLOP演算法介紹

YOLOP能同時處理目標檢測、可行駛區域分割、車道線檢測三個感知任務,并速度優異,保持較好精度進行作業,代碼開源,它是華中科技大學--王興剛團隊在全景感知方面提出的模型,

模型結構包括1個encoder+3個分離的decoder,其中encoder包括backbone和neck,3個decoder分別完成車輛檢測、車道線檢測、可行駛區域分割任務

encoder:主干網路(CSPDarknet),和neck結構(SPP+FPN)

decoder:1個檢測頭和2個分割,兩個分割頭都是使用FPN的最底層特征圖(w/8,h/8,256)作為輸入,進行3次最近鄰上采樣,最終輸出(W, H, 2)的特征圖,

2.2 AutoDL云端YOLOP模型訓練

2.2.1 下載BDD100K資料集

2.2.2 將專案和資料集上傳到AutoDL平臺

2.2.3 訓練YOLOP

執行命令:pip install -r requirements.txt安裝依賴包

單GPU訓練:

python tools/train.py

多GPU訓練:

python -m torch.distributed.launch --nproc_per_node=N tools/train.py #N:GPU數量

推理

python tools/demo.py --weights weights/End-to-end.pth --source inference/videos

3. 智能預警在AidLux平臺上的部署與應用

3.1 YOLOP模型onnx轉換部署

1.使用課程代碼轉換為onnx

執行命令:

python export_onnx.py --height 640 --width 640

執行完成后,會在weights檔案夾下生成轉換成功的onnx模型

onnx轉換核心api:

x = torch.onnx.export(model, # 網路模型
torch.randn(1, 3, 224, 224), # 用于確定輸入大小和型別,其中的值可以是隨機的,
export_onnx_file, # 輸出onnx的名稱
verbose=False, # 是否以字串的形式顯示計算圖
input_names=["input"], # 輸入節點的名稱,可以是一個list
output_names=["output"], # 輸出節點的名稱
opset_version=10, # onnx支持使用的operator set
do_constant_folding=True, # 是否壓縮變數
# 設定動態維度, 此處指明Input節點的第0維度可變,命名為batch_size
dynamic_axes={"input":{0: "batch_size", 2:"h", 3: "w"}, "output": {0: "batch_size"}}
)

2. AidLux模型轉換工具-AIMO

AI Model Optimizer--AIMO, 是一個簡單、快速、精度損失小的模型轉換平臺,

AIMO旨在幫助用戶能夠在邊緣端芯片上無精度損失的快速遷移、部署和運行各種機器學習模型,

平臺地址:http://117.176.129.180:21115/

體驗賬號:AIMOTC001

賬號密碼:AIMOTC001

3.2 YOLOP模型在AidLux上部署和應用

3.2.1 AidLux簡介

AidLux是一個構建在ARM硬體上,基于創新性跨Android/鴻蒙+Linux融合系統環境的智能物聯網(AIOT應用開發和部署平臺),

AidLux軟體使用非常方便,可以安裝在手機、PAD、ARM開發板等邊緣設備上,而且使用AidLux開發的程序中,既能支持在邊緣設備的本機開發,也支持通過web瀏覽器訪問邊緣端桌面進行開發,

各大應用商城都能下載AidLux,在手機商城搜索、下載安裝AidLux,

3.2.2 連接AidLux

 將手機的wifi網路和電腦的網路連接到一起,打開安裝好的手機上的AidLux軟體,點擊第一排第二個Cloud_ip,手機界面上會跳出可以在電腦上登錄的IP地址,在電腦的瀏覽器上,隨便出入一個IP,即可將手機的系統投影到電腦上,連接上后就可以利用手機的算力進行模型推理了,

3.2.3 上傳專案代碼到AidLux

1.點擊檔案瀏覽器,打開檔案管理頁面

2.找到home檔案夾,并雙擊進入此檔案夾

3.點擊右上角往上的箭頭;再選擇Folder,將前面YOLOP的檔案夾上傳到home檔案夾內,(也可以直接將檔案夾拖進目錄下,)

3.2.4 安裝環境

1.打開終端,切換到專案目錄

2.執行命令:pip install -r requirements.txt安裝依賴環境

3.安裝pytorch、torchvision、onnxruntime

pip install torch == 1.8.1==0.9.0 -i https://pypi.mirrors.ustc.edu.cn/simple/
pip install onnxruntime -i https://pypi.mirrors.ustc.edu.cn.simple/

4 運行demo.py

驗證推理效果,執行命令:

python tools/demo.py --source inference/images

3.3 智能預警系統代碼實戰

智能預警系統包含3個任務:

目標檢測,可行駛區域檢測,車道線檢測

傳感器:前視相機

目標檢測任務:檢測車輛

可行駛區域檢測:主要是hi檢測可以行駛的區域,為自動駕駛提供路徑規劃輔助

車道線檢測:一種環境感知應用,目的是通過車載相機或激光雷達來檢測車道線,

智能預警流程

1.輸入

讀取視頻影像作為輸入,影像尺寸1920*1080

2.預處理

2.1 將輸入尺寸1920*1080 resize + padding到640*640

2.2 歸一化

2.3 640*640*3 --> 1*3*640*640

3. 使用onnx模型進行推理

讀取模型-->準備資料-->推理

得到det_out,da_seg_out, ll_seg_out,shape分別為:(1,n,6) (1,2,640,640) (1,2,640,640)

4.后處理

4.1 將檢測結果,可行駛區域檢測結果,車道線檢測結果,合并到一張影像上,分別用不同的顏色標記出來

4.2 將檢測的幀數,幀率,車輛數等資訊顯示在影像上

5.輸出

獲取最終融合的影像,并保存成視頻,影像尺寸、幀率、編碼是原視頻尺寸、幀率和編碼,

完整的預警代碼

import cv2
import time
import torch
import numpy as np
import onnxruntime as ort
from PIL import Image, ImageDraw, ImageFont
from lib.core.general import non_max_suppression

onnx_path = "weights/yolop-640-640.onnx"


def resize_unscale(img, new_shape=(640, 640), color=114):
shape = img.shape[:2] # current shape [height, width]
if isinstance(new_shape, int):
new_shape = (new_shape, new_shape)

canvas = np.zeros((new_shape[0], new_shape[1], 3))
canvas.fill(color)
# Scale ratio (new / old) new_shape(h,w)
r = min(new_shape[0] / shape[0], new_shape[1] / shape[1])

# Compute padding
new_unpad = int(round(shape[1] * r)), int(round(shape[0] * r)) # w,h
new_unpad_w = new_unpad[0]
new_unpad_h = new_unpad[1]
pad_w, pad_h = new_shape[1] - new_unpad_w, new_shape[0] - new_unpad_h # wh padding

dw = pad_w // 2 # divide padding into 2 sides
dh = pad_h // 2

if shape[::-1] != new_unpad: # resize
img = cv2.resize(img, new_unpad, interpolation=cv2.INTER_AREA)

canvas[dh:dh + new_unpad_h, dw:dw + new_unpad_w, :] = img

return canvas, r, dw, dh, new_unpad_w, new_unpad_h # (dw,dh)


def cv2AddChineseText(img, text, position, textColor=(0, 0, 255), textSize=10):
if (isinstance(img, np.ndarray)): # 判斷是否OpenCV圖片型別
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
# 創建一個可以在給定影像上繪圖的物件
draw = ImageDraw.Draw(img)
# 字體的格式
fontStyle = ImageFont.truetype(
"simsun.ttc", textSize, encoding="utf-8")
# 繪制文本
draw.text(position, text, textColor, font=fontStyle)
# 轉換回OpenCV格式
return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)


def infer(ori_img, img, r, dw, dh, new_unpad_w, new_unpad_h):
ort_session = ort.InferenceSession(onnx_path)
t0 = time.time()
# inference: (1,n,6) (1,2,640,640) (1,2,640,640)
det_out, da_seg_out, ll_seg_out = ort_session.run(
['det_out', 'drive_area_seg', 'lane_line_seg'],
input_feed={"images": img}
)
seconds = time.time() - t0
fps = "%.2f fps" %(1 / seconds) # 幀率

det_out = torch.from_numpy(det_out).float()
boxes = non_max_suppression(det_out)[0] # [n,6] [x1,y1,x2,y2,conf,cls]
boxes = boxes.cpu().numpy().astype(np.float32)
if boxes.shape[0] == 0:
print("no bounding boxes detected.")
return None

# scale coords to original size.
boxes[:, 0] -= dw
boxes[:, 1] -= dh
boxes[:, 2] -= dw
boxes[:, 3] -= dh
boxes[:, :4] /= r
print(f"detect {boxes.shape[0]} bounding boxes.")

img_det = ori_img[:, :, ::-1].copy()
for i in range(boxes.shape[0]):
x1, y1, x2, y2, conf, label = boxes[i]
x1, y1, x2, y2, label = int(x1), int(y1), int(x2), int(y2), int(label)
img_det = cv2.rectangle(img_det, (x1, y1), (x2, y2), (0, 255, 0), 2, 2)

# select da & ll segment area.
da_seg_out = da_seg_out[:, :, dh:dh + new_unpad_h, dw:dw + new_unpad_w]
ll_seg_out = ll_seg_out[:, :, dh:dh + new_unpad_h, dw:dw + new_unpad_w]

da_seg_mask = np.argmax(da_seg_out, axis=1)[0]
ll_seg_mask = np.argmax(ll_seg_out, axis=1)[0]

color_area = np.zeros((new_unpad_h, new_unpad_w, 3), dtype=np.uint8)
color_area[da_seg_mask == 1] = [0, 255, 0]
color_area[ll_seg_mask == 1] = [0, 0, 255]
color_seg = color_area

return img_det, boxes, color_seg, fps


def main(source, save_path):
cap = cv2.VideoCapture(source)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # 獲取視頻的寬度
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 獲取視頻的高度
fps = cap.get(cv2.CAP_PROP_FPS) #
fourcc = cv2.VideoWriter_fourcc(*"mp4v")
#fourcc = int(cap.get(cv2.CAP_PROP_FOURCC)) # 視頻的編碼
#定義視頻物件輸出
writer = cv2.VideoWriter(save_path, fourcc, fps, (width, height))

# 檢查是否匯入視頻成功
if not cap.isOpened():
print("視頻無法打開")
exit()

frame_id = 0
while True:
ret, frame = cap.read()
if not ret:
print("視頻推理完畢...")
break

frame_id += 1
# if frame_id % 3 != 0:
# continue
canvas, r, dw, dh, new_unpad_w, new_unpad_h = resize_unscale(frame, (640, 640))
img = canvas.copy().astype(np.float32) # (3,640,640) RGB
img /= 255.0
img[:, :, 0] -= 0.485
img[:, :, 1] -= 0.456
img[:, :, 2] -= 0.406
img[:, :, 0] /= 0.229
img[:, :, 1] /= 0.224
img[:, :, 2] /= 0.225
img = img.transpose(2, 0, 1)
[]() img = np.expand_dims(img, 0) # (1, 3,640,640)

# 推理
img_det, boxes, color_seg, fps = infer(frame, img, r, dw, dh, new_unpad_w, new_unpad_h)
if img_det is None:
continue

color_mask = np.mean(color_seg, 2)
img_merge = canvas[dh:dh + new_unpad_h, dw:dw + new_unpad_w, :]

# merge: resize to original size
img_merge[color_mask != 0] = \
img_merge[color_mask != 0] * 0.5 + color_seg[color_mask != 0] * 0.5
img_merge = img_merge.astype(np.uint8)
img_merge = cv2.resize(img_merge, (width, height),
interpolation=cv2.INTER_LINEAR)

img_merge = cv2AddChineseText(img_merge, f'幀數:{frame_id} 幀率:{fps} 前方共有 {boxes.shape[0]} 輛車...',
(100, 50), textColor=(0, 0, 255), textSize=30)
img_merge = cv2AddChineseText(img_merge, '前方綠色區域為可行駛區域,紅色為檢出的車道線...',
(100, 100), textColor=(0, 0, 255), textSize=30)

for i in range(boxes.shape[0]):
x1, y1, x2, y2, conf, label = boxes[i]
x1, y1, x2, y2, label = int(x1), int(y1), int(x2), int(y2), int(label)
img_merge = cv2.rectangle(img_merge, (x1, y1), (x2, y2), (0, 255, 0), 2, 2)

# cv2.imshow('img_merge', img_merge)
# cv2.waitKey(0)
writer.write(img_merge)

cap.release() # 釋放攝像頭
writer.release() # 可以實作預覽
cv2.destroyAllWindows()

if __name__=="__main__":
source = 'inference/videos/1.mp4'
save_path = '/home/AidLux_Course/YOLOP/inference/output/test.mp4'
main(source, save_path)

代碼運行結果:

4.總結

感謝成都阿加犀公司舉辦的訓練營課程,讓筆者能夠學習自動駕駛的基礎知識,以及自動駕駛演算法在移動端的部署,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/556951.html

標籤:其他

上一篇:共探AI大模型時代下的挑戰與機遇,華為云HCDE與大模型專家面對面

下一篇:返回列表

標籤雲
其他(162341) Python(38273) JavaScript(25528) Java(18294) C(15239) 區塊鏈(8275) C#(7972) AI(7469) 爪哇(7425) MySQL(7292) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5876) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4615) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2438) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) HtmlCss(1994) .NET技术(1986) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1882) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 基于AidLux的自動駕駛智能預警應用方案

    1. 自動駕駛感知演算法及AidLux相關方案介紹 1.1自動駕駛 自動駕駛汽車,又稱無人駕駛車、電腦駕駛車、無人車、自駕車,是一種需要駕駛員輔助駕駛或者完全不需要操控的車輛。作為自動化載具,自動駕駛汽車可以不需要人類操作即能感知環境及導航。 1.2 自動駕駛系統的組成部分 1.2.1 環境感知系統 ......

    uj5u.com 2023-07-11 08:02:56 more
  • 共探AI大模型時代下的挑戰與機遇,華為云HCDE與大模型專家面對面

    摘要:近日,華為開發者大會2023(cloud)“開發者生態創新發展圓桌會議”在東莞華為溪流背坡村成功舉辦。 2023年7月8日,華為開發者大會2023(cloud)“開發者生態創新發展圓桌會議”在東莞華為溪流背坡村成功舉辦。以大模型為代表的的新一輪人工智能技術浪潮洶涌而來,在圓桌會議上,華為技術專 ......

    uj5u.com 2023-07-11 08:02:39 more
  • 跨境電商企業出海,注意五大業務欺詐風險!

    中國跨境出海業務快速發展并呈現出積極的現狀,越來越多的中國企業開始探索海外市場,尋求更大的發展機遇和國際化的競爭優勢。 從國有企業到民營企業,從基建、外貿專案到制造業、服務業、高端科技企業,從東南亞延伸至“一帶一路”沿線國家和地區,中國企業“走出去”步伐逐漸加快。資料顯示,2022年,中歐貿易逆勢增 ......

    uj5u.com 2023-07-11 08:02:34 more
  • 華為云開發者聯盟助力培養數字化人才,加速應用構建質效提升

    摘要:大會第三天依舊熱鬧非凡,精彩活動紛至沓來。眾人矚目的專題論壇如期舉行,專家們圍繞技術開發、行業實踐最新趨勢,分享寶貴經驗和深刻見解。 本文分享自華為云社區《華為云開發者聯盟助力培養數字化人才,加速應用構建質效提升》,作者:華為云社區精選 。 在前兩天的大會期間,我們不僅享受了精彩的云技術盛宴, ......

    uj5u.com 2023-07-11 08:02:06 more
  • 高尿酸血癥與痛風指南

    # 高尿酸血癥與痛風指南 ::: warning 閱前提醒 本文章內容均整理自參考文獻,僅做為學習資料,請不要作為病情診斷依據,如感覺身體不適請立即前往醫院請專業醫生判斷病情,并遵循醫囑進行相應治療。 ::: 痛風(gout)是嘌呤代謝紊亂和(或)尿酸排泄減少所引起的一種晶體性關節炎。 臨床表現為高 ......

    uj5u.com 2023-07-11 08:01:58 more
  • 二分查找

    # 二分查找 ## 簡介 二分查找(Binary Search)是一種高效的搜索演算法,用于在 **有序陣列(或有序串列)** 中查找特定元素的位置。它將目標值與陣列的中間元素進行比較,并根據比較結果縮小搜索范圍,直到找到目標值或確定目標值不存在。 **二分查找的關鍵點是每次迭代都能將搜索范圍縮小一半 ......

    uj5u.com 2023-07-11 08:01:53 more
  • Stable Diffusion AIGC:3步成為P圖大師

    摘要:instructPix2Pix文字編輯圖片是一種純文本編輯影像的方法,用戶提供一張圖片和文本編輯指令,告訴模型要做什么,模型根據編輯指令編輯輸入的影像,最終輸出用戶想要的影像。 本文分享自華為云社區《【云駐共創】Stable Diffusion AIGC限時0元!3步成為P圖大師》,作者:香菜 ......

    uj5u.com 2023-07-11 08:01:36 more
  • Kernel-Pwn-FGKASLR保護繞過

    FGASLR(Function Granular KASLR)是KASLR的加強版,增加了更細粒度的地址隨機化。因此在開啟了FGASLR的內核中,即使泄露了內核的程式基地址也不能呼叫任意的內核函式。 ......

    uj5u.com 2023-07-11 08:01:16 more
  • 淺談常態化壓測 | 京東物流技術團隊

    隨著業務的不斷增長,支撐業務系統的壓力也逐漸增加,會面臨如系統越來越厚重、邏輯越來復雜、迭代節奏越來越快等繁雜的情況。我們當前并沒有做到在每次變化時快速識別出性能風險,檢測產品或系統的穩定性、可靠性,而且我們還在不斷的投入人力成本在壓測這件事情上也是不合理的,所以我們要將性能驗證融入到我們日常的作業... ......

    uj5u.com 2023-07-11 08:00:50 more
  • 有了紅黑樹,為啥還要跳表?

    本文繼續從二分搜索出發,推匯出另一種平衡樹結構:跳表。跳表是一種簡單而精巧的資料結構,和紅黑樹具備同等時間復雜度的同時,保持了足夠的簡單性——這種簡單性的關鍵是通過概率決定索引層數。 ......

    uj5u.com 2023-07-11 08:00:33 more