91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OneFlow elementwise模板

jf_pmFSk4VX ? 來源:GiantPandaCV ? 2023-01-08 15:25 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

0x0. 前言

如題所述,本篇文章推薦和講解一下OneFlow ElementWise模板,F(xiàn)astAtomicAdd,OneFlow UpsampleNearest2d模板的用法以及原理。但OneFlow ElementWise模板的用法和原理在【BBuf的CUDA筆記】一,解析OneFlow Element-Wise 算子實(shí)現(xiàn) 已經(jīng)講過了,所以這篇文章里不再贅述,主要講解后面2個(gè)。我將上述三個(gè)算法的實(shí)現(xiàn)都分別抽出來放到了 https://github.com/BBuf/how-to-optim-algorithm-in-cuda 這個(gè)工程的 elementwise/FastAtomicAdd/UpsampleNearest2D 三個(gè)文件夾中,并且三個(gè)算法的實(shí)現(xiàn)都分別只用一個(gè).cu文件進(jìn)行整理,使用nvcc編譯可以使用,有需要的同學(xué)請(qǐng)自取。

0x1. OneFlow elementwise模板

將 oneflow 的 elementwise 模板抽出來方便大家使用,這個(gè) elementwise 模板實(shí)現(xiàn)了高效的性能和帶寬利用率,并且用法非常靈活。完整實(shí)驗(yàn)代碼見 https://github.com/BBuf/how-to-optim-algorithm-in-cuda/blob/master/elementwise/elementwise.cu,原理講解請(qǐng)看:【BBuf 的CUDA筆記】一,解析OneFlow Element-Wise 算子實(shí)現(xiàn) 。這里以逐點(diǎn)乘(z = x * y,其中x,y,z是形狀完全一樣的Tensor)為例,性能和帶寬的測(cè)試情況如下 (A100 PCIE 40G):

優(yōu)化手段 數(shù)據(jù)類型 耗時(shí)(us) 帶寬利用率
naive elementwise float 298.46us 85.88%
oneflow elementwise float 284us 89.42%
naive elementwise half 237.28us 52.55%
oneflow elementwise half 140.74us 87.31%

可以看到無論是性能還是帶寬,使用 oneflow 的 elementwise 模板相比于原始實(shí)現(xiàn)都有較大提升。

涉及到的主要優(yōu)化技術(shù)有向量化數(shù)據(jù)訪問,選取合適的GridSize和BlockSize,循環(huán)展開和Grid-Stride Loops等技巧。

模板代碼和用法詳見:https://github.com/BBuf/how-to-optim-algorithm-in-cuda/blob/master/elementwise/elementwise.cu

0x2. FastAtomicAdd

眾所周知,atomicAdd是CUDA中非常昂貴的操作,特別是對(duì)于half類型來說 atomicAdd 巨慢無比,慢到如果一個(gè)算法需要用到 atomicAdd,那么相比于用 half ,轉(zhuǎn)成 float ,再 atomicAdd,再轉(zhuǎn)回去還要慢很多。但是我們有時(shí)候不得不去執(zhí)行half類型的原子加,這個(gè)時(shí)候怎么能提升性能呢?

PyTorch給出了一個(gè)快速原子加的實(shí)現(xiàn)(我這里魔改了一下,去掉了一些不需要的參數(shù),完整測(cè)試代碼見 https://github.com/BBuf/how-to-optim-algorithm-in-cuda/blob/master/FastAtomicAdd/fast_atomic_add_half.cu ):

//FastAddisreferencedfrom
//https://github.com/pytorch/pytorch/blob/396c3b1d88d7624938a2bb0b287f2a19f1e89bb4/aten/src/ATen/native/cuda/KernelUtils.cuh#L29
template<typenameT,typenamestd::enable_if<std::is_same::value>::type*=nullptr>
__device____forceinline__voidFastSpecializedAtomicAdd(T*base,size_toffset,
constsize_tlength,Tvalue){
#if((defined(CUDA_VERSION)&&(CUDA_VERSION
atomicAdd(reinterpret_cast(base)+offset,static_cast(value));
#else
//Accountsforthechancebasefallsonanodd16bitalignment(ie,not32bitaligned)
__half*target_addr=reinterpret_cast<__half*>(base+offset);
boollow_byte=(reinterpret_cast<std::uintptr_t>(target_addr)%sizeof(__half2)==0);

if(low_byte&&offset1)){
__half2value2;
value2.x=value;
value2.y=__float2half_rz(0);
atomicAdd(reinterpret_cast<__half2*>(target_addr),value2);

}elseif(!low_byte&&offset>0){
__half2value2;
value2.x=__float2half_rz(0);
value2.y=value;
atomicAdd(reinterpret_cast<__half2*>(target_addr-1),value2);

}else{
atomicAdd(reinterpret_cast<__half*>(base)+offset,static_cast<__half>(value));
}
#endif
}

