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

5月 20, 2023

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を最新に保つための仕組みも紹介しました. 別のパッケージにも応用できるので, ぜひ試してください!