免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

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
返回資訊列表
五月婷婷丁香啪啪| 狠狠色丁香| 色婷婷AⅤ| 99狠狠| 狠狠操狠狠爱| 超级碰人人操人人干| 日本一级| 五月婷婷之综合激情| 猫咪伊人久久| 97日日碰碰| 丁香六月婷婷综合| 99国产性感视频| 先锋资源91| 亚洲欧美成人在线| 99爱在线视频| 丁香六月av| 天天天天天日| 免费黄色AV| 六月丁香婷婷网| 97超碰在线免费观看| 亚洲丁香花色| 五月婷婷AV| 丁香五月av在线| 久久东京热婷婷五月| 日韩在线看AV| 中文中文在线| 最近韩国日本免费高清观看| 成人在线99| 深爱综合网| 综合激情网| 91色涩| 1024在线视频| 99草在线免费观看视频| 热思思九九| 久热这里只有精品6| 亚洲第79页| 男人综合网| 五月丁香婷婷在线| 天天日天天舔天天摸| 久久婷五月影院| 99视频在线观看视频| 九月婷婷激情| 91丁香色五月| 日本操B片| 免费观看全黄做爰的视频| 中文字幕视频在线播放| 久久性视频| 五月天丁香久久| 色女伊人| 五月婷婷六月丁香激情| 五月综合婷婷五月| 免费观看的av| 伊人玖玖网| 久久这里都是精品| 能看的AV| 丁香婷婷激情五月天无毒不卡蜜桃| 99亚洲大片精品永久在线观看 | 丁香五月婷在线| 免费精品66| 操一区| 99欧美| 99人人干人人| 人人操AV| 激情q青青草在线婷婷| 99碰碰视频| 五月狠狠| 九九色99| 99在线观看视频精品| 五夜婷婷| 九九热视频首页/这里只有精品| 欧美va视频| 国产熟女大叫受不了| 色婷婷四色| 操婷婷久久| 色爱爱综合网| 大香蕉中文| 免费婷婷| 天天人人天天爽| 啪啪啪啪五月天| 逼逼AV| 99久久99热这里只有精品| 久久有码| 激情视频综合| 成人看片网站| 99久久高清视频| 色久99| 艹天天射| 婷婷精品免费久久| 亚洲综合激情五月久久| 色婷五月丁香久亚洲| va中文资源在线观看| 五月激情开心婷婷| 色色色色色网| 9l视频自拍9l九色成人| 国产三级在线播放| 五月婷视频久久| 538在线| 五月色导航| 六月丁香视频网站| 激情五月六月婷婷| 99免费在线视频| 中文字幕成人网站| 98永久精品| 国产成人av在线播放| 天天日狠狠| 互月天综合| 久热这里只有精品6| 九色自拍| 久热A片| 中文不卡av| www.色情五月天.com| 亚洲人妻AV| 久久网站观看免费欧洲国产 | 丁香五月婷婷激情尤物| 日本天天操| 伊人婷婷大香蕉在线| 日本99婷婷| 激情久久五月天| 五月丁香拍拍激情综合| 国产免费一区二区三州老师F1F1| 9色91视频| 亚洲xx网| 天天摸天天日天天舔| 國語久久婷| 婷婷五月综合激情| 8区视频在线| 久久久婷丁香五月| av中文在线| 久久婷婷五月天大香蕉| 色色色777| 国产精品五月天婷婷| 國語久久婷| 伊人综合网站| 另类激情五月天。| 五月天天综合| 五月婷婷,六月婷婷| av久热| 涩涩涩.com| 爆乳熟妇一区二区三区爆乳照片| 婷婷综合偷拍| 天天操综合网站| 婷婷色五月开心五月| 国产亚洲精品AAAA片APP| 五月丁香六月婷婷激情四射| 思思精品久久艹| 五月婷网| 91久久精品无码一区二区三区| www.十八禁不禁AV.com| 欧美在线视频99| www.五月天色色.com| 色色色欧美色色| 玖玖婷婷五月天| 99丁香五月婷婷在线| 久久草婷婷丁香网站| 丁香九月婷婷综合| 丁香婷婷色九月| 思思热久久婷婷五月天| 婷婷色色综合| 婷婷五月天天aV| 99激情| 久久9精品视频| 五月婷色激情五月| 91国产精品视频播放| 丁香六月狠狠| 超碰国产在线| 亚洲精品乱码久久久久99| 99亚洲无码| 99精品国产在热久久| 激情五月天婷婷| 热99免费在线| 97色97干| 色99在线视频| 国产67194| www.五月天| tingtingseav| 极品人妻videosss人妻| 大香蕉久久青青| 激情婷婷色小说| 狠狠干婷婷| 狠狠干综合网| 99久久网站| 欧美乱码国产一级A片| 婷婷五月综合激情免费视频| 色五月综合激情网| 婷婷丁香在线播放| 91一道本| 丁香激情四射| 99re热精品视频国| 婷婷五月花| 久热这里只有精品性色AV| 色5月婷婷色| 五月婷在线影院| 夜夜爱伊人| 久久婷婷色情7777网站| 99热免费观看| 激情久久综合网| 色色综合网。| 丁香五月先锋| 日本视频99| 97影院一级片| 亚洲综合干| 免费看欧美成人A片无码| 激情五月伊人婷婷| 日韩黄在免| 激情婷婷综合五月少妇| 日本97在线观看| 99国产视频网| 色五月婷婷中文字幕| 久久激情视频| 五月天激情无码高清 | 综合热无码| 婷婷色五月91啪啪| 久草a片| 欧美久久婷婷| 97人人干| 开心五月婷| 大鸡巴伊人网| 91超碰九色| 久久只有这里精品免费| 香蕉久日夜| 天天爽天天日| 丁香无五月网| 日本在线视频看se99| 久久丝袜婷婷| 99视频精品8| 色99超碰| 天天舔天天爽| 婷婷成年人免费视频| 亚洲一区国产传媒| 激情又色又爽又黄的A片| 天天综合永久| 免费观看亚洲AV片| 91av成人| 99热这里只有精品99| 天天爱天天日| 日hao1区| 无人区码一码二码三码医生系列| 97色啪| 婷婷激情丁香五月天综合| 久在热99| 综合色色色| 丁香五月在线观看完整版| 丁香五月最新网址| 婷婷的五月天另类视频| 久久这里只精品| 天天操人人干| 五月婷在线视频免费播放| 色琪琪一综合久久激情五月视频| 五月丁香婷婷色播无码| 久久97久久99久久综合欧美| 婷婷五月天AV| 激情欧美丁香五月| 天天cha成人综合网| AV网在线观看| 国产肥白大熟妇BBBB视频| 性综合网| 色丁香六月| 婷婷伊人75| 欧美电影在线播放| 婷婷五月天精品| 天天综合天综合| 激情五月,色五月| 91亚洲免费片| 五月激情综合婷婷| 超碰av在| 26uuu欧美| 亚洲成人免费电影| 婷婷色情网| 色导航色婷婷五月天在线观看| 操笔无码| 五月综合婷婷开心网| 六月丁香综合| 亚洲、欧美、国产另类笫二区| 欧美十二区| 91精品久久久久久综合五月天| 色噜噜狠狠色综合网| 丁香婷婷婷五月| hd五月婷婷在线| 天天干,天天舔| 五月综合激情| 中美日韩成人在线| 婷婷91| 日亚二欧美| 五月婷婷9| 久久婷综| 日韩三级视频一区二区| 99久久亚洲国产| 色综合久久8| 日韩AC在线免费观看| 国产69久久久欧美黑人A片| 五月丁香五月综合欧美| 午夜天堂一区人妻| 99爱操| 91打屁股免费看| 亚洲精品V天堂中文字幕| 综合网五月| 婷婷97| 婷婷六月色| 亚洲精品大片| 性按摩玩人妻HD中文字幕| 国产日韩欧美| 久久这里只有精品视频15| 亚洲精品第一国产综合亚AV | 欧美天堂久久| 人人摸人人| 色婷婷久久| 婷婷五月激情综合| 亚洲中字AV电影在线网站| 五月丁久久| 婷婷六月丁香五月图区| 五月亭亭欧美女人| 大香蕉五月丁香| 亚洲国产婷婷色五月| 久久精彩免费视频精彩免费视频| 激情五月婷婷伊人| 操一操干一干| 亭亭玉月丁香| 99视频热99| 91pornav在线| 丁香五月婷婷啪| tingting五月天亚洲| 久久人妻情侣| 97色天堂| 中文字幕乱码亚洲精品一区| 色色影院黄大片| 欧美色色色色色色色| 激情小说五月天社区丁香 | 思思热在线视频99| 97精品在线| 激情综合五月| 人妻六月天| xx久久| 激情综合婷婷五月| 激情五月色播五月| 99精品免费| 久久涩视频| 懂色av蜜臀av粉嫩av永陈冠希| 99热主页日本| 99.色| 五月天天久久香| 婷婷伊人网| 苗黎美女四级成人版一级二级毛片| 99婷婷色| 欧美日本综合网| 亭亭五月天黑人2014| 久久综合首页| 天天插操| 丁香五月激情婷婷视频| 亚洲色激情| 91久久久久久| 99免费青青蜜臀| 好好干Av| 婷婷五月天影院| 少妇人妻人伦A片| 男人天堂AV在线一区二区| 丁香五月花婷婷开心| ji'qi'luan'ren'lun| 夜夜夜夜夜操| 天堂综合久| 婷婷五月天va| 91爱啪啪| 亚州综合色| 亚洲综合干| 婷婷激情视频| 婷婷黄色网| 五月五婷婷网| 五月丁香激情婷婷| 国产精品岛国片在线观看免费| 五月丁香激情片| 色婷婷六月丁香综合欲精品| 香蕉久久国产AV一区二区| 超碰色婷婷| 婷婷深爱五月丁香网| 婷婷五月天色| 日本3级片偷拍网站| 丁香五月婷在线观看| 能看的AV| 99自拍视频在线观看| 五月丁香六月婷婷亚洲综合| 香蕉97碰碰碰欧美| 激情婷婷五月天伊人在线观看| 大香蕉久久婷婷精品综合| AV中文网| 激情五月综合色婷婷| www.精品99| 国产高潮白浆一区二区| 久久这里只有国产视频| 在线看的免费网站| 激情婷婷丁香五月| 欧美人与性动交CCOO| 亚洲免费看片| 婷婷五月天AV| 日韩成人电影AV| 五月综合激情网| 五月婷狠狠| 狠狠色性| 青草视频在线观看视频| 安息电影在线观看完整版| 玖玖综合色| 成人在线综合| 91精品综合久久婷婷九色| 色婷综合| 亚洲综合五月天| 色色色色色日韩午夜激情| 五月婷婷co.m| 亚洲中字AV电影在线网站| 久久久久久草黄色片AV在线观看| 五月婷久久| ww亚洲ww在线观看| 色九月婷婷| 五月天日日操夜夜操 | 日本99热| 26uuu欧美日韩| 99热这里只有精品3| 色噜噜狠狠色综合网| 开心激情婷婷| 丁香五月网址| 1024日韩| 在线五月色播| 久久婷婷五月天大香蕉| 五月天俺去也| 久99久99精品免| 综合色影院| 婷婷五月丁香91| 婷婷色色丁香五月天| 色五婷婷| 一起草av| 婷婷深爱五月丁香网| 大香蕉丁香五月| 婷婷十月激情综合网| 午夜av网| 大香蕉久| 天干天天干天天天天天| 五月丁香六月综合图| 天天做天天爱天天要| 色噜久| 五月天操逼网| 秋霞午夜理论| 成人 AV播放| av人人干| 密黄站| 成人做爰黄A片免费看直播室男男| 婷婷综合在线观看视频| 色噜久| 超碰99在线观看| 九九热再线九九视频免费在线观看| 欧美内射AAAAAAXXXXX| 甈你aaaaa| 99玖玖视频| 涩综合网| 99re热久久| 丁香五月婷婷少妇| 九九热在线观看视频| 日本特黄aaaaa| 欧美碰碰| 亚洲天堂久久| 色在线视频网2025| 久久丁香五月婷婷| 久久五月天精品视频| 亚洲熟妇无码乱子AV电影| 操91| 亚洲欧洲一二| 五月开心久久| 日日夜夜天天综合| 激情影院内射| 久久婷婷综合拍| 色色色成人网| 这里只有精品免费视频| 色色99色色| 极品嫩草| 婷婷五月花| 天天婷婷| 色综合久久伊伊婷婷五月| 中文字幕婷婷在线| 风流少妇A片一区二区蜜桃 | 色婷婷电影| 色色色色热| 秋霞黄色一级久久| 91chinese 在线| 国产精品18久久久| 高清不卡一区| 亚洲狠狠干| 婷婷五月色花丁香社区| 欧洲一区二区| 日本nghangse中文字幕| 公的粗大挺进了我的密道| 深爱五月天| 婷婷五月天激情小说网站| 爱久综合| 久久婷婷夜| 久久久国产精品黄毛片| 99热这里是精品| 激情五月综合| 操操操AV| 日本激情五月| 先锋男人99资源| 成人在线精品| 久婷久婷| 亚洲色图日韩网址| 色热久资源| 影音先锋一区二区三区| 97 A I色色| 激情丰满熟妇五月| 99热日韩这里只有精品| 亚洲无码另类| 爆乳熟妇一区二区三区爆乳照片| 九九超日本| 黄色片久久| 26uuu最新地址| 婷婷五月在线观看| 99色精品| 天天草天天摸| 激情综合丁香五月| 天天操综合网站| 五月婷婷综合色拍| 色综合五月婷婷狠狠干| 色婷婷五月基地在线| www.色婷婷| 9久热在线视频精品| 久在线综合69| 99久久婷婷综合| 99惹 精品在线| 久热一区| 日韩综合成人| 伊人久久丁香五月91| 嫩草AV久久伊人妇女超级A| www久久久| 中文字幕黄色片| 伊人www22综合色| 五月丁香综合影院| 久久婷婷色综合| 五月丁香婷婷网在线在线| 丁香五月婷婷在线观看| 俺去也综合| 情趣视频66| 五月丁香婷婷成人网| 操逼棍操逼| 五月天影院| 可以免费看AV网站| 天天爽夜爽| www.99热| 另类视频综合| 婷婷丁香六月| 香蕉AV777XXX色综合一区| 99精品视频在线观看| AA片在线观看视频在线播放| 综合色五月亭亭| 天堂在线伊久| 99资源在线| 色播五月天婷婷老师| 91精品婷婷国产综合| 五月丁香六月成人| 欧美天天草人人草| 亚洲天堂AAA| 五月丁香色婷婷综合| 午夜色丁香| 激情六月婷婷| 色五月成人| 超碰v| 综合aV在线| 亚洲第二AV| 综合久久五月天| 日本色频| 久久这里只有国产视频| 日日干日日| 丁香桃色网| 亚洲妇女熟BBW| 色色色色色日韩午夜激情 | 黄色AAAA韩国guochansanji| 久久999久久999久久999久久| 五月天激情久久| 涩涩五月天综合| 亚洲另类久久| 国产免费一区二区三区三州老师F1F1.CC | 五月婷婷很很色| 9久久精品视频| 91久热| 亚洲精品小视频| 人妻久久久久久久 | 欧美在线视频免费播放| 国产精品涩涩涩视频网站| 丁香操逼| 婷婷色激情网| 婷婷五月激情五月激情| 色五月婷婷综合| 色五月丁香91| 激情综合无码| 丁香九月婷婷色| 婷婷射综合| 麻豆AV一区二区三区| 激情伊人网| 色七色九九| 五月六月伦理| 99色热| 久热精品在看| 五月天成人网婷婷| 久久精品视频99| 久久无码成人| 成人看片网站| 激情五月天婷婷五月天| 天天天天天久久久久久| 色色五月婷婷| 一区二区三区四区牛| 婷婷欧美色| 日日爽夜夜爽| 五月丁香婷婷钟和色图| 婷婷六月激情小说网| 色五月丁香伊人五月| 人人草人人舔| 91要啪| 丁香五月婷在线| 九九99久久| 99er热精品视频| 久久奄也去色色网站| 婷婷性爱影院| 激情九九六月激情免费视频| 婷婷丁香人妻久久在线观看| 色婷网| 丁香婷婷九月| 久久99网| 9色小视频在线观看| 国产噜一噜天天噜| 色五月婷婷av| 五月激情婷婷国产精品久久久久久| 狠狠操.COM| www.色五月| 大香蕉五月天婷婷丁香91| 五月丁香狠狠| 变态 另类 在线 | www.狠狠色.com| 91Chinese在线| www五月天com| 婷婷五月激情五月激情| 九色在线五月婷婷网址| 亚洲欧洲自拍图片专区五月天| 久久五月婷| 97超碰在线免费观看| 五月丁香婷婷俺| 色爽干| 丁香婷婷丁香五月欧美人| 激情五月婷婷| 九九Av| 秋霞性爱AV| 日日干天天| 变态另类9| 99热99极品观看| 視频福利乱色| 99综合| 婷婷五月丁香色播| 天天干一干| 丁香五月天婷婷91| 在线成人视频免费| 99人人干人人| 久久久五月五丁香| www.99久久久| 狠狠色噜噜狠狠狠狠综合| 五月丁香婷婷啪啪| 天天操夜夜操| 桃色伊人在线| 九九爱激情| 丁香五月激情鲁| 五月丁香另类网| 婷婷草| 麻豆精品| 婷婷五月天堂| 2015好吊操| 日日夜夜狠狠| 思思精品久久艹| 超碰一区二区| 婷婷五月天综合网| 91婷婷色五月| AV大香蕉| 五月激情基地| 丁香五月天天| 黄色AV日韩| 色五月丁香五月激情五月激情| 婷婷综合五月| 五月丁香婷婷人体| 激情丁香五月天图片| 五月天丁香婷婷社区| 综合久久97| www色色com| 五月婷婷综合色啪首页| 日韩成人无码片| 婷婷五月色播| site:hcxsz888.com| 久久精品99国产精品日本| 欧美Va在线| 91日精品| 婷婷五月天伊人| 婷婷五月天com| 爱狠射| 99色色网| 狠狠色无码| 中文字幕+中文在线| 大香蕉综合| 婷婷一本和五月丁香| 92久操视频| 99自拍视频在线| YW无码| 1024国产| 色婷婷影音| 99热销国产这里有精品| 亚洲色色色| 五月婷婷在线视频观看| 激情宗合哪里能看| 99精品久久久久久久久| 这里只有精品免费| 婷婷色爱| 亚洲欧洲99| 色色色色色日韩午夜激情 | 激情综合五月激情XXXX| 丁香六月亚洲| 人妻22p| 五月天 无码| 五月丁香六月婷婷,婷| 久久182| 五月婷婷综合在线| 五月婷婷色五月| 五月色情婷婷开心五月天| av在线观看网址| 五月丁香影视| 91日视频| 中文不卡一二区| 九九色中文| 中文字幕av网站| 91碰碰碰| 97操视频| 婷婷五月六月| 六月婷婷七月丁香| 色婷婷五月天中文字幕| 日本三级网址| 玩熟女五十AV一二三区| 99热这里只有精品22| 99这里只有| 六月丁香婷婷色综合| 超碰超碰在线| 五月叮香啪| 五月天久久婷| 99热成人| 爱射综合| 97色天堂| 99亚州综合精品成人网| 五月天激情中文字幕| AV激情五月| 人人澡玖玖一| 五月婷婷六月色| 五月天深爱激情网| oVV4WIB3vFi8D| 九月婷婷综合| 99亚洲视频| 色欲色香综合网站| 天天爽夜夜操| 人人视频色| 五月激情开心婷婷| 日韩好吊操| 九九九这里只有精品| 九九干视频| 我想看国产大学生口爆吞精的视频| 色日本颜射| 极品人妻XXXXOOOO| a久久| 伊人五月天| 色婷婷丁香五月| 97碰碰人人| 亚洲午夜视频| 婷婷涩五月| 五月色丁香| 色婷婷天堂| 色五月涩涩婷婷| 天天噜噜| 天天影视天天爽天天草| 熟女激情五月天 | 免费啪啪亚州视频| 久艹大香蕉| 婷婷五月色综合| 无码髙清| 久久99久久99精品免观看粉嫩| 婷婷六月亚洲综合| 色婷久久| 久久婷网| 五月香婷婷| 婷婷五月天激情四射| 亚洲六月色| 五月天成人在线视频网站| 饮料下药迷倒漂亮女同事强干| 97 A I色色| 中文字幕在线日亚州9| 丝袜人妻| 免费视频无码| 亚洲亚洲人成综合网络| 色视频色综合91| 色婷婷中文| 99艹精品在线观看| 久久99久久久| 99久久久免费| 激情另类综合| 国产九月婷婷| 99热全是精品| 色情久久久| 亚洲一个色| 五月婷婷 六月丁香| 五月天激情图| 开心激情综合| 欧美日综合| 激情丁香五月| 99热热热天天人人人超超碰| 91九色PORNY中文啦| 久久九九中文字幕| 五月丁香婷婷爱激情综合网| 无码G高清天| 思思热国产在线| 日日操天天操| 狠狠干在线| 欧美日本免费一道免费视频| 亚洲视频码| 九九99精品视频| 99re思思在线视频| 岛国AV网站| 久久人人九九| 人妻熟女一区二区AV| 丁香9月婷婷| 9l视频自拍9l九色成人| 丁香五月婷婷激情视频播放| 丁香五月六月| 色婷婷网| 丁香六月欧美| 亚洲成人综合在线| 成人婷婷五月| 99久在线精品99re5热视频| 久草热在线视频| 国产97在线日韩亚洲女人被黑人巨大| 非洲一级AV| 国产六月婷婷| 色色色婷婷| 疯狂做受XXXX高潮A片| 9色小视频在线观看| 亚洲AV网站| 狠狠干思思热| 天天天天天日| 第四色色六月色综合| 深夜男女福利刺激影院一区| 婷婷激情五月天小说| 国产日比| Av在线不卡一区| 一起草av| av狠狠操| 欧美性猛交99久久久久99按摩| 免费超碰在线| 丁香婷婷免费| 成人五月天丁香婷| 婷婷综合丁香| 六月99天天婷婷激情综合| 九九在线这里只有精品视频| 五月丁香久久| 超碰人人91| 丁香六月婷婷社区| 在线综合婷婷| 色婷婷久久| 丁香五月WWW| 五月天色婷婷小说| 久久99网站| 国产精品成人网站| 五月丁激情| 九九热精品| 色婷婷91| 婷婷五月图片小说网| 五月丁香在线| 97婷婷狠狠| 婷婷伊人网| 亚洲精品一区中文字幕乱码| 91一起操| www.婷婷.com| 亚洲激情Av| 久久 这里只有精品1| 天天天天干| 五月丁香无码| 天天综合精品| 丁香社92视频| 日本成人小说婷婷六月| 欧洲色色| 播五月婷婷开心| 99在线观看视频| 91精品啪| 99热6色| 色99久草在线| 情五月亚洲婷婷| 熟女激情五月天| 久久精品99久久| 五月天婷婷7米| 午夜激情四射影院| 人人干AV| 草草女人亚洲| 岛国资源网| 婷婷综合五月| 丁香六月婷婷激情综合| 99热精品在线| 久操人妻| 啪啪啪综合网| 九九99在线免费在线观看视频| 99男人的天堂| 亚洲综合在线播放| 超级碰碰91| 丁香六月婷婷综合欧美| 色五月五月婷婷| 99偷拍视频在线日本| 亚洲男女激情| 色综合香蕉| 五月丁香亭亭| 亚洲小电影在线观看黄999| 狠狠色五月天| 九热久| 色婷婷五月天中文字幕| 日本三级大片| 色视频2025| 天天干天天做| 啪啪五月天啪啪| 亚洲亚洲人成综合网络| 99久久99热这里只有精品| 97爱艹婷婷开心丁香激情综合| 99性感视频| 色吧网综合| 51avj视频大全| 五月婷婷六月丁香玖玖玫瑰91| 五月天开心网| www.五月婷婷久久.com| 欧美日韩一区二区三区四区| 国产乱码久久| 国产又爽又猛又粗的视频A片| 六月丁香综合网| 天天肏天天舔AV| 色婷婷久久综合中文久久一本| 丁香婷婷婷五月综合色情| 婷婷刺激综合| 欧美一级色| 国产精品18久久久| 五月天婷婷深深爱| αV电影| 婷婷内射视频在线| 婷婷丁香社区网| 青青久在线视频免费观看| 综合五月激情网| 亚洲婷婷激情综合激情999精品| 亚洲婷婷91丁香| 另类色视频| 91男同视频| 久久丁香五月| 婷婷成人综合| 91无码一区人妻A片蜜| 国产午夜一区二区三区| 久久久久久久久久91| 五月丁香婷婷综合网| 成人网站免费sxj| 丁香天堂夜| 五月天综合网| 亚洲九九99精品视频在线播放| 婷婷黄色五月| 99这里都是精品6| 米奇影视资源777狠狠色婷婷五月天激情网 | 色优久久| 2025色婷婷| 九热视频| 亚洲综合色成丁香五月色| 天天天干夜夜夜操| 6月丁香婷婷| 狠狠婷婷日韩| 婷婷色五月激情| 丁香五月天av| 日本99在线| 亚洲欧州色情在线观看| 六月婷久久| 三级av在线| 丁香激情四射| 极品人妻videosss人妻| 国产综合婷婷| 激情丁香五月| 色噜噜狠狠色综无码久久合欧美| 久久婷婷五月国产激情综合片| 九九色插| a久久| 99热这里只有精品中文字幕| 79亚洲精品少妇| 另类视屏| 黄网在线免费观| 丁香九月婷| 色丁香五月天婷婷| 久鲁鲁色网| 久久hd| 五月丁香婷婷钟和色图| www.久久爱| 色婷婷六月丁香综合欲精品| 深爱 五月天| 伊人碰碰婷婷| 99日热在线视频| 五月天成人免费视频| 激情婷婷五月| 色五月视频无码播放| 99热爱爱干干日| 亚洲综合碰| 日本乱子人伦在线视频| 激情六月丁香| 久久国产色| 婷婷色五月色妇| 99热在线观看免费中文| 黄久久久| 天堂二区| 一本大道嫩草AV无码专区| 婷婷综合色| 日日综合网| 天天橾日日橾夜夜橾17| 思思热国产视频| 91互操| 欧美超碰亚洲| 春色激情| 大地9中文在线观看免费高清| 激情综合婷婷| 伊人玖玖网| 婷婷五月在线播放| 亚洲精品性色| 天天爽夜夜爽夜夜爽精| 超碰人人干| 久久99精品久久久久久噜噜| 91VIP在线观看| 丁香五月欧美婷婷综合| 天天干天天拍| 丁香五月欧美| 丁香五月婷婷六月| WWW.99热| 超碰色色综合| 激情中文在线| 五月欧美丁香在线观看| 丁香五月亚洲| 亭亭五月天成人| 99九九热视频免费| 婷婷五月综合色小姐小说| 草了bav视频在线观看| 丁香五月成人| 日本三级日本三级99| 狠狠色狠狠操| 丁香五月成人社区| 成人网站在线观看视频| 久久色天堂| www.婷婷五月天| 99色热视频| 九色自拍| 婷婷久久五月| 婷婷亚洲影院| 久久久久9999| 久久人妻久久| 久久精彩视频| 另类小说五月天| 久热久| 激情六月天| 国产精品A成V人在线播放 | 九九家庭影院| 九九99视频精品| 天天噜天天爱| 天天干天天 亚洲| 五月丁香激情欧洲啪啪| 涩涩涩.com| 天天干天天干天天干天天干天| 色五月丁香六月欧美综合| 夜夜操天天干| 久久人妻精品| 九热精品| 五月天色区| 九九色色| 久久久婷婷五月天| 色综合播放| 天天干天天操天天射| 99热大香蕉| 99热这里只有精品268| 久久99热免费| 国产精品久久久60086| 五月宗合激情网| 久色视频| 欧美精品999| 日韩另类| 一级黄在线| 亚洲无码九九九| 久久99久久99精品免观看粉嫩| 成人AV免费观看| xxxx五月激情| 99热这里只有精品50| 狠狠插狠狠操| 久久久久9999| 777米奇影视第四色| av不卡网站| 国产亚洲99久久| 久久婷婷五月天激情新地址| 色婷婷婷综合五月天| 久久久久思思热| 视频一二区| 激情综合亚洲| 182无码| 欧美日韩123| 天天上天天爽| 99热6这里只有精品| www99精品| 任你躁XXXXX麻豆精品| 在线综合91| www久久久| 色五月婷婷久久大| 激情五月天色| 99re这里有精品手机在线| 激情综合激情综合| 免费黄色片子| 五月婷婷之综合激情在线| 久久久久9| 丁香五月婷婷天| www.久久综合| 强辱丰满人妻HD中文字幕| 色情五月| 五月天激情偷拍| 日本熟女二区| 婷婷综合网| 激情综合网站| 开心婷婷五| 精品无吗va视频免费观看| 婷婷丁香成人| 色婷婷AⅤ| 丁香桃色综合网| 大香蕉久热| www免费在线视频| 色综合久久88色综合天天99| 午夜婷婷五月天在线| 日本久久高清| 操精品9| 色情婷婷| 婷婷五月天久久| 福利视频在线播放| 五月 成人 婷婷| 五月停停丁香| 高清无码入口| 欧美婷婷精品激| 国产丁香五月天婷婷| 大香蕉婷婷色| 婷婷六月久久| 99热精品在线播放观看| 夜夜久久综合网| 天堂在线观看视频| 五月天无码| 日亚二欧美| 91大操| 五月停停直播| 久久久18| 婷婷五月天午夜激情影院| 99在线国| 六月丁香啪啪啪| 亚洲成人高清在线| 日日爽日日| 国产性爱在线| 欧美丁香婷婷天天操| 婷婷久久五月天丁香| 九九伦子片| 五月人妻婷婷| www.夜夜| 婷婷五月色情天| 日本狠狠干| 日韩成人影片在线观看| 99爱视频在线免费观看| 五月婷婷婷| 26UUU欧美激情一区二区| 天天色色天天| 久99久视频精品| 五月色 亚洲| 天天干一干| 九九Av| 亚洲成人网在线观看| 另类视屏| 九九99久久| 99操网站| 影音先锋人妻出差| 欧类av怡春院| site:minyis.com| 色色色99| 五月天丁香六月综合| AV在线观看网站| 蜜臀av粉嫩av懂色av| 丁香五月天成人网站| 色婷婷精| 丁香五月综合网亚洲综合欧美狠狠 | 丁香六月激情综合| 久久这里只精品66| 91中文在线| 婷综合| 大香蕉久| 亚洲综合婷婷| 色色操| 26uuu青青| 五月婷婷综合激情| 99热在线观看| 久久久免费精彩视频| 狠狠搞五月天| 亚洲最大视频| 去干网av| 色情综合网| 婷婷久久五月天亚洲欧美国产日韩在线观看 | 丁香五月另类小说在线阅读| 色色热| 丁香五月婷婷亚洲综合精品在线| 国产美女无遮挡裸体毛片A片| 色婷婷狠狠18yy| 五月丁香婷婷俺| 996热re视频在线观看视频| 久久婷婷五月免费视频| 青青操丝袜美腿| 狠狠爱婷婷丁香| 久操福利| 婷香五月激情视频| 99极品视频| 午夜天天精品视频| 五月花婷婷丁香| 丁香熟女乱| 日韩在线视频网站| 热99国产精品| 国产成人精品亚洲线观看| 丁香激情六月天婷婷| 婷婷五月天最新网址| 可以看的av网站| 超碰9| 丝袜大香蕉| 五月天激情中文字幕| 五月色丁香婷婷综合| 99热综合色图| 伊人春天av| 精品爱欲五| 天天爱天天做天天| 日本久久婷| 噼里啪啦完整版中文在线观看| 久久婷婷操| 婷婷五月丁香色播| 五月天色色色| 五月丁香六月激情网| 日韩久操婷婷| 久久久激情视频| 亚洲AV激情五月综合网| 亚洲一区二区色图-亚洲精品国产精品乱码-成人AV | 久激情| 99热大| 婷婷丁香五月麻豆| 9九热视频| 99视频综合| 久久艹99| 丁香五月色播中文在线播放| 草草色情综合网| 亚洲色婷婷| 丁香五月色色色色| 综合五月激情| 99re免费精品视频| 色综合久久天天综合网| 亚洲Av成人在线观看| 99色色视频| 色五月婷婷激情| 中文字幕在线免费观看视频| 亚洲成人在线观看av| 色五月色图| 2025天天爽天天摸| 久久九九国产| 曰韩少妇内射免费播放| 日本在线va| 3pAV| 狠狠久综合| 粉嫩AV久久一区二区三区| 日韩啊啊啊| 丁香婷婷激情五月|