精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

用PaddlePaddle 實現目標檢測任務——Paddle Fluid v1.1深度測評

原創
新聞 人工智能 開發工具
為了一探Paddle Fluid 1.1版本究竟做了哪些方面的更新,筆者第一時間安裝了新發布的版本,用一個基于SSD的目標檢測任務來測試一下新版PaddlePaddle的表現。

【51CTO.com原創稿件】 

1.前言

11月1日,百度發布了Paddle Fluid的1.1版本,作為國內***深度學習框架,PaddlePaddle對中文社區非常友好,有完善的中文社區、項目為導向的中文教程,可以讓更多中文使用者更方便地進行深度學習、機器學習相關的研究和實踐。我本人也非常希望PaddlePaddle能夠不斷發展壯大,畢竟這是國內公司為開源社區做出的一項非常有意義的貢獻。為了一探Paddle Fluid 1.1版本究竟做了哪些方面的更新,筆者***時間安裝了新發布的版本,用一個基于SSD的目標檢測任務來測試一下新版PaddlePaddle的表現。

2.什么是目標檢測

圖像識別對于做視覺的同學來說應該是一個非常熟悉的任務了,最初深度學習就是是應用于圖像識別任務的,舉例來說,給計算機一張汽車圖片,讓它判斷這圖片里有沒有汽車。

[[252202]]

對于背景干凈的圖片來說,這樣做很有意義也比較容易。但是如果是一張包含豐富元素的圖片,不僅識別難度大大提高,僅僅判斷出里面有沒有圖片的意義也不大了,我們需要找到到底在讀片的什么位置出現了一輛汽車,這就提出了一個新的任務和需求——目標檢測。

[[252203]]

我們的任務就是給定一張圖像或是一個視頻幀,讓計算機找出其中所有目標的位置,并給出每個目標的具體類別。對于人類來說,目標檢測是一個非常簡單的任務。然而,計算機能夠“看到”的是圖像被編碼之后的數字,很難解圖像或是視頻幀中出現了人或是物體這樣的高層語義概念,也就更加難以定位目標出現在圖像中哪個區域。

與此同時,由于目標會出現在圖像或是視頻幀中的任何位置,目標的形態千變萬化,圖像或是視頻幀的背景千差萬別,諸多因素都使得目標檢測對計算機來說是一個具有挑戰性的問題。目前主流的方法是FasterRCNN、YOLO和SSD,本文使用SSD進行實驗。

3.PaddlePaddle簡介

***次聽到PaddlePaddle是在CCF前線研討會上,當時幾個人聊起來關于機器學習算法平臺的事情,有一位小伙伴提起了這個名字,所以一段時間以來我一直認為這是一個機器學習算法平臺。直到16年百度開源了PaddlePaddle我才知道,原來這是一個可以跟TensorFlow媲美的深度學習框架,主打“易用、高效、靈活、可擴展”。所以,簡單來說,PaddlePaddle就是百度自研的一套深度學習框架(看過發布會后了解到,百度為此建立了一套覆蓋面非常廣的生態,包括金融、推薦、決策等,但筆者主要是對PaddlePaddle的核心框架進行測評,不在此浪費過多筆墨了)。

3.1如何安裝

筆者的工作站是Ubuntu 16.04系統,PaddlePaddle在CentOS和Ubuntu都支持pip安裝和docker安裝,GPU版本在Linux下也可以***適配。下面來看一下具體的安裝步驟。

首先我們使用cat /proc/cpuinfo | grep avx2來查看我們的Ubuntu系統是否支持avx2指令集,如果發現系統返回了如下一系列信息,就說明系統是支持avx2指令集的,可以放心進行后續安裝。如果不支持也沒關系,在官網上可以直接下載no_avx的whl包進行安裝。

接下來使用pip安裝***的Fluid v1.1版本的PaddlePaddle(GPU),在安裝前注意,需要在機器上安裝python3.5-dev才可以用pip安裝PaddlePaddle。下載速度會比較慢,需要20分鐘左右的下載時間。

安裝完成后,在python里import paddle測試一下,如果成功導入則說明安裝成功!

在更新的Paddle Fluid v1.1版本中還特意優化了對MacOS的支持,可以直接通過pip安裝,也可以用源碼編譯安裝。具體細節可參考:http://www.paddlepaddle.org/documentation/docs/zh/1.1/beginners_guide/install/Start.html

3.2PaddlePaddle的計算描述方式

框架的計算描述方式是深度學習項目開發者非常關注的一個問題。計算的描述方式經歷了從Caffe1.0時代的一組連續執行的layers到TensorFlow的變量和操作構成的計算圖再到PaddlePaddle Fluid[1]提出不再有模型的概念一系列的演變。那么PaddlePaddle現在是怎么描述計算的呢?

