takminの書きっぱなし備忘録 @はてなブログ

主にコンピュータビジョンなど技術について、たまに自分自身のことや思いついたことなど

コンピュータビジョン今昔物語 - 深層学習がCVの世界をどう変えたか - (JPTA Tech Talk講演資料)

今回、CV勉強会に何度か参加&発表していただいたJin Yamanakaさんにお誘いいただき、JTPA (Japan Technology Professional Association)というところで、「コンピュータビジョン今昔物語 -深層学習がCVの世界をどう変えたか-」という大上段なタイトルで講演させていただきました。

www.meetup.com

このJTPAのTech Talkでは、機械学習/深層学習の勉強会を開催してきたそうなのですが、私自身「これ」という深層学習の専門があるわけではないので、コンピュータビジョン全体の基礎的な技術の変遷を、深層学習と絡めて広く浅く網羅した話をさせていただきました。

ちなみにここで紹介した深層学習の技術は、「既存の技術を置き換えるために、深層学習は何をクリアしなくてはならないか?」という視点で、紹介するのが適当と思ったものを選んだつもりです。

当日は時間の関係でSemantic Segmentationの話がきちんと出来なかったので、参加者の方には後でこちらにアップした資料を見返していただけるとありがたいです。

www.slideshare.net

2020/07/18 全日本コンピュータビジョン勉強会「CVPR2020読み会」(後編)発表資料まとめ

先々週の前編に引き続き、関東、名古屋、関西のCV勉強会が合同で「全日本コンピュータビジョン勉強会 - CVPR2020読み会(後編)-」をオンラインにて行いました。

今回、私は発表はありませんでしたが、例のごとく資料やリンク等を(自分のために)まとめておきます。

kantocv.connpass.com

2020/07/18 第三回全日本コンピュータビジョン勉強会「CVPR2020読み会」後編 ツイートまとめ - Togetter

前回同様Youtube Liveでも配信しました。 www.youtube.com

発表資料のリンク(発表順。敬称略。)

発表者 論文タイトル 発表資料
yumash TPNet: Trajectory Proposal Network for Motion Prediction https://www.slideshare.net/yumashino/tpnet-trajectory-proposal-network-for-motion-prediction
alfredplpl Detecting Attended Visual Targets in Video https://www.slideshare.net/yasunoriozaki12/detecting-attended-visual-targets-in-video-237017752
sandglass Proxy Anchor Loss for Deep Metric Learning https://speakerdeck.com/satokeiju/cvpr2020du-mihui-proxy-anchor-loss-for-deep-metric-learning
yasutomo57jp Disentangling and Unifying Graph Convolutions for Skeleton-Based Action Recognition https://www.slideshare.net/yasutomo57jp/disentangling-and-unifying-graph-convolutions-for-skeletonbased-action-recognition-237017395
t2kasa PolarMask: Single Shot Instance Segmentation With Polar Representation https://speakerdeck.com/t2kasa/20200718-cvpr-2020-polar-mask
smygw72 There and Back Again: Revisiting Backpropagation Saliency Methods https://www.slideshare.net/ssuserda79d5/cvpr2020-there-and-back-again-revisiting-backpropagation-saliency-methods-237017288
Tkarasawa_ Self-Supervised Monocular Scene Flow Estimation https://speakerdeck.com/takarasawa_/self-mono-sf
Tres Retina-Like Visual Image Reconstruction via Spiking Neural Model https://speakerdeck.com/sietedm/retina-like-visual-image-reconstruction-via-spiking-neural-model
s_aiueo32 Meta-Transfer Learning for Zero-Shot Super-Resolution https://speakerdeck.com/sansandsoc/meta-transfer-learning-for-zero-shot-super-resolution
Kenji RandLA-Net: Efficient Semantic Segmentation of Large-Scale Point Clouds https://speakerdeck.com/tsukamotokenji/di-san-hui-quan-ri-ben-konpiyutabiziyonmian-qiang-hui-hou-bian

全日本CV勉強会@オンラインは、コロナが落ち着くまで引き続き開催していきたいなあと思ってますので、宜しくお願い致します。

2020/07/04全日本コンピュータビジョン勉強会「CVPR2020読み会」(前編)発表資料まとめ

コロナ禍でしばらく中止していたコンピュータビジョン勉強会@関東ですが、今回名古屋および関西のCV勉強会と共催で、オンラインで、コンピュータビジョンのトップカンファレンスCVPR2020の論文読み会を行いました。

 

今回も発表者が多数のため、前後編に分けて行います。後編は7/18に開催予定です。

オンライン開催ははじめてでしたが、それぞれの勉強会の幹事の皆さんの協力でなんとか無事運営することができました。
今回、色々と反省する点もあったので、次回はもっと良い会にしたいと思います。


