私的AI研究会 > PyReview1

【復習】PyTorch ではじめる AI開発

 2021年8月から、坂本俊之著「PyTorch ではじめる AI開発」(C&R研究所 刊) を元に進めた AI学習をもう一度復習する。

▼ 目 次
※ 最終更新:2024/03/17 

学習方針

  1. 実行環境を新しくする Python3.7 → Python3.11
  2. インストールするパッケージの必要性確認とバージョンアップ
  3. ワーニングエラーが発生した場合の原因追求と除去
  4. 実行プログラムの解読と改良
  5. GPU 動作と速度の検証

CHAPTER 01 環境構築

サンプルデータの準備

  1. 下記のプロジェクト・パッケージをダウンロード
    update_20240214.zip (2.56GB) <アップデートファイル>

  2. 解凍してできたプロジェクトのディレクトリ「workspace_py37/」をホームディレクトリ直下に「workspace_pylearn/」として配置する
    c:\anaconda_win\workspace_pylearn\     ← Windows の場合
    ~/workspace_pylearn/                   ← Linux   の場合
      ├ chapter01
      ├ chapter02 
      ├ forest-path-movie-dataset
      │  ├── scenes
      │  ├── all_file.csv
      │  └── scene.csv
      └ sample
          ├── chapt01
          ├── chapt02
          ├── chapt03
          ├── chapt04
          ├── chapt05
          ├── chapt06
          ├── chapt07
          └── chapt09

パッケージのインストールと確認

  Windows の場合  Windows11 / Windows10

  1. 新しく仮想環境(py_learn) を作成する
    (base) PS C:\anaconda_win> conda create -n py_learn python=3.11
  2. 仮想環境(py_learn) を起動する
    (base) PS > conda activate py_learn
  3. 仮想環境に PyTorch をインストールする

    ● オフィシャルサイト PyTorch FROM RESEARCH TO PRODUCTION からインストールのためのコマンドを取得する

    ※ GPU/CPU を指定してコマンドを得る
    (py_learn) PS > pip3 install torch torchvision torchaudio        ← CPU の場合 (2024.02.07)
    (py_learn) PS > pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121     ← GPU の場合 (2024.02.12)
  4. 「conda install」コマンドでパッケージをインストール
    (py_learn) PS > conda install opencv pandas tqdm matplotlib PyYAML
  5. 「pip install」コマンドでパッケージをインストール
    (py_learn) PS > pip install scikit-learn pycocotools facenet-pytorch
  6. 環境確認
    ・「Python」のバージョン
    (py_learn) PS > python -V
    Python 3.11.7
    ・「Pytorch」のインストール確認とバージョン
    (py_learn) PS > python -c 'import torch;print(torch.__version__)'
    ・「Pytorch」で GPU 使用できるかの確認
    (py_learn) PS > python -c 'import torch;print(torch.zeros(1).cuda())'
    ・「tkinter」パッケージのインストール確認
    (py_learn) PS > python -c 'import tkinter'
    ・「ffmpeg」のコマンド確認
    (py_learn) PS > ffmpeg -h
     

  Linux の場合  Ubuntu22.04LTS / Ubuntu20.04LTS

  1. 新しく仮想環境(py_learn) を作成する
    (base) $ conda create -n py_learn python=3.11
  2. 仮想環境(py_learn) を起動する
    (base) $ conda activate py_learn
  3. 仮想環境に PyTorch をインストールする

    ● オフィシャルサイト PyTorch FROM RESEARCH TO PRODUCTION からインストールのためのコマンドを取得する

    ※ GPU/CPU を指定してコマンドを得る
    (py_learn) $ pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu    ← CPU の場合 (2024.02.07)
    (py_learn) $ pip3 install torch torchvision torchaudio    ← GPU の場合 (2024.02.12)
  4. システムにパッケージのインストール(未インストールの場合)
    (py_learn) $ sudo apt install libgtk2.0-dev
    (py_learn) $ sudo apt install pkg-config
  5. 「conda install」コマンドでパッケージをインストール
    (py_learn) $ conda install -c loopbio gtk2 ffmpeg gtk2-feature opencv pandas tqdm matplotlib PyYAML
  6. 「pip install」コマンドでパッケージをインストール
    (py_learn) $ pip install scikit-learn pycocotools facenet-pytorch
  7. 環境確認
    ・「Python」のバージョン
    (py_learn) $ python -V
    Python 3.11.0
    ・「Pytorch」のインストール確認とバージョン
    (py_learn) $ python -c 'import torch;print(torch.__version__)'
    ・「Pytorch」で GPU 使用できるかの確認
    (py_learn) $ python -c 'import torch;print(torch.zeros(1).cuda())'
    ・「tkinter」パッケージのインストール確認
    (py_learn) $ python -c 'import tkinter'
    ・「ffmpeg」のコマンド確認
    (py_learn) $ ffmpeg -h
    ・各種コマンド確認
    (py_learn) $ which python
    /home/USER/anaconda3/envs/py_learn/bin/python
    (py_learn) $ which pip
    /home/USER/anaconda3/envs/py_learn/bin/pip
    (py_learn) $ which conda
    /home/USER/anaconda3/condabin/conda

