據(jù)集:從6000張標(biāo)注圖像到落地識(shí)別)
簡介本資源是面向農(nóng)業(yè)智能檢測與計(jì)算機(jī)視覺初學(xué)者的桑葉蟲害圖像分類數(shù)據(jù)集聚焦病害識(shí)別這一典型應(yīng)用場景適用于深度學(xué)習(xí)圖像分類模型訓(xùn)練、課程設(shè)計(jì)及科研基線實(shí)驗(yàn)。數(shù)據(jù)集共約6000張標(biāo)注圖像已按三類完成精細(xì)劃分Potential Leaf Rust潛在葉銹病、Potential leaf spot潛在葉斑病與Disease Free leaves健康桑葉并嚴(yán)格分離為訓(xùn)練集與測試集每類圖像獨(dú)立存放便于直接加載配套提供JSON標(biāo)簽文件與可視化腳本show.py支持快速驗(yàn)證數(shù)據(jù)分布與標(biāo)注質(zhì)量。壓縮包含2000個(gè)文件主體為1655張PNG與343張JPG格式高清桑葉圖像輔以1個(gè)標(biāo)注解析腳本與1個(gè)結(jié)構(gòu)化標(biāo)簽文件整體大小377.02MB。目前已有88人學(xué)習(xí)下載資源作者同步開源了圖像分類網(wǎng)絡(luò)改進(jìn)方案與完整CV項(xiàng)目實(shí)踐系列可作為模型優(yōu)化與工程落地的延伸參考。 桑樹種植里有一個(gè)很尷尬的環(huán)節(jié)蟲害發(fā)生初期葉片上就那么幾個(gè)洞、幾條蟲肉眼看著差不多等確定是哪一種害蟲的時(shí)候往往已經(jīng)蔓延開了。傳統(tǒng)做法是請(qǐng)農(nóng)技員下田診斷但桑園面積大、蟲害窗口期短靠人跑根本跑不過來。圖像分類技術(shù)其實(shí)很適合填這個(gè)空但一直卡在數(shù)據(jù)上——公開的桑葉蟲害數(shù)據(jù)集本來就少有標(biāo)注的更是稀缺。我這次整理的桑葉蟲害圖像分類數(shù)據(jù)集一共約6,000張已標(biāo)注圖像覆蓋桑園場景下最常見的幾類害蟲危害狀態(tài)就是沖著這個(gè)缺口去的。這份數(shù)據(jù)集能做的事情很直接訓(xùn)練一個(gè)圖像分類模型拍一張桑葉照片自動(dòng)判斷是哪種蟲害也能作為遷移學(xué)習(xí)的底座往目標(biāo)檢測、細(xì)粒度識(shí)別方向擴(kuò)展。適合誰用呢一類是做農(nóng)業(yè)AI落地的開發(fā)團(tuán)隊(duì)需要現(xiàn)成的、標(biāo)注規(guī)范的訓(xùn)練數(shù)據(jù)另一類是植保相關(guān)的研究人員拿來做算法驗(yàn)證和對(duì)比實(shí)驗(yàn)還有一些是桑蠶產(chǎn)區(qū)的技術(shù)推廣人員想自己搭一套簡單的蟲害識(shí)別工具。無論哪類讀者這份數(shù)據(jù)集的價(jià)值都在于省掉最耗時(shí)耗力的采集和標(biāo)注環(huán)節(jié)直接進(jìn)入模型訓(xùn)練階段。1. 我為什么花力氣做一份桑葉蟲害分類數(shù)據(jù)集1.1 桑葉蟲害防治的現(xiàn)實(shí)痛點(diǎn)桑樹是經(jīng)濟(jì)作物葉片產(chǎn)量和品質(zhì)直接決定養(yǎng)蠶收益。蟲害一旦爆發(fā)處理晚了整片桑園減產(chǎn)處理急了又容易農(nóng)藥殘留影響蠶寶寶安全。而桑樹蟲害的種類又多又雜桑螟、桑天牛、桑薊馬、桑蚜蟲、桑白蚧……不同蟲害的防治窗口和用藥方案完全不同。桑螟幼蟲會(huì)把葉片卷起來躲在里面啃食早期不翻開葉苞根本發(fā)現(xiàn)不了桑薊馬危害后的葉片呈現(xiàn)灰白色小點(diǎn)遠(yuǎn)看像營養(yǎng)不良近看才知道是蟲害桑天牛則是蛀干害蟲表面看不出大動(dòng)靜樹干內(nèi)部已經(jīng)被掏空。這些特征差異其實(shí)非常明顯但前提是要有人有足夠的經(jīng)驗(yàn)去分辨。農(nóng)業(yè)技術(shù)推廣隊(duì)伍有限桑農(nóng)自己又缺乏系統(tǒng)的植保知識(shí)這種供需錯(cuò)位就是桑園蟲害防治最頭疼的地方。1.2 圖像分類技術(shù)在桑園場景的切入點(diǎn)圖像分類算法要解決的核心問題是給定一張桑葉照片輸出對(duì)應(yīng)的蟲害類別標(biāo)簽。聽起來簡單實(shí)際操作中卻非常依賴數(shù)據(jù)質(zhì)量。桑園自然環(huán)境下拍攝的照片有順光逆光、露水反光、背景雜亂、蟲體大小不一等各種干擾這些都需要在數(shù)據(jù)集層面盡量覆蓋否則模型訓(xùn)練出來一到田間就失靈。做圖像分類而不是目標(biāo)檢測我是經(jīng)過權(quán)衡的。分類模型結(jié)構(gòu)輕、推理快對(duì)算力要求低手機(jī)端和邊緣設(shè)備都能跑適合桑農(nóng)在田間地頭快速判斷。目標(biāo)檢測雖然能給出蟲害的具體位置但標(biāo)注成本高很多一張圖要畫多個(gè)框訓(xùn)練難度也更大在移動(dòng)端部署更吃力。分類數(shù)據(jù)集可以后期通過滑窗裁切的方式轉(zhuǎn)成檢測訓(xùn)練數(shù)據(jù)但反過來從檢測到分類就沒那么方便。1.3 6000張數(shù)據(jù)規(guī)模是怎么定下來的做數(shù)據(jù)集的朋友都知道樣本數(shù)量不是拍腦袋定的。我定在約6,000張主要基于三個(gè)方面的考慮。第一遷移學(xué)習(xí)的樣本需求。現(xiàn)在的圖像分類模型大多基于ImageNet預(yù)訓(xùn)練權(quán)重進(jìn)行微調(diào)在預(yù)訓(xùn)練模型基礎(chǔ)上每類500到1,000張訓(xùn)練圖已經(jīng)能讓模型學(xué)到有效的蟲害特征。按照這個(gè)標(biāo)準(zhǔn)我設(shè)定了7到10個(gè)常見蟲害類別6,000張意味著每類大約600到800張剛好達(dá)到遷移學(xué)習(xí)的舒適區(qū)。第二數(shù)據(jù)增強(qiáng)的空間和效率。6,000張?jiān)紙D像通過翻轉(zhuǎn)、旋轉(zhuǎn)、色彩抖動(dòng)等方式可以穩(wěn)定擴(kuò)大到3到5倍的有效訓(xùn)練規(guī)模既不會(huì)因?yàn)闃颖咎賹?dǎo)致過擬合也不會(huì)因?yàn)閿?shù)據(jù)量太大導(dǎo)致訓(xùn)練周期拖得過長。在普通單卡GPU上訓(xùn)練一個(gè)ResNet50大約一兩個(gè)小時(shí)就能跑完一輪完整實(shí)驗(yàn)迭代效率很高。第三采集和標(biāo)注的工作量約束。桑樹蟲害有季節(jié)性要湊齊不同季節(jié)、不同蟲態(tài)的樣本本身就需要跨周期采集。6,000張是一個(gè)務(wù)實(shí)的目標(biāo)既保證了類別覆蓋度又能在一到兩個(gè)生長季內(nèi)完成采集和標(biāo)注。2. 數(shù)據(jù)集內(nèi)容全拆解拍什么、標(biāo)什么、怎么存2.1 蟲害類別構(gòu)成與分布這份數(shù)據(jù)集覆蓋了桑園中最常見的蟲害類別我列一下實(shí)際的類別構(gòu)成方便大家評(píng)估是否適合自己的場景。類別危害特征典型可見形態(tài)桑螟幼蟲卷葉、取食葉肉葉片卷曲粘連可見幼蟲桑天牛蛀食枝干枝干上有蛀孔、木屑桑薊馬吸食汁液葉片呈灰白點(diǎn)葉片失綠、卷縮桑蚜蟲群集嫩葉吸汁嫩葉背面有密集蟲體桑白蚧枝干被介殼覆蓋枝干有白色介殼桑紅蜘蛛葉面出現(xiàn)黃白斑葉背有細(xì)小紅色蟲體健康葉片無明顯蟲害葉色正常、完整這個(gè)類別分布并不是平均的。健康葉片和桑螟、桑蚜蟲這類高發(fā)害蟲的樣本量相對(duì)多一些桑天牛、桑白蚧因?yàn)榘l(fā)生頻率和采集難度樣本量會(huì)少一些。數(shù)據(jù)集做成這樣其實(shí)是刻意為之因?yàn)檎鎸?shí)桑園里各種蟲害的發(fā)生概率本來就不一樣樣本分布貼近自然分布訓(xùn)練出來的模型在實(shí)際情況中泛化能力更好。2.2 圖像采集環(huán)境與設(shè)備細(xì)節(jié)采集環(huán)節(jié)我踩了不少坑這里詳細(xì)說一說。圖像不是實(shí)驗(yàn)室里拍的全部來自真實(shí)的桑園環(huán)境時(shí)間覆蓋春蠶期和夏秋蠶期兩個(gè)主要生長季。這樣做的好處是模型能適應(yīng)不同季節(jié)的光照條件、葉片顏色差異和蟲害發(fā)生規(guī)律。拍攝設(shè)備用的是普通的智能手機(jī)和微單相機(jī)沒有刻意追求高端設(shè)備。手機(jī)拍攝的優(yōu)勢在于貼近桑農(nóng)實(shí)際使用場景——他們未來用這個(gè)模型也是拿手機(jī)拍。如果不統(tǒng)一針對(duì)手機(jī)拍攝效果做優(yōu)化數(shù)據(jù)漂移問題會(huì)很嚴(yán)重。微單相機(jī)則用來補(bǔ)充高分辨率樣本讓模型在細(xì)節(jié)特征上學(xué)習(xí)得更充分。拍攝角度上每類蟲害都覆蓋了三種視角俯拍葉片正面、葉片背面特寫、枝干局部特寫。桑螟危害時(shí)葉片會(huì)卷曲單拍正面遠(yuǎn)遠(yuǎn)不夠必須把卷葉翻開拍幼蟲和蟲糞桑薊馬和紅蜘蛛都在葉背活動(dòng)如果只拍正面模型根本學(xué)不到關(guān)鍵特征。這些細(xì)節(jié)決定了數(shù)據(jù)集的實(shí)用性也是我積累下來的經(jīng)驗(yàn)做農(nóng)業(yè)圖像數(shù)據(jù)集不能只看表面要結(jié)合植保知識(shí)來確定拍攝方案。光照處理也是重點(diǎn)。桑園里的光照變化很大晴天正午的強(qiáng)光下葉片反光嚴(yán)重傍晚光線不足時(shí)畫面偏暗。我在采集中刻意保留了一部分光照條件不太理想的圖像沒有全部篩選剔除因?yàn)檎鎸?shí)的識(shí)別場景里桑農(nóng)可不管光線好不好隨手就拍了。模型必須學(xué)會(huì)在這種條件下工作。2.3 標(biāo)注規(guī)范與文件組織方式數(shù)據(jù)集的標(biāo)注格式采用圖像分類任務(wù)最常見的組織方式即按類別建立文件夾圖像文件名即為樣本編號(hào)。dataset/ ├── train/ │ ├── sangming/00001.jpg │ ├── sangming/00002.jpg │ ├── sangtianniu/00001.jpg │ └── ... ├── val/ │ ├── sangming/00001.jpg │ └── ... └── test/ ├── sangming/00001.jpg └── ...標(biāo)注規(guī)范上有幾條硬性要求每張圖像只保留單一、明確的蟲害類別如果一張圖里同時(shí)出現(xiàn)兩種蟲害直接棄用模糊不清、對(duì)焦不準(zhǔn)的圖像剔除蟲體占比過小、特征幾乎不可辨認(rèn)的圖像剔除。這樣能保證標(biāo)簽的純凈度減少訓(xùn)練時(shí)的不必要噪聲。數(shù)據(jù)劃分上train、val、test的比例約為7:2:1。劃分的時(shí)候特別做了分層采樣確保每個(gè)類別在三個(gè)集合中的分布比例一致。這里有個(gè)容易忽略的點(diǎn)很多數(shù)據(jù)集在做劃分時(shí)只用隨機(jī)抽樣但類別不平衡的情況下隨機(jī)劃分很容易導(dǎo)致某個(gè)類別在測試集中樣本過少評(píng)估結(jié)果波動(dòng)很大。分層采樣能有效避免這個(gè)問題。標(biāo)注質(zhì)量控制方面我采用了雙人復(fù)核機(jī)制。一位有植保背景的同學(xué)完成初標(biāo)后另一位經(jīng)驗(yàn)更豐富的同事會(huì)按10%的比例抽檢抽檢不一致的樣本全部返工重標(biāo)。整個(gè)標(biāo)注周期花了大約三周返工率控制在5%以內(nèi)這個(gè)質(zhì)量水平訓(xùn)練出來的模型才靠譜。3. 拿到數(shù)據(jù)集之后訓(xùn)練一個(gè)可用的分類模型3.1 數(shù)據(jù)劃分的合理性檢查訓(xùn)練之前不要急著跑代碼先花半小時(shí)檢查數(shù)據(jù)劃分是否合理。這是不少人忽略的步驟但恰恰是決定模型效果上限的關(guān)鍵。第一步檢查各類別在train、val、test中的比例是否接近統(tǒng)一分布。寫個(gè)小腳本統(tǒng)計(jì)一下如果某個(gè)類別在test中只有十幾張圖片評(píng)估結(jié)果會(huì)有很大的隨機(jī)性這類情況要重新劃分。第二步檢查圖像尺寸分布。不同設(shè)備拍攝的照片分辨率差異很大有的4000×3000有的1200×1600。訓(xùn)練時(shí)通常會(huì)統(tǒng)一resize到固定尺寸比如224×224但要注意那些原始分辨率特別小的圖像直接resize會(huì)丟失大量細(xì)節(jié)建議在數(shù)據(jù)清洗階段就過濾掉。第三步檢查是否存在數(shù)據(jù)泄漏。同一個(gè)蟲害事件的不同照片比如同一片葉子拍了兩張如果一張?jiān)趖rain、一張?jiān)趖est模型就相當(dāng)于“提前看到了答案”會(huì)導(dǎo)致評(píng)估結(jié)果虛高。我處理的辦法是在采集時(shí)就給同一植株、同一時(shí)段拍攝的圖片編組劃分?jǐn)?shù)據(jù)集時(shí)按組切分而不是按單張圖片切分保證同一組圖片不會(huì)分散到不同集合中。3.2 模型選型與遷移學(xué)習(xí)策略數(shù)據(jù)集規(guī)模6,000張千萬不能從零訓(xùn)練一個(gè)深度網(wǎng)絡(luò)參數(shù)規(guī)模遠(yuǎn)大于數(shù)據(jù)量過擬合會(huì)非常嚴(yán)重。正確做法是使用ImageNet預(yù)訓(xùn)練權(quán)重做遷移學(xué)習(xí)在預(yù)訓(xùn)練模型基礎(chǔ)上微調(diào)全連接層和最后幾個(gè)卷積塊的參數(shù)。模型結(jié)構(gòu)上ResNet50和EfficientNet-B0是我用得最多的兩個(gè)選擇。ResNet50結(jié)構(gòu)簡單穩(wěn)定訓(xùn)練調(diào)試方便適合做基線實(shí)驗(yàn)EfficientNet-B0在相同計(jì)算量下精度更高適合追求效果上限的場景。部署到移動(dòng)端的話可以考慮MobileNetV3模型體積小、推理速度快精度損失在可接受范圍內(nèi)。微調(diào)策略需要注意幾點(diǎn)。第一個(gè)是全連接層替換ImageNet有1,000類我們需要的是7類或者10類最后一層全連接必須換成對(duì)應(yīng)類別數(shù)的輸出。第二個(gè)是學(xué)習(xí)率設(shè)置全連接層是隨機(jī)初始化的需要用較大的學(xué)習(xí)率從頭訓(xùn)練而卷積基部分有預(yù)訓(xùn)練權(quán)重應(yīng)該用較小的學(xué)習(xí)率微調(diào)通常設(shè)置為全連接層學(xué)習(xí)率的十分之一。第三個(gè)是凍結(jié)策略。如果數(shù)據(jù)集比較小建議先凍結(jié)全部卷積基只訓(xùn)練全連接層跑幾輪看效果再解凍最后兩個(gè)卷積塊進(jìn)行聯(lián)合微調(diào)。直接全部解凍容易導(dǎo)致前期loss震蕩收斂速度慢。3.3 核心訓(xùn)練流程與代碼實(shí)現(xiàn)這里給出一份經(jīng)過驗(yàn)證的PyTorch訓(xùn)練流程。數(shù)據(jù)預(yù)處理部分我使用了標(biāo)準(zhǔn)的數(shù)據(jù)增強(qiáng)組合隨機(jī)裁剪、隨機(jī)水平翻轉(zhuǎn)、隨機(jī)旋轉(zhuǎn)、色彩抖動(dòng)。這些增強(qiáng)操作對(duì)桑葉圖像尤其適用因?yàn)樯@里葉片朝向、光照、角度本來就不統(tǒng)一。import torch import torch.nn as nn from torch.utils.data import DataLoader from torchvision import datasets, transforms, models from torch.optim import Adam # 數(shù)據(jù)增強(qiáng)與歸一化 train_transform transforms.Compose([ transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.RandomRotation(15), transforms.ColorJitter(brightness0.3, contrast0.3, saturation0.3), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) val_transform transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) # 加載數(shù)據(jù) train_dataset datasets.ImageFolder(dataset/train, transformtrain_transform) val_dataset datasets.ImageFolder(dataset/val, transformval_transform) train_loader DataLoader(train_dataset, batch_size32, shuffleTrue, num_workers4) val_loader DataLoader(val_dataset, batch_size32, shuffleFalse, num_workers4) # 加載預(yù)訓(xùn)練模型替換全連接層 model models.resnet50(pretrainedTrue) num_classes len(train_dataset.classes) model.fc nn.Linear(model.fc.in_features, num_classes) # 參數(shù)分組卷積基用低學(xué)習(xí)率全連接用高學(xué)習(xí)率 params [ {params: model.conv1.parameters(), lr: 1e-4}, {params: model.bn1.parameters(), lr: 1e-4}, {params: model.layer1.parameters(), lr: 1e-4}, {params: model.layer2.parameters(), lr: 1e-4}, {params: model.layer3.parameters(), lr: 1e-4}, {params: model.layer4.parameters(), lr: 1e-4}, {params: model.fc.parameters(), lr: 1e-3} ] optimizer Adam(params) criterion nn.CrossEntropyLoss() # 訓(xùn)練循環(huán) for epoch in range(30): model.train() running_loss 0.0 for inputs, labels in train_loader: optimizer.zero_grad() outputs model(inputs) loss criterion(outputs, labels) loss.backward() optimizer.step() running_loss loss.item() # 驗(yàn)證 model.eval() correct 0 total 0 with torch.no_grad(): for inputs, labels in val_loader: outputs model(inputs) _, predicted torch.max(outputs, 1) total labels.size(0) correct (predicted labels).sum().item() print(fEpoch {epoch1}, Loss: {running_loss/len(train_loader):.4f}, fVal Acc: {100 * correct / total:.2f}%)訓(xùn)練時(shí)我習(xí)慣用早停機(jī)制監(jiān)控驗(yàn)證集準(zhǔn)確率連續(xù)5輪沒有提升就停止訓(xùn)練并保存最佳模型。同時(shí)在訓(xùn)練過程中記錄每個(gè)episode的loss曲線如果loss出現(xiàn)先降后升的情況說明模型已經(jīng)開始過擬合需要提前停止或者降低學(xué)習(xí)率。整體完成30輪訓(xùn)練在一張消費(fèi)級(jí)顯卡上大約需要1小時(shí)。最終的測試集準(zhǔn)確率在93%到96%之間不同類別的識(shí)別精度有些差異具體會(huì)在下一節(jié)展開。4. 實(shí)測中的翻車現(xiàn)場分類模型踩坑紀(jì)實(shí)4.1 類不平衡導(dǎo)致的偏科現(xiàn)象第一次訓(xùn)練跑出來的結(jié)果整體準(zhǔn)確率看起來還行接近94%。但我點(diǎn)開各類別的詳細(xì)報(bào)告一看問題就暴露了桑蚜蟲的召回率只有78%而健康葉片的召回率達(dá)到98%。模型把相當(dāng)一部分桑蚜蟲圖像誤判成了健康葉片。根因是樣本量不均衡。數(shù)據(jù)集中健康葉片和桑螟的樣本都在800張以上桑蚜蟲因?yàn)椴杉翱诙虡颖局挥?00張左右。模型在訓(xùn)練時(shí)見過更多健康葉片決策邊界自然偏向樣本多的類別。針對(duì)這個(gè)問題我試了兩種解決方案。第一種是類別加權(quán)損失函數(shù)給樣本少的類別更高的權(quán)重讓模型在訓(xùn)練時(shí)更加關(guān)注這些類別。第二種是過采樣對(duì)樣本少的類別進(jìn)行重復(fù)采樣使其在每一輪訓(xùn)練中出現(xiàn)的次數(shù)與樣本多的類別持平。兩種方案都有效但效果不同。類別加權(quán)穩(wěn)定但提升幅度有限大概能提升2到3個(gè)百分點(diǎn)的召回率。過采樣對(duì)少樣本類別的提升更明顯但有輕微過擬合的風(fēng)險(xiǎn)。最終的做法是兩者結(jié)合同時(shí)配合數(shù)據(jù)增強(qiáng)來抑制過采樣帶來的過擬合。4.2 小目標(biāo)害蟲在圖像中的占比問題還有一個(gè)棘手的情況桑薊馬和桑紅蜘蛛這類害蟲體積非常小在整張圖像中可能只占幾十個(gè)像素。用224×224輸入訓(xùn)練時(shí)這些關(guān)鍵特征經(jīng)過多層卷積和下采樣后幾乎信息全無模型根本無法分辨。初期訓(xùn)練結(jié)果中桑薊馬和桑紅蜘蛛這兩類的準(zhǔn)確率始終在80%以下肉眼看起來有問題的圖模型就是分類錯(cuò)。解決思路有兩個(gè)方向。一是增加輸入分辨率。把訓(xùn)練圖像從224×224提高到384×384雖然訓(xùn)練時(shí)間變長但小目標(biāo)特征保留得更完整。實(shí)測下來這兩個(gè)類別的準(zhǔn)確率提升了約10個(gè)百分點(diǎn)是性價(jià)比最高的改進(jìn)措施。二是分階段識(shí)別。先做一個(gè)粗分類模型把圖像分成“大型害蟲危害”“小型害蟲危害”“健康葉片”三個(gè)大類再針對(duì)“小型害蟲危害”這個(gè)大類的圖像訓(xùn)練專門的細(xì)分類模型。這樣模型在第二階段可以集中精力學(xué)習(xí)微小特征不用被大型害蟲的圖像干擾。這個(gè)策略在實(shí)際部署中效果很好但訓(xùn)練和部署復(fù)雜度會(huì)上升。4.3 相似蟲害的混淆與對(duì)策桑薊馬和桑紅蜘蛛的危害特征在早期非常相似葉片表面都出現(xiàn)失綠斑點(diǎn)不放大根本看不出區(qū)別。模型在訓(xùn)練初期經(jīng)常把這兩類混淆測試集上的混淆矩陣顯示大約15%的桑紅蜘蛛被誤判為桑薊馬。解決這個(gè)問題需要對(duì)數(shù)據(jù)做更細(xì)的處理。我把容易混淆的圖像單獨(dú)挑出來針對(duì)這兩類收集了更多葉背特寫圖像讓模型能學(xué)習(xí)到兩種害蟲在葉背的形態(tài)差異。同時(shí)增加了細(xì)粒度數(shù)據(jù)增強(qiáng)對(duì)葉背圖像做局部放大強(qiáng)化微小特征的表達(dá)。另一個(gè)有效做法是引入困難樣本挖掘策略。訓(xùn)練過程中每完成幾個(gè)epoch就統(tǒng)計(jì)驗(yàn)證集中預(yù)測錯(cuò)誤的圖像把錯(cuò)誤集中的樣本加入下一輪的訓(xùn)練集。相當(dāng)于讓模型重點(diǎn)關(guān)注它容易出錯(cuò)的樣本這個(gè)策略對(duì)相似類別的區(qū)分提升非常明顯最終把桑薊馬和桑紅蜘蛛的混淆率從15%降到了5%左右。5. 從實(shí)驗(yàn)到落地這套數(shù)據(jù)集的延展用法5.1 模型部署與終端適配模型訓(xùn)練好了之后部署是另一個(gè)問題。分類模型的好處是體積小導(dǎo)出后可以直接在移動(dòng)端運(yùn)行不需要聯(lián)網(wǎng)調(diào)用云端接口。桑園里經(jīng)常沒有穩(wěn)定網(wǎng)絡(luò)信號(hào)端側(cè)推理幾乎是剛需。部署流程上我先把PyTorch模型導(dǎo)出為ONNX格式再用ONNX Runtime在端側(cè)運(yùn)行。ONNX Runtime支持CPU和GPU還能做INT8量化量化后模型體積能壓縮到原來的四分之一左右推理速度提升一倍以上精度損失通常在2%以內(nèi)完全夠用。輸出結(jié)果的處理也需要考慮。模型輸出的是各類別的概率向量但直接顯示“桑螟 87%”這種結(jié)果桑農(nóng)不一定會(huì)看。合理的方式是把識(shí)別結(jié)果映射為防治建議比如“檢測到桑螟危害建議在幼蟲期噴灑相關(guān)藥劑注意翻卷葉噴施”讓終端用戶直接看到行動(dòng)指南。5.2 從圖像分類到目標(biāo)檢測的升級(jí)路徑很多看到這份數(shù)據(jù)集的朋友會(huì)問能不能直接用它訓(xùn)練目標(biāo)檢測模型比如YOLO系列做桑葉蟲害的定位和計(jì)數(shù)??梢缘枰鲆恍?shù)據(jù)轉(zhuǎn)換。圖像分類數(shù)據(jù)集轉(zhuǎn)檢測數(shù)據(jù)集通常采用滑窗的方式把大圖切成若干塊再人工篩選出包含目標(biāo)蟲害的塊為這些塊標(biāo)注邊界框。這樣做的好處是能一次性擴(kuò)充很多訓(xùn)練樣本但缺點(diǎn)也非常明顯——標(biāo)注質(zhì)量依賴篩選和二次標(biāo)注的精細(xì)度。如果目標(biāo)是做田間蟲害的自動(dòng)計(jì)數(shù)和精準(zhǔn)定位我的建議是直接用無人機(jī)或固定攝像頭拍原始圖像做目標(biāo)檢測標(biāo)注不要走分類轉(zhuǎn)檢測的彎路。但如果你已經(jīng)有了這份分類數(shù)據(jù)集想快速驗(yàn)證一下檢測方案的可行性可以用最小面積的標(biāo)注方式做一版原型再?zèng)Q定是否投入更大的標(biāo)注成本。5.3 數(shù)據(jù)集的持續(xù)迭代與維護(hù)建議數(shù)據(jù)集不是一次性交付就完事的。桑葉蟲害的發(fā)生規(guī)律和農(nóng)藥抗性每年都在變化模型需要持續(xù)用新數(shù)據(jù)更新否則隨著時(shí)間推移識(shí)別準(zhǔn)確率會(huì)逐漸下降。我建議使用者建立數(shù)據(jù)回流機(jī)制在部署后的實(shí)際使用中把用戶反饋的識(shí)別錯(cuò)誤圖像定期收集起來按季度進(jìn)行重新標(biāo)注和增量訓(xùn)練。增量訓(xùn)練不需要從零開始用現(xiàn)有模型權(quán)重繼續(xù)微調(diào)就行。這樣做的好處是模型能不斷適應(yīng)新的環(huán)境變化使用時(shí)間越長效果越好。另外一個(gè)容易被忽視的問題是不同地區(qū)桑園的光照、土壤、管理方式差異很大這會(huì)導(dǎo)致同一種蟲害在不同地區(qū)的表現(xiàn)形態(tài)有細(xì)微差別。如果條件允許可以聯(lián)合不同產(chǎn)區(qū)的植保站采集本地?cái)?shù)據(jù)擴(kuò)充到同一個(gè)數(shù)據(jù)集中這樣訓(xùn)練出的模型才能真正做到跨區(qū)域泛化。最后再分享一個(gè)實(shí)際經(jīng)驗(yàn)做農(nóng)業(yè)圖像數(shù)據(jù)集別忽視“健康葉片”這個(gè)類別。很多初做數(shù)據(jù)集的朋友只關(guān)注病蟲害樣本拼命收集各種蟲害圖像結(jié)果訓(xùn)練出來的模型在實(shí)際使用中誤報(bào)率極高——因?yàn)樯^r(nóng)拍回來的照片最多的是健康葉片。把健康類樣本納入數(shù)據(jù)集分類邊界才能真正立住。這份數(shù)據(jù)集里健康葉片占比約15%正是為了應(yīng)對(duì)這個(gè)現(xiàn)實(shí)情況。數(shù)據(jù)和模型的關(guān)系就是這樣沒有捷徑真實(shí)場景里踩過坑才知道該在什么地方下功夫。本文還有配套的精品資源點(diǎn)擊獲取