arutema47's blog

書いたり書かなかったり。

CES2024で発表されたLiDARのまとめ

大遅刻ですが、LiDARアドベントカレンダーの記事です。

CES 2024でもたくさんLiDARが発表され、各社大きく性能を伸ばしています。

なんで各社横並びで性能向上できたかは。。今年中に情報解禁されるんじゃないでしょうか。

Valeo Scala3

news.yahoo.co.jp

youtu.be

www.valeo.com

OEMメーカのため詳しい性能はオープンになっていないが、中国lidar導入は難しい日系OEMにとっても本命の一つか。

SCALA2に比べると10倍の解像度向上を達成しており、解像度は水平垂直共に0.05度らしい。

s

% HesaiやRobosenseの同解像度品と比べるとかなり粗く見えるのは気の所為?

Robosense M3

www.youtube.com

www.robosense.ai

  • 解像度0.05度、10%反射率物体の検知距離300m
  • 940nm VCSEL
  • Class 1 eye safetyを達成しつつ、250mを超える検知距離を達成。
  • 250m超えは1550nmレーザを用いるlidarしか達成できないと思われてきたが、そのブレイクスルーを達成とのこと。
  • 発売時期は恐らく2025年?
  • M1と同様に、非対称スキャンを行うMEMSミラーシステムを採用
  • そのため中央の点群が非常に密で、中心から離れるほど点群が疎になっていく
  • 中心は1000ライン相当くらいありそう?

LiDARは1550nm帯を利用するものと、900nm帯を利用する2つの製品がせめぎ合っており、その概況をわかりやすくまとめた記事がForbesから出ています。 是非一読してみると良いかと。

  • 1550nm帯はシリコンレーザと受信機が使えないため、コストは高くなってしまう
  • 一方で出せるレーザ強度が上がるため、より遠距離かつ誤差の少ないLiDARが実現可能
  • と思われてきたが、今年になってコストで優れる900nm帯LiDARが性能で猛追している

www.forbes.com

Hesai AT512

www.hesaitech.com

www.youtube.com

  • 512ライン相当という化け物スペック
  • 300m 10%反射率とM3と同等の性能
  • こちらは対称スキャンなので、FOV内で点群密度は一定に見える

Kaggleで勝つMeme技術

Kaggleアドベントカレンダー2023の5日目です。6日目はtakamiさんです。

Memeについて

Kaggle Memeの代表

Memeは、インターネット文化の中で発展した一種の情報伝達手段です。

要は海外版クソコラです。

主にアニメや映画のワンシーンなどが使われます。

KaggleにおけるMeme

KaggleのDiscussionでも主に煽り感情豊かな情報伝達にMemeは使われてます。

Memeで取ろうDiscussionメダル

DiscussionメダルはMemeを貼ることでも稼げます。

例えば疲れ果てたKagglerが定期的に立てるMeme threadはメダルを稼ぐ絶好の機会です。

原理的にはMemeを貼り続けUpvoteを得ることでKaggle (Discussion) GrandMasterになれます。

とはいえ、コンペの流れや本質を付き、ユーモア溢れるMemeを作らないといけないのでMemeメダルも簡単ではありません。

Meme技術を鍛えて是非Kaggle称号を目指してください

LLM Science ExamのMeme Thread

Meme金メダルの例

VentulatorコンペのMeme Thread

頻出Memeを抑える

Kaggleで過去コンペ復習が重要なように、Memeの元ネタがわかっていないようではMemeマスターにはなれません。エアプダメゼッタイ

ネタがわからないMemeが出てきたらKnow Your Memeでまず調べましょう。ニコニコ大百科みたいなものです。 knowyourmeme.com

また検索クエリがわからないことも多いかと思います。

例えばこのDrake Memeは頻出ですが、日本人にとっては馴染みが少なく調べる取っ掛かりも少ないです。

ChatGPT4であればMemeにも詳しいので、画像の元ネタをそのまま聞いてしまうのも手です。

メメって読むの?

Memeの作り方

僕はmeme作成にimgflipを使用しています。

既にpopularなmemeは用意されており、あとは文字を入力するだけとなっています。

あとは渾身のmemeをdiscussionに叩き込みましょう。

