国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

實操教程|詳細記錄solov2的ncnn實現(xiàn)和優(yōu)化

共 16359字,需瀏覽 33分鐘

 ·

2021-04-29 08:10

作者丨歐陽慧宇@知乎(已授權(quán))
來源丨h(huán)ttps://zhuanlan.zhihu.com/p/361900997
編輯丨極市平臺

極市導(dǎo)讀

 

由于目前solo系列在GitHub中沒有轉(zhuǎn)ncnn的項目,作者詳細記錄了自己solov2的ncnn實現(xiàn)以及后處理后處理優(yōu)化的一些策略,給需要的人一點借鑒。附有代碼地址。

SOLOV2簡介

solo大家都知道,核心思想是:將分割問題轉(zhuǎn)化為位置分類問題,從而做到不需要anchor,不需要normalization,不需要bounding box detections的實例分割。

https://github.com/Epiphqny/SOLOv2

緣由

目前solo系列在github中沒有轉(zhuǎn)ncnn的項目

solov2的思想比較簡單明了,但是轉(zhuǎn)ncnn還是需要很多比較復(fù)雜操作,想在用ncnn實現(xiàn)更加了解solov2內(nèi)部的算法流程,也熟悉ncnn的一些其他op操作

文字有很多干貨:param手動修改、動態(tài)op、加速技巧等等

1 、torch導(dǎo)出onnx

在導(dǎo)出onnx之前有幾部操作:

  • 修改split_feats: onnx不支持F.interpolate() 中 scale_factor < 1 ;因此對split_feats做了修改為nn.Maxpool 卷積,后面轉(zhuǎn)ncnn手動修改;
def split_feats(self, feats):     return [            self.maxpool(feats[0]),            # F.interpolate(feats[0],scale_factor=0.5,mode='bilinear'),            feats[1],            feats[2],            feats[3],            F.interpolate(feats[4], size=feats[3].shape[-2:], mode='bilinear')]

  • 添加輸入?yún)?shù):

添加onnx參數(shù),金生coord改為手動輸入

def forward(self, feats, eval=False,onnx=False):        if onnx:            feats,p3_input,p4_input,p5_input = feats        new_feats = self.split_feats(feats)
featmap_sizes = [featmap.size()[-2:] for featmap in new_feats] if onnx: new_feats[0] = [new_feats[0],p3_input] new_feats[1] = [new_feats[1],p3_input] new_feats[2] = [new_feats[2],p4_input] new_feats[3] = [new_feats[3],p5_input] new_feats[4] = [new_feats[4],p5_input]

  • 實現(xiàn)轉(zhuǎn)換代碼

實現(xiàn)轉(zhuǎn)換代碼,并onnxsim優(yōu)化,這里需要注意的是輸入盡量小一點,因為solo的四個輸出頭的size比較?。?0,36,24,16,12),輸入較大時會使F.interpolate() 中 scale_factor < 1 ,input_size = 256時fpn最后一層上采樣的scale_factor剛好可以等于2(256%64=0)