以下、今回の発表資料等へのリンクをまとめます。

kantocv.connpass.com


2020/07/04 第三回全日本コンピュータビジョン勉強会「CVPR2020読み会」前編 ツイートまとめ - Togetter


今回、Zoomの映像をYoutube Liveへも転送して配信しました。

www.youtube.com


発表資料へのリンク

発表者 論文タイトル 発表資料
akihiro_fujii Revisiting Knowledge Distillation via Label Smoothing Regularization https://www.slideshare.net/AkihiroFujii2/200704-revisiting-knowledge-distillation-via-label-smoothing-regularization
kzykmyzw 3D Packing for Self-Supervised Monocular Depth Estimation https://www.slideshare.net/KazuyukiMiyazawa/3d-packing-for-selfsupervised-monocular-depth-estimation
tereka Erasing Integrated Learning: A Simple yet Effective Approach for Weakly Supervised Object Localization https://speakerdeck.com/tereka114/erasing-integrated-learning-a-simple-yet-effective-approach-for-weakly-supervised-object-localization
takmin BSP-Net: Generating Compact Meshes via Binary Space Partitioning https://www.slideshare.net/takmin/20200704-bspnet-cvpr2020
yu4u SuperGlue: Learning Feature Matching With Graph Neural Networks https://www.slideshare.net/ren4yu/supergluelearning-feature-matching-with-graph-neural-networks-cvpr20
conta_ Deep Snake for Real-Time Instance Segmentation https://www.slideshare.net/takanoriogata1121/20200704-deep-snake-for-realtime-instance-segmentation
p_shiko Momentum Contrast for Unsupervised Visual Representation Learning https://speakerdeck.com/pshiko/cvpr2020du-mihui-onrain-qian-bian-momentum-contrast-for-unsupervised-visual-representation-learning
suganuma When NAS Meets Robustness: In Search of Robust Architectures against Adversarial Attacks https://www.slideshare.net/MasanoriSuganuma/when-nas-meets-robustnessin-search-of-robust-architectures-againstadversarial-attacks-236607860
doiken Unsupervised Learning of Probably Symmetric Deformable 3D Objects from Images in the Wild https://www.slideshare.net/MasanoriSuganuma/when-nas-meets-robustnessin-search-of-robust-architectures-againstadversarial-attacks
peisuke A Quantum Computational Approach to Correspondence Problems on Point Sets https://speakerdeck.com/peisuke/a-quantum-computational-approach-to-correspondence-problems-on-point-sets

 

今回は久々に私も発表を行いました。BSP-NetというBest Student Paperを取った、Deep Learningで3D Meshを表現する研究についてです。

 

PyTorchで学習したモデルをOpenCVで使う

以前、Keras+Tensorflowで学習したモデルをOpenCVで推論に使用する方法について解説したことがありました

 

www.slideshare.net

OpenCVにはDNNモジュールという畳み込みニューラルネットワークを使用するための機能があります。ただこれは主に推論用で、学習のためには別のディープラーニングフレームワークで作成したモデルを別途読み込む必要があります。

OpenCVはTensorflowやCaffe等いくつかのフレームワークをサポートしているのですが、前回は初学者にも使いやすいだろうという理由でKears+Tensorflowのモデルを選択しました。なお、OpenCVはTorchはサポートしてますがPyTorchはサポートしてませんでした。

 

しかしながら、OpenCVはバージョン4.0以降のONNXのサポートにより、様々なディープラーニングフレームワークに対応できるようになったため、今回PyTorchで作成したモデルも実際に読み込めるか試してみることにしました。

尚、わざわざOpenCV上でCNNを行う動機ですが、OpenCVで開発したコードの一部にCNNを使用したいケースや、C++で推論を行うことで高速化したいときに、追加ライブラリなしに使用できるのは魅力ではないかと思います。

今回もKerasを使用した時と同様、MNISTデータセットに対してLeNetを使用して手書き数字認識を行うという例で説明します。

 

PyTorchで作成したモデルをOpenCVで使用する手順は以下の通りです。

  1. PyTorchで学習用ネットワークを構築/学習し、学習結果のパラメータを保存
  2. PyTorchで推論用ネットワークを構築し、学習したパラメータを読み込み
  3. 推論ネットワークをONNXフォーマットで保存
  4. OpenCVでONNXファイルを読み込み  

では、順をおって要点のみ解説します。

尚、今回使用したサンプルコードはすべて以下にアップしてありますので、詳しくはこちらを直接ご覧ください。

https://github.com/takmin/PyTorch2OpenCV_sample

 