imgflip.com

SIIMでMeme銀メダルを取る筆者

学習が何で律速してるか、把握してますか?

(最新SSD IOはPCIe x4でした。ご指摘ありがとうございます。)

はじめに

Kaggle Advent Calendar 2022 8日目です。

突然ですが、あなたはDNN学習時にどの処理で学習速度が律速しているか把握してますか?

DNN学習には図に示すように大きく3つの要素があります:

  • (SSDからの)データ読み込み
  • (CPUによる)データ前処理
  • (GPUによる)DNN計算

学習時のデータの流れとしては

  1. SSDからデータが読み込まれ、CPUに送られる(SATA or PCIe)
  2. CPUにてaugmentationや正規化などの前処理が行われ、GPUにデータが送られる(PCIe x16)
  3. GPUにてDNNの計算・学習・パラメータ更新が行われる (GDDR)

というのが一般的かと思います。

ここで各データ通信に使われるインターフェース(IO)に注目してみましょう。

まずGPUとGPUメモリ(GPU内DRAM)間通信はGDDRというメモリIOが使われ、その速度は非常に早いです(A6000なら600GB/s)。 またCPU-DRAM間もDDR4といったメモリIOで数10GB/s出ており、CPU-GPU間の通信はPCIeが16束になったPCIe x16というIOでこれも高速です。 対してSSD-CPU間は普通のPCならSATA、最新PCならばPCIe x4で接続されるのが一般的です。

特にSATAは他のDDR系に対して最悪2桁ほど通信が遅く、注意しないとデータ読み込みで容易に速度が律速してしまうのがわかるかと思います。 またHDDを使っているとSSDより読み出し速度は1/3程度になってしまうので使うのは問題外です・・

GPU処理に関する高速化などの記事は大量にある反面、データ読み込みやデータ前処理の高速化の速度律速についてはあまり語られていない気がします。

この記事を読むことで

  • 自分の学習が何で律速しているか把握できるように
  • データ読み込みや前処理の高速化
  • 学習高速化してより早く多く実験を回す

ようになるきっかけとなれば良いと思います。

どの処理で律速しているか調べる

僕は学習を回したら

  • 1) GPU使用率を調べる
  • 2) CPU使用率を調べる

の2つを見ます。

まずステップ1といてnvidia-smiを叩いてみましょう。

このGPU使用率が具体的に何を指しているかは今回省きますが、 ここでGPU使用率が100%になっていればGPU律速になっており、データ読み込みやデータ前処理に問題はありません。

ただこの使用率が20~60%と低い値になっている場合、GPUは半分以上の時間データを待っているだけであり、データ読み込みかデータ前処理に処理が律速されていると考えられます。

次にステップ2として、htopなど叩いてみてCPU使用率を見てみましょう(windowsならタスクマネージャーで見れます)

CPU利用率が高い場合(全コア使用されている)、データ前処理で処理が律速されています(CPU律速)。 kaggle notebookはCPUが貧弱(2コアしかない)ため、頻繁にCPU律速が起きてしまいます。 ただpytorch dataloaderでnumber_of_workerを設定していない場合は全コアを使用してくれません。自分のコア数程度にworker数を設定して前処理速度を高めましょう。

一方でGPU律速でもCPU律速でもない場合、データ読み込みが全体を律速している可能性があります。 上記でも書いた通りSSD⇨CPUのIOは貧弱であり、あまり多くのデータが送れません。 そのためCPUやGPUが十分に早いとCPU/GPUのデータ待ちといった状況が発生します(SSD律速)。

各律速の改善方法については次章に書きます。

各処理の速度改善方法

データ読み込み速度の改善

データ読み込みは他IOに比べ数桁遅いため、ボトルネックになりやすいです。

これを改善するためには

  1. 読み込むデータのサイズを予め小さくしておく
  2. データを圧縮しておく
  3. DRAMに予めデータを展開してDRAMからデータを読む
  4. 早いSSDに買い替える

の4通りが考えられます。まず1つ目ですが、例えばKaggleから配布された画像サイズが1024x1024であった場合でも学習に用いるサイズは512x512と低解像度である場合がほとんどです。 その場合、予め画像データを512x512等縮小したものを保存しておき学習時にはそちらを読み込むことで、この例ではデータの読み込みスループットは4倍向上します。

