<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何使用Transformer來做物體檢測?

中科院長春光機所 ? 來源:AI公園 ? 作者:Jacob Briones ? 2021-04-25 10:45 ? 次閱讀

導讀

本文為一個Facebook的目標檢測Transformer (DETR)的完整指南,詳細介紹了DETR架構的內部工作方式以及代碼。

介紹

DEtection TRansformer (DETR)是Facebook研究團隊巧妙地利用了Transformer 架構開發的一個目標檢測模型。在這篇文章中,我將通過分析DETR架構的內部工作方式來幫助提供一些關于它的含義。下面,我將解釋一些結構,但是如果你只是想了解如何使用模型,可以直接跳到代碼部分。

結構

DETR模型由一個預訓練的CNN骨干(如ResNet)組成,它產生一組低維特征集。這些特征被格式化為一個特征集合并添加位置編碼,輸入一個由Transformer組成的編碼器和解碼器中,和原始的Transformer論文中描述的Encoder-Decoder的使用方式非常的類似。解碼器的輸出然后被送入固定數量的預測頭,這些預測頭由預定義數量的前饋網絡組成。每個預測頭的輸出都包含一個類預測和一個預測框。損失是通過計算二分匹配損失來計算的。

de1e84951e16f003cad41eb9d065b884.png

該模型做出了預定義數量的預測,并且每個預測都是并行計算的。

CNN主干

假設我們的輸入圖像,有三個輸入通道。CNN backbone由一個(預訓練過的)CNN(通常是ResNet)組成,我們用它來生成_C_個具有寬度W和高度H的低維特征(在實踐中,我們設置_C_=2048, W=W?/32和H=H?/32)。這留給我們的是C個二維特征,由于我們將把這些特征傳遞給一個transformer,每個特征必須允許編碼器將每個特征處理為一個序列的方式重新格式化。這是通過將特征矩陣扁平化為H?W向量,然后將每個向量連接起來來實現的。

287bf2488bbde18c1bec3c4f78fd9329.png

扁平化的卷積特征再加上空間位置編碼,位置編碼既可以學習,也可以預定義。

The Transformer

Transformer幾乎與原始的編碼器-解碼器架構完全相同。不同之處在于,每個解碼器層并行解碼N個(預定義的數目)目標。該模型還學習了一組N個目標的查詢,這些查詢是(類似于編碼器)學習出來的位置編碼。

cfa6d245dd8b156b006edab65640f0a8.png

目標查詢

下圖描述了N=20個學習出來的目標查詢(稱為prediction slots)如何聚焦于一張圖像的不同區域。

964d2f602f92857bcc5274b7d0774bf1.png

“我們觀察到,在不同的操作模式下,每個slot 都會學習特定的區域和框大小?!?—— DETR的作者

理解目標查詢的直觀方法是想象每個目標查詢都是一個人。每個人都可以通過注意力來查看圖像的某個區域。一個目標查詢總是會問圖像中心是什么,另一個總是會問左下角是什么,以此類推。

使用PyTorch實現簡單的DETR

import torchimport torch.nn as nnfrom torchvision.models import resnet50class SimpleDETR(nn.Module):“”“Minimal Example of the Detection Transformer model with learned positional embedding”“” def __init__(self, num_classes, hidden_dim, num_heads, num_enc_layers, num_dec_layers): super(SimpleDETR, self).__init__() self.num_classes = num_classes self.hidden_dim = hidden_dim self.num_heads = num_heads self.num_enc_layers = num_enc_layers self.num_dec_layers = num_dec_layers # CNN Backbone self.backbone = nn.Sequential( *list(resnet50(pretrained=True).children())[:-2]) self.conv = nn.Conv2d(2048, hidden_dim, 1) # Transformer self.transformer = nn.Transformer(hidden_dim, num_heads, num_enc_layers, num_dec_layers) # Prediction Heads self.to_classes = nn.Linear(hidden_dim, num_classes+1) self.to_bbox = nn.Linear(hidden_dim, 4) # Positional Encodings self.object_query = nn.Parameter(torch.rand(100, hidden_dim)) self.row_embed = nn.Parameter(torch.rand(50, hidden_dim // 2) self.col_embed = nn.Parameter(torch.rand(50, hidden_dim // 2)) def forward(self, X): X = self.backbone(X) h = self.conv(X) H, W = h.shape[-2:] pos_enc = torch.cat([ self.col_embed[:W].unsqueeze(0).repeat(H,1,1), self.row_embed[:H].unsqueeze(1).repeat(1,W,1)], dim=-1).flatten(0,1).unsqueeze(1) h = self.transformer(pos_enc + h.flatten(2).permute(2,0,1), self.object_query.unsqueeze(1)) class_pred = self.to_classes(h) bbox_pred = self.to_bbox(h).sigmoid() return class_pred, bbox_pred

