中的對(duì)比實(shí)驗(yàn)與工程實(shí)踐)
1. 項(xiàng)目概述當(dāng)YOLOv7遇見甲骨文最近在整理一些歷史文獻(xiàn)資料時(shí)發(fā)現(xiàn)一個(gè)挺有意思的挑戰(zhàn)如何從一堆考古發(fā)掘的拓片或照片里快速、準(zhǔn)確地找出那些刻在龜甲獸骨上的古老文字——也就是甲骨文。這活兒要是純靠人眼不僅效率低還容易因?yàn)橐曈X疲勞看漏看錯(cuò)。作為一個(gè)常年混跡在計(jì)算機(jī)視覺和深度學(xué)習(xí)圈子的從業(yè)者我第一反應(yīng)就是能不能用目標(biāo)檢測(cè)模型來“代勞”這個(gè)想法催生了今天要聊的項(xiàng)目構(gòu)建一個(gè)針對(duì)文本考古場(chǎng)景的甲骨文字符圖像檢測(cè)識(shí)別系統(tǒng)。簡(jiǎn)單說就是給電腦“喂”大量帶有甲骨文的圖片訓(xùn)練它學(xué)會(huì)自動(dòng)定位圖片中的每一個(gè)甲骨文字符并用框標(biāo)出來。這不僅僅是簡(jiǎn)單的“找東西”因?yàn)榧坠俏淖中螐?fù)雜、筆畫粘連、背景干擾多比如龜甲裂紋、污漬對(duì)模型的精度和魯棒性要求很高。我選擇了YOLOv7作為這次探索的基石。原因很簡(jiǎn)單YOLO系列在速度和精度上的平衡一直做得不錯(cuò)而v7版本在架構(gòu)和訓(xùn)練策略上又有不少優(yōu)化。但YOLOv7本身也有多個(gè)不同復(fù)雜度的變體比如輕量級(jí)的YOLOv7-tiny、均衡型的YOLOv7以及高性能的YOLOv7x。用同一個(gè)甲骨文數(shù)據(jù)集分別訓(xùn)練這三個(gè)模型會(huì)有什么樣的表現(xiàn)tiny版能不能在資源受限的設(shè)備比如考古現(xiàn)場(chǎng)的便攜終端上跑起來x版的高精度又需要付出多大的計(jì)算代價(jià)這些都是我想通過這個(gè)項(xiàng)目弄明白的。所以這個(gè)項(xiàng)目的核心就是一場(chǎng)“控制變量”式的對(duì)比實(shí)驗(yàn)。我們將使用同一套數(shù)據(jù)預(yù)處理流程、相同的訓(xùn)練策略當(dāng)然學(xué)習(xí)率等超參數(shù)會(huì)針對(duì)不同模型微調(diào)來訓(xùn)練YOLOv7-tiny, YOLOv7, YOLOv7x三個(gè)模型并在一個(gè)統(tǒng)一的測(cè)試集上評(píng)估它們的表現(xiàn)。最終目標(biāo)不僅僅是得到一個(gè)可用的檢測(cè)器更是要理清在不同應(yīng)用場(chǎng)景如實(shí)時(shí)現(xiàn)場(chǎng)篩查 vs. 高精度后期分析下模型選型的依據(jù)和權(quán)衡點(diǎn)。2. 核心需求解析與挑戰(zhàn)應(yīng)對(duì)2.1 甲骨文檢測(cè)的特殊性甲骨文圖像檢測(cè)和我們常見的自然場(chǎng)景目標(biāo)檢測(cè)比如檢測(cè)行人、車輛有很大不同這直接決定了我們模型設(shè)計(jì)和數(shù)據(jù)處理的方向。首先目標(biāo)尺度變化極大。一張拓片圖上可能同時(shí)存在占據(jù)數(shù)十個(gè)像素的“大字”和只有寥寥幾個(gè)像素的“小字”。模型必須同時(shí)具備捕捉大目標(biāo)上下文信息和小目標(biāo)細(xì)節(jié)特征的能力。其次背景復(fù)雜且干擾性強(qiáng)。龜甲獸骨本身有紋理、有裂紋歷經(jīng)千年還有各種腐蝕和污漬這些都很容易被模型誤認(rèn)為是文字的筆畫。再者字形結(jié)構(gòu)復(fù)雜且不規(guī)范。甲骨文是象形文字同一個(gè)字可能有多種變體筆畫粘連、斷裂的情況非常普遍這對(duì)檢測(cè)框的回歸和分類都是挑戰(zhàn)。最后數(shù)據(jù)稀缺且標(biāo)注成本高。公開的、高質(zhì)量的、帶有精確框標(biāo)注的甲骨文數(shù)據(jù)集非常少我們往往需要從零開始收集和標(biāo)注這要求我們的模型和數(shù)據(jù)增強(qiáng)策略必須非常高效能在有限的數(shù)據(jù)上學(xué)到強(qiáng)健的特征。2.2 模型選型為何是YOLOv7及其變體面對(duì)上述挑戰(zhàn)我們需要一個(gè)在精度、速度和泛化能力上都有不錯(cuò)基礎(chǔ)的檢測(cè)框架。YOLOv7You Only Look Once version 7在2022年提出它并非官方Y(jié)OLO系列但其改進(jìn)在當(dāng)時(shí)引起了廣泛關(guān)注。它主要的吸引力在于架構(gòu)優(yōu)化引入了類似ELAN的高效層聚合網(wǎng)絡(luò)加強(qiáng)了特征融合能力在頭部使用了“解耦頭”將分類和回歸任務(wù)分開有助于提升精度。訓(xùn)練策略提出了“可訓(xùn)練的Bag-of-Freebies”包括計(jì)劃重參數(shù)化卷積、梯度流優(yōu)化等讓模型在不增加推理成本的情況下獲得性能提升。模型縮放提供了從tiny到x的一系列模型讓我們可以方便地在速度和精度之間做權(quán)衡。具體到三個(gè)變體YOLOv7-tiny深度和寬度都最小參數(shù)量少計(jì)算量低推理速度極快。目標(biāo)是驗(yàn)證在極端資源受限條件下如移動(dòng)端、嵌入式設(shè)備的可行性。YOLOv7默認(rèn)的基準(zhǔn)模型在速度和精度間取得平衡。我們的主要參照系看中等復(fù)雜度模型能否滿足大部分精度要求。YOLOv7x“X”意味著extra擁有更深的網(wǎng)絡(luò)和更多的通道數(shù)特征提取和融合能力最強(qiáng)預(yù)期精度最高但模型體積和計(jì)算需求也最大。用于探索當(dāng)前任務(wù)下的精度上限。通過對(duì)比這三者我們就能繪制出針對(duì)甲骨文檢測(cè)任務(wù)的“模型性能-計(jì)算資源”曲線為實(shí)際部署提供直接依據(jù)。2.3 系統(tǒng)核心需求拆解基于項(xiàng)目目標(biāo)我們需要構(gòu)建的系統(tǒng)應(yīng)滿足以下核心需求高精度檢測(cè)在復(fù)雜的甲骨文圖像上模型需要達(dá)到高的平均精度mAP尤其是對(duì)于小字符的召回率Recall要足夠高不能漏檢。多尺度適應(yīng)性模型必須能有效檢測(cè)不同尺度的字符從占據(jù)圖像大部分區(qū)域的大字到邊緣處的小字。抗干擾能力強(qiáng)對(duì)龜甲裂紋、污漬、背景噪聲等有較好的魯棒性降低誤檢率。可變的部署靈活性系統(tǒng)設(shè)計(jì)應(yīng)支持導(dǎo)出不同格式的模型如PyTorch的.pt ONNX甚至TensorRT引擎以適應(yīng)從服務(wù)器到邊緣設(shè)備的不同部署環(huán)境。完整的評(píng)估體系不僅要看mAP還要分析參數(shù)量Params、計(jì)算量GFLOPs、推理速度FPS以及針對(duì)小目標(biāo)的具體指標(biāo)形成全面的模型評(píng)估報(bào)告。3. 數(shù)據(jù)準(zhǔn)備與預(yù)處理策略3.1 數(shù)據(jù)收集與標(biāo)注數(shù)據(jù)是模型的“糧食”。對(duì)于甲骨文這樣的專業(yè)領(lǐng)域公開數(shù)據(jù)集極少。我們的數(shù)據(jù)主要來源于公開的甲骨文拓片圖庫如國學(xué)大師、古籍文獻(xiàn)網(wǎng)站。考古報(bào)告中的高清照片。自行拍攝或掃描的甲骨實(shí)物或拓片需注意版權(quán)。拿到圖像后最繁重的工作是標(biāo)注。我們使用LabelImg、CVAT或更專業(yè)的Roboflow等工具進(jìn)行手工標(biāo)注。標(biāo)注時(shí)需注意框的緊密度 bounding box應(yīng)盡可能緊密地包圍整個(gè)字符包括所有筆畫但不要包含過多無關(guān)背景。類別統(tǒng)一目前我們只做“字符檢測(cè)”即識(shí)別出有字符的區(qū)域而不區(qū)分是哪個(gè)字。因此所有目標(biāo)只有一個(gè)類別如oracle_char。未來若要擴(kuò)展為識(shí)別具體文字則需要更細(xì)粒度的分類。困難樣本處理對(duì)于部分殘缺、模糊或與背景高度融合的字符仍需盡力標(biāo)注這是提升模型魯棒性的關(guān)鍵。最終我們整理了一個(gè)包含約5000張圖像的數(shù)據(jù)集按8:1:1的比例隨機(jī)劃分為訓(xùn)練集、驗(yàn)證集和測(cè)試集。確保測(cè)試集完全獨(dú)立用于最終公平評(píng)估。3.2 數(shù)據(jù)預(yù)處理與增強(qiáng)為了應(yīng)對(duì)甲骨文檢測(cè)的挑戰(zhàn)我們?cè)O(shè)計(jì)了一套針對(duì)性的數(shù)據(jù)預(yù)處理和增強(qiáng)流程標(biāo)準(zhǔn)化處理將所有圖像統(tǒng)一縮放到固定的輸入尺寸如640x640。這是YOLO模型的常見輸入尺寸。同時(shí)進(jìn)行像素值歸一化除以255。針對(duì)性的數(shù)據(jù)增強(qiáng)幾何變換隨機(jī)水平翻轉(zhuǎn)、小幅度的旋轉(zhuǎn)±10度以內(nèi)和縮放0.5~1.5倍模擬拍攝角度和距離的變化。色彩擾動(dòng)調(diào)整亮度、對(duì)比度和飽和度模擬不同光照條件和年代久遠(yuǎn)造成的色彩變化。特別是增加一些灰度化和褐色調(diào)的擾動(dòng)以貼近拓片效果。模擬噪聲與退化添加高斯噪聲、椒鹽噪聲模擬圖像污損輕微的高斯模糊模擬對(duì)焦不準(zhǔn)或材質(zhì)本身的不清晰。MixUp與Mosaic采用YOLO系列常用的Mosaic增強(qiáng)將四張圖像拼成一張進(jìn)行訓(xùn)練極大地豐富了背景上下文和小目標(biāo)樣本。MixUp將兩張圖像線性混合能起到正則化作用提升模型泛化性。重點(diǎn)關(guān)照小目標(biāo)在Mosaic增強(qiáng)中有意識(shí)地將包含小目標(biāo)的圖像放在更中心的位置避免其被過度縮小。注意增強(qiáng)的強(qiáng)度需要謹(jǐn)慎控制。過度的旋轉(zhuǎn)或形變可能會(huì)破壞甲骨文字形的結(jié)構(gòu)信息反而降低模型性能。建議在驗(yàn)證集上監(jiān)控增強(qiáng)策略的效果。4. 模型構(gòu)建與訓(xùn)練配置4.1 YOLOv7模型結(jié)構(gòu)淺析與適配雖然我們直接使用官方代碼庫但了解其關(guān)鍵組件有助于調(diào)試和優(yōu)化。YOLOv7的主干網(wǎng)絡(luò)Backbone采用了擴(kuò)展的ELAN結(jié)構(gòu)通過控制最短和最長(zhǎng)的梯度路徑讓網(wǎng)絡(luò)能夠?qū)W習(xí)到更豐富的特征。頸部Neck是PANet結(jié)構(gòu)進(jìn)行有效的特征金字塔融合。對(duì)于我們的甲骨文任務(wù)我主要做了以下適配考量錨框Anchor重聚類YOLO系列通常使用K-means聚類訓(xùn)練集標(biāo)注框的大小得到先驗(yàn)的錨框尺寸。甲骨文字符的寬高比和尺度分布與COCO等通用數(shù)據(jù)集差異巨大。因此我們必須用自己的訓(xùn)練集重新聚類生成錨框。使用腳本對(duì)訓(xùn)練集所有標(biāo)注框進(jìn)行聚類如9組錨框并將結(jié)果更新到模型配置文件中。這一步對(duì)提升檢測(cè)精度尤其是框的回歸精度至關(guān)重要。類別數(shù)修改在配置文件中將ncnumber of classes參數(shù)修改為1因?yàn)槲覀冎挥小凹坠俏淖址边@一個(gè)類別。輸入分辨率保持640x640這是一個(gè)兼顧精度和速度的常用尺寸。如果資源允許且小目標(biāo)特別多可以嘗試增大到960x960但這會(huì)顯著增加計(jì)算量。4.2 訓(xùn)練環(huán)境與超參數(shù)設(shè)置我是在一臺(tái)配備單張RTX 4090顯卡的工作站上進(jìn)行訓(xùn)練的。軟件環(huán)境為Python 3.8, PyTorch 1.12。訓(xùn)練超參數(shù)是模型性能的關(guān)鍵。以下是我經(jīng)過多次實(shí)驗(yàn)后總結(jié)的配置基線不同模型需微調(diào)# 基礎(chǔ)超參數(shù)示例 (train.py 的參數(shù)) epochs: 300 # 訓(xùn)練輪次足夠讓模型收斂 batch_size: 16 # 根據(jù)GPU內(nèi)存調(diào)整tiny可更大x可能需更小 img_size: [640, 640] # 輸入圖像尺寸 optimizer: Adam # 使用Adam優(yōu)化器收斂較快 lr0: 0.01 # 初始學(xué)習(xí)率對(duì)于tiny可以稍大如0.02對(duì)于x可以稍小如0.008 lrf: 0.01 # 最終學(xué)習(xí)率 lr0 * lrf (余弦退火) warmup_epochs: 3.0 # 學(xué)習(xí)率熱身輪數(shù)防止初期震蕩 weight_decay: 0.0005 # 權(quán)重衰減防止過擬合關(guān)鍵調(diào)整經(jīng)驗(yàn)學(xué)習(xí)率YOLOv7-x模型更深需要更小的學(xué)習(xí)率和更長(zhǎng)的熱身周期來穩(wěn)定訓(xùn)練初期。YOLOv7-tiny則相對(duì)“耐操”學(xué)習(xí)率可以設(shè)大一點(diǎn)加速收斂。批量大小在GPU內(nèi)存允許范圍內(nèi)盡可能使用大的批量大小batch_size這能使梯度估計(jì)更穩(wěn)定。如果遇到內(nèi)存不足可以啟用梯度累積來模擬大批量效果。數(shù)據(jù)增強(qiáng)開關(guān)YOLOv7代碼庫中的hyp.scratch.yaml文件包含了各種數(shù)據(jù)增強(qiáng)的概率參數(shù)。對(duì)于小數(shù)據(jù)集可以適當(dāng)調(diào)高M(jìn)osaic、MixUp的概率如從1.0調(diào)到0.8如果發(fā)現(xiàn)模型過擬合訓(xùn)練集可以增加CutOut、隨機(jī)擦除等增強(qiáng)。4.3 訓(xùn)練過程與監(jiān)控啟動(dòng)訓(xùn)練后監(jiān)控至關(guān)重要。除了觀察損失box_loss, obj_loss, cls_loss的下降曲線更要關(guān)注驗(yàn)證集上的指標(biāo)變化。驗(yàn)證集評(píng)估每訓(xùn)練一個(gè)epoch或幾個(gè)epoch就在驗(yàn)證集上計(jì)算一次精度指標(biāo)包括mAP0.5, mAP0.5:0.95等。這是判斷模型是否學(xué)習(xí)有效的金標(biāo)準(zhǔn)。TensorBoard可視化YOLOv7訓(xùn)練時(shí)會(huì)生成TensorBoard日志。我習(xí)慣同時(shí)看以下幾個(gè)面板train/loss總損失下降趨勢(shì)應(yīng)平滑下降至收斂。metrics/mAP_0.5驗(yàn)證集在IoU0.5下的mAP最直觀的精度指標(biāo)。labels查看訓(xùn)練集標(biāo)注框的分布確認(rèn)錨框聚類是否合理。model可視化模型計(jì)算圖確認(rèn)結(jié)構(gòu)加載正確。早停策略如果驗(yàn)證集mAP在連續(xù)20-30個(gè)epoch內(nèi)沒有提升就可以考慮提前停止訓(xùn)練避免過擬合。5. 實(shí)驗(yàn)結(jié)果對(duì)比與分析經(jīng)過約一周的斷續(xù)訓(xùn)練三個(gè)模型都完成了300個(gè)epoch的訓(xùn)練。以下是它們?cè)讵?dú)立測(cè)試集上的性能對(duì)比摘要模型參數(shù)量 (M)GFLOPsmAP0.5mAP0.5:0.95推理速度 (FPS) on RTX 4090模型大小 (MB)YOLOv7-tiny6.0113.20.8420.512~21012.1YOLOv736.5103.20.9010.623~8574.5YOLOv7x70.8188.10.9180.641~52143.2注FPS基于640x640輸入、batch size1測(cè)得。mAP0.5:0.95是在IoU閾值從0.5到0.95步長(zhǎng)0.05下的平均mAP是更嚴(yán)格的指標(biāo)。5.1 精度與速度的權(quán)衡解讀從表格中可以清晰地看到一條“性能-資源”曲線YOLOv7-tiny以極低的參數(shù)量和計(jì)算量換取了超過84%的mAP0.5和210 FPS的驚人速度。這意味著它完全可以在Jetson Nano、樹莓派甚至高性能手機(jī)等邊緣設(shè)備上實(shí)時(shí)運(yùn)行經(jīng)過適當(dāng)優(yōu)化后。對(duì)于需要快速篩查、初步定位的移動(dòng)考古場(chǎng)景它是一個(gè)非常有競(jìng)爭(zhēng)力的選擇。但其mAP0.5:0.95相對(duì)較低說明在更嚴(yán)格的IoU標(biāo)準(zhǔn)下要求框更準(zhǔn)性能下降明顯對(duì)重疊、密集字符的區(qū)分能力較弱。YOLOv7在精度和速度上取得了很好的平衡。mAP0.5達(dá)到90%比tiny版有顯著提升同時(shí)85 FPS的速度在服務(wù)器或高性能PC上依然能滿足實(shí)時(shí)性要求。它是大多數(shù)桌面端分析軟件或在線服務(wù)的理想選擇既能保證較高的檢出率和定位精度又不會(huì)帶來過大的計(jì)算負(fù)擔(dān)。YOLOv7x代表了本任務(wù)下的精度上限mAP0.5接近92%。它擁有最強(qiáng)的特征提取能力對(duì)于背景復(fù)雜、字符模糊、小目標(biāo)密集的“困難樣本”處理得最好。但代價(jià)是模型體積龐大推理速度最慢且需要更大的GPU內(nèi)存進(jìn)行訓(xùn)練。這適合用于離線的高精度分析、數(shù)據(jù)標(biāo)注輔助或者作為集成模型中的“專家”模型。5.2 可視化結(jié)果與案例分析為了更直觀地感受差異我選取了幾張具有代表性的測(cè)試圖片用三個(gè)模型分別進(jìn)行推理并可視化結(jié)果。清晰大字符場(chǎng)景三個(gè)模型表現(xiàn)接近都能近乎完美地檢測(cè)出所有字符框的位置也很準(zhǔn)確。這說明對(duì)于“簡(jiǎn)單任務(wù)”即使是輕量級(jí)模型也足夠勝任。小目標(biāo)密集場(chǎng)景在一張包含大量微小刻痕的圖片上YOLOv7-tiny出現(xiàn)了明顯的漏檢大約有30%的小字符沒有被發(fā)現(xiàn)。YOLOv7漏檢率降至10%左右而YOLOv7x的漏檢率最低僅在5%以下。這印證了模型容量對(duì)于捕捉微小特征的重要性。高干擾背景場(chǎng)景一張背景布滿深色裂紋的拓片。YOLOv7-tiny產(chǎn)生了數(shù)個(gè)將裂紋誤檢為字符的“假陽性”框。YOLOv7也有1-2處誤檢。YOLOv7x則成功抑制了大部分誤檢顯示出更強(qiáng)的抗干擾和特征區(qū)分能力。字符粘連/斷裂場(chǎng)景對(duì)于筆畫粘連的兩個(gè)字符YOLOv7-tiny傾向于將其檢測(cè)為一個(gè)大的框。YOLOv7和YOLOv7x則能更大概率地將其分開為兩個(gè)框但YOLOv7x的框邊界更為精確。實(shí)操心得不要只看平均指標(biāo)。一定要對(duì)測(cè)試集進(jìn)行錯(cuò)誤分析。統(tǒng)計(jì)哪些圖片、哪些類型的字符容易被漏檢或誤檢這能指導(dǎo)你下一步是調(diào)整數(shù)據(jù)增強(qiáng)如增加小目標(biāo)樣本、修改錨框還是考慮更復(fù)雜的模型或后處理。6. 系統(tǒng)集成與部署優(yōu)化模型訓(xùn)練好只是第一步將其變成一個(gè)可用的系統(tǒng)還需要集成和優(yōu)化。6.1 構(gòu)建端到端檢測(cè)流水線我使用Python的FastAPI框架搭建了一個(gè)簡(jiǎn)單的后端服務(wù)核心流程如下圖像輸入接收上傳的圖片或圖片URL。預(yù)處理將圖像resize到模型輸入尺寸并做歸一化。推理加載訓(xùn)練好的PyTorch模型.pt權(quán)重進(jìn)行前向傳播。后處理應(yīng)用非極大值抑制NMS過濾重疊框?qū)⒖虻淖鴺?biāo)從640x640空間映射回原始圖像尺寸。結(jié)果輸出返回一個(gè)JSON包含每個(gè)檢測(cè)框的坐標(biāo)、置信度。同時(shí)生成一張帶有檢測(cè)框的可視化圖片供下載。# 簡(jiǎn)化的核心推理代碼片段 import cv2 import torch from models.experimental import attempt_load from utils.general import non_max_suppression, scale_coords def detect(image_path, model_path): # 加載模型 device torch.device(cuda:0) model attempt_load(model_path, devicedevice) model.eval() # 預(yù)處理 img0 cv2.imread(image_path) img preprocess(img0) # 自定義的resize和歸一化函數(shù) # 推理 with torch.no_grad(): pred model(img)[0] # NMS后處理 pred non_max_suppression(pred, conf_thres0.25, iou_thres0.45) # 坐標(biāo)還原與結(jié)果整理 detections [] for det in pred[0]: if det is not None: xyxy scale_coords(img.shape[2:], det[:, :4], img0.shape).round() for *box, conf, cls in xyxy: detections.append({ bbox: box.tolist(), confidence: conf.item(), class: int(cls) }) return detections6.2 模型部署優(yōu)化實(shí)踐為了提升系統(tǒng)性能尤其是滿足實(shí)時(shí)性要求模型部署優(yōu)化必不可少。模型格式轉(zhuǎn)換ONNX將PyTorch模型導(dǎo)出為ONNX格式可以實(shí)現(xiàn)跨框架如OpenCV DNN, TensorFlow部署。使用torch.onnx.export時(shí)注意設(shè)置動(dòng)態(tài)輸入尺寸dynamic_axes以支持不同大小的圖片輸入。TensorRT這是NVIDIA GPU上的終極優(yōu)化方案。將ONNX模型通過TensorRT的trtexec工具或Python API轉(zhuǎn)換為TensorRT引擎.engine文件。這個(gè)過程會(huì)進(jìn)行層融合、精度校準(zhǔn)FP16/INT8、內(nèi)核自動(dòng)調(diào)優(yōu)能帶來數(shù)倍的推理加速。實(shí)測(cè)YOLOv7-tiny的TensorRT FP16引擎在4090上FPS可超過300。推理加速技巧半精度推理在支持Tensor Core的GPU上使用FP16精度進(jìn)行推理速度可提升近一倍精度損失微乎其微。批處理當(dāng)需要處理多張圖片時(shí)盡量使用批處理batch inference。將多張圖片堆疊成一個(gè)批次輸入模型能極大提升GPU利用率。異步處理在Web服務(wù)中使用異步框架如FastAPI的async/await或消息隊(duì)列避免推理阻塞請(qǐng)求線程。針對(duì)邊緣設(shè)備的優(yōu)化對(duì)于YOLOv7-tiny可以考慮使用模型量化如PyTorch的INT8量化進(jìn)一步壓縮模型大小和加速。在ARM CPU上可以嘗試OpenVINO針對(duì)Intel硬件或NCNN/MNN通用移動(dòng)端推理框架進(jìn)行部署。精簡(jiǎn)預(yù)處理和后處理邏輯避免不必要的內(nèi)存拷貝和計(jì)算。7. 常見問題與排查技巧實(shí)錄在項(xiàng)目開發(fā)和實(shí)驗(yàn)過程中我踩過不少坑這里記錄一些典型問題和解決方法。7.1 訓(xùn)練階段問題問題1損失Loss不下降或下降緩慢。檢查數(shù)據(jù)首先確認(rèn)數(shù)據(jù)標(biāo)注是否正確。用可視化工具打開幾張訓(xùn)練集圖片看看標(biāo)注框是否準(zhǔn)確。錯(cuò)誤標(biāo)注是導(dǎo)致模型無法學(xué)習(xí)的首要原因。檢查學(xué)習(xí)率學(xué)習(xí)率可能設(shè)置得太小。嘗試逐步增大lr0例如從0.01到0.1觀察損失曲線起始階段是否有明顯下降。同時(shí)確保熱身warmup階段正常。檢查數(shù)據(jù)增強(qiáng)過于激進(jìn)的數(shù)據(jù)增強(qiáng)如大角度旋轉(zhuǎn)、嚴(yán)重形變可能會(huì)破壞甲骨文字形讓模型學(xué)不到有效特征。嘗試暫時(shí)關(guān)閉或減弱數(shù)據(jù)增強(qiáng)看損失是否開始下降。檢查錨框如果錨框尺寸與你的目標(biāo)尺寸嚴(yán)重不匹配模型回歸起來會(huì)非常困難。務(wù)必使用自己的數(shù)據(jù)集重新聚類生成錨框。問題2驗(yàn)證集mAP波動(dòng)很大或遠(yuǎn)低于訓(xùn)練集精度。過擬合跡象這是典型的過擬合。解決方法是1) 增加數(shù)據(jù)增強(qiáng)的多樣性2) 增強(qiáng)正則化如增大weight_decay或在模型結(jié)構(gòu)中添加Dropout層需修改模型定義3) 使用早停。驗(yàn)證集與訓(xùn)練集分布不一致確保驗(yàn)證集和訓(xùn)練集來自同一分布沒有特殊的、訓(xùn)練集未見過的情況。檢查劃分過程是否隨機(jī)。評(píng)估代碼問題確認(rèn)驗(yàn)證時(shí)使用的NMS參數(shù)iou_thres,conf_thres與訓(xùn)練后推理時(shí)保持一致。7.2 推理與部署問題問題1模型推理速度遠(yuǎn)低于預(yù)期。檢查輸入尺寸確認(rèn)輸入圖片是否被正確resize到了模型預(yù)設(shè)尺寸如640。過大的輸入會(huì)顯著增加計(jì)算量。檢查GPU利用率使用nvidia-smi命令查看GPU使用率。如果利用率很低可能是數(shù)據(jù)加載或預(yù)處理部分成為了瓶頸CPU bound??紤]使用Dataloader的多進(jìn)程加載或?qū)㈩A(yù)處理移到GPU上進(jìn)行。檢查模型狀態(tài)確保推理前調(diào)用了model.eval()并且使用了torch.no_grad()上下文管理器。否則PyTorch會(huì)計(jì)算梯度嚴(yán)重影響速度。嘗試TensorRT如果是在NVIDIA GPU上部署轉(zhuǎn)換為TensorRT引擎幾乎總能帶來顯著的性能提升。問題2檢測(cè)結(jié)果中出現(xiàn)大量重復(fù)框或誤檢框。調(diào)整NMS參數(shù)非極大值抑制是過濾重疊框的關(guān)鍵。iou_thresIOU閾值設(shè)置得太高會(huì)導(dǎo)致本應(yīng)被抑制的重復(fù)框留下設(shè)置得太低可能會(huì)把正確但略有重疊的兩個(gè)框誤刪。conf_thres置信度閾值設(shè)置得太低會(huì)讓很多低質(zhì)量的預(yù)測(cè)框進(jìn)入NMS階段。需要根據(jù)驗(yàn)證集結(jié)果仔細(xì)調(diào)整這兩個(gè)參數(shù)。后處理邏輯錯(cuò)誤檢查坐標(biāo)還原的代碼scale_coords是否正確。錯(cuò)誤的坐標(biāo)映射會(huì)導(dǎo)致框的位置錯(cuò)亂看起來像誤檢。模型置信度校準(zhǔn)有時(shí)模型輸出的置信度分?jǐn)?shù)整體偏高或偏低??梢栽跍y(cè)試集上統(tǒng)計(jì)預(yù)測(cè)框的置信度分布并據(jù)此調(diào)整conf_thres。7.3 領(lǐng)域特定問題問題模型對(duì)某種特定類型的甲骨文如某期別、某種書寫風(fēng)格檢測(cè)效果差。數(shù)據(jù)不平衡檢查你的訓(xùn)練集中是否缺乏該類樣本。如果是需要有針對(duì)性地收集和標(biāo)注更多此類數(shù)據(jù)或者使用過采樣技術(shù)。特征差異大不同時(shí)期、不同載體的甲骨文風(fēng)格差異可能很大??紤]將它們視為不同的子類進(jìn)行檢測(cè)或者在模型訓(xùn)練時(shí)使用更強(qiáng)大的數(shù)據(jù)增強(qiáng)來模擬這種風(fēng)格變化。集成模型如果單一模型難以覆蓋所有情況可以訓(xùn)練多個(gè)專門化的模型例如一個(gè)針對(duì)清晰拓片一個(gè)針對(duì)模糊照片在推理時(shí)根據(jù)輸入圖像特征選擇或集成多個(gè)模型的預(yù)測(cè)結(jié)果。這個(gè)項(xiàng)目從萌生想法到三個(gè)模型對(duì)比完成花了將近一個(gè)月的時(shí)間。最大的體會(huì)是在垂直領(lǐng)域應(yīng)用AI對(duì)問題的深入理解往往比模型本身的選擇更重要。搞清楚甲骨文檢測(cè)的真正難點(diǎn)在哪里才能有針對(duì)性地準(zhǔn)備數(shù)據(jù)、設(shè)計(jì)增強(qiáng)策略、調(diào)整模型。YOLOv7系列提供了優(yōu)秀的工具箱但最終讓工具發(fā)揮效力的還是使用工具的人。對(duì)于想要復(fù)現(xiàn)或類似領(lǐng)域的朋友我的建議是先從一個(gè)小而干凈的數(shù)據(jù)集和YOLOv7-tiny這樣的輕量模型開始快速驗(yàn)證流程然后再逐步增加數(shù)據(jù)復(fù)雜度和模型容量這樣迭代的效率最高也最容易定位問題。