また画像であれば可逆圧縮であるpngに対し、非可逆圧縮であるjpgに保存フォーマットを変えることで大きくファイルサイズを削減することができます。 生データであれば(CPU負担は増えますが)npzといった圧縮形式で保存しておくことでデータ読み出しのスループットは向上できます。

またDRAMに自信ニキの場合、予めメインメモリ上に全てのデータを展開しておく力技も考えられます。 そうすればDDRでデータ読み込みを行えるため、ボトルネックは解消できます。(書くの大変ですが)

Dataloader resets dataset state - #6 by bfeeny - PyTorch Forums

それでも解消しない場合はPCIe対応のSSDを買いましょう! 現在は第四世代PCIeのSSDも売っており、10倍ほど早くなります。マザボが対応しているかはご確認ください。

価格.com - インターフェイス:PCI-Express Gen4のSSD 比較 2022年人気売れ筋ランキング

データ前処理速度の改善

  1. worker数を最大化する
  2. 画像を縮小する
  3. CPUを買い替える

のが考えられるアプローチです。

まずデータ前処理が律速している場合、まずはdataloaderのworker数を最大化しましょう。 こちらの記事のdataloder編が詳しいです。

qiita.com

また画像の前処理(というか画像処理一般)は画素数をNとした場合O(N2)と書けるため、予め画素数を縮小しておくおくことで前処理速度も大きく向上します。 予めresizeした画像を使うのはもちろん、例えばresizeを最初にしてから他前処理をすることでも処理速度の向上が期待できます。

最後にはCPUをコア数多いものに買い替えましょう(8コアあれば大抵十分な気もしますが・・)

GPU処理速度の改善

書いてる人多いので簡単に。

  1. AMPなどFP16・TF32を用いて計算する
  2. pytorch2.0のcompileを使う
  3. batch数を増やす
  4. GPUを買い替える

aru47.hatenablog.com

AMP(mixed precison)で学習するとFP32に比べメモリ転送量が半分になる他、TensorCoreを使うことで計算速度が大幅に向上します。 まず最初に試しましょう。

またpytorch2.0(現在はnightly build)のcompileを行い計算グラフを最適化することで精度劣化なく"ただで”1.5~2倍の高速化が可能とのことです。 是非試してみましょう(試したらなんか書きます)

またbatch数が極端に少ないとGPU速度が遅い場合もあります。WIP。

コンピューティングについての他記事

GPUってそもそもなんや?

aru47.hatenablog.com

律速律速ってそもそもなんや?

aru47.hatenablog.com

Pytorch学習スケジューラはtimmのCosineLRSchedulerがいいぞ

kaggle的備忘録

Pytorchモデル学習では学習率スケジューラ(LR scheduler)が必須。

特に論文ではCosineLRスケジューラがよく使われる。

こんなん

事前学習モデルでは最初に低いLRでwarmupを数epochした後に最高LRに設定後cosine上にLRが低下していくスケジューリングが経験上良い精度を達成できる。

これがpytorchデフォルトにあれば良いのだが、用意されていない。

一方でtimmに用意されているのは意外と?知られていない。

timm.fast.ai

from timm.scheduler import CosineLRScheduler
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
scheduler = CosineLRScheduler(optimizer, t_initial=100, lr_min=1e-6, 
                                  warmup_t=3, warmup_lr_init=1e-6, warmup_prefix=True)

そして学習ループ内で

for epoch in range(100):
   scheduler.step(epoch)
   train()
   eval()

のように回せば良い。

研究室立ち上げ時に参考にしたこと【WIP】

研究室運営の初動は共同研究者にも恵まれたのもあり、安定しつつありますが企業→大学講師パスだったので着任時に科研費もさきがけの存在すらしらなかったので情報収集に苦労しました。

誰かの役に立てるよう、備忘録的に参考になったサイトや情報をまとめます。

研究室運営

着任~3年目まで何をしたか具体的に書かれている貴重なサイト。 着任時にはかなり読み込み、僕も1年目は出せるグラント(科研費、JST、民間財団)には全部出すように心がけました。