PaddlePaddle使用Program來描述模型和優化過程,可以把它簡單理解為數據流的控制過程。Program由Block、Operator和Variable構成,variable和operator被組織成為多個可以嵌套的block。具體的,如果要實現一個神經網絡,我們只需要通過添加必要的variable、operator來定義網絡的前向計算,而反向計算、內存管理、block創建都由框架來完成。下面展示一下如何在PaddlePaddle中定義program:

以一個簡單的線性回歸為例,我們這樣定義前向計算邏輯:

#定義輸入數據類型

x = fluid.layers.data(name="x",shape=[1],dtype='float32')

#搭建全連接網絡

y_predict = fluid.layers.fc(input=x,size=1,act=None)

定義好計算邏輯后,與TensorFlow一樣,下一步就需要定義損失函數,feed數據,開始訓練,feed數據也是在執行運算的時候進行,我們先定義一下數據,這里train_data 就是我們的輸入數據,y_true是label:

train_data=numpy.array([[1.0],[2.0],[3.0],[4.0]]).astype('float32')

y_true = numpy.array([[2.0],[4.0],[6.0],[8.0]]).astype('float32')

添加均方誤差損失函數(MSE),框架會自動完成反向計算:

cost = fluid.layers.square_error_cost(input=y_predict,label=y)

avg_cost = fluid.layers.mean(cost)

執行我們定義的上述Program:

cpu = fluid.core.CPUPlace()

exe = fluid.Executor(cpu)

exe.run(fluid.default_startup_program())

#開始訓練

outs = exe.run(

feed={'x':train_data,'y':y_true},

fetch_list=[y_predict.name,avg_cost.name])

#觀察結果

print outs

輸出結果:

[array([[0.9010564],

[1.8021128],

[2.7031693],

[3.6042256]], dtype=float32), array([9.057577], dtype=float32)]

這樣就用PaddlePaddle實現了簡單的計算流程,個人感覺使用起來跟TensorFlow的相似度較高,習慣在TensorFlow上跑模型的小伙伴應該很容易適應PaddlePaddle的這一套生態。

關于PaddlePaddle計算描述的詳情可以參考Fluid編程指南:http://www.paddlepaddle.org/documentation/docs/zh/1.1/beginners_guide/programming_guide/programming_guide.html

3.3PaddlePaddle的模型庫簡介

PaddlePaddle的核心框架內置了非常多的經典模型和網絡,涵蓋了幾乎所有主流的機器學習/深度學習任務,包括圖像、語音、自然語言處理、推薦等諸多方面。因為本文是做目標檢測,所以主要調研了一下圖像方面的模型庫,在此大致介紹一下。

3.3.1分類

分類任務中的模型庫是最全面的,AlexNet、VGG、GoogleNet、ResNet、Inception、MobileNet、Dual Path Network以及SE-ResNeXt,2012年以來的經典圖像識別網絡都包含其中,每個網絡模型是一個獨立的py文件,里面是這個網絡模型的類,類里面公用的方法是net(),在調用時初始化對應的類之后調用.net()方法,就可以得到對應網絡的Program描述,之后只需要給網絡feed數據、定義損失函數、優化方法等就可以輕松使用了。分類模型作為圖像任務的基礎任務,在目標檢測、語義分割等任務中都會重復利用這些模型,所以這樣一個模型庫可以為大大簡化后續任務的開發工作。這部分的模型庫里的寫法比較統一,只要了解網絡結構,用.net()方法調用就可以,這里就不一一介紹了,具體可以參考:https://github.com/PaddlePaddle/models/tree/develop/fluid/PaddleCV/image_classification/models。

3.3.2目標檢測

SSD

Single Shot MultiBox Detector (SSD) 是一種單階段的目標檢測器。與兩階段的檢測方法不同,單階段目標檢測并不進行區域推薦,而是直接從特征圖回歸出目標的邊界框和分類概率。SSD 運用了這種單階段檢測的思想,并且對其進行改進:在不同尺度的特征圖上檢測對應尺度的目標。如下圖所示,SSD 在六個尺度的特征圖上進行了不同層級的預測。每個層級由兩個3x3卷積分別對目標類別和邊界框偏移進行回歸。因此對于每個類別,SSD 的六個層級一共會產生 38x38x4 + 19x19x6 + 10x10x6 + 5x5x6 + 3x3x4 + 1x1x4 = 8732 個檢測結果。

SSD 目標檢測模型

SSD 可以方便地插入到任何一種標準卷積網絡中,比如 VGG、ResNet 或者 MobileNet,這些網絡被稱作檢測器的基網絡。PaddlePaddle里的SSD使用Google的MobileNet作為基網絡。

目標檢測模型庫不同于分類模型庫,PaddlePaddle是以一個工程的形式提供SSD的模型庫。工程里面包含如下文件:

