PR

Raspberry Pi 4BでGoogle Driveに撮影した画像をアップロードする方法

PC & MOBILE
この記事は約14分で読めます。

Raspberry Piを使った監視カメラやタイムラプス撮影など、自動的に画像を撮影してクラウドに保存したいと考えたことはありませんか?

私は、ハウスで栽培しているきのこの成長状態を監視するためにこのシステムを構築しました。
毎日の成長変化を記録し、栽培環境の微調整に役立てています。

本記事では、Raspberry Pi 4とカメラモジュールV3を使って撮影した画像をGoogle Driveに自動アップロードする方法を詳しく解説します。遠隔地からでも撮影画像にアクセスできるようになり、様々なIoTプロジェクトに活用できます。

スポンサーリンク

使用機材

Raspberry Pi 4B + Heatsink Case

今回のプロジェクトでは、以下の機材を使用しています。

拡張機器・アクセサリー

OS情報

  • OS: Debian GNU/Linux 12 (bookworm)
  • アーキテクチャ: arm64
  • カーネル: Linux 6.12.22-v8+

カメラモジュールV3の設定

最初に、Raspberry PiにカメラモジュールV3を接続し、設定していきましょう。

必要なパッケージのインストール

ターミナルを開いて、以下のコマンドを順番に実行します。

# システム情報の確認
lsb_release -a

# 必要なPythonライブラリとパッケージのインストール
pip install opencv-python==4.5.1.48
pip install numpy==1.23.1
sudo apt install python3-picamera2
sudo apt install libatlas3-base

これらのパッケージは、カメラの制御とOpenCVを使った画像処理に必要です。特定のバージョンを指定することで、互換性の問題を回避しています。

カメラモジュールV3の初期設定については、Raspberry Pi カメラモジュールV3をPython OpenCVで操作する方法を参考にさせていただきました。

rcloneのインストールとGoogle Drive連携

次に、クラウドストレージと連携するためのツール「rclone」をインストールし、Google Driveと連携設定を行います。

rcloneのインストール

# パッケージ情報の更新とrcloneのインストール
sudo apt update
sudo apt install -y rclone

# インストールの確認
rclone version

バージョン情報が表示されれば、インストールは成功です。

Google Driveとの連携設定

次のコマンドでrcloneの設定を開始します。

# rcloneの設定を開始
rclone config

ここからは対話形式での設定になります。以下の手順に従って設定を進めてください。

新しいリモートの作成

No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q>

ここでは n と入力してEnterを押します。

リモート名の設定

Enter name for new remote.
name>

任意の名前(例:gdrive)を入力してEnterを押します。

ストレージタイプの選択

Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
[リストが表示されます]
Storage>

今回はリストに18 / Google Driveとあったので、
18 と入力して Google Drive を選択します。

クライアントIDの設定

Option client_id.
Google Application Client Id
Setting your own is recommended.
See https://rclone.org/drive/#making-your-own-client-id for how to create your own.
If you leave this blank, it will use an internal key which is low performance.
Enter a value. Press Enter to leave empty.
client_id>

テスト用途なら空欄のままEnterを押します。実運用時は独自のクライアントIDを取得することをお勧めします。

クライアントシークレットの設定

Option client_secret.
OAuth Client Secret.
Leave blank normally.
Enter a value. Press Enter to leave empty.
client_secret>

空欄のままEnterを押します。

アクセス権限の選択

Option scope.
Scope that rclone should use when requesting access from drive.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
[スコープのリストが表示されます]
scope>

1 と入力して、全ファイルへのフルアクセス権を選択します。

サービスアカウントの設定

Option service_account_file.
Service Account Credentials JSON file path.
Leave blank normally.
Needed only if you want use SA instead of interactive login.
Leading ~ will be expanded in the file name as will environment variables such as ${RCLONE_CONFIG_DIR}.
Enter a value. Press Enter to leave empty.
service_account_file>

個人アカウントでの利用なら空欄のままEnterを押します。

高度な設定

Edit advanced config?
y) Yes
n) No (default)
y/n>

n と入力して標準設定を使用します。

自動設定の使用

Use auto config?
* Say Y if not sure
* Say N if you are working on a remote or headless machine
y) Yes (default)
n) No
y/n>

GUIが使用できる環境なら y と入力します。この後、ブラウザが起動してGoogleアカウントによる認証が求められます。認証後、「Success!」と表示されたら成功です。

共有ドライブの設定

Configure this as a Shared Drive (Team Drive)?
y) Yes
n) No (default)
y/n>

個人用のGoogleドライブを使用するなら n と入力します。

設定の保存

Keep this "gdrive" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d>

y と入力して設定を保存します。

設定の終了

Current remotes:

Name                 Type
====                 ====
gdrive               drive

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q>

q と入力して設定を終了します。

これでrcloneとGoogle Driveの連携が完了しました。次のコマンドで接続テストができます:

rclone lsd gdrive:

Google Driveのルートディレクトリにあるフォルダ一覧が表示されれば成功です。

画像撮影とGoogle Driveアップロードの自動化

次にPythonスクリプトを作成して、画像の撮影とGoogle Driveへのアップロードを自動化します。

capture_and_upload.py スクリプトの作成

以下のPythonコードを capture_and_upload.py という名前で保存します:

import os
import cv2
import time
import subprocess
from datetime import datetime
from picamera2 import Picamera2
from libcamera import controls