30pi.blogspot.com

明大中村先生の貴重な研究室運営のノウハウ

nkmr-lab.org

こちらの記事も初年度にどのようなグラント戦略を取ったか具体的に書かれています。

https://note.com/takuya_maeda/n/ne332701f6629note.com

学生指導

(TBD)

グラントライティング

グラントライティングは独特な作法・ノウハウがあると感じました。(EE・CS分野だと科研費本はそこまで頼りになりません) Twitter・人脈を総動員して先輩研究者の申請書を見せてもらうのが一番勉強になると思います。

(僕も研究終了した申請書であればお送りします。メールかTwitter DMください)

海外のCS PIが出しているグラントライティングtipsはかなり参考になりました。これらを参考にしてさきがけなどの申請書を書きました。

https://pbg.cs.illinois.edu/misc/SecuringGrants.pdf

特にこのページを大事にしてます

pages.cs.wisc.edu

Writing grant proposals is hard. They are harder than papers because they are part fiction. Fiction tends to come unnaturally to scientists and engineers who may be more comfortable dealing with known facts. Ph.D. students encounter a similar challenge when proposing their Ph.D. work. Below I present:

  • CARE: Are you tackling an important problem? If you can make progress on it, will anyone care?
  • NOW: Why now? If this problem is so important, why has it not been addressed before?
  • IDEAS: Do you have concrete ideas for starting an attack on the problem and a vision for proceeding further? Is initial progress likely and subsequent progress possible?
  • RESULTS: Do you have some preliminary results? Do you demonstrate a good understanding of the problem and the methods needed attack it further?
  • PLAN: Do you have sensible plans and methods (e.g., concrete steps and ways of decoupling risks)?
  • CAN-DO: Why you? Why are your qualifications and infrastructure appropriate?
  • LEGAL: Have you followed the rules of the solicitation (e.g., compelling broader impacts for NSF)?

代表で出したグラント

  • 民間財団はテーマが最低限マッチするものを>10は出しました。打率は3割程度でした。

  • 科研費: 研究スタートアップ、基盤B

  • JST: さきがけ

初年度は獲得研究費がゼロなため、比較的民間財団が採択されやすいボーナスタイムと同僚から聞き、積極的に投稿しました。

大きなアイデアはさきがけや基盤Bで考えつつ、出てきたサブアイデアを民間財団に出すイメージでやりました。基本的に掛けるエフォート(執筆的な意味でも)は金額比例としてました。

OpenAIのWhisperを使って動画字幕を自動生成

目的

OpenAIが公開した文字起こしAIのWhisperを使って動画に字幕を自動生成します。

パーフェクトではないですが、十分実用的な日本語字幕が生成できます。

用意

github.com Python3.7+とpytorch1.0+環境が必要。ローカルがなくてもcolabで十分動くと思います。

pip install git+https://github.com/openai/whisper.git # whisperインストール
sudo apt install ffmpeg # ffmpegインストール

Whisper 実行

動画test.mp4の字幕生成するとします。

# ffmpegを使い動画から音声データ抽出
ffmpeg -i test.mp4 -acodec libmp3lame -ab 256k audio.mp3

# Whisper実行
whisper audio.mp3
# Whisper実行(モデル精度変更)
whisper audio.mp3 --model medium

# 字幕動画生成
ffmpeg -i test.mp4 -vf subtitles=audio.mp3.srt test_subtitle.mp4

モデル性能は以上のようにまとまってます。 試した感じmedium辺りがミスが少ない精度です(英語であればbase程度でも性能高いです)

物体検出ライブラリの紹介と所感

記事について

画像はDetectron2より

物体検出をほとんど使っていない方を対象として、2021年末の物体検出ライブラリを俯瞰することが本記事の目的。

ある程度物体検出の経験ある方は学ぶことは少ないと思う。またあくまで書いてあるのは筆者の感想であるので人によっては全く違う意見になることもあるかと。また本記事ではモデルの技術的な説明はありません。それらについて理解を深める際は参考ページや元論文を当ってみると良いかと思います。

また大変遅くなりましたが、本記事はKaggleアドベントカレンダー(裏)の24日目でもあります(年明けちゃってすみません)。