template<typenameT,typenamestd::enable_ifstd::is_same::value>::type*=nullptr>
__device____forceinline__voidFastSpecializedAtomicAdd(T*base,size_toffset,
constsize_tlength,Tvalue){
atomicAdd(base+offset,value);
}

template
__device____forceinline__voidFastAdd(T*base,size_toffset,constsize_tlength,Tvalue){
FastSpecializedAtomicAdd(base,offset,length,value);
}

也就是把half類型的原子加轉(zhuǎn)換成half2類型的原子加,為了驗(yàn)證這個(gè)快速原子加相比于half類型的原子加以及pack 2個(gè)half 到 half2再執(zhí)行原子加的性能表現(xiàn),我實(shí)現(xiàn)了三個(gè)算法(.cu文件)。它們都是針對(duì)half數(shù)據(jù)類型做向量的內(nèi)積,都用到了atomicAdd,保證數(shù)據(jù)的長度以及gridsize和blocksize都是完全一致的。具體如下:

  1. https://github.com/BBuf/how-to-optim-algorithm-in-cuda/blob/master/FastAtomicAdd/atomic_add_half.cu 純half類型的atomicAdd。
  2. https://github.com/BBuf/how-to-optim-algorithm-in-cuda/blob/master/FastAtomicAdd/atomic_add_half_pack2.cu half+pack,最終使用的是half2類型的atomicAdd。
  3. https://github.com/BBuf/how-to-optim-algorithm-in-cuda/blob/master/FastAtomicAdd/fast_atomic_add_half.cu 快速原子加,雖然沒有顯示的pack,但本質(zhì)上也是通過對(duì)單個(gè)half補(bǔ)0使用上了half2的原子加。

下面展示3個(gè)腳本通過ncu profile之后的性能表現(xiàn):

原子加方式 性能(us)
純half類型 422.36ms
pack half2類型 137.02ms
fastAtomicAdd 137.01ms

可以看到使用pack half的方式和直接使用half的fastAtomicAdd方式得到的性能結(jié)果一致,均比原始的half的原子加快3-4倍。

接下來驗(yàn)證一下是否存在warp分支分化問題,對(duì)比了一下fastAtomicAdd和pack half2的ncu匯編代碼,并未發(fā)現(xiàn)不同類型的指令:

fastAtomicAdd 計(jì)算部分:

73b53cd4-8efc-11ed-bfe3-dac502259ad0.png在這里插入圖片描述

atomicAddhalfpack2計(jì)算部分:

73d9bce4-8efc-11ed-bfe3-dac502259ad0.png在這里插入圖片描述

每一種指令的類型都能在兩份代碼中找到,初步判斷不會(huì)因?yàn)閒astAtomicAdd實(shí)現(xiàn)中的下述if語句存在線程分化問題。

73fe983e-8efc-11ed-bfe3-dac502259ad0.png圖片

綜上所述,使用FastAtomicAdd可以大幅度提升half數(shù)據(jù)類型原子加的性能并且不需要手動(dòng)Pack,使用方法更加簡(jiǎn)單。

模板代碼和用法詳見:https://github.com/BBuf/how-to-optim-algorithm-in-cuda/blob/master/FastAtomicAdd/fast_atomic_add_half.cu