其中,train.py、reader.py、mobilenet_ssd.py是與網絡訓練相關的文件,包括數據讀取、網絡結構、訓練參數等過程的定義都在這3個文件中;eval.py、eval_coco_map.py是網絡預測評估相關文件;infer.py是可視化預測結果相關文件。Data文件夾用于存儲數據集,使用時可以把訓練集、測試集、驗證集放在data目錄下,reader會在data目錄下尋找圖片數據加載;pretrained目錄存放預訓練模型,如果不想從頭訓練一個SSD,可以把預訓練好的模型放在這個目錄下,方便進行遷移學習。

4.PaddlePaddle實現SSD的目標檢測

有了上述的一些基礎,我們就可以輕松使用PaddlePaddle上手一些項目了?,F在我們就來實現一個基于SSD的目標檢測任務。

4.1服務器配置

系統:Ubuntu 16.04

GPU:NVIDIA GTX 1080*4 顯存:8GB

環境:python 3.5

4.2框架配置

Paddle Fluid v1.1 GPU版本

4.3數據準備

我們使用微軟的COCO2017數據集來預訓練模型(PaddlePaddle提供了一個基于COCO的預訓練模型,可以直接使用),COCO數據集是微軟團隊獲取的一個可以用來圖像recognition+segmentation+captioning 數據集,其官方說明網址:http://mscoco.org/。微軟在ECCV Workshops里發表文章《Microsoft COCO: Common Objects in Context》更充分地介紹了該數據集。COCO以場景理解為目標,從復雜場景中截取了328,000張影像,包括了91類目標和2,500,000個label。整個COCO2017數據集20G,官網下載非常慢,可以在國內找一些鏡像站下載,數據集里分好了訓練集、測試集和驗證集,標注和file_list用json文件保存。

拿到預訓練數據集后,我們在Pascal VOC數據集上對模型進行進一步訓練,做一下微調。Pascal VOC數據集相較COCO數據集來說圖片數量和種類小很多,共計20類,11540張訓練圖片,標注采用xml格式文件保存。

4.4數據讀取

圖片格式為jpg,需要對圖像進行轉碼讀取,SSD中的reader.py文件幫助我們實現了這個功能,內置的數據讀取使用了一個生成器來逐個batch讀取圖片并轉碼,這樣內存占用率非常低。由于我們機器內存不大,設置的batch為32,在此情況下load十萬張圖片的annotation只需要17秒左右,每一個batch的load+train時間只需要0.3秒左右。

可以看一下這個reader的核心代碼:

def reader():

if mode == 'train' and shuffle:

np.random.shuffle(images)

batch_out = []

for image in images:

image_name = image['file_name']

image_path = os.path.join(settings.data_dir, image_name)

im = Image.open(image_path)

if im.mode == 'L':

im = im.convert('RGB')

im_width, im_height = im.size

im_id = image['id']

# layout: category_id | xmin | ymin | xmax | ymax | iscrowd

bbox_labels = []

annIds = coco.getAnnIds(imgIds=image['id'])

anns = coco.loadAnns(annIds)

for ann in anns:

bbox_sample = []

# start from 1, leave 0 to background

bbox_sample.append(float(ann['category_id']))

bbox = ann['bbox']

xmin, ymin, w, h = bbox

xmax = xmin + w

ymax = ymin + h

bbox_sample.append(float(xmin) / im_width)

bbox_sample.append(float(ymin) / im_height)

bbox_sample.append(float(xmax) / im_width)

bbox_sample.append(float(ymax) / im_height)

bbox_sample.append(float(ann['iscrowd']))

bbox_labels.append(bbox_sample)

im, sample_labels = preprocess(im, bbox_labels, mode, settings)

sample_labels = np.array(sample_labels)

if len(sample_labels) == 0: continue

im = im.astype('float32')

boxes = sample_labels[:, 1:5]

lbls = sample_labels[:, 0].astype('int32')

iscrowd = sample_labels[:, -1].astype('int32')

if 'cocoMAP' in settings.ap_version:

batch_out.append((im, boxes, lbls, iscrowd,

[im_id, im_width, im_height]))

else:

batch_out.append((im, boxes, lbls, iscrowd))

if len(batch_out) == batch_size:

yield batch_out

batch_out = []

可以看到,這里的reader是一個生成器,逐個batch把數據load進內存。在數據讀取過程中,需要注意一下幾點:

1. 數據集需要放在項目的data目錄下,reader通過annotations下的instances_train2017.json文件區分訓練集和驗證集,不需要在data目錄下用文件夾區分訓練集和驗證集。

2. 如果數據沒有按要求保存,則需要在reader.py修改數據路徑:

class Settings(object):

def __init__(self,

dataset=None,

data_dir=None,

label_file=None,

resize_h=300,

resize_w=300,

mean_value=[127.5, 127.5, 127.5],

apply_distort=True,

apply_expand=True,

ap_version='11point'):

self._dataset = dataset

self._ap_version = ap_version

# 把data_dir替換為數據所在路徑

self._data_dir = data_dir

if 'pascalvoc' in dataset:

self._label_list = []

label_fpath = os.path.join(data_dir, label_file)

for line in open(label_fpath):