カメラデバイスの起動

  1. 必要なパッケージをインストールする
    (py_learn) pip install opencv-python
  2. サンプルファイル「chapt01_1x.py」(修正版)を実行する
    「chapt01_1.py」→「chapt01_1x.py」: Linux エラー対応、開始・終了時刻・所要時間の表示

     Windows の場合 
    (py_learn) PS > cd /anaconda_win/workspace_pylearn/chapter01
    (py_learn) PS > python chapt01_1x.py
     Linux の場合 
    (py_learn) $ cd ~/workspace_pylearn/chapter01
    (py_learn) $ python chapt01_1x.py

CHAPTER 02 定点カメラの映像を認識する

  1. 必要なパッケージをインストールする
    ・自前のライブラリ「my_file」のため
    (py_learn) pip install PyMuPDF

SECTION-005 PyTorch による学習

  1. 学習プログラム「chapt02_1x.py」(修正版)の実行
    「chapt02_1.py」→「chapt02_1a.py」→「chapt02_1w.py」→「chapt02_1x.py」: 開始・終了時刻・所要時間の表示

     Windows の場合 
    (py_learn) PS > python chapt02_1x.py
    learning start >>  2024-02-11 16:41:51.736780
        :
    learning end >>    2024-02-11 17:31:33.180019
    learning time >>   0:49:41.443341
    ▼「python chapt02_1x.py」実行ログ詳細

     Linux の場合 
    (py_learn) $ python chapt02_1x.py 
    learning start >>  2024-02-12 16:51:44.443271
        :
    learning end >>    2024-02-12 18:00:20.908547
    learning time >>   1:08:36.465290
    ▼「python chapt02_1x.py」実行ログ詳細

SECTION-006 認識用プログラム

  1. 認識用プログラム(tkinter版)「chapt02_2x.py」(修正版)の実行
    「chapt02_2.py」→「chapt02_2a.py」→「chapt02_2x.py」:
    (py_learn) python chapt02_2x.py

  2. 認識用プログラム(OpenCV版)「chapt02_2y.py」(修正版)の実行
    「chapt02_2b.py」→「chapt02_2y.py」:
    (py_learn) python chapt02_2y.py