二分匹配損失 (Optional)

讓為預測的集合,其中是包括了預測類別(可以是空類別)和包圍框的二元組,其中上劃線表示框的中心點, 和表示框的寬和高。設y為ground truth集合。假設y和_?_之間的損失為L,每一個y?和_?_?之間的損失為L?。由于我們是在集合的層次上工作,損失L必須是排列不變的,這意味著無論我們如何排序預測,我們都將得到相同的損失。因此,我們想找到一個排列,它將預測的索引映射到ground truth目標的索引上。在數學上,我們求解:

86dc5236fcca1b7bd7080630260c36d6.png

計算的過程稱為尋找最優的二元匹配。這可以用匈牙利算法找到。但為了找到最優匹配,我們需要實際定義一個損失函數,計算和之間的匹配成本。

回想一下,我們的預測包含一個邊界框和一個類?,F在讓我們假設類預測實際上是一個類集合上的概率分布。那么第_i_個預測的總損失將是類預測產生的損失和邊界框預測產生的損失之和。作者在http://arxiv.org/abs/1906.05909中將這種損失定義為邊界框損失和類預測概率的差異:

992dad5a7a1dc3075cbcd33f150d10f7.png

其中,是的argmax,是是來自包圍框的預測的損失,如果,則表示匹配損失為0。

框損失的計算為預測值與ground truth的L?損失和的GIOU損失的線性組合。同樣,如果你想象兩個不相交的框,那么框的錯誤將不會提供任何有意義的上下文(我們可以從下面的框損失的定義中看到)。

183c84881c17d3e38dced802e8291566.png

其中,λ???和是超參數。注意,這個和也是面積和距離產生的誤差的組合。為什么會這樣呢?

可以把上面的等式看作是與預測相關聯的總損失,其中面積誤差的重要性是λ???,距離誤差的重要性是?,F在我們來定義GIOU損失函數。定義如下:

1d3224e47d3956fe8afbefa144918b38.png

由于我們從已知的已知類的數目來預測類,那么類預測就是一個分類問題,因此我們可以使用交叉熵損失來計算類預測誤差。我們將損失函數定義為每N個預測損失的總和:

0b00557f7e5daf116fe7264009ad9421.png

為目標檢測使用DETR

在這里,你可以學習如何加載預訓練的DETR模型,以便使用PyTorch進行目標檢測。

加載模型

首先導入需要的模塊。

# Import required modulesimport torchfrom torchvision import transforms as T import requests # for loading images from webfrom PIL import Image # for viewing imagesimport matplotlib.pyplot as plt

下面的代碼用ResNet50作為CNN骨干從torch hub加載預訓練的模型。其他主干請參見DETR github:https://github.com/facebookresearch/detr

detr = torch.hub.load(‘facebookresearch/detr’, ‘detr_resnet50’, pretrained=True)

加載一張圖像

要從web加載圖像,我們使用requests庫:

url = ‘https://www.tempetourism.com/wp-content/uploads/Postino-Downtown-Tempe-2.jpg’ # Sample imageimage = Image.open(requests.get(url, stream=True).raw) plt.imshow(image)plt.show()

設置目標檢測的Pipeline

為了將圖像輸入到模型中,我們需要將PIL圖像轉換為張量,這是通過使用torchvision的transforms庫來完成的。

transform = T.Compose([T.Resize(800), T.ToTensor(), T.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])