self._label_list.append(line.strip())

1. 如果遇到NoneType is not iterable的錯誤,一般是由于數據讀取錯誤導致的,仔細檢查文件路徑應該可以解決。

2. 讀取PascalVOC數據集用reader.py文件中的pascalvoc()函數,兩個數據集的文件結構和標注不太一樣,Paddle為我們寫好了兩個版本數據集的讀取方法,可以直接調用。

4.5模型訓練

數據讀取完成后,就可以著手開始模型的訓練了,這里直接使用PaddlePaddle SSD model里面的train.py進行訓練:

python -u train.py

train.py里為所有的超參數都設置了缺省值,不熟悉PaddlePaddle參數調整的工程師可以直接用缺省參數進行訓練,非常方便。如果需要,可以根據下表進行對應超參數的修改:

參數名

類型

意義

learning_rate

Float

學習率

batch_size

Int

Batch大小

epoc_num

Int

迭代次數

use_gpu

Bool

是否使用GPU訓練

parallel

Bool

是否使用多卡訓練

dataset

Str

數據集名稱

model_save_dir

Str

模型保存路徑

pretrained_model

Str

預訓練模型路徑(如果使用)

image_shape

Str

輸入圖片尺寸

data_dir

Str

數據集路徑

在執行腳本時,傳入相應的參數值即可,例如:

python -u train.py --batch_size=16 --epoc_num=1 --dataset='pascalvoc' --pretrained_model='pretrain/ssd_mobilenet_v1_coco/'

4.5.1單機多卡配置

單機多卡的配置相較于多機多卡配置較為簡單,參數需要先在GPU0上初始化,再經由fluid.ParallelExecutor() 分發到多張顯卡上。這里可以使用fluid.core.get_cuda_device_count()得到可用顯卡數量,也可以自己定義用幾張顯卡。

train_exe = fluid.ParallelExecutor(use_cuda=True, loss_name=loss.name,

main_program=fluid.default_main_program())

train_exe.run(fetch_list=[loss.name], feed={...})

4.5.2參數調整

PaddlePaddle這一套SSD模型給了使用者非常大的自由度,可以對網絡結構、損失函數、優化方法等多個角度對模型進行調整。本文采用的是基于MobileNet的SSD,如果想使用基于VGG的SSD,可以自己修改工程中的mobilenet_ssd.py文件,把里面定義的MobileNet Program更改為VGG的Program描述就可以了;如果需要修改損失函數或優化方法,則在train.py中找到build_program()函數,在

with fluid.unique_name.guard("train"):

loss = fluid.layers.ssd_loss(locs, confs, gt_box, gt_label, box,

box_var)

loss = fluid.layers.reduce_sum(loss)

optimizer = optimizer_setting(train_params)

optimizer.minimize(loss)

里修改損失函數或優化器即可;修改batch_num、epoch_num、learning rate等參數可以直接在train.py傳入參數中進行。

4.5.3模型保存

模型在COCO數據集上訓練完后,可以用fluid.io.save_persistables()方法將模型保存下來,我們實現了如下save_model()函數來將模型保存到指定路徑。

def save_model(postfix, main_prog, model_path):

model_path = os.path.join(model_save_dir, postfix)

if os.path.isdir(model_path):

shutil.rmtree(model_path)

print('save models to %s' % (model_path))

fluid.io.save_persistables(exe, model_path, main_program=main_prog)

4.5.4繼續訓練

訓練過程有時候會被打斷,只要每個過幾個batch保存一下模型,我們就可以通過load_vars()方法來恢復已經保存的模型來繼續訓練或者用于預測。文中提到的這些API,大家可以去PaddlePaddle的官網教程上進行更系統的學習和查看,PaddlePaddle提供了大量的中文文檔和使用教程,對中文使用者可以說是非常友好的了。

fluid.io.load_vars(exe, pretrained_model, main_program=train_prog, predicate=if_exist)

4.5.5性能參數

訓練速度:在COCO2017數據集上單卡訓練,迭代1個epoch耗時3 min33s;單機4卡訓練,迭代1個epoch耗時1min02s。

CPU/GPU占用率:正常訓練情況下CPU占用率在40%-60%之間,GPU占用率穩定在50%左右。

CPU/GPU使用情況

4.6模型評估

在PaddlePaddle的SSD模型中,可以使用eval.py腳本進行模型評估,可以選擇11point、integral等方法來計算模型在驗證集上的mAP。

python eval.py --dataset='pascalvoc' --model_dir='train_pascal_model/best_model' --data_dir='data/pascalvoc' --test_list='test.txt' --ap_version='11point' --nms_threshold=0.45

其中,model_dir是我們訓練好的模型的保存目錄,data_dir是數據集目錄,test_list是作為驗證集的文件列表(txt文件),前提是這些文件必須要有對應的標簽文件,ap_version是計算mAP的方法,nms_threshold是分類閾值。***我們得到PaddlePaddle SSD模型在Pascal VOC數據集上的mAP為73.32%[2]