qiita.com

紹介するライブラリ一覧

Library mAP range Architecture Instance segmentation License Repo Stars
yolov5 37-50 Single-stage GPL-3.0 Here 34.1k
YOLOX 40-51 Single-stage Apache-2.0 Here 7.7k
efficientdet 33-53 Single-stage Apache-2.0 Here 1.4k
Detectron2 35-48 FRCNN Apache-2.0 Here 23.2k
mmdetection 35-50 Single, FRCNN Apache-2.0 Here 22.5k

(Star数2023/1/4更新. Yolov5がInstance segmentationにも対応しました。)

FRCNNって何?って方は以下記事もどうぞ。

qiita.com

所感

  • yolov5がstar一番多い

  • yolov5以外はオープン(Apache-2.0)ライセンス。GPL-3.0は仕事で使うには注意が必要。

  • どのライブラリも達成可能な精度レンジは似ている。

  • yolov5,YOLOX,efficientdet, Detectron2はあるアーキテクチャに特化したライブラリに対し、 mmdetectionは様々な物体検出モデルの再現用ライブラリとなっている。

  • Instance segmentationにはMask-RCNNアーキテクチャが必要。サポートしているのはDetectron2とmmdetection。 yolov5でもInstance segmentationに対応しました。

アンサンブルについて

  • 実際にkaggle等で使う時はyolo+effdetなどをアンサンブルすることが多い。カツオコンペやvinbigなど複数ライブラリのアンサンブルでスコアが一気に伸びる例が多かった

  • Signateカツオコンペ yu4uさんカツオコンペ解法

  • Kaggle Vinbig 1st place solution

Yolov5+effdetのアンサンブル

VinBigData Chest X-ray Abnormalities Detection | Kaggle

  • Kaggle Satorius 2nd place solution

Cellの物体認識はyolov5+effdet+MaskRCNNのアンサンブルで実施している。

インスタンスセグメンテーションをせずに、認識したBoxから更にU-netでセマンティックセグメンテーションを実施している。

精度vs速度トレードオフ

ブログ執筆にあたりA6000 GPUを使い学習済みモデルの推論速度を計測してみた。

グラフにまとめたのが上図。

所感:

  • 思ったよりもyolov5の性能が良い

  • YOLOXページ上ではV100でベンチマークしており、YOLOXの方が早いという結果。これはGPUによって前後しそう

  • YOLOX, yolov5はTensorRTに対応しており、適応すれば推論は数倍早くなると思われる。

  • YOLO系がefficientdet系より大幅に早いという事はどのGPUでも成り立つ。

  • Detectron2, mmdetectionの速度は未測定。学習時の感覚では大体efficientdetくらいの速度ー精度トレードオフ。

ライブラリ紹介

yolov5

ライセンス以外文句なしのライブラリ。

とにかく学習と推論が早いので実験しやすく、精度も高い。またs,m,l,xと4サイズ揃っており精度と速度トレードオフを作りやすい。

ドキュメントも豊富でissue検索すると大体のやりたいことはカバーできるかと思われる。Issueを立てても開発者の返事も早くバグfix速度が凄い。

欠点はライセンスがGPLである点とモデル、データ周りの改造が難しい点でしょうか。

Wandb連携しておりログも自動化してくれてるのが地味にありがたい。

学習について

学習時にはデータを独自フォーマットに変換する必要あり。COCO形式からの変換についてはkaggle notebookをみるのが良いと思う。

公式より:

github.com

小麦コンペのNotebookより:

www.kaggle.com

Vinbigコンペより:

www.kaggle.com

推論について

公式ページにあるtorchhubのモデル推論がお手頃(以下抜粋)。 Kaggle環境ではこのコードではエラー出るため、detect.pyを使うことが多い。 Kaggle環境でも問題なく回ります。

import torch

# Model
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')  # or yolov5m, yolov5l, yolov5x, custom

# Images
img = 'https://ultralytics.com/images/zidane.jpg'  # or file, Path, PIL, OpenCV, numpy, list

# Inference
results = model(img)

# Results
results.print()  # or .show(), .save(), .crop(), .pandas(), etc.

