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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

语义分割 | segnet 制作自己的数据,如何训练,如何测试,如何评价

發布時間:2024/9/21 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 语义分割 | segnet 制作自己的数据,如何训练,如何测试,如何评价 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

本博文介紹如何手把手制作自己的數據集,并使用SegNet網絡進行語義分割,如何訓練,如何測試自己的分割模型。

----------------------------------------------------------------------------------------------------------------------------------------------------------

感謝:

1.源碼參考cudnn5版本的caffe-segnet,https://github.com/TimoSaemann/caffe-segnet-cudnn5

2.作者的官方指導文檔:http://mi.eng.cam.ac.uk/projects/segnet/tutorial.html

3.一份使用指導:https://github.com/TqDavid/SegNet-Tutorial/tree/master/CamVid

4.如果想測試SegNet的效果,這里有官方的在線測試demo: http://mi.eng.cam.ac.uk/projects/segnet/#demo

5.一份segnet的預訓練model

https://github.com/alexgkendall/SegNet-Tutorial/blob/master/Example_Models/segnet_model_zoo.md,以及相對應的
segnet_basic_inference.prototxt
segnet_basic_solver.prototxt
segnet_basic_train.prototxt

6.參考了該博主的文章https://blog.csdn.net/caicai2526/article/details/77170223

7.以及該博主的文章https://blog.csdn.net/hjxu2016/article/details/77994925

8.對于已有mask和image,需要resize,可參考https://blog.csdn.net/u013249853/article/details/79827469

--------------------------------------------------------------------------------------------------------------------------------------------------------------

言歸正傳,開始正題。

下載上述caffe-segnet-cudnn5版本的代碼,其路徑后文稱之為caffe_root,以下的操作都在該caffe_root目錄下進行。

整體目錄包含如下文件(夾):

一、制作自己數據集

??????? SegNet網絡需要兩個輸入,一個是原始圖像,三通道的;一個是mask label,也就是待分割目標的標簽,mask要求是單通道8位灰度圖,格式是uint8, 像素0表示背景,像素1表示目標的位置。 下面分別準備這兩樣東西。

???????? 1. 原始圖像就是你自己的照片了,注意一下:如果你不更改SegNet中參數,可以先保持與原作者的圖像尺寸一致,后面可以根據自己的情況在更改,一般上采樣2x,這里采用與原作者相同的圖像尺寸,(360, 480)彩色圖片,如果不是這樣,建議resize一下,博主自己的圖片是灰度的,resize前有一個轉成rgb的過程,python代碼函數;

??? # testdir為自己數據集路徑,樓主的圖是灰度圖,所以有一個轉換成rgb的過程,然后保存。
??? def resize_image_batch():
??????? file_list = os.listdir(testdir)
??????? for item in file_list:
??????????? #print(traindir + item)
??????????? imname = testdir + item
??????????? im = cv2.imread(imname, 0)
??????????? im = cv2.resize(im, (480, 360))
??????????? im_RGB = cv2.cvtColor(im, cv2.COLOR_GRAY2RGB)
??????????? print(im.shape)
??????????? print(im_RGB.shape)
??????????? #print(im)
??????????? print("============================")
??????????? #print(im_RGB[:,:,0])
??????????? #print(im_RGB[:,:,1])
??????????? #print(im_RGB[:,:,2])
??????????? print(im.dtype)
??????????? print(im_RGB.dtype)
??????????? cv2.imwrite('zht_test_use/'+ item, im_RGB)
??????????? #print("success!")

2.準備mask。

???? 首先,博主的mask來源是用labelme 得到的。labelme的使用方法,這里不再贅述。簡言之,對于每一張圖,我們可以得到其

json標注文件, 再通過,labelme_json_to_dataset命令,可以得到最終我們需要的label mask,我們所需的是文件夾下的label.png。

labelme_json_to_dataset批量生成數據集的shell腳本如下;

??? for item in $(find ./huaweishouji_20170720_train_360x480_try -iname "*.json");
??? do?? ?
???? echo $item;??? ?
???? labelme_json_to_dataset $item;
??? done

接下來將lable.png轉換成uint8,背景像素是0,目標像素是1的mask..convert_to_mask 代碼如下:

??? def convert_to_mask():
??????? file_list = os.listdir(traindir)
??????? for item in file_list:
??????????? item_list = os.listdir(traindir + item)
??????????? #print("len(item) : ", len(item_list))
??????????? for atom in item_list:
??????????????? if atom == "label.png":
??????????????????? np.set_printoptions(threshold='nan')
??????????????????? imname = traindir + item + "/" + atom
??????????????????? #print(imname)
??????????????????? im = io.imread(imname, 1)
??????????????????? print(imname)
??????????????????? #print(im[:, :])
??????????????????? print(im.shape)
??????????????????? print(im.dtype)
??????????????????? print("-------------after-----------------")
??????????????????? img = (im * 255).astype(np.uint8)
??????????????????? _, im_th= cv2.threshold(img, 0.0000000000000001, 1, cv2.THRESH_BINARY)
???????????????????? ?
??????????????????? #print(img.shape)
?????????????????? ?
??????????????????? print(im_th.shape)
??????????????????? print(im_th.dtype)
??????????????????? #print(im_th[ :, :])
??????????????????? print(item[:-5] + ".png")
??????????????????? cv2.imwrite(train_write_dir + item[:-5] + '.png', im_th )
?? ??? ??? ??? ??? ?#print(im[:,:,0])
??????????????????? #print(im[:,:,1])
??????????????????? #print(im[:,:,2])
??????????????????? #im_RGB = cv2.cvtColor(im, cv2.COLOR_GRAY2RGB)
??????????? #print(traindir + item)
??????????? #imname = traindir + item
??????????? #im = cv2.imread(imname, 0)
??????????? #im = cv2.resize(im, (480, 360))
??????????? #im_RGB = cv2.cvtColor(im, cv2.COLOR_GRAY2RGB)
?????????? ?
??????????? #print(im.shape)
??????????? #print(im_RGB.shape)
??????????? #print(im)
??????????? #print("============================")
??????????? #print(im_RGB[:,:,0])
??????????? #print(im_RGB[:,:,1])
??????????? #print(im_RGB[:,:,2])
??????????? #print(im.dtype)
??????????? #print(im_RGB.dtype)
??????????? #cv2.imwrite('huaweishouji_20170720_test_360x480/'+ item, im_RGB)
??? def check_mask():
??????? file_list = os.listdir(train_write_dir)
??????? for item in file_list:
??????????? np.set_printoptions(threshold='nan')
??????????? #item_list = os.listdir(test_write_dir)
??????????? imname = train_write_dir + item
??????????? #print("len(item) : ", len(item_list))
??????????? print(item)

check_mask()是檢驗函數。驗證背景是0,目標是1,且為uint8編碼。

將上述原始圖像和mask,劃分出訓練集和測試集,分別放置在caffe_root/data/mydata/train和test下。mydata/下的結構是如圖,

,其中train/和test/ 結構如下:,image/和mask/下分別是上面得到的圖像和mask文件。注意圖像和mask名稱保持一致。

3.準備上面mydata/下的train.txt和test.txt,然后我們需要制作一個txt的列表,左邊是原圖的根目錄路徑,右邊是mask圖的根目錄路徑,中間以空格隔開,一定要注意,mask的路徑和原圖的路徑一定要對,列表形式如下:

/home/hjxu/caffe_examples/segnet_xu/data/test/image/8900_11800.tiff /home/hjxu/caffe_examples/segnet_xu/data/test/mask/8500_10200_ConfidenceMap.png
/home/hjxu/caffe_examples/segnet_xu/data/test/image/10100_9800.tiff /home/hjxu/caffe_examples/segnet_xu/data/test/mask/8900_11800_ConfidenceMap.png
/home/hjxu/caffe_examples/segnet_xu/data/test/image/8900_9000.tiff /home/hjxu/caffe_examples/segnet_xu/data/test/mask/9300_10200_ConfidenceMap.png
/home/hjxu/caffe_examples/segnet_xu/data/test/image/8900_10200.tiff /home/hjxu/caffe_examples/segnet_xu/data/test/mask/8900_9000_ConfidenceMap.png

具體的shell腳本

??? #!/usr/bin/env sh
??? DATA_train=/home/ccf/CCF/Cell_segnet/data/data_train_enhancement/train/image
??? MASK_train=/home/ccf/CCF/Cell_segnet/data/data_train_enhancement/train/mask
??? DATA_test=/home/ccf/CCF/Cell_segnet/data/data_train_enhancement/test/image
??? MASK_test=/home/ccf/CCF/Cell_segnet/data/data_train_enhancement/test/mask
??? MY=/home/ccf/CCF/Cell_segnet/data/data_train_enhancement
??? ?
??? ################################################
??? rm -rf $MY/train.txt
??? ?
??? echo "Create train.txt"
??? find $DATA_train/ -name "*.tif">>$MY/img.txt
??? find $MASK_train/ -name "*.tif">>$MY/mask.txt
??? paste -d " " $MY/img.txt $MY/mask.txt>$MY/train.txt
??? ?
??? rm -rf $MY/img.txt
??? rm -rf $MY/mask.txt
??? ?
??? ##################################################
??? rm -rf $MY/test.txt
??? ?
??? echo "Create test.txt"
??? find $DATA_test/ -name "*.tif">>$MY/img.txt
??? find $MASK_test/ -name "*.tif">>$MY/mask.txt
??? paste -d " " $MY/img.txt $MY/mask.txt>$MY/test.txt
??? ?
??? rm -rf $MY/img.txt
??? rm -rf $MY/mask.txt

