2018年6月23日土曜日

OpenCV Viz の Widgetのサンプル(その3)

OpenCVのVizにはどんなWidgetがあるのか?確認してみる。
全3回

WSphere(球体)

中心座標、円の半径、球体の面を指定。

  auto sphere = cv::viz::WSphere(cv::Point3d(0.0, 0.0, -2.5), // 中心
                                 2.0,                         // 半径
                                 30,                          // 球体の面
                                 cv::viz::Color::rose());     // 色
  myWindow.showWidget("Sphere", sphere);


WText(テキスト)

2次元平面にテキストを描画する。
視点を変えてもテキストの位置は変わらない。

  auto text = cv::viz::WText("OpenCV Viz",
                             cv::Point(100, 100),
                             20,
                             cv::viz::Color::black());
  myWindow.showWidget("Text", text);


WText3D(3Dテキスト)

3次元平面にテキストを描画する。
引数のface_cameraにtrue(常にテキストが見えるようになる)を指定すると初期表示位置がおかしい(falseを指定するとそんなことはない)。

  auto text_3d = cv::viz::WText3D("OpenCV Viz",	// 表示するテキスト
                                  cv::Point3d(1.0, 0.0, 0.0),	// 表示位置
                                  1.0,	// テキストのサイズ
                                  false,	// テキストが常に見えるようにするか?
                                  cv::viz::Color::black());
  myWindow.showWidget("Text3D", text_3d);


まだ、載せていないのがいくつかあるけど、ここまで

2018年6月22日金曜日

OpenCV Viz の Widgetのサンプル(その2)

OpenCVのVizにはどんなWidgetがあるのか?確認してみる。

全3回

WImage3D(画像)


cv::imreadで読み出しが画像を描画する。
vizの座標系はx軸が下なので、画像を180度回転して上げる必要がある(キャプチャはしていない)。

  auto im = cv::imread("./lena.jpg");
  auto image_3d = cv::viz::WImage3D(im, cv::Size2d(40, 40));
  myWindow.showWidget("Image3D", image_3d);




WImageOverlay(画像のオーバーレイ)

画像を3次元空間描画するのでなく、2次元の平面に描画。
視点をグリグリしても、位置は変わらない。
座標をcv::Rectで指定する(左下が原点になるので注意!)。

  auto im = cv::imread("./lena.jpg");
  auto image_overlay = cv::viz::WImageOverlay(im, cv::Rect(0, 0, 250, 250));
  myWindow.showWidget("ImageOverlay", image_overlay);



WPlane(パネル)

中心座標、平面の法線、Y軸の方向、サイズを指定する。
(色はネイビーなんだけど、ちょっと見た目が違う???)


  auto plane = cv::viz::WPlane(cv::Point3d(0.0, 0.0, 0.0),  // 中心座標
                               cv::Vec3d(1.0, 0.0, 0.0),    // 平面の法線
                               cv::Vec3d(1.0, 1.0, 0.0),    // Y軸の方向
                               cv::Size2d(3.0, 3.0),        // サイズ
                               cv::viz::Color::navy());     // 色
  myWindow.showWidget("Plane", plane);


WPolyLine(多角形)

頂点の座標の配列を指定する。
ぐるぐる

  cv::Mat polyline(1, 32, CV_64FC3);
  for (auto i = 0; i < (int)polyline.total(); i++)
  {
    polyline.at(i) = cv::Vec3d(i / 16.0, cos(i * CV_PI / 6), sin(i * CV_PI / 6));
  }
  myWindow.showWidget("Polyline", cv::viz::WPolyLine(polyline));



2018年6月21日木曜日

OpenCV Viz の Widgetのサンプル(その1)

OpenCVのVizにはどんなWidgetがあるのか?確認してみる。
3Dスキャナーで計算した3次元の点をOpenCVのVizで表示するための下準備。
チュートリアルにないものを抜粋。
ここを見れば良い。
https://docs.opencv.org/3.4.1/d1/d19/group__viz.html

全3回

WAllow(矢印)

始点、終点、太さを指定する。
 auto arrow = cv::viz::WArrow(cv::Point3d(1, 0, 0),        // 始点
                               cv::Point3d(1, 1, 0),        // 終点
                               0.01,                         // 太さ
                               cv::viz::Color::amethyst());  // 色
  myWindow.showWidget("Arrow", arrow);↲         


WCircle(円)

半径、中心座標、平面の法線、太さを指定する。
塗りつぶしたいときは、半径を半分にして、太さを半径と同じ値にする。
  auto circle = cv::viz::WCircle(1.0,                         // 半径
                                 cv::Point3d(0.0 ,0.0, 0.0),  // 中心
                                 cv::Vec3b(1.0, 0.0, 0.0),    // 平面の法線
                                 0.01,                        // 太さ
                                 cv::viz::Color::celestial_blue());
  myWindow.showWidget("Circle", circle);



WCone(円柱)

長さ、中心座標、先端座標、円の解像度を指定。
  auto cone = cv::viz::WCone(0.5,                     // 長さ
                             cv::Point3d(-1, -1, -1), // 中心
                             cv::Point3d(-2, -2, -2), // 先端
                             12,                           // 円の解像度(何角型か)
                             cv::viz::Color::chartreuse());
  myWindow.showWidget("Cone", cone);


