機器翻譯:Hugging Face庫詳解

文章目錄

    • 一、Hugging Face概述
      • 1.1 Hugging Face介紹
      • 1.2 核心理念:模型即服務,但以開源形式
    • 二、核心架構
      • 2.1 Transformers庫:模型交互的統一接口
      • 2.2 Datasets庫:高效的數據處理引擎
      • 2.3 Tokenizers庫:文本與模型的“翻譯官”
      • 2.4 accelerate`庫:分布式訓練的簡化器
      • 2.5 evaluate`庫:標準化的評估
    • 三、完整工作流——從零開始微調一個機器翻譯模型
    • 四、生態系統:Hugging Face Hub

Hugging Face的Transformers庫為機器翻譯任務提供了強大的支持,通過其豐富的預訓練模型、靈活的API和高效的性能,顯著降低了開發門檻并提升了翻譯質量。

一、Hugging Face概述

1.1 Hugging Face介紹

在自然語言處理的浪潮中,如果說Transformer架構是驅動模型飛速前進的強大引擎,那么Hugging Face庫無疑是為這臺引擎提供全套、易用、標準化“燃料”和“工具箱”的超級補給站。它不僅僅是一個Python庫,更是一個完整的生態系統,一個開源社區,以及一個連接學術界前沿研究與工業界實際應用的橋梁。對于任何從事機器翻譯、文本分類、問答系統等NLP任務的開發者和研究人員而言,深入理解Hugging Face是通往成功的必經之路。

1.2 核心理念:模型即服務,但以開源形式

Hugging Face的核心哲學是民主化AI。他們致力于讓每個人,無論其規模或資源如何,都能輕松地使用和構建最先進的AI模型。這主要通過以下方式實現:

  1. 統一接口:為數千個不同的預訓練模型提供標準化的API,用戶無需關心模型的具體內部結構。
  2. 一站式平臺:提供從模型、數據集、訓練工具到模型部署的完整解決方案。
  3. 強大的社區:通過其平臺(Hugging Face Hub)鼓勵社區貢獻,形成一個由研究人員、開發者和企業組成的龐大生態系統,共享模型、數據集和應用程序。

二、核心架構

Hugging Face的庫由幾個相互關聯的核心庫組成,它們協同工作,構成了一個強大的NLP工具鏈。

  1. transformers:這是整個生態系統的基石。它提供了與數千個預訓練模型交互的API,包括BERT、GPT、T5、RoBERTa等。
  2. datasets:一個高效、易用的數據處理庫,用于加載、處理和共享數據集。它解決了傳統Python庫(如Pandas和NumPy)在處理大型數據集時遇到的內存和性能問題。
  3. tokenizers:一個快速、易于使用的文本分詞庫。它支持SentencePiece、BPE等現代分詞算法,是transformers庫的核心依賴。
  4. accelerate:簡化了在多GPU、多TPU甚至多臺機器上訓練模型的流程。它自動處理設備 placement、數據并行和模型并行等復雜細節,讓開發者可以專注于模型邏輯。
  5. evaluate:一個用于評估模型性能的庫,提供了數十種標準化的評估指標(如準確率、F1分數、BLEU、ROUGE等),使評估過程變得一致和可復現。

Hugging Face生態的強大,建立在三個核心庫之上:transformersdatasetstokenizers。它們協同工作,構成了一個高效、流暢的NLP工作流。

2.1 Transformers庫:模型交互的統一接口

transformers是Hugging Face的旗艦庫,也是整個生態的基石。它就像一個“模型中央廣場”,匯集了幾乎所有主流的預訓練模型。其核心思想是“預訓練 + 微調”。

