Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
Norishige Fukushima
8,818 views
Popcntによるハミング距離計算
SSE4.2に採用されているpopcnt命令を使ってハミング距離を計算する方法の解説. 例題としてCENSUS変換によるステレオ対応づけを説明しています.
Technology
◦
Read more
8
Save
Share
Embed
Embed presentation
Download
Downloaded 59 times
1
/ 16
2
/ 16
Most read
3
/ 16
4
/ 16
5
/ 16
Most read
6
/ 16
7
/ 16
8
/ 16
9
/ 16
10
/ 16
11
/ 16
12
/ 16
13
/ 16
14
/ 16
15
/ 16
Most read
16
/ 16
More Related Content
PDF
組合せ最適化入門:線形計画から整数計画まで
by
Shunji Umetani
PDF
勉強か?趣味か?人生か?―プログラミングコンテストとは
by
Takuya Akiba
PDF
画像認識の初歩、SIFT,SURF特徴量
by
takaya imai
PDF
組み込み関数(intrinsic)によるSIMD入門
by
Norishige Fukushima
PDF
線形計画法入門
by
Shunji Umetani
PDF
深層強化学習と実装例
by
Deep Learning Lab(ディープラーニング・ラボ)
PDF
全力解説!Transformer
by
Arithmer Inc.
PDF
強化学習と逆強化学習を組み合わせた模倣学習
by
Eiji Uchibe
組合せ最適化入門:線形計画から整数計画まで
by
Shunji Umetani
勉強か?趣味か?人生か?―プログラミングコンテストとは
by
Takuya Akiba
画像認識の初歩、SIFT,SURF特徴量
by
takaya imai
組み込み関数(intrinsic)によるSIMD入門
by
Norishige Fukushima
線形計画法入門
by
Shunji Umetani
深層強化学習と実装例
by
Deep Learning Lab(ディープラーニング・ラボ)
全力解説!Transformer
by
Arithmer Inc.
強化学習と逆強化学習を組み合わせた模倣学習
by
Eiji Uchibe
What's hot
PDF
コンピューテーショナルフォトグラフィ
by
Norishige Fukushima
PDF
【DL輪読会】Scaling laws for single-agent reinforcement learning
by
Deep Learning JP
PDF
SSII2019TS: 実践カメラキャリブレーション ~カメラを用いた実世界計測の基礎と応用~
by
SSII
PPTX
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
by
Norishige Fukushima
PPTX
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
by
Shota Imai
PDF
プログラムを高速化する話
by
京大 マイコンクラブ
PPTX
[DL輪読会]Revisiting Deep Learning Models for Tabular Data (NeurIPS 2021) 表形式デー...
by
Deep Learning JP
PDF
最適輸送の解き方
by
joisino
PDF
【DL輪読会】GPT-4Technical Report
by
Deep Learning JP
PDF
MLflowによる機械学習モデルのライフサイクルの管理
by
Takeshi Yamamuro
PDF
最近のDeep Learning (NLP) 界隈におけるAttention事情
by
Yuta Kikuchi
PDF
最適輸送の計算アルゴリズムの研究動向
by
ohken
PDF
マルチコアを用いた画像処理
by
Norishige Fukushima
PPTX
ようやく分かった!最尤推定とベイズ推定
by
Akira Masuda
PDF
NumPy闇入門
by
Ryosuke Okuta
PDF
Deeplearning輪読会
by
正志 坪坂
PDF
BERT入門
by
Ken'ichi Matsui
PPTX
カルマンフィルタ入門
by
Yasunori Nihei
PDF
協調フィルタリングを利用した推薦システム構築
by
Masayuki Ota
PDF
Deep learningの発展と化学反応への応用 - 日本化学会第101春季大会(2021)
by
Preferred Networks
コンピューテーショナルフォトグラフィ
by
Norishige Fukushima
【DL輪読会】Scaling laws for single-agent reinforcement learning
by
Deep Learning JP
SSII2019TS: 実践カメラキャリブレーション ~カメラを用いた実世界計測の基礎と応用~
by
SSII
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
by
Norishige Fukushima
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
by
Shota Imai
プログラムを高速化する話
by
京大 マイコンクラブ
[DL輪読会]Revisiting Deep Learning Models for Tabular Data (NeurIPS 2021) 表形式デー...
by
Deep Learning JP
最適輸送の解き方
by
joisino
【DL輪読会】GPT-4Technical Report
by
Deep Learning JP
MLflowによる機械学習モデルのライフサイクルの管理
by
Takeshi Yamamuro
最近のDeep Learning (NLP) 界隈におけるAttention事情
by
Yuta Kikuchi
最適輸送の計算アルゴリズムの研究動向
by
ohken
マルチコアを用いた画像処理
by
Norishige Fukushima
ようやく分かった!最尤推定とベイズ推定
by
Akira Masuda
NumPy闇入門
by
Ryosuke Okuta
Deeplearning輪読会
by
正志 坪坂
BERT入門
by
Ken'ichi Matsui
カルマンフィルタ入門
by
Yasunori Nihei
協調フィルタリングを利用した推薦システム構築
by
Masayuki Ota
Deep learningの発展と化学反応への応用 - 日本化学会第101春季大会(2021)
by
Preferred Networks
Viewers also liked
PPTX
x86x64 SSE4.2 POPCNT
by
takesako
PPTX
Jetson TK1でSemi-Global Matching
by
Ryo Sakamoto
PDF
明日使えないすごいビット演算
by
京大 マイコンクラブ
PDF
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
by
Ryoma Sin'ya
PDF
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
by
Ryo Sakamoto
PDF
最適化超入門
by
Takami Sato
PDF
X86opti01 nothingcosmos
by
nothingcosmos
PDF
A x86-optimized rank&select dictionary for bit sequences
by
Takeshi Yamamuro
PDF
はじパタLT3
by
Tadayuki Onishi
KEY
GPGPU deいろんな問題解いてみた
by
Ryo Sakamoto
PDF
Haswellサーベイと有限体クラスの紹介
by
MITSUNARI Shigeo
PPTX
Libjpeg turboの使い方
by
Norishige Fukushima
PDF
Stereo vision
by
Dũng Nguyễn
PPTX
Comparison between Blur Transfer and Blur Re-Generation in Depth Image Based ...
by
Norishige Fukushima
PDF
OpenCVの拡張ユーティリティ関数群
by
Norishige Fukushima
PDF
WebP入門
by
Norishige Fukushima
PDF
Polymerやってみた
by
Yosuke Onoue
PDF
AngularJSでデータビジュアライゼーションがしたい
by
Yosuke Onoue
PDF
Angular 2のRenderer
by
Yosuke Onoue
PDF
GDG DevFest Kobe Firebaseハンズオン勉強会
by
Yosuke Onoue
x86x64 SSE4.2 POPCNT
by
takesako
Jetson TK1でSemi-Global Matching
by
Ryo Sakamoto
明日使えないすごいビット演算
by
京大 マイコンクラブ
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
by
Ryoma Sin'ya
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
by
Ryo Sakamoto
最適化超入門
by
Takami Sato
X86opti01 nothingcosmos
by
nothingcosmos
A x86-optimized rank&select dictionary for bit sequences
by
Takeshi Yamamuro
はじパタLT3
by
Tadayuki Onishi
GPGPU deいろんな問題解いてみた
by
Ryo Sakamoto
Haswellサーベイと有限体クラスの紹介
by
MITSUNARI Shigeo
Libjpeg turboの使い方
by
Norishige Fukushima
Stereo vision
by
Dũng Nguyễn
Comparison between Blur Transfer and Blur Re-Generation in Depth Image Based ...
by
Norishige Fukushima
OpenCVの拡張ユーティリティ関数群
by
Norishige Fukushima
WebP入門
by
Norishige Fukushima
Polymerやってみた
by
Yosuke Onoue
AngularJSでデータビジュアライゼーションがしたい
by
Yosuke Onoue
Angular 2のRenderer
by
Yosuke Onoue
GDG DevFest Kobe Firebaseハンズオン勉強会
by
Yosuke Onoue
More from Norishige Fukushima
PPTX
画像処理の高性能計算
by
Norishige Fukushima
PPTX
計算スケジューリングの効果~もし,Halideがなかったら?~
by
Norishige Fukushima
PPTX
多チャンネルバイラテラルフィルタの高速化
by
Norishige Fukushima
PDF
計算機アーキテクチャを考慮した高能率画像処理プログラミング
by
Norishige Fukushima
PPTX
3次元計測とフィルタリング
by
Norishige Fukushima
PPTX
デプスセンサとその応用
by
Norishige Fukushima
PPTX
複数台のKinectV2の使い方
by
Norishige Fukushima
PPTX
Non-essentiality of Correlation between Image and Depth Map in Free Viewpoin...
by
Norishige Fukushima
PDF
コンピュテーショナルフォトグラフティの基礎
by
Norishige Fukushima
PDF
ガイデットフィルタとその周辺
by
Norishige Fukushima
画像処理の高性能計算
by
Norishige Fukushima
計算スケジューリングの効果~もし,Halideがなかったら?~
by
Norishige Fukushima
多チャンネルバイラテラルフィルタの高速化
by
Norishige Fukushima
計算機アーキテクチャを考慮した高能率画像処理プログラミング
by
Norishige Fukushima
3次元計測とフィルタリング
by
Norishige Fukushima
デプスセンサとその応用
by
Norishige Fukushima
複数台のKinectV2の使い方
by
Norishige Fukushima
Non-essentiality of Correlation between Image and Depth Map in Free Viewpoin...
by
Norishige Fukushima
コンピュテーショナルフォトグラフティの基礎
by
Norishige Fukushima
ガイデットフィルタとその周辺
by
Norishige Fukushima
Popcntによるハミング距離計算
1.
POPCNTによるハミング距離 計算とステレオ対応への応用
名古屋工業大学 福嶋慶繁 Twitter: @fukushima1981
2.
POPCNT • POPCNT:
– データの非ゼロのビット数を数える – Population countの略 • VC,GCCでは下記関数で,値が確保可能 – Int val = _mm_popcnt_u32(unsigned long) • SSE4.2から対応 – 一昔前のCore i7よりも新しいCPUのみ対応
3.
なんの役に立つの? ハミング距離が計算可能
4.
ハミング距離(Hamming Distance) • データ中のビットの違いの数 •
例 AとBのハミング距離は? – A:00100101 – B:00101011 – 3つ異なるので3 – L0ノルムに似た距離尺度
5.
popcnt使い方 • popcnt:
– ビット中の非ゼロの数を高速に数えてくれる • ハミング距離: – 2つのビット列のうち異なるビットの数 • つまり,2つのビット列の異なり具合を表すビット列をpopcntすれば即座 にハミング距離が求まる. – それはAとBの排他的論理和で表現可能 – 2つの値が同じなら0違うなら1を出力する論理演算 – A XOR B, c,c++では, A^B; popcnt(A^B); これだけでハミング距離が測定できる!
6.
POPCNTによるハミング距離 • 入力データ
– A:00100101 – B:00101011 • 排他的論理和 – A^B:00001110 • POPCNT – popcnt(00001110)=3 • AとBのハミング距離は3!
7.
例題:ステレオマッチング • ステレオマッチング –
左右の画素の一致度を図り,最も一致した画素 を元に奥行きを計算する – 単純な距離尺度:絶対誤差,二乗誤差 • abs(L-R):SAD • (L-R)^2 :SSD – ハミング距離を使う距離尺度もある • CENSUS変換
8.
CENSUS Transform (1/2) •
画素中に適当なウィンドウを張り,中心の画素と周 辺の画素との大小関係をバイナリベクトルに変換す る変換 • 中心<周辺 ? 1 : 0 • ベクトル長はウィンドウの大きさに依存
9.
CENSUS Transform (2/2) •
8bitのCENSUS変換(つまり窓の面積が,中心を除く8画素)な ら画像として表現も可能 • それ以上の窓サイズになると桁があふれて画像としては可 視化不可能 入力画像 CENSUS変換画像
10.
CENSUS変換によるステレオマッチング 1. 左右の画像(Iml,Imr)をCENSUS変換した画像を作成:
(Iml,Imr)→(Imlcensus,Imrcensus ) 2. 右の変換画像をある視差dだけシフト Imrcensus (x)→ Imrcensus (x-d) 3. シフトした右CENSUS画像と左CENSUS画像のハミング 距離を計算 distance(d)= Hamming(Imlcensus (x) , Imrcensus (x-d)) 4. もっともハミング距離が小さかった視差値をその画素 の視差として採用 disp = argmind distance(d)
11.
例題:ステレオマッチング(入力) Left Image
Right Image 左右ともども9x1の窓で全体をCENSUS変換
12.
例題:ステレオマッチング(出力) SAD:
CENSUS: 95 msec 107 msec SADという非常に簡単な絶対値差分と比べて速度面はほとんど変わらない
13.
CENSUS変換の利点 • 輝度値を直接比較しないので照明変動につ
よい – 中央との相対関係をもとに比較 • ノイズに強い – バイナリの値を比較するので,微小なノイズの影 響が少ない • 模様が少ない領域での対応付けが安定する – 中心との差分→微分のような効果があるためエッ ジ(模様)を強調する効果
14.
Sample code
Stereo Matching のサンプルコード:詳細は次ページ void calcHammingDistance8u(Mat& src1, Mat& src2, Mat& dest) { if(dest.empty())dest.create(src1.size(),CV_8U); int i,j; uchar* s1 = src1.ptr<uchar>(0); uchar* s2 = src2.ptr<uchar>(0); uchar* d = dest.ptr<uchar>(0); int count=0; const int hstep = src1.cols/16; const int rad= src1.cols- hstep*16; for(j=src1.rows;j--;) { //base for(i=src1.cols;i--;) { *d = _mm_popcnt_u32((unsigned int)(*s1^*s2)); s1++;s2++,d++; } } } void censusTrans8u_8x1(Mat& src, Mat& dest) { if(dest.empty())dest.create(src.size(),CV_8U); const int r=4; const int r2=2*r; Mat im;copyMakeBorder(src,im,0,0,r,r,cv::BORDER_REPLICATE); int i,j,n; uchar* s = im.ptr<uchar>(0);s+=r; uchar* d = dest.ptr<uchar>(0); for(j=0;j<src.rows;j++) { for(i=0;i<src.cols;i++) { uchar val = 0;//init value uchar* ss=s-r; for(n = 0;n<r;n++) { //if (*ss<*s)val|=1; val = (*ss<*s) ? val|1 : val; ss++; val <<=1; } ss++;//skip r=0 for(n = 0;n<r;n++) { val = (*ss<*s) ? val|1 : val; ss++; val <<=1; } *d=val; d++; s++; } s+=r2; } } void shiftImage8u(Mat& src, Mat& dest, const int shift) { if(dest.empty())dest.create(src.size(),CV_8U); if(shift>=0) { const int step = src.cols; uchar* s = src.ptr<uchar>(0); uchar* d = dest.ptr<uchar>(0); int j;j=0; for(;j<src.rows;j++) { const uchar v = s[0]; memset(d,v,shift); memcpy(d+shift,s,step-shift); s+=step;d+=step; } } else { const int step = src.cols; uchar* s = src.ptr<uchar>(0); uchar* d = dest.ptr<uchar>(0); int j;j=0; for(;j<src.rows;j++) { const uchar v = s[step-1]; memcpy(d,s+shift,step-shift); memset(d+step-shift,v,shift); s+=step;d+=step; } } } void stereoCensus8x1(Mat& leftim, Mat& rightim, Mat& dest, int minDisparity, int range, int r) { if(dest.empty())dest.create(leftim.size(),CV_8U); Mat lim,rim; if(leftim.channels()==3)cvtColor(leftim,lim,CV_BGR2GRAY); else lim=leftim; if(rightim.channels()==3)cvtColor(rightim,rim,CV_BGR2GRAY); else rim=rightim; Mat limCensus,rimCensus; censusTrans8u_8x1(lim,limCensus); censusTrans8u_8x1(rim,rimCensus); Mat rwarp; Mat distance; vector<Mat> dsv(range); for(int i=0;i<range;i++) { shiftImage8u(rimCensus , rwarp,minDisparity+i); calcHammingDistance8u(limCensus,rwarp,distance); blur(distance,dsv[i],Size(2*r+1,2*r+1)); } Size size = dest.size(); Mat cost = Mat::ones(size,VOLUME_TYPE)*255; Mat mask; const int imsize = size.area(); for(int i=0;i<range;i++) { Mat pcost; cost.copyTo(pcost); min(pcost,dsv[i],cost); compare(pcost,cost,mask,cv::CMP_NE); dest.setTo(i+minDisparity,mask); } } void stereoSAD(Mat& leftim, Mat& rightim, Mat& dest, int minDisparity, int range, int r) { if(dest.empty())dest.create(leftim.size(),CV_8U); Mat lim,rim; if(leftim.channels()==3)cvtColor(leftim,lim,CV_BGR2GRAY); else lim=leftim; if(rightim.channels()==3)cvtColor(rightim,rim,CV_BGR2GRAY); else rim=rightim; Mat rwarp; Mat distance; vector<Mat> dsv(range); for(int i=0;i<range;i++) { shiftImage8u(rim , rwarp,minDisparity+i); absdiff(lim,rwarp,distance); blur(distance,dsv[i],Size(2*r+1,2*r+1)); } Size size = dest.size(); Mat cost = Mat::ones(size,VOLUME_TYPE)*255; Mat mask; const int imsize = size.area(); for(int i=0;i<range;i++) { Mat pcost; cost.copyTo(pcost); min(pcost,dsv[i],cost); compare(pcost,cost,mask,cv::CMP_NE); dest.setTo(i+minDisparity,mask); } }
15.
ハミング距離サンプル 画像Aと画像Bの各画素のハミング距離計測のサンプル(OpenCVによる実装) void
calcHammingDistance8u(Mat& src1, Mat& src2, Mat& dest) { if(dest.empty())dest.create(src1.size(),CV_8U); int i,j; uchar* s1 = src1.ptr<uchar>(0); uchar* s2 = src2.ptr<uchar>(0); uchar* d = dest.ptr<uchar>(0); for(j=src1.rows;j--;) { for(i=src1.cols;i--;) { *d = _mm_popcnt_u32((unsigned int)(*s1^*s2)); s1++;s2++,d++; } } }
16.
画像のCENSUS変換サンプル 9x1の横長の窓でのCENSUS変換.条件を満たしたら1とのbit orを取って, 次に備えてbit shiftしているだけ
void censusTrans8u_8x1(Mat& src, Mat& dest) { if(dest.empty())dest.create(src.size(),CV_8U); const int r=4; const int r2=2*r; Mat im;copyMakeBorder(src,im,0,0,r,r,cv::BORDER_REPLICATE); int i,j,n; uchar* s = im.ptr<uchar>(0);s+=r; uchar* d = dest.ptr<uchar>(0); for(j=0;j<src.rows;j++) { for(i=0;i<src.cols;i++) { uchar val = 0;//init value uchar* ss=s-r; for(n = 0;n<r;n++) { val = (*ss<*s) ? val|1 : val; ss++; val <<=1; } ss++;//skip r=0 for(n = 0;n<r;n++) { val = (*ss<*s) ? val|1 : val; ss++; val <<=1; } *d=val; d++; s++; } s+=r2; } }
Download