WCylinder(円柱)

始点、終点、半径、円の解像度を指定。
両端は閉じていないので、WCricleを描画してあげる必要がある。
   auto cylinder = cv::viz::WCylinder(cv::Point3d(2.0, 2.0, 2.0),  // 始点
                                     cv::Point3d(3.0, 2.0, 2.0),  // 終点
                                     1.0, // 半径
                                     30,  // 円の解像度(何角型か)
                                     cv::viz::Color::maroon());
  myWindow.showWidget("Cylinder", cylinder);


WGrid(グリッド)

グリッドの平面を描画。
中心座標、平面の法線、Y軸の方向、グリットのマス目、グリット間の距離を指定。
  auto grid = cv::viz::WGrid(cv::Point3d(0.0, 0.0, 0.0),  // 中心座標
                             cv::Vec3d(-1.0, 1.0, 0.0),   // 平面の法線
                             cv::Vec3d(0.0, 1.0, 0.0),    // Y軸の方向
                             cv::Vec2i(10, 10),           // グリッドのマス目
                             cv::Vec2d(0.2, 0.2),         // グリッド間の距離
                             cv::viz::Color::lime());
  myWindow.showWidget("Grid", grid);


続く。

2018年6月17日日曜日

YOLOv3をFedora28+CUDAで動かしてみる

YOLOv3

YOLOとは、state-of-the-artsなリアルタイム一般物体認識。
詳細の説明は割愛。
今回は、Fedora28でYOLOv3を試そうとしたときにつまずいたポイントを紹介。

Fedora28でつまずいたポイント

darknetのビルドで、OPENCV、CUDAを有効とすると、ビルドエラーが発生。
環境は以下
  • CPU AMD Ryzen 7 1700
  • GPU NVIDIA GeForce GTX 1070
  • OS Fedora 28 
  • GCC 8.1.1
  • CUDA 9.1
  • OpenCV 3.4.1(ソースビルド)
ビルドエラーの内容と解決した方法について解説。
解決方法は公式の手順ではないので注意。

OpenCV

MakefileのOPENCVを有効にしてビルドすると、ビルドエラーが発生。
$ make
gcc -Iinclude/ -Isrc/ -DOPENCV `pkg-config --cflags opencv`  -DGPU -I/usr/local/cuda/include/ -DCUDNN  -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -DOPENCV -DGPU -DCUDNN -c ./src/gemm.c -o obj/gemm.o
In file included from /usr/local/include/opencv2/core/types_c.h:59,
                 from /usr/local/include/opencv2/core/core_c.h:48,
                 from /usr/local/include/opencv2/highgui/highgui_c.h:45,
                 from include/darknet.h:25,
                 from ./src/utils.h:5,
                 from ./src/gemm.c:2:
/usr/local/include/opencv2/core/cvdef.h:485:1: エラー: 不明な型名 ‘namespace’ です
 namespace cv {
 ^~~~~~~~~
-Wfatal-errors によりコンパイルを停止しました。
make: *** [Makefile:85: obj/gemm.o] エラー 1

原因は、darknetはOpenCVのC言語IFを呼び出しているが、OpenCV3系はC言語IFはサポートしなくなったためらしい。。。(ほんと?)
みんな、コンパイルできなくて困っている。。。
https://github.com/pjreddie/darknet/issues/485
https://github.com/opencv/opencv/issues/10963

解決方法

OpenCV2系をビルド・インストール
以下から2.4.13.6のソースをダウンロードしていつもどおりビルド。
https://github.com/opencv/opencv/releases/tag/2.4.13.6

ビルドする際の注意
あとは、darknetのMakefileでpkg-configでopencvを指定している箇所をopencv2に変更してビルドすればOK。


CUDA

CUDAのhost compilerはGCC 6以下がサポートしており、Fedora 28のGCC 8はサポートしていない。このため、CUDAを有効としてビルドするとビルドエラーが発生する。
In file included from /usr/local/cuda/include/host_config.h:50,
                 from /usr/local/cuda/include/cuda_runtime.h:78,
                 from <コマンドライン>:
/usr/local/cuda/include/crt/host_config.h:121:2: エラー: #error -- unsupported GNU version! gcc versions later than 6 are not supported!
 #error -- unsupported GNU version! gcc versions later than 6 are not supported!
  ^~~~~

解決方法

host compilerにGCC 6以下を指定する。
MakefileのNVCC=nvccに-ccbinオプションでコンパイラを指定。
gccは5.5をソースビルドしたものを使用。

結果

darknetのサンプルファイル"data/kite.jpg"で確認


Model
Build option
Prediction time
(seconds)
Prediction time
(milliseconds)
FPS
GPUCUDAOPENMP
YOLOv31100.03365633.729.7
YOLOv3-tiny 1100.0062996.3158.8
YOLOv30007.9802647980.30.1
YOLOv3-tiny 0000.729358729.41.4
YOLOv30012.3087572308.80.4
YOLOv3-tiny 0010.286995287.03.5
GPUありのYOLOv3で約30fps。早い!