# プロジェクトディレクトリと画像保存用ディレクトリの設定
project_dir = os.path.dirname(os.path.abspath(__file__))
image_dir = os.path.join(project_dir, "images")
uploaded_log = os.path.join(project_dir, "uploaded.txt")  # アップロード済みリストのログファイル
gdrive_path = "gdrive:photos/"

# 画像保存ディレクトリを作成(すでに存在する場合は何もしない)
os.makedirs(image_dir, exist_ok=True)

# カメラの初期化と設定
picam2 = Picamera2()
picam2.configure(picam2.create_still_configuration(main={"format": 'RGB888', "size": (3840, 2160)}))
picam2.set_controls({"AfMode": controls.AfModeEnum.Continuous})
picam2.start()
time.sleep(15)  # カメラ起動後の安定時間

# 現在の時刻を使ってファイル名を生成し、画像を保存
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
image_filename = f"image_{timestamp}.jpg"
image_path = os.path.join(image_dir, image_filename)

image = picam2.capture_array()
cv2.imwrite(image_path, image)
print(f"[INFO] 画像を保存しました: {image_path}")

# アップロード済みのファイル一覧を読み込む
if os.path.exists(uploaded_log):
    with open(uploaded_log, "r") as f:
        uploaded_files = set(f.read().splitlines())
else:
    uploaded_files = set()

# 未アップロードの画像ファイルをすべてチェックしてアップロード
image_files = sorted(f for f in os.listdir(image_dir) if f.endswith(".jpg"))

for filename in image_files:
    if filename in uploaded_files:
        continue  # すでにアップロード済みのファイルはスキップ

    local_path = os.path.join(image_dir, filename)
    try:
        subprocess.run(["rclone", "copy", local_path, gdrive_path], check=True)
        print(f"[INFO] アップロード完了: {filename}")
        # アップロードに成功したファイル名をログに追記
        with open(uploaded_log, "a") as f:
            f.write(filename + "\n")
    except subprocess.CalledProcessError as e:
        print(f"[ERROR] アップロード失敗: {filename}: {e}")
        break  # ネットワークなどのエラーが発生したら中断

このスクリプトの主な機能:

  1. 現在の日時をタイムスタンプとして使用し、一意のファイル名を生成
  2. 高解像度(4K)でRGBフォーマットの画像をキャプチャ
  3. 連続オートフォーカスモードを使用してピント合わせを自動化
  4. ローカルに画像を保存した後、rcloneを使ってGoogle Driveにアップロード

より高度な用途のため、以下のようにコードをカスタマイズすることも可能です:

  • 解像度の変更:sizeパラメータを変更(例:(1920, 1080)
  • 画像フォーマットの変更:JPEGの圧縮率調整など
  • 撮影前の待機時間の調整:明るさや環境に応じてtime.sleep()の値を調整

Google Drive上でのアップロード先の準備

スクリプトを実行する前に、Google Drive上にアップロード先のフォルダを作成しておきましょう:

  1. WebブラウザでGoogle Driveにアクセス
  2. 「新規」→「フォルダ」をクリックし、「photos」という名前のフォルダを作成
  3. 必要に応じてフォルダの共有設定を調整

このフォルダのパスが、スクリプト内のgdrive_path変数に設定したパス(gdrive:photos/)と一致していることを確認してください。

スクリプトの実行と定期実行の設定

スクリプトの実行権限を付与

chmod +x capture_and_upload.py

手動実行でテスト

まずは手動でスクリプトを実行して、正常に動作するか確認します:

python3 capture_and_upload.py

正常に実行されると、ローカルのimagesフォルダに画像が保存され、その後Google Driveのphotosフォルダにアップロードされます。

cronで定期実行を設定

自動的に定期実行するには、cronを使います:

# cronを編集
crontab -e

エディタが開いたら、以下のような行を追加します:

# 1時間ごとに実行する場合
0 * * * * /usr/bin/python3 /home/pi/path/to/capture_and_upload.py

# 毎日午前9時と午後6時に実行する場合
0 9,18 * * * /usr/bin/python3 /home/pi/path/to/capture_and_upload.py

# 10分ごとに実行する場合(テスト用)
*/10 * * * * /usr/bin/python3 /home/pi/path/to/capture_and_upload.py

必ず/home/pi/path/to/の部分を実際のスクリプトのパスに置き換えてください。

まとめ

この記事では、Raspberry Pi 4とカメラモジュールV3を使って撮影した画像をGoogle Driveに自動アップロードする方法を解説しました。この仕組みを活用することで、以下のようなプロジェクトに応用できます。

  • 防犯カメラや監視カメラシステム
  • タイムラプス撮影
  • 野生動物観察カメラ
  • 植物の成長記録
  • 天候や風景の定点観測

さらに発展させると、モーションセンサーと組み合わせて動きを検知した時だけ撮影したり、画像処理で特定のオブジェクトを検出したりすることも可能です。

私の場合、現在ハウスで1時間間隔で撮影したきのこの成長過程の画像データを蓄積しています。この蓄積した画像データを元に、きのこの成長段階を物体認識モデル(YOLO)に学習させて、最適な収穫時期を自動判断するプロジェクトを進行中です。AIによる画像解析を組み合わせることで、栽培の効率化と品質向上を目指しています。

ご自身のプロジェクトに合わせてカスタマイズし、IoTの可能性を広げてみてください!

参考リンク

コメント

タイトルとURLをコピーしました