Upgrade to Pro — share decks privately, control downloads, hide ads and more …

C++で意識高い系開発 / hipster-c++

C++で意識高い系開発 / hipster-c++

Explanation "How can u be a Hipstster with C++"

8c44ccf4c1a1bdf82fb6a8ed37ff8736?s=128

shun74

June 23, 2022
Tweet

More Decks by shun74

Other Decks in Programming

Transcript

  1. C++で意識高い系開発 4年 Shun74

  2. どうしてこうなったのか 目標: 3DセンサーのKinect V2から取得したRGBD画像またはPointCloudから平面を 検出する. ⇒まずPoint Cloud Libraryの関数を使って処理をある程度行う操作を書いた. ⇒必要な操作で実装されていないものがあったのでせっかくだから自分で実装. ⇒あまりにもショボかったので意識を高めて飾りつけをしまくったら,

    非C++開発者から 見て立派な開発に見えるものが多分できた. ⇒しかしC++開発者から見ると明らかに浅いので意識高い系になってしまった. ⇒そこで今回は, どのように意識の高さを演出したか紹介.
  3. Point Cloud? Kinect V2? Point Cloud(点群)はDepthセンサーから取れた距離画像 に座標系の変換を行って 3Dデータ化したもの. これを使う と例えばUnityなどに現実の空間をそのまま転写すること

    ができる. 今回は取れた点群データから平面の検出を行 う. ←RGBデータ付きPoint Cloud 参考: ポイントクラウドとは? KinectシリーズはMicrosoftが開発しているRGB+Dセ ンサーでV2は2013年から販売されている二代目モデ ル. 現在は小型で高性能な Azure Kinectが最新モデル として販売されている . 今回はこれを使って点群データを取得する . 参考: なぜKinect V2は失敗したのか。
  4. Supervoxel Clusteringとは 参考: Point Cloud Library公式チュートリアル 点群の色, 距離, 法線の情報を使って一定の領域ごとにクラスター化するアルゴリズム .

    今回実装したRegion Mergeはこのクラスターを最小単位として結合を行っている .
  5. プログラムの流れ 1. Depth画像&RGB画像またはPointCloudを入力してオリジナルのPointCloudを作成. 2. pclのsupervoxel_clusteringを使ってPointCloudをsupervoxel化する. 3. supervoxelsの各クラスターが保持している法線ベクトルと中心点の座標を元に, 個人で 実装したRegionMergeを行う. 4.

    RegionMergeの結果を元にsupervoxelsの全体の点群に対してラベルを付替える.
  6. Region Mergeの前処理 1. サンプリングが一定数より少ないクラスターを除去する . (アルゴリズムの安定化) 2. 全体の点群に対してクリッピングを行う . (処理の高速化)

    3. 各クラスターごとに他のクラスターとの中心距離を順序付きリストにして保存する . 4. 各クラスターごとに中心座標,法線ベクトル,クラスター内の点の数を保存. 5. 残っているクラスターを記録するリストを初期化 . (全クラスターのラベルを登録) ※以降「クラスター」を「ラベル」と表記
  7. Region Mergeのアルゴリズム 1. 残っているラベルのリストを先頭から取り出す . 2. 取り出したラベル1の距離リストから他ラベルを先頭から取り出す . 3. 取り出した他ラベル2との距離が一定以上であればbreakして1.の次のラベル1に移行.

    4. ラベル1と他ラベル2の法線ベクトルに対してコサイン類似度を計算して値が一定未満であれば continueして2.の次の他ラベル2に移行. 5. ラベル1を他ラベル2側に結合する: クラスターの大きさを使った重み付き平均で他ラベル 2の法 線ベクトルと中心座標を更新. 他ラベル2の子供リストにラベル1を追加. ラベル1に子供リストが あればこれも追加後削除する. 全体の距離リストに対してラベル 1と他ラベル2の情報を削除し て,新しい他ラベル2との情報を追加する. 残っているラベルのリストからラベル 1を削除する. 6. 距離リストの更新が行われたので最初から 1.をやり直す. 7. 1.のループで更新が一度も起きなければ結合が完了しているのでアルゴリズムを終了する .
  8. 実行結果 ※実行時間は800~2000ms(点群とクラスターの数によって変化 )

  9. 意識を高く見せるテクニック 複雑化する 1. ファイル, フォルダの分割をしまくる. 2. 抽象化しまくる(クラス化, 関数化). 3. 無駄な機能をつけまくる.

    それっぽくコードを書く 1. 波括弧の位置をきもい※1 場所にする. 2. using namespace std; をやめる. 3. namespaceを使う. 4. 名前を長くする. 5. コメント, 改行をしまくる. レポジトリをそれっぽくする 1. 全部英語(DeepL)で書く. 2. OSSを参考にしてREADMEを書く. 3. よくわかんないけどCMakeを使う. 4. よくわかんないけどMITライセンスを入れる. ※1 主観です
  10. 複雑化してプロジェクトの規模を誇張する フォルダ, ファイルがたくさんあって規模が大きそうに見えれば大したことがないプロジェクトでも凄そ うに見える. プログラム内でもできるだけ記述を増やす . フォルダ構成: src, output, sample,

    config などにフォルダを分割して規模を大きく見せる . ファイル が一個しか入ってないフォルダがあっても ok. 抽象化: プログラムのファイル分割に伴って (本当はよろしくないが)utils, loaderとして短い簡単な処 理を行う関数を大量に作成. 第三者が簡単に読もうと思えないことでそれっぽさを保つ . 無駄機能: 無駄機能としてconfigを読み込むクラスを実装した. 副産物としてconfigを保存してお く.confファイルを追加することができた . ちなみに .confファイルは別に.txtファイルと何も変わらない. それっぽい拡張子を付けることで威圧感を出す .
  11. 複雑化例 (よくわかんないけどなんかすごそう! )

  12. コード整形で玄人感を出す これはもはや宗教の問題でもあるが , 玄人は初心者では絶対にやらないような書き方をしている場 合がある. 可読性が落ちる場合もあるがそれっぽさが出れば何でもいいのでやれることはやる . using namespace std;:

    これを書かないと色んな関数にstd::を付ける必要が出てくる. C++っぽい 記述がたくさんできてそれっぽさが増す . namespaceを使う: これを使えば ”〇〇::関数名” のようにクラスや関数の前に名前空間の記述を 増やすことができる. C++っぽさとそれっぽさが増す. 名前を長くする: 関数名, 変数名は意味が一発で分かるレベルまで長くしてもいい . 読む気が失せる のと同時にそれっぽさが増す. コメント改行をしまくる: 特にmain.cppはなにかやるごとにコメント付けて空行入れる . 可読性が良く なって読まれる可能性が上がってしまうが , ちゃんとやってる感が出る.
  13. コード整形例 (波括弧がよくわかんない位置にあってなんかすごそう ! std::って書いてあってしっかりやってそう !)

  14. レポジトリでガチな雰囲気を出す 意外とREADME.mdをさぼってるプロジェクトは多い. 手順を明確化することで使用者を コードから遠ざけて読まれる可能性を減らす. 全部英語で書く: 今の時代DeepLがあれば楽勝. 専門用語の扱いだけ気を付けながら できるだけ詳細に書く. それっぽさが出る. OSSを参考にしてREADMEを書く:

    色々なOSSを参考にして盛り込める項目は全部盛 り込む. 規模が大きく見えるのでそれっぽさが出る. よくわかんないけどCMakeを使う: CMakeを使うための説明を追加することができる. あ まり一般的ではないライブラリのインストール手順の説明も盛り込むことができる. 素人 にはよくわからない, なんかすごそうなCMakeLists.txtというファイルを作ることができる.
  15. レポジトリ例 (全部英語で必要な環境とか使い方のサンプルが書いてあってなんかすごそう !)

  16. まとめ まずC++を流石に1ミリは理解しておく. (クラス, ポインタが分かれば〇) 本体が薄っぺら過ぎても頑張ればなんとかなる. 複雑化で素人に規模がそれなりに大きいと錯覚させて凄いと思わせる. C++っぽい書き方を増やすことで非C++使用者になんか凄そうだと思わせる. それでもC++開発者には結局簡単に読まれてしまう. ☜重要 (開発者からも凄いと思われるレベルはそもそも意識高い系ではなく,

    ただの凄い開発に なってしまう.) (GitHubの方も見てね↓) plane-segmentation-from-supervoxel