模型

預訓練模型

訓練數據

測試數據

mAP

MobileNet-v1-SSD 300x300

COCO MobileNet SSD

VOC07+12 trainval

VOC07 test

73.32%

4.7模型預測及可視化

4.7.1模型預測

模型訓練完成后,用test_program = fluid.default_main_program().clone(for_test=True)將Program轉換到test模式,然后把要預測的數據feed進Executor執行Program就可以計算得到圖像的分類標簽、目標框的得分、xmin、ymin、xmax、ymax。具體過程如下:

test_program = fluid.default_main_program().clone(for_test=True)

image = fluid.layers.data(name='image', shape=image_shape, dtype='float32')

locs, confs, box, box_var = mobile_net(num_classes, image, image_shape)

nmsed_out = fluid.layers.detection_output(

locs, confs, box, box_var, nms_threshold=args.nms_threshold)

place = fluid.CUDAPlace(0) if args.use_gpu else fluid.CPUPlace()

exe = fluid.Executor(place)

nmsed_out_v, = exe.run(test_program,

feed=feeder.feed([[data]]),

fetch_list=[nmsed_out],

return_numpy=False)

nmsed_out_v = np.array(nmsed_out_v)

4.7.2預測結果可視化

對于目標檢測任務,我們通常需要對預測結果進行可視化進而獲得對結果的感性認識。我們可以編寫一個程序,讓它在原圖像上畫出預測框,核心代碼如下:

def draw_bounding_box_on_image(image_path, nms_out, confs_threshold,

label_list):

image = Image.open(image_path)

draw = ImageDraw.Draw(image)

im_width, im_height = image.size

for dt in nms_out:

if dt[1] < confs_threshold:

continue

category_id = dt[0]

bbox = dt[2:]

xmin, ymin, xmax, ymax = clip_bbox(dt[2:])

(left, right, top, bottom) = (xmin * im_width, xmax * im_width,

ymin * im_height, ymax * im_height)

draw.line(

[(left, top), (left, bottom), (right, bottom), (right, top),

(left, top)],

width=4,

fill='red')

if image.mode == 'RGB':

draw.text((left, top), label_list[int(category_id)], (255, 255, 0))

image_name = image_path.split('/')[-1]

print("image with bbox drawed saved as {}".format(image_name))

image.save(image_name)

這樣,我們可以很直觀的看到預測結果:

令人欣喜的是,PaddlePaddle的SSD模型中幫我們實現了完整的一套預測流程,我們可以直接運行SSD model下的infer.py腳本使用訓練好的模型對圖片進行預測:

python infer.py --dataset='coco' --nms_threshold=0.45 --model_dir='pretrained/ssd_mobilenet_v1_coco' --image_path='./data/ pascalvoc/VOCdevkit/VOC2012/JPEGImages/2007_002216.jpg'

4.8模型部署

PaddlePaddle的模型部署需要先安裝編譯C++預測庫,可以在http://www.paddlepaddle.org/documentation/docs/zh/1.1/user_guides/howto/inference/build_and_install_lib_cn.html下載安裝。預測庫中提供了Paddle的預測API,預測部署過程大致分為三個步驟:1.創建PaddlePredictor;2.創建PaddleTensor傳入PaddlePredictor中;3.獲取輸出 PaddleTensor,輸出結果。這部分操作也并不復雜,而且Paddle的教程中也提供了一份部署詳細代碼參考,大家可以很快地利用這個模板完成模型部署(https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/fluid/inference/api/demo_ci)

5.使用感受

  • 中文社區支持好

在搭建SSD過程中,遇到了一些問題,例如segmentation fault、NoneType等,筆者直接在paddle的GitHub上提了相關issue,很快就得到了contributor的回復,問題很快得到了解決。

  • 教程完善

PaddlePaddle的官網上提供了非常詳盡的中英文教程,相較于之前學TensorFlow的時候經常看文檔看半天才能理解其中的意思,PaddlePaddle對于中文使用者真是一大福音。

  • 相比較TensorFlow,整體架構簡明清晰,沒有太多難以理解的概念。
  • 模型庫豐富

內置了CV、NLP、Recommendation等多種任務常用經典的模型,可以快速開發迭代AI產品。

  • 性能優越,生態完整

從這次實驗的結果來看,PaddlePaddle在性能上與TensorFlow等主流框架的性能差別不大,訓練速度、CPU/GPU占用率等方面均表現優異,而且PaddlePaddle已經布局了一套完整的生態,前景非常好。

6.總結