OpenVINO™ を利用する(ONNXモデルコンバート検証)

  1. 必要なパッケージをインストールする
    (py_learn) pip install openvino
    (py_learn) pip install onnx
    (py_learn) pip install onnxruntime
  2. Pytorch の学習済みモデルを ONNX フォーマットに変換「chapt02_3x.py」(修正版)の実行
    「chapt02_3a.py」→「chapt02_3x.py」:
    (py_learn) python chapt02_3x.py
  3. ONNX フォーマットを IR フォーマットに変換
    パッケージをインストールする
    (py_learn) pip install openvino-dev
    ・onnx モデルを IR モデルにのコンバート
    (py_learn) mo  --input_model chapt02-model1.onnx --mean_values=input[123.675,116.28,103.53] --scale_values=input[58.395,57.12,57.375] --reverse_input_channels
    [ INFO ] Generated IR will be compressed to FP16. If you get lower accuracy, please consider disabling compression explicitly by adding argument --compress_to_fp16=False.
    Find more information about compression to FP16 at https://docs.openvino.ai/2023.0/openvino_docs_MO_DG_FP16_Compression.html
    [ INFO ] The model was converted to IR v11, the latest model format that corresponds to the source DL framework input/output format. While IR v11 is backwards compatible with OpenVINO Inference Engine API v1.0, please use API v2.0 (as of 2022.1) to take advantage of the latest improvements in IR v11.
    Find more information about API v2.0 and IR v11 at https://docs.openvino.ai/2023.0/openvino_2_0_transition_guide.html
    [ INFO ] MO command line tool is considered as the legacy conversion API as of OpenVINO 2023.2 release. Please use OpenVINO Model Converter (OVC). OVC represents a lightweight alternative of MO and provides simplified model conversion API.
    Find more information about transition from MO to OVC at https://docs.openvino.ai/2023.2/openvino_docs_OV_Converter_UG_prepare_model_convert_model_MO_OVC_transition.html
    [ SUCCESS ] Generated IR version 11 model.
    [ SUCCESS ] XML file: C:\anaconda_win\workspace_pylearn\chapter02\chapt02-model1.xml
    [ SUCCESS ] BIN file: C:\anaconda_win\workspace_pylearn\chapter02\chapt02-model1.bin
    ・コンバート結果の確認
    (py_learn) python chapt02_model_data_x.py
    
    --- OpenVINO™ Model Data Check with OpenVINO(API 2.0) Ver 0.02 ---
    
    OpenCV: 4.9.0
    OpenVINO inference_engine: 2023.3.0-13775-ceeafaf64f3-releases/2023/3
    
    OpenVINO™ Model Data Check with OpenVINO(API 2.0) Ver 0.02: Starting application...
       - Model        :  ./chapt02-model1.xml
       - Device       :  CPU
       - Image file   :  ../sample/chapt02/chapt02-sample_off.jpg
    input blob: name='input', N=1, C=3, H=224, W=224
    
    >>> Inference execution...
    
     >>> output >>>
    Type     :  <class 'openvino.runtime.utils.data_helpers.wrappers.OVDict'>
    Length   :  1
    KeyList  :  [<ConstOutput: names[output] shape[1,2] type: f32>]
    ValueList:
     [array([[ 1.8649045, -1.0063534]], dtype=float32)]
    
     *** STER 1 ***
    {<ConstOutput: names[output] shape[1,2] type: f32>: array([[ 1.8649045, -1.0063534]], dtype=float32)}
    
     *** STER 2 ***
    [[ 1.8649045 -1.0063534]]
    
    Type     :  <class 'numpy.ndarray'>
    Shape    :  (1, 2)
    Dimension:  2
    
     *** STER 3 ***
    [ 1.8649045 -1.0063534]
    
    Type     :  <class 'numpy.ndarray'>
    Shape    :  (2,)
    Dimension:  1
    
     Finished.
    ※ 変換したファイル「chapt02-model1.xml」「chapt02-model1.bin」
    ※ 変換コマンドの実行でパラメータを付加しないと前回同様に正常な変換ができない(要検討)

  4. OpenVINO™ で認識プログラム「chapt02_4y.py」を実行
    (py_learn) python chapt02_4y.py

OpenVINO™ 対応プログラムの API 2.0 対応