0x3. Oneflow Upsample模板

在Stable Diffusion的反向擴(kuò)散過程中使用到了UNet,而UNet中存在大量的UpsampleNearest2D上采樣。PyTorch對(duì)于UpsampleNearest都是通用的實(shí)現(xiàn)(https://github.com/pytorch/pytorch/blob/master/aten/src/ATen/native/cuda/UpSampleNearest2d.cu#L112-L163) ,這種實(shí)現(xiàn)里面存在大量的取模和坐標(biāo)映射操作(nn_bw_compute_source_index_fn)以及循環(huán)統(tǒng)計(jì)貢獻(xiàn)等。對(duì)于深度學(xué)習(xí)來說,UpsampleNearest最常用的其實(shí)就是2倍上采樣,比如Unet和YOLOv5,所以我們完全可以針對(duì)這種情況寫一個(gè)特化的Kernel,很輕量的來完成2倍上采樣的計(jì)算。下面展示OneFlow中針對(duì)2倍上采樣的優(yōu)化(代碼見:https://github.com/BBuf/how-to-optim-algorithm-in-cuda/blob/master/UpsampleNearest2D/upsample_nearest_2d.cu#L16-L63)

//CUDA:gridstridelooping
#defineCUDA_1D_KERNEL_LOOP(i,n)
for(int32_ti=blockIdx.x*blockDim.x+threadIdx.x,step=blockDim.x*gridDim.x;i

//UpsampleNearest2DKerneliscopyedfromhttps://github.com/Oneflow-Inc/oneflow/blob/master/oneflow/user/kernels/upsample_nearest_kernel.cu#L78
template<typenameT>
structalignas(2*sizeof(T))Pack2X{
Tx;
Ty;
};

template<typenameT>
__global__voidUpsampleNearest2D2XForward(constint32_tin_elem_cnt,constT*in_dptr,
constint32_tin_height,constint32_tin_width,
T*out_dptr){
constint32_tin_hw_size=in_width*in_height;
CUDA_1D_KERNEL_LOOP(index,in_elem_cnt){
constTin_value=in_dptr[index];
constint32_tnc_idx=index/in_hw_size;
constint32_thw_off=index-nc_idx*in_hw_size;//這里是優(yōu)化掉昂貴的取模運(yùn)算
constint32_th=hw_off/in_width;
constint32_tw=hw_off-h*in_width;
Pack2Xout_value{in_value,in_value};
Pack2X*out_pack_dptr=reinterpret_cast*>(out_dptr);
out_pack_dptr[nc_idx*in_hw_size*2+h*2*in_width+w]=out_value;
out_pack_dptr[nc_idx*in_hw_size*2+(h*2+1)*in_width+w]=out_value;
}
}

template<typenameT>
__global__voidUpsampleNearest2D2XBackward(constint32_tin_elem_cnt,constT*dy_dptr,
constint32_tdx_height,constint32_tdx_width,
T*dx_dptr){
constint32_tdx_hw_size=dx_height*dx_width;
CUDA_1D_KERNEL_LOOP(index,in_elem_cnt){
Tdx_value=0.0;
constint32_tnc_idx=index/dx_hw_size;
constint32_tdx_hw_off=index-nc_idx*dx_hw_size;
constint32_tdx_h=dx_hw_off/dx_width;
constint32_tdx_w=dx_hw_off-dx_h*dx_width;
constPack2X*dy_pack_dptr=reinterpret_cast<constPack2X*>(dy_dptr);
constPack2Xdy_pack_value1=
dy_pack_dptr[nc_idx*dx_hw_size*2+dx_h*2*dx_width+dx_w];
constPack2Xdy_pack_value2=
dy_pack_dptr[nc_idx*dx_hw_size*2+(dx_h*2+1)*dx_width+dx_w];
dx_value+=dy_pack_value1.x;
dx_value+=dy_pack_value1.y;
dx_value+=dy_pack_value2.x;
dx_value+=dy_pack_value2.y;
dx_dptr[index]=dx_value;
}
}

這個(gè)地方比較好理解,我們以前向的UpsampleNearest2D2XForward為例,當(dāng)我們對(duì)一個(gè)的矩陣進(jìn)行2倍上采樣時(shí),可以獲得大小的輸出Tensor,那么輸入和輸出的對(duì)應(yīng)關(guān)系如下圖所示:

74222808-8efc-11ed-bfe3-dac502259ad0.png箭頭表示輸入元素和輸出區(qū)域的對(duì)應(yīng)關(guān)系

也就是輸入的(0, 0)位置對(duì)應(yīng)來輸出的(0, 0), (0, 1), (1, 0), (1, 1)的位置。也就是一個(gè)輸入的元素其實(shí)是對(duì)應(yīng)來輸出的4個(gè)元素,并且這4個(gè)元素一定是相鄰的2行或2列。所以我們可以使用Pack技術(shù)只用2次賦值就完成輸出Tensor對(duì)應(yīng)位置元素的填寫,進(jìn)一步提升全局內(nèi)存訪問的帶寬。

我這里直接使用 oneflow 的腳本對(duì)這兩個(gè) kernel 進(jìn)行進(jìn)行 profile :

importoneflowasflow

x=flow.randn(16,32,80,80,device="cuda",dtype=flow.float32).requires_grad_()

m=flow.nn.Upsample(scale_factor=2.0,mode="nearest")

y=m(x)
print(y.device)
y.sum().backward()

下面展示了在 A100 上調(diào)優(yōu)前后的帶寬占用和計(jì)算時(shí)間比較:

框架 數(shù)據(jù)類型 Op類型 帶寬利用率 耗時(shí)
PyTorch Float32 UpsampleNearest2D forward 28.30% 111.42us
PyTorch Float32 UpsampleNearest2D backward 60.16% 65.12us
OneFlow Float32 UpsampleNearest2D forward 52.18% 61.44us
OneFlow Float32 UpsampleNearest2D backward 77.66% 50.56us
PyTorch Float16 UpsampleNearest2D forward 16.99% 100.38us
PyTorch Float16 UpsampleNearest2D backward 31.56% 57.38us
OneFlow Float16 UpsampleNearest2D forward 43.26% 35.36us
OneFlow Float16 UpsampleNearest2D backward 44.82% 40.26us

可以看到基于 oneflow upsample_nearest2d 的前后向的優(yōu)化 kernel 可以獲得更好的帶寬利用率和性能。

模板代碼和用法詳見:https://github.com/BBuf/how-to-optim-algorithm-in-cuda/blob/master/UpsampleNearest2D/upsample_nearest_2d.cu

0x4. 總結(jié)

本篇文章推薦和講解一下OneFlow ElementWise模板,F(xiàn)astAtomicAdd,OneFlow UpsampleNearest2d模板的用法以及原理,并將其整理為最小的可以白嫖的頭文件。相關(guān)代碼請(qǐng)?jiān)L問 https://github.com/BBuf/how-to-optim-algorithm-in-cuda 這里獲得。


審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4786

    瀏覽量

    98222
  • 模板
    +關(guān)注

    關(guān)注

    0

    文章

    111

    瀏覽量

    21097
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4972

    瀏覽量

    74102

原文標(biāo)題:0x4. 總結(jié)

文章出處:【微信號(hào):GiantPandaCV,微信公眾號(hào):GiantPandaCV】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Helm包管理與模板化部署實(shí)戰(zhàn)

    直接用kubectl管理K8s資源,10個(gè)微服務(wù)就要維護(hù)幾十個(gè)YAML文件,版本管理靠文件夾命名,回滾靠手動(dòng)替換文件。Helm把一組相關(guān)的K8s資源打包成Chart,支持模板化、版本管理、一鍵部署和回滾,是K8s生態(tài)中事實(shí)上的包管理標(biāo)準(zhǔn)。
    的頭像 發(fā)表于 02-26 16:37 ?290次閱讀

    瑞薩RA-Eco-RA4M2開發(fā)板基本模板搭建與LED指南

    瑞薩“RA MCU眾測(cè)寶典”環(huán)境搭建專題再添硬核實(shí)操!這次將解鎖“基本模板搭建與LED”技能,加入簡(jiǎn)易調(diào)度器實(shí)現(xiàn)多任務(wù)管理,一步步搞定“能直接落地”的開發(fā)模板,不管是入門練手還是項(xiàng)目開發(fā)都能復(fù)用。
    的頭像 發(fā)表于 02-24 14:43 ?5795次閱讀
    瑞薩RA-Eco-RA4M2開發(fā)板基本<b class='flag-5'>模板</b>搭建與LED指南

    【Moldex3D丨技巧分享】__ 壓縮制程模溫分析支援模板移動(dòng)

    在之前簡(jiǎn)化流程下的壓縮制程仿真中,為了便利使用者快速建模,對(duì)開模與合模狀態(tài)下的冷卻水路位置變化作了簡(jiǎn)化的假設(shè),故冷卻效果可能會(huì)有誤差而影響到模擬分析的準(zhǔn)確度。因此,若能將冷卻水路隨著模板移動(dòng)的行為
    的頭像 發(fā)表于 01-14 16:25 ?558次閱讀
    【Moldex3D丨技巧分享】__ 壓縮制程模溫分析支援<b class='flag-5'>模板</b>移動(dòng)

    京東關(guān)鍵詞 API 場(chǎng)景的需求梳理模板

    京東關(guān)鍵詞 API 場(chǎng)景需求梳理模板模板適用于 聯(lián)盟推廣、商家運(yùn)營、工具開發(fā)、市場(chǎng)分析 等基于京東關(guān)鍵詞 API 的業(yè)務(wù)需求梳理,可直接用于需求文檔撰寫、API 對(duì)接方案評(píng)審。 核心模塊 填寫項(xiàng)
    的頭像 發(fā)表于 01-08 13:45 ?195次閱讀

    使用RV-STAR寫入模板程序時(shí)出錯(cuò)怎么解決?

    我使用的是官方提供的RV-STAR板子,操作系統(tǒng)環(huán)境是Windows10。連上板子后也能識(shí)別到串口: 下載調(diào)試的程序就是模板提供的helloworld,在下載時(shí)出現(xiàn)以下錯(cuò)誤: 請(qǐng)問是出現(xiàn)了什么問題?要如何解決?謝謝。
    發(fā)表于 11-06 06:58

    目標(biāo)追蹤的簡(jiǎn)易實(shí)現(xiàn):模板匹配

    重新出現(xiàn)在幀圖象中時(shí),迅速地重新捕捉到目標(biāo)。 以上對(duì)目標(biāo)追蹤這一領(lǐng)域做了簡(jiǎn)要的說明,下面將會(huì)介紹目標(biāo)追蹤算法中最簡(jiǎn)單的一種 —— 模板匹配算法。 三、模板匹配算法 模板匹配
    發(fā)表于 10-28 07:21

    店鋪裝修模板同步接口技術(shù)解析

    ? ?在電商平臺(tái)開發(fā)中,店鋪裝修模板的跨系統(tǒng)同步是核心需求。本文從接口設(shè)計(jì)、數(shù)據(jù)結(jié)構(gòu)和實(shí)現(xiàn)邏輯三個(gè)維度進(jìn)行技術(shù)拆解。 一、接口設(shè)計(jì)規(guī)范 基礎(chǔ)參數(shù) 請(qǐng)求方法:POST 端點(diǎn)路徑:/api/v1
    的頭像 發(fā)表于 10-17 15:24 ?355次閱讀
    店鋪裝修<b class='flag-5'>模板</b>同步接口技術(shù)解析

    Allegro Skill工藝輔助之導(dǎo)入疊層模板

    在PCB設(shè)計(jì)中,導(dǎo)入疊層模板能夠確保設(shè)計(jì)的標(biāo)準(zhǔn)化和規(guī)范化,避免因手動(dòng)設(shè)置疊層參數(shù)而可能出現(xiàn)的錯(cuò)誤或不一致情況。
    的頭像 發(fā)表于 07-10 17:10 ?3267次閱讀
    Allegro Skill工藝輔助之導(dǎo)入疊層<b class='flag-5'>模板</b>

    涂鴉重磅發(fā)布萌寵語聊模板!On-App AI降噪+音頻處理技術(shù),讓遠(yuǎn)程安撫寵物更安心

    在當(dāng)前快節(jié)奏的生活背景下,寵物常常會(huì)因鏟屎官的頻繁外出、缺乏互動(dòng)與情感陪伴,而產(chǎn)生孤獨(dú)抑郁、焦慮、暴躁易怒等問題。為了提升寵物的安全感,涂鴉重磅推出基于On-AppAI構(gòu)建的萌寵語聊模板,旨在通過
    的頭像 發(fā)表于 06-05 19:25 ?1004次閱讀
    涂鴉重磅發(fā)布萌寵語聊<b class='flag-5'>模板</b>!On-App AI降噪+音頻處理技術(shù),讓遠(yuǎn)程安撫寵物更安心

    HarmonyOS5云服務(wù)技術(shù)分享--Serverless抽獎(jiǎng)模板部署

    手把手教你部署HarmonyOS Serverless抽獎(jiǎng)活動(dòng)模板(附貼心提醒) 嘿,小伙伴們!今天給大家分享一個(gè)超實(shí)用的教程——如何用華為HarmonyOS的Serverless模板快速搭建抽獎(jiǎng)
    發(fā)表于 05-22 20:25

    基于LockAI視覺識(shí)別模塊:C++多模板匹配

    模板匹配是一種在圖像中同時(shí)尋找多個(gè)模板的技術(shù)。通過對(duì)每個(gè)模板逐一進(jìn)行匹配,找到與輸入圖像最相似的區(qū)域,并標(biāo)記出匹配度最高的結(jié)果。本實(shí)驗(yàn)提供了一個(gè)簡(jiǎn)單的多模板匹配案例,并將其封裝為一個(gè)
    發(fā)表于 05-14 15:00

    基于LockAI視覺識(shí)別模塊:C++多模板匹配

    模板匹配是一種在圖像中同時(shí)尋找多個(gè)模板的技術(shù)。通過對(duì)每個(gè)模板逐一進(jìn)行匹配,找到與輸入圖像最相似的區(qū)域,并標(biāo)記出匹配度最高的結(jié)果。本實(shí)驗(yàn)提供了一個(gè)簡(jiǎn)單的多模板匹配案例,并將其封裝為一個(gè)
    的頭像 發(fā)表于 05-14 14:37 ?1656次閱讀
    基于LockAI視覺識(shí)別模塊:C++多<b class='flag-5'>模板</b>匹配

    基于LockAI視覺識(shí)別模塊:C++模板匹配

    模板匹配是一種在圖像中尋找特定模式的技術(shù)。它通過滑動(dòng)一個(gè)模板圖像(較小的圖像)在輸入圖像上進(jìn)行比較,找到最相似的區(qū)域。本實(shí)驗(yàn)提供了一個(gè)簡(jiǎn)單的模板匹配案例,并將其封裝為一個(gè)自定義函數(shù)
    發(fā)表于 05-13 14:40

    基于LockAI視覺識(shí)別模塊:C++模板匹配

    模板匹配是一種在圖像中尋找特定模式的技術(shù)。它通過滑動(dòng)一個(gè)模板圖像(較小的圖像)在輸入圖像上進(jìn)行比較,找到最相似的區(qū)域。本實(shí)驗(yàn)提供了一個(gè)簡(jiǎn)單的模板匹配案例,并將其封裝為一個(gè)自定義函數(shù)performTemplateMatching,
    的頭像 發(fā)表于 05-13 14:14 ?815次閱讀
    基于LockAI視覺識(shí)別模塊:C++<b class='flag-5'>模板</b>匹配

    請(qǐng)問SX3實(shí)用程序提供的模板只能在開發(fā)板上使用嗎?

    SX3 實(shí)用程序提供的模板只能在開發(fā)板上使用嗎?
    發(fā)表于 05-09 06:47