OpenCV 4.7.0のChangeLogを読み解く

この記事は[OpenCV Advent Calendar 2022](https://qiita.com/advent-calendar/2022/opencv)の12月33日の記事です。  

# TL;DR
OpenCV 4.7.0が12/29にリリースされました、ということで、そのご紹介。

https://github.com/opencv/opencv/releases/tag/4.7.0

# はじめに
- 自己紹介
    - どこにでもいる画像処理エンジニアでした！2023年はどうなるか分かりません!!
- ChangeLogの場所
    - OpenCVのChangeLogは、[wiki](https://github.com/opencv/opencv/wiki/ChangeLog#version470)で管理されている。

この修正内容のサマリーをざっくりと読み解いていきたい。こんな対応を入れたんだ、へー、というレベルで。

# 個人的気になったポイント

- SPNGライブラリ対応！libpngから完全置き換えもあり？
- Optimizationの「scalable vector instructions」対応とか、胸がわくわくしますね。そういえば、ARMにもあるんですよね……
    - https://community.arm.com/arm-community-blogs/b/architectures-and-processors-blog/posts/scalable-matrix-extension-armv9-a-architecture
- DNNのためのNPU backend対応にやはり力入れていますね！！

-----
**Highlights on this release:**
-----

# DNN:
(後述)

# Algorithms:

- ArUco markers and April tags support including ChAruco and diamond boards detection and calibration.
  - （これがよく分からない！） [Contribのarucoモジュールの変更差分](https://github.com/opencv/opencv_contrib/commits/4.x/modules/aruco)を見ても、さっぱり……　そもそもサポートしてたんじゃないの？と頭を抱えています。
    - 4.6.0: https://docs.opencv.org/4.6.0/d9/d6d/tutorial_table_of_content_aruco.html
    - 4.7.0: https://docs.opencv.org/4.7.0/d9/d6d/tutorial_table_of_content_aruco.html
- QR code detection and decoding quality imrovement. Alignment markers support. Benchmark for QR codes: link
  - https://github.com/opencv/opencv/pull/22891
  - QRコード検出・解析するときに、QR Codeのalignment marker（▣でお馴染みのマーカー）を使うようになった。これで性能向上。
- Nanotrack v2 tracker based on neural networks.
  - https://github.com/opencv/opencv/pull/22951
  - Nanotrackは、非常に軽量で高速なobject tracking modelですと。そしてこれがv1からv2にバージョンアップして（コード修正なしに）性能向上できる。
- Stackblur algoruthm implementation.
  - https://github.com/opencv/opencv/pull/20379
  - 画像にGaussian Blurをかける場合に、通常のカーネルを用いるよりもより高速に演算できる。

# Multimedia:
- FFmpeg 5.x support.
- CUDA 12.0 support. Hardware accelerated video codecs support on NVIDIA platforms with modern Video Codec SDK (NVCUVID and NVENCODEAPI).
- CV_16UC1 read/write video support with FFmpeg.
  - https://github.com/opencv/opencv/pull/22894 
  - 16UC1での画像読み込みができるように。特殊なカメラでしょうかね…
- Orientation meta support on Mac with native media API.
  - https://github.com/opencv/opencv/pull/22792 ? 
- New iterator-based API for multi-page image formats.
  - https://github.com/opencv/opencv/pull/22128
  - 拡張for文を使って、画像を読み書きできるようになったらしい。
- libSPNG support for PNG format.
  - https://github.com/opencv/opencv/pull/22226
  - libpngよりも高速なPNG Encoder/Decoderもサポート。
      - https://libspng.org/
- SIMD acceleration for self-built libJPEG-Turbo
    - https://github.com/opencv/opencv/pull/22372
    - これまでSIMDが無効化されていたので性能が十分でていなかったので、対策。
- H264/H265 support on Android. Multiple fixes for video decoder, endcoder and camera memory layout.
    - https://github.com/opencv/opencv/issues/22490
    - https://github.com/opencv/opencv/pull/22503/files

# G-API
(後述)

# Optimization:
- New universal intrinsics backend for scalable vector instructions. The first scalable implementation for RISC-V RVV 1.0.
    - https://github.com/opencv/opencv/pull/22179
    - （そのほか、一杯修正）https://github.com/opencv/opencv/commits/4.x/modules/core/include/opencv2/core/hal/intrin_rvv_scalable.hpp
    - 可変長バックエンドと組み合わせることで、より性能を高めるらしい。

# DNN Module patches
- Improved layers / supported more models:
  - Scatter and ScatterND #22529, Tile #22809
  - Fixes in Slice (support negative step #22898)
  - Support some reduce layers of ONNX #21601
- Added CANN backend support #22634. Link to the manual: https://github.com/opencv/opencv/wiki/Huawei-CANN-Backend.
    - https://github.com/opencv/opencv/pull/22634
    - Huawei社のNPU "Ascend 310" を活用できるようになるらしい。CPUに比べてかなりの爆速がでている。面白そう。
- Added bacthed NMS for multi-class object detection #22857
    - https://github.com/opencv/opencv/pull/22857
    - https://github.com/opencv/opencv/issues/22851
    - 複数クラス対応する際に、それぞれに実装するよりも楽にするための実装。
- Accelerating convolution, especially for ARM CPU. #21910 and #22905
    - https://github.com/opencv/opencv/pull/21910
    - https://github.com/opencv/opencv/pull/21905
    - https://github.com/opencv/opencv/commits/4.x/modules/dnn/src/layers/fast_convolution
    - SIMD実装を頑張り、処理時間が半減できた
- Winograd's convolution optimization
    - 行列掛け算をする時に、「加減回数を増やすが、乗算回数を減らす」テクニック。
    - https://developer.smartnews.com/blog/2017/06/convolution-speed-up/

# G-API framework:
- Slightly refactored G-API executor class hierarchy for the future extensibility: #22451;
  - 将来の拡張性を考えて、階層構造に関するリファクタリング
- OpenCL backend:
  - Introduced zero-copy path from oneVPL surfaces to OpenCL/GPU memory buffers in the OpenCL backend: #22559;
      - OneVPL surfaceからOpenCL/GPU っ森バッファへのzero copy pathの導入。
      - つまり、メモリコピーなしで演算しましょうと。
- Intel® OpenVINO™ inference backend:
  - Enabled asynchronous infer requests in the OpenVINO NN backend: #22588.
      - OpenVINO NN backendでの非同期推論要求の有効化
      - https://docs.openvino.ai/2021.3/ie_plugin_api/async_infer_request.html
- Media integration:
  - Added tests and samples for oneVPL VAAPI (Linux) backend: #22212;
  - Fixed various issues with oneVPL build on Windows and Linux: #22393, #22456, #22462;
- Python bindings:
  - Exposed Stateful Kernels in Python: #22037;
  - Exposed ONNX Runtime NN backend in Python: #22017;
  - Exposed all core and imgproc G-API operations in Python: #22494, #22735;
  - （雑に言うと、Python-GAPI-NNの連携が非常に取りやすくなりました）。
- Samples:
  - Various updates to the G-API Pipeline Modelling tool: #22518, #22583;
- Other changes and fixes:
  - Updated ADE (the core internal graph library) to version 0.1.2a: #22432;
  - Fixed various build warnings: #22935, and issues: #22712;

ということで、今回の修正の雰囲気はつかめたと思います。

ご精読、ありがとうございました！！