認識プログラム「chapt02_4y.py」

  1. モジュール読み込み
    #from openvino.inference_engine import IECore
    #from openvino.inference_engine import get_version
    import openvino.runtime as ov
  2. バージョン取得
    #print("OpenVINO inference_engine:", get_version())
    print("OpenVINO inference_engine:", ov.get_version())
  3. モデルの読み込み
    #ie = IECore()
    core = ov.Core()
    
    #net = ie.read_network(model = model_detector, weights = model_detector[:-4] + '.bin')
    #exec_net = ie.load_network(network = net, device_name = device)
    compiled_model = core.compile_model(model_detector, device_name = device)
    infer_request = compiled_model.create_infer_request()
  4. 推論実行
    #out = exec_net.infer(inputs={input_blob_name: img})
    out = infer_request.infer(img)
  5. 出力から必要なデータのみ取り出し
    #out = out[output_blob_name]
    #out = np.squeeze(out) # サイズ1の次元を全て削除
    out = np.squeeze(out[0]) # サイズ1の次元を全て削除
  6. プログラムの実行
    (py_learn) python chapt02_4y.py
    
    --- Surveillance camera with OpenVINO(API 2.0) Ver 0.02 ---
    
    OpenCV: 4.9.0
    OpenVINO inference_engine: 2023.3.0-13775-ceeafaf64f3-releases/2023/3
    
    Surveillance camera with OpenVINO(API 2.0) Ver 0.02: Starting application...
       - Image File   :  ../sample/chapt02/chapt02-sample-a.mp4
       - m_detect     :  chapt02-model1.xml
       - Device       :  CPU
       - Language     :  jp
       - Input Shape  :  input
       - Output Shape :  output
       - Program Title:  y
       - Speed flag   :  y
       - Processed out:  non
    
    FPS average:      32.30
    
     Finished.

モデルテストプログラム「chapt02_model_data_x.py」

  1. モジュール読み込み
    #from openvino.inference_engine import IECore
    #from openvino.inference_engine import get_version
    import openvino.runtime as ov
  2. バージョン取得
    #print("OpenVINO inference_engine:", get_version())
    print("OpenVINO inference_engine:", ov.get_version())
  3. Inference Engineコアオブジェクトの生成
    #ie = IECore()
    core = ov.Core()
  4. モジュール読み込み
    #net = ie.read_network(model=model, weights=model[:-4] + '.bin')
    #exec_net = ie.load_network(network=net, device_name=device, num_requests=1)
    compiled_model = core.compile_model(model, device_name = device)
    infer_request = compiled_model.create_infer_request()
  5. 入出力blobの名前の取得、入力blobのシェイプの取得
    #input_key = list(net.input_info.keys())[0]         # 入力データ・キー名
    #input_blob_name  = net.input_info[input_key].name
    #output_blob_name = next(iter(net.outputs))
    #batch,channel,height,width = net.input_info[input_blob_name].input_data.shape
    input_layer = compiled_model.input(0)
    input_blob_name = input_layer.any_name
    output_layer = compiled_model.output(0)
    output_blob_name = output_layer.any_name
    batch,channel,height,width = input_layer.shape
  6. プログラムの実行
    (py_learn) python chapt02_model_data_x.py

OpenVINO™ API2.0 で onnx モデルを扱う

対処したエラー詳細

「python chapt01_1.py」ウインドウを表示しないで終了する【Linux の場合】

「python chapt02_1.py」OpenCV(4.6.0)... error: (-2:Unspecified error)【Windows の場合】

「python chapt02_1.py」ランタイムエラー【Windows の場合】

「python chapt02_1w.py」非推奨コマンドエラー【Windows / Linux】

「python chapt02_1b.py」入力動画が終わってもプログラムが終了しない【Windows / Linux】

「python chapt02_2w.py / python chapt02_2b.py」非推奨コマンドエラー【Windows / Linux】

「python chapt02_2b.py」非推奨コマンドエラー【Windows / Linux】

「python chapt02_2b.py」AttributeError【Windows / Linux】

RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same

 「python chapt02_2x.py」「python chapt02_2y.py」【Windows / Linux】CUDA 実行環境の場合のみ発生

ImportError: DLL load failed while importing _imaging:

 「python chapt02_3a.py」【Windows / Linux】CUDA 実行環境の場合のみ発生

 

更新履歴

参考資料

 

Last-modified: 2024-03-17 (日) 07:07:48