可以適當修改,以適應自己的路徑。

二、訓練

????? 訓練之前,在訓練的時候我們可以根據自己訓練的要求更改分割的類型,segnet對原來是11中類型,在博主只有兩種類型,這就會遇到對網絡的修改,同時數據輸入的也是一樣原來的是360*480,網絡中的修改根據個人的要求以及效果進行修改,修改輸出層參數num_output為2,以及class-weighting,只有兩個。要注意的是上采樣upsample這個參數的修改,以及最后的class_weighting,對于class_weighting個數以及參數是根據自己的數據以及要求設定,輸出幾個類別class_weighting就有幾個,對于class_weighting參數的確定是根據訓練數據的mask中每一種類型的label確定的,就算方法:(all_label/class)/label,下面是計算的matlab算法代碼:

??? clear;
??? clc;
??? Path='C:\\Users\\xxxxx\\Desktop\\mask\\'
??? % save_mask_path='/home/ccf/CCF/Cell_segnet/data/mask_change/'
??? files=dir(Path);
??? ?
??? %element = [];
??? for k=3:length(files)
??????? k
??????? subpath=[Path,files(k).name];
??????? name=files(k).name;
??????? image=imread(subpath);
??????? I=image;
??????? name
??????? I
??????? img=uint8(zeros(360,480));
??????? [x,y]=find(I==0);
??????? for i=1:length(x)
??????????? img(x(i),y(i))=0;
??????? end
??????? [x,y]=find(I==1);
??????? for i=1:length(x)
??????????? img(x(i),y(i))=1;
??????? end
??? %???? imwrite(img,[save_mask_path,name]);
??????? label_num=double(unique(img));
??????? element(:,1)=[0;1];
??????? if (length(element(:,1))==length(label_num))
??????????? element(:,1)=label_num;
??????? end
??????? for j=1:length(label_num)
??????????? a=label_num(j);
??????????? e=length(find(img==a));
??????????? element(j,i-1)=e;
??????? end
??? end
??? num=element(:,2:end);
??? sum_num=sum(num,2);
??? median=sum(sum_num)/length(sum_num);
??? class_weighting=median./sum_num;
??? total=[element(:,1),class_weighting];
??? save('class_weight.mat','total');

最后查看class_weighting中保存的值即可,博主是2類,所有最后生成的class_weighting有兩個值,ignore_label=2,num_outout? = 2;完畢。

訓練模型需要的東西:

預訓練模型:

