日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

手把手带你从0完成医疗行业影像图像检测三大经典模型InceptionV3-RestNet50-VGG16(附python源代码及数据库)——改变世界经典人工智能项目实战(一)手把手教学迁移学习

發布時間:2024/1/8 python 54 豆豆

手把手帶你從0完成醫療行業影像圖像檢測三大經典模型InceptionV3-RestNet50-VGG16

  • 1、遷移學習簡介
  • 2、項目簡介
  • 3、糖尿病視網膜病變數據集
  • 4、考慮類別不平衡問題
  • 5、定義模型質量
  • 6、定義損失函數
  • 7、預處理圖像
  • 8、搭建遷移學習網絡
    • VGG16 遷移學習網絡
    • InceptionV3遷移學習網絡
    • ResNet50遷移學習網絡
  • 9、動態創建小批量數據進行訓練
  • 10、測試集預測
  • 11、全部代碼
  • 其它資料下載

如果你想使用現在最火的ChatGPT來訓練屬于你的專屬ChatGPT模型,那你千萬不能錯過這篇文章。遷移學習是機器學習領域中的一種重要方法,它通過利用先前的學習經驗來提高當前任務的性能。本文通過3個經典的模型:InceptionV3-RestNet50-VGG16作為示例,為大家從0開始搭建了醫療影像行業遷移學習網絡,并獲取到了較好的準確度與結果一致性。而掌握好遷移學習的基礎知識和應用,你就能通過模型微調(也稱遷移學習),調用ChatGPT接口加上你的訓練集去訓練你的模型了。

1、遷移學習簡介

遷移學習(transfer learning)是將在特定領域的一個任務中獲得的知識遷移到另一個相似領域的相關項目的過程。它允許我們將在一個特定領域的任務中獲得的知識應用到另一個相似領域的相關項目中。在深度學習中,這通常意味著使用預先訓練好的模型作為解決新問題的起點。由于計算機視覺和自然語言處理問題需要大量的數據和計算資源來訓練有效的深度學習模型,遷移學習可以減少對大量數據和時間的需求,因此在這些領域非常重要。

在2016年的NIPS教程中,Andrew Ng指出遷移學習將成為繼監督學習之后推動機器學習商業成功的重要因素。這一預測正在變為現實,因為遷移學習現在被廣泛應用于各種需要人工神經網絡解決的困難問題。這引發了一個問題:為什么會出現這種情況?

從頭開始訓練人工神經網絡是一項艱巨的任務,這主要有以下兩個原因:

  • 人工神經網絡的損失面是非凸的。因此,它需要一組良好的初始權重才能得到合理的收斂。
  • 人工神經網絡有很多參數,因此需要大量的數據進行訓練。遺憾的是,對于許多項目而言,可以被用于訓練神經網絡的特定數據并不夠,但同時項目要解決的問題又非常復雜,需要依賴于神經網絡的解決方案。

本項目將介紹如何使用遷移學習來解決醫療問題

2、項目簡介

在醫療領域,糖尿病視網膜病變通常在糖尿病患者中發現,病人的高血糖會對其視網膜中的血管造成損害。糖尿病視網膜病變的檢測通常是手動檢測,即由經驗豐富的醫生通過檢查彩色的眼底視網膜圖像來完成。這樣的診斷過程通過會引人一定程度的延遲,進而導致治療的延誤。在本項目中,我們將使用遷移學習建立一個用于檢測人眼中的糖尿病視網膜病變的模型,通過輸人彩色視網膜眼底圖像來檢測是否存在糖尿病視網膜病變,并根據病變的嚴重程度進行分類。

下圖左側圖片是輕度糖尿病視網膜病變的視網膜,右側圖片是正常的視網膜。

3、糖尿病視網膜病變數據集

數據集下載鏈接: https://pan.baidu.com/s/1hsijpCLD5oF7G5NqspWAbQ?pwd=eu0j 提取碼: eu0j

該數據集包含來自2015年糖尿病視網膜病變檢測的圖像。每個圖像都已調整大小和裁剪,最大尺寸為1024 px。調整大小和裁剪的代碼可以在這里找到。

對于2015年糖尿病視網膜病變檢測圖像,為每個受試者提供左眼和右眼。圖像標記有受試者ID以及左或右(例如,1_left.jpeg是患者ID 1的左眼)。

臨床醫生已經在0到4的尺度上針對糖尿病性視網膜病變的嚴重性對每個圖像進行了評級:

0 - No DR 0 -沒有糖尿病視網膜病變
1 - Mild 1 -輕度糖尿病視網膜病變
2 - Moderate 2 -中度糖尿病視網膜病變
3 - Severe 3 -重度糖尿病視網膜病變
4 - Proliferative DR 4 -增生性糖尿病視網膜病變

與任何真實世界的數據集一樣,您將在圖像和標簽中遇到噪聲。圖像可能包含偽影、失焦、曝光不足或曝光過度。這些圖像是在很長一段時間內使用各種相機從多個診所收集的,這將引入進一步的變化。

文件夾說明:
labels.zip-包含2015年的訓練和測試標簽
resized train15.zip-包含2015年已調整大小和裁剪的訓練集圖像,總共35126個圖像。
resized test 15.zip-包含2015年已調整大小和裁剪的測試集圖像,總共53576個圖像。

4、考慮類別不平衡問題

類別不平衡是分類問題中的一個主要挑戰。下圖描繪了訓練集5個嚴重性類的類密度。


接近73%的訓練數據屬于類0,即沒有糖尿病視網膜病變。因此,如果我們碰巧將所有數據都標記為類0,那么準確度可能會達到73%,但是在實際生活中,我們寧愿在患者實際沒有某種健康問題的情況下誤判為有問題(假陽性),而不是在有某種健康問題的情況下誤判為沒有問題(假陰性)。因此,即使模型學會將所有數據歸類為類0,它的73%準確度也可能沒有太大意義。

檢測更高的嚴重性類別比檢測不嚴重類別更為重要。使用對數損失或交叉熵損失函數的分類模型的問題在于它的結果通常會有利于數據量大的類別。這是因為交叉熵誤差在最大相似性原則上更傾向于為數量更多的類別分配更高的概率。針對這個問題,我們可以兩件事:

  • 從具有更多樣本的類別中丟棄數據或者對類別進行低頻率采樣以保持樣本之間的均勻分布。
  • 在損失函數中,為類別賦予與其密度成反比的權重。這可以保證當模型未能對它們進行分類時,損失函數對低頻類別賦予更高的懲罰。

我們將使用方案二,因為它不涉及生成更多的數據或者丟棄現有數據。如果我們使用類頻率的倒數作為權重,我們將得到下表所示的類別權重:

我們將在訓練分類網絡時使用這些權重。詳見下面9、動態創建小批量數據進行訓練

5、定義模型質量

我們將對訓練集進行交叉驗證,使用標記的訓練數據構建模型,并在保留數據集上驗證模型。由于我們正在處理分類問題,因此準確度是一個有用的驗證指標。準確度定義如下:

這里,c是被正確分類的樣本的數量,N是用于評估的樣本總數。

我們還將使用二次加權kappa(quadratic weighted kappa)統計量來定義模型的質量,并與Kaggle標準相比,看我們建立的模型相較于基準是否有提升。二次加權kappa定義如下:

二次加權kappa表達式中的權重(wi,j)定義如下:

上述公式中包括以下內容:

  • N表示類別的數量。
  • Oi,j表示被預測為類別i且實際類別為j的圖像的數量。
  • Ei,j表示被預測為類別i且實際類別為j的圖像的期望數量,并假設預測類別與實際類之間相互獨立。

可查看更加詳細的關于二次加權kappa定義及示例。

6、定義損失函數