from torch import nnimport torchfrom mmcv import  Configfrom mmdet.models.builder import build_backbone,build_head,build_neck
class SOLOV2(nn.Module): def __init__(self,confg): super(SOLOV2,self).__init__() self.cfg = Config.fromfile(confg) self.cfg = self.cfg["model"] self.backbone = build_backbone(self.cfg["backbone"]) self.neck = build_neck(self.cfg["neck"]) self.bbox_head = build_head(self.cfg["bbox_head"]) def forward(self,x,p3_input,p4_input,p5_input): x = self.backbone(x) x = self.neck(x) feature_pred,kernel_pred,cate_pred = self.bbox_head([x,p3_input,p4_input,p5_input],eval=True,onnx=True) return feature_pred,kernel_pred,cate_pred
cfg = "./configs/solov2/solov2_r101_3x.py"pretrained = "./weights/solov2.pth"#net = SOLOV2(cfg)state_dict = torch.load(pretrained, map_location=lambda storage, loc: storage)["state_dict"]res = net.load_state_dict(state_dict,strict=False)net.eval()
input_size = 256dummy_input1 = torch.randn(1, 3, input_size, input_size)dummy_input2 = torch.randn(1, 2, input_size//8, input_size//8)dummy_input3 = torch.randn(1, 2, input_size//16, input_size//16)dummy_input4 = torch.randn(1, 2, input_size//32, input_size//32)input_names = ["input","p3_input","p4_input","p5_input"]output_names = ["feature_pred","kernel_pred1","kernel_pred2","kernel_pred3","kernel_pred4","kernel_pred5", "cate_pred1","cate_pred2","cate_pred3","cate_pred4","cate_pred5" ]save_name = "./onnx/solov2.onnx"# torch.onnx.export(model, (dummy_input1, dummy_input2, dummy_input3), "C3AE.onnx", verbose=True, input_names=input_names, output_names=output_names)torch.onnx.export(net, (dummy_input1,dummy_input2,dummy_input3,dummy_input4),save_name , verbose=False, input_names=input_names, output_names=output_names)
import osos.system("python -m onnxsim {0} {0}".format(save_name))

2、onnx轉(zhuǎn)ncnn

  • onnx2ncnn
./onnx2ncnn solov2.onnx solov2.param solov2.bin

  • ncnn 參數(shù)手工優(yōu)化
  1. 將之前轉(zhuǎn)onnx時的maxpool改為上采樣操作:

改為

2、將所有的kernel_pred和cate_pred之前的Interp參數(shù)改為對用的w和h:

改為

對應(yīng)40尺寸的改好了,后面32、24、26、12也是類似的;

3、ncnn推理實現(xiàn)

  • coord輸入實現(xiàn)

對比torch半的coord實現(xiàn):

      x_range = torch.linspace(-1, 1, kernel_feat.shape[-1], device=kernel_feat.device)      y_range = torch.linspace(-1, 1, kernel_feat.shape[-2], device=kernel_feat.device)      y, x = torch.meshgrid(y_range, x_range)      y = y.expand([kernel_feat.shape[0], 1, -1, -1])      x = x.expand([kernel_feat.shape[0], 1, -1, -1])      coord_feat = torch.cat([x, y], 1)

因為對應(yīng)stride只有8、16、32,因此ncnn需要生成3個對應(yīng)尺寸的Mat:

size_t elemsize = sizeof(float);
ncnn::Mat x_p3; ncnn::Mat x_p4; ncnn::Mat x_p5; // coord conv int pw = int(target_w / 8); int ph = int(target_h / 8); x_p3.create(pw, ph, 2, elemsize); float step_h = 2.f / (ph - 1); float step_w = 2.f / (pw - 1); for (int h = 0; h < ph; h++) { for (int w = 0; w < pw; w++) { x_p3.channel(0)[h * pw + w] = -1.f + step_w * (float) w; x_p3.channel(1)[h * pw + w] = -1.f + step_h * (float) h; } }
pw = int(target_w / 16); ph = int(target_h / 16); x_p4.create(pw, ph, 2, elemsize); step_h = 2.f / (ph - 1); step_w = 2.f / (pw - 1); for (int h = 0; h < ph; h++) { for (int w = 0; w < pw; w++) { x_p4.channel(0)[h * pw + w] = -1.f + step_w * (float) w; x_p4.channel(1)[h * pw + w] = -1.f + step_h * (float) h; } }
pw = int(target_w / 32); ph = int(target_h / 32); x_p5.create(pw, ph, 2, elemsize); step_h = 2.f / (ph - 1); step_w = 2.f / (pw - 1); for (int h = 0; h < ph; h++) { for (int w = 0; w < pw; w++) { x_p5.channel(0)[h * pw + w] = -1.f + step_w * (float) w; x_p5.channel(1)[h * pw + w] = -1.f + step_h * (float) h; } }

將其作為輸入:

    ncnn::Extractor ex = solov2.create_extractor();    ex.input("input", in);    ex.input("p3_input", x_p3);    ex.input("p4_input", x_p4);    ex.input("p5_input", x_p5);

  • 抽取feature_pred、kernerl_pred、cate_pred特征
    ncnn::Mat feature_pred, cate_pred1, cate_pred2, cate_pred3, cate_pred4, cate_pred5, kernel_pred1, kernel_pred2, kernel_pred3, kernel_pred4, kernel_pred5;
ex.extract("cate_pred1", cate_pred1); ex.extract("cate_pred2", cate_pred2); ex.extract("cate_pred3", cate_pred3); ex.extract("cate_pred4", cate_pred4); ex.extract("cate_pred5", cate_pred5); ex.extract("kernel_pred1", kernel_pred1); ex.extract("kernel_pred2", kernel_pred2); ex.extract("kernel_pred3", kernel_pred3); ex.extract("kernel_pred4", kernel_pred4); ex.extract("kernel_pred5", kernel_pred5); ex.extract("feature_pred", feature_pred);

  • 生成分割mask圖

前面已經(jīng)有了kernel_pred和feature_pred,接下來就是生成mask圖,這就用到了low-level op api<這里說一句ncnn真靈活,誰用誰知道>,目的是實現(xiàn)torch中的動態(tài)conv2d,對應(yīng)torch實現(xiàn)為:

ins_i = F.conv2d(feature_pred, kernel, groups=N).view(N, self.seg_num_grids[i] ** 2, h, w)
ncnn的low-level op api使用wiki:
https://github.com/Tencent/ncnn/wiki

創(chuàng)建ncnn::Option

    ncnn::Option opt;    opt.num_threads = num_threads;    opt.use_fp16_storage = false;    opt.use_packing_layout = false;
實現(xiàn)分割的預(yù)測功能函數(shù)
static void ins_decode(const ncnn::Mat &kernel_pred, const ncnn::Mat &feature_pred, ncnn::Mat *ins_pred, int c_in, int c_out,           ncnn::Option &opt) {
ncnn::Layer *op = ncnn::create_layer("Convolution"); ncnn::ParamDict pd; pd.set(0, c_out); pd.set(1, 1); pd.set(6, c_in * c_out); op->load_param(pd); ncnn::Mat weights[1]; weights[0].create(c_in * c_out); float *kernel_pred_data = (float *) kernel_pred.data;
for (int i = 0; i < c_in * c_out; i++) { weights[0][i] = kernel_pred_data[i]; }
op->load_model(ncnn::ModelBinFromMatArray(weights)); op->create_pipeline(opt); ncnn::Mat temp_ins; op->forward(feature_pred, temp_ins, opt); *ins_pred = temp_ins; op->destroy_pipeline(opt); delete op;}
將每個kernel_pre轉(zhuǎn)換為分割圖:
    ncnn::Mat ins_pred1, ins_pred2, ins_pred3, ins_pred4, ins_pred5;    int c_in = feature_pred.c;
ins_decode(kernel_pred1, feature_pred, &ins_pred1, c_in, 40 * 40,opt); ins_decode(kernel_pred2, feature_pred, &ins_pred2, c_in, 36 * 36,opt); ins_decode(kernel_pred3, feature_pred, &ins_pred3, c_in, 24 * 24,opt); ins_decode(kernel_pred4, feature_pred, &ins_pred4, c_in, 16 * 16,opt);    ins_decode(kernel_pred5, feature_pred, &ins_pred5, c_in, 12 * 12,opt);
  • 后處理


有了這一切后就是后處理啦,貼代碼:

功能函數(shù)

void generate_res(ncnn::Mat &cate_pred, ncnn::Mat &ins_pred, std::vector <std::vector<Object>> &objects, float cate_thresh,             float conf_thresh, int img_w, int img_h, int num_class, float stride) {    int w = cate_pred.w;    int h = cate_pred.h;    int w_ins = ins_pred.w;    int h_ins = ins_pred.h;    for (int q = 0; q < num_class; q++) {        const float *cate_ptr = cate_pred.channel(q);        for (int i = 0; i < h; i++) {            for (int j = 0; j < w; j++) {                int index = i * w + j;                float cate_socre = cate_ptr[index];                if (cate_socre < cate_thresh) {                    continue;                }                const float *ins_ptr = ins_pred.channel(index);                cv::Mat mask(h_ins, w_ins, CV_32FC1);                float sum_mask = 0.f;                int count_mask = 0;                {                    mask = cv::Scalar(0.f);                    float *mp = (float *) mask.data;                    for (int m = 0; m < w_ins * h_ins; m++) {                        float mask_score = sigmoid(ins_ptr[m]);
if (mask_score > 0.5) { mp[m] += mask_score; sum_mask += mask_score; count_mask++; } } } if (count_mask < stride) { continue; } float mask_score = sum_mask / (float(count_mask) + 1e-6);
// float socre = mask_score * cate_socre; float socre = mask_score * cate_socre;
if (socre < conf_thresh) { continue; }
cv::Mat mask2; cv::resize(mask, mask2, cv::Size(img_w, img_h)); Object obj; obj.mask = cv::Mat(img_h, img_w, CV_8UC1); float sum_mask_y = 0.f; float sum_mask_x = 0.f; int area = 0; { obj.mask = cv::Scalar(0); for (int y = 0; y < img_h; y++) { const float *mp2 = mask2.ptr<const float>(y); uchar *bmp = obj.mask.ptr<uchar>(y); for (int x = 0; x < img_w; x++) {
if (mp2[x] > 0.5f) { bmp[x] = 255; sum_mask_y += (float) y; sum_mask_x += (float) x; area++;
} else bmp[x] = 0; } } } obj.cx = int(sum_mask_x / area); obj.cy = int(sum_mask_y / area); obj.label = q + 1; obj.prob = socre; objects[q].push_back(obj);
} } }
}

每個head的解碼:

std::vector <std::vector<Object>> class_candidates;    class_candidates.resize(num_class);    generate_res(cate_pred1,ins_pred1,class_candidates,cate_thresh,confidence_thresh,img_w,img_h,num_class,8.f);    generate_res(cate_pred2,ins_pred2,class_candidates,cate_thresh,confidence_thresh,img_w,img_h,num_class,8.f);    generate_res(cate_pred3,ins_pred3,class_candidates,cate_thresh,confidence_thresh,img_w,img_h,num_class,16.f);    generate_res(cate_pred4,ins_pred4,class_candidates,cate_thresh,confidence_thresh,img_w,img_h,num_class,32.f);    generate_res(cate_pred5,ins_pred5,class_candidates,cate_thresh,confidence_thresh,img_w,img_h,num_class,32.f);

最后就是nms了,nms實現(xiàn)的比較低效:

    objects.clear();    for (int i = 0; i < (int) class_candidates.size(); i++) {        std::vector <Object> &candidates = class_candidates[i];
qsort_descent_inplace(candidates);
std::vector<int> picked; nms_sorted_segs(candidates, picked, nms_threshold,img_w,img_h);
for (int j = 0; j < (int) picked.size(); j++) { int z = picked[j]; objects.push_back(candidates[z]); } }
qsort_descent_inplace(objects);

至此,已經(jīng)基本完成了所有工作啦:來預(yù)測一張圖看看:

可以看出來結(jié)果還是非常好的QAQ

速度優(yōu)化

重中之重來啦,本人針對SOLO的特點做了一處優(yōu)化,就是kernel_pred的部分,在kernel_pred1部分輸出特征圖為256x40x40,轉(zhuǎn)換為cond2d的核就為1600x256,1600的通道在stride=4的特征圖上耗時巨大,那怎么來優(yōu)化呢。

SOLO預(yù)測的cate_pred1分支預(yù)測了40x40=1600個網(wǎng)格,但并不是所有網(wǎng)格都是需要的,只有大于預(yù)值得才需要,那么在kernel_pred1的輸出部分僅僅只需要cate_pred1大于閾值對應(yīng)的核就好,基于這個思想就能減少非常多的通道,進而減少計算量。

話不多說,具體這樣實現(xiàn):

  • 首先獲取cate_pred大于閾值的index:

功能函數(shù)為:

static void kernel_pick(const ncnn::Mat &cate_pred, std::vector<int> &picked, int num_class, float cate_thresh){    int w = cate_pred.w;    int h = cate_pred.h;    for (int q = 0; q < num_class; q++) {        const float *cate_ptr = cate_pred.channel(q);        for (int i = 0; i < h; i++) {            for (int j = 0; j < w; j++) {                int index = i * w + j;                float cate_score = cate_ptr[index];                if (cate_score < cate_thresh) {                    continue;                }                else  picked.push_back(index);            }        }    }}

獲取每個cate_pred分支的index結(jié)果:

    std::vector<int> kernel_picked1, kernel_picked2, kernel_picked3, kernel_picked4, kernel_picked5;    kernel_pick(cate_pred1, kernel_picked1, num_class, cate_thresh);    kernel_pick(cate_pred2, kernel_picked2, num_class, cate_thresh);    kernel_pick(cate_pred3, kernel_picked3, num_class, cate_thresh);    kernel_pick(cate_pred4, kernel_picked4, num_class, cate_thresh);    kernel_pick(cate_pred5, kernel_picked5, num_class, cate_thresh);

  • 在ins_decode功能函數(shù)中加入map,來保存index和ins_pred的通道索引的映射關(guān)系
static void ins_decode(const ncnn::Mat &kernel_pred, const ncnn::Mat &feature_pred, std::vector<int> &kernel_picked,                       std::map<int, int> &kernel_map, ncnn::Mat *ins_pred, int c_in,                       ncnn::Option &opt) {    std::set<int> kernel_pick_set;    kernel_pick_set.insert(kernel_picked.begin(), kernel_picked.end());    int c_out = kernel_pick_set.size();    if (c_out > 0) {        ncnn::Layer *op = ncnn::create_layer("Convolution");        ncnn::ParamDict pd;        pd.set(0, c_out);        pd.set(1, 1);        pd.set(6, c_in * c_out);        op->load_param(pd);        ncnn::Mat weights[1];        weights[0].create(c_in * c_out);        float *kernel_pred_data = (float *) kernel_pred.data;        std::set<int>::iterator pick_c;        int count_c = 0;        for (pick_c = kernel_pick_set.begin(); pick_c != kernel_pick_set.end(); pick_c++)        {            kernel_map[*pick_c] = count_c;            for (int j = 0; j < c_in; j++) {                weights[0][count_c * c_in + j] = kernel_pred_data[c_in * (*pick_c) + j];            }
count_c++; }
op->load_model(ncnn::ModelBinFromMatArray(weights)); op->create_pipeline(opt); ncnn::Mat temp_ins; op->forward(feature_pred, temp_ins, opt); *ins_pred = temp_ins; op->destroy_pipeline(opt); delete op; }}

這樣后面generate_res里面通過map來獲取ins_pred的特征:

  • 速度對比

先來打印一下ins_pred的通道

    
std::cout << ins_pred1.h << "," << ins_pred1.w << "," << ins_pred1.c << std::endl;    std::cout << ins_pred2.h << "," << ins_pred2.w << "," << ins_pred2.c << std::endl;    std::cout << ins_pred3.h << "," << ins_pred3.w << "," << ins_pred3.c << std::endl;    std::cout << ins_pred4.h << "," << ins_pred4.w << "," << ins_pred4.c << std::endl;    std::cout << ins_pred5.h << "," << ins_pred5.w << "," << ins_pred5.c << std::endl;
沒做通道篩選之前:

做了通道篩選后:

1600+1296+576+256+144 = 3872 -> 62+40 = 102 ,對于stride=4的特征圖這計算量減少了許多,如果在cate_pred的輸出做maxpool的nms,通道數(shù)還會減少幾倍。

resnet_r101的backbone下,耗時6825.4ms ->5226.95ms(backbone太厚了,本人訓(xùn)練一個mbv2版本,已經(jīng)上傳百度云,700ms左右的樣子,14年老mac cpu單線程)

總結(jié)

實踐下如何在ncnn上使用動態(tài)op和corrd_conv,以及后處理后處理優(yōu)化的一些策略,給需要的人一點借鑒。

項目地址

https://github.com/DayBreak-u/SOLOV2_ncnn


瀏覽 65
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 人人看人人摸人人操| 日本精品在线观看视频| 午夜天堂| 日韩一级电影在线观看| 丁香五月天av| 国产乱子伦一区二区三| 国外亚洲成AV人片在线观看 | 欧美日韩国产尤物主播精品| 国产成人精品一区二区三区在线| 久久久久久穴| 香蕉伊人在线| 另类老太婆性BBWBBw| 91人妻日韩人妻无码| 免费国产视频| 无码熟妇| 国产又色又爽又黄又免费| 蝌蚪窝免费在线视频| 91视频人妻| 免费看毛片网站| 噜噜色av| 91免费福利视频| 亚洲精品天堂无码| 撸撸视频| 黄片伊人| 久久小视频| 精品成人一区二区三区| 丁香花五月激情| 成年人黄色视频| a√在线视频| 青娱乐三级在线免| 精品视频一区二区三区| 亚洲一二三四| 欧美一级A片免费看| 五月丁香激情综合| 欧美一级A片在线观看| 无码专区在线播放| 东京热观看| 少妇BBBBBB| 99视频免费在线观看| 人人澡人人澡人人澡| 日本翔田千里奶水| 高清成人无码| 亚洲免费黄| 亚洲婷婷AV| 国产特级婬片免费看| 中文字幕不卡AV在线观看| 闷骚艳岳的婬乱生活视频| 老司机AV| 九九热在线精品| 精品77777| 人与禽一级A片一区二区三区| 热久久久久久| 欧美成人一级a片| 北条麻妃久久网站| 黄片视频免费| 国产视频导航| 在线一区二区三区四区| 午夜无码在线| 你懂的在线观看视频| 毛片毛片毛片毛片毛片| 日韩精品人妻中文字幕有| 91精品国产成人做爰观看奶头| 操穴网| 日韩v欧美v日本v亚洲v国产v| 最美孕交vivoestv另类| 亚洲黄色在线观看| www.| 国产一级操逼片| 日韩中文字幕一区| 动漫无码视频| 欧美日韩视频一区二区三区| 午夜精品人妻无码| 国产精品无码无套在线照片| 国产一级婬片A片| 北条麻妃一区二区三区在线播放| 黄色中文字幕| 色色欧美色色| 日韩A片| 国产激情网站| 亚洲中文字墓| 艹逼在线观看| 日韩无码高清一区| 在线观看av网站| 中文字幕av第一页| 日韩免费成人| 青青草在线播放| 激情av在线| 国产免费一区| 国产香蕉在线| 91国产爽黄在线| 蜜桃传媒一区| 米奇色色| 蜜臀久久99精品久久久老牛影视| 野花av| 国产精品资源| 日本操逼在线播放| 天天日天天操天天| 性毛片| 色图插插插| 99性爱网| 涩涩视频成人| 日韩国产免费| 成人一区在线观看| 丁香花五月激情| 91亚洲精品在线观看| 俺去俺来WWW色官方| 嫩草视频网站| 永久免费看片视频| 午夜成人毛片| 91精品电影18| 伊人大香蕉视频| 老妇性BBWBBWBBWBBW| 国产性爱电影网| 精品人妻一区二区乱码一区二区| 国产高潮视频在线观看| 国产黄色一级电影| 亚洲无码乱码精品| 黄总AV| 亚洲v区| 亚洲成人无码一区| 免费视频一二三区| 欧美日韩国产成人| 亚洲色情视频| 麻豆传媒视频观看| 日韩在线一级片| 不卡AV在线播放| 99热在线观看者| 日韩一区二区高清无码| 中文字幕在线一区二区a| 超碰操| 国产美女啪啪视频| 日韩欧美毛片| 日韩成人影片| 欧美成人视频18| 久久夜色视频网| 欧洲黄色片| 久久久WWW成人免费无遮挡大片| 成人综合娱乐网| 丁香天堂| 91精品丝袜久久久久久久久粉嫩 | 五月天婷婷在线播放视频免费观看 | 欧美熟女一区二区| 中国老女人日逼| 97视频精品| 天堂va欧美va亚洲va在线| 天天日天天拍| 日韩高清一区二区| 日日撸| 中文字幕日本欧美| 婷婷少妇激情| 亚洲日逼网| 福利视频一区二区三区| 中文熟女| 午夜av影院| 91综合网| 亚洲精品国产成人| 高清无码一级片| 开心激情网五月天| 在线日韩av| 玩弄人妻少妇500系列视频| 日韩免费av| 中文字幕在线看成人电影| 欧美色图网址| 91综合视频在线播放| 青青操久久| 暖暖无码| 91狠狠综合久久| 久久日韩操| 夜色精品视频| 免费国产在线视频| 亚洲色综合久久五月| 亚洲操b| 国产精品视频| 日韩成人AV在线播放| 日韩色情电影| 刘玥一区二区三区| 香蕉视频在线看| 9999久久久久| 国产精品无码激情视频| 免费无码婬片aaaa| 国产在线毛片| 日日摸日日碰| 国产香蕉视频| 在线v片| aaa在线观看| 精品久久电影| 国产黄色精品| 欧美亚洲色色网视频| 久久日精品| 亚洲精品一区二区三区四区五区六区| 亚洲高清无码在线免费观看| 婷婷色婷婷| 久久婷视频| 亚洲国产精品成人综合色在线婷婷| 在线啊啊啊| 亚洲中文婷婷| 蜜臀色欲AV无码人妻| 亚洲国产精品成人va在线观看| 亚洲中文AV在线| 91AV免费在线观看| 色色a| 中文一区二区| 亚洲在线无码播放| 麻豆视频免费观看| 91丨国产丨精品丨丝袜| eeuss| 黄色成人网站大全| 国产成人精品无码区在线| 亚洲日韩一级片| 高清无码视频网站| 成年人视频在线观看免费| 亚洲高清无码一区二区三区| 69式荫蒂被添全过程频| 国产精品乱伦| 在线免费观看av片| 91福利网站| 成人午夜视频在线观看| 超碰AA| 日韩精品一| 在线免费观看视频黄| 日韩在线高清| 曰本中文字幕在线视频| 骚骚肥肥一区二区三区| 日日干av| 欧美一卡二卡三卡| 成人性视频Aⅴ| 久天堂| 亚洲无码999| 三级成人网站| 国产人成视频| 色激情五月天| 99视频免费观看| 国产无遮挡又黄又爽又| 亚洲婷婷五月天| 日本一级黄色电影| 国内成人精品网站| av不卡在线观看| 丰满人妻一区二区| 性爱免费视频| jizz18日本| 99在线看| 午夜无码电影| 91福利资源| 91成人视频在线免费观看| 天堂网av在线| 三级黄色免费| 一本色道久久无码人妻精品69| 俺去听听婷婷| 天天噜噜色| 熟女熟妇人妻一区二区三区| www.蜜桃视频| 精品一区二区三区蜜桃臀www| 国产精品国产三级国产| AV中文字幕网| 亚洲国产精品成人综合色五月 | 免费无码在线播放| 成人在线视频网站| 日韩无修正| 欧美日韩亚洲视频| 伊人大香蕉在线观看| 最好看2019中文在线播放电影| 97中文字幕在线| 成人性生活免费视频| 五月天堂婷婷| 加勒比日韩| 亚洲日韩久久| 毛片9| 麻豆传媒电影| 99re在线| 国产免费av网站| 黄色亚洲视频| 香蕉网站操逼片| AV无码免费| 中文字幕一区二区三区四区50岁| 男人操女人网站| 欧美日韩成人一区二区三区 | 91麻豆精品91久久久久同性| 成人毛片在线视频| 日韩人妻无码一区二区三区99 | 操操影视| 亚洲不卡在线| 欧美精品一卡| 青娱乐AV| 欧美日韩婷婷| 久久婷五月| 粉嫩小泬BBBB免费看| 欧美日韩成人一区二区三区| 少妇一级| 黄色免费AV| 久久99久久99久久99人受| 欧美美女日逼视频| 久久婷婷五月综合伊人| 青青草手机在线视频| 影音先锋91| 男女69视频| 99cao| 久久永久免费视频| 九一精品| 一区无码高清| 人善交精品一区二区三区| 超碰日| 这里只有精品久久| 黄网国产手机在线观看| AV高清无码在线| 毛片一区二区三区| 一本久久综合亚洲鲁鲁五月天 | 一本一道久久综合| 麻豆精品在线| 一级a一级a爰片免费免免在线 | 国产剧情91| 麻豆三级片| 人操人操人操| 加勒比久久综合| 欧美日韩无| 干欧美| 天天撸天天色| 久久久久久穴| 国产女人精品视频| 免费的av网站| 久久丁香五月婷婷五月天激情视频| 国产视频999| 亚洲人妻AV| 香蕉中文在线| 欧美精品一二三区| A视频免费| 青青草原成人| 99久久久久久久无码| 91丨熟女丨对白| 日本黄色视频电影| 91三级电影| 国产亲子乱婬一级A片| 国产剧情一区二区三区| 四虎在线观看| 亚洲综合视频网| 欧美级毛片一进一出| 91精品国产综合久久久久久久 | av片在线免费观看| 成人精品永久免费视频99久久精品| 丁香五月天在线视频| 操骚B| 在线小黄片| 久久99久久99久久| 国产69精品久久久久久| 越南熟女| 大地资源38页| 国产在线| 欧美成人在线视频网站| 亚州AV天堂| 欧美成人内射| 人人摸人人操人人摸| 51国产黑料吃瓜在线入口| 秋霞精品一区二区三区| 免费做a爰片77777| 一品国精和二品国精的文化意义 | 国产91嫩草乱婬A片2蜜臀 | 91亚洲国产AⅤ精品一区二区| 日韩欧美中文在线观看| www.日韩欧美| 久久久久久免费一级A片| 精品国产AⅤ麻豆| 亚洲AV无码高清| 国产成人精品电影| 久久国产精彩视频| 伊人99热| 91久久婷婷亚洲精品成人| 国产精品无码一区二区在线欢| 超碰九色| 国产激情AV| 欧美精产国品一二三区别| 天天爽夜夜爽夜夜爽精品视频| 2019国产精品| 欧美成人视频。| 60分钟上大床又黄又爽| 日韩精品一区二区三免费视频| 欧美人妻精品| 四库影库| 亚洲无码中文字幕在线播放| 日韩A片免费观看| 97人妻在线| 亚洲狠狠撸| 亚洲三级片在线观看| 日本免费爱爱| 日本成人午夜福利| 日本成人无码| 一级A片久久久免费直播间| 97成人人妻一区二区三区| 欧美中文网| 操毛| 青青免费在线视频| 色婷婷视频| 一区二区三区免费在线观看| 成人免费福利| 免费在线观看a| 青春草在线视频免费观看| 高清无码免费在线| 精品无码一区二区三区蜜桃李宗瑞| 91探花足浴店按摩店| 91小视频在线| 3DAV一区二区三区动漫| 军人妓女院BD高清片在线播放| 一级黄色电影免费在线观看| 第一页在线| 亚洲码无人客一区二区三区| 日韩乱伦毛片| 日韩在线观看一区| 免费无码国产| 免费在线观看黄| 亚洲成人视频在线免费观看| 青青草免费福利视频| 久久91欧美特黄A片| 九一久色| 欧美日韩一区二区三区| 五月丁香激情综合| 国产精品久久久久的角色| 91aaa在线观看| 婷婷五月天丁香在线| 免费黄色在线观看| 蜜桃久久久亚洲精品| 怡红院在线观看| 色婷婷18| 一级电影视频去去去| 色天使色天堂| 精品无码电影| 特写毛茸茸BBwBBwBBw| 91成人片| 久久久久久穴| 亚洲色图15| 日韩无码免费视频| 在线日韩av| 热久久久久久| 国产一区二区精品| 国产精品一级a毛一级a| 国产伦精品一区二区三区色大师 | 欧美A级视频在线观看| 亚洲中文婷婷| 亚洲香蕉视频网站| 亚洲中文字幕AV| 国产视频黄| 偷拍92| 精品人妻二区中文字幕| 久久免费视频网站| 91视频观看| 久久久久久久97| 成人国产精品秘欧美高清| 91狠狠综合久久久久久| 国产精品色在线| 久久香蕉综合在线| 国产亲子乱XXXXinin| 国产最新AV| 思思热在线| 9797色色| 国产夫妻自拍av| 中文字幕+乱码+中文乱码91| 天天看片天天爽| 久久99精品久久久久| 成人做爰A片AAA毛真人| 亚洲国产无码在线观看| 日韩中文久久| 麻豆mdapp01.tⅴ| 激情久久av| 男女性爱视频免费| 久久精品成人电影| 久久肉| 丝袜东京热AV高清| 成人精品久久久| 农村三级片| 西西www444无码免费视频 | 三洞齐开Av在线免费观看| A片免费在线| 中文字幕中文字幕无码| 亚洲高清在线| 影音先锋国产精品| 婷婷三级| 天天躁狠狠躁夜躁2024| 日批网站在线观看| 男女拍拍网站| 日韩aaa视频| 欧美人与禽乱婬A片| 特黄AAAAAAAAA真人毛片| 国产女主播在线播放| 都市激情亚洲| 久久大屌| 蜜臀久久99精品久久久久久宅男| 91人妻无码| 东北女人操逼视频| 日韩日韩日韩日韩日韩| 短发半推半就AV| 激情综合婷婷| 日日躁夜夜躁| 久久久久亚洲AV成人片乱码| 黃色A片一级一级一级久别的草原| 久久九一| 2016av天堂网| 五月丁香成人网| 国产乱仑视频| 国产aaaaaaaaaaaaa| 嫩草人人精品免费| 久久久久婷婷| 国产av播放| 色综合网址| 亚洲一区在线视频| 伊人影院在线观看| 影音先锋三级资源| 中文字幕乱码免费综合久久| 极品无码| 男人的天堂手机在线| 在线观看免费人成视频| 日韩成人无码一区二区视频| 中文字幕人成人乱码亚洲电影| 一本色道综合久久欧美日韩精品 | 国产激情视频在线播放| 成人免费A片在线观看直播96| 91久久久裸身美女| 欧美手机在线视频| 久久在线免费视频| 99热激情在线| 亚欧成人在线视频| 一级免费黄色电影| 亚洲1区2区| 成人免费黄色网| 国产高清无码免费视频| 天天操天天干天天日| 粉嫩av懂色av蜜臀av分享| 国产人体视频| 日韩欧美性爱网站| 甘肃WBBBB搡wBBBB| 大香蕉网伊人| 国产18毛片18水多精品| 成人福利视频在线| 成人av网站在线播放| 欧美黄色性爱视频| 男人天堂手机在线| 91免费网站在线观看| 亚洲女人天堂AV| 欧美综合网| 日韩黄视频| 思思在线视频| 国产aaaaaaaaaa| 黄色a片网站| 国产黄色电影在线观看| 俺来俺去| 久久久久无码精品国产91福利| 亚洲偷拍视频| 国产人妻精品一区二区三区不卡| 亚洲精品一区二区三区在线观看| 夜夜嗨av| 天天视频国产| 鲁一鲁在线视频| 国精产品一区二区三区在线观看| 久久一区| 亚洲的天堂的αⅴ| 97精品人人妻人人| 亚洲无码一卡二卡| 熟女人妻在线视频| 国外亚洲成AV人片在线观看| 亚洲欧美性爱| 国产精品国产| 网站毛片| 欧美色图另类图片| 日本在线不卡视频| 成人a一级片| 四川BBBB擦BBBB| 免费a视频在线观看| 色视频在线观看免费| 欧洲性爱视频在线观看| 欧洲精品在线视频| 国产欧美一区二区人妻喷水| 99精品免费视频| 国产精品人妻AⅤ在线看| 天天爽天天爽成人A片影院| 国产精品v欧美精品v日韩| 中文字幕无码乱伦| 亚洲精品天堂无码AV片| 中文字幕乱妇无码Av在线| 大香蕉伊人在线观看视频| 亚洲女人在线| 亚洲乱码一区二区三区| 天天艹天天| 特级西西444WWW高清大视频| 在线免费观看黄色电影| 婷婷爱五月| 国产亚洲色婷婷久久99精品| 国产一级片无码| 免费看V片| 中文字幕日韩无码电影| 操逼视频网| 国产人成一区二区三区影院| 台湾成人综合网| 91在线无码精品秘入口男同| 色婷婷18正码国产| 青青青国产在线| 国产成人三级在线| 色妞视频精品一区| 九九热九九| 91探花视频精选在线播放| 大香蕉久久久久| 国产一级AV片| 欧美亚洲日韩一区二区| 人人干人人操人人| 午夜成人无码视频| 韩日高清无码| 欧美午夜精品一区二区蜜桃| 在线无码播放| 免费A片在线观看| av中文字幕网| 久久国产黄色视频| 久久婷婷色| 成人免费在线网站| 久久亚洲精品视频| 日韩一区二区在线看在线看| 丁香激情视频| 欧美国产成人在线| 色噜噜狠狠一区二区三区Av蜜芽| 高清国产AV| 亚洲欧美成人网| 五月天伊人| 日一日干一干| 成人欧美在线观看| 操逼二区| 羽月希奶水饱胀在线播放| 欧美被操| 亚洲婷婷精品国产成人| 日逼无码视频| 99热思思| 成人黄色大香蕉| 亚洲第一区欧美日韩| 99热这里| 大香蕉精品在线| 成人午夜免费视频| 在线无码AV| 午夜三级福利| 玖玖爱国产| 亚洲视频久久| 亚洲精品熟女| 日韩精品综合| 欧美在线v| 日韩成人网站在线观看| 九九综合网| 韩国一区二区三区| 国产天堂av| 欧美日韩一区二区三区四区五区六区| 韩无码| 亚洲aV影院| 久久免费操| 色婷婷一区二区三区四区五区精品视| 人人摸人人看| 日韩群交| 亚洲综合伊人| 亚洲91视频| 成人免费黄片| 无码一二区| 黑人一级片| 日日夜夜干| 午夜精品秘一区二区三区| 日屄视频在线观看| 免费视频a| 日韩黄色三级片| 插菊花综合网2| 日韩高清无码中文字幕| 波多野结衣99| 翔田千里无码AV在线观看| 国产成人免费观看视频| 日韩最新高清无码| 国模无码在线| 黄色网页免费观看| igao在线观看| 北条麻妃A片在线播放| 欧美成人免费精品| 国产看色免费| av啊啊| 麻豆天美蜜桃91| 国产精品无| 在线观看不卡av| 超碰人人搞| 五月天操逼网站| 亚洲欧洲日本在线| 九色91PORNY国产| 逼逼视频| 九色蝌蚪视频| 摸BBB搡BBB搡BBBB| 特黄AAAAAAAAA真人毛片| 大香蕉老师| 成人免费视频国产在线观看| 免费无码婬片AAAA片老婦| 江苏妇搡BBB搡BBBB| 青娱乐亚洲精品| 久久五月丁香| A片免费在线| 日韩av毛片| 最新中文字幕在线视频| 国产性爱在线观看| 成人一区二区三区四区| 欧美亚洲一区| 中文字幕一区二区三区四区| 日韩一区二区在线观看| av资源在线| 国精产品一区一区三区四区| 天天干强奸视频在线综合| 伊人久综合| 日韩啪啪片| 精品国产999久久久免费| av无码av天天av天天爽| 真人一级毛毛片| 午夜三区| 男女操逼视频网站| 在线观看的av网站| 日韩免费看| 亚洲无码影片| 国产无码成人免费| 狠狠操综合网| 亚洲AV无码国产精品| 亚洲无码影院| 加勒比在线视频| 国产久久精品视频| 久操电影网| 人人舔人人草| 国产主播第一页| 在线观看视频免费无码免费视频 | 日本黄色一级视频| 黄网站免费看| 久久三级视频| 天天玩夜夜玩天天玩国产99| 91麻豆国产福利精品| 久热中文在线观看精品视频| av東熱激情东京热| 中文字字幕在线| 性生活无码| 97黄片| 男女无码视频| 在线观看高清无码视频| 亚洲色图在线观看| 欧美AAAAAA视频| 激情乱伦网站| 一级真人毛片| 人人操人人摸人人爽| 久久婷婷色| 99在线精品视频免费观看20| 小處女末发育嫩苞AV| 欧美操逼逼| 欧美国产日韩综合在线观看170| 激情aaa| 中文字幕av网站| 一级a免一级a做免费线看内裤| 国产亲子乱XXXXimim/| 激情操逼网| 中国九九盗摄偷拍偷看| 内射少妇18| 漂亮人妻吃鸡啪啪哥哥真的好| 蜜桃久久久亚洲精| 中文字幕精品三区无码| 中文字幕av久久爽爽| 国产黄色免费电影| 亚洲国产精品成人久久蜜臀| 华女与黑人91A∨| 看毛片网站| 91人妻人人澡人人爽人人精吕| 福利视频导航自拍| 91久久无码一区人妻A片蜜桃| 人人摸人人操人人干| 91在线无码精品秘入口三人| 国产免费AV在线| 超碰青娱乐| 97热| 欧一美一婬一伦一区?| 91人人妻人人操| 青青草中文字幕| 欧美福利| 91婷婷| 俺也去俺去啦| 青春草在线视频免费观看| 亚洲午夜精品成人毛片| 五月丁香性爱| 丁香五月激情视频| 成人网站在线| www.伊人网| 欧美少妇做爱| 91丨九色丨熟女新版| 99超碰在线观看| 亚洲无码视频观看| 国产操穴| 黄片在线网站| 精品久久一区二区三区四区| 国产精品夜夜爽7777777| 色老板在线免费观看| 夜夜骑免费视频| 97人妻无码一区二区| 国产成人精品无码| 亚洲大片免费看| A级片在线观看| 青青草国产| 米奇电影777无码| 亚洲AV女人18毛片水真多| h片网站在线观看| 蜜桃视频一区二区| 中文字幕视频| 亚洲精品一区中文字幕乱码| 亚洲最新AV网站| 黄A网站| 97精品在线| 日韩AAA| 欧美A片在线免费观看| 在线亚洲一区| 最新三级网站| 亚洲中文字| 国产AV日韩AⅤ亚洲AV中文 | 美国高清无码| 精品久久大香蕉| 欧美日一区二区三区| 亚洲欧美国产精品专区久久| 亚洲AV无码乱码AV| 精品国产乱码| 天天爽天天日| 蜜桃传媒一区| 撸撸操在线视频观看只有精品| 特黄色A级片视频| 精品人妻二区三区蜜桃| 91在线小视频| 韩国午夜激情| 丁香婷婷在线| 亚洲人操逼视频| 免费亲子乱婬一级A片| 97人妻精品黄网站| 欧美一级特黄真人做受| 伊人性爱网| 午夜在线视频| 翔田千里无码流出两部| 国产综合久久久777777色胡同| 九九国产| 五月丁香综合网| 韩日高清无码| 久草电影在线观看| 亚洲精品成a人在线观看| 五月婷婷丁香| 在线成人毛片| 97无码精品人妻一区二区三区 | 欧美伊人网在线观看| 成年人黄色视频| 刘玥无码| www.av在线| 免费无遮挡视频网站视频| 怡红院成人av| 足浴店少妇69XXX| 欧美AAAAAA视频| 国产成人精品无码片子的价格| 99这里有精品| 亚洲成人黄色| jizz在线观看免费视频| 乌克兰性爱视频| 国产人妖在线观看| 国产91在线中日| 国产精品国产精品国产专区不52| 精品在线一区| 婷婷久久综合| 国产一区二区不卡视频| 日本老熟妇| 日韩精品免费| 国产黄色a片| 人人爽人人操人人| 91精品丝袜久久久久久久久久粉嫩| 翔田千里无码流出两部| 自拍偷拍亚洲无码| 久草视频观看| 殴美色色网| 中文字幕一级A片高清免| 亚洲午夜福利在线| A片免费在线观看| 欧美深夜福利视频| 日本内射在线观看| 国产熟妇码视频黑料| 男人天堂网av| 国产原创精品| 大香蕉AV在线| 9I成人免费版视频| 99视频久久| 一欧美日韩免费/看| 亚洲AV女人18毛片水真多| 色婷婷在线观看视频| 亚洲一级二级| 无码AV电影在线观看| 亚洲无码成人视频| 黄片网址| 激情无码在线观看| 一级无码高清| 午夜国产精品AV| 国产视频999| 97人妻人人澡人人爽人人精品| 内射学生妹视频| 欧美一级爱| 国产性爱AV| 成人免费高清| 三级av无码| 国产日逼视频| 亚洲婷婷综合网| 蜜桃av在线播放| 国产精品成人国产乱| 亚洲AV黄片| 欧美成人高清| 九九成人免费视频| 久久精品亚洲无码| A一级横色大片|