RaspberryPi向けOpenCV-Pythonパッケージの最新版ビルドの配布
RaspberryPiではよくopencv-pythonを使用しますが, pipでインストールしようとすると, ビルド済みのパッケージではなく, ソースからビルドを試みてしまい,「Building wheel for opencv-python (pyproject.toml)…」というメッセージが表示されて待ち時間が長くなります. 2,3時間経っても何も進まないので, 無限ループに陥っているのではないか?という気持ちになってきます.
pip3 install opencv-python
Building wheel for opencv-python (pyproject.toml)...
この問題の原因は, OpenCVが32bitのRaspberryPi OSのCPUであるarmv7l向けにビルド済みのパッケージを配布していないことにあります. pipでopencv-pythonパッケージをインストールする際は, 通常、PyPIで管理されているwhlファイルが使用されます. このwhlファイルは64bitのRaspberry Pi OSのCPUであるaarch64向けには存在しますが, 32bit向けには存在しないため, ソースファイルからビルドを行うことになり, これには数時間を要します.
開発を始めたいときに, opencv-pythonのインストールに時間がかかってしまうと, 開発意欲が損なわれてしまいます. そこで, すぐにopencv-pythonをインストールしたい方のために, 32bitのRaspberryPi OS向けにビルドしたパッケージを配布します. 常に最新の状態を保つために, 私たちは毎日最新版のopencv-pythonをビルドし, 更新を続けています.
この記事では, ビルド時間を短縮したい方に向けて, 最新版のビルド済み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を最新に保つための仕組みも紹介しました. 別のパッケージにも応用できるので, ぜひ試してください!