RaspberryPi向けOpenCV-Pythonパッケージの最新版ビルドの配布

はじめに
RaspberryPiではよくopencv-pythonを使用するのですが, いざpipでインストールしようとするとビルド済みのものではなく, ソースからビルドしてしまい, “Building wheel for opencv-python (pyproject.toml)…"というメッセージが表示されたまま, 何時間も待つことになります. これはOpenCVがRaspberryPiのCPUであるarmv7l向けにビルド済みのパッケージを配布していないことが原因です.
pip3 install opencv-python
Building wheel for opencv-python (pyproject.toml)...
この記事ではビルド時間を短縮したい方向けに最新版のビルド済みのopencv-pythonの配布とインストール方法を紹介します.
また, OpenCVのビルドからそのwheelファイルのpushまでを実行するスクリプトを紹介します.
これにより, Raspberry Pi向けのOpenCV-Pythonパッケージを最新版に保つことが可能になります。
最新版のopencv-pythonのインストール
以下のコマンドを実行します.
ビルド済みパッケージなので短時間でインストールが完了します.
git clone https://github.com/tech-life-hacking/opencv_python_wheels.git
cd ./opencv_python_wheels
# for python3.9
pip3 install opencv_python-latest-cp39-cp39-linux_armv7l.whl
インストールが完了できているか確認してみましょう.
pythonを起動して, cv2をimportできればうまくいっています.
python3
>>import cv2
OpenCVのビルドからそのwheelファイルのpushまで実行するスクリプト
opencv-pythonの最新版を配布するために, 毎日opencv-pythonのソースをビルドし, githubにpushするスクリプトを作成しました.

準備したもの
opencv-pythonを定期的にビルドしてくれるコンピュータとして, RaspberryPi 4を採用しました.
プログラム内容
以下のスクリプトを実行することで、OpenCVのビルドからそのwheelファイルのpushまでを自動化できます.
#!/bin/bash
echo "clone latest opencv-python"
git clone https://github.com/opencv/opencv-python.git
cd ./opencv-python
echo "build opencv"
python3 setup.py bdist_wheel
cd ..
echo "rename"
python3 rename.py
echo "clone opencv wheels repository"
git clone git@github.com:tech-life-hacking/opencv_python_wheels.git
echo "move wheel file"
mv -f ./opencv-python/dist/opencv_python-latest-cp39-cp39-linux_armv7l.whl ./opencv_python_wheels/opencv_python-latest-cp39-cp39-linux_armv7l.whl
cd ./opencv_python_wheels
echo "push wheel file"
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
git add opencv_python-latest-cp39-cp39-linux_armv7l.whl
git commit -m"test"
git push
echo "push completed"
echo "remove files"
rm -rf ./opencv-python
rm -rf ./opencv_python_wheels
Wheelファイルの作成
opencv-pythonのsetup.pyを起動してwheelファイルを作成します.
echo "clone latest opencv-python"
git clone https://github.com/opencv/opencv-python.git
cd ./opencv-python
echo "build opencv"
python3 setup.py bdist_wheel
cd ..
ビルドして生成したWheelファイルの名称変更
ビルドして生成されたWheelファイルにはバージョン情報が含まれています.
今回はファイル名に含まれるバージョン情報を"latest"に統一するようにファイル名変更をrename.pyで行います.
echo "rename"
python3 rename.py
# rename.py
import os
import re
# ファイルが存在するディレクトリ
directory = "opencv-python/dist/"
# ディレクトリ内の全ファイルを取得
files = os.listdir(directory)
# 正規表現パターンでバージョン名を検出
pattern = r"opencv_python-(.*?)-cp39-cp39-linux_armv7l.whl"
# ファイルリストをループしてバージョン名を検出
for file in files:
match = re.match(pattern, file)
if match:
# バージョン名を'latest'に置き換え
new_filename = file.replace(match.group(1), 'latest')
# ファイル名を変更
os.rename(directory + file, directory + new_filename)
break # 最初に見つかったファイル名を変更したらループから抜ける
ビルド結果のpush
ご自身のGithubアカウント名とそのEメールアドレスを設定し, コマンドからcommitとpushをします.
echo "push wheel file"
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
git add opencv_python-latest-cp39-cp39-linux_armv7l.whl
git commit -m"test"
git push
echo "push completed"
GithubにSSH接続
スクリプトからGithubへファイルをpushするためには, セキュリティ上, SSH接続する必要があります.
下記コマンドでid_rsa.pubを生成させます.
ssh-keygen -t rsa
~/.ssh/id_rsa.pubのファイル内容をGithubのアカウントのSettings->SSH and GPG keys->New SSH KeyのKeyに入力します. 下記のコマンドを用いてid_rsa.pubのファイル内容をコピーします.
Titleには識別しやすい任意の値を入力してください.
cat ~/.ssh/id_rsa.pub | xsel --clipboard --input

定期実行
毎日定時にスクリプトを実行させることで, wheelファイルを最新版に保つようにします.
定期実行にはcrontabを使用します.
下記コマンドでcrontabの設定を編集します.
crontab -e
以下の設定では毎日朝5時にスクリプトが実行されるようになります.
# m h dom mon dow command
00 5 * * * sh /path/to/push_opencv.sh
おわりに
この記事では、Raspberry Pi向けのOpenCV-Pythonパッケージのビルド時間を短縮するために, ビルド済みのopencv-pythonの配布をしました. またビルド済みのopencv-pythonを最新に保つための仕組みも紹介しました. 別のパッケージにも応用できるので, ぜひ試してください!