上面的變換調整了圖像的大小,將PIL圖像進行轉換,并用均值-標準差對圖像進行歸一化。其中[0.485,0.456,0.406]為各顏色通道的均值,[0.229,0.224,0.225]為各顏色通道的標準差。我們裝載的模型是預先在COCO Dataset上訓練的,有91個類,還有一個表示空類(沒有目標)的附加類。我們用下面的代碼手動定義每個標簽

CLASSES = [‘N/A’, ‘Person’, ‘Bicycle’, ‘Car’, ‘Motorcycle’, ‘Airplane’, ‘Bus’, ‘Train’, ‘Truck’, ‘Boat’, ‘Traffic-Light’, ‘Fire-Hydrant’, ‘N/A’, ‘Stop-Sign’, ‘Parking Meter’, ‘Bench’, ‘Bird’, ‘Cat’, ‘Dog’, ‘Horse’, ‘Sheep’, ‘Cow’, ‘Elephant’, ‘Bear’, ‘Zebra’, ‘Giraffe’, ‘N/A’, ‘Backpack’, ‘Umbrella’, ‘N/A’, ‘N/A’, ‘Handbag’, ‘Tie’, ‘Suitcase’, ‘Frisbee’, ‘Skis’, ‘Snowboard’, ‘Sports-Ball’, ‘Kite’, ‘Baseball Bat’, ‘Baseball Glove’, ‘Skateboard’, ‘Surfboard’, ‘Tennis Racket’, ‘Bottle’, ‘N/A’, ‘Wine Glass’, ‘Cup’, ‘Fork’, ‘Knife’, ‘Spoon’, ‘Bowl’, ‘Banana’, ‘Apple’, ‘Sandwich’, ‘Orange’, ‘Broccoli’, ‘Carrot’, ‘Hot-Dog’, ‘Pizza’, ‘Donut’, ‘Cake’, ‘Chair’, ‘Couch’, ‘Potted Plant’, ‘Bed’, ‘N/A’, ‘Dining Table’, ‘N/A’,‘N/A’, ‘Toilet’, ‘N/A’, ‘TV’, ‘Laptop’, ‘Mouse’, ‘Remote’, ‘Keyboard’, ‘Cell-Phone’, ‘Microwave’, ‘Oven’, ‘Toaster’, ‘Sink’, ‘Refrigerator’, ‘N/A’, ‘Book’, ‘Clock’, ‘Vase’, ‘Scissors’, ‘Teddy-Bear’, ‘Hair-Dryer’, ‘Toothbrush’]

如果我們想輸出不同顏色的邊框,我們可以手動定義我們想要的RGB格式的顏色

COLORS = [ [0.000, 0.447, 0.741], [0.850, 0.325, 0.098], [0.929, 0.694, 0.125], [0.494, 0.184, 0.556], [0.466, 0.674, 0.188], [0.301, 0.745, 0.933] ]

格式化輸出

我們還需要重新格式化模型的輸出。給定一個轉換后的圖像,模型將輸出一個字典,包含100個預測類的概率和100個預測邊框。每個包圍框的形式為(x, y, w, h),其中(x,y)為包圍框的中心(包圍框是單位正方形[0,1]×[0,1]), w, h為包圍框的寬度和高度。因此,我們需要將邊界框輸出轉換為初始和最終坐標,并重新縮放框以適應圖像的實際大小。下面的函數返回邊界框端點:

# Get coordinates (x0, y0, x1, y0) from model output (x, y, w, h)def get_box_coords(boxes): x, y, w, h = boxes.unbind(1) x0, y0 = (x - 0.5 * w), (y - 0.5 * h) x1, y1 = (x + 0.5 * w), (y + 0.5 * h) box = [x0, y0, x1, y1] return torch.stack(box, dim=1)

我們還需要縮放了框的大小。下面的函數為我們做了這些:

# Scale box from [0,1]x[0,1] to [0, width]x[0, height]def scale_boxes(output_box, width, height): box_coords = get_box_coords(output_box) scale_tensor = torch.Tensor( [width, height, width, height]).to( torch.cuda.current_device()) return box_coords * scale_tensor