核心功能:

  1. 模型庫transformers內置了數千個預訓練模型,覆蓋了從經典的BERT、RoBERTa、GPT系列到最新的T5、BART、Llama、Mistral等。每個模型都有對應的AutoModelAutoTokenizer,可以根據模型名稱自動加載正確的架構和分詞器,極大地方便了用戶。
  2. 統一的API:無論是哪種模型,其核心API都遵循一個設計哲學:簡單、直觀。
    • pipeline()函數:這是transformers庫最強大的“魔法”。它將模型、分詞器和預處理/后處理步驟打包成一個高級API,讓用戶無需關心底層細節,一行代碼即可完成復雜的NLP任務。
    • AutoClass家族AutoModelForSequenceClassificationAutoModelForCausalLMAutoModelForSeq2SeqLM等類,可以根據任務類型自動加載正確的模型頭,為特定任務(如分類、生成、翻譯)做好準備。
  3. 高級功能
    • PyTorch/TensorFlow/JAX兼容:模型可以無縫地在任何一種主流深度學習框架中使用。
    • 模型微調:提供了Trainer API,它封裝了訓練循環,包括優化器設置、學習率調度、混合精度訓練、分布式訓練等復雜功能,讓模型微調變得異常簡單。
    • 模型量化:提供了多種量化方法(如bitsandbytes),可以將大模型壓縮到8位甚至4位,顯著減少顯存占用和推理延遲,使在消費級硬件上運行大模型成為可能。

實踐案例:使用pipeline進行機器翻譯

from transformers import pipeline
# 1. 創建一個翻譯pipeline
# 默認使用Helsinki-NLP模型,支持多種語言對
translator = pipeline("translation_en_to_zh", model="Helsinki-NLP/opus-mt-en-zh")
# 2. 直接輸入文本,得到翻譯結果
english_text = "Hugging Face is a community-based open-source platform for machine learning."
result = translator(english_text)
print(result)
# 輸出: [{'translation_text': 'Hugging Face 是一個基于社區的機器學習開源平臺。'}]

這段代碼背后,pipeline自動完成了以下工作:

  • 根據任務translation_en_to_zh,從Model Hub上下載了對應的模型(Helsinki-NLP/opus-mt-en-zh)和分詞器。
  • 對輸入的英文文本進行分詞、轉換為模型輸入的ID序列。
  • 將ID序列輸入模型,獲得輸出的ID序列。
  • 將輸出的ID序列解碼回中文文本。
  • 將結果格式化為一個字典列表。

2.2 Datasets庫:高效的數據處理引擎

傳統的機器學習工作流中,數據加載和預處理往往是性能瓶頸。datasets庫旨在解決這個問題,它由Hugging Face與Google合作開發,以其高效、靈活和易于使用而著稱。

核心優勢:

  1. 內存映射:這是datasets庫的殺手锏。數據集被存儲在磁盤上,而不是全部加載到RAM中。當需要訪問數據時,操作系統會按需將其加載到內存中。這使得處理TB級別的海量數據集成為可能,而內存占用極小。
  2. 快速、懶加載:數據集只在首次被訪問時才加載和處理,極大地加快了腳本的啟動速度。
  3. 豐富的數據集datasets庫內置了數百個高質量、經過預處理的數據集,包括GLUE、SuperGLUE、SQuAD、WMT等NLP領域的基準測試集,以及各種多語言、情感分析、問答等任務的數據集。
  4. 強大的數據處理API
    • .map()方法:類似于Pandas的apply,可以對數據集中的每個樣本應用一個處理函數。它支持多進程處理,速度極快。
    • .filter()方法:根據條件過濾數據集。
    • .set_format()方法:可以輕松地將數據集格式轉換為PyTorch Tensor、TensorFlow Tensor或NumPy數組,無縫對接深度學習框架。

實踐案例:加載并預處理一個數據集

from datasets import load_dataset
# 1. 加載SQuAD v2數據集
raw_datasets = load_dataset("squad_v2")
# 2. 查看數據集結構
print(raw_datasets)
# 輸出: DatasetDict({
#     train: Dataset({
#         features: ['id', 'title', 'context', 'question', 'answers'],
#         num_rows: 130319
#     })
#     validation: Dataset({
#         features: ['id', 'title', 'context', 'question', 'answers'],
#         num_rows: 11873
#     })
# })
# 3. 對數據集進行預處理,例如提取問題
def extract_question(example):return {"question_text": example["question"]}
# 使用.map()高效地應用處理函數
processed_datasets = raw_datasets.map(extract_question, batched=True)
print(processed_datasets["train"][0]["question_text"])
# 輸出: When did Beyoncé start becoming popular?

