SlideShare a Scribd company logo
画像処理ライブラリOpenCVで
出来ること・出来ないこと
名古屋工業大学
福嶋 慶繁
http://fukushima.web.nitech.ac.jp/
セッション番号I-6
2016/10/14 Design Solution Forum 2016
経歴
– 2004 名古屋大学 卒業(村瀬研究室)
– 2009 名古屋大学大学院 博士課程 修了(谷本研究室)
– 2009 名古屋工業大学 助教
– 2015 名古屋工業大学 准教授
– http://fukushima.web.nitech.ac.jp/
著書,記事など
– コンピュータビジョン~アルゴリズムと応用
– Qiita:OpenCV Advent Calendar 2015
– OpenCV.jp(の一部)
略歴 2
専門
– 画像処理
• 画像符号化,映像符号化
• 画像のノイズ除去
• エッジ保存平滑化フィルタの高速化
– 3次元画像処理
• ステレオマッチング
• 任意視点画像合成
• デプスマップのデノイズ
• デプスセンサのキャリブレーション
• マルチカメラアレイ
• AR,VR
– 並列画像処理
• 画像処理のベクトル化・並列化
• 画像処理コンパイラ
略歴 3
OpenCVは,オープンソースの画像処理ラ
イブラリとしてデファクトスタンダートの
地位を確立しています.
また,Java, Pythonへの拡張やAndroid,
iOSへの対応など,クロスプラットフォーム
なライブラリとして,ますます存在感を強
めています.
本講演では,このOpenCVを使って何がど
こまで出来るのかを,アルゴリズムを使う
立場からとアルゴリズムを開発する立場か
らの両面から話します.
発表概要の抜粋 4
イントロダクション
5
コンピュータビジョンのオープンソースラ
イブラリ
世界でもっとも使われてるオープンソース
の画像処理のライブラリ
–10Mダウンロード
–500K+行のコード
Open Computer Vision (OpenCV) 6
公式
–C++
–Python
–Java
–Matlab
–C(サポート対象外)
非公式
–C#, Go, Processing, Lua, Ruby, PHP, Haskell, etc…
–https://github.com/atinfinity/lab/wiki/OpenCV-
binding%E3%81%BE%E3%81%A8%E3%82%81
対応言語 7
デスクトップ
–Windows
–Linux
–Mac OS
–FreeBSD
モバイル
–Android
–iOS
–ARM Linux
プラットフォーム 8
OpenCVの歴史 9
OpenCV Started
Alpha Release at CVPR 2000. Windows only.
Beta 1. Linux support
Release 1.0 Release 1.1
Release 2.0. C++
Release 2.1. Full Python support
Release 2.4 LTS
Release 2.2. Android Support
Release 3.0
Refactored
Willow
Support
OpenCV
Foundation
Intel
Support
Google Summer of
Code
Nvidia
Support
Renewed
Intel Support
Release 2.3. GPU Support. Modules
Magic Leap
Development
team has moved
to Itseez
1997 前身であるIntel Processing Library (IPL)の登場
2000 OpenCV alpha
2001~2005 OpenCV betaが5つ
2006 OpenCV 1.0
2008 Willow Garageがサポート, OpenCV 1.1pre
2009 OpenCV 2.0
2015 Itseezに移管,OpenCV 3.0,OpenCV3.1
2016年 IntelがItseezを買収
現在:OpenCV 3.1(2015-12-21)
OpenCVの歴史 10
これまでの「ずっと枯れないライブラリ」
という評判を一新するために
OpenCV+Contribに分離
– OpenCV:枯れたアルゴリズム.本体がコミット
– Contrib:最新のアルゴリズム.各自がコミット.
開発モデルの変更 11
OpenCV
2.x
OpenCV 3.x
contributions
OpenCV
3.x
外部ライブラリで速くする
マルチコア並列化をする
SIMDベクトル化をする
CUDA(GPU)を使う
OpenCL(GPU)を使う
アクセラレータ1 12
CPU
– IPP-ICV: OpenCV3.0からロイヤリティフリー
– HALモジュール:ハードウェア最適化
– Universal Intrinsics:NEONとSSEの一般化
– Parallel_for_:マルチコア並列化の一般化
GPU
– CUDA
• 独自実装
• NVIDIA 実装の関数群のラッパー
– OpenCL
• Transparent API (T-API)
• UMatを使えば,実行ファイルが自動でGPU,CPUの切り替えを行ってくれ
るexeを作成可能に.
• おまけ:OpenCLの独自カーネルが書きやすい.
アクセラレータ2 13
Intelから無償提供された,画像処理ライブ
ラリIntel Performance Primitive (IPP) のサブ
セットで,様々な処理が高速化する
–例えば,OpenCVのネイティブFFTは相当遅い
IPP-ICV 14
現在100個程度の関数をカバー
CPUを1として何倍高速化したか?
T-APIのパフォーマンス 15
CPU - AMD A10-6800k, iGPU - HD8670D, dGPU - Radeon HD7790
Mat
–基本
–参照カウンターによるメモリ管理により明示的に
開放する必要がない
–関数を使うだけなら確保する必要もあまりない
Umat
–OpenCLが使えるときは,GPUを使うようになる
Mat
gpuMat
–CUDAをつかって開発したもの
–NVidiaが提供した関数をラップしたもの
MatとUMatとgpuMat 16
まだ,全てをやってはいけません!
–OpenCLはiOSやAndriod, Windows Phoneで公式
サポートされていない
–大きな画像や複雑な画像以外は,コピーのオー
バーヘッドが大きすぎます.
• メディアンフィルタはFullHDくらいで初めて
OpenCLが早くなる
• Farnebackオプティカルフロー推定は480pですら
OpenCLが早い
–CPUのコードとOpenCLのコードの結果がまだ
違ったりする.
すべてUMatにすべきか? 17
そもそも誰がRGBが正しいと決めたんだ?
– 昔はRGBとBGRどちらも良く使われていた.
• OpenCVの大元は,Intel Processing Library(1997)
– 波長的にはBGRでは?
– WindowsのビットマップはBGR順
でも,実はOpenCVのコード自体も間違っている
ことも...
– cvtColor(src, dest, COLOR_BGR2YUV)
• このコード,公式がRGBとBGRを間違えている.
OpenCVはなぜBGR? 18
使う・アプリを作る
~モジュールの詳解~
19
データ構造,行列演算 (core)
基本的な画像処理 (imgproc)
画像入出力,符号化 (imgcodecs)
カメラ,映像入出力 (videoio)
簡易GUI (highgui)
3次元可視化 (viz)
形状マッチング (shape)
動きベクトル推定,特徴点追跡
(video)
カメラキャリブレーション・ステレ
オマッチング,ポイントクラウド
(calib3d)
コンピュテーショナルフォトグラ
フィ・デノイズ・HDR (photo)
パノラマ生成 (stitching)
手振れ補正 (videostab)
超解像 (superres)
機械学習 (ml)
特徴点・特徴量計算
(features2d)
物体検出 (objectdetect)
多次元空間のクラスタリングや
サーチ問題 (flann)
CUDA使った高速化関連モジュー
ル(cudaarithm, cudabgsegm,
cudacodec, cudafeatures2d,
cudafilters, cudaimgproc,
cudalegacy, cudaobjdetect,
cudaoptflow, cudastereo,
cudawarping, cudev)
出来ること(OpenCV 3.x) 20
※モジュール単位で記述:分解の粒度は開発した時期で分類によるのでばらばら.
 ARマーカー (aruco)
 背景セグメンテーション (bgsegm)
 知覚モデルに従う処理 (bioinspired)
 キャリブレーションパタンのカスタム (ccalib)
 ビジュアルデバッガ (cvv)
 様々なデータセットをダウンロード(datasets)
 ディープラーニング (dnn)
 デフォマブル パートモデル (dpm)
 顔認識 (face)
 ファジー (fuzzy)
 Hdf5フォーマット (hdf)
 線記述子 (line_descriptor)
 Matlab連携ブリッジ (matlab)
 オプティカルフロー推定 (optflow)
 グラフプロット (plot)
 画像のレジストレーション (reg)
 RGB+デプス処理 (rgbd)
 顕著性マップ (saliency)
 ストラクチャーフロムモーション (sfm)
 ステレオマッチング (stereo)
 カメラープロジェクタ用パタン投影 (structured_light)
 3次元点マッチング (surface_matching)
 文字認識 (text)
 トラッキング (tracking)
 拡張特徴量計算モジュール (xfeatures2d)
 拡張画像処理モジュール (ximgproc)
 拡張物体検出モジュール (xobjdetect)
 拡張コンピュテーショナルフォトグラフィモジュール
