2021年10月やること
概要
最近だらけがちなので、こういうのを書いていく。
やること
研究インターン
以前のテーマは少し手を出したけど厳しそうってことで、新しいテーマが決まりつつ有ります。とても自由度が高いテーマで、(被りの心配が薄いので)楽しめそうです。あと個人的に非常に好きな話がマッチしてくれました。メンターとの関係も良さそうなので、頑張っていきたいです。授業の裏でやるのが大変ですが。。
競プロ
長らく放置していたため、ついていけなくなって、色が落ちました...。ここ数日で典型90をがっつりやったので、あとは類題を地道にやりつつ精進の効力を待つのみです。あとコーナーケースに対する注意力があまりに欠如していて、それで何度も冷えていることが分かったので、取り組む気持ちも変えたいです。
以下書籍の類ですが、一冊丸々今月にというわけではないです。
金谷『3次元コンピュータビジョン計算ハンドブック』
深層学習を使わない、安心感のある3DCVのアルゴリズムの理論と実装を解説してくれている本で、半分くらい終わっています。10月で終わらせちゃいたいです。金谷先生の本は他には『3次元回転』を読みましたが、そちらも非常にわかりやすかったです。『幾何学と代数系』という、幾何学的代数をカメラ幾何に応用する本も積んでいるので、それもまたいつか。
Boydら『Convex Optimization』
ずっと憧れていた企業の人と偶然知り合う機会が有りました。その方が社のブログで記事を書いていたのですが、私が行きたいようなポジション(CVとか)の選考対策が詳しく書いてありました。企業側から対策を発信するなんてあるのかと驚きましたが、英語のリソースなど余り知らない情報もあったので非常にためになりました。これはそのうちの一冊です。
ちなみに連続最適化は一回授業受けてるんですが、Advancedな方法は忘却してしまいました。分厚いのでこつこつ進めて復習していきたいです。
- 小出『量子力学1, 2』
清水『量子論の基礎』を最近読んだのですが非常に面白く、物理嫌いが一気になくなりました。せっかく学科に量子情報とか情報熱力学やってる研究室があるので、量子・統計力学のモチベを上げておきたいです。小出は今期のシラバスに載っていたので買いました。1は1年生のときに買ってて、当時少し読んだ気がするけど覚えてないです。
- 長岡『統計力学』
統計力学はこれよりもやさしいのしか読んだことなかったので真面目にやります。10月の予定にはないですが、最近見つけた↓の著者が書いた統計力学の計算・アルゴリズム的観点を解説する本があって、面白そうだったのでそれもいつか。
シラバスに田崎『統計力学I, II』も載っていましたが、今セメスタで消化するのは多分無理なので、今後に回します。
- 神保『複素関数入門』
複素関数の授業を取るので。
- 今井『情報理論』
授業の指定教科書。符号化とかその辺が今の研究インターンでやってることと若干関わるので、もうちょいハイレベルな『Essentials of Information Theory』とか読みたいけど、これはまた次に。
まとめ
授業の教科書ばっかりになってしまいました。とりあえずGPA欲しいので授業は真面目に受けつつ、研イにもコミットしたいです。
がんばるぞい。
7,8月に参加したインターンの記録
概要
7,8月にとある企業でソフトウェアエンジニアとしてインターンシップに参加しました。こういうの公に書いていいのかわからないので社名は伏せますが、割と成熟したフェーズに入ったベンチャーで、今も成長をぐいぐい続けている楽しい企業でした。
まとまって参加したインターンは初めてだったので今後の自分のために記録をします。若干ポエムが入っています。
何をしたか
使ったスキルセットだけ書いておくと
- C++
- CUDA
です。具体的なテーマは書けませんが、所謂コンピュータビジョン分野のとあるアルゴリズムを扱いました。
何を得たか
C++とCUDA、そしてGPUのアーキテクチャに関して解像度が上がりました。特にGPUは何も分からん状態からだったのでキツかったですが、メンターの方々が神だったので何とかなりました。C++も、ある程度規模の大きいコードを書いたり、あるいは既存のクソデカプロジェクトに自分のコードを挿入したり、普段1人でやる規模ではなかなか体験できないことを体験できました。ロバストなコード・メモリや実行速度を気にしたコードを書く癖も付いたと思います。GitHubでのコミュニケーションやレビューの流れ、あとテストの重要性など、ソフトウェアエンジニアリングの基本的な考え方も身につけられました。
アルゴリズム面については、ちょっと論文読んだりしたけどお気持ち理解で終わってしまった感じがあるので、終わった後に↓の有名な三次元幾何の本を読んでいます。
次に生活的なところですが、フルタイム(8h x 5日)で働いたのが初めてだったので、リモートとはいえ疲れました。これは頭をかなり使っているからで、適切に休憩を取ったり、持久力を上げたりすることの大切さを身を持って知りました。
夏休みだったので他にもやりたい勉強(積み本)がたくさんあり、それも消化したかったのですが、期間中は余り他の勉強に手を回せませんでした。仕事後に勉強してる社会人の人強すぎぃという気持ちになりました。
これを受けて、特にコンピュータサイエンスの基礎的なところ(アルゴリズム、アーキテクチャ、OS、コンパイラ、データベース、ネットワークなど)と、物理・数学は学生のうちにできるだけ勉強しておきたいという気持ちが強くなりました。もちろん社会人になっても勉強は続けなければだろうし、むしろしたいのですが、時間が十分かというと全くそうではないと気づきました。
所属している学科的にCSのトピックと通信工学周りのトピック(信号処理・制御とか)は抑えられそうで、工学・物理に使う範囲の工学部的な数学の授業も結構あるので、授業を真面目にやっていれば最低限は身につくはずと思っていますが、独学も結構必要そうです。今の所専門はコンピュータビジョンの辺りにしたいなぁと思っていますが、CSの基礎と物理、あとできる限りの数学も頑張って勉強したいです。
今回は数学というより低レイヤな部分を頑張るという感じだったのですが、CVのアルゴリズムについて調べるときに、独学していた連続最適化の知識が役立って嬉しかったです。好きな(というか抵抗が無い)数学は幾何・線形代数・最適化・数値計算とかで、これらは割と順調に身につけられている気がします。ただ他の分野、特に基礎論や解析(厳密な)、整数などには苦手意識があり、克服したいと思っています。いわゆるパズルゲー(競プロの数学問題みたいなやつ)も昔から苦手で、ガチガチにコンプを持っているので、ちょっとは得意になりたいですね....。
最後に、メンターの方々の神対応を受けていて思ったのが、「言語化能力の高さ」です。アルゴリズム・アーキテクチャの説明が非常に上手く、適切な抽象度と一般化度合いで表現し、自分でやるべきところは適切な資料を投げておく、というのが大変助かりました。自分もそうなりてぇ~。
今後の方針
インターンはもっと圧倒的技術的成長を遂げるもんだと思っていましたが、流石にそこまででは無かったです。3ヶ月とか半年行けば流石に違ってくると思うけど。でも十分な成果と成長を得ることができたと思います。
しかしそれ以上に、何が好きなのか・何がやりたいのかが分かってきたのがよかったです。日々の効率と楽しさが向上しています。上に書いたようにまずは学部の内にしっかり基礎をやって、長期休暇にはまたインターンに行きたいなと思っています。
大変楽しく素晴らしい企業で、少なくともチームとの相性は良かったので、また何かの縁があると嬉しいなと思っています。
【随時更新】これまでに学んだことリスト
概要
主に大学生活で学んできたことを簡単なメモ形式で記録していきます。
書籍が主です。
カテゴリの並びは一応
(上)アプリケーション <-> 基礎(下)
となっています。
各カテゴリの項目の順番は適当です。
適宜更新。
追記(2021.08.27)
こちらのサイトに移行中です。新しいのはこちらに書きます。
過去のものを移行するのはなかなか大変そう...。
機械学習・最適化関連
『Python機械学習プログラミング 達人データサイエンティストによる理論と実践 』
機械学習関連で最初に読んだ本。線形回帰から決定木、SVM、クラスタリング、K-meansなどの機械学習の基本的手法を学んだ。Pythonによる実装も。NNは最後の方に少し載っているだけだったが、CNNとRNNの基礎を掴んだ。
読んだのは第2版で、第3版は強化学習なんかも追加されているらしい。
ちょうどKaggleに手を出した頃だったが、この本を通して、ライブラリぽちぽちよりもまずは数学的なところを固めたほうが良いと感じた。
『パターン認識と機械学習』
しっかり数学的に知りたいなとなったのでPRMLに手を出した。友人とゼミ形式で読んだ。上巻を読み切るのに4ヶ月くらいかけた覚えがある。
内容は、機械学習というかほとんどベイズ推定の本という感じだった。正直後述するMLPシリーズの緑本の方がわかりやすかった。
『機械学習スタートアップシリーズ ベイズ推論による機械学習入門』
PRMLの上巻と重複は大きいがこちらのほうがわかりやすかったのでメインで勉強した。ベイズ推定で出てくる計算や議論にはこれで慣れ親しむことができた。これ以降数式ベースの機械学習の議論に触れるのは論文を読むときくらいだが、ゴリゴリの理論解析でなければなんとか分かるようになった。CV系の論文は読みやすくなったと感じた。
最後の章に出てくるNMFやテンソル分解などの話はもっと詳しく勉強したい。
【ゼロから作るDeep Learning】
機械学習の勉強を初めて割とすぐに読んだ(B1冬かB2春かそのあたりの時期)。
全結合層、CNNをfrom scratchで実装した。特に逆伝播の解説はとてもわかりやすかった。理論はPRMLのNNの章でやっていたが、具体的な実装はこの本で掴めた。
『Deep Learning with PyTorch』
公式がPDFを無料配布していたため、読んだ。PyTorchのTensorの内部表現のことなど、PyTorchの仕様について分かっていないことがあったため、前半も役立った。
後半では医用画像処理のプロジェクトとして一連の流れを行った。特にモジュールの分け方や実験をしやすいスクリプトの書き方など、そういった面で役立った。モデル自体は既知だった(U-netなど)。
英語だったがとにかく良い本で、無料配布は本当にありがたい。
『作りながら学ぶ! PyTorchによる発展ディープラーニング』
Deepの主要なタスクとその実装の概要を知っておきたかったため読んだ。Object Detection, Segmentation, Pose Estimation, Translation, Video Analysis, GANなど、一通り網羅されていた。モデルの解説自体は詳しくなかったので、適宜論文や記事で補った。この手の本はすぐに廃れてしまうと思うので結局論文や著者実装を見たほうが早いが、入門者にとっては大変貴重なリソースだった。
ちなみにPyTorch初見でこの本を読んでしまったので実装の基礎部分がお気持ち程度になっていたため、先のDeep Learning With PyTorchを読んだ後にこの本を読んだ。
『これなら分かる最適化数学』
数理最適化、特に連続最適化についてOverviewを得たかったので読んだ。タイトル通りわかりやすく、それでいて深度も適切だったため非常にためになった。B1の解析学でやるようなラグランジュの未定乗数法から始まり、ニュートン法、最小二乗法、EMアルゴリズム、線形計画法、双対、そして最後におまけ程度のDP(動的計画法)が載っていた。どの手法も「はぇ〜頭良い」となるので楽しい。かといって自分で最適化手法それ自体の研究をする道に進むのはどうかなぁという感想を抱いた覚えがある。この辺は知っておけばおくほどチャンスが増えそうなので積極的に知識をつけたい。
名著『Convex Optimization』も読んでみようかなという気持ちになった(現在進行中)。
ロボット・コンピュータビジョン関連
WEB系
プログラミング言語
開発
低レイヤ・CS基礎
工学
数学
物理
電磁気学I――電場と磁場 (物理入門コース 新装版) | 長岡 洋介 |本 | 通販 | Amazon
pthreadsでマルチスレッドを学んでいく
概要
マルチスレッドプログラミングについて体系的に学んだことがなかった。普段触れる言語はPythonとC++がメインで、マルチスレッドに出会うのは物体検出モデルの著者実装のスクリプトくらいという状態で、マルチスレッドにはあまり縁が無かった。しかしマルチスレッドプログラミングはあらゆるところで使われているはずで、一度体系的に学んでおきたかった。組み込み系にも興味があったため、C言語のマルチスレッドプログラミングをサポートするライブラリであるpthreadsを用いて勉強することにした。
内容
『Linuxとpthreadsによるマルチスレッドプログラミング入門』という本を用いた。これはとある勉強会の内容をそのまま本に落とし込んだような本で、実習形式になっており、マルチスレッドの基礎+pthreadsの使い方を元にコマンドラインアプリを作ろうというものだ。
作ったプログラムは「マルチスレッドセーフなQueue」である。また、これを使ってTerminal上で点を支持した地点に動かすアプリを作った。
Destination?に対して目的地の座標(y, x)を入力すると、点がそこへ向かう。スレッドセーフなキューを用いているため点が動いている途中でも目的地を入力することができる。
コードはこちら↓
詳細はREADMEへ。
エピポーラ幾何をインタラクティブに体験するアプリ
概要
エピポーラ幾何は通常局所特徴量からマッチング点を得て、RANSACなどのロバストな方法で求めることが多い。しかし、「8点アルゴリズム」によれば8点の対応点があればエピポーラ線が線形に求まるという。そこで、クリックするだけで対応点を入力でき、8点法によるエピポーラ幾何の結果、そして限界を知れるアプリを作った。
コード
こちら↓
説明
入力インタフェース、Fundamental行列の計算などにOpenCVを、プロットにMatplotlibを用いた。詳しくはGitHubのREADMEに。
感想
8点法だとなかなかうまく行かないことが実感できた。
リポジトリにはREADME用にまともな画像を載せているが、色々な点の配置を試してみると結果が大きく変わることが体験できておもしろい。
『コンピュータビジョン-視覚の幾何学-』を読んだ
概要
『コンピュータビジョン-視覚の幾何学-』を読んだ。
コンピュータビジョンの中でも3D再構築やSLAMやらをやる上では非常に重要になる(と思っている)のと、Deep以前のコンピュータビジョンの基礎をガッチリ固めておきたかったため。
残念ながらこの本はAmazonではまともな出品がなく、偶然メルカリで見つけたポチ!った。ラッキーだった。
内容メモ
1章
イントロ。
3次元世界を2次元画像に投影すると情報の欠落が生じる。同じ対象物であっても視点によって異なる観測を得てしまう。多く不定性が残る画像データの中からタスクに必要な情報を抜き出すのがコンピュータビジョンの主眼。
2章
射影空間と変換を記述するための数学的準備。
斉次座標
ユークリッド空間+無限遠要素からなる射影空間内の点を表すには、ユークリッド空間での次元にもう1次元加えた座標で表す。
投影からカメラモデルへ
透視投影->射影カメラ(11自由度)
弱透視投影->アフィンカメラ(8自由度)
3章
各変換に関する不変量
投影によって乱されない対象物固有の特徴量を得ることがCVの肝。
回転変換
2点間の距離、2直線間の角度、閉領域の面積、回転中心からの距離、などなど
ユークリッド変換
2点間の距離、2直線間の角度、閉領域の面積、など
相似変換
距離、面積の比
アフィン変換
一直線上の3点の像の距離の比
平面上の4点の作る面積の比
射影変換
一直線上の4点による複比
平面上の5点による不変量
4章
エピポーラ幾何の話。
最も一般的な射影カメラの場合
異なる画像間の対応関係”エピポーラ制約”がかかる。
行列Fは3x3で階数2の行列で、Fundamental行列という。
定数倍の不定性があるので自由度は7である。
Fは8点の対応から線形に求めることが可能(8点アルゴリズムとか8点法とか呼ばれているもの)。
並進カメラの場合
並進の場合、全く同じエピポール、エピポーラ線が得られる。これを自己エピポーラという。これを画像の話に持っていくと、画像中に繰り返しパターンが現れる場合にはその画像内で自己エピポーラが成り立っていることを意味する。
Rectification
カメラの内部パラメータ、姿勢、位置が異なる場合に、片方の画像に関して、もう一方の内部パラメータで撮影したと仮定した場合の画像との関係性(平面射影変換、8自由度)を得る。これは4点の対応により求まる。
応用先
三次元復元
ビジュアルサーボ
視覚誘導など
5章
形状復元の話。
構成済みカメラの場合
不定性無く復元できる。
ユークリッド復元
・内部既知、外部未知の透視カメラ
・内部外部ともに未知、透視カメラ、3視点
など。
アフィン復元
結果が3次元アフィン変換の不定性を持つような復元。
アフィン基底4点を取ると、それを元にした座標は不変に保たれる。
これを抽出するのがアフィン復元である。
・未公正のアフィンカメラ2台による復元
・未公正の並進透視カメラによる復元
など。
射影復元
結果が3次元射影変換の不定性を持つような復元。
射影基底5点を取ると、それを元にした座標は不変に保たれる。
・内部、外部共に未知の射影カメラ(最も一般的な場合)
6章
カメラキャリブレーションの話。
校正器具を使った場合
予め大きさが分かっている対象物をカメラで撮影し、座標の対応からカメラのパラメータを決める。射影カメラ行列Pは3x4で、定数倍の不定性があるので自由度11。6点の対応があれば6x2=12の拘束条件が得られるので、Pが決定できる。
未知の対象物からのカメラ校正
校正したいカメラを動かして3視点からの画像を得れば、自然に置かれた未知の物体からの校正ができる。
無限遠平面上にある仮想の円錐曲線(絶対円錐曲線)の不変性を利用する。
まとめ
カメラモデル(アフィン、射影など)や変換(ユークリッド->アフィン->射影)で統一的に見ると、やっていることはほとんど同じで、後はそれぞれの次元・カメラ・変換に応じた解き方があるというのを掴むと理解が早かった。
OpenCV or 0からの実装もやっていきたい。
『オブジェクト指向のこころ』演習問題 第3章
章の概要
CADシステムの改善を例にとり、OOPの設計を見る。
シートメタルの加工を行うCADシステムからデータを抽出し、エキスパートシステムに投げられる形にする(時代を感じる...)。
まずは対象領域の専門家と議論できるようになるためにボキャブラリーを獲得。
概念レベル->クラス図の順で設計。
バージョン1では手続き型的な処理で、非常に分かりづらい。
バージョン2ではオブジェクト指向を採用。
といったように、バージョンの共存をせざるを得なかったり、ドメイン知識を身につけて概念を設計に落とし込んだりと、いかにもありそうな例。
演習問題
基礎
[2] ポリモーフィズムはジオメトリの抽出レベルでは必要だが、フィーチャのレベルでは必要ない。なぜ?
エキスパートシステムがフィーチャのtypeを知っていなければならないため。
※要するに、全部分に多相性を持たせる必要はないという話。エキスパートシステムは変更できない状況にあるので、その制約により多相性を持てなくなるとも言える。