2.3 Tokenizers庫:文本與模型的“翻譯官”

模型無法直接理解文本,它只能處理數字。tokenizers庫負責將文本字符串轉換為模型能夠理解的數字序列(即token IDs),并將模型的輸出數字序列解碼回文本。它不是一個簡單的“按空格切分”的工具,而是一個高度優化的、支持子詞的文本處理系統。

核心功能:

  1. 多種算法:支持多種主流的tokenization算法,包括WordPiece(BERT)、Byte-Pair Encoding(GPT)、SentencePiece(T5、XLM-R)等。這些算法能夠有效地處理未登錄詞和形態豐富的語言。
  2. 訓練與使用:可以獨立訓練一個分詞器,也可以直接加載與預訓練模型配套的預訓練分詞器。確保分詞器與模型的一致性至關重要,因為模型的詞匯表和編碼方式是在預訓練階段固定的。
  3. 高性能:用Rust編寫,并提供了Python和Rust的API,其處理速度遠超傳統的Python實現,非常適合大規模數據處理。
  4. 豐富的特性:支持添加特殊token(如[CLS], [SEP], [PAD])、填充、截斷、注意力掩碼生成等。

實踐案例:使用預訓練分詞器

from transformers import AutoTokenizer
# 1. 加載與BERT模型配套的分詞器
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
# 2. 對文本進行編碼
text = "Here is an example of using a tokenizer."
encoded_inputs = tokenizer(text)
# encoded_inputs 是一個包含多個字段的字典
print(encoded_inputs)
# 輸出: {
#     'input_ids': [101, 2180, 2003, 1037, 7592, 2023, 2015, 1037, 24618, 1012, 102],
#     'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
#     'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
# }
# 3. 解碼
decoded_text = tokenizer.decode(encoded_inputs["input_ids"])
print(decoded_text)
# 輸出: [CLS] here is an example of using a tokenizer. [SEP]

input_ids是模型真正輸入的數字序列。token_type_ids用于區分句子對(如問答任務中的問題和上下文)。attention_mask告訴模型哪些位置是真實token,哪些是填充的token([PAD]),以便模型在計算注意力時忽略這些位置。

2.4 accelerate`庫:分布式訓練的簡化器

在多GPU或多TPU上進行訓練是深度學習的標準配置,但其配置過程非常復雜。accelerate庫通過一個簡單的配置文件(accelerate config)來處理所有復雜性。
核心功能:

  • 自動設備分配:自動將模型和數據分配到可用的GPU/TPU上。
  • 支持多種并行策略:無縫支持數據并行、模型并行和流水線并行。
  • 統一代碼:用一套相同的代碼可以在單GPU、多GPU、多TPU或CPU上運行,只需修改配置即可。

2.5 evaluate`庫:標準化的評估

評估模型性能是訓練過程中至關重要的一步。evaluate庫提供了一套標準化的、可復現的評估指標。
使用示例:

import evaluate
# 加載一個評估指標
bleu_metric = evaluate.load("bleu")
# 預測和參考
predictions = [["the", "cat", "is", "on", "the", "mat"]]
references = [["there", "is", "a", "cat", "on", "the", "mat"]]
# 計算分數
results = bleu_metric.compute(predictions=predictions, references=references)
print(results)
# 輸出: {'bleu': 0.5..., 'precisions': [...], 'brevity_penalty': 1.0, 'length_ratio': 0.857..., 'translation_length': 5, 'reference_length': 7}

三、完整工作流——從零開始微調一個機器翻譯模型

為了更直觀地展示Hugging Face庫的威力,我們以一個完整的例子:微調一個Helsinki-NLP/opus-mt-en-ro(英譯羅曼尼亞語)模型,來串聯起datasetstokenizerstransformers

步驟一:加載數據集
我們使用Hugging Face Hub上提供的羅馬尼亞語-英語平行語料集。

from datasets import load_dataset
raw_datasets = load_dataset("Helsinki-NLP/opus-100", "en-ro")
# 查看數據集大小
print(f"訓練集大小: {len(raw_datasets['train'])}, 驗證集大小: {len(raw_datasets['validation'])}")