在本項目中,數據有五個類別,即沒有糖尿病視網膜病變、輕度糖尿病視網膜病變、中度糖尿病視網膜病變、嚴重的糖尿病視網膜病變和增生性糖尿病視網膜病變。因此,我們可以將其視為分類問題。對于我們的分類問題,輸出標簽需要進行獨熱編碼,如下所示:

  • 無糖尿病視網膜病變:[10000]T
  • 輕度糖尿病視網膜病變:[01000]T
  • 中度糖尿病視網膜病變:[00100]T
  • 嚴重糖尿病視網膜病變:[00010]T
  • 增生性糖尿病視網膜病變:00001]T
  • Softmax是用于在輸出層中呈現不同類別的概率的最佳激活函數,而每個數據點的類別交叉熵損失之和是要優化的最佳損失。對于具有輸出標簽向量y和預測概率p的單個數據點,交叉熵損失由以下公式給出:

    這里,y=[y1…yj…ys]T,且p=[p1…pj…p5]T
    同樣地,M個訓練數據點的平均損失可以表示為:

    在訓練過程中,基于上式得到的平均對數損失(average log loss)來產生小批量的梯度,其中M是所選的批量的大小。對于我們將結合驗證準確度監視的驗證對數損失,M是驗證集數據點數。由于我們將在K折交叉驗證(K-foldcross-validation)的每一折進行驗證,因此我們將在每個折中使用不同的驗證數據集。

    請注意,輸出中的類別具有序數性,并且嚴重性逐類遞增。因此回歸也可能是不錯的
    解決方法。大家也可以嘗試用回歸來代替分類,看看它是否合理。回歸的挑戰之一是將原始得分轉換為類別。

    7、預處理圖像

    不同類別的圖像將存儲在不同的文件夾中,因此可以很容易地標記它們的類別。博主寫了個分類代碼,可以直接修改文件夾地址,然后自動處理成不同類別的文件夾。具體python代碼如下:

    #!/usr/bin/env python3.8# -*- coding: utf-8 -*- # @Time : 2023/3/24 10:24 # @Author : Steven Hu # @FileName: split_data.py # @Software: PyCharmimport os import shutil import random import pandas as pddef split_dataset(folder_path, train_folder_path, validation_folder_path):# Get all list of files in the folderfiles = []for root, dirs, file_ in os.walk(folder_path):# 這里可以進行判斷,如果不是要搜索的就跳過;# 也可以對 `files` 列表進行遍歷,以達到具體文件的搜索if len(file_):file_path_list = [str(root) + os.sep + str(i) for i in file_]files.extend(file_path_list)# Split the dataset by 80%-20%train_files = random.sample(files, round(0.8 * len(files)))validation_files = [file for file in files if file not in train_files]# Copy the files from original folder to training folderif not os.path.exists(train_folder_path):os.makedirs(train_folder_path)for file in train_files:shutil.copy(file, train_folder_path)# Copy the files from original folder to validation folderif not os.path.exists(validation_folder_path):os.makedirs(validation_folder_path)for file in validation_files:shutil.copy(file, validation_folder_path)def class_generation_from_train(csv_file, source_dir, class_list=None):# 如果train中沒有分類,需要運行該函數,對class進行分類# 讀取excel中的數據if class_list is None:class_list = ["class0", "class1", "class2", "class3", "class4"]df = pd.read_csv(csv_file)# 獲取指定文件夾中的所有文件名file_list = os.listdir(source_dir)for class_ in class_list:path_ = os.path.join(source_dir, class_)if not os.path.exists(path_):os.makedirs(path_)# 遍歷所有文件for filename in file_list:# 依次在excel中查找,如果找到對應行,則根據excel中指定列的值,將文件移動到以該值命名的文件夾中filename_ = filename[:-4]if filename_ in df['image'].values:row = df[df['image'] == filename_]target_dir = row['level'].values[0]target_dir = os.path.join(source_dir, "class" + str(target_dir))source_path = os.path.join(source_dir, filename)target_path = os.path.join(target_dir, filename)os.rename(source_path, target_path)if __name__ == '__main__':# 先隨機80%-20%拆分訓練集和驗證集folder_path = r"E:\Data\resized train 15"train_folder_path = r"E:\Data\train_validation\train"validation_folder_path = r"E:\Data\train_validation\validation"split_dataset(folder_path, train_folder_path, validation_folder_path)# 再對訓練集和驗證集內進行class分類train_csv_file = r'E:\Data\labels\trainLabels15.csv' # 這個是訓練集的label文件testLabels15.csvclass_generation_from_train(train_csv_file, train_folder_path,["class0", "class1", "class2", "class3", "class4"])class_generation_from_train(train_csv_file, validation_folder_path,["class0", "class1", "class2", "class3", "class4"])# 再對測試集進行class分類test_folder_path = r"E:\Data\resized test 15"test_csv_file = r'E:\Data\labels\testLabels15.csv' # 這個是測試集的label文件class_generation_from_train(test_csv_file, test_folder_path,["class0", "class1", "class2", "class3", "class4"])

    我們使用OpenCV函數讀取圖像,并調整它們的尺寸,如224x224x3。我們將參照ImageNe數服集從每個圖像中逐通道減去平均像素強度。這樣可以保證在模型上訓練之前,糖尿病視像將數存的圖像濕度與所處理的Imagener 圖像具有相同的強度范圍。一旦完成預處理,機像將被存儲在一個numpy 數組中。圖像預處理函數可以定義如下:

    def pre_process(img):resized_img = cv2.resize(img, (224, 224), cv2.INTER_LINEAR)resized_img[:, :, 0] = resized_img[:, :, 0] - 103.939resized_img[:, :, 1] = resized_img[:, :, 0] - 116.779resized_img[:, :, 2] = resized_img[:, :, 0] - 123.68return resized_img

    我們通過通過行間插值的方法將其大小調整為(224,224,3)或其他任意指定維度。

    ImageNet 圖像的紅色、綠色和藍色通道的平均像素強度分別為103.939、116.779和123.68。預訓練模型是在從圖像中減去這些平均值之后進行訓練的。這種減去平均值的方法是為了使數據特征標準化,將數據集中在0附近有助于避免梯度消失和梯度爆炸問題,進而有助于模型更快地收斂。此外,每個通道標準化有助于保持梯度流均勻地進人每個通道。由于我們在這個項目中使用預訓練模型,因此合理的做法是在將圖像輸人預訓練網絡之前,每個通道也基于同樣的方式進行標準化。然而,使用基于預訓練網絡ImageNet的平均值來校正項目中的圖像并非強制要求,也可以通過項目中訓練集圖像的平均像素強度來進行標準化。

    同樣,還可以選擇對整個圖像進行均值歸一化,而不是分別對每個通道進行均值歸一化。這需要從圖像自身中減去每個圖像的平均值。想象一下,CNN中識別的物體可能來自不同的光照條件(如白天和夜晚)。而我們希望無論何種光照條件,都能正確地對物體進行分類,然而,不同的像素強度將不同程度地激活神經網絡的神經元,這會增加對象被錯誤分類的可能性。然而,如果從圖像中減去每個圖像的平均值,則該圖像對象將不再受到不同照明條件的影響。因此,根據具體圖像的性質,我們需要自己選擇最佳的圖像標準化方案,不過任何默認的標準化性能都不錯。

    另外為了擴充數據,我們將使用keras的ImageDataGenerator在圖像像素坐標上進行仿射變換(affine transformation)來生成額外的數據。我們主要使用的仿射變換是旋轉、平移和縮放。具體代碼如下:

    datagen = ImageDataGenerator(horizontal_flip=True, vertical_flip=True, width_shift_range=0.1,height_shift_range=0.1,channel_shift_range=0, zoom_range=0.2,rotation_range=20,preprocessing_function=pre_process)

    從定義的生成器中可以看出,我們啟用了水平和垂直翻轉,這會生成分別沿水平軸和垂直軸反射得到的圖像。類似地,我們還讓圖像沿寬度和高度方向平移10%像素位警旋轉范圍限制在20度的角度范圍內,而縮放因子則定義在原始圖像的0.8~1.2以內。

    8、搭建遷移學習網絡

    我們現在將使用預訓練的ResNet50、InceptionV3和VGG16網絡進行實驗,并找出能夠獲得最佳結果的網絡。每個預訓練模型的權重都基于ImageNet。我在下面提供了 ResNet InceptionV3和VGG16架構的原始論文鏈接以供參考。建議讀者閱讀這些文章,深入了解這些網絡架構以及它們之間細微的差別。
    以下是VGG論文的鏈接:
    論文題目:Very Deep Convolutional Networks for Large-Scale Image Recognition
    以下是ResNet 論文的鏈接:
    論文題目:Deep Residual Learning for Image Recognition
    以下是InceptionV3論文的鏈接:
    論文題目:Rethinking the Inception Architecture for Computer Vision

    論文百度下載鏈接:
    鏈接: https://pan.baidu.com/s/1B6XklxnrwCBCkmNd1ATOYw?pwd=tpwm 提取碼: tpwm

    VGG16 遷移學習網絡

    VGG16是一個16層的CNN,它使用3x3的濾波器和2x2 感受野(receptive field)進行卷積。整個網絡中使用的激活函數都是ReLU。VGG架構是由 Simonyan 和 Zisserman 開發的,它是2014年ILSVRC比賽的亞軍。VGG16網絡由于其簡單性而獲得廣泛的普及,而且它是用于從圖像中提取特征的最流行的網絡。

    使用VGG16網絡進行遷移學習,還是比較簡單,使用在ImageNet上預訓練的VGG16的權重作為模型的初始權重,然后對模型進行微調。凍結了前幾個層(默認為10層)的權重,因為在 CNN 中,前幾層會學習檢測通用的特征,如邊緣、顏色構成等。因此,不同領域圖像的通用特征不會有很大差異。凍結層是指不訓練特定于該層的權重。我們可以嘗試不同的凍結層數量,并采用提供最佳驗證結果的凍結層數量。由于我們現在面臨的是多分類任務,因此最終輸出層選擇了softmax激活函數。具體代碼如下:

    def VGG16_pseudo(dim=224, freeze_layers=10, full_freeze='N'):model = VGG16(weights='imagenet', include_top=False)# model = VGG16(weights=r'E:\learning_AI\Intelligent_projects_using_python\weights\vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5', include_top=False) # 如果上面運行出現網絡下載錯誤,建議先下載權重后,使用權重地址x = model.output # 從預訓練的網絡中提取最后一個最大池化層的輸出x = GlobalAveragePooling2D()(x) #確保池輸出是一維數組格式,而不是二維點陣格式x = Dense(dim, activation='relu')(x) # 連接一個全連接層,這個dim可以自定義成其它值,比如512x = Dropout(0.5)(x) # 防止過擬合x = Dense(dim, activation='relu')(x) # 再連接一個全連接層,這個dim可以自定義成其它值,比如512x = Dropout(0.5)(x) # 防止過擬合out = Dense(5, activation='softmax')(x) # 這里輸出必須是分類數量的單元數model_final = Model(input=model.input, outputs=out)if full_freeze != 'N':for layer in model.layers[0:freeze_layers]:layer.trainable = Falsereturn model_final

    VGG16_weights下載百度鏈接:https://pan.baidu.com/s/1pBz70iEtHe2PTXX7Mw20uw?pwd=wic3 提取碼: wic3

    InceptionV3遷移學習網絡

    InceptionV3是來自谷歌的最先進的CNN。InceptionV3架構不是在每層使用固定大小的卷積濾波器,而是使用不同大小的濾波器來提取不同粒度級別的特征。Inception是2014年ImageNet競賽的冠軍,前五錯誤率為6.67%,非常接近人類的表現。InceptionV3層的卷積塊如下圖所示。

    具體代碼如下:

    def inception_pseudo(dim=224, freeze_layers=30, full_freeze='N'):# model = InceptionV3(weights='imagenet', include_top=False) # 如果下載不了,則直接使用權重地址賦值到weights參數上model = InceptionV3(weights=r"E:\learning_AI\Intelligent_projects_using_python\weights\inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5",include_top=False)x = model.output # 從預訓練的網絡中提取最后一個最大池化層的輸出x = GlobalAveragePooling2D()(x) #確保池輸出是一維數組格式,而不是二維點陣格式x = Dense(dim, activation='relu')(x) # 連接一個全連接層,這個dim可以自定義成其它值,比如512x = Dropout(0.5)(x) # 防止過擬合x = Dense(dim, activation='relu')(x) # 再連接一個全連接層,這個dim可以自定義成其它值,比如512x = Dropout(0.5)(x) # 防止過擬合out = Dense(5, activation='softmax')(x) # 這里輸出必須是分類數量的單元數model_final = Model(input=model.input, outputs=out)if full_freeze != 'N':for layer in model.layers[0:freeze_layers]:layer.trainable = Falsereturn model_final

    需要注意的一點是,由于InceptionV3是一個更深的網絡,因此可以擁有更多的初始層。在數據有限的情況下,不需要訓練模型中的所有層是一個優勢。如果我們使用較少的訓練數據,則整個網絡的權重可能會導致過擬合。而凍結層可以減少需要訓練的權重數量,因此提供了某種形式的正則化。由于初始層學習與問題領域無關的通用特征,因此它們是最適合凍結的層。我們還在完全連接層中使用了dropout,以防止過擬合。

    InceptionV3_weights下載百度鏈接:https://pan.baidu.com/s/1pBz70iEtHe2PTXX7Mw20uw?pwd=wic3 提取碼: wic3

    ResNet50遷移學習網絡

    ResNet50是一個深度CNN,它實現了殘差塊(residualblock)的概念,與VGG16網絡非常不同。在一系列卷積-激活-池化操作之后,塊的輸入再次反饋到輸出。ResNet構由 Kaiming He 等人開發,雖然它有152 層,但其實并沒有VGG網絡復雜。該架構以3.57%的前五錯誤率贏得了 2015 年ILSVRC 競賽,這比競賽數據集的人工標注成績還要好。前五錯誤率是通過檢查目標是否在最高概率的五個預測類別中得到的。實際上,ResNet網絡嘗試學習殘差映射,而不是直接從輸出映射到輸入,如下圖所示。

    具體代碼如下:

    def resnet_pseudo(dim=224, freeze_layers=10, full_freeze='N'):# model = ResNet50(weights='imagenet', include_top=False) # 如果下載不了,則直接使用權重地址賦值到weights參數上model = ResNet50(weights=r"E:\learning_AI\Intelligent_projects_using_python\weights\resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5",include_top=False)x = model.output # 從預訓練的網絡中提取最后一個最大池化層的輸出x = GlobalAveragePooling2D()(x) #確保池輸出是一維數組格式,而不是二維點陣格式x = Dense(dim, activation='relu')(x) # 連接一個全連接層,這個dim可以自定義成其它值,比如512x = Dropout(0.5)(x) # 防止過擬合x = Dense(dim, activation='relu')(x) # 再連接一個全連接層,這個dim可以自定義成其它值,比如512x = Dropout(0.5)(x) # 防止過擬合out = Dense(5, activation='softmax')(x) # 這里輸出必須是分類數量的單元數model_final = Model(input=model.input, outputs=out)if full_freeze != 'N':for layer in model.layers[0:freeze_layers]:layer.trainable = Falsereturn model_final

    ResNet50_weights下載百度鏈接:https://pan.baidu.com/s/1pBz70iEtHe2PTXX7Mw20uw?pwd=wic3 提取碼: wic3

    9、動態創建小批量數據進行訓練

    如果你的電腦內存較低,建議使用小批量加載數據進行訓練,在訓練時只加載小批量數據的方式之一是通過隨機地處理不同位置的圖像來動態地創建小批量。每個小批量中處理的圖像數量等于我們指定的小批量大小。當然,在訓練期間動態地創建小批量會有一些性能瓶頸,但這些瓶頸可以忽略不計,特別是諸如 keras 之類的具有高效的動態批量創建機制。我們將利用keras 的flow_from_directory數間動態創建小批量,以減少訓練過程需要的內存。同時使用ImageDataGenerator行圖像增強。相關代碼如下:

    def train_model(train_dir, val_dir, batch_size=16, epochs=40, dim=224, lr=1e-5, model='ResNet50'):model_final = self.inception_pseudo(dim=dim, freeze_layers=30, full_freeze='N') # 默認選擇為'InceptionV3'if model == 'Resnet50':model_final = self.resnet_pseudo(dim=dim, freeze_layers=10, full_freeze='N')if model == 'VGG16':model_final = self.VGG16_pseudo(dim=dim, freeze_layers=10, full_freeze='N')train_file_names = glob.glob(f'{train_dir}/*/*')val_file_names = glob.glob(f'{val_dir}/*/*')train_steps_per_epoch = len(train_file_names) / float(batch_size)val_steps_per_epoch = len(val_file_names) / float(batch_size)train_datagen = ImageDataGenerator(horizontal_flip=True, vertical_flip=True, width_shift_range=0.1,height_shift_range=0.1,channel_shift_range=0, zoom_range=0.2, rotation_range=20,preprocessing_function=pre_process)val_datagen = ImageDataGenerator(preprocessing_function=pre_process)train_generator = train_datagen.flow_from_directory(train_dir,target_size=(dim, dim),batch_size=batch_size,class_mode='categorical')val_generator = val_datagen.flow_from_directory(val_dir,target_size=(dim, dim),batch_size=batch_size,class_mode='categorical')print(train_generator.class_indices)# 如果有GPU則直接用GPUphysical_devices = tf.config.experimental.list_physical_devices('GPU')if physical_devices:tf.config.experimental.set_memory_growth(physical_devices[0], True)joblib.dump(train_generator.class_indices, f'{self.outdir}\class_indices.pkl')adam = optimizers.Adam(lr=lr, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)model_final.compile(optimizer=adam, loss=["categorical_crossentropy"], metrics=['accuracy'])reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.50, patience=3, min_lr=0.000001)early = EarlyStopping(monitor='val_loss', patience=10, mode='min', verbose=1)logger_path = self.outdir + os.sep + 'keras-epochs_ib.log'logger = CSVLogger(logger_path, separator=',', append=False)model_name = self.outdir + os.sep + 'keras_transfer_learning-run.check'checkpoint = ModelCheckpoint(model_name,monitor='val_loss', mode='min',save_best_only=True,verbose=1)callbacks = [reduce_lr, early, checkpoint, logger]model_final.fit_generator(train_generator, steps_per_epoch=train_steps_per_epoch, epochs=epochs, verbose=1,validation_data=(val_generator), validation_steps=val_steps_per_epoch,callbacks=callbacks,class_weight={0: 0.012, 1: 0.12, 2: 0.058, 3: 0.36, 4: 0.43})model_to_store_path = self.outdir + os.sep + modelmodel_final.save(model_to_store_path)return model_to_store_path, train_generator.class_indices



    從上面日志可以看到,InceptionV3模型得到接近72%的驗證準確度和0.403的二次Kappa得分。當然讀者也可以嘗試使用其它的模型和訓練超參,最后獲得更高的驗證準確度。其它詳細訓練代碼詳見11、全部代碼

    10、測試集預測

    讀者可以通過9、動態創建小批量數據進行訓練保存的模型,對測試集數據進行預測,然后獲取到測試集準確度和二次Kappa得分,具體代碼如下:

    # !/usr/bin/env python3.8# -*- coding: utf-8 -*- # @Time : 2023/3/24 9:07 # @Author : Steven Hu # @FileName: TransferLearning.py # @Software: PyCharmimport numpy as npnp.random.seed(1000)import pandas as pd import time import warningswarnings.filterwarnings("ignore") from sklearn.metrics import cohen_kappa_score from tensorflow.keras.models import load_model from tensorflow.keras.preprocessing.image import ImageDataGenerator import cv2# 平均化預處理圖片,使其能滿足ImageNet pre-trained model 圖片要求 def pre_process(img):resized_img = cv2.resize(img, (224, 224), cv2.INTER_LINEAR)resized_img[:, :, 0] = resized_img[:, :, 0] - 103.939resized_img[:, :, 1] = resized_img[:, :, 0] - 116.779resized_img[:, :, 2] = resized_img[:, :, 0] - 123.68return resized_imgdef prediction_test(model_path, test_dir, class_dict=None, dim=224):if class_dict is None:class_dict = {"class0": 0, "class1": 1, "class2": 2, "class3": 3, "class4": 4, }print(test_dir)model = load_model(model_path)test_datagen = ImageDataGenerator(preprocessing_function=pre_process)test_generator = test_datagen.flow_from_directory(test_dir,target_size=(dim, dim),shuffle=False,class_mode='categorical',batch_size=1)filenames = test_generator.filenamesnb_samples = len(filenames)pred = model.predict_generator(test_generator, steps=nb_samples)print(pred)df = pd.DataFrame()df['filename'] = filenamesdf['actual_class'] = df['filename'].apply(lambda x: x[:6])df['actual_class_index'] = df['actual_class'].apply(lambda x: int(class_dict[x]))df['pred_class_index'] = np.argmax(pred, axis=1)k = list(class_dict.keys())v = list(class_dict.values())inv_class_dict = {}for k_, v_ in zip(k, v):inv_class_dict[v_] = k_df['pred_class'] = df['pred_class_index'].apply(lambda x: (inv_class_dict[x]))return dfdef main():start_time = time.time()test_results_path = r'E:\learning_AI\Intelligent_projects_using_python\resutl_test\test_results.csv'model_path = r"E:\learning_AI\Intelligent_projects_using_python\output_transger_learning\keras_transfer_learning-run.check"test_dir = r'E:\Data\resized test 15'test_results_df = prediction_test(model_path, test_dir)test_results_df.to_csv(test_results_path, index=False)print(f'Validation results saved at : {test_results_path}')pred_class_index = np.array(test_results_df['pred_class_index'].values)actual_class_index = np.array(test_results_df['actual_class_index'].values)print(pred_class_index)print(actual_class_index)accuracy = np.mean(actual_class_index == pred_class_index)kappa = cohen_kappa_score(pred_class_index, actual_class_index, weights='quadratic')print("-----------------------------------------------------")print(f'Validation Accuracy: {accuracy}')print(f'Validation Quadratic Kappa Score: {kappa}')print("-----------------------------------------------------")print("Processing Time", time.time() - start_time, ' secs')if __name__ == "__main__":main()


    從上面日志可以看到,InceptionV3模型訓練后的模型再53576張測試圖片集中也取得接近72%的驗證準確度和0.406的二次Kappa得分。當然讀者也可以嘗試使用其它的模型和訓練超參,最后獲得更高的測試準確度。

    11、全部代碼

    #!/usr/bin/env python3.8# -*- coding: utf-8 -*- # @Time : 2023/3/24 9:03 # @Author : Steven Hu # @FileName: TransferLearning_ffd.py # @Software: PyCharmimport numpy as npnp.random.seed(1000)import os import pandas as pd import time import warningswarnings.filterwarnings("ignore") import tensorflow as tf from sklearn.metrics import cohen_kappa_score from tensorflow.keras.models import Sequential, Model from tensorflow.keras.layers import Dense, Dropout, Flatten from tensorflow.keras.layers import GlobalMaxPooling2D, GlobalAveragePooling2D from tensorflow.keras.models import load_modelfrom tensorflow.keras.applications.inception_v3 import InceptionV3 from tensorflow.keras.applications import ResNet50 from tensorflow.keras.applications.vgg16 import VGG16 from tensorflow.keras import optimizers from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint, CSVLogger from tensorflow.keras.preprocessing.image import ImageDataGenerator from tensorflow.keras.callbacks import ReduceLROnPlateau import joblib import json from pathlib import Path import glob import cv2def pre_process(img):resized_img = cv2.resize(img, (224, 224), cv2.INTER_LINEAR)resized_img[:, :, 0] = resized_img[:, :, 0] - 103.939resized_img[:, :, 1] = resized_img[:, :, 0] - 116.779resized_img[:, :, 2] = resized_img[:, :, 0] - 123.68return resized_imgclass TransferLearning:def __init__(self):self.path = r"E:\Data\train_validation"self.train_dir = r"E:\Data\train_validation\train"self.val_dir = r"E:\Data\train_validation\validation"self.class_folders = json.loads('["class0","class1","class2","class3","class4"]')self.dim = 224self.lr = float(1e-4)self.batch_size = 128self.epochs = 1self.initial_layers_to_freeze = 10self.model = "InceptionV3"self.folds = 5self.outdir = "E:\learning_AI\Intelligent_projects_using_python\output_transger_learning"def inception_pseudo(self, dim=224, freeze_layers=30, full_freeze='N'):# model = InceptionV3(weights='imagenet', include_top=False) # 如果下載不了,則直接使用權重地址賦值到weights參數上model = InceptionV3(weights=r"E:\learning_AI\Intelligent_projects_using_python\weights\inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5",include_top=False)x = model.output # 從預訓練的網絡中提取最后一個最大池化層的輸出x = GlobalAveragePooling2D()(x) #確保池輸出是一維數組格式,而不是二維點陣格式x = Dense(dim, activation='relu')(x) # 連接一個全連接層,這個dim可以自定義成其它值,比如512x = Dropout(0.5)(x) # 防止過擬合x = Dense(dim, activation='relu')(x) # 再連接一個全連接層,這個dim可以自定義成其它值,比如512x = Dropout(0.5)(x) # 防止過擬合out = Dense(5, activation='softmax')(x) # 這里輸出必須是分類數量的單元數model_final = Model(input=model.input, outputs=out)if full_freeze != 'N':for layer in model.layers[0:freeze_layers]:layer.trainable = Falsereturn model_final# ResNet50 Model for transfer Learningdef resnet_pseudo(self, dim=224, freeze_layers=10, full_freeze='N'):# model = ResNet50(weights='imagenet', include_top=False) # 如果下載不了,則直接使用權重地址賦值到weights參數上model = ResNet50(weights=r"E:\learning_AI\Intelligent_projects_using_python\weights\resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5",include_top=False)x = model.output # 從預訓練的網絡中提取最后一個最大池化層的輸出x = GlobalAveragePooling2D()(x) #確保池輸出是一維數組格式,而不是二維點陣格式x = Dense(dim, activation='relu')(x) # 連接一個全連接層,這個dim可以自定義成其它值,比如512x = Dropout(0.5)(x) # 防止過擬合x = Dense(dim, activation='relu')(x) # 再連接一個全連接層,這個dim可以自定義成其它值,比如512x = Dropout(0.5)(x) # 防止過擬合out = Dense(5, activation='softmax')(x) # 這里輸出必須是分類數量的單元數model_final = Model(input=model.input, outputs=out)if full_freeze != 'N':for layer in model.layers[0:freeze_layers]:layer.trainable = Falsereturn model_final# VGG16 Model for transfer Learningdef VGG16_pseudo(self, dim=224, freeze_layers=10, full_freeze='N'):model = VGG16(weights='imagenet', include_top=False)# model = VGG16(weights=r'E:\learning_AI\Intelligent_projects_using_python\weights\vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5', include_top=False) # 如果上面運行出現網絡下載錯誤,建議先下載權重后,使用權重地址x = model.output # 從預訓練的網絡中提取最后一個最大池化層的輸出x = GlobalAveragePooling2D()(x) #確保池輸出是一維數組格式,而不是二維點陣格式x = Dense(dim, activation='relu')(x) # 連接一個全連接層,這個dim可以自定義成其它值,比如512x = Dropout(0.5)(x) # 防止過擬合x = Dense(dim, activation='relu')(x) # 再連接一個全連接層,這個dim可以自定義成其它值,比如512x = Dropout(0.5)(x) # 防止過擬合out = Dense(5, activation='softmax')(x) # 這里輸出必須是分類數量的單元數model_final = Model(input=model.input, outputs=out)if full_freeze != 'N':for layer in model.layers[0:freeze_layers]:layer.trainable = Falsereturn model_finaldef train_model(self, train_dir, val_dir, batch_size=16, epochs=40, dim=224, lr=1e-5, model='ResNet50'):model_final = self.inception_pseudo(dim=dim, freeze_layers=30, full_freeze='N') # 默認選擇為'InceptionV3'if model == 'Resnet50':model_final = self.resnet_pseudo(dim=dim, freeze_layers=10, full_freeze='N')if model == 'VGG16':model_final = self.VGG16_pseudo(dim=dim, freeze_layers=10, full_freeze='N')train_file_names = glob.glob(f'{train_dir}/*/*')val_file_names = glob.glob(f'{val_dir}/*/*')train_steps_per_epoch = len(train_file_names) / float(batch_size)val_steps_per_epoch = len(val_file_names) / float(batch_size)train_datagen = ImageDataGenerator(horizontal_flip=True, vertical_flip=True, width_shift_range=0.1,height_shift_range=0.1,channel_shift_range=0, zoom_range=0.2, rotation_range=20,preprocessing_function=pre_process)val_datagen = ImageDataGenerator(preprocessing_function=pre_process)train_generator = train_datagen.flow_from_directory(train_dir,target_size=(dim, dim),batch_size=batch_size,class_mode='categorical')val_generator = val_datagen.flow_from_directory(val_dir,target_size=(dim, dim),batch_size=batch_size,class_mode='categorical')print(train_generator.class_indices)# 如果有GPU則直接用GPUphysical_devices = tf.config.experimental.list_physical_devices('GPU')if physical_devices:tf.config.experimental.set_memory_growth(physical_devices[0], True)joblib.dump(train_generator.class_indices, f'{self.outdir}\class_indices.pkl')adam = optimizers.Adam(lr=lr, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)model_final.compile(optimizer=adam, loss=["categorical_crossentropy"], metrics=['accuracy'])reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.50, patience=3, min_lr=0.000001)early = EarlyStopping(monitor='val_loss', patience=10, mode='min', verbose=1)logger_path = self.outdir + os.sep + 'keras-epochs_ib.log'logger = CSVLogger(logger_path, separator=',', append=False)model_name = self.outdir + os.sep + 'keras_transfer_learning-run.check'checkpoint = ModelCheckpoint(model_name,monitor='val_loss', mode='min',save_best_only=True,verbose=1)callbacks = [reduce_lr, early, checkpoint, logger]model_final.fit_generator(train_generator, steps_per_epoch=train_steps_per_epoch, epochs=epochs, verbose=1,validation_data=(val_generator), validation_steps=val_steps_per_epoch,callbacks=callbacks,class_weight={0: 0.012, 1: 0.12, 2: 0.058, 3: 0.36, 4: 0.43})model_to_store_path = self.outdir + os.sep + modelmodel_final.save(model_to_store_path)return model_to_store_path, train_generator.class_indicesdef inference(self, model_path, test_dir, class_dict, dim=224):print(test_dir)model = load_model(model_path)test_datagen = ImageDataGenerator(preprocessing_function=pre_process)test_generator = test_datagen.flow_from_directory(test_dir,target_size=(dim, dim),shuffle=False,class_mode='categorical',batch_size=1)filenames = test_generator.filenamesnb_samples = len(filenames)pred = model.predict_generator(test_generator, steps=nb_samples)print(pred)df = pd.DataFrame()df['filename'] = filenamesdf['actual_class'] = df['filename'].apply(lambda x: x[:6])df['actual_class_index'] = df['actual_class'].apply(lambda x: int(class_dict[x]))df['pred_class_index'] = np.argmax(pred, axis=1)k = list(class_dict.keys())v = list(class_dict.values())inv_class_dict = {}for k_, v_ in zip(k, v):inv_class_dict[v_] = k_df['pred_class'] = df['pred_class_index'].apply(lambda x: (inv_class_dict[x]))return dfdef main(self):start_time = time.time()print('Data Processing..')self.num_class = len(self.class_folders)model_to_store_path, class_dict = self.train_model(self.train_dir, self.val_dir,batch_size=self.batch_size,epochs=self.epochs, dim=self.dim, lr=self.lr,model=self.model)print("Model saved to dest:", model_to_store_path)# Validatione evaluate resultsfolder_path = Path(f'{self.val_dir}')val_results_df = self.inference(model_to_store_path, folder_path, class_dict, self.dim)val_results_path = f'{self.outdir}/val_results.csv'val_results_df.to_csv(val_results_path, index=False)print(f'Validation results saved at : {val_results_path}')pred_class_index = np.array(val_results_df['pred_class_index'].values)actual_class_index = np.array(val_results_df['actual_class_index'].values)print(pred_class_index)print(actual_class_index)accuracy = np.mean(actual_class_index == pred_class_index)kappa = cohen_kappa_score(pred_class_index, actual_class_index, weights='quadratic')print("-----------------------------------------------------")print(f'Validation Accuracy: {accuracy}')print(f'Validation Quadratic Kappa Score: {kappa}')print("-----------------------------------------------------")print("Processing Time", time.time() - start_time, ' secs')if __name__ == "__main__":obj = TransferLearning()obj.main()

    其它資料下載

    如果大家想繼續了解人工智能相關學習路線和知識體系,歡迎大家翻閱我的另外一篇博客《重磅 | 完備的人工智能AI 學習——基礎知識學習路線,所有資料免關注免套路直接網盤下載》
    這篇博客參考了Github知名開源平臺,AI技術平臺以及相關領域專家:Datawhale,ApacheCN,AI有道和黃海廣博士等約有近100G相關資料,希望能幫助到所有小伙伴們。

    總結

    以上是生活随笔為你收集整理的手把手带你从0完成医疗行业影像图像检测三大经典模型InceptionV3-RestNet50-VGG16(附python源代码及数据库)——改变世界经典人工智能项目实战(一)手把手教学迁移学习的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    最新av在线播放 | 97精品视频在线播放 | 日韩午夜在线播放 | a√天堂资源 | www亚洲国产 | 精品一区免费 | 国产精品久久久区三区天天噜 | 最近中文字幕 | a在线观看免费视频 | 国产视频一区二区三区在线 | www.在线看片.com | 国产精品视频永久免费播放 | 91九色视频观看 | 亚洲午夜久久久久久久久久久 | 欧美做受高潮 | 精品久久福利 | 国产精品久久久久久久久久久久 | 久久午夜鲁丝片 | 久久无码av一区二区三区电影网 | 午夜三级福利 | 五月宗合网| 亚洲国产精品免费 | 99久久99视频 | 日韩欧美国产精品 | 97在线观看视频国产 | 久久免费国产精品1 | av线上看| 中文字幕传媒 | 91漂亮少妇露脸在线播放 | www.天天射.com | 中文字幕乱码电影 | 国产精品美女久久 | 久久九九免费视频 | 日韩中字在线观看 | 丁香视频免费观看 | 精品国产综合区久久久久久 | 狠狠五月天| 日本最新中文字幕 | 欧美日韩视频一区二区三区 | 黄毛片在线观看 | 玖玖视频 | 久久99国产精品久久 | 久久精品视频在线看 | 中文字幕色网站 | 六月婷婷色 | 中文字幕成人网 | 国产小视频免费观看 | av丝袜在线| 不卡中文字幕av | 国产一区自拍视频 | 一区久久久 | 国产精品亚洲综合久久 | 91成人免费看片 | 亚洲黄a| 五月婷婷综合在线视频 | 欧美aⅴ在线观看 | 婷婷视频在线 | 有码视频在线观看 | 丁香久久综合 | 美女久久久久久久久久 | 一级α片免费看 | 亚洲三级网 | 亚洲2019精品 | 欧美成人精品欧美一级乱黄 | 国产一区二区久久精品 | 国产69久久精品成人看 | 国产69精品久久久久久 | 日韩高清免费观看 | 69国产在线观看 | 免费观看成人网 | 中文字幕永久在线 | 91视频在线 | 国产精品国产三级国产专区53 | 久久精品一区二区三区四区 | 91精品国产成人www | 手机看片国产日韩 | 免费在线观看黄 | 亚洲精品视频在线观看免费视频 | 欧美日韩精品影院 | 免费观看一级成人毛片 | 92中文资源在线 | 国产一二三在线视频 | 日本视频久久久 | 99久久www| 成年免费在线视频 | 国产一区免费视频 | 午夜免费视频网站 | 开心激情网五月天 | 一区二区三区在线免费播放 | 国产一级二级在线播放 | 在线亚洲小视频 | 毛片网站免费在线观看 | 国产传媒一区在线 | 精品免费久久 | 在线观看视频福利 | 色婷婷综合久久久久中文字幕1 | 国产视频一二区 | 黄色最新网址 | 亚洲免费在线看 | 日韩精品一区二区在线视频 | 狠狠色狠狠色综合日日92 | 中文字幕在线看视频 | 六月色播 | 91在线网址 | 在线一区电影 | 国内精品久久久久久久久久清纯 | 久久99视频精品 | 欧美二区三区91 | 欧美性猛片, | 欧美日韩视频一区二区三区 | 超碰97成人| 久久免费看av | 亚洲日本va午夜在线影院 | 久久在线影院 | 国产美女搞久久 | 日韩在线高清 | 亚洲成熟女人毛片在线 | 亚洲精品乱码久久久久久久久久 | 最新免费中文字幕 | 91尤物在线播放 | a黄色| 九九有精品 | av黄色在线播放 | 三级av黄色| 手机成人在线电影 | 日韩av免费在线电影 | 国产不卡在线看 | 青草视频在线 | 激情网站五月天 | 四虎成人在线 | 亚洲男模gay裸体gay | 黄色小说在线观看视频 | 丰满少妇高潮在线观看 | 肉色欧美久久久久久久免费看 | 麻豆精品视频在线观看免费 | www亚洲视频| 99人成在线观看视频 | 超碰人人91 | 亚洲精品免费在线观看视频 | 国产99久久久久久免费看 | 最近最新最好看中文视频 | av黄色免费看 | 日韩免费在线观看 | 狠色狠色综合久久 | 最新国产视频 | 在线免费黄色片 | 亚洲最大免费成人网 | 久久久国产高清 | 日本mv大片欧洲mv大片 | 国内丰满少妇猛烈精品播放 | 免费裸体视频网 | 精品一区二区在线免费观看 | 五月婷婷欧美视频 | 亚洲成a人片综合在线 | 香蕉视频在线播放 | 97国产大学生情侣酒店的特点 | 香蕉视频在线观看免费 | 青青久草在线 | 中文字幕在线免费播放 | 日本视频久久久 | 国产精品美女久久久网av | 国产流白浆高潮在线观看 | 亚洲精品白浆高清久久久久久 | 在线亚洲播放 | 亚洲在线国产 | 国产69久久久 | av不卡中文字幕 | 国内精品亚洲 | 国产精品av一区二区 | 日日爱av | 香蕉蜜桃视频 | 天天射天天爱天天干 | 精品高清美女精品国产区 | 日韩精品一区在线播放 | 久久99久久精品 | 久草在线最新视频 | 亚洲综合一区二区精品导航 | 色吊丝在线永久观看最新版本 | 99操视频 | 国产99久久九九精品免费 | 一区二区三区免费在线观看视频 | 日本中文字幕在线一区 | www.超碰97.com| 国产综合香蕉五月婷在线 | 一级片视频在线 | 伊人中文在线 | 欧美天堂久久 | 亚洲免费观看在线视频 | 色99中文字幕 | 激情影音先锋 | 2019天天干天天色 | 亚洲欧美在线视频免费 | 在线观看国产日韩 | 中文在线8资源库 | 激情综合色综合久久 | 久久视精品 | 尤物97国产精品久久精品国产 | 国产精品初高中精品久久 | 国产护士hd高朝护士1 | 99这里只有久久精品视频 | 日韩免费一二三区 | 96国产精品视频 | 日韩在线观看三区 | 国产伦精品一区二区三区四区视频 | 亚洲高清在线观看视频 | 天天干 夜夜操 | 欧美综合色 | 中文字幕在线有码 | 九九免费在线看完整版 | 日韩黄色一区 | 青青射| 成人在线观看资源 | 午夜性色 | 成全在线视频免费观看 | 中文字幕一区av | 天堂在线一区二区三区 | 99久久激情| 成年人视频免费在线播放 | 日韩免费在线视频观看 | 日韩有码中文字幕在线 | 毛片a级片 | 国产午夜在线观看视频 | 在线观看一级片 | 亚洲欧美日韩在线一区二区 | 久草资源在线观看 | 五月婷婷综合在线观看 | 一区二区三区中文字幕在线 | 国产免费叼嘿网站免费 | 国产精品久久久久久久久久免费看 | 91av在线视频免费观看 | 亚洲 中文 欧美 日韩vr 在线 | 五月天开心 | 日韩在线电影一区二区 | 性日韩欧美在线视频 | 成人精品国产 | 草久久久 | 欧美国产精品久久久久久免费 | 精品久久久久久一区二区里番 | wwwwww国产 | 精品国内自产拍在线观看视频 | 国产黄色一级片 | 欧美一区二区三区在线 | 国产中年夫妇高潮精品视频 | 国产无遮挡又黄又爽馒头漫画 | 色人久久| 97免费中文视频在线观看 | 97超碰免费在线 | 国产尤物在线观看 | 欧美精品久久久 | 黄色aa久久| 最近2019中文免费高清视频观看www99 | a在线免费观看视频 | 亚洲欧洲美洲av | 国产一级片久久 | 狠狠色丁香 | 国产福利在线不卡 | 91丨九色丨国产在线观看 | 激情久久综合网 | 国产高清专区 | 蜜桃麻豆www久久囤产精品 | 国产黄色视 | 在线成人小视频 | 欧美一级免费 | 天天操夜夜拍 | 欧美国产日韩在线观看 | 国产一级免费播放 | 国产专区免费 | 久久成人综合 | 一级黄色片在线免费看 | 天天干天天草 | 国产精品毛片一区二区在线看 | 久久不射电影院 | 91大神在线看 | www.久久免费视频 | 成年人在线免费看 | 国产精品视频免费观看 | 91精品系列 | 欧美成人猛片 | 日韩中文字幕亚洲一区二区va在线 | 国产精品情侣视频 | 91色国产| 丁香六月婷婷开心婷婷网 | 四虎影视成人精品国库在线观看 | 久久婷婷网 | 亚洲乱码精品久久久久 | 免费在线观看中文字幕 | 久久久久免费观看 | 欧美日韩久久一区 | 午夜影院先 | 免费看一级特黄a大片 | 草莓视频在线观看免费观看 | 免费av在线网站 | 天天亚洲综合 | 激情五月婷婷网 | 九九久久精品视频 | 成人在线视频免费观看 | 一区二区视频在线观看免费 | 狠狠狠色丁香综合久久天下网 | 911国产 | 免费在线一区二区 | 97精产国品一二三产区在线 | 国产高清精品在线 | 免费看污在线观看 | 69夜色精品国产69乱 | 在线观看亚洲电影 | 91激情小视频 | 五月婷婷久草 | 一级黄色网址 | 最新日韩精品 | 欧美视频日韩视频 | 午夜久操 | 一级a性色生活片久久毛片波多野 | 91视频在线免费看 | 在线欧美日韩 | 91精品办公室少妇高潮对白 | 日韩电影久久久 | .国产精品成人自产拍在线观看6 | 亚洲高清视频在线 | 免费a网址 | 久久精品亚洲国产 | 久久综合之合合综合久久 | 婷婷综合久久 | 免费观看久久 | 成人av一级片 | 欧美在线观看视频一区二区 | 久久久久在线观看 | 国产精品一二 | 国产又粗又猛又黄又爽的视频 | 国产精品永久在线 | 免费观看成人av | 免费av黄色| 欧美性生活小视频 | 天天干天天射天天爽 | 一区二区三区 亚洲 | 夜夜天天干 | 在线小视频 | 日韩在线一级 | 久久免费视频这里只有精品 | 高清免费在线视频 | 精品99久久| 国产1区在线观看 | 亚洲干 | 亚洲精品视频免费在线 | 国产第页 | 日韩精选在线 | 日韩在线字幕 | 欧美日韩大片在线观看 | 97小视频| 免费又黄又爽的视频 | 最近高清中文在线字幕在线观看 | 狠狠干夜夜爱 | 成人一级影视 | 国产一区二区不卡在线 | .国产精品成人自产拍在线观看6 | 日韩精品视频一二三 | 成人91视频| 久久成人在线视频 | 成年人视频在线免费观看 | 一区二区三区在线视频观看58 | av在线小说| 国产成人综合图片 | 日本在线观看视频一区 | 狠狠综合网 | 男女激情麻豆 | 在线视频欧美精品 | 亚洲精品在线国产 | 五月婷婷综合久久 | av大片网址 | 精品黄色在线观看 | 中文字幕中文字幕在线一区 | 国产欧美综合视频 | 久久久久综合网 | 国产免费观看久久 | 人人擦 | 亚洲视频免费在线 | 国产黄色片免费在线观看 | 久草网视频 | 国产精品高清av | 欧美性猛片| 一区二区观看 | 2019精品手机国产品在线 | 手机在线看永久av片免费 | 久久国产视屏 | 欧洲性视频 | 激情久久影院 | 国产午夜精品理论片在线 | 中文字幕a在线 | 国产在线观看中文字幕 | 三级黄色免费片 | 免费在线观看av片 | 国产又粗又猛又黄又爽的视频 | 不卡视频在线看 | 日本久久影视 | 亚洲专区 国产精品 | 久久人人干| 久久国产成人午夜av影院宅 | 亚洲天天草 | 夜夜操狠狠干 | .国产精品成人自产拍在线观看6 | 国产精品美女久久久久久2018 | 午夜精品av | 日韩精品高清不卡 | 五月天伊人 | 在线视频日韩精品 | 久久视频免费在线 | 99精品偷拍视频一区二区三区 | 极品国产91在线网站 | 伊人天天操 | 色在线中文字幕 | av中文字幕在线看 | 日韩精品一区二区三区外面 | 久草久草视频 | 国产一级片免费视频 | 黄色日批网站 | 国产高清久久久 | 精品亚洲网 | 美女av在线免费 | 午夜久久久久久久久 | 国产乱码精品一区二区蜜臀 | 亚洲在线精品视频 | 欧美日韩xxxxx | 91成人精品在线 | 免费a v在线 | 亚洲三级在线免费观看 | 亚洲午夜剧场 | 国产又粗又硬又长又爽的视频 | 欧美一级视频免费 | 91视频高清完整版 | 国产手机视频在线观看 | 国产成人免费观看久久久 | 日韩精品一区不卡 | 91精品综合| 99视频 | 国产1区2区3区精品美女 | 天天干天天碰 | 久久五月天综合 | 国产婷婷精品 | 91精品久久久久久久91蜜桃 | 国产高清精| 丁香五香天综合情 | www.国产在线视频 | 国产男女无遮挡猛进猛出在线观看 | 久久久国产高清 | 狠狠狠干| 久久久国产高清 | 国产精品欧美日韩在线观看 | 99色资源| 亚洲国产久| 黄色在线观看www | 欧美精品在线视频观看 | 日韩欧美一区二区三区视频 | 欧美性色综合网站 | 玖玖精品在线 | 日韩影视精品 | 国产精品高清在线 | 91av在线视频免费观看 | 99热播精品 | 久久婷亚洲五月一区天天躁 | 国产精品一区在线观看 | 999久久久久 | 奇米影视8888在线观看大全免费 | 亚洲免费精彩视频 | 国产精品久久久久久久久久免费 | 亚洲综合在线播放 | 国产精品乱码久久久久 | 奇米导航 | www日日 | a级国产乱理伦片在线观看 亚洲3级 | 国产青春久久久国产毛片 | 欧美日韩免费网站 | 久久久国际精品 | 亚洲综合一区二区精品导航 | 亚洲高清免费在线 | 国产精品久久久久三级 | 五月婷婷久草 | 91tv国产成人福利 | av在线免费在线 | 天天曰| 青青草在久久免费久久免费 | 亚洲精品一区中文字幕乱码 | 欧美久久影院 | 91av美女| 2019中文最近的2019中文在线 | 日韩久久久久久久久久久久 | 国产黄色av影视 | 亚洲国产精品99久久久久久久久 | 在线观看日韩精品视频 | 久久九九国产视频 | 午夜久久影视 | 国产精品毛片一区二区 | 亚洲成人欧美 | 美女视频黄色免费 | 久久久久久久久久久精 | 九九九在线观看 | 亚洲精品一区二区三区高潮 | 欧美日韩一区久久 | 一区二区伦理 | 在线国产视频观看 | 久久久久免费精品 | a级国产乱理论片在线观看 特级毛片在线观看 | 人人爱人人射 | 成人欧美亚洲 | 97视频在线观看播放 | 在线观看韩日电影免费 | 久久久久综合网 | 狠狠狠狠狠狠干 | 国产真实精品久久二三区 | 久操免费视频 | 亚洲 中文字幕av | 91九色免费视频 | 99视频网站 | 97色资源| 狠狠色丁香婷婷综合欧美 | 久久久久人人 | 久久视频在线观看免费 | 最新av在线播放 | 九九热久久免费视频 | 免费一级片视频 | 人人狠狠综合久久亚洲婷 | 黄色小视频在线观看免费 | 久久综合射 | 国产在线观看高清视频 | 一区二区视频在线观看免费 | 国产色在线,com | 99热精品国产一区二区在线观看 | 日韩视频在线不卡 | 蜜臀av免费一区二区三区 | 人人狠狠综合久久亚洲婷 | 9797在线看片亚洲精品 | 久久精品视频网址 | 久久精品视频日本 | 亚洲精品午夜久久久久久久久久久 | 国产精品女主播一区二区三区 | 免费av网站在线看 | 国产高清中文字幕 | 在线中文字幕视频 | 日韩1级片 | 亚洲免费成人av电影 | 欧美日韩国产在线观看 | 婷婷亚洲综合五月天小说 | 丰满少妇麻豆av | 日韩精品久久久久久 | 久久久精品二区 | 精品一区三区 | 婷婷色网 | 97精品久久 | 久久优| 国产系列在线观看 | 亚洲精品视频免费在线 | 亚洲妇女av | 97超碰资源网 | 国产在线欧美 | 欧美在线观看视频免费 | 色爱区综合激月婷婷 | 成人在线播放网站 | 日韩免费在线一区 | 国产精品自产拍 | 四虎在线免费观看 | 在线免费视频 你懂得 | 色多多视频在线 | 亚洲成人软件 | 丝袜美腿av | 91最新在线观看 | 欧美日韩精品综合 | 99色在线视频| 久久国产精品第一页 | 四虎永久网站 | 女人久久久久 | 麻豆 videos| 探花视频免费观看 | 亚洲国产精品久久 | 绯色av一区 | 91精品视频在线观看免费 | 国产 色| 天天综合网在线 | 日本久久久久久 | 最近字幕在线观看第一季 | 亚洲日b视频 | 国产黄色片在线 | 日韩在线三区 | 91精品久久久久久久久久入口 | 国产又粗又硬又长又爽的视频 | 波多野结衣精品视频 | 激情偷乱人伦小说视频在线观看 | 亚洲成av人片一区二区梦乃 | 香蕉在线观看视频 | 日韩在线观看中文字幕 | 国产一区二区手机在线观看 | 狠狠色综合网站久久久久久久 | 精产嫩模国品一二三区 | 这里只有精品视频在线观看 | 日韩中文字幕免费看 | 天天干天天操天天操 | 丁香花中文字幕 | 伊人资源视频在线 | 国产免费区 | 黄色精品国产 | 狠狠干激情 | 欧美精品久久久久久久久免 | 久久免费毛片视频 | 九九热精品视频在线观看 | 欧美日韩精品影院 | 色婷丁香 | 亚洲粉嫩av| 久久综合偷偷噜噜噜色 | 欧美日韩免费观看一区=区三区 | 国产视频不卡一区 | 99久久精品一区二区成人 | 欧美日韩精品影院 | 国产日本亚洲高清 | 欧美人体xx | 国产在线资源 | 国产亚洲在线观看 | 97在线观看免费 | 91高清免费在线观看 | 日韩av不卡在线播放 | 91av原创| 久久久久久久99精品免费观看 | 人人添人人 | 日批视频 | 久久国产亚洲 | 免费观看9x视频网站在线观看 | 手机在线看永久av片免费 | 亚洲综合五月天 | 欧美一区免费在线观看 | 久久久久精 | 91片黄在线观看 | 日韩乱码在线 | 色就色,综合激情 | 久久99久国产精品黄毛片入口 | 亚洲天天 | 91麻豆精品国产91久久久更新时间 | 色综合国产 | 欧洲激情在线 | 91精品国产综合久久久久久久 | 77国产精品 | 视频成人永久免费视频 | av官网在线 | 国产成人三级在线观看 | 一级免费看 | 国产精品6 | 日韩中文字幕亚洲一区二区va在线 | 亚洲国产69| 人人澡人人澡人人 | 精品福利在线观看 | 狠狠ri | 人人澡超碰碰97碰碰碰软件 | 国产一卡久久电影永久 | 在线免费黄色毛片 | 亚洲在线精品视频 | 91久久精品一区二区二区 | 一区二区三区www | 美国av片在线观看 | 欧美一级特黄aaaaaa大片在线观看 | 999久久久久久久久 69av视频在线观看 | 国产最顶级的黄色片在线免费观看 | jizz18欧美18| 国产在线观看a | 欧美日韩国产精品爽爽 | а中文在线天堂 | 国产精品欧美久久 | 91香蕉视频在线下载 | 91久久久久久久一区二区 | 国产高清视频网 | 成年人看片网站 | 免费又黄又爽视频 | 一级片色播影院 | 久久精品一区 | 91亚洲综合 | 日韩午夜av电影 | 天天射天天爱天天干 | 亚洲一级黄色片 | av资源中文字幕 | 国产精品永久免费观看 | 国产高清不卡av | www.久久免费视频 | 国产色在线视频 | 久久免费公开视频 | 国产精品 中文字幕 亚洲 欧美 | 九九热视频在线 | 九九免费观看全部免费视频 | 最新超碰| 天天干天天爽 | 久草电影网| 久久五月婷婷综合 | 操操操综合 | 国产精品久久久久久久久岛 | 久久久精品网站 | 国产精品毛片一区二区在线看 | 韩国一区二区av | 亚洲欧美日韩国产一区二区三区 | 丁香激情婷婷 | 亚州欧美精品 | 国产精品精品国产婷婷这里av | 免费高清av在线看 | 久久久久久国产精品亚洲78 | 亚洲综合爱 | 成人高清av在线 | 亚洲成人999 | 亚洲经典视频在线观看 | 国产成人黄色av | 激情视频免费在线观看 | 99热这里只有精品免费 | 欧美极品在线播放 | 国产精品日韩在线播放 | 亚州精品视频 | 精品黄色在线观看 | 99久久er热在这里只有精品15 | 最近中文字幕在线 | 欧美综合色在线图区 | 国产在线高清视频 | 久久久久久久国产精品视频 | 黄色毛片视频 | 91中文在线视频 | 亚洲va天堂va欧美ⅴa在线 | 国产一二区在线观看 | 精品国产一区二区三区四 | 97超碰超碰久久福利超碰 | 亚洲综合色激情五月 | 国产福利不卡视频 | 婷婷色中文网 | 一区二区在线影院 | 奇米影音四色 | 日韩性网站 | 久久久精品在线观看 | 精品一区91| 五月开心综合 | www狠狠操| 久久老司机精品视频 | 欧美精品乱码99久久影院 | 99精品视频在线看 | 中文字幕在线观看网站 | 久久久久久久看片 | 亚洲精品乱码白浆高清久久久久久 | 狠狠综合久久av | 九九久久久久久久久激情 | 国产精品精 | a v在线视频 | 成人免费色 | 98超碰在线观看 | 黄色小网站在线 | 国产一区在线精品 | 国产精品久久一区二区无卡 | 免费婷婷| 中文字幕在线观看完整版 | 欧美a在线免费观看 | 中文字幕一区二区三区乱码不卡 | 亚洲欧洲一级 | 色婷婷免费视频 | 中文字幕在线一二 | 久久国产视屏 | 久久成人国产精品入口 | 精品国产综合区久久久久久 | 国外调教视频网站 | 成人蜜桃网 | 国产精品久久嫩一区二区免费 | 久久国产亚洲视频 | 成人黄色片免费看 | 国产亚洲亚洲 | 久久久久黄 | 久久视频这里只有精品 | 国产精品大尺度 | 日韩手机视频 | 亚洲一二区精品 | 深爱激情五月网 | 麻豆影视在线免费观看 | 国产一二区视频 | 国产999| 亚洲精品乱码久久 | 免费日韩电影 | 精品国产电影一区 | 成年人免费看 | 久久99精品久久久久久 | 五月天综合网站 | 国产精品福利在线观看 | 国产一区二区在线播放视频 | 色大片免费看 | 久久久久99精品成人片三人毛片 | 久久国产一区二区 | 国产精品久久久久久久久久99 | 国产精品久久久久久一区二区三区 | 91av在| 亚洲国产69 | 久久成人国产精品入口 | 成人午夜电影在线播放 | 国产国产人免费人成免费视频 | 日本久久免费电影 | 黄色免费网站 | 91av福利视频| 四虎国产精品免费观看视频优播 | 国产一级视频 | 中文字幕一区二区三区四区 | 伊人网综合在线观看 | 精品日韩中文字幕 | 国产在线观看国语版免费 | 尤物97国产精品久久精品国产 | 国产日韩精品久久 | 日韩电影在线视频 | 天堂在线一区 | 国产精品成人一区二区 | 伊人丁香 | 欧美 日韩 国产 成人 在线 | 中文字幕日韩在线播放 | 亚洲三级性片 | 久久精品久久精品 | 国产九九热视频 | 精品国产视频在线 | 中文字幕第 | 996久久国产精品线观看 | 免费看黄的 | 亚洲激情视频在线 | 免费日韩一区二区 | 国产精品6 | 成人网页在线免费观看 | 97操碰 | 99草视频 | 久草精品视频在线观看 | 91免费的视频在线播放 | 91视频麻豆 | 久久人视频| 欧美日一级片 | 黄网站www| 久久久久成 | 超碰日韩在线 | 黄色毛片视频免费观看中文 | 69国产精品视频 | 日韩a级黄色 | 日韩综合视频在线观看 | 一区二区三区免费在线 | 日韩18p| 免费看黄20分钟 | 亚洲国产精品成人av | 色爽网站 | 国产成人在线免费观看 | 欧美日韩91 | 国产成人在线播放 | 国产91国语对白在线 | 黄色网址在线播放 | 国产一级片久久 | 免费观看av | 久久久久免费精品国产 | 99久久精品国产免费看不卡 | 国产一区二区三区网站 | 国产精品久久中文字幕 | 色噜噜狠狠狠狠色综合 | 国产黑丝一区二区三区 | 国产精品女 | 色成人亚洲 | 在线小视频你懂的 | 欧美色888| 免费视频国产 | 色干干 | www.黄色小说.com | 国产精品欧美久久久久三级 | 国产视频九色蝌蚪 | 国产精品自产拍在线观看中文 | 日韩一区二区三免费高清在线观看 | 日韩精品一区二区三区免费视频观看 | 日韩免费播放 | 毛片随便看 | 在线播放国产精品 | 一区二区三区日韩视频在线观看 | 99久久精品国产一区 | 午夜av电影 | 在线视频一区观看 | 中文字幕av在线电影 | 在线日韩av | 中文字幕 国产视频 | 五月婷网站 | 日韩欧美高清一区二区 | 亚洲涩涩涩 | 色中色综合 | 四虎国产精品成人免费影视 | 在线中文字幕一区二区 | 热久久国产精品 | 欧美性性网 | av免费电影在线 | 日韩精品中字 | 亚洲成av人片一区二区梦乃 | 99婷婷狠狠成为人免费视频 | 国产精品一区二区三区四 | 国产九色在线播放九色 | 91免费试看| 中文字幕有码在线观看 | 中文有码在线视频 | a在线一区 | 精品视频专区 | 91麻豆精品国产91久久久使用方法 | 久久a热6 | 四虎影视成人永久免费观看亚洲欧美 | 亚洲日日日 | 久久精品看 | 色五月色开心色婷婷色丁香 | 国产成人精品一区二区三区福利 | 91在线视频免费91 | 99这里精品 | 欧美 日韩 国产 中文字幕 | 亚洲国产精品一区二区久久hs | 日本系列中文字幕 | 人人澡人人模 | 亚洲精品国精品久久99热一 | 91麻豆福利 | 色视频网页 | 成年人免费在线观看网站 | 区一区二区三区中文字幕 | 探花视频在线观看免费 | 国产高清视频在线 | 色视频 在线 | 69性欧美 | www天天干com | 韩国一区二区三区在线观看 | 高清不卡一区二区三区 | 免费在线中文字幕 | 国产 在线观看 | 欧美激情综合五月色丁香 | 久久99国产精品视频 | 一区二区亚洲精品 | 久久视频在线观看中文字幕 | 免费日韩电影 | 欧美性一级观看 | 婷婷在线网| 精品一区二区免费视频 | 国产成人免费网站 | 免费视频一级片 | 久久久久久久精 | 日日添夜夜添 | 欧美日韩精品在线 | 91在线视频观看 | 日韩在线视频观看免费 | 99久久精品国产一区 | 亚洲成人黄色在线 | 天天色草| 久久国产精品免费观看 | 91视频在线免费下载 | 国产成人一区在线 | 日韩av高清 | 99这里有精品 | 99视频在线精品免费观看2 | av在线精品 | 国产精品乱码在线 | 99精品视频网站 | 国产综合片 | 国产亚洲在线观看 | 国产网站色 | 最新超碰 | 欧美一区二区伦理片 | 韩国精品福利一区二区三区 | 丁香婷婷社区 | 精品一区二三区 | 国产91精品久久久久 | 91国内在线视频 | 精品一区二区在线看 | 国产欧美最新羞羞视频在线观看 | 久久久久久久久久影院 | 欧美a在线看 | 黄色一二级片 | 日韩乱码在线 | 亚洲国产精品第一区二区 | 免费a网站 | 97超级碰碰碰视频在线观看 | 久久精品日本啪啪涩涩 | 在线色亚洲| 婷婷电影在线观看 | 高清国产在线一区 | 在线观看一区二区视频 | 国产探花在线看 | www天天操 | 欧美日韩视频观看 | 人人天天夜夜 | 国产一级电影 | 在线观看视频一区二区三区 | 亚洲黄色小说网 | 日韩激情一二三区 | 亚洲精品综合在线观看 | 在线日本看片免费人成视久网 | 成人网在线免费视频 | 999久久久久久 | 日韩精品在线看 | 久久久麻豆精品一区二区 | 天天艹 | 国产精品免费不卡 | 欧美激情一区不卡 | 欧美性黑人 | 国产97色在线 | 欧美日韩国产一区二区三区在线观看 | 91亚洲精品久久久蜜桃 | 日韩av在线免费播放 | 欧美精彩视频 | 五月婷婷久久综合 | 91资源在线视频 | 久久99久久99久久 | 国产精品久久久久久69 | 超碰最新网址 | 免费av的网站 | 亚洲成人黄色网址 | 国产亚洲精品美女久久 | 亚洲综合视频在线观看 | 日韩欧美xxxx|