現在我們需要一個函數來封裝我們的目標檢測pipeline。下面的detect函數為我們完成了這項工作。

# Object Detection Pipelinedef detect(im, model, transform): device = torch.cuda.current_device() width = im.size[0] height = im.size[1] # mean-std normalize the input image (batch-size: 1) img = transform(im).unsqueeze(0) img = img.to(device) # demo model only support by default images with aspect ratio between 0.5 and 2 assert img.shape[-2] 《= 1600 and img.shape[-1] 《= 1600, # propagate through the model outputs = model(img) # keep only predictions with 0.7+ confidence probas = outputs[‘pred_logits’].softmax(-1)[0, :, :-1] keep = probas.max(-1).values 》 0.85 # convert boxes from [0; 1] to image scales bboxes_scaled = scale_boxes(outputs[‘pred_boxes’][0, keep], width, height) return probas[keep], bboxes_scaled

現在,我們需要做的是運行以下程序來獲得我們想要的輸出:

probs, bboxes = detect(image, detr, transform)

繪制結果

現在我們有了檢測到的目標,我們可以使用一個簡單的函數來可視化它們。

# Plot Predicted Bounding Boxesdef plot_results(pil_img, prob, boxes,labels=True): plt.figure(figsize=(16,10)) plt.imshow(pil_img) ax = plt.gca() for prob, (x0, y0, x1, y1), color in zip(prob, boxes.tolist(), COLORS * 100): ax.add_patch(plt.Rectangle((x0, y0), x1 - x0, y1 - y0, fill=False, color=color, linewidth=2)) cl = prob.argmax() text = f‘{CLASSES[cl]}: {prob[cl]:0.2f}’ if labels: ax.text(x0, y0, text, fontsize=15, bbox=dict(facecolor=color, alpha=0.75)) plt.axis(‘off’) plt.show()

現在可以可視化結果:

plot_results(image, probs, bboxes, labels=True)

英文原文:https://medium.com/swlh/object-detection-with-transformers-437217a3d62e

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4093

    瀏覽量

    61419
  • 代碼
    +關注

    關注

    30

    文章

    4567

    瀏覽量

    67019
  • cnn
    cnn
    +關注

    關注

    3

    文章

    326

    瀏覽量

    21439
  • pytorch
    +關注

    關注

    2

    文章

    766

    瀏覽量

    12873

原文標題:實操教程|如何使用Transformer來做物體檢測?DETR模型完整指南