步驟二:加載模型和分詞器

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
model_checkpoint = "Helsinki-NLP/opus-mt-en-ro"
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)
model = AutoModelForSeq2SeqLM.from_pretrained(model_checkpoint)

步驟三:數據預處理
我們需要定義一個預處理函數,該函數將接收一批樣本,進行分詞,并將輸入和輸出序列填充到相同的長度。

max_length = 128
def preprocess_function(examples):inputs = [ex["en"] for ex in examples["translation"]]targets = [ex["ro"] for ex in examples["translation"]]model_inputs = tokenizer(inputs, max_length=max_length, truncation=True)# 使用目標語言作為標簽,并設置decoder_input_idswith tokenizer.as_target_tokenizer():labels = tokenizer(targets, max_length=max_length, truncation=True)model_inputs["labels"] = labels["input_ids"]return model_inputs
# 將預處理函數應用到整個數據集
tokenized_datasets = raw_datasets.map(preprocess_function, batched=True)

步驟四:定義訓練參數
使用Seq2SeqTrainingArguments來配置訓練過程中的所有超參數和設置。

from transformers import Seq2SeqTrainingArguments, Seq2SeqTrainer
batch_size = 16
args = Seq2SeqTrainingArguments(f"marian-finetuned-en-ro",evaluation_strategy="epoch",learning_rate=2e-5,per_device_train_batch_size=batch_size,per_device_eval_batch_size=batch_size,weight_decay=0.01,save_total_limit=3,num_train_epochs=3,predict_with_generate=True,  # 對于Seq2Seq任務,使用生成方式進行評估fp16=True, # 使用混合精度訓練,需要GPU支持
)

步驟五:定義評估指標
機器翻譯任務通常使用ROUGE或BLEU分數來評估。這里我們使用sacrebleu庫。

import numpy as np
import evaluate
metric = evaluate.load("sacrebleu")
def postprocess_text(preds, labels):preds = [pred.strip() for pred in preds]labels = [[label.strip()] for label in labels]return preds, labels
def compute_metrics(eval_preds):preds, labels = eval_predsif isinstance(preds, tuple):preds = preds[0]# 對于生成任務,需要解碼預測結果decoded_preds = tokenizer.batch_decode(preds, skip_special_tokens=True)labels = np.where(labels != -100, labels, tokenizer.pad_token_id)decoded_labels = tokenizer.batch_decode(labels, skip_special_tokens=True)# 后處理文本decoded_preds, decoded_labels = postprocess_text(decoded_preds, decoded_labels)result = metric.compute(predictions=decoded_preds, references=decoded_labels)result = {"bleu": result["score"]}prediction_lens = [np.count_nonzero(pred != tokenizer.pad_token_id) for pred in preds]result["gen_len"] = np.mean(prediction_lens)result = {k: round(v, 4) for k, v in result.items()}return result

步驟六:創建Trainer并開始訓練
Trainer會自動處理訓練循環、評估、日志記錄和模型保存。

from transformers import DataCollatorForSeq2Seq
data_collator = DataCollatorForSeq2Seq(tokenizer, model=model)
trainer = Seq2SeqTrainer(model,args,train_dataset=tokenized_datasets["train"],eval_dataset=tokenized_datasets["validation"],data_collator=data_collator,tokenizer=tokenizer,compute_metrics=compute_metrics,
)
trainer.train()

訓練完成后,模型會保存在指定的目錄marian-finetuned-en-ro中,可以直接用于推理。

四、生態系統:Hugging Face Hub

Hugging Face的成功遠不止于這三個核心庫。其強大的生態系統還包括:

  • Model Hub (模型中心):一個擁有超過35萬個模型的在線倉庫。它就像PyPI之于Python,Docker Hub之于Docker,是模型發現、下載和分享的中心。每個模型頁面都提供了詳細的卡片信息、使用示例和在線演示。
  • Spaces (空間):一個基于Gradio和Streamlit的平臺,讓開發者可以輕松地將自己的模型或應用部署為交互式網頁,無需關心服務器和后端。這極大地促進了模型的展示、社區反饋和快速原型驗證。
  • Inference API (推理API):為Model Hub上的模型提供REST API服務,允許開發者在自己的應用中直接調用強大的預訓練模型,而無需下載和運行模型本身。
  • Accelerate:一個簡化PyTorch分布式訓練的庫,讓用戶可以用幾行代碼配置訓練環境,在單機多卡或多機多卡上運行訓練,而無需深入復雜的torch.distributed API。
  • Open LLM Leaderboard:一個開放的、社區驅動的排行榜,用于評估開源大語言模型在各種基準測試上的性能,為模型選擇提供了重要參考。