(xphoto)
出来ること(OpenCV Contrib.) 21
BMP
PPM・PGM・PBM
JPEG
JPEG2000
PNG
TIFF
OpenEXR
WebP
画像入出力,符号化 (imgcodecs) 22
「豊富な画像入出力」
IOのための追加コードが
ほとんど必要ない!
豊富なUSBカメラからのIO
Kinect,CREATIVE SENZ3DからのIO
動画像からの入力,保存
–MPEG1,2,4,H.264, H.265, …
カメラ,映像入出力 (videoio) 23
画像表示が1行:imshow
トラックバーをつけることが出来る
Qtを使った拡張をするともっと便利に
–画値値表示,保存,ズーム,ボタン追加など
簡易GUI (highgui) 24
デフォルト With Qt
色変換
閾値処理
フィルタリング
2値画像処理・モルフォロジー演算
セグメンテーション
ヒストグラム処理
拡大縮小・幾何変換
構造解析,形状記述子
基本的な画像処理 (imgproc) 25
ニューラルネットワーク(ANN)
サポートベクターマシン (SVM)
期待値最大化法 (EM)
決定木 (DTrees)
ブースティング木 (Boost)
ランダムフォレスト (RTrees)
K近傍法 (KNearest)
ロジスティック回帰 (LogisticRegression)
単純ベイズ分類器 (NormalBayesClassifier)
機械学習 (ml) 26
テンプレートではなく形のマッチング
形状マッチング (shape) 27
~0.5~157
3次元処理 (calib3d) 283次元処理 (calib3d)
ステレオマッチング
3次元処理 (calib3d) 29
3次元ポイントクラウドの可視化
OpenCVをvtkと一緒にコンパイルする必要
有
3次元可視化 (viz) 30
コンピュテーショナルフォトグラフィ(photo) 31
入力画像 詳細強調
エンピツ画風アニメ調
コンピュテーショナルフォトグラフィ(photo) 32
High Dynamic Range Imaging (HDRI)
ArUco: a minimal library for Augmented
Reality applications based on OpenCV
OpenCVベースのシンプルなARツール
ARマーカー (aruco) 33
https://www.youtube.com/watch?v=CzD48UkGsK8
画像からの文字認識
–文字検出
–文字認識
• HMMベース
• tesseract-ocrのラッパー
文字認識 (text) 34
CaffeとTorchのラッパー
ファイルIOで間接的に操作しているだけ?
今のところ,あえてOpenCV使ってdnnをす
る理由がない.
ディープラーニング (dnn) 35
SIFTとSURFはcontribにある!
特許による問題を回避するため?
拡張特徴量計算 (xfeatures2d) 36
画像の様子が状態ごとに追えるデバッガ
–Qt5とopenGLが必要
–OpenCV3プログラミングブックにも詳しい解説
–何かコミットするたびに,よくコンパイルがこ
けている...
ビジュアルデバッガ (cvv) 37
1D/2D グラフプロットモジュール
その他
–私が公開しているライブラリOpenCPにもプ
ロッターは付いてくる
• https://github.com/norishigefukushima/OpenCP
–Pythonで使えるプロッターであるmatplotlibと
C++を連携するmatplotlib-cppでもいい
• https://github.com/lava/matplotlib-cpp
グラフプロット (plot) 38
OpenCVが苦手なこと1
数値計算
–SVDがfloat入力,float出力 ->丸め誤差大
–PCAがfloat入力,float出力 ->丸め誤差大
–行列の分解の精度
最適化計算
–ニュートン法すら無かった
機械学習
–古典的な基本は十分そろえているが,最新のもの
のサポートは不十分
–Pythonの充実ぶりに比べると...
• 必要なら別のライブラリを使うほうが良い
39
OpenCVが苦手なこと2
アルゴリズムの改良
–研究用,開発用に,コードをマイナーチェンジ
すること
–最適化がかなりかかっており,コードの可読性
が低い
–類似したアルゴリズムが再利用できる形でクラ
スが設計されていなかった
研究者による最新のアルゴリズムの実装
–多くはMatlab, Pythonなどで実装
–C++かつ最適化したコード生成は大変
40
今後に期待~少しづつ強化中
Coreへ最適化アルゴリズムが追加など
– 共役勾配ソルバ
– 滑降シンプレックスソルバ
– リニアプログラミングソルバ
Algorithmクラスの導入
– 基底クラスを導入して類似したアルゴリズムをまとめる仕組
みを導入
機械学習モジュールのリファクタリング
– 3.0から一気に使いやすく.
HALモジュールの追加
– 独自実装や外部ライブラリで数値計算を強化
Contrib環境の整備
– 積極的なコミットや,Google Summer Codeには注目
41
Matlab
メリット
–行列演算がパワフル
–最適化ツールボック
ス
–ドキュメントがそ
ろってる
デメリット
–高価
–遅い
OpenCV
メリット
–速い
–更新も早い
–オープンソース
デメリット
–数値計算が弱い
–C++の障壁
• Pythonを使えばOK
–ドキュメントが弱い
–バグが避けられない
Matlab vs OpenCV 42
OpenCVモジュール開発
~高速に動かすために~
43
関数やMat同士の演算だけで終われないか
考える
–Matの同士の演算や関数は高度に最適化されて
いる.
外部ライブラリとOpenCVを連携させる
–EIGENなどは変換用の関数が容易されている.
Github等を探して実装を探す
–研究者がC++で書いている場合もわずかにあり
ます.
関数の組み合わせで作る 44
Matlab:商用.行列演算ライブラリ
FFTW:FFTライブラリ
Eigen:高速な行列演算ライブラリ
–#define EIGEN_NO_DEBUGで高速化
Intel MKL:インテルの数値計算ライブラリ
Intel IPP:インテルのマルチメディアライ
ブラリ
その他のライブラリ1 45
Dlib
–機械学習ライブラリ,顔認識など
VLfeat
–特徴量,セグメンテーション
Image Processing Online
–http://www.ipol.im/
–画像処理の実装の論文誌.必ずコードが付いて
いる
–かなりの量のコードが公開
その他のライブラリ2 46
OpenCV
–parallel_for_:並列化プログラミング
–AutoBuffer:メモリ周りの高速化
–universal intrinsics:画素操作のベクトル化
早いコードを書くために 47
*Pythonによるコンピュータビジョンの入門書です.
書いてPythonによるCVを習得するには非常におすすめな本です.
「forループでピクセルを操作し行列を計算する時代でもありません。」
~実践コンピュータビジョン*の書籍詳解より
並列プログラムを書くためのライブラリ,
がOS,コンパイラに応じてたくさんの種類
があるため,それらをバックエンドとする
抽象化した並列化プログラミングの記述方
式
–GCD (OSX, iOS), OpenMP, Pthreads (new in 3.0),
TBB, Concurrency (Windows, WinRT), C=
–cv::Mutex を使えば,map-reduce も作れます.
マルチコア並列化parallel_for_ 48
オートバッファ
–Mallocよりも100倍速い(時もある)
–型安全でクロスプラットフォームなalloca
–バッファは,関数内のスコープでのみ有効
alloca + malloc = AutoBuffer<> 49
using namespace cv;
void foo()
{
AutoBuffer<float> buf;
…
buf.allocate(n); // allocate buffer for n floats on stack or, if n is big, on the heap
float* bufptr = buf;
…
} // buf is invalid at this point
…
AutoBuffer<float, 100> buf(n); // allocate on stack if n<=100
…
閾値を用いて,ヒープとスタックを切り替えてもOK
Matなど,OpenCV固有のものを使わない独立
したスタティックライブラリとして構築予定
CPUだけに対応
サードパーティのオープンソース,クローズ
ドソースのアドオンとして追加
–EIGEN,BLAS, FFTW, FastCV, OpenVXなど?
–もし,Intel MKLが取り込まれたらかなり解決?
対象とする範囲は,例えば,
–高速なLU分解,コレスキー分解がしたい
–高速にexp, log, sqrt, sinが計算したい
HAL 50
画像処理専用プログラミング言語
–http://halide-lang.org/
–C++と一緒に使う(チューリング非完全).
–アルゴリズムとスケジューリング部が独立
–アルゴリズム部で抽象的な画像処理を書く
–スケジューリング部で具体的な画素の操作につい
て任意の単位で,ベクトル化,並列化,キャッ
シュブロッキングをスケジューリングする
–商用OKなMITライセンス
高速なコードを書くためには非常におすすめ.
ただし,日本語情報はほとんどない.
Halide 51
3x3ボックスフィルタの例
インテグラルイメージ使ったら,
「これ以上速くできない.世界最速だ」
とおもってませんか?
Halide 52
3x3ボックスフィルタの例
–タイリング,ベクトル化,並列化のありとあら
ゆるパターンが簡単に記述できるため限界まで
簡単にコードが最適化可能
–指定したとおりのC++コードを自動生成
Halide 53
Halide 54
このコードと同じ命令が生成される!
Halideチュートリアルのスライドより
"We should forget about small efficiencies, say about 97% of the time:
premature optimization is the root of all evil. Yet we should not pass up
our opportunities in that critical 3%”
Donald Knuth
… especially when you are doing computer vision on a cell phone
OpenCV team
Questions?
CVPR 2015チュートリアルより
OpenCVはいろいろできる
高速化をサポートする様々な機能がある
でも真に速いコードはHalide使ったほうが
いいかもね.
–画像処理コンパイラ,画像処理デバッガの研究
を一緒にやる人募集しています.
まとめ 56
参考書・参考URL
57
OpenCV入門(Build INSIDER)
– http://www.buildinsider.net/small/opencv
– 入門向けの記事
電子情報通信学会総合大会PRMU研究会企画セッ
ション:OpenCV 3.0 ― コンピュータビジョンを簡
単化するライブラリ
– http://www.ieice.org/~prmu/jpn/ieice2016.html
– 本:OpenCV3プログラミングブックの著者の一人です.
OpenCV.jp
– http://opencv.jp/
– 担当者が忙しいため,2.2くらいで更新がほぼ停止.
– マニュアルの英語がどうしても読みたくない人用
日本語情報 58
http://tessy.org/wiki/index.php?%3AOpenC
V
atinfinity/lab/wiki/OpenCV
–https://github.com/atinfinity/lab/wiki/OpenCV
eiichiromomma/CVMLAB
–https://github.com/eiichiromomma/CVMLAB/wi
ki/OpenCV
OpenCV備忘録
–https://iwaki2009.blogspot.jp/
日本語情報 59
詳解OpenCV
一番詳しい本の翻訳.教科書用.
–ただしOpenCV1系の記述
–入門書ではない
3系の新しいものが今年12月に発売予定
–ただし,英語
–途中までの電子版は,
今でも購入可能
–発売がのびのびなので
12月かは怪しい
Pythonによるコンピュータビジョン入門書
OpenCVに限定しているわけではない.
原著のpdfのゲラは公開されている
–Programming Computer Vision with Python
–http://programmingcomputervision.com/
実践 コンピュータビジョン 61
OpenCV3プログラミングブック
すでに使ったことがある人に対してもっと
こんな使い方があるよと提示する内容の本
–2系からの以降ガイドがすこしある一番詳
–環境構築について30ページくらい
• Webの最新版のほうが参照する価値は高い
–残りはサンプルコード,デモコード-
3と違ってサンプルコードが2系
コンセプトは3と同じでいろいろなサンプ
ルコードを列挙するスタイル
ただし簡単な逆引きが付いているため便利
だった
–OpenCV.jpにも付いている
OpenCV2プログラミングブック 63
非常に簡単なコードが貼り付けてあり,そ
の説明がある
–画像処理初心者用.
–今までOpenCVに少し触ったことがある人はほ
ぼ必要ない
UMatについて詳しい
–ただし初学者にUMatをあえて進める理由がな
い.
–OpenCLの独自カーネル記述が詳しい.
OpenCV3基本プログラミング 64

More Related Content

画像処理ライブラリ OpenCV で 出来ること・出来ないこと