99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

醫(yī)學(xué)圖像分類(lèi)實(shí)戰(zhàn):腎臟數(shù)據(jù)集組織、yolov5訓(xùn)練與混淆矩陣評(píng)估

醫(yī)學(xué)圖像分類(lèi)實(shí)戰(zhàn):腎臟數(shù)據(jù)集組織、yolov5訓(xùn)練與混淆矩陣評(píng)估 簡(jiǎn)介一套針對(duì)腎臟結(jié)節(jié)與腫瘤識(shí)別的醫(yī)學(xué)圖像分類(lèi)數(shù)據(jù)集包含正常、結(jié)節(jié)、腫瘤三種標(biāo)簽專(zhuān)為基于深度學(xué)習(xí)的影像分類(lèi)場(chǎng)景設(shè)計(jì)適用于醫(yī)學(xué)影像入門(mén)實(shí)驗(yàn)、算法驗(yàn)證及競(jìng)賽練習(xí)。數(shù)據(jù)已按照訓(xùn)練集、驗(yàn)證集、測(cè)試集劃分并保存在data目錄下的獨(dú)立文件夾中三類(lèi)圖像數(shù)量分別為訓(xùn)練集2800張、驗(yàn)證集800張、測(cè)試集400張可直接用作卷積神經(jīng)網(wǎng)絡(luò)分類(lèi)或YOLOv5分類(lèi)數(shù)據(jù)集的輸入。資源包共2000個(gè)文件主要由1998張JPG樣本圖組成另含1個(gè)記錄類(lèi)別名稱與索引對(duì)應(yīng)關(guān)系的JSON字典文件以及1個(gè)用于數(shù)據(jù)集可視化的Python腳本整體壓縮包約151.5MB結(jié)構(gòu)簡(jiǎn)潔、便于快速檢查數(shù)據(jù)質(zhì)量。目前已有299人學(xué)習(xí)下載類(lèi)別字典清晰標(biāo)注類(lèi)別與索引的對(duì)應(yīng)關(guān)系可視化腳本便于快速檢查樣本減少數(shù)據(jù)整理與預(yù)處理的繁瑣步驟。對(duì)于希望快速獲得劃分完善、格式規(guī)整醫(yī)學(xué)圖像數(shù)據(jù)的研究者這套資源能顯著縮短實(shí)驗(yàn)前期準(zhǔn)備時(shí)間。1. 醫(yī)學(xué)圖像分類(lèi)的第一步這份腎臟數(shù)據(jù)集的目錄里藏著什么做醫(yī)學(xué)圖像分類(lèi)的人最怕的不是模型選型而是數(shù)據(jù)本身沒(méi)收拾利索。標(biāo)簽對(duì)不上、圖片混在一起、訓(xùn)練驗(yàn)證切分不干凈這些問(wèn)題往往在項(xiàng)目過(guò)半時(shí)才暴露一返工就是幾天。這次拆的資源是一份已經(jīng)劃分好的腎臟結(jié)節(jié)、腫瘤圖像識(shí)別數(shù)據(jù)集3 分類(lèi)正常、結(jié)節(jié)、腫瘤訓(xùn)練集 2800 張、驗(yàn)證集 800 張、測(cè)試集 400 張按文件夾組織好還帶類(lèi)別字典 json 和一個(gè)可視化腳本可以直接喂給 yolov5 分類(lèi)模式或任意分類(lèi)網(wǎng)絡(luò)。拿到手之后我的第一感覺(jué)是這省掉的不是下載時(shí)間是整理數(shù)據(jù)的時(shí)間。很多開(kāi)源數(shù)據(jù)集只給一堆散圖和一個(gè)標(biāo)注文件你得自己寫(xiě)腳本按標(biāo)簽歸文件夾、按比例切分稍不注意就漏圖或者路徑寫(xiě)錯(cuò)。這份資源把 train、valid、test 三套目錄都鋪好了圖片按類(lèi)別歸類(lèi)路徑即標(biāo)簽。對(duì)剛上手醫(yī)學(xué)圖像分類(lèi)的開(kāi)發(fā)者來(lái)說(shuō)可以直接跳過(guò)數(shù)據(jù)預(yù)處理這個(gè)最容易翻車(chē)的環(huán)節(jié)直接進(jìn)入訓(xùn)練和調(diào)參對(duì)熟手來(lái)說(shuō)省掉的是重復(fù)造輪子的時(shí)間把精力放在類(lèi)別邊界和模型評(píng)估上。2. 拆開(kāi)數(shù)據(jù)集看門(mén)道目錄、類(lèi)別字典與 4000 張圖的分布邏輯2.1 train / valid / test 三份目錄yolov5 分類(lèi)模式默認(rèn)的數(shù)據(jù)組織方式我第一次拿這份資源時(shí)先做的不是訓(xùn)練而是把目錄結(jié)構(gòu)和文件數(shù)量完整數(shù)了一遍。分類(lèi)任務(wù)和檢測(cè)任務(wù)不一樣檢測(cè)要讀 xml 或 txt 標(biāo)注分類(lèi)任務(wù)最簡(jiǎn)單可靠的組織方式就是「一個(gè)文件夾一個(gè)類(lèi)別」文件夾名就是標(biāo)簽。yolov5 的 classify/train.py 正是按這個(gè)約定讀數(shù)據(jù)的它內(nèi)部用 torchvision 的 ImageFolder 機(jī)制指定根目錄后會(huì)自動(dòng)掃描子目錄把每個(gè)子目錄名當(dāng)作一個(gè)類(lèi)別。# 在項(xiàng)目根目錄執(zhí)行查看數(shù)據(jù)集目錄樹(shù) tree -L 3 datadata/ ├── train/ │ ├── normal/ # 正常腎臟影像 │ ├── stone/ # 腎結(jié)石 / 結(jié)節(jié) │ └── tumor/ # 腫瘤 ├── valid/ # 有些版本寫(xiě)作 valyolov5 兩個(gè)寫(xiě)法都認(rèn) │ ├── normal/ │ ├── stone/ │ └── tumor/ └── test/ ├── normal/ ├── stone/ └── tumor/數(shù)完目錄我心里的預(yù)期是 train 2800、valid 800、test 400實(shí)測(cè)后跟摘要對(duì)得上。這里的邏輯說(shuō)明很簡(jiǎn)單yolov5 對(duì)訓(xùn)練集和驗(yàn)證集目錄名有約定train 和 valid或 val是它掃描的固定關(guān)鍵詞test 目錄在訓(xùn)練階段不會(huì)被動(dòng)用只在推理或最終評(píng)估時(shí)使用。參數(shù)說(shuō)明一下如果目錄名寫(xiě)的是 validation 而不是 valid 或 val那個(gè)文件夾會(huì)被忽略模型把驗(yàn)證集當(dāng)成了不存在這個(gè)問(wèn)題我見(jiàn)過(guò)不止一次。2.2 類(lèi)別字典 json從文件夾名到訓(xùn)練標(biāo)簽的映射關(guān)系數(shù)據(jù)文件夾本身已經(jīng)把標(biāo)簽寫(xiě)在路徑里了那 json 文件還有什么用它解決的是「數(shù)字標(biāo)簽」和「語(yǔ)義標(biāo)簽」的對(duì)應(yīng)關(guān)系。模型輸出的 argmax 結(jié)果是個(gè)整數(shù)比如 0、1、2你總得知道 1 到底代表結(jié)節(jié)還是腫瘤這就是類(lèi)別字典存在的意義。import json with open(data/classes.json, r, encodingutf-8) as f: class_dict json.load(f) print(class_dict) # {0: normal, 1: stone, 2: tumor} # 具體鍵值順序以你下載到的 json 為準(zhǔn)這里只是示例 # 反向映射訓(xùn)練時(shí)模型輸出 0/1/2通過(guò)它轉(zhuǎn)成可讀類(lèi)別 idx_to_name {int(k): v for k, v in class_dict.items()} name_to_idx {v: k for k, v in idx_to_name.items()}邏輯說(shuō)明這段代碼把 json 讀進(jìn)來(lái)后同時(shí)生成了兩個(gè)方向的映射。訓(xùn)練階段用 name_to_idx 把文件夾名轉(zhuǎn)成目標(biāo)張量驗(yàn)證和推理階段用 idx_to_name 把模型輸出轉(zhuǎn)成可讀的類(lèi)別文字。參數(shù)說(shuō)明json 里的鍵不一定是字符串形式的數(shù)字有的資源直接寫(xiě)的 {normal: 0}如果你拿到的是這種結(jié)構(gòu)把 int(k) 那行去掉就行讀取前先 print 一下原文件是標(biāo)準(zhǔn)動(dòng)作。有一個(gè)容易忽略的點(diǎn)torchvision 的 ImageFolder 在掃描子目錄時(shí)是按字典序生成 class_to_idx 的和 json 里定義的順序不一定一致。如果你的類(lèi)別名是 normal、stone、tumor按字母序恰好是 normal0、stone1、tumor2和 json 一致算運(yùn)氣好如果類(lèi)別名是中文或者首字母大小寫(xiě)混亂就要以 ImageFolder.class_to_idx 的實(shí)際結(jié)果為準(zhǔn)拿 json 來(lái)校驗(yàn)而不是拿來(lái)直接替換。2.3 show 腳本先可視化再訓(xùn)練省掉一半冤枉路資源里附帶了一個(gè) show 腳本我的習(xí)慣是在任何訓(xùn)練開(kāi)始前先跑它。醫(yī)學(xué)圖像分類(lèi)的視覺(jué)檢查和自然圖像不一樣很多圖片在普通人眼里長(zhǎng)得幾乎一樣但模型要學(xué)習(xí)的紋理特征就藏在這些細(xì)微差異里。腳本的作用是把每個(gè)類(lèi)別隨機(jī)抽幾張圖拼成網(wǎng)格展示出來(lái)確認(rèn)圖片能正常讀取、沒(méi)有黑圖或損壞文件順便對(duì)類(lèi)別特征有個(gè)直觀印象。import matplotlib.pyplot as plt import os import random from PIL import Image data_root data/train classes [d for d in os.listdir(data_root) if os.path.isdir(os.path.join(data_root, d))] fig, axes plt.subplots(len(classes), 4, figsize(12, len(classes) * 3)) for row, cls in enumerate(classes): cls_dir os.path.join(data_root, cls) imgs os.listdir(cls_dir) sample random.sample(imgs, min(4, len(imgs))) for col, img_name in enumerate(sample): img Image.open(os.path.join(cls_dir, img_name)) axes[row, col].imshow(img) axes[row, col].set_title(f{cls}) axes[row, col].axis(off) plt.tight_layout() plt.show()邏輯說(shuō)明這段腳本遍歷訓(xùn)練集下每一個(gè)類(lèi)別文件夾每個(gè)類(lèi)別隨機(jī)抽 4 張圖拼成一行網(wǎng)格。random.sample 做的是無(wú)放回抽樣避免同一張圖重復(fù)出現(xiàn)。參數(shù)說(shuō)明figsize 的第二項(xiàng)用 len(classes) * 3 動(dòng)態(tài)計(jì)算高度類(lèi)別越多圖越高min(4, len(imgs)) 是為了防止某個(gè)類(lèi)別的圖片數(shù)量不足 4 張時(shí)報(bào)錯(cuò)這屬于防御性寫(xiě)法資源里每類(lèi)都遠(yuǎn)超 4 張但寫(xiě)腳本時(shí)保留這個(gè)保護(hù)沒(méi)壞處。跑完 show 腳本我還習(xí)慣順手統(tǒng)計(jì)一下每個(gè)子目錄的具體數(shù)量這一步在分類(lèi)任務(wù)里的重要性超出很多人想象具體原因下一章展開(kāi)講。如果 show 腳本跑出來(lái)個(gè)別圖片是純黑或者明顯是損壞文件趁早剔除而不是等訓(xùn)練到一半 loss 異常再去排查。3. 把圖片喂進(jìn)模型yolov5 分類(lèi)模式與通用 CNN 兩條訓(xùn)練路線3.1 yolov5 分類(lèi)模式命令行訓(xùn)練與關(guān)鍵參數(shù)說(shuō)明這份數(shù)據(jù)集直接兼容 yolov5 的分類(lèi)模式這是最快跑通 baseline 的路線。yolov5 倉(cāng)庫(kù)里 classify 目錄下提供了獨(dú)立的訓(xùn)練入口不需要額外寫(xiě)數(shù)據(jù)加載器目錄結(jié)構(gòu)滿足約定后一行命令就能開(kāi)訓(xùn)。git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt # 使用官方分類(lèi)模型做預(yù)訓(xùn)練權(quán)重在腎臟數(shù)據(jù)集上微調(diào) python classify/train.py \ --model yolov5s-cls.pt \ --data ../kidney_dataset/data \ --epochs 50 \ --img 224 \ --batch 64 \ --name kidney_cls_run1這段命令的邏輯說(shuō)明--data 指向數(shù)據(jù)集根目錄yolov5 會(huì)自動(dòng)尋找該目錄下的 train 和 valid或 val子目錄--model 指定模型結(jié)構(gòu)同時(shí)加載官方在 ImageNet 上預(yù)訓(xùn)練好的權(quán)重遷移學(xué)習(xí)可以顯著加速收斂--img 224 是把輸入圖縮放到 224×224這是分類(lèi)模型在 ImageNet 上的標(biāo)準(zhǔn)輸入尺寸改成 320 或 640 可以提升小目標(biāo)細(xì)節(jié)的辨識(shí)度但顯存占用和訓(xùn)練時(shí)間會(huì)同步上漲。參數(shù)說(shuō)明里有兩個(gè)值得單獨(dú)拎出來(lái)--batch 64 依賴 GPU 顯存在 8GB 顯存以下的卡上建議降到 32 或 16否則會(huì)出現(xiàn) CUDA out of memory--name 是實(shí)驗(yàn)標(biāo)簽yolov5 會(huì)把權(quán)重和日志存到 runs/train-cls/name 目錄下?lián)Q一組超參就換一個(gè) name這是最簡(jiǎn)單的實(shí)驗(yàn)管理方式。訓(xùn)練完成后結(jié)果目錄里會(huì)自動(dòng)生成 confusion matrix 和 results.png那個(gè)混淆矩陣圖就是后文要重點(diǎn)看的東西之一。我一般會(huì)先跑 50 個(gè) epoch 看 loss 曲線是否正常下降再?zèng)Q定要不要加時(shí)間。醫(yī)學(xué)圖像數(shù)據(jù)集通常比自然圖像更「難學(xué)」因?yàn)轭?lèi)間差異小50 個(gè) epoch 往往還不夠收斂如果還有時(shí)間預(yù)算加到 100 epoch 效果會(huì)更好。yolov5 分類(lèi)模式默認(rèn)會(huì)做早停patience 默認(rèn) 100所以不用太擔(dān)心過(guò)擬合跑太久。3.2 通用 CNN用 torchvision 的 ImageFolder 手寫(xiě)一個(gè)數(shù)據(jù)加載器如果不想綁定 yolov5想自己控制模型結(jié)構(gòu)或做更精細(xì)的數(shù)據(jù)增強(qiáng)torchvision 的 ImageFolder 是最順手的加載方案。它做的事情正是章節(jié) 2.2 里說(shuō)的掃描根目錄下的子文件夾把文件夾名映射成整數(shù)標(biāo)簽返回 (圖像張量, 標(biāo)簽) 配對(duì)的數(shù)據(jù)集。這與本數(shù)據(jù)集的「文件夾保存」方式是完全對(duì)應(yīng)的不需要額外寫(xiě)標(biāo)簽解析邏輯。import torch import torch.nn as nn from torchvision import datasets, transforms, models # 訓(xùn)練集增強(qiáng)隨機(jī)水平翻轉(zhuǎn) 顏色擾動(dòng)抑制醫(yī)學(xué)圖像過(guò)擬合 transform_train transforms.Compose([ transforms.Resize((224, 224)), transforms.RandomHorizontalFlip(p0.5), transforms.ColorJitter(brightness0.2, contrast0.2), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), ]) # 驗(yàn)證集只做縮放和歸一化不做隨機(jī)增強(qiáng) transform_val transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), ]) train_ds datasets.ImageFolder(data/train, transformtransform_train) val_ds datasets.ImageFolder(data/valid, transformtransform_val) test_ds datasets.ImageFolder(data/test, transformtransform_val) train_loader torch.utils.data.DataLoader( train_ds, batch_size32, shuffleTrue, num_workers4, pin_memoryTrue) val_loader torch.utils.data.DataLoader( val_ds, batch_size32, shuffleFalse, num_workers4, pin_memoryTrue) # 用 ResNet18 做遷移學(xué)習(xí)把最后一層全連接換成 3 分類(lèi) model models.resnet18(weightsmodels.ResNet18_Weights.IMAGENET1K_V1) model.fc nn.Linear(model.fc.in_features, 3) criterion nn.CrossEntropyLoss() optimizer torch.optim.Adam(model.fc.parameters(), lr1e-3)邏輯說(shuō)明ImageFolder 返回的數(shù)據(jù)集對(duì)象自帶 classes 和 class_to_idx 兩個(gè)屬性classes 是文件夾名列表class_to_idx 是名字到數(shù)字的映射建議打印出來(lái)和類(lèi)別字典 json 對(duì)一遍防止字母序?qū)е碌臉?biāo)簽錯(cuò)位。驗(yàn)證集的 transform 不能帶隨機(jī)增強(qiáng)否則每次評(píng)估結(jié)果都有波動(dòng)無(wú)法橫向比較。參數(shù)說(shuō)明num_workers 在 Windows 上如果報(bào)多線程錯(cuò)誤就改成 0pin_memory 只在 GPU 訓(xùn)練時(shí)有意義CPU 訓(xùn)練可以刪掉。這里的優(yōu)化器只傳了 model.fc.parameters()意思是凍結(jié)主干網(wǎng)絡(luò)只訓(xùn)練新加的分類(lèi)頭先用這個(gè)配置跑通流程確認(rèn) loss 能降下來(lái)再解凍全部層做精調(diào)可以省一次從頭冷啟動(dòng)的時(shí)間。對(duì)比 yolov5 路線和通用 CNN 路線前者勝在開(kāi)箱即用日志、可視化、早停都內(nèi)置了后者勝在可控性強(qiáng)想換 loss、改 backbone、加自定義增強(qiáng)都方便。兩份數(shù)據(jù)是同一套切換路線的成本只在于重寫(xiě)數(shù)據(jù)加載器而這一節(jié)代碼可以直接復(fù)用到后續(xù)所有分類(lèi)實(shí)驗(yàn)里。3.3 loss 曲線的正常形態(tài)與異常形態(tài)跑通之后看什么不管用哪條路線訓(xùn)練起來(lái)之后第一件事是盯 loss 曲線。一個(gè)正常的訓(xùn)練過(guò)程train loss 在前 10 個(gè) epoch 應(yīng)該有明顯的下降趨勢(shì)val loss 緊隨其后下降但始終比 train loss 高一些。如果 val loss 先降后升而 train loss 還在降那就是過(guò)擬合信號(hào)需要增強(qiáng)正則化或提前停止。數(shù)據(jù)顯示這張表的對(duì)比場(chǎng)景我在 yolov5 的訓(xùn)練日志里整理過(guò)幾類(lèi)常見(jiàn)形態(tài)寫(xiě)在這里可以當(dāng)一份速查表用loss 曲線形態(tài)可能原因處理方式train/val loss 都不降學(xué)習(xí)率過(guò)大或過(guò)小、數(shù)據(jù)沒(méi)對(duì)齊先調(diào)到 1e-4 試跑 10 epoch確認(rèn)數(shù)據(jù)路徑正確train loss 降、val loss 升過(guò)擬合加數(shù)據(jù)增強(qiáng)、增大 weight_decay、提前停止兩個(gè) loss 都震蕩劇烈batch 太小或?qū)W習(xí)率偏大增大 batch 或降低學(xué)習(xí)率loss 為 NaN學(xué)習(xí)率過(guò)大、輸入含 NaN 像素用小學(xué)習(xí)率重啟檢查圖片是否損壞這里有個(gè)血淚經(jīng)驗(yàn)如果 train loss 在第一個(gè) epoch 就降到接近 0但不是收斂而是「假擬合」多半是標(biāo)簽和數(shù)據(jù)對(duì)不上——比如所有圖片被當(dāng)成同一類(lèi)。遇到這種詭異情況第一時(shí)間打印一個(gè) batch 的 data 和 label 出來(lái)人工核對(duì)不要急著調(diào)參這是深度學(xué)習(xí)圖像識(shí)別項(xiàng)目里最常見(jiàn)的「黑匣子」陷阱。4. 三類(lèi)標(biāo)簽的四個(gè)暗坑正常、結(jié)節(jié)、腫瘤容易翻車(chē)的地方4.1 類(lèi)別不平衡先數(shù)數(shù)再訓(xùn)練別等 loss 異常才回頭分類(lèi)任務(wù)里第一個(gè)暗坑就是類(lèi)別不平衡。摘要說(shuō)訓(xùn)練集總量 2800 張但沒(méi)保證三個(gè)類(lèi)別各 933 張現(xiàn)實(shí)是醫(yī)學(xué)圖像數(shù)據(jù)集里正常樣本往往比腫瘤樣本多得多。如果某個(gè)類(lèi)別只有 500 張而另一個(gè)有 1300 張模型會(huì)傾向于把模糊樣本預(yù)測(cè)為多數(shù)類(lèi)整體準(zhǔn)確率可能不低但少數(shù)類(lèi)的召回率會(huì)很難看。import os from collections import Counter def count_images(root): counter Counter() for cls in os.listdir(root): cls_path os.path.join(root, cls) if os.path.isdir(cls_path): counter[cls] len(os.listdir(cls_path)) return counter for split in [train, valid, test]: print(split, dict(count_images(fdata/{split})))邏輯說(shuō)明這段代碼統(tǒng)計(jì)每個(gè)集合下每個(gè)類(lèi)別的圖片數(shù)量輸出形如 {normal: 1200, stone: 800, tumor: 800} 的字典。拿到數(shù)量后做兩件事一是確認(rèn)每個(gè)類(lèi)別數(shù)量都在可訓(xùn)練范圍內(nèi)二是算一下最少數(shù)量的類(lèi)別能不能支撐訓(xùn)練。參數(shù)說(shuō)明如果發(fā)現(xiàn)某個(gè)類(lèi)別只有一兩百?gòu)堄袃煞N處理路徑一是對(duì)少數(shù)類(lèi)做過(guò)采樣在 DataLoader 里設(shè) sampler 按類(lèi)別權(quán)重抽樣二是用類(lèi)別權(quán)重加權(quán)損失函數(shù)把 torch.nn.CrossEntropyLoss 的 weight 參數(shù)設(shè)為 [1.0, 1.2, 1.5] 這類(lèi)與樣本量成反比的值。這是一個(gè)容易被忽略的地方驗(yàn)證集和測(cè)試集的比例分布也必須看一眼。很多項(xiàng)目訓(xùn)練集是平衡的但驗(yàn)證集因?yàn)殡S機(jī)劃分湊巧不平衡導(dǎo)致評(píng)估結(jié)果虛高或虛低。這份資源已經(jīng)劃分好了我們省了切分的力氣但「數(shù)數(shù)」這一步不能省。4.2 數(shù)據(jù)泄漏同一來(lái)源的圖片被拆進(jìn) train 和 valid醫(yī)學(xué)圖像和自然圖像有一個(gè)本質(zhì)區(qū)別同一病人的多次掃描切片之間高度相似。如果劃分?jǐn)?shù)據(jù)時(shí)只按文件名隨機(jī)打亂同一個(gè)案例的相鄰切片很可能同時(shí)出現(xiàn)在訓(xùn)練集和驗(yàn)證集里模型等于提前看過(guò)答案驗(yàn)證集指標(biāo)會(huì)虛高上真實(shí)場(chǎng)景就露餡。這張表的坑怎么識(shí)別看文件名。這份資源的文件名自帶.rf.加一串哈希的后綴如果多張圖片的哈希前綴相同大概率來(lái)自同一次標(biāo)注批次或同一個(gè)病例。檢查方法很簡(jiǎn)單對(duì)所有文件名提取哈希段統(tǒng)計(jì)同一個(gè)哈希前綴下的圖片是否被分到了不同集合。import os, re from collections import defaultdict def check_leakage(data_root): seen defaultdict(set) for split in [train, valid, test]: split_dir os.path.join(data_root, split) for cls in os.listdir(split_dir): cls_dir os.path.join(split_dir, cls) if not os.path.isdir(cls_dir): continue for fname in os.listdir(cls_dir): m re.search(r\.rf\.([a-f0-9]), fname) if m: seen[m.group(1)].add(split) leak {k: v for k, v in seen.items() if len(v) 1} return leak leak check_leakage(data) if leak: print(f發(fā)現(xiàn) {len(leak)} 組同源圖片被分到多個(gè)集合需重新劃分) else: print(未發(fā)現(xiàn)跨集合同源圖片)遇到數(shù)據(jù)泄漏時(shí)不要慌如果只是個(gè)別圖片串集直接刪掉測(cè)試集里那些同源圖片就行。如果比例很高要考慮重新劃分?jǐn)?shù)據(jù)劃分依據(jù)是哈希前綴而不是單張圖片文件名。這就是這份資源「按文件夾劃分好」背后的另一層價(jià)值劃分邏輯是可見(jiàn)的排查起來(lái)有跡可循。4.3 類(lèi)別字典與 ImageFolder 的索引順序不一致這個(gè)坑非常隱蔽我翻車(chē)過(guò)一次。ImageFolder 在構(gòu)建 class_to_idx 時(shí)按文件夾名的字典序排序如果類(lèi)別文件夾是 normal、stone、tumor索引恰好是 0、1、2但如果有人把文件夾命名成 normal、tumor、stone比如按創(chuàng)建時(shí)間排的那索引順序就變成 normal0、tumor1、stone2而類(lèi)別字典 json 里可能是 stone1、tumor2兩者對(duì)不上模型訓(xùn)練時(shí)的監(jiān)督信號(hào)就全亂了。# 打印 ImageFolder 實(shí)際生成的標(biāo)簽映射和類(lèi)別字典 json 對(duì)比 print(train_ds.class_to_idx) # 例如 {normal: 0, stone: 1, tumor: 2} # 讀取 json 里的映射 with open(data/classes.json, r, encodingutf-8) as f: json_map json.load(f) print(json_map) # 如果兩者不一致以 ImageFolder 為準(zhǔn)因?yàn)橛?xùn)練時(shí)用的就是它排查方法很簡(jiǎn)單把兩行打印結(jié)果并排對(duì)照。理論上這份資源在打包時(shí)已經(jīng)做過(guò)一致性校驗(yàn)但下載文件的版本可能不同json 也可能被編輯過(guò)跑這一步只需要一分鐘值得做。如果發(fā)現(xiàn)不一致解決方式是修改 json 字典的鍵順序而不是去改文件夾名因?yàn)槲募A名改起來(lái)牽連太多。4.4 隨機(jī)劃分的「看似隨機(jī)實(shí)則不隨機(jī)」最后一類(lèi)坑出在復(fù)現(xiàn)上。有人訓(xùn)練同一個(gè)模型兩次結(jié)果差異很大于是開(kāi)始懷疑模型問(wèn)題或者環(huán)境問(wèn)題但其實(shí)問(wèn)題出在數(shù)據(jù)加載順序。PyTorch 的 DataLoader 在 shuffleTrue 時(shí)用全局隨機(jī)數(shù)生成器洗牌如果不固定種子每次跑數(shù)據(jù)順序都不同結(jié)果自然不同。這在調(diào)參階段是災(zāi)難你不知道指標(biāo)變好是參數(shù)生效了還是隨機(jī)性帶來(lái)的。def seed_everything(seed42): import random import numpy as np random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) torch.cuda.manual_seed_all(seed) seed_everything(42)這段代碼要在訓(xùn)練腳本的最頂部執(zhí)行并且在 DataLoader 創(chuàng)建之前。參數(shù)說(shuō)明PyTorch 的 DataLoader 還可以單獨(dú)傳入 generator torch.Generator().manual_seed(42) 來(lái)控制洗牌隨機(jī)性這樣即便全局種子被其他庫(kù)污染數(shù)據(jù)順序依然可控。固定種子的價(jià)值在于讓每一次實(shí)驗(yàn)可復(fù)現(xiàn)這是深度學(xué)習(xí)項(xiàng)目從「玄學(xué)」走向「工程」的分水嶺。5. 圖像識(shí)別算法繞不開(kāi)的三件收尾驗(yàn)證分類(lèi)報(bào)告、混淆矩陣與誤判圖5.1 分類(lèi)報(bào)告別盯著準(zhǔn)確率看每類(lèi)的 precision / recall / f1訓(xùn)練結(jié)束后第一步跑測(cè)試集評(píng)估。很多人只看整體準(zhǔn)確率這對(duì)三分類(lèi)任務(wù)來(lái)說(shuō)遠(yuǎn)遠(yuǎn)不夠尤其在三個(gè)類(lèi)別數(shù)量不完全均衡時(shí)準(zhǔn)確率會(huì)被多數(shù)類(lèi)主導(dǎo)。sklearn 的 classification_report 一行代碼輸出每個(gè)類(lèi)別的精確率、召回率和 F1這三列合起來(lái)才能反映模型對(duì)每個(gè)類(lèi)的真實(shí)辨識(shí)能力。import torch from sklearn.metrics import classification_report, confusion_matrix device torch.device(cuda if torch.cuda.is_available() else cpu) model.to(device) model.eval() y_true, y_pred [], [] with torch.no_grad(): for images, labels in test_loader: images images.to(device) outputs model(images) _, predicted torch.max(outputs, 1) y_true.extend(labels.cpu().numpy()) y_pred.extend(predicted.cpu().numpy()) target_names list(train_ds.classes) print(classification_report(y_true, y_pred, target_namestarget_names))邏輯說(shuō)明model.eval() 是關(guān)鍵它關(guān)閉 dropout 和 batch norm 的訓(xùn)練行為否則同一張圖多次推理結(jié)果不同。torch.max(outputs, 1) 取的是每個(gè)樣本在 3 個(gè)類(lèi)別上的最大得分索引也就是模型的預(yù)測(cè)類(lèi)別。參數(shù)說(shuō)明target_names 直接取 ImageFolder 的 classes 屬性保證報(bào)告里的行順序和訓(xùn)練時(shí)一致不要手寫(xiě)類(lèi)名列表省得順序?qū)戝e(cuò)。這個(gè)報(bào)告還會(huì)輸出 macro avg 和 weighted avg前者是每個(gè)類(lèi)指標(biāo)的算術(shù)平均后者按樣本數(shù)加權(quán)兩者差距大說(shuō)明模型在少數(shù)類(lèi)上表現(xiàn)偏弱。5.2 混淆矩陣看模型把哪兩類(lèi)搞混了分類(lèi)報(bào)告給的是數(shù)值匯總混淆矩陣給的是錯(cuò)誤分布的具體位置。一個(gè) 3×3 的矩陣第 i 行第 j 列表示「真實(shí)類(lèi)別 i 被預(yù)測(cè)成 j」的樣本數(shù)對(duì)角線是預(yù)測(cè)正確的數(shù)量。看混淆矩陣我一般先找非對(duì)角線的最大值那個(gè)位置就是模型最容易混淆的類(lèi)別對(duì)。cm confusion_matrix(y_true, y_pred) print(混淆矩陣行真實(shí)列預(yù)測(cè)) print(cm) # 找出錯(cuò)誤最集中的位置 import numpy as np np.fill_diagonal(cm, 0) # 把對(duì)角線置零后剩下的最大值就是最嚴(yán)重的混淆 worst np.unravel_index(np.argmax(cm), cm.shape) print(f最嚴(yán)重混淆: 真實(shí){target_names[worst[0]]} - 預(yù)測(cè){target_names[worst[1]]}, 數(shù)量 {cm[worst]})對(duì)腎臟三分類(lèi)數(shù)據(jù)來(lái)說(shuō)最常見(jiàn)的混淆發(fā)生在結(jié)節(jié)和腫瘤之間因?yàn)閮烧咴谟跋裆系奶卣鬟吔绱_實(shí)模糊。如果混淆矩陣顯示 normal 和 stone 之間錯(cuò)誤很多那可能是標(biāo)注本身有問(wèn)題或者圖片采集條件不一致這時(shí)候去調(diào)模型是徒勞的要回頭查數(shù)據(jù)質(zhì)量。這一節(jié)里做的所有評(píng)估動(dòng)作本質(zhì)是回答一個(gè)問(wèn)題模型學(xué)到了什么又在什么地方學(xué)錯(cuò)了。5.3 誤判圖可視化把錯(cuò)誤樣本打出來(lái)看別再黑匣子調(diào)參混淆矩陣告訴你「哪里錯(cuò)了」誤判圖告訴你「錯(cuò)的是什么樣」。把預(yù)測(cè)錯(cuò)誤的樣本整理成網(wǎng)格畫(huà)出來(lái)標(biāo)題同時(shí)標(biāo)注真實(shí)類(lèi)別和預(yù)測(cè)類(lèi)別以及置信度分?jǐn)?shù)這一步對(duì)醫(yī)學(xué)圖像分類(lèi)尤其有價(jià)值。import matplotlib.pyplot as plt misclassified [] model.eval() with torch.no_grad(): for images, labels in test_loader: images, labels images.to(device), labels.to(device) outputs model(images) prob, pred torch.max(torch.softmax(outputs, dim1), 1) for i in range(len(labels)): if pred[i] ! labels[i]: misclassified.append((images[i].cpu(), labels[i].item(), pred[i].item(), prob[i].item())) if len(misclassified) 12: break if len(misclassified) 12: break fig, axes plt.subplots(3, 4, figsize(12, 9)) for idx, (img, true_label, pred_label, conf) in enumerate(misclassified): ax axes[idx // 4][idx % 4] img img.permute(1, 2, 0).numpy() img img * [0.229, 0.224, 0.225] [0.485, 0.456, 0.406] # 反歸一化 img img.clip(0, 1) ax.imshow(img) ax.set_title(f真:{target_names[true_label]}\n預(yù)測(cè):{target_names[pred_label]} ({conf:.2f})) ax.axis(off) plt.tight_layout() plt.show()這段代碼里的反歸一化是常見(jiàn)的坑模型訓(xùn)練時(shí)做了 Normalize 操作顯示圖片前必須用相同的 mean 和 std 還原否則看到的是一張偏色的圖無(wú)法判斷問(wèn)題出在哪。參數(shù)說(shuō)明clip(0, 1) 是為了防止數(shù)值越界導(dǎo)致圖像出現(xiàn)不自然的色塊。每次只取 12 個(gè)誤判樣本人眼能在一張圖內(nèi)快速瀏覽多了反而不容易看出規(guī)律。對(duì)誤判圖的觀察要落到具體模式上比如「所有被誤判成 tumor 的 stone 圖片都有明顯的強(qiáng)回聲區(qū)域」或者「正常樣本里有鈣化點(diǎn)所以被判成結(jié)節(jié)」。當(dāng)誤判呈現(xiàn)出明顯的視覺(jué)規(guī)律時(shí)說(shuō)明數(shù)據(jù)里有干擾特征下一步不是調(diào)模型結(jié)構(gòu)而是考慮加預(yù)處理步驟屏蔽干擾或者人工清理這些邊緣樣本。5.4 softmax 置信度的二次排查低置信度樣本單獨(dú)拎出來(lái)最后一層 softmax 輸出的置信度分布也值得看。醫(yī)學(xué)圖像分類(lèi)的實(shí)用場(chǎng)景里我們往往需要模型在拿不準(zhǔn)的時(shí)候「說(shuō)出來(lái)」而不是硬猜一個(gè)結(jié)果。統(tǒng)計(jì)一下測(cè)試集里置信度低于 0.6 的樣本數(shù)量如果占比很高說(shuō)明模型對(duì)大量樣本都缺乏把握部署時(shí)要考慮設(shè)置置信度閾值低于閾值的樣本轉(zhuǎn)人工審核。這個(gè)動(dòng)作的成本很低但對(duì)落地價(jià)值很大。yolov5 分類(lèi)模式在推理時(shí)會(huì)輸出每個(gè)類(lèi)別的置信度直接加判斷條件即可自己寫(xiě)的模型就是上面代碼里那個(gè) prob 變量。二分類(lèi)里有個(gè)概念叫閾值調(diào)整三分類(lèi)同樣適用只是要對(duì)每個(gè)類(lèi)分別設(shè)定。6. 三分類(lèi)項(xiàng)目收尾技巧把訓(xùn)練配置固化成一張復(fù)現(xiàn)清單訓(xùn)練完成、評(píng)估做完項(xiàng)目還沒(méi)結(jié)束。醫(yī)學(xué)圖像分類(lèi)模型如果要寫(xiě)進(jìn)報(bào)告或者準(zhǔn)備上線最忌諱的是「重啟之后不知道這次實(shí)驗(yàn)用了什么參數(shù)」。我的收尾習(xí)慣是把整次實(shí)驗(yàn)的可復(fù)現(xiàn)信息收斂成一個(gè)訓(xùn)練腳本或配置文件下次任何人跑一遍都能得到同一結(jié)果。# 訓(xùn)練復(fù)現(xiàn)腳本示例每次實(shí)驗(yàn)執(zhí)行前先讀取并記錄環(huán)境狀態(tài) export PYTHONHASHSEED0 python classify/train.py \ --model yolov5s-cls.pt \ --data data \ --epochs 100 \ --img 224 \ --batch 64 \ --seed 42 \ --name kidney_final參數(shù)說(shuō)明里有個(gè)容易被忽略的PYTHONHASHSEED 控制 Python 字符串哈希的隨機(jī)種子不固定它即使在代碼里調(diào)了 random.seed 和 torch.manual_seed某些依賴哈希次序的邏輯比如集合遍歷順序仍可能導(dǎo)致結(jié)果不一致。這個(gè)環(huán)境變量要放在訓(xùn)練命令的同一行 export而不是在 Python 代碼里設(shè)置因?yàn)樗诮忉屍鲉?dòng)前就必須生效。我還會(huì)在訓(xùn)練腳本同目錄下留一個(gè) data_report.txt把每次實(shí)驗(yàn)的數(shù)據(jù)集分布、類(lèi)別字典內(nèi)容、訓(xùn)練和驗(yàn)證的準(zhǔn)確率記錄在同一份文件里。這樣一個(gè)月后回來(lái)看不用重新打開(kāi)任何一個(gè)權(quán)重文件就能快速回憶起當(dāng)時(shí)的數(shù)據(jù)條件和模型表現(xiàn)那份文檔比模型權(quán)重本身更能說(shuō)明問(wèn)題。分享一個(gè)從不例外的習(xí)慣不管項(xiàng)目多急最后一輪實(shí)驗(yàn)完成后我強(qiáng)制自己用 10 分鐘把「數(shù)據(jù)集版本 劃分文件 訓(xùn)練命令 最終指標(biāo)」四件事寫(xiě)進(jìn)倉(cāng)庫(kù) README 里。做過(guò)的醫(yī)學(xué)圖像分類(lèi)項(xiàng)目里被返工最多的從來(lái)不是模型性能不夠而是后來(lái)者不知道當(dāng)時(shí)的實(shí)驗(yàn)是怎么配出來(lái)的。這類(lèi)資源真正的價(jià)值是幫你把數(shù)據(jù)從「看懂」推進(jìn)到「跑通」——如果這篇拆解幫你少走了彎路希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
伊人婷婷福利网| 91人人操人人爱| 婷婷色网站| 成人.在线日韩| 久久这里有精品视频| A1片久久久| 操99| 天天操天天干天天日| 色综合九九| 野战J办公桌椅H| 99九九综合久久九九| 久久性爱视频| 伊人久久大香线蕉av一区| 婷婷伊人无码| 婷婷情色五月天| 伊人在线视频| 色999亚洲人成色| 亚洲激情综合免费| 综合狠狠干| 狠狠色狠狠| 亚洲精品a成人在线播放| 色色色网站| 精品九九在线观看| 亚洲国产婷婷色五月| 超碰免费人人肏| 99热97| 视频这里只有精品16| 色婷婷色五月综合| 精品AV无码超碰| 九九激情| 五月色色色| 色色色色网色色网色色| 99热精品一| 伊人五月天97| 亚洲无码免费看| 日韩成人精品中文字幕| 色五月婷婷中文字幕| 少妇人妻人伦A片| 超碰AAAAAAV| 色999五月色| 狠狠综合久久综合| 一区操| 99久久免费精品| 丁香5月激情网| 性生活视频98791| 中文字幕综合色| 色婷婷基地 | 欧美99热| 五月天婷婷色| 91操操| 无码99| 婷婷五月天在婷| 丁香婷婷久久| WWW,激情五月天,COM| 超碰日韩人妻在线| 六六久久黄色| 综合久久婷婷99| 最新高清无码专区| 九九婷婷五月天| 五月激情啪啪| 狠狠五月婷婷| 九月激情综合| 亚洲va欧美va天堂v国产综合| 国产在线另类五月婷婷| 五月天激情子轮| 99在线观看亚洲| 五月丁香| 五月婷婷网久久| 九九热99免费视频| 五月丁香毛片| www.com.色色| 99精品人人| 婷婷色吧| 大功率国产在线| 五月丁香婷婷色| 五月丁香福利| 亚洲va欧美| 亚洲第一黄网| 国产韩日亚洲美州欧亚综合在线| 五月天婷婷激情干干| 婷激情五月天视频导航| 婷婷丁香午夜综合影视| 性爱在线播放av| 99久久婷| 99热这里只有精品13| 色青青视频| 婷婷五月开心中文字幕在线| 天天天天天天天操| 婷婷激情人妻| 中文字幕日产A片在线看| 婷婷久久久| 色吧五月| 啪啪日热| 日韩啪啪视频| 亚洲一区二区无码蜜乳av| 操逼在线视频| 天天综合久久| 成人综合网站| 人人操婷婷| 99热免费18| 黄色aa观看aaguochan| 久久色五月天| 亚洲色情久久| 99热这里都是精品| j五月香在线| 五月激情婷婷丁香| 大香蕉狼人久久| 五月丁香婷中文字幕| 亚洲乱码日产精品BD在线观看| 五月天激情AV| 久8色色| 综合网啪啪| 六月丁香啪| AA片在线观看视频在线播放| 荡乳尤物3HP1V5| 三级三久久线久久99久目本WW| 婷婷操婷婷干婷婷射| 丁香五月婷婷激情视频播放| 五月婷婷开心激情六月蜜桃| 五月婷婷色播视频| 久久色大香蕉| 97碰碰叉| 综合视频久久| 色色色色色网| 五月丁香六月色| 五月综合激情图片| 丁香成人综合| 79色色免费| 99九精品| 99热最新精品| www久| 五月丁香婷婷综合久久| 色婷婷基地| 99色综合网| 综合激情在线视频| 婷婷综合久久| 亚洲精品乱码久久久久99| 久久五月婷婷电影| 婷丁香久综合| 久久久er热| 成人五月天婷婷| 亚洲精品视频在线播放| 婷婷狠狠青青| 玖色色综合| 先锋男人91资源| 色亭亭丁香五月天| 久久AV无码精品人妻系列试探| 99操99| 91久久久久久| 五月伊人91| 人妻免费网站| 婷婷五月天性色| 六月天婷婷| 狠狠干,狠狠操| 色色亚洲视频| 国产SUV精品一区二区883| 亚洲精品99| 欧美精品中文字幕亚洲专区| 六月丁香啪| 三级99热| 六月婷婷综合| 777丁香六月青青草婷婷综合久月| 五月丁香拍拍激情综合| 婷婷激情社区| 五月伊人视频在线看| 久久久妻人人人| 激情婷婷五六月天| 综合五月激情| Av九九| 天天综合五月天| 99热99这里免费的精品| 伊人网啪啪| 日本三级日本三级99| 激情五月婷婷综合| 日本五月婷婷| 黄色激情网站在线观看| 亚洲一级色电影| 天天骑日日爽| 五月深爱激情网| 五月丁香六月激情在线| 婷婷五月天av| 操草草草| 五月天激情黄色小说在线观看| 五月婷丁香| 风流少妇A片一区二区蜜桃| 操操操B| BlACKEDRAW视频一区二区| 123日本不卡在线| 欧美成综合在线观看| 色婷久| 五月丁香婷婷色| 丁香六月AV| 国产日日操夜夜操的肉棒视频| 久久这里只有精品热在99| 91爱啪啪| 91女人18毛片水多国产| 天天射夜夜爽| 五月精品免费XXX| 激情欧美五月丁香| 色综合色| 丁香花婷婷五月天| 色丁香综合影院| 色五月天成人| 五月婷婷色播| 六月天无码网址| 激情五月天小说|五月天开心激情网|亚洲精品国产自在现线|黄色五月天 | 色综合久久伊伊婷婷五月| 丁香婷婷视频| 色婷婷丁香A片区毛片区女人区| 丁香五月天日韩无码| www狠狠com| 亚洲小说五月婷婷| 久久婷婷综合五月趴| 久久久中文| 99热这里只有精品98| 国洲夜色亚热在线久久| 六月婷伊人| 婷婷色在线视频| 午夜天堂一区人妻| 久草丁香婷婷五月天婷| 97精品综合久久内射| 99这里有精品久久97| 十月丁香九月婷婷综合| 成人视频网| 无码99| 婷婷五月综合基地| 天天色天天搡| AV性爱网| 97超喷视频在线观看| 久久综合丁香五月| 五月天婷婷爱| 婷婷综合干| 五月丁香综合啪啪| 九色无码| 色开心五月丁香| 五月婷婷六月激情在线| 婷婷久月| 久久综合五月情| 久久婷婷六月天| 噜噜在线| 99丁香五月婷婷在线| 久思思热视频在线观看| 9色在线| 99热免费18| 婷婷九月激情网| 亚洲AV成人片无码网站| 91青娱乐青青草| 五月综合影院| 超碰人妻公开在线| 激情婷婷五六月天| av中文在线| 激情婷婷色色| 日韩另类| 九九热黄色| 久久五月天激情婷婷| 能看的AV| 五月天婷婷社区久久综合| 色色色.com| 欧美在线视频99| 91精品综合久久久久久五月丁香| 91九色在线| 五月婷视频| 婷婷五月丁香六月伊人网| 欧美综合123区| 久久综合久色欧美综合狠狠| 欲求不满的人妻| 精品人妻在线| 99视频久久免费视频| 丁香五月天.com| 狠狠爱五月婷婷综合六月| 熟女激情网| 精品激情| 久久精品噜噜噜成人A∨色欲| 婷婷激情丁五月| 人人操AV| 色婷婷丁香五月高清在线| 久草五月婷婷| 国产九九一区二区三区| 97人人搞| 丁香五月婷婷啪啪| 人妻中文在线| 五月天·www·com| 欧美电影在线播放| 丁香婷婷伊人| 久操大屁股女人av| 欧日韩成人| 婷婷丁香五月激情密臀av| 九九视频这里只有精品| 99色五月| 五月婷婷成人| 天天日夜夜操五月| www,99色| 人人妻久久妻| 国产日韩av片| 色色色网站| 日日夜夜青青草| 六月五月天婷婷涩播在线| 婷婷丁香人妻| 超级97碰碰| 成人va在线播放| 精品操逼一区二区| 久久久香| 人妻狠狠操| 五月婷婷啪啪| 密桃激情五月天综合网| av激情在线| 久久婷五月综合| 日本乱论99| 综合五月婷婷| 米奇影视资源婷婷狠狠色激情欧美五月丁香| 97精品自拍视频| 国产精品视频免费看| 欧美日韩91| 在线,国产,色,热视频| 99在线精品免费视频| 久久精品亚洲一级牲爱综合| 九九色综合网| 亚洲精品国产A久久久久久| 2025年最新亚洲在线欧美| 国产4P视频精品五区| 97久久久久| 99久久a线观| 伊人激情综合| 97AV在线视频| 久久九九在线视频| 《久久综合九色综合97婷婷| 久久婷五月天| 久久久天天啊| 99精品在线观看视频| 91超碰人人操| 色婷婷五月天久久| 日本精品99| 丁香六月情| 91无码视频| 国产毛多水多女人A片| 伊人丁香花综合影院| 色综合av超碰| 国产精品18久久久| 97热精品| 5月丁香六月婷婷| 国产精品视频免费看| 另类图片五月天| 色色色色色网站| 久草A片| 99热这里只有精品8| 五月丁香色婷| 深爱五月月天| 99热在线观看99| 无码髙清| 伊人六月无码视频| 色综合久久综合中文综合网| 婷婷综合中文字幕| 婷婷色五月丁香六月欧美啪| 爱草人视频| 九九热青青草| 人与禽A片啪啪| 六月婷婷久久| 爱草视频在线| 综合激情婷婷| 九一牛视频探花| 99热97| 久久奄也去色色网站| 丁香五月综合激情性爱| 国产精品黑丝| 97在线观看| 六月丁香综合| 天天插综合| 欧美激情Va| 色九九综合热99| 欧美A级成人婬片免费看理论| 九月激情网| 丁香涩涩爱| 蜘蛛女免费观看完整版高清电影| 五月婷婷啪啪网| 教师性爱毛片| 99色在线| 六月色播| 99九九视屏| 91久久久久久| 人妻激情综合| 九九色大香蕉| 亚洲AV永久无码影院黑人| 免费看欧美成人A片无码| 五月婷啪| 亚洲99在线| 久噜久噜| www好屌操| 人妻久久做| 美女激情综合| 欧美成人日韩| 天堂五月婷婷| 亚洲视频无| 97操碰98| 91蝌蚪窝视频在线| 99精彩视频网站在线| 狠狠色狠狠操| 99色色视频| 亚洲AV日韩无码| 丁香五月天在线观看视频| 婷婷久久性爱| 97人妻碰碰碰久久香蕉| 五月丁香激情怕怕| 91大屁股精品| 超碰猛烈的性猛交| 91好好热日本在线| 丁香色影院| 亚洲性爱AV| 五月丁香啪啪啪| 激情综合婷婷| 99噜噜噜在线播放| 久久er99热精品一区二区| 婷婷五月影院| 开心五月深爱五月| 亚洲a色| 国产成人网站在线观看| 久久综合激情| 色播五月婷婷| 婷婷爱五月| a久久| 五月丁香婷婷婷婷综合网| 色色综合日韩| 操逼三区| 婷婷亚洲日本| 开心婷婷五月天电影院| 一区色色色色网| 天天射影| 五月婷婷成人w| se99在线| 天堂草在线看www| 国熟女视频| 少妇久久诱惑视频| 99亚洲无码| 婷婷深爱五月丁香| 在线观看av网站| 六月婷婷av| 激情小说视频图片| 成人午夜视频精品一区| 五月日韩中文字幕| 亚洲AV电影美洲AV电影| 4399亚洲视频| 婷婷丁香色五月天久久88| 色五月av伊人| 日韩精品二三区| 五月丁香婷婷激情视频| 99热在线观看精品| 人人爱国产| 激情综合激情综合| 亚洲久热| 中国无码av| 97婷婷久久丁香| 婷婷五月色影视先锋| 超碰人人干| 久久久久久久综合狠狠综合| 亚洲综合婷婷五月| 亚洲综合五月天婷婷丁香| 91精品久久久久久久| 综合五月婷婷| 狠狠色综合图片| AAA久久久AAA久久久AAA| 久久婷婷伊人| 1010日日无码| 九九99免费视频| 噜噜在线| 99热高清在线| 天天人人天天爽| 丁香五月婷中字幕| 老司机日日夜夜青草| 色婷婷综合视频| 自拍盗摄 另类| 在线可以看的av网址| 婷婷五月色天| www.狠狠操| 一级七香蕉| 丁香大香蕉| 99精品久久久久久久婷婷久久| 婷婷五月天狠狠色| 精品国产乱码久久久久夜深人妻| 丁香五月777| 丁香五月天在线视频| 亚洲VA在线| 激情五月影院| 成人丁香五月天| 精品欧美一区二区三区久久久| 超碰国产AV| xxxx五月| 五月婷婷官网色| 91超碰人人操| 六月丁香婷婷色狠狠久久| 开心深爱五月天| 色婷婷婷婷五月天| 婷婷五月天综合中文| 亚洲精品婷婷| 91中文狠狠综合| a免费在线| 婷婷综合欧美| www.狠狠操| 日本欧美成人片AAAA| 久久大香蕉伊人| 就99这里只有精品| 色婷婷久久久| 99日在线观看视频| 天天热夜夜操| CHINESE熟女老女人HD视频| 色婷婷色| 婷婷五月色亚洲| 九九婷婷五月天影视| 久久婷婷网| 99在线免费视频播放| 亚洲精99| 激情性爱五月| ...婷婷五月综合不卡,国产在线手机| se99在线| 五月天成人在线视频网站| 91热久久| 婷婷色偷拍| 色 五月俺去也| 99精品免费| 久久婷婷一级片| 秋霞午夜理论| 99色网站| 99 re视频一区| 婷婷五月天深爱| 97久久视频| 日日操夜夜操无码免费| se99视频| 97碰 在线视频观看| 五月激情丁香五月| 色99热| 99啪在线| AV性爱网| 亚洲av另类在线观看| 这里有精品99| 99久久这里只有精品| 亚洲黄色精品| 狠狠干综合网| 丁香婷婷综合激情五月色| 五月婷婷二月丁香| 丁香花综合永久入口| 中文字幕婷婷| 级情九色| 久热综合| 99精品在线| 色色国产| 精品国产va久久久久| 粉嫩av懂色av蜜臀av熟妇| 激情啪啪五月天| 五月伊人婷婷| 九色PORNY在线精品酒店| 五月天六月婷| 免费操超碰| 五月丁香 啪啪啪| 亚洲中文字幕在线观看| 五月噜噜噜色综合| www.婷婷| 婷婷久久六月天| 国产亚洲精品AAAA片APP| 色综合播放| 丁香啪啪| 五月天伊人av| 日曰躁夜夜躁2026| 丁香婷婷精品视频| 思思热精品在线视频| 香蕉综合在线| 超碰在线看| 色色99色色| 国产国产乱老熟女视频网站97| 深爱激情四射| 百度一下国产精品A| 欧洲激情五月天| 狠狠婷婷色| 五月丁香AV在线| 国产特黄色精品一区二区三区精品无广告| 婷婷王月天影院| 婷婷五月天丁香激情| 五月天激情小说| 99热青青草| 丁香五月六月| 狠狠干狠狠干狠狠干狠狠干| 欧美啪啪9| 丁香婷婷九月在线| 六月婷伊人| 欧美特大片黄| 久久ab| 丁香六月婷婷综合欧美| 97色天堂| 一点色成人网| 丁香六月色婷婷| 国产精品国产| 五月婷婷开心网| 激情丁香五月激情婷婷| 亚洲另类AV| 狠狠爱综合| 深夜婷婷五月丁香| 99国产97在线,| 99爱爱网| 色婷婷内射| 99@久久@99精品视频| www.激情| 天天看片日日夜夜| av一区免费看| 久久只有18视频| 五月丁香直播| 超碰在线综合| 大香蕉av在线| 99免费综合网| 91精品91久久久久77777| 激情五月开心五月丁香五月| 伊人网大香| 色婷婷丁香五月| 五月天婷婷人妻| 激情五婷网| 九九九九精品精| 五月天成人综合| 天天舔天天插天天爱| 欧美成人精品A片免费一区99| 男人的天堂五月丁香| 九九久久99精品免费观看www| 五月开心网| 亚洲这里只有精品| 6月丁香婷婷| 日日夜夜九九| 激情综合五| 婷婷五月天小说| 丁香六月婷婷高清| 激情小说色五月| 99热在线观看| 激情小说五月天| 91久久九久久九久久九久久九久久| 538在线精品| 综合网视频| 五月丁香五月综合欧美| 婷婷激情六月中文| 激情五月综合视频| 亚洲区,视频区,视频区免费| 丁香五月天无码AV| 亚洲成人日韩无码精品| 天天狠天天叉| 月婷婷婷婷五月| 五月天成人在线视频丁香| 亚洲有码在线视频| 色五月综合激情网| 涩涩涩五月天| 黄色一级影片| 俺也高清无码高清视频| 久热91| 97超级碰碰碰久久久| 久久五月综合| www,色婷婷| 色婷婷色情| 五月丁香亚洲校园欧美| 99精品国产在热久久婷婷| 91麻豆国产三级精品福利在线观看| 国产成人+综合亚洲+天堂| 开心五月丁香婷婷| 亚韩在线视频| 很很色丁香久久停停| av高清无码| 操丝袜视频影院导航| a网站免费观看| 日本色色网站| 香蕉五月婷婷| 99在线精品视频| 91精品久久久久久77777| 五月天婷婷综合免费| 99九九视屏| 99热99思午夜精品| 丁香五月激情宗合| 丁香五月婷婷激情网| 91操黄| 欧美叉叉叉BBB网站| 五月天婷婷色| 五月丁香久久网| 狠狠色婷婷六月激情网| 99视频精品8| 99热精品少| 欧美激情丁香五月| Av大香蕉| 色天使色婷婷| 超碰在线99热| 夜夜久久综合网| 9久热在线精品| 春色激情| 激情五月天天| 狠狠操狠狠色| 色噜婷婷| 久久aaaaa| 99视频在线看| 六月丁香天堂| 人人插9| 欧美日韩成人在线网站| 久久刺激网| 色五婷婷| 欧美色色色色色| 97狠狠色| 99热乎| 99视频色在线观看| 色拍九九九| 亭亭丁香aV| 精品色色| 日日操日日撸| 九九视频在线观看视频6 | 婷婷综合在线| 中国女人做爰A片| 免费看欧美成人A片无码| 激情又色又爽又黄的A片 | a在线免费v| 五月婷婷人人人操| 国产成人网址| 中文字幕簧片| 99思思热只有在这里看| 无码一级片| 日韩色五月| 9色在线| 超碰精品在线| 色色操| 99热综合| 99热在线观看精品| 激情婷婷丁香色五月| 婷婷色在线播放| 99re在线精品视频| 开心婷婷五月激情网小说 | www.jiujiujiu| 丁香婷婷影院| 老美AA片| 婷婷在线精品| 青青草伊人婷婷| 亚洲av网址| 综合久久97| 99热18| 五月婷成人网| 婷婷四色成人综合色视| 婷婷综合在线| 综合网五月| 97超碰婷婷五月天| av第一二区| 欧美天天爽| 亚洲婷婷乱乱丁香| 久久WW| 9色在线| 五月开心啪啪| 九九99在线免费在线观看视频| 天天干狠狠操| 丁香五月六月| 99自拍网| 婷婷D区| 91人碰| 欧美丁香婷婷天天操| 丁香婷婷色五月天| 五月激情视频| 亚州第一黄网| 九九热这里只有精品7| 丁香婷婷久久老熟女综合网| WWW.99热| 日本91在线播放| 九九久久99精品免费观看www| 天天插天天很| 狠狠色激情综合| 99在线视频资源| 国产精品久久久爽爽爽麻豆色哟哟| 婷婷九月丁香天堂丁香天堂| 亚洲激情无码久久| 能看的av网站| 色伦专区97中文字幕| 七七色色综合| 九九久久99| 男人天堂99| 色综合久久久无码中文字幕999| 96精品久久久久久久久| 丁香月五月天婷婷久久| 亚洲五月天婷婷| 久草婷婷| 性生活视频98791| 婷婷五月天人妻| www.91色| 午夜福利8055| 天天成人五月天| 天天综合五月| 五月丁香激情综合网官网| 大香蕉啪啪啪| 一丁香五月天月AV| 色色网站毛片| 色狠狠综合| 五月天婷婷激情小说电影| 99ER热精品视频| 五月丁香啪啪网| 五月丁香婷婷爱| 以及AA大片看看| caobi四区| 另类图片 五月激情| 色情综合网| 淫荡A片| 色色丁香激情五月| 97精品人人A片免费看| 丁香婷婷五月激情| 五月天亚洲综合网| 天天操天天插天天射| 日日色五月天| 91九九| 五月天天综合| 99热这里是精品| 以及AA大片看看| 婷婷久久国产视频| 五月天开心网| 色婷婷基地| 99干日本| 69综合在线| 开心婷婷五月中文字幕组| 日韩精品AV一区二区三区| 婷婷色网站| 欧美久久网| 色五月中文字幕| 99re热视频这里只精品| 婷婷五月丁香基| 国产欧美婷婷五月| 五月天激情亚洲| 中文字幕在线播放视频| 激情综合网五月| 欧美伊人9| 五月婷婷六月丁香玖玖玫瑰91| 9l视频自拍九色9l黑人| 伊人午夜综合色啪| 99精品偷自拍| 九九热在线观看视频网站| 男男野外做爰全过程69| 青青草搞屄视频网站| 日韩啪啪网| 99热综合| 亚洲丁香花色| 26uuu淫色| 99精品在线观看| 97碰碰叉| 婷婷综合五月天亚洲综合| 99热有精品在线观看| 色婷婷五月网| 天天色2017| 视色综合| 日韩精品在线观看9| 色射婷婷五月天| 91九色超碰| 五月天另类图片| 成人国产网| 丁香五月激情天AV无码| www色色色com| er99免费视频在线| 激情五月成年| 吉澤明步Av一區二區| 丁香五月婷综合| 丁香婷婷激情五月天无毒不卡蜜桃| 国产44页| 亚洲AV网站在线观看| 另类A片| 丁香五月婷婷影院| 婷婷五月综合欧美在线播放| 内射干少妇亚洲69XXX| 九九久久99| 伊人香大香蕉视频| 婷婷天天婷婷天天澡| 色一情一乱一乱一区9| 丁香五月最新地址| 色激情综合| 大香蕉久久| 99热这里有精品2| 五月丁香花激情啪啪网| 五月丁香六月激情综合| 色播五月丁香| 日韩艹比| 狠狠色婷婷7777久| 成人国产欧美大片一区| 岛国av电影网站| 美欧成人视频| 久操热| 综合激情五月丁香| 99碰碰碰| 色婷婷88| 色色色色色色色综合| www.99色在线| 丁香婷婷激情| 综合99久久天天综合| 亚洲色欲欧美一区二区三区| 色噜噜狠狠色综合成人99| 色婷婷精| 五月丁香天堂网| 性色欲情 网站| 日韩av手机在线观看| 播五月,色五月,开心五月播放器 | 久久总和99| 成人五月天在线观看| 人妻无码视频网| 丁香五月婷婷AV在线| 欧美日韩91| 大香焦啪啪啪| 久久艹99| 天天爽日日搞| 日本三级毛片| 日本色色色| 婷婷丁香人妻天天| 丁香五月天91| 天天肏视频| 99热这里只有精品2016| 色五月五月婷婷| 国产精品涩涩涩视频网站| 九九久热| 91精品综合久久婷婷九色| 色欲一区二区三区精品A片 | 婷婷五月噜噜| 五月婷中文字幕| 五月天色小说| 久久综合影院 | 九九婷婷五月天影视| 婷婷激情另类| 五月天伊人手机在线播放AV| 综合色色婷婷| 久久婷五月综合色| 天天成人综合| 五月婷视频| 亚洲俩性性爱图片久久第六页| 伊人激情网| 26uuu欧美| 日本丁香五月| 五月综合777| 专区无日本视频高清8| 欧美色婷婷| 狠狠色性| 久热久| VA婷婷| 丁香五月成人| 色五月婷婷开心| 天天操综合网站| 偷拍五月丁香| 丁香五月香蕉| AAA久久| 1024亚洲无码| 97超碰在线观看免费| 色欧美影院| 九九99久久| 婷婷综合伊人丁香| 婷婷五月天成人网| 综合网色| 日韩黄色影院| 九月丁香八月婷婷久久综合久97| 五月天天堂久久| 99热九九这里只有精品10| 亚洲色a| 五月综合婷婷久久在线| 26uuu欧美日本| 996热re视频精品视频| www.91色| 日韩一级| 久久久久激情| 天天做天天爱天天爽在| 夜夜操天天干| 婷婷97| 人人操91色| 乱精品一区字幕二区| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 另类激情四射| 99热在线极品极品| 青草视频在线观看视频| 丁香五月在线播放| 色中色综合| 日韩久久视频| 日本九九网| nvrentiantang av| 第四色婷婷五月| 妻久久久久| 亚洲精色| 淫视馆AV在线| 婷婷五月丁香第四色超碰在线| 五月婷婷三级| 国产精品A片| 婷婷五月天色色| 亚洲综合色婷婷文学| 九九综合色| 五月丁香AV在线| 久久五月综合| 九九综舍久久| av一区二区电影免费在线观看| 久久五月天激情婷婷| 丁香五月天堂| 国产成人AV| 亚洲小视频免费观看| 色99在线视频| 六月婷婷中文字幕| 色婷婷小视频| xxxx五月激情| 武则天精品久久| 91精品久| 伊人在线婷婷草| 超碰免费人人| 久久宗合影| 久久99久久99精品免观看软件 | 五月丁香婷婷激激激综合网色播| 婷婷五月激情中文字幕| 99精品视频推荐| 天天色色婷婷| 五月丁香色情| 夜夜 操无码| 色噜噜五月天| 婷婷五月天成人网| 激情五月五月婷婷| 色情综合| 欧美婷婷| 荫道BBWBBB高潮潮喷| 天天躁日日躁狠狠躁日日躁2022年5月9日 | 日本熟妇乱妇熟色A片蜜桃| 五月天激情婷婷| 另类天堂| 日韩艹比| 久久久久九九九九视屏小说88| 人妻啪啪啪| 免费无码毛片一区二区A片| 色999;丁香五月| 丁香婷婷色情| 色婷婷成人久久| 79色色色色| 国产99久| 99热99这里有免费的精品| 欧洲色色| 色99亚洲| 99精品久久| 丁香六月婷婷一区| 五月婷婷啪啪| 九九热视频网站| 天天日夜夜拍| 91碰| 亚洲激情五月天| 99热r| 成人看片网站| tingting五月天亚洲| 五月婷婷丁香六月| 丁香五月98| av一级棒av| 色五月xxx| 色色综合网站| 色婷婷小说| 丁香六月婷婷色XXXXX| av在线免费播放| 婷婷色五月亚洲| 人人草开心五月天| 久久综合性| 久久久国产精品黄毛片| 亚洲五月天色色| 99综合免费视频| 精品三区影院| 天天操加勒比| 亚洲国产精品SUV| 久久加勒比| 狠狠操狠狠爱| 日日干干天天干| 激情五月久久| 婷婷五月花西瓜| 99精品久久| 无码一区精品一区视频| 日本99视频精品免费播放| 思思热在线视频观看精品| 人人人操B超碰| 五月天婷婷免费| 国产亚洲精品AAAA片APP| 色播五月丁香综合| 99视频超级精品| 狠狠插日日干撸| 婷婷天堂综合| 久热99狠| WWW久久久| 色综合久久久久久久久五月| 久久狼人天堂| 亚洲av| 中文字幕在线日亚洲9| 激情五月婷婷综合视频| 成人在线精品| 97搞在线| 热99国产精品| 日韩在线婷婷五月天综合| 久久婷婷五月| 极品嫩草| 天天色天天干天天插| 亚洲人成色A777777在线观看| 99热精品在线观看| 激情五月天的婷婷| 九九热九九热精品| 亚洲AV网址| 热热色色五月天婷婷| 丁香五月情色| 99精品视频网| 色五月激情综合| 九九色网专区| 天天情天天狠天天透| www.五月天| 欧美大片免费观看| 狠狠色婷婷| 99热8| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 五月天激情影院| 中文字幕网站在线观看| 天天日,夜夜爽| 任你草| 97超级碰碰碰| 99热这里只有精品官网| 色色亚洲视频| 久婷婷婷| 99久久6| 五月丁香婷婷欧美| www.色综合.com| 亚洲99热| 亚洲成人AV电影在线| 天天操天天日天天爱| 热99只有里视频| 亚洲精品久久久久AV无码| 日韩AV免费电影在线播放| 99免费热在线精品| 日韩人妻无码精品| 182无码| 丁香五月第九色| 日日杆天天| 久久伊人婷婷| 天天干天天做| 涩涩激情五月婷婷| 婷婷六月色情| 亚洲熟妇AV乱码在线观看| 玖玖在线视频| 激情五月丁香社区| 97干视频在线| 婷婷色五月在线视频| 欧美日韩成人h| 婷婷色日本| 丁香五月婷婷基地| 日韩一区二区在线播放| 激情av| 熟女激情网| 色欲婷婷五月天丁香| 婷婷五月天亚洲综合网| 婷婷六月激情丁香| 国产毛片欧美毛片久久久| 丁香六月天婷婷在线| 99热这里只有精彩| 9色在线| 男女99免费视频| 另类国产区| 天天干天天做| 久久婷婷夜| 天天天干夜夜夜操| 久久九九99.www| 激情5月婷婷| 香蕉色色网| 99热国产这里只有精品| 91丨九色丨老熟女激情| 色婷婷综合五月| 五月日韩中文字幕| 久色中文| httpwww色com日本| 丁香婷婷在线| 五月婷综合| 色综合色色| 日本不卡一区二区三区| 色狠狠综合网| 九九综合九| 这里只有精品免费视频在线观看| 伊人九热| www激情婷婷com| 亚洲五月天色色| 久9免费视频| av一级棒av| 日韩在线aaa| 日本欧美啪啪| 都市激情小说婷婷| 综合久久六月| 激情五月丁香六月综合AVXXXX| 琪琪色五月天| 97色婷婷| 色八月婷婷| 99热| www.五月瑟| 婷婷五月激情五月丁香五月| 9l视频自拍9l视频自拍九色学生| 五月丁香无码| 亚洲热久久| 开心激情色婷婷五月天| 狠狠综合网| 天天cha成人综合网| 久久女伦| 五月天天天天天天天天天天天婷婷婷| 午夜丁香综合婷婷| 九九Av| 亚洲AV激情五月综合网| 婷婷字幕在线| 五月天婷婷综合网| 可以免费观看的av网址| 国产精品人成A片一区二区| 综合五月天天天天天五月| 丁香av网| 操操天堂| 欧洲亚洲免费视频9| 99ree6| 26uuu在线观看| 日韩成人av在线| 亚洲日韩一页精品发布| 蜜乳A√| 亚洲婷婷激情综合激情999精品| 五月天成人网在线观看| 色婷婷在线播放| 婷婷五月性感| 婷婷五月天美女21p| 日良久久| 日韩AV在线影片| 色播五月婷婷| 99惹在线精品免费观看| 超碰人妻公开在线| 五月天com| 久久婷婷五月天蜜桃| 激情五月综合婷婷| 99精品在线下载| 色五月,婷婷大香蕉| 日日夜夜干| 伊人9999| 国产成人网站在线观看| 免费看欧美成人A片无码| 亚洲天天操| 噜噜噜狠狠色综合| 99热有精品在线观看| 色婷另类| 婷婷五月丁香五月天| 99操免费视频| 噼里啪啦在线观看免费完整版视频| 九九热国产| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 9色视频在线| 亚洲十月婷婷综合| 狠狠色狠狠| 99热丁香| 日本噜噜色网| 香蕉视频91| 成人婷婷色综合| 亚洲综合网 665566| 极品五月天| 97操操操| 综合精品啪啪| 天天干天天插| 婷婷五月婷婷| 五月社区丁香| 婷婷激情性爱| 日操夜操天天操不卡| 色播五月天激情| 欧美α√| 六月丁香婷婷色综合| 久久与婷婷| AV操一操| 婷婷久久亚洲| 79色色免费| 另类图片激情五月| 综合久久五月| 久久久天堂国产精品女人| 另类图片五月天| 日日夜夜天天爽| 久久婷婷五月天| 五月丁香九九| 伊人久久婷婷五月综合97色| 99激情视频| 五月色综合| 日日夜夜爽| 婷婷丁香成人在线视频| 日本久久天堂| 激情丁香五月天图片| 色和综合网| 久久性视频| 六月婷婷五月天| 99热久久这里只有精品|