文章出處:【微信號:cas-ciomp,微信公眾號:中科院長春光機所】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    紅外氣體檢測儀的工作原理 紅外氣體檢測儀的使用方法

    紅外氣體檢測儀是一種常用的氣體檢測裝置,通過測量目標氣體在紅外光譜范圍內的吸收特性來實現氣體的檢測。紅外氣體檢測儀具有高精度、快速響應、穩定性好等優點,廣泛應用于工業和環境監測領域。
    的頭像 發表于 02-01 16:52 ?663次閱讀

    實現穩定物體檢測所需的光電傳感器選擇方法和使用方法

    使用反射型傳感器時,應用上的各種要素將會影響光電傳感器的物體檢測。尤其對于黑色物體、光澤物體及透明物體等,使用傳統光電傳感器難以實現穩定的檢測
    的頭像 發表于 01-13 08:23 ?344次閱讀
    實現穩定<b class='flag-5'>物體檢測</b>所需的光電傳感器選擇方法和使用方法

    基于51單片機的酒精氣體檢測器設計

    基于51單片機的酒精氣體檢測器設計(實物)
    發表于 01-02 09:40 ?6次下載

    ADXL362自由落體檢測異常,結果與閾值設定不符是怎么回事?

    我在用ADXL362 自由落體檢測觸發ADXL372的測量流程; 用ADI的網站上的代碼資源寫了驅動,ID讀寫、測量模式開關、溫度讀寫、XYZ軸值的讀寫、靜止運動鏈接檢測模式均沒
    發表于 12-29 08:23

    怎么通過OPENMV識別物體的顏色?

    怎么通過OPENMV識別物體的顏色
    發表于 10-12 08:05

    基于Transformer的目標檢測算法

    掌握基于Transformer的目標檢測算法的思路和創新點,一些Transformer論文涉及的新概念比較多,話術沒有那么通俗易懂,讀完論文仍然不理解算法的細節部分。
    發表于 08-16 10:51 ?455次閱讀
    基于<b class='flag-5'>Transformer</b>的目標<b class='flag-5'>檢測</b>算法

    一文了解便攜式氣體檢測

    便攜式氣體檢測儀是一種用于檢測環境中氣體濃度的設備,具有體積小、便于攜帶、操作簡便等特點。無論是在工業生產、科研實驗,還是在日常生活中,便攜式氣體檢測儀都是我們的重要安全保障工具。下面,讓我們一起
    的頭像 發表于 08-08 14:56 ?805次閱讀

    寶安氣體檢測儀廠家:氣體檢測儀生產中心

    深圳寶安區,作為中國的重要電子制造業基地,擁有眾多生產各種高科技設備的制造商,其中就包括氣體檢測儀的生產廠家。這些廠家憑借先進的生產設備、嚴謹的生產工藝和高素質的研發團隊,生產出的氣體檢測儀廣受全球
    的頭像 發表于 07-28 16:23 ?428次閱讀

    華為云ModelArts入門開發(完成物體分類、物體檢測)

    利用ModelArts框架可以完成圖像分類、物體檢測、預測分析、聲音分類、文本分類等功能。介紹如何使用ModelArts完成圖像分類、物體檢測、自我學習等功能運用。
    的頭像 發表于 07-10 16:26 ?1357次閱讀
    華為云ModelArts入門開發(完成<b class='flag-5'>物體</b>分類、<b class='flag-5'>物體檢測</b>)

    如何選購深圳乙炔氣體檢測儀?

    為確保工業生產環境的安全,選購合適的深圳乙炔氣體檢測儀至關重要。本文將介紹選購深圳乙炔氣體檢測儀的關鍵因素和實用建議,幫助企業購買到合適的設備。 1. 選購深圳乙炔氣體檢測儀的關鍵因素 在選購深圳
    的頭像 發表于 07-06 11:47 ?221次閱讀

    基于 Transformer 的分割與檢測方法

    一篇關于 ?Transformer-Based 的 Segmentation 的綜述,系統地回顧了近些年來基于 Transformer? 的分割與檢測模型,調研的最新模型
    的頭像 發表于 07-05 10:18 ?579次閱讀
    基于 <b class='flag-5'>Transformer</b> 的分割與<b class='flag-5'>檢測</b>方法

    體檢測儀的使用壽命是多久

    體檢測儀可滿足各種環境泄露氣體的檢測需求,當氣體濃度值超過標準后,儀器將自動發出報警,提醒人員做好自身防護。由于氣體檢測儀的類型是比較多的,并且它的實際使用情況也是不同的,就導致它的使用壽命可能會
    的頭像 發表于 06-21 16:01 ?1215次閱讀
    氣<b class='flag-5'>體檢測</b>儀的使用壽命是多久

    便攜式氣體檢測儀如何維護保養

    體檢測儀的類型較多,一般在工業領域中比較常見,主要為便攜式儀器,它具有較高的檢測性能。但通常在使用一段時間后,儀器的檢測精準度可能有所降低。為了避免這一情況發生,在使用便攜式氣體檢測
    的頭像 發表于 06-20 16:01 ?712次閱讀

    管廊氣體檢測儀的應用與發展-歐森杰

    隨著科技的發展,管廊氣體檢測儀也在不斷的創新,它的應用和發展受到了普遍的關注。本文將詳細闡述管廊氣體檢測儀在應用與發展上的維度,以期為用戶提供參考。 一、管廊氣體檢測儀的歷史發展 管廊氣體檢測
    的頭像 發表于 06-20 11:31 ?252次閱讀

    物體檢測人工智能機器人

    電子發燒友網站提供《物體檢測人工智能機器人.zip》資料免費下載
    發表于 06-19 14:38 ?1次下載
    <b class='flag-5'>物體檢測</b>人工智能機器人
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>