整體來說,PaddlePaddle是一個不錯的框架。由于設計簡潔加之文檔、社區做的很好,非常容易上手,在使用過程中也沒有非常難理解的概念,用fluid Program定義網絡結構很方便,對于之前使用過TensorFlow的工程師來說可以比較快速的遷移到PaddlePaddle上。這次實驗過程中,還是發現了一些PaddlePaddle的問題,訓練過程如果意外終止,Paddle的訓練任務并沒有被完全kill掉,依然會占用CPU和GPU大量資源,內存和顯存的管理還需要進一步的提高。不過,實驗也證實了,正常情況下PaddlePaddle在SSD模型上的精度、速度等性能與TensorFlow差不多,在數據讀取操作上比TensorFlow要更加簡潔明了。

  1. PaddlePaddle Fluid是2016年百度對原有PaddlePaddle的重構版本,如無特殊說明,本文中所述PaddlePaddle均指PaddlePaddle Fluid。

  2. 此處引用了官方的評估結果,數據來源:https://github.com/PaddlePaddle/models/blob/develop/fluid/PaddleCV/object_detection/README_cn.md#%E6%A8%A1%E5%9E%8B%E8%AF%84%E4%BC%B0 

 

【51CTO原創稿件,合作站點轉載請注明原文作者和出處為51CTO.com】

責任編輯:張燕妮 來源: 51CTO
相關推薦

2020-07-25 19:40:33

Java開發代碼

2014-09-19 15:37:11

WVS掃描工具安全掃描

2018-03-27 23:25:40

Paddle

2024-05-17 09:44:49

Kubernetes均衡器Envoy

2012-02-24 11:11:43

Platform

2018-04-18 09:39:07

深度學習

2017-09-22 11:45:10

深度學習OpenCVPython

2018-04-16 11:30:32

深度學習

2018-04-11 09:30:41

深度學習

2018-04-17 09:40:22

深度學習

2021-10-08 09:46:42

深度學習神經網絡人工智能

2018-03-26 20:14:32

深度學習

2018-03-26 21:31:30

深度學習

2018-03-26 21:26:50

深度學習

2018-04-09 10:20:32

深度學習

2017-10-02 16:13:47

深度學習目標檢測計算機視覺

2020-03-09 14:08:25

Python目標檢測視覺識別

2017-09-20 16:25:00

深度學習視覺領域計算機

2023-12-19 16:01:40

深度學習人工智能目標檢測

2010-08-25 10:18:27

點贊
收藏

51CTO技術棧公眾號