1. PyTorchで学習

  PyTorchでLeNetを構築して、トレーニングを行いました。 MNISTで学習するサンプルは以下においてあります。

https://github.com/takmin/PyTorch2OpenCV_sample/blob/master/train_LeNet.py

学習コードの詳細については他に参考になるサイトは山ほどあるので、ここではいちいち説明しませんが、学習モデルについては以下のような、単純な畳み込み層とPooling層、およびDropout層で構築しました。

class LeNet5(nn.Module):
    def __init__(self, input_size):
        super(LeNet5, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, 5, 1)
        self.conv2 = nn.Conv2d(32, 64, 5, 1)
        self.dropout = nn.Dropout2d(0.2)
        fc1_h = int(input_size[0] / 4 - 3)
        fc1_w = int(input_size[1] / 4 - 3)
        self.fc1 = nn.Linear(fc1_h * fc1_w * 64, 1024)
        self.fc2 = nn.Linear(1024, 10)

    def forward(self, x):
        x = self.conv1(x)
        x = F.max_pool2d(x, 2)
        x = self.conv2(x)
        x = F.max_pool2d(x, 2)
        x = torch.flatten(x, 1)
        x = self.fc1(x)
        x = F.relu(x)
        x = self.dropout(x)
        x = self.fc2(x)
        output = F.log_softmax(x, dim=1)
        return output

また学習したパラメータは以下のように保存します。

torch.save(model.state_dict(), "mnist_cnn.pt")

 

2. PyTorchで推論用モデルを構築

推論用モデルの構築と、ONNXでの保存について、詳細は以下のコードを参照してください。

https://github.com/takmin/PyTorch2OpenCV_sample/blob/master/save_LeNet_ONNX.py

推論用モデルは以下のように学習モデルから、推論時には使用しないDropoutの層を除去した形になります。

class LeNet5_Infer(nn.Module):
    def __init__(self, input_size):
        super(LeNet5_Infer, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, 5, 1)
        self.conv2 = nn.Conv2d(32, 64, 5, 1)
        fc1_h = int(input_size[0] / 4 - 3)
        fc1_w = int(input_size[1] / 4 - 3)
        self.fc1 = nn.Linear(fc1_h * fc1_w * 64, 1024)
        self.fc2 = nn.Linear(1024, 10)

    def forward(self, x):
        x = self.conv1(x)
        x = F.max_pool2d(x, 2)
        x = self.conv2(x)
        x = F.max_pool2d(x, 2)
        x = torch.flatten(x, 1)
        x = self.fc1(x)
        x = F.relu(x)
        x = self.fc2(x)
        output = F.log_softmax(x, dim=1)
        return output

この推論用モデルに、学習したパラメータを読み込みます。

    model = LeNet5_Infer([28,28])
    model.load_state_dict(torch.load("mnist_cnn.pt"))

3. 推論モデルをONNXフォーマットで保存

ONNXで保存する方法の詳細については、以下の公式サイトを参照してください。

torch.onnx — PyTorch 1.7.0 documentation

ここでは以下のような形で保存しています。

    # Input to the model
    x = torch.randn(1, 1, 28, 28)
    torch_out = model(x)

    # Export the model as onnx (lenet5.onnx)
    torch.onnx.export(model,             # model being run
                        x,               # model input (or a tuple for multiple inputs)
                        "lenet5.onnx",   # where to save the model (can be a file or file-like object)
                        export_params=True,        # store the trained parameter weights inside the model file
                        opset_version=10,          # the ONNX version to export the model to
                        do_constant_folding=True,  # whether to execute constant folding for optimization
                        input_names = ['input'],   # the model's input names
                        output_names = ['output'], # the model's output names
                        dynamic_axes={'input' : {0 : 'batch_size'},    # variable length axes
                                    'output' : {0 : 'batch_size'}})

xという仮の入力を乱数生成しているのは、フォーマットのValidationのためらしいです。

4. OpenCVでONNXファイルを読み込み

OpenCVC++)でONNXファイルを読み込み、推論まで行うコードの詳細はこちらを参照してください。

https://github.com/takmin/PyTorch2OpenCV_sample/blob/master/opencv_LeNet.cpp

ONNXのコードは以下のようにdnn::readNetを使用すれば、自動でONNXフォーマットとして読み込んでくれます。

dnn::Net net = dnn::readNet("lenet5.onnx");

明示的にONNXフォーマットとして読み込みたいときは、

dnn::Net net = dnn::readNetFromONNX("lenet5.onnx");

としても読み込むことができます。

以上で、OpenCVからPyTorchで学習したモデルが読み込めます。


PyTorchで学習したモデルをOpenCVで使う (Custom Layer編) - takminの書きっぱなし備忘録 @はてなブログへ続く