結論: Hugging Face庫不僅僅是一套工具,它是一種理念的勝利。它通過標準化、社區化和易用化,將自然語言處理從一個由少數巨頭和精英實驗室把持的領域,轉變為一個全球開發者、研究人員和企業都能參與和貢獻的民主化平臺。對于機器翻譯而言,Hugging Face提供了從數據獲取、模型選擇、高效預處理、快速微調到部署評估的全套解決方案,使得開發一個高質量的、可定制的翻譯系統從未如此簡單。對于任何希望在NLP領域有所作為的人來說,精通Hugging Face,就是掌握了通往未來的鑰匙。

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

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

相關文章

服務器安裝gielab社區版

第一步:安裝Gitlab 1,使用的是CentOs鏡像(服務器最低配置為4核8g內存才行要不然帶不動) 登錄目標實例。 2,執行如下命令,安裝所需依賴。 1 sudo yum install -y curl policycoreutils-python openssh-server 3,執行如下命令,啟動SSH服務…

C#報錯:System.NullReferenceException:“未將對象引用設置到對象的實例。”

C#使用自定義的類創建數組時,使用時報錯,報錯內容如下圖:原因:C#中的數組是引用類型。當聲明自定義類數組時,數組本身會被創建,但其元素(即自定義類的實例)默認未被實例化&#xff0…

Maven 的 module 管理