??? Segnet Basic model file: segnet_basic_camvid.prototxt weights: [http://mi.eng.cam.ac.uk/~agk34/resources/SegNet/segnet_basic_camvid.caffemodel]

solver.prototxt如下所示,train.prototxt就不貼了,因為有些長。

??? net: "examples/segnet/segnet_train.prototxt" ??? ??? ?# Change this to the absolute path to your model file
??? test_initialization: false
??? test_iter: 1
??? test_interval: 10000000
??? base_lr: 0.01 #0.1
??? lr_policy: "step"
??? gamma: 1.0
??? stepsize: 50 #10000000
??? display: 20
??? momentum: 0.9
??? max_iter: 50000
??? weight_decay: 0.0005
??? snapshot: 50#1000
??? snapshot_prefix: "examples/segnet/segnet_train/segnet_basic/seg" ??? ?# Change this to the absolute path to where you wish to output solver snapshots
??? solver_mode: GPU

??? #!bin/sh
??? ./build/tools/caffe train -gpu 2,3 -solver examples/segnet/segnet_solver.prototxt -weights examples/segnet/segnet_train/premodel/segnet_basic_camvid.caffemodel # This will begin training SegNet-Basic on GPU 0

上面就是訓練腳本了。完畢。

三、測試

1.生成含bn層的推理模型,腳本是:

??? #!bin/sh
??? echo "------------------generating bn statistics is begin-----------------------------"
??? python generate_bn_statistics.py examples/segnet/segnet_train.prototxt examples/segnet/segnet_train/segnet_basic/seg_iter_15700.caffemodel models/inference? # compute BN statistics for SegNet
??? echo "------------------generating bn statistics is end-----------------------------"

generate_bn_statistics.py如下:

??? #-*-coding:utf8-*-
??? #!/usr/bin/env python
??? import os
??? import numpy as np
??? from skimage.io import ImageCollection
??? from argparse import ArgumentParser
??? ?
??? ?
??? ?
??? ?
??? caffe_root = '/data/xxxxxx/caffe-segnet-cudnn/caffe-segnet-cudnn5/' ?? ??? ??? ?# Change this to the absolute directoy to SegNet Caffe
??? import sys
??? sys.path.insert(0, caffe_root + 'python')
??? ?
??? import caffe
??? from caffe.proto import caffe_pb2
??? from google.protobuf import text_format
??? ?
??? ?
??? def extract_dataset(net_message):
??????? assert net_message.layer[0].type == "DenseImageData"
??????? source = net_message.layer[0].dense_image_data_param.source
??????? with open(source) as f:
??????????? data = f.read().split()
??????? ims = ImageCollection(data[::2])
??????? labs = ImageCollection(data[1::2])
??????? assert len(ims) == len(labs) > 0
??????? return ims, labs
??? ?
??? ?
??? def make_testable(train_model_path):
??????? # load the train net prototxt as a protobuf message
??????? with open(train_model_path) as f:
??????????? train_str = f.read()
??????? train_net = caffe_pb2.NetParameter()
??????? text_format.Merge(train_str, train_net)
??? ?
??????? # add the mean, var top blobs to all BN layers
??????? for layer in train_net.layer:
??????????? if layer.type == "BN" and len(layer.top) == 1:
??????????????? layer.top.append(layer.top[0] + "-mean")
??????????????? layer.top.append(layer.top[0] + "-var")
??? ?
??????? # remove the test data layer if present
??????? if train_net.layer[1].name == "data" and train_net.layer[1].include:
??????????? train_net.layer.remove(train_net.layer[1])
??????????? if train_net.layer[0].include:
??????????????? # remove the 'include {phase: TRAIN}' layer param
??????????????? train_net.layer[0].include.remove(train_net.layer[0].include[0])
??????? return train_net
??? ?
??? ?
??? def make_test_files(testable_net_path, train_weights_path, num_iterations,
??????????????????????? in_h, in_w):
??????? # load the train net prototxt as a protobuf message
??????? with open(testable_net_path) as f:
??????????? testable_str = f.read()
??????? testable_msg = caffe_pb2.NetParameter()
??????? text_format.Merge(testable_str, testable_msg)
?????? ?
??????? bn_layers = [l.name for l in testable_msg.layer if l.type == "BN"]
??????? bn_blobs = [l.top[0] for l in testable_msg.layer if l.type == "BN"]
??????? bn_means = [l.top[1] for l in testable_msg.layer if l.type == "BN"]
??????? bn_vars = [l.top[2] for l in testable_msg.layer if l.type == "BN"]
??? ?
??????? net = caffe.Net(testable_net_path, train_weights_path, caffe.TEST)
?????? ?
??????? # init our blob stores with the first forward pass
??????? res = net.forward()
??????? bn_avg_mean = {bn_mean: np.squeeze(res[bn_mean]).copy() for bn_mean in bn_means}
??????? bn_avg_var = {bn_var: np.squeeze(res[bn_var]).copy() for bn_var in bn_vars}
??? ?
??????? # iterate over the rest of the training set
??????? for i in xrange(1, num_iterations):
??????????? res = net.forward()
??????????? for bn_mean in bn_means:
??????????????? bn_avg_mean[bn_mean] += np.squeeze(res[bn_mean])
??????????? for bn_var in bn_vars:
??????????????? bn_avg_var[bn_var] += np.squeeze(res[bn_var])
??????????? print 'progress: {}/{}'.format(i, num_iterations)
??? ?
??????? # compute average means and vars
??????? for bn_mean in bn_means:
??????????? bn_avg_mean[bn_mean] /= num_iterations
??????? for bn_var in bn_vars:
??????????? bn_avg_var[bn_var] /= num_iterations
??? ?
??????? for bn_blob, bn_var in zip(bn_blobs, bn_vars):
??????????? m = np.prod(net.blobs[bn_blob].data.shape) / np.prod(bn_avg_var[bn_var].shape)
??????????? bn_avg_var[bn_var] *= (m / (m - 1))
??? ?
??????? # calculate the new scale and shift blobs for all the BN layers
??????? scale_data = {bn_layer: np.squeeze(net.params[bn_layer][0].data)
????????????????????? for bn_layer in bn_layers}
??????? shift_data = {bn_layer: np.squeeze(net.params[bn_layer][1].data)
????????????????????? for bn_layer in bn_layers}
??? ?
??????? var_eps = 1e-9
??????? new_scale_data = {}
??????? new_shift_data = {}
??????? for bn_layer, bn_mean, bn_var in zip(bn_layers, bn_means, bn_vars):
??????????? gamma = scale_data[bn_layer]
??????????? beta = shift_data[bn_layer]
??????????? Ex = bn_avg_mean[bn_mean]
??????????? Varx = bn_avg_var[bn_var]
??????????? new_gamma = gamma / np.sqrt(Varx + var_eps)
??????????? new_beta = beta - (gamma * Ex / np.sqrt(Varx + var_eps))
??? ?
??????????? new_scale_data[bn_layer] = new_gamma
??????????? new_shift_data[bn_layer] = new_beta
??????? print "New data:"
??????? print new_scale_data.keys()
??????? print new_shift_data.keys()
??? ?
??????? # assign computed new scale and shift values to net.params
??????? for bn_layer in bn_layers:
??????????? net.params[bn_layer][0].data[...] = new_scale_data[bn_layer].reshape(
??????????????? net.params[bn_layer][0].data.shape
??????????? )
??????????? net.params[bn_layer][1].data[...] = new_shift_data[bn_layer].reshape(
??????????????? net.params[bn_layer][1].data.shape
??????????? )
?????????? ?
??????? # build a test net prototxt
??????? test_msg = testable_msg
??????? # replace data layers with 'input' net param
??????? data_layers = [l for l in test_msg.layer if l.type.endswith("Data")]
??????? for data_layer in data_layers:
??????????? test_msg.layer.remove(data_layer)
??????? test_msg.input.append("data")
??????? test_msg.input_dim.append(1)
??????? test_msg.input_dim.append(3)
??????? test_msg.input_dim.append(in_h)
??????? test_msg.input_dim.append(in_w)
??????? # Set BN layers to INFERENCE so they use the new stat blobs
??????? # and remove mean, var top blobs.
??????? for l in test_msg.layer:
??????????? if l.type == "BN":
??????????????? if len(l.top) > 1:
??????????????????? dead_tops = l.top[1:]
??????????????????? for dl in dead_tops:
??????????????????????? l.top.remove(dl)
??????????????? l.bn_param.bn_mode = caffe_pb2.BNParameter.INFERENCE
??????? # replace output loss, accuracy layers with a softmax
??????? dead_outputs = [l for l in test_msg.layer if l.type in ["SoftmaxWithLoss", "Accuracy"]]
??????? out_bottom = dead_outputs[0].bottom[0]
??????? for dead in dead_outputs:
??????????? test_msg.layer.remove(dead)
??????? test_msg.layer.add(
??????????? name="prob", type="Softmax", bottom=[out_bottom], top=['prob']
??????? )
??????? return net, test_msg
??? ?
??? ?
??? def make_parser():
??????? p = ArgumentParser()
??????? p.add_argument('train_model')
??????? p.add_argument('weights')
??????? p.add_argument('out_dir')
??????? return p
??? ?
??? ?
??? if __name__ == '__main__':
??????? caffe.set_mode_gpu()
??????? p = make_parser()
??????? args = p.parse_args()
??? ?
??????? # build and save testable net
??????? if not os.path.exists(args.out_dir):
??????????? os.makedirs(args.out_dir)
??????? print "Building BN calc net..."
??????? testable_msg = make_testable(args.train_model)
??????? BN_calc_path = os.path.join(
??????????? args.out_dir, '__for_calculating_BN_stats_' + os.path.basename(args.train_model)
??????? )
??????? with open(BN_calc_path, 'w') as f:
??????????? f.write(text_format.MessageToString(testable_msg))
??? ?
??????? # use testable net to calculate BN layer stats
??????? print "Calculate BN stats..."
??????? train_ims, train_labs = extract_dataset(testable_msg)
??????? train_size = len(train_ims)
??????? minibatch_size = testable_msg.layer[0].dense_image_data_param.batch_size
??????? num_iterations = train_size // minibatch_size + train_size % minibatch_size
??????? in_h, in_w =(360, 480)?? #記得修改和自己圖片一樣的大小
??????? test_net, test_msg = make_test_files(BN_calc_path, args.weights, num_iterations,
???????????????????????????????????????????? in_h, in_w)
?????? ?
??????? # save deploy prototxt
??????? #print "Saving deployment prototext file..."
??????? #test_path = os.path.join(args.out_dir, "deploy.prototxt")
??????? #with open(test_path, 'w') as f:
??????? #??? f.write(text_format.MessageToString(test_msg))
?????? ?
??????? print "Saving test net weights..."
??????? test_net.save(os.path.join(args.out_dir, "test_weights_15750.caffemodel"))?? #記得修改迭代多少次命名
??????? print "done"

2.生成預測圖片

腳本:

??? #!bin/sh
??? echo "-------------------test segmentation is begin---------------------"
??? python test_segmentation.py --model models/inference/segmentation_inference.prototxt --weights models/inference/test_weights_15750.caffemodel --iter 26 #12250 #15750? # Test SegNet
??? echo "-------------------test segmentation is end---------------------"

test_segmentation.py

??? #-*-coding=utf8-*-
??? import numpy as np
??? import matplotlib.pyplot as plt
??? import os.path
??? import json
??? import scipy
??? import argparse
??? import math
??? import pylab
??? from sklearn.preprocessing import normalize
??? import cv2
??? caffe_root = '/data/xxxxxx/caffe-segnet-cudnn/caffe-segnet-cudnn5/' ?? ??? ??? ?# Change this to the absolute directoy to SegNet Caffe
??? import sys
??? sys.path.insert(0, caffe_root + 'python')
??? ?
??? import caffe
??? ?
??? # Import arguments
??? parser = argparse.ArgumentParser()
??? parser.add_argument('--model', type=str, required=True)
??? parser.add_argument('--weights', type=str, required=True)
??? parser.add_argument('--iter', type=int, required=True)
??? args = parser.parse_args()
??? ?
??? caffe.set_mode_gpu()
??? ?
??? net = caffe.Net(args.model,
??????????????????? args.weights,
??????????????????? caffe.TEST)
??? ?
??? ?
??? for i in range(0, args.iter):
??? ?
?? ??? ?net.forward()
?? ??? ?print(i)
?? ??? ?image = net.blobs['data'].data
?? ??? ?#print(image.shape)
?? ??? ?label = net.blobs['label'].data
?? ??? ?#print(label.shape)
?? ??? ?predicted = net.blobs['prob'].data #predicted: float32
?? ??? ?
?? ??? ?# convert np.float64 to np.uint8
?? ??? ?#image = (image* 50000).astype(np.uint8)
?? ??? ?#lahel = (label * 50000).astype(np.uint8)
?? ??? ?#predicted = (predicted * 50000).astype(np.uint8)
??? ?
?? ??? ?#print(predicted.shape)
?? ??? ?image = np.squeeze(image[0,:,:,:])
?? ??? ?output = np.squeeze(predicted[0,:,:,:])
?? ??? ?ind = np.argmax(output, axis=0)
?? ??? ?cv2.imwrite(str(i%26) + "predicted.png", ind * 100)# predicted: float32, this predicated is kuoda * 100
?? ??? ?r = ind.copy()
?? ??? ?g = ind.copy()
?? ??? ?b = ind.copy()
?? ??? ?r_gt = label.copy()
?? ??? ?g_gt = label.copy()
?? ??? ?b_gt = label.copy()
?? ??? ?#print(output.shape)
?? ??? ?#print(output.dtype)
??? ??? ?#print(output)
??? #?? ?Sky = [128,128,128]
??? #?? ?Building = [128,0,0]
??? #?? ?Pole = [192,192,128]
??? #?? ?Road_marking = [255,69,0]
??? #?? ?Road = [128,64,128]
??? #?? ?Pavement = [60,40,222]
??? #?? ?Tree = [128,128,0]
??? #?? ?SignSymbol = [192,128,128]
??? #?? ?Fence = [64,64,128]
??? #?? ?Car = [64,0,128]
??? #?? ?Pedestrian = [64,64,0]
??? #?? ?Bicyclist = [0,128,192]
??? #?? ?Unlabelled = [0,0,0]
??? ?
??? #?? ?label_colours = np.array([Sky, Building, Pole, Road, Pavement, Tree, SignSymbol, Fence, Car, Pedestrian, Bicyclist, Unlabelled])
??????????? BG = [0,0,0]
??????????? M = [0,255,0]
??????????? label_colours = np.array([BG, M])
?? ??? ?for l in range(0,2):
?? ??? ??? ?r[ind==l] = label_colours[l,0]
?? ??? ??? ?g[ind==l] = label_colours[l,1]
?? ??? ??? ?b[ind==l] = label_colours[l,2]
?? ??? ??? ?r_gt[label==l] = label_colours[l,0]
?? ??? ??? ?g_gt[label==l] = label_colours[l,1]
?? ??? ??? ?b_gt[label==l] = label_colours[l,2]
??????? # we do not normalize
?? ??? ?rgb = np.zeros((ind.shape[0], ind.shape[1], 3))
?? ??? ?rgb[:,:,0] = r#/255.0
?? ??? ?rgb[:,:,1] = g#/255.0
?? ??? ?rgb[:,:,2] = b#/255.0
?? ??? ?rgb_gt = np.zeros((ind.shape[0], ind.shape[1], 3))
?? ??? ?rgb_gt[:,:,0] = r_gt#/255.0
?? ??? ?rgb_gt[:,:,1] = g_gt#/255.0
?? ??? ?rgb_gt[:,:,2] = b_gt#/255.0
??? ?
?? ??? ?image = image#/255.0
??? ?
?? ??? ?image = np.transpose(image, (1,2,0))
?? ??? ?output = np.transpose(output, (1,2,0))
?? ??? ?image = image[:,:,(2,1,0)]
??? ?
??? ?
?? ??? ?#scipy.misc.toimage(rgb, cmin=0.0, cmax=255).save(IMAGE_FILE+'_segnet.png') #保存文件
??? ?
?? ??? ?cv2.imwrite(str(i%26)+'image.png', image.astype(np.uint8))
?? ??? ?cv2.imwrite(str(i%26)+'rgb_gt.png', rgb_gt.astype(np.uint8))
?? ??? ?cv2.imwrite(str(i%26)+'rgb.png', rgb.astype(np.uint8))
??? ?
?? ??? ?
?? ??? ?#plt.figure()
?? ??? ?#plt.imshow(image,vmin=0, vmax=1)? #顯示源文件
?? ??? ?#plt.figure()
?? ??? ?#plt.imshow(rgb_gt,vmin=0, vmax=1) #給的mask圖片,如果測試的圖片沒有mask,可以隨便放個圖片列表,省的修改代碼
?? ??? ?#plt.figure()
?? ??? ?#plt.imshow(rgb,vmin=0, vmax=1) # 預測圖片
?? ??? ?#plt.show()
??? ?
??? ?
??? print 'Success!'

四、mean IOU 評價的計算

??? #!/usr/bin/python
??? ?
??? import numpy as np
??? from skimage import io
??? import cv2
??? ?
??? def pixel_accuracy(eval_segm, gt_segm):
??????? '''
??????? sum_i(n_ii) / sum_i(t_i)
??????? '''
??? ?
??????? check_size(eval_segm, gt_segm)
??? ?
??????? cl, n_cl = extract_classes(gt_segm)
??????? eval_mask, gt_mask = extract_both_masks(eval_segm, gt_segm, cl, n_cl)
??? ?
??????? sum_n_ii = 0
??????? sum_t_i? = 0
??? ?
??????? for i, c in enumerate(cl):
??????????? curr_eval_mask = eval_mask[i, :, :]
??????????? curr_gt_mask = gt_mask[i, :, :]
??? ?
??????????? sum_n_ii += np.sum(np.logical_and(curr_eval_mask, curr_gt_mask))
??????????? sum_t_i? += np.sum(curr_gt_mask)
??? ?
??????? if (sum_t_i == 0):
??????????? pixel_accuracy_ = 0
??????? else:
??????????? pixel_accuracy_ = sum_n_ii / sum_t_i
??? ?
??????? return pixel_accuracy_
??? ?
??? def mean_accuracy(eval_segm, gt_segm):
??????? '''
??????? (1/n_cl) sum_i(n_ii/t_i)
??????? '''
??? ?
??????? check_size(eval_segm, gt_segm)
??? ?
??????? cl, n_cl = extract_classes(gt_segm)
??????? eval_mask, gt_mask = extract_both_masks(eval_segm, gt_segm, cl, n_cl)
??? ?
??????? accuracy = list([0]) * n_cl
??? ?
??????? for i, c in enumerate(cl):
??????????? curr_eval_mask = eval_mask[i, :, :]
??????????? curr_gt_mask = gt_mask[i, :, :]
??? ?
??????????? n_ii = np.sum(np.logical_and(curr_eval_mask, curr_gt_mask))
??????????? t_i? = np.sum(curr_gt_mask)
??? ?
??????????? if (t_i != 0):
??????????????? accuracy[i] = n_ii / t_i
??? ?
??????? mean_accuracy_ = np.mean(accuracy)
??????? return mean_accuracy_
??? ?
??? def mean_IU(eval_segm, gt_segm):
??????? '''
??????? (1/n_cl) * sum_i(n_ii / (t_i + sum_j(n_ji) - n_ii))
??????? '''
??? ?
??????? check_size(eval_segm, gt_segm)
??? ?
??????? cl, n_cl?? = union_classes(eval_segm, gt_segm)
??????? _, n_cl_gt = extract_classes(gt_segm)
??????? eval_mask, gt_mask = extract_both_masks(eval_segm, gt_segm, cl, n_cl)
??? ?
??????? IU = list([0]) * n_cl
??? ?
??????? for i, c in enumerate(cl):
??????????? curr_eval_mask = eval_mask[i, :, :]
??????????? curr_gt_mask = gt_mask[i, :, :]
??? ?
??????????? if (np.sum(curr_eval_mask) == 0) or (np.sum(curr_gt_mask) == 0):
??????????????? continue
??? ?
??????????? n_ii = np.sum(np.logical_and(curr_eval_mask, curr_gt_mask))
??????????? t_i? = np.sum(curr_gt_mask)
??????????? n_ij = np.sum(curr_eval_mask)
??? ?
??????????? IU[i] = n_ii / (t_i + n_ij - n_ii)
??? ?
??????? mean_IU_ = np.sum(IU) / n_cl_gt
??????? return mean_IU_
??? ?
??? def frequency_weighted_IU(eval_segm, gt_segm):
??????? '''
??????? sum_k(t_k)^(-1) * sum_i((t_i*n_ii)/(t_i + sum_j(n_ji) - n_ii))
??????? '''
??? ?
??????? check_size(eval_segm, gt_segm)
??? ?
??????? cl, n_cl = union_classes(eval_segm, gt_segm)
??????? eval_mask, gt_mask = extract_both_masks(eval_segm, gt_segm, cl, n_cl)
??? ?
??????? frequency_weighted_IU_ = list([0]) * n_cl
??? ?
??????? for i, c in enumerate(cl):
??????????? curr_eval_mask = eval_mask[i, :, :]
??????????? curr_gt_mask = gt_mask[i, :, :]
??? ?
??????????? if (np.sum(curr_eval_mask) == 0) or (np.sum(curr_gt_mask) == 0):
??????????????? continue
??? ?
??????????? n_ii = np.sum(np.logical_and(curr_eval_mask, curr_gt_mask))
??????????? t_i? = np.sum(curr_gt_mask)
??????????? n_ij = np.sum(curr_eval_mask)
??? ?
??????????? frequency_weighted_IU_[i] = (t_i * n_ii) / (t_i + n_ij - n_ii)
??? ?
??????? sum_k_t_k = get_pixel_area(eval_segm)
?????? ?
??????? frequency_weighted_IU_ = np.sum(frequency_weighted_IU_) / sum_k_t_k
??????? return frequency_weighted_IU_
??? ?
??? '''
??? Auxiliary functions used during evaluation.
??? '''
??? def get_pixel_area(segm):
??????? return segm.shape[0] * segm.shape[1]
??? ?
??? def extract_both_masks(eval_segm, gt_segm, cl, n_cl):
??????? eval_mask = extract_masks(eval_segm, cl, n_cl)
??????? gt_mask?? = extract_masks(gt_segm, cl, n_cl)
??? ?
??????? return eval_mask, gt_mask
??? ?
??? def extract_classes(segm):
??????? cl = np.unique(segm)
??????? n_cl = len(cl)
??? ?
??????? return cl, n_cl
??? ?
??? def union_classes(eval_segm, gt_segm):
??????? eval_cl, _ = extract_classes(eval_segm)
??????? gt_cl, _?? = extract_classes(gt_segm)
??? ?
??????? cl = np.union1d(eval_cl, gt_cl)
??????? n_cl = len(cl)
??? ?
??????? return cl, n_cl
??? ?
??? def extract_masks(segm, cl, n_cl):
??????? h, w? = segm_size(segm)
??????? masks = np.zeros((n_cl, h, w))
??? ?
??????? for i, c in enumerate(cl):
??????????? masks[i, :, :] = segm == c
??? ?
??????? return masks
??? ?
??? def segm_size(segm):
??????? try:
??????????? height = segm.shape[0]
??????????? width? = segm.shape[1]
??????? except IndexError:
??????????? raise
??? ?
??????? return height, width
??? ?
??? def check_size(eval_segm, gt_segm):
??????? h_e, w_e = segm_size(eval_segm)
??????? h_g, w_g = segm_size(gt_segm)
??? ?
??????? if (h_e != h_g) or (w_e != w_g):
??????????? raise EvalSegErr("DiffDim: Different dimensions of matrices!")
??? ?
??? '''
??? Exceptions
??? '''
??? class EvalSegErr(Exception):
??????? def __init__(self, value):
??????????? self.value = value
??? ?
??????? def __str__(self):
??????????? return repr(self.value)
??? ###############now we do some eval.
??? # test image only 1 image
??? def eval_segm(preddir, gtdir):
?? ??? ?pred = io.imread(preddir, 1)
?? ??? ?gt = io.imread(gtdir, 1)
?? ??? ?pred = (pred ).astype(np.uint8)
?? ??? ?np.set_printoptions(threshold='nan')
?? ??? ?#print(pred[10:50,:])
?? ??? ?_, pred_th= cv2.threshold(pred, 0.0000000000000001, 1, cv2.THRESH_BINARY)
?? ??? ?#print(gt[10:50,:])
?? ??? ?gt = (gt).astype(np.uint8)
?? ??? ?_, gt_th= cv2.threshold(gt, 0.0000000000000001, 1, cv2.THRESH_BINARY)
?? ??? ?
?? ??? ?pixel_accu = pixel_accuracy(pred_th, gt_th)
?? ??? ?mean_accu = mean_accuracy(pred_th, gt_th)
?? ??? ?mean_iou = mean_IU(pred_th, gt_th)
?? ??? ?fw_iou = frequency_weighted_IU(pred_th, gt_th)
?? ??? ?print("pixel_accu is: ", pixel_accu)
?? ??? ?print("mean_accu is: ", mean_accu)
?? ??? ?print("mean_iou is: ",mean_iou)
?? ??? ?print("fw_iou is: ", fw_iou)
?? ??? ?return pixel_accu, mean_accu, mean_iou, fw_iou
??? # test batch image
??? def eval_batch(rootdir):
?? ??? ?res_sum = []
?? ??? ?pixel_accu = 0.0
?? ??? ?mean_accu = 0.0
?? ??? ?mean_iou = 0.0
?? ??? ?fw_iou = 0.0
?? ??? ?
?? ??? ?for i in range(16):
?? ??? ??? ?preddir = rootdir + str(i)+"predicted.png"
?? ??? ??? ?gtdir = rootdir + str(i) + "rgb_gt.png"
?? ??? ??? ?print("===============%d==================", i)
?? ??? ??? ?resperimage = eval_segm(preddir, gtdir)
?? ??? ??? ?res_sum.append(resperimage)
?? ??? ?# compute avg eval metrics?? ?
?? ??? ?print("==================avg eval seg=========================")
?? ??? ?len_res_sum = len(res_sum)
?? ??? ?for i in range(len_res_sum):
?? ??? ??? ?pixel_accu += res_sum[i][0]
?? ??? ??? ?mean_accu += res_sum[i][1]
?? ??? ??? ?mean_iou += res_sum[i][2]
?? ??? ??? ?fw_iou += res_sum[i][3]
?? ??? ?print("avg pixel_accu : ", pixel_accu / len_res_sum, "avg mean_accu : ", mean_accu / len_res_sum,\
?? ??? ?"avg mean_iou : ", mean_iou / len_res_sum, "avg fw_iou : ", fw_iou/len_res_sum)
?? ??? ?
??? # get the contours of huizibiao?? ?
??? def get_contour(imagedir, preddir):
?? ??? ?#np.set_printoptions(threshold='nan')
??? ?
?? ??? ?pred = io.imread(preddir, 1)
?? ??? ?print(pred.dtype)
?? ??? ?#print(pred[:,10:50])
?? ??? ?pred = (pred ).astype(np.uint8)
?? ??? ?#print(" ")
?? ??? ?image = io.imread(imagedir, 1) # because it is float64
?? ??? ?print(image.dtype)
?? ??? ?print(image.shape)
?? ??? ?#print(image[:,10:50])
?? ??? ?image = (image* 255).astype(np.uint8)?? ?
?? ??? ?#cv2.imwrite("image.png",image)
?? ??? ?_, pred_th= cv2.threshold(pred, 0.0000000000000001, 1, cv2.THRESH_BINARY)
?? ??? ?contours, _ = cv2.findContours(pred_th,cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
?? ??? ?
?? ??? ?pred_contours = image
?? ??? ?
?? ??? ?for i in range(len(contours)):
?? ??? ??? ?cv2.drawContours(pred_contours, contours[i], -1, (0, 255, 0), 1)
?? ??? ?
?? ??? ?return pred_contours
??? # batch test contours of huizibiao
??? def get_contour_batch(rootdir):
?? ??? ?for i in range(16):
?? ??? ??? ?preddir = rootdir + str(i)+"predicted.png"
?? ??? ??? ?imagedir = rootdir + str(i) + "image.png"
?? ??? ??? ?print("=================================", i)
?? ??? ??? ?cv2.imwrite(str(i)+"image_countours.png", get_contour(imagedir, preddir))
?? ??? ??? ?
??? if __name__ == "__main__":
?? ??? ?'''
?? ??? ?# test only one image.
?? ??? ?preddir = "/data/xxxxxx/caffe-segnet-cudnn/caffe-segnet-cudnn5/test_result/3_iter7700/2/predicted.png"
?? ??? ?gtdir = "/data/xxxxx/caffe-segnet-cudnn/caffe-segnet-cudnn5/test_result/3_iter7700/2/rgb_gt.png"
?? ??? ?eval_segm(preddir, gtdir)
?? ??? ?'''
?? ??? ?
?? ??? ?# test batch image
?? ??? ?#rootdir = "/data/xxxxxxxx/caffe-segnet-cudnn/caffe-segnet-cudnn5/test_result/116/iter17w/"
?? ??? ?rootdir = "/data/xxxxxxxx/caffe-segnet-cudnn/caffe-segnet-cudnn5/"
?? ??? ?#eval_batch(rootdir)
?? ??? ?
?? ??? ?#draw contours on the one? image
?? ??? ?#preddir = "/data/xxxxx/caffe-segnet-cudnn/caffe-segnet-cudnn5/0predicted.png"
?? ??? ?#imagedir = "/data/xxxxx/caffe-segnet-cudnn/caffe-segnet-cudnn5/0image.png"
?? ??? ?#get_contour(imagedir, preddir)
?? ??? ?
?? ??? ?#test batch
?? ??? ?get_contour_batch(rootdir)

樓主最后的mean IOU 是95.19%。

至此完畢。
--------------------- ?
作者:努力努力再努力tq ?
來源:CSDN ?
原文:https://blog.csdn.net/u012426298/article/details/81386817 ?
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

?

總結

以上是生活随笔為你收集整理的语义分割 | segnet 制作自己的数据,如何训练,如何测试,如何评价的全部內容,希望文章能夠幫你解決所遇到的問題。

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

成人在线视频免费看 | 婷婷在线免费视频 | 亚洲一区二区三区毛片 | 欧美大片www| 日韩免费视频线观看 | 亚洲黄色a | 日韩国产精品久久久久久亚洲 | 波多野结衣小视频 | 国产 字幕 制服 中文 在线 | 国产黄色理论片 | 国产成人精品午夜在线播放 | 日韩av一卡二卡三卡 | 蜜臀av在线一区二区三区 | 日韩久久激情 | 日本特黄特色aaa大片免费 | 亚洲精品久久久蜜臀下载官网 | 97热在线观看 | 亚洲视频资源在线 | 精品一区二区在线播放 | 欧美日韩国产色综合一二三四 | 97品白浆高清久久久久久 | 国产精品久久久久一区 | 久产久精国产品 | 狠狠狠的干 | 久久久久久高清 | 国产精品亚洲精品 | 免费观看xxxx9999片 | 国产区免费在线 | 91成人免费看 | 97免费中文视频在线观看 | 免费av看片| 久久污视频 | 亚洲综合在线观看视频 | 日韩色区 | 一区二区三区免费在线播放 | av中文在线播放 | 中文字幕韩在线第一页 | 奇米影视777四色米奇影院 | 九色精品免费永久在线 | 久久精选| 色综合久 | 在线看福利av | 最近中文字幕高清字幕在线视频 | 久久久麻豆精品一区二区 | 久久国际影院 | 五月天色综合 | 日韩丝袜| 在线国产视频一区 | 欧美日韩综合在线观看 | 九九九九热精品免费视频点播观看 | 欧美精品在线观看免费 | 黄色一级大片在线免费看产 | 九九国产精品视频 | 久久国产精品视频免费看 | 成年人电影免费在线观看 | 日本乱视频 | 日色在线视频 | 九九九电影免费看 | 国产成人免费在线 | 久久久久亚洲最大xxxx | 啪啪免费试看 | 最新免费av在线 | 91看片在线观看 | 欧美日韩xxxxx | 最新色站 | 国产久草在线观看 | 91天天操| 人人澡人人舔 | 亚洲视频在线观看免费 | 亚洲一区二区精品在线 | 91超国产| 四虎成人精品在永久免费 | 夜夜夜夜夜夜操 | 亚洲人人精品 | 国产中文字幕精品 | 成人在线播放免费观看 | 国产va精品免费观看 | 欧美精品久久久久久久久久白贞 | 精品视频专区 | 黄色片免费看 | 免费看黄色小说的网站 | 青春草视频在线播放 | www国产一区 | 亚洲欧美日本国产 | 色88久久 | 国产亚洲一区 | 日韩欧美视频免费看 | 99久久99久久免费精品蜜臀 | 中文字幕丝袜一区二区 | h久久| 国产男女无遮挡猛进猛出在线观看 | 日韩精品专区 | av综合av| 97精品超碰一区二区三区 | 欧美视频99| 久久精品国产第一区二区三区 | 亚洲六月丁香色婷婷综合久久 | 久久99中文字幕 | 日日夜夜天天 | 狠狠狠狠狠狠狠狠 | 在线免费看黄网站 | 97人人视频 | 亚洲人xxx | 日韩av中文字幕在线免费观看 | 在线观看中文字幕亚洲 | 三上悠亚一区二区在线观看 | 99久久精品久久久久久动态片 | www.97色.com| 国产区久久 | 日韩精品在线一区 | 久久精品视频在线观看免费 | 99综合视频 | 国产青春久久久国产毛片 | 5月丁香婷婷综合 | 精品久久久久久亚洲综合网站 | 在线观看色网站 | 国产原创在线 | 国产91影院 | 成人手机在线视频 | 欧美国产视频在线 | 亚洲成人资源网 | 97夜夜澡人人爽人人免费 | 国产精品久久久久久久久久久久午 | 亚洲视频在线观看免费 | 成人在线播放视频 | 国产日韩欧美综合在线 | 精品国产1区二区 | 国模吧一区| 超碰大片 | 热久久免费视频 | 又黄又爽又刺激 | 亚洲精品乱码久久久久久蜜桃动漫 | 91九色porny在线| 国产一区国产二区在线观看 | 日韩免费电影在线观看 | av在线官网 | 成年人视频在线免费观看 | 狠狠干网址 | 99精品国产一区二区三区不卡 | 婷婷干五月 | 最近字幕在线观看第一季 | 狠狠色丁香婷婷综合基地 | 国产亚洲精品久久久久久久久久 | 97超碰人人爱 | 午夜av激情 | 亚洲精品国产片 | 婷婷激情综合网 | 久99视频 | 国产69精品久久99不卡的观看体验 | 亚洲精品1区2区3区 超碰成人网 | 婷婷丁香色综合狠狠色 | 色综合久久综合中文综合网 | av手机版 | 欧美激情片在线观看 | 午夜黄色大片 | 97在线观看视频 | 成人av网站在线观看 | av九九| 久久精品一二三区白丝高潮 | 久草在线视频网 | 99免费在线观看视频 | 久久精彩免费视频 | 免费看污片 | 天天色 天天 | 成人小视频在线免费观看 | 久久久久久久国产精品视频 | 久久综合一本 | 亚洲精欧美一区二区精品 | 日韩中文字幕a | 国产精品不卡在线播放 | av在线com| 91原创在线观看 | 精品99免费视频 | 欧美色图东方 | 欧美日韩在线精品 | 三级动态视频在线观看 | 久久视了 | 黄色小说免费观看 | 国内精品中文字幕 | 最新av网站在线观看 | 久久久久久久综合色一本 | 久久久精品电影 | 国产精品一区二区三区免费看 | 一级黄色片在线免费观看 | 久久精品亚洲一区二区三区观看模式 | 国产成人久久av免费高清密臂 | 国产一区久久 | 玖玖视频精品 | 久久综合九色综合欧美就去吻 | 成人在线播放av | 午夜精品久久久久久中宇69 | 成人一区二区三区在线 | 91精品欧美 | 区一区二区三在线观看 | 九九精品久久久 | 国产伦精品一区二区三区高清 | 亚洲综合在线发布 | 国产一级电影在线 | 亚洲高清网站 | 久久久国产影院 | 一区二区三区日韩精品 | 婷婷九九| 久久99亚洲精品久久久久 | 亚洲最新在线 | 国产成人精品av | 99久久久久免费精品国产 | 欧美久久成人 | 亚洲精品动漫久久久久 | 久久这里只有精品1 | 国产精品激情偷乱一区二区∴ | 欧美日韩精品在线一区二区 | 天天操天天射天天操 | 91视频在线国产 | 久久久久久综合网天天 | 超碰在线观看av.com | 日韩专区av | 免费在线观看国产黄 | 六月色丁 | 日批网站免费观看 | 99精品视频免费观看视频 | 视频在线观看亚洲 | 国产一级a毛片视频爆浆 | 天天草天天干天天射 | 夜夜骑天天操 | 在线亚洲成人 | 中文字幕成人在线 | 成片免费观看视频999 | 狠狠综合| zzijzzij亚洲成熟少妇 | 免费观看av| 中文在线字幕免费观 | 国产91免费观看 | 91麻豆精品国产91久久久无限制版 | 久久久久女人精品毛片九一 | 少妇bbb好爽| 丰满少妇一级片 | 免费亚洲精品 | 亚洲成av人片在线观看无 | 狠狠的干狠狠的操 | 亚洲精品中文字幕在线 | 东方av在线免费观看 | 91看片黄色| 中文字幕黄色网 | 久久人人爽人人片av | 97人人澡人人添人人爽超碰 | 三级黄色片子 | 91理论电影| 中文字幕日韩电影 | 日韩专区中文字幕 | 免费看的黄网站 | 精品国产欧美 | 久久亚洲国产精品 | 911香蕉视频| 黄色软件网站在线观看 | 青青久视频 | 国产精品久久久久久久久婷婷 | 人人插人人草 | 中文字幕乱码视频 | 日韩激情小视频 | 免费av成人在线 | 成人av电影免费在线观看 | 国产精品麻豆91 | 久久网站免费 | 久久综合狠狠综合久久综合88 | 免费看片网站91 | 性色在线视频 | 欧美怡红院视频 | 国产中文自拍 | 成人蜜桃网 | 国产精品久久久久久久电影 | 伊人电影在线观看 | 国产一级在线播放 | 国产精品久久久久久久久久久久午夜 | 国产精品久久伊人 | av成人在线电影 | 黄色一级免费电影 | 国产精品资源在线观看 | 888av| 在线观看第一页 | 免费看的黄色 | 亚洲精品资源在线观看 | 黄色在线观看污 | 女女av在线 | 99视| 日本黄色黄网站 | 韩国精品一区二区三区六区色诱 | 国产一区91 | 日韩精品不卡在线 | 韩国三级av在线 | 波多野结衣在线视频一区 | www.狠狠插.com | 亚洲黄色在线观看 | 国产黄色成人 | 最近最新中文字幕 | 日本性高潮视频 | 三级免费黄| 超碰97在线资源 | 亚洲爱爱视频 | 天天操综合网站 | 色诱亚洲精品久久久久久 | 玖玖视频免费在线 | 亚洲欧洲中文日韩久久av乱码 | 天天躁日日躁狠狠躁 | 激情欧美丁香 | 精品视频123区在线观看 | 91尤物国产尤物福利在线播放 | 久久久夜色| 欧美精品亚洲精品日韩精品 | www.91av在线| 99精品在线观看 | 免费成人黄色 | 亚洲高清国产视频 | 综合色综合 | 天天曰视频| 国产高清不卡 | 亚洲情婷婷 | 九九视频这里只有精品 | 久久国产精品小视频 | 91在线色| 国产不卡免费视频 | av东方在线 | 国产精品av一区二区 | 九九在线精品视频 | 久久久久久久久久久久久久av | 日韩免费在线观看视频 | 国产精品18久久久久久久 | 中文字幕在线播放av | 国产91精品看黄网站在线观看动漫 | 精品一二三区视频 | 成年人视频在线免费 | 玖玖在线资源 | 中文字幕专区高清在线观看 | 日韩欧美综合在线视频 | 日韩激情中文字幕 | 成人午夜在线电影 | 美女国产在线 | 国产日韩视频在线观看 | 尤物97国产精品久久精品国产 | 日韩高清成人在线 | 免费三级大片 | 国产高清专区 | 麻豆成人精品 | 色资源网免费观看视频 | 成人一区电影 | 亚洲综合最新在线 | 国产一级久久久 | 亚洲一级电影视频 | 欧美午夜精品久久久久 | 国产一区二区三区黄 | 久青草国产在线 | 99精品国产99久久久久久福利 | 国产视频观看 | 国产黄色特级片 | 久久亚洲私人国产精品 | 国产日韩av在线 | 在线观看视频你懂的 | 久久美女精品 | 91麻豆精品久久久久久 | 日韩久久久久久久久 | 久草.com | 一区二区中文字幕在线播放 | 久精品一区 | 精品国产人成亚洲区 | 成人av.com| 亚洲成人影音 | 91成人小视频 | 又黄又刺激视频 | 欧美一级片免费播放 | 免费特级黄色片 | 夜夜操综合网 | 中文字幕国内精品 | 人人爽人人爽 | 六月丁香激情综合色啪小说 | 国产高清视频免费观看 | 最新av免费在线 | 日韩在线一二三区 | 色婷婷福利 | 国产色啪 | www.狠狠操| 日日成人网 | 国产精在线 | 精品久久久免费视频 | 国产电影一区二区三区四区 | 国产综合小视频 | 久久综合精品一区 | 精品一区二区三区四区在线 | 精品免费观看视频 | 狠狠色狠狠色合久久伊人 | 亚洲综合在线观看视频 | 4hu视频 | 日日干干夜夜 | 亚洲国产精品va在线看 | 精品一二三区 | 日韩电影在线观看一区 | 99精品欧美一区二区三区 | 久久影院中文字幕 | 九九天堂 | 国产高清一级 | 国产高清99| 麻豆传媒视频在线免费观看 | 久久亚洲私人国产精品va | 亚洲成色777777在线观看影院 | av大全在线观看 | 激情综合色播五月 | 欧美精品中文字幕亚洲专区 | 午夜久久久影院 | 日韩色区 | 日韩av成人 | 国产手机视频在线 | 午夜av免费 | 日韩精品一区二区三区高清免费 | 特黄一级毛片 | 国产在线久久久 | 亚洲九九九 | 久久草精品 | 乱男乱女www7788 | 狠狠躁日日躁狂躁夜夜躁 | 久久精品成人热国产成 | 91精品免费在线视频 | 91av视频| 日本中文字幕电影在线免费观看 | www.伊人网| 亚洲精品视频在线观看免费 | 亚洲国产中文字幕在线观看 | 久久精品久久精品久久39 | 九九热只有这里有精品 | 日韩综合一区二区三区 | 欧美大香线蕉线伊人久久 | 日韩18p| 久久综合视频网 | 精品亚洲午夜久久久久91 | 91福利社区在线观看 | 日韩欧美国产激情在线播放 | 国产亚洲成av人片在线观看桃 | 欧美91视频 | 亚洲欧美经典 | 久久久片 | 在线观看免费视频你懂的 | 99色99| 天天操夜操视频 | 久久97超碰 | 日韩成人免费电影 | 麻豆一级视频 | 黄色精品在线看 | 国产高清av免费在线观看 | 免费看黄色小说的网站 | 亚洲三级毛片 | 欧美日韩精品在线视频 | www.黄色片.com | 成人av播放| 国产精品av在线免费观看 | 黄色av播放 | 免费三级a | 久久免费国产视频 | 国产精品久久久久久一区二区三区 | 免费日韩在线 | 欧美天堂久久 | 色就色,综合激情 | 中文字幕一区二区三区四区视频 | 伊人五月在线 | 福利视频区 | 成人av观看 | av中文字幕剧情 | 麻豆影音先锋 | 91色国产在线 | 亚州av免费| 国产精品日韩在线播放 | 99 久久久久| 亚洲视频 在线观看 | 久久手机免费观看 | 久久久高清一区二区三区 | 国产又粗又猛又爽又黄的视频免费 | 欧美 日韩 国产 中文字幕 | 亚洲欧洲中文日韩久久av乱码 | 一区免费观看 | 中文资源在线官网 | 国产尤物在线观看 | 人人人爽| 亚洲一区二区三区在线看 | 懂色av一区二区三区蜜臀 | 午夜国产成人 | 国产精品久久久久久久久久免费 | 天天干,狠狠干 | 欧美在一区 | 日日夜色 | 午夜久久影视 | 在线高清一区 | 伊人激情综合 | 午夜av一区| 最近中文字幕免费av | 毛片视频网址 | 97超碰免费在线观看 | 日韩在线观看视频网站 | 久久久国产精品亚洲一区 | 成人久久久精品国产乱码一区二区 | 亚洲激情一区二区三区 | 免费电影播放 | 国产亚洲精品久久久网站好莱 | 最新国产精品久久精品 | 国产欧美中文字幕 | 日韩aⅴ视频 | 日韩精品一区二区三区高清免费 | 97精品久久 | 中文字幕在线视频一区二区 | 手机av在线免费观看 | 亚洲精品国产成人 | 免费av网站观看 | 欧美一性一交一乱 | 日韩大片在线观看 | 国产一级三级 | 人人干人人艹 | 久久夜视频 | 91久久久久久国产精品 | 亚洲免费视频在线观看 | 久久精品免费观看 | 99热这里只有精品久久 | 1000部18岁以下禁看视频 | 免费高清在线视频一区· | 国产成人在线免费观看 | 精品一二区 | 国产午夜精品一区二区三区在线观看 | 国产成人三级三级三级97 | 国产中文字幕91 | 亚洲一区二区三区四区在线视频 | av大片免费 | 国产成人久久精品一区二区三区 | 综合国产在线观看 | 亚洲欧洲美洲av | 成人a在线观看高清电影 | 久草视频在线资源 | 五月在线 | 精品不卡av| 久久免费看av | 91在线区| 国产精品精品视频 | 国产丝袜美腿在线 | 色婷婷影视| 在线亚洲人成电影网站色www | 欧洲一区二区在线观看 | www.色午夜.com | 欧美成人精品三级在线观看播放 | 久久狠狠亚洲综合 | 欧美日韩91 | 美女在线观看av | 日本韩国在线不卡 | 国产又粗又硬又爽的视频 | 亚洲精品视频国产 | 国产午夜麻豆影院在线观看 | 国产精品黄网站在线观看 | 中文字幕在线看片 | 久久99精品久久久久蜜臀 | 就色干综合 | 国产精品第54页 | 顶级欧美色妇4khd | 在线成人小视频 | 911香蕉视频 | 99久国产| 国产一级免费观看视频 | 一区二区三区 中文字幕 | 在线观看视频一区二区三区 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 婷婷5月激情5月 | 国产一区欧美一区 | 麻豆视频观看 | 国精产品永久999 | 成人免费网站在线观看 | 久9在线| 91资源在线视频 | 日本久久免费视频 | 激情视频91 | 国产区网址 | 精品视频久久久久久 | 免费在线观看成人 | 日日碰狠狠躁久久躁综合网 | 91秒拍国产福利一区 | 久久久精品国产免费观看同学 | 日韩美精品视频 | 天天操天天射天天爽 | 婷婷色中文 | 日日操日日插 | 午夜在线看 | 亚洲色图色 | 超碰人人乐 | 国产系列在线观看 | 婷婷九月丁香 | 国产精品99免费看 | 国产伦精品一区二区三区在线 | 国产精品视频观看 | 日韩精品1区2区 | 91精品老司机久久一区啪 | 久久精品国产精品亚洲 | 在线天堂中文www视软件 | 欧美特一级 | 亚洲色影爱久久精品 | 国产欧美久久久精品影院 | 97热久久免费频精品99 | 99久久精品免费看国产免费软件 | 日本一区二区高清不卡 | 人人草在线视频 | 亚洲视频分类 | 欧美综合国产 | 日韩精品中文字幕一区二区 | 亚洲理论在线 | 欧美性色黄 | 狠狠88综合久久久久综合网 | 夜夜婷婷 | 天天干视频在线 | 在线观看色网 | 国产不卡av在线播放 | 国产视频观看 | 国产精品免费久久久久久久久久中文 | 91丨九色丨蝌蚪丰满 | 超碰人人乐 | 狠狠色狠狠色 | 久久综合九色欧美综合狠狠 | 久久一区二区三区四区 | 亚洲国产大片 | 日韩高清一区 | 中文视频在线 | 日韩伦理片一区二区三区 | 国产黄色精品在线观看 | 欧美综合久久久 | 久久精品看片 | 日日精品 | 女人18片毛片90分钟 | 国产精品9999 | 免费国产亚洲视频 | 成人国产精品免费观看 | 成人91在线 | 一区二区三区四区在线免费观看 | 精品国产一区二区三区在线观看 | 精品久久五月天 | 91免费日韩 | 人人澡人人舔 | 日本爱爱片 | 亚洲国产精品va在线看 | 免费观看午夜视频 | 亚洲成人国产精品 | 天天色欧美 | 爱情影院aqdy鲁丝片二区 | 日本天天操 | 91精品对白一区国产伦 | 国产精品久久婷婷六月丁香 | 免费在线色 | 国产一区二区在线播放视频 | 精品视频一区在线 | 中国一级片在线观看 | 国产1区在线 | 久久午夜色播影院免费高清 | 欧美天天干 | 中文字幕免费看 | 大片网站久久 | 中国一区二区视频 | 日韩av电影手机在线观看 | 色网站国产精品 | 免费网站在线观看人 | 亚洲免费精品视频 | 午夜国产福利在线观看 | 久久精品国产免费看久久精品 | 国产精品一区二区无线 | 欧美性脚交| 国产精品第 | 国产99久久久国产精品免费二区 | 黄色小说在线观看视频 | 欧美日韩国产一区二区三区 | 99久久精品电影 | 亚洲激情校园春色 | 国产伦精品一区二区三区… | 黄色亚洲大片免费在线观看 | 国产99自拍 | 丁香六月av | 伊人久久五月天 | 中文字幕国产 | 国产91勾搭技师精品 | 国产v在线播放 | 久草视频免费在线播放 | 欧美精品v国产精品 | 在线观看免费91 | 国产精品久久久久高潮 | 国产 色| 99精彩视频在线观看免费 | 欧美精品在线免费 | 日韩中文免费视频 | 国产手机视频精品 | 四虎成人在线 | 操操综合网 | 一区二区视频电影在线观看 | 日韩精品一区二区三区免费视频观看 | 91丨九色丨国产女 | 麻豆国产精品va在线观看不卡 | 豆豆色资源网xfplay | 丁香婷婷激情啪啪 | 超碰人在线 | 五月激情婷婷丁香 | 日韩va亚洲va欧美va久久 | 91中文字幕在线 | 免费在线黄色av | 国产成人a v电影 | 国产一区二区高清视频 | 制服丝袜亚洲 | 欧美福利网址 | 视频二区在线 | 久草在线欧美 | 国模一区二区三区四区 | 亚洲精品中文字幕视频 | 成人午夜电影在线播放 | 射久久久 | 久草在线免费在线观看 | 成人高清在线观看 | 狠狠激情中文字幕 | a黄色一级片 | 在线观看av免费观看 | 欧美精品一二三 | 久久国产精品色婷婷 | 97超碰人人澡人人 | 国产精品久久在线 | 日韩啪视频 | 中文字幕一区二 | 欧美少妇xx | 狠狠色噜噜狠狠狠狠2021天天 | 国产一区二区在线免费视频 | 国产精品久久久久9999 | 韩国av免费 | 亚洲精品理论片 | 免费男女羞羞的视频网站中文字幕 | 一区二区影视 | 精品久久久久久久久中文字幕 | 色婷婷a| 99视频播放 | 天天综合网 天天综合色 | 久久精品99精品国产香蕉 | www黄在线 | 最近中文字幕免费av | 草久久久久 | 天天草天天插 | 九九热在线视频免费观看 | 亚洲精品男人天堂 | 午夜成人免费影院 | 四虎影院在线观看av | 色综合久久久久网 | 亚洲精品免费在线播放 | av成人在线观看 | 永久免费精品视频 | 国产精品久久久久久久婷婷 | 免费亚洲片 | 亚洲va男人天堂 | 亚洲最大免费成人网 | 免费日韩电影 | 久久久久久久久久久久国产精品 | 精品一区二区电影 | 五月色丁香 | 亚洲国产中文字幕在线视频综合 | 精品国产成人在线 | 日韩精品免费专区 | 日韩欧美一区二区三区视频 | 国产色资源 | 丝袜+亚洲+另类+欧美+变态 | 久久男女视频 | 99精品视频在线观看播放 | 国产精品一区二区免费在线观看 | 青青草国产成人99久久 | 91麻豆国产福利在线观看 | 亚洲精品在线免费看 | 久草在线中文视频 | 日本精品一区二区三区在线观看 | 少妇av片| 久久99久久99精品免观看软件 | 久久久国产网站 | 成人av电影在线播放 | 99久久99久久免费精品蜜臀 | 国产 日韩 欧美 自拍 | 国产高清在线免费 | 日韩高清成人 | 免费观看视频的网站 | 久黄色 | 国产网站色 | 久久99国产精品免费网站 | 成年人视频在线 | 精品国产诱惑 | 波多野结衣在线观看一区 | 在线视频日韩精品 | 99久久这里有精品 | 综合亚洲视频 | 国产第一页在线观看 | 国产精品久久久久久久久久久久久 | 日韩欧美一区二区三区视频 | 国产精品一区二区三区免费看 | 久久国产精品99精国产 | 99久久精品免费看国产免费软件 | 草在线 | 亚洲国产小视频在线观看 | 亚洲精品av中文字幕在线在线 | 国产免费午夜 | 欧美一级在线看 | 久久视频在线观看免费 | 久久久精品影视 | 国内久久 | av丁香花 | 日韩在线在线 | 国产黄av| 色综合天天在线 | 91网站观看 | 精品视频久久久久久 | 久久精品艹 | 在线电影 一区 | 69视频国产 | 中文字幕资源网在线观看 | 波多野结衣日韩 | 免费久久99精品国产 | 狠狠狠色丁香婷婷综合久久88 | 日韩中文字幕在线观看 | 最新中文字幕在线资源 | 91精品在线麻豆 | 中文字幕乱码日本亚洲一区二区 | 色亚洲网| 91在线色 | 九九视频在线观看视频6 | 国产亚洲精品久久久久动 | 在线免费观看涩涩 | 精品一区二区久久久久久久网站 | 天天想夜夜操 | 在线观看亚洲国产 | 国产精品视频专区 | 日韩在线免费视频 | 91视频在线 | 国产精品九九九九九 | 国产中文字幕视频 | 免费a v在线 | 四虎成人av | 天天插天天射 | 日日干天天 | 色综合亚洲精品激情狠狠 | 午夜精品一区二区三区在线视频 | 亚洲电影久久久 | 天天色图 | 日日操网| 天天搞天天 | 久久亚洲二区 | 国产精品一区二区在线观看 | 久久久999免费视频 日韩网站在线 | 激情五月婷婷综合网 | 国产不卡在线看 | 91精品第一页 | 在线观看免费av片 | 久久理伦片| 久久激情片 | 丰满少妇对白在线偷拍 | 韩国av永久免费 | 992tv在线观看网站 | 国产成人av一区二区三区在线观看 | 粉嫩aⅴ一区二区三区 | 四虎影视精品成人 | 免费成人黄色片 | 久人人 | av在线电影免费观看 | av免费电影在线 | 日韩一区二区免费播放 | 免费av观看 | 这里只有精彩视频 | 国产精品网在线观看 | 日韩免费av网址 | 亚洲精品视频在线看 | 亚洲精品免费播放 | 在线亚洲精品 | 日韩乱码中文字幕 | 操老逼免费视频 | 在线观看视频国产 | 99产精品成人啪免费网站 | 一二区av | www.com在线观看 | 91精品在线播放 | 久久a国产 | 99视频精品视频高清免费 | 亚洲 成人 一区 | 久久久国产精品网站 | 国产日韩欧美视频在线观看 | 午夜精品一区二区三区可下载 | 欧美一级片在线观看视频 | 色999五月色 | 免费网站黄 | 亚洲最新在线 | 91女神的呻吟细腰翘臀美女 | 人人插人人艹 | 国产精品久久久久久久久岛 | 久久精品视频在线免费观看 | 天堂av免费| 亚洲精品在线免费看 | 国内毛片毛片 | 国产99久久久久久免费看 | 日韩精品1区2区 | 91精品一区在线观看 | 日韩精品一区不卡 | 日韩在线观看网址 | 天天天天综合 | 九九色网 | 亚洲精品在线播放视频 | 日韩成人精品一区二区三区 | 人人精品久久 | 成人在线黄色电影 | 久草久热 | 999久久国精品免费观看网站 | 国产五月天婷婷 | 国产视频一级 | 久久精品超碰 | 天天舔天天搞 | 国产视频九色蝌蚪 | 99理论片 | 国产精品九九九九九九 | 91探花在线视频 | 久久成人精品视频 | 国产一区免费看 | 国产视频精品网 | 日韩av高清 | 国产成人精品亚洲精品 | 欧洲成人免费 | 国产精品国产三级国产aⅴ无密码 | 亚洲精品九九 | 九九视频免费 | 色吊丝av中文字幕 | 天天综合久久综合 | 亚洲更新最快 | 狂野欧美激情性xxxx欧美 | 久久综合五月天婷婷伊人 | 中文字幕日韩有码 | 国产一区二区三精品久久久无广告 | 999成人免费视频 | 国产一二区视频 | 久久免费看a级毛毛片 | 精品国模一区二区三区 | 国产精品久久久久久一区二区三区 | 国产亚洲成av人片在线观看桃 | www欧美色 | 91丨九色丨高潮丰满 | 又黄又爽又刺激 | 玖草在线观看 | 成人黄色一级视频 | 国产美女精品久久久 | 亚洲国产69| 五月婷av | 欧美精品首页 | 国产婷婷一区二区 | 色的网站在线观看 | 久草在线国产 | 亚洲韩国一区二区三区 | 在线观看aa | 国产精品普通话 | 婷婷亚洲激情 | 久久国产精品99久久久久久进口 | 日韩精选在线观看 | 国产精品尤物视频 | 国产成人精品福利 | 久久久黄视频 | 中文有码在线视频 | 国产专区一 | 中文理论片 | 免费观看成年人视频 | 日韩精品在线视频免费观看 | 91av视频在线免费观看 | 国产精品99久久免费黑人 | 日日夜精品 | 国产亚洲欧洲 | 伊人五月 | 欧美成人按摩 | 99热精品久久 | 日韩欧美在线一区 | 国内精品久久久久影院优 | 国内一级片在线观看 | 国产精品一区久久久久 | 久久精品草| 亚洲国产成人精品在线观看 | 麻豆传媒精品 | 五月天婷亚洲天综合网鲁鲁鲁 | 中文字幕中文 | 91精品视频观看 | 色播五月激情五月 | 最新av网址大全 | 免费亚洲黄色 | 亚洲成色 | 欧美日韩在线视频一区二区 | 国产视频1区2区3区 久久夜视频 | 中国一级片在线播放 | 丁香婷婷在线 | 亚洲第一成网站 | 日韩成年视频 | 国产福利91精品一区二区三区 | 婷婷深爱激情 | 九九视频在线观看视频6 | 人人涩| av在线电影播放 | 久久久国产一区二区三区四区小说 | 亚洲jizzjizz日本少妇 | 欧美精品一区二区性色 | 国产精品美女久久久久久免费 | 激情久久久久久久久久久久久久久久 | 视频 国产区 | 色网址99 | 国产拍揄自揄精品视频麻豆 | 精品影院|