www.kaggle.com

Yolox

出た当初は学習コードが分かりづらかったがかなり整備されてきた。

ライセンスがオープンなyolov5と言えるかも。仕事で手軽な物体検出を使うとしたら自分もコレを使う気がする。

中国のトラッキングライブラリなどでyoloxが使われることが多く、採用は増えている。

学習について

公式readmeより:

github.com

サンゴコンペよりnotebook:

www.kaggle.com

Efficientdet

Yoloxが来る前はライセンスフリーで最高精度が出るライブラリだった。ただ学習速度は4〜8倍ほど遅い。あとd7といった巨大モデルではよく学習が落ちるのに苦労した。

精度、速度共にyolo系に劣るがyolo系とは抽出する特徴が違うのか、アンサンブルに加えると精度向上に寄与するため様々なコンペで使われている。

学習コード

小麦コンペのnotebookがわかりやすい。ただこれは最新repoには対応していない方式である点に注意。 使う場合はdatasetにあるeffdetのバージョンを使おう。

www.kaggle.com

torchvision

なんだかんだ言って使いやすいライブラリ。精度はそこそこだがPytorchに付属しているのでインストール不要なのがありがたい。

pytorch.org

Detectron2

MaskRCNNの公開レポだったものが包括的な物体検出ライブラリに進化した。

昔は物体検出ライブラリ自体が使いやすいものがなかったが、最近はyolov5を始めとして高精度・使いやすいものが出てきており役割が変わろうとしている気も。開発は止まり気味で最新モデルのインプリは少ない。

一方で今でもインスタンスセグメンテーションを扱えるのは強み。

ちなみにDetectron2の解説についてはHiroto Hondaさんの一連の記事がとても詳しいです。

medium.com

学習コード

このcolabがデータセット準備から学習までカバーしている。癖が強いのでなれるまでは苦労するかも

colab.research.google.com

mmdetection

学会で発表された物体検出技術をかなり広範囲に渡り実装、モデル公開しているライブラリ。model zooを見て通り対応モデル数が凄まじい。

github.com

  • サポートも手厚く、issue上げるとすぐに返事をもらえるのがありがたい

  • またフレームワークも独自形式のため最初は苦労するかもしれないが、モデル定義もデータセット形式も慣れると使いやすく改造もしやすい。

  • Kaggleのようにひたすら性能を出したいというよりかは研究で様々な手法を検証したい、新たにbqckboneやheadを置き換えたい時に便利だと思う。

  • YOLO系と抽出する特徴が違うためかアンサンブルに加えると精度向上に寄与するため、様々なコンペで使われている

学習コード

github.com

Sartorius: MMDetection [Train] | Kaggle

ゼロから実装する物体検出モデル

こんな記事書いておいてなんだけど、物体検出ライブラリを使っているだけでは物体検出について理解を深めることはできない。

自分でネットワークを実装しないと応用性のある知識や技術は身につかないと思う。

また既存物体検出ライブラリは改造が難しく、仕事や特定コンペの飛び道具として使う時に対応が難しくイチからネットワークを書けると対応の幅が広がる。

SSD

物体検出モデルの基本のsingle-stage-detector。まずはこのモデルから実装することで物体検出モデルに対する理解を深められると思う。

例えばamdegrootのssd repoは非常に読みやすい実装である。

github.com

発展Pytorchに詳しい解説があるため、よみながらイチから実装すると良い。

CenterNet

個人的には物体検出モデルをとことんシンプルにした革命的な実装。

誤解を恐れずに言うとu-netで物体検出しているため、ネットワークが非常にシンプルになる。自分でイチからモデルを書くのも簡単(精度出すのは色々作ろこみが必要だが)で応用も効きやすいと思う。

github.com

github.com

小麦コンペの筆者の実装

www.kaggle.com

公式実装はわかりづらいため、上のような実装が良い参考になると思う。

コンペ使用例

例えばPKUコンペではCenterNetのheadを拡張し、画像から3D位置を認識するネットワークがベースラインとなった。

www.kaggle.com

またNFLコンペでは上位者の解放でヘルメット位置と角度を検出するネットワークにCenterNetが使われた。

www.kaggle.com