一、Maven 的 module 管理 1. 什么是 Maven module? Maven module(模塊),是 Maven 多模塊項目結構(multi-module project)中的核心概念。它允許你將一個大型項目拆分為若干獨立的小項目(模塊&am…

現在都是APP,小程序搶購,支持瀏覽器不支持 SSE

在 APP 和小程序搶購場景中,通常不原生支持SSE(Server-Sent Events),這與瀏覽器對 SSE 的支持情況不同,具體如下:APP:一般情況下,APP 端不支持原生 SSE。若使用 UniApp 開發&#xf…

Spring Boot 深度解析:從原理到實踐

一、Spring Boot 本質與核心價值 1.1 什么是 Spring Boot? Spring Boot 是 Spring 生態的革命性框架,旨在解決傳統 Spring 開發的復雜性。它通過"約定優于配置"(Convention Over Configuration)理念,提供開箱…

WebSocket-java篇

問題引入消息推送的方式我們要實現,服務器把消息推送到客戶端,可以輪訓,長輪訓還有sseWebSocket理論WebSocket 的由來與核心價值誕生背景:解決 HTTP 協議在實時通信中的固有缺陷(單向請求-響應模式)核心驅動…

用Python從零開始實現神經網絡

反向傳播算法用于經典的前饋人工神經網絡。 它仍然是訓練大型深度學習網絡的技術。 在這個教程中,你將學習如何用Python從頭開始實現神經網絡的反向傳播算法。 完成本教程后,您將了解: 如何將輸入前向傳播以計算輸出。如何反向傳播錯誤和…

算法148. 排序鏈表

題目:給你鏈表的頭結點 head ,請將其按 升序 排列并返回 排序后的鏈表 。示例 1:輸入:head [4,2,1,3] 輸出:[1,2,3,4] 示例 2:輸入:head [-1,5,3,4,0] 輸出:[-1,0,3,4,5] 示例 3&a…

在騰訊云CodeBuddy上實現一個AI聊天助手

在騰訊云CodeBuddy上實現一個AI聊天助手項目 在當今數字化時代,AI聊天助手已經成為一種非常流行的應用,廣泛應用于客戶服務、智能助手等領域。今天,我們將通過騰訊云CodeBuddy平臺,實現一個基于Spring Boot和OpenAI API的AI聊天助…

JavaScript Array.prototype.flatMap ():數組 “扁平化 + 映射” 的高效組合拳

在 JavaScript 數組處理中,我們經常需要先對每個元素進行轉換(映射),再將結果 “鋪平”(扁平化)。比如將數組中的每個字符串按空格拆分,然后合并成一個新數組。傳統做法是先用map()轉換&#xf…

區塊鏈與元宇宙:數字資產的守護者

1 區塊鏈支撐元宇宙數字資產的底層邏輯1.1 不可篡改性構建信任基石區塊鏈的不可篡改性為元宇宙數字資產提供了堅實的信任基礎。其核心在于分布式賬本技術,當一筆數字資產交易發生時,會被打包成區塊并廣播至網絡中的所有節點。每個節點都會對這筆交易進行…

Linux軟件編程:進程和線程(進程)

進程一、基本概念進程:是程序動態執行過程,包括創建、調度、消亡程序:存放在外存的一段數據的集合二、進程創建(一)進程空間分布每個進程運行起來后,操作系統開辟0-4G的虛擬空間進程空間:用戶空…

Mybatis學習筆記(五)

分頁插件與性能優化 分頁插件配置 簡要描述:MybatisPlus分頁插件是基于物理分頁實現的高性能分頁解決方案,支持多種數據庫的分頁語法,能夠自動識別數據庫類型并生成對應的分頁SQL。 核心概念: 物理分頁:直接在SQL層面進…

企業可商用的conda:「Miniforge」+「conda-forge」

文章目錄一、徹底卸載現有 Anaconda/Miniconda二、安裝 Miniforge(推薦)macOS/Linux檢查Windows檢查三、將通道固定為 conda-forge(嚴格優先)四、驗證是否仍引用 Anaconda 源五、常見問題(FAQ)六、參考命令…

Flutter ExpansionPanel組件(可收縮的列表)

可以展開或者收縮的面板組件,收縮面板組件效果由ExpansionPanelList組件和ExpansionPanel組件共同完成。 ExpansionPanelList屬性說明屬性說明children子元素expansionCallback設置回調事件ExpansionPanel屬性說明headerBuilder收縮的標題body內容isExpanded設置內容…

C/C++ 進階:深入解析 GCC:從源碼到可執行程序的魔法四步曲

引言距離上一篇博客更新已經過去了大概一兩周的時間,而對于 Linux 系統的基本指令以及 Shell 編程的學習其實基本講解完畢,Linux基礎一塊的知識就將告一段落了,如果有細節性的知識,我也會及時分享給各位,作為一名正在攀…

云服務器運行持續強化學習COOM框架的問題

1 環境要求 下載地址:https://github.com/TTomilin/COOM tensorflow 2.11以上 python 3.9以上 tensorflow2.12.0,需要安裝tensorflow-probability0.19 2 修改代碼 COOM/wrappers/reward.py 將 from gym import RewardWrapper修改為 from gymnasium impor…

MyBatis Interceptor 深度解析與應用實踐

MyBatis Interceptor 深度解析與應用實踐 一、MyBatis Interceptor概述 1.1 什么是MyBatis Interceptor MyBatis Interceptor,也稱為MyBatis 插件,是 MyBatis 提供的一種擴展機制,用于在 MyBatis 執行 SQL 的過程中插入自定義邏輯。它類似…

【自動化測試】Web自動化測試 Selenium

🔥個人主頁: 中草藥 🔥專欄:【Java】登神長階 史詩般的Java成神之路 測試分類 了解各種各樣的測試方法分類,不是為了墨守成規按照既定方法區測試,而是已了解思維為核心,并了解一些專業名詞 根…

2025 電賽 C 題完整通關攻略:從單目標定到 2 cm 測距精度的全流程實戰

摘要 2025 年全國大學生電子設計競賽 C 題要求“僅用一顆固定攝像頭”在 5 s 內完成 100 cm~200 cm 距離、誤差 ≤2 cm 的單目測距,并實時顯示功耗。本文整合國一選手方案、CSDN 高分博文、B 站實測視頻及官方說明,給出從硬件選型→離線標定→在線算法→…