免费在线你懂的| 黄色片网站免费| 青春草在线免费视频| 91丨porny丨蝌蚪视频| 国产精品久久77777| 国产麻豆视频在线观看| av综合网址| 欧美性感一类影片在线播放| 中文字幕人妻熟女人妻洋洋| 黄色软件在线| 成人自拍视频在线观看| 国产精品第二页| 国产午夜视频在线播放| 四季av一区二区凹凸精品| 精品三级在线看| 亚洲无吗一区二区三区| 1区2区在线| 中文字幕视频一区| 欧美视频小说| 韩国av电影在线观看| 久久91精品国产91久久小草| 日本不卡免费高清视频| 国产一国产二国产三| 日韩精品一区二区三区免费观影| 亚洲国产成人av在线| 五月花丁香婷婷| 小黄鸭精品aⅴ导航网站入口| 一区二区三区小说| 亚洲第一导航| 深夜福利免费在线观看| 成人高清在线视频| 91精品国产99久久久久久红楼| 中国老头性行为xxxx| 免费日韩av片| 欧美激情视频网| 国产一区二区视频在线观看免费| 第一会所亚洲原创| 亚洲欧洲在线播放| ass精品国模裸体欣赏pics| 国产精品对白久久久久粗| 91精品国产综合久久久久| 色婷婷成人在线| 欧美成人精品三级网站| 色综合天天综合给合国产| 久艹视频在线免费观看| 色帝国亚洲欧美在线| 亚洲激情在线播放| 手机看片日韩国产| 国产精品久久麻豆| 中文字幕一区日韩精品欧美| 五月天久久狠狠| 国产美女性感在线观看懂色av | 日本一区二区不卡| 精品视频在线观看免费| 亚洲午夜伦理| 久久免费精品| 亚洲黄色小说网站| 久久亚洲a v| 欧美日韩在线视频免费观看| 一区二区在线免费观看| 日韩精品福利片午夜免费观看| 欧美一级二级三级区| 国产精品久久久久一区| 综合网五月天| 亚洲www色| 亚洲高清免费视频| 极品美女扒开粉嫩小泬| 日本黄色免费在线| 一本久久综合亚洲鲁鲁五月天| 人妻精品无码一区二区三区| 亚洲日本天堂| 欧洲人成人精品| 天天操天天干天天做| 欧美区一区二区| 亚洲电影免费观看高清| 国产精品无码久久久久久| 欧美日韩伦理| 神马久久久久久| 精品肉丝脚一区二区三区| 日韩亚洲国产欧美| 国产精品欧美日韩| 精品国产伦一区二区三| 99国产欧美久久久精品| 日本视频一区二区在线观看| 免费在线观看黄| 五月婷婷久久综合| 杨幂毛片午夜性生毛片| 精品中文在线| 亚洲毛片在线免费观看| 国产又粗又长又硬| 欧美福利电影在线观看| 青青草成人在线| 国产又粗又猛又黄又爽| 成人h版在线观看| 亚洲精品乱码久久久久久蜜桃91 | 亚洲精品国产动漫| 视频直播国产精品| 国产精品16p| 蜜臀精品久久久久久蜜臀| www日韩av| 国产视频二区在线观看| 亚洲男人的天堂av| 成人观看免费完整观看| 日韩三级久久| 中文国产成人精品| 欧美福利视频一区二区| 九九**精品视频免费播放| 国产亚洲福利社区| 欧美性天天影视| 日本国产一区二区| 美国黄色一级视频| 97在线精品| 日韩美女免费视频| 黄频网站在线观看| 亚洲欧美精品午睡沙发| 能在线观看的av网站| 一区二区三区亚洲变态调教大结局 | 亚洲午夜精品在线| 超碰人人草人人| 精品久久久亚洲| 欧美综合在线观看| 少妇人妻一区二区| 亚洲欧美激情在线| 99九九99九九九99九他书对| 久久99国产成人小视频| 96精品视频在线| 亚洲欧美另类综合| 伊人色综合久久天天人手人婷| 免费黄色一级网站| 蜜臀91精品国产高清在线观看| 久久久久女教师免费一区| 一级黄色小视频| 日本一区二区三级电影在线观看| 精品国产免费av| 国产精品tv| 欧美激情在线播放| 性一交一乱一精一晶| 综合电影一区二区三区 | 日韩a∨精品日韩在线观看| 99国内精品久久久久| 日韩一级裸体免费视频| 在线播放国产一区| 中文字幕第一区| 综合网日日天干夜夜久久| 日韩在线观看a| 久久免费精品| 色综合久综合久久综合久鬼88| 99久久精品国产成人一区二区| 中文字幕亚洲成人| 奇米777在线视频| 亚洲一区二区| 成人免费91在线看| 99在线播放| 精品动漫一区二区三区在线观看| 欧美久久久久久久久久久久| 成人a区在线观看| 91国视频在线| jlzzjlzz亚洲女人| 国产一区香蕉久久| 性欧美1819sex性高清大胸| 日韩欧美一二三| 久久久久久久蜜桃| 99久久婷婷国产综合精品| 国产中文字幕免费观看| 国产亚洲第一伦理第一区| 国产精品高清免费在线观看| 日韩专区在线| 日韩欧美一区二区不卡| 久久精品这里有| 久久久国产精品午夜一区ai换脸| www.涩涩涩| 午夜亚洲福利| 蜜桃av噜噜一区二区三区| 视频二区不卡| 另类专区欧美制服同性| 亚洲精品久久久久久久久久久久久久 | h片精品在线观看| 亚洲精品在线视频| 中文字幕激情视频| 一区二区三区四区中文字幕| 无码人妻aⅴ一区二区三区| 日韩—二三区免费观看av| www.黄色网址.com| 西野翔中文久久精品国产| 国产精品丝袜视频| free性欧美| 中文字幕一精品亚洲无线一区| www.av日韩| 色视频一区二区| 丰满少妇被猛烈进入一区二区| 成人av免费在线播放| 午夜视频你懂的| 亚洲午夜伦理| 婷婷精品国产一区二区三区日韩| 亚洲码欧美码一区二区三区| 国产精品69久久| 欧美人与性动交α欧美精品图片| 亚洲人成77777在线观看网| a级片在线免费看| 色哟哟国产精品| 精品少妇久久久久久888优播| 国产免费成人在线视频| 国产日韩视频一区| 久久精品国产一区二区| 国产精品va无码一区二区| 久久久久电影| 日本一区二区三区视频在线观看| 亚洲视频国产精品| 国产精品专区h在线观看| 日本不卡1234视频| 欧美国产日韩一区| 欧美96在线| 在线观看91久久久久久| 天堂成人在线| 亚洲成人xxx| 国产精品无码天天爽视频| 91国偷自产一区二区开放时间 | av网站在线免费| 一个人看的www久久| 天天色天天操天天射| 欧美va亚洲va| 国产强被迫伦姧在线观看无码| 欧洲国内综合视频| 久草手机在线观看| 亚洲伊人伊色伊影伊综合网| 中国一级片在线观看| 国产拍揄自揄精品视频麻豆| 免费a在线观看播放| 国产91丝袜在线播放| 久久久精品高清| 久久精品国产亚洲一区二区三区| 日韩一级在线免费观看| 亚洲人成免费| 每日在线观看av| 欧美成人午夜| 日本一道在线观看| 在线成人激情| 永久免费在线看片视频| 久久中文字幕二区| 一区二区三区视频| 欧美激情欧美| 日本特级黄色大片| 国产精品久久久久久久免费观看| 亚洲高清视频在线观看| 欧美性感美女一区二区| 日韩黄色影视| 欧美综合另类| 五码日韩精品一区二区三区视频| 精品国产一区二区三区香蕉沈先生| 精品日韩欧美| 香蕉人人精品| 欧美一区二区三区在线播放| 国产一区二区三区网| 日韩资源av在线| 欧美韩国日本在线| 精品理论电影在线| 亚洲a∨一区二区三区| 日本精品三区| 一区二区三区欧美在线| 亚洲色图欧美| 欧美人成在线观看| 999亚洲国产精| 日韩精品一区中文字幕| 美女视频一区在线观看| 最新免费av网址| 国产99久久久久久免费看农村| 国产a级片视频| 9色porny自拍视频一区二区| 久久精品国产亚洲AV熟女| 国产人久久人人人人爽| 日本福利片在线观看| 亚洲五月六月丁香激情| 亚洲黄色免费观看| 欧美人妇做爰xxxⅹ性高电影| 国产免费久久久| 亚洲精品国产精品国自产在线 | 久久精品视频网站| 爱情岛亚洲播放路线| 日韩免费av一区二区| 日韩大陆av| 韩国一区二区三区美女美女秀| 一区二区三区日本久久久| 一区二区三区|亚洲午夜| 黄色亚洲大片免费在线观看| 88av.com| 国产成人综合精品三级| 蜜桃无码一区二区三区| 亚洲色图20p| 国产精品久久久久久久久久久久久久久久久| 色呦呦一区二区三区| 国产欧美一级片| 精品偷拍各种wc美女嘘嘘| 美女写真理伦片在线看| 97热精品视频官网| 日韩色性视频| 精品日本一区二区三区| 羞羞色午夜精品一区二区三区| 国产原创中文在线观看| 精品一区二区三区久久| 最新在线黄色网址| 亚洲私人黄色宅男| 波多野结衣电影在线播放| 日韩一级片网址| 国产精品一区二区婷婷| 欧美激情综合亚洲一二区 | 在线不卡欧美精品一区二区三区| 图片区 小说区 区 亚洲五月| 社区色欧美激情 | 成人爽a毛片免费啪啪| 99porn视频在线| 欧美国产一级| 免费大片在线观看| 成人激情视频网站| 97成人资源站| 欧美日韩视频专区在线播放| 色播色播色播色播色播在线| 另类少妇人与禽zozz0性伦| 成人国产精品一区二区免费麻豆 | 亚洲精品视频在线看| 成人黄色激情视频| 亚洲高清在线观看| 欧洲性视频在线播放| 91精品视频网站| 色天天综合网| 热久久精品免费视频| 91原创在线视频| 国产性xxxx高清| 精品国产亚洲在线| av片哪里在线观看| 成人精品网站在线观看| 精品久久久久中文字幕小说 | 永久免费网站视频在线观看| 蜜桃91丨九色丨蝌蚪91桃色| 69精品无码成人久久久久久| 欧美性高潮在线| 三级黄视频在线观看| 亚洲91av视频| 天天躁日日躁成人字幕aⅴ| 黄色一级视频在线播放| 成人午夜伦理影院| 精品无码一区二区三区电影桃花| 欧美一级淫片007| 成人短视频在线| 99热国产免费| 极品尤物久久久av免费看| 国产精品果冻传媒| 亚洲成人动漫一区| 无码精品一区二区三区在线 | 欧美美女福利视频| 中文字幕一区综合| 国产精品综合二区| 免费在线视频一区二区| 亚洲丁香久久久| 欧美freesex黑人又粗又大| 精品视频导航| 日韩中文字幕区一区有砖一区| b站大片免费直播| 欧美撒尿777hd撒尿| 1区2区3区在线观看| 成人精品网站在线观看| 欧美亚洲不卡| 亚洲av成人片色在线观看高潮| 狠狠操狠狠色综合网| 狠狠狠综合7777久夜色撩人| 国产精品免费网站| 亚洲一区色图| 国产chinese中国hdxxxx| 日韩欧美国产激情| shkd中文字幕久久在线观看| 成人h片在线播放免费网站| 综合一区二区三区| 中文字幕一区二区人妻电影丶| 欧美午夜电影在线| 97超碰人人在线| 动漫一区二区在线| 久久香蕉精品| 日本中文在线视频| 亚洲黄色成人网| 欧美视频精品| 国产在线精品91| 国产精品久久久久一区二区三区共| 国产黄色小视频在线观看| 欧美亚洲日本黄色| 婷婷六月综合| 妖精视频一区二区| 极品美女销魂一区二区三区| 古典武侠综合av第一页| 一精品久久久| 91黄色免费视频| 欧美人体做爰大胆视频| 超碰在线资源| 神马影院我不卡午夜| 国产成人在线看| 亚洲av无码精品一区二区| 欧美另类交人妖| 欧美呦呦网站| 黄色性生活一级片| 4hu四虎永久在线影院成人| 亚洲国产成人二区| 2022中文字幕|