本連載は、コンピューター・サイエンス&テクノロジ専門誌『Interface』編集部と、株式会社アクセルの共同企画です。記事を担当するのは、現役のきゅうり農家を営みながらプログラミングや開発を行う、小池 誠さん。連載では製作やアプリ開発を通してエッジAIの技術解説を行います。
AIの推論モデル実行には、アクセルのエッジAI用推論エンジン「アイリアSDK」を使います。
手軽に利用できるようになった物体検出や画像異常検知の技術を活用し、農業現場で役に立つアプリケーションの製作方法について紹介します.ディープ・ラーニングの利点は、学習データさえ集めれば、高度な専門知識や高価なソフトウェアがなくても、実用レベルの画像認識が可能になる点です。大企業が対応しない個人レベルのニッチな課題はDIY精神で解決していきましょう。
前回(第3回、2025年7月号)は,虫を捕ばくするための粘着シートを用いて、虫が付いていない正常画像と、虫が付いた異常画像を収集後、学習させて学習済みモデルを作りました。今回はエッジ端末(ラズベリー・パイ)にて、その学習済みモデルを利用した推論を行います。
※本企画は『Interface』2025年8月号に掲載された記事を再編集したものです。
●今回の主役:推論エンジン&開発環境アイリア SDK
今回は撮影デバイスのラズベリー・パイに前回作成した学習済みモデルを組み込みます。本システムでは、前回GoogleColaboratory上で制作し、ダウンロードした学習モデルを使って推論を行うために、アクセルが提供する「アイリア SDK」を使用します。アイリア SDKは、GitHub上の「アイリア models」というリポジトリに、オープンなモデルの実装例が豊富に公開されています。これらを参照することで、学習済みモデルを比較的容易に組み込むことができます。
なお、アイリア SDKは、基本的には有償ソフトウェアですが、個人利用などを条件に無償で使用できます。
ライセンス詳細については、参考文献(3)、(4)をご確認ください。
開発環境の構築
●Pythonの仮想環境を作る
ラズベリー・パイ上にPython仮想開発環境を構築します。OSは、Raspberry Pi OSの32ビット版を選択します。今回使用したOSのバージョンはbookworm(カーネル・バージョン:6.6.51)です。
ラズベリー・パイを起動したらターミナルを開き、リスト1のコマンドを実行します。
$ python -m venv --system-site-packages PestWatcher
$ cd PestWater
$ source bin/activate
(リスト1)Pythonの仮想環境を作ってアクティブにする
●ライブラリのインストール
アイリア SDKとambientのPythonライブラリをインストールします。どちらのライブラリも、pipコマンドでインストール可能です。リスト2のコマンドを実行してください。今回使用した主要なライブラリのバージョンを表1に示します。
$ pip install ailia
$ pip install git++https://github.com/AmbientDataInc/ambient-python-lib.git
(リスト2)アイリア SDKとambientのPythonライブラリをインストール
ライブラリ | バージョン |
---|---|
ailia | 1.5.0.0 |
rpicamera2 | 0.3.25 |
cv2 | 4.6.0 |
ambient | 0.2.1 |
推論を実行する
●学習済みモデルとメタデータの読み込み
リスト3に、推論を実行するためのコードを示します。推論を行うには、学習済みモデルとメタデータを読み込みます(リスト3の①)。
ここで、metadata.jsonには判定のしきい値が保存されており、model.onnxには学習済みモデルが保存されています。
import ailia
import numpy as np
import json
import cv2
class PatchCore:
def __init__(self, root_dir):
# 学習済みモデルをロードする…①
with open(f"{root_dir}/metadata.json", "r") as f:
self.meta = json.load(f)
self.root_dir = root_dir
self.net = ailia.Net(weight=f"{root_dir}/model.onnx")
def create_heatmap(self, anomaly_map, image):
normalized = (anomaly_map - self.meta['pixel_threshold']) / \
(self.meta['anomaly_maps.max'] - self.meta['anomaly_maps.min'])
normalized = np.clip(normalized, 0.0, 1.0)
heatmap = (normalized * 255.0).astype(np.uint8)
heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET)
heatmap = cv2.resize(heatmap, (image.shape[1], image.shape[0]))
heatmap = cv2.cvtColor(heatmap, cv2.COLOR_RGB2BGR)
heatmap = cv2.addWeighted(heatmap, 0.4, image, 0.6, 0)
return heatmap
def run(self, image):
data = (image / 255.).astype(np.float32)
data = data.transpose(2, 0, 1)
data = data[np.newaxis, :, :, :]
# 推論実行…②
pred = self.net.predict(data)[0]
# 異常スコア算出…③
anomaly_map = pred.squeeze()
anomaly_score = anomaly_map.reshape(-1).max()
pred_label = "Abnormal" if anomaly_score >= self.meta['image_threshold'] else "Normal"
pred_mask = (anomaly_map >= self.meta['pixel_threshold'])
pred_mask = (pred_mask * 255).astype(np.uint8)
ret = {
"Label": pred_label,
"Score": anomaly_score,
"Mask" : pred_mask,
"HeatMap": self.create_heatmap(anomaly_map, image),
}
return ret
(リスト3)推論を実行するコード
●推論の実行
推論の実行には、ailis.Netクラスのpredictメソッドを使用します(リスト3の②)。モデルは推定した異常スコア・マップを出力します。
●異常判定と可視化
メタデータのしきい値と照らし合わせて正常/異常を判定し、ヒートマップやマスク画像による可視化を行います(リスト3の③)。ヒートマップ画像は、異常スコア・マップをOpenCVライブラリを用いて変換することで作成します(リスト3の④)。
図1に復元した画像を示します。ここで、マスク画像[図1 (b)]の白い領域の面積を害虫スコアとしました。

(左)ヒートマップ、(右)マスク画像
Ambientへデータ送信
●ユーザ登録と送信プログラム作成
算出した害虫スコアをAmbientに送信します。Ambientにデータを送信するには,ウェブ・ページにアクセスしユーザ登録を行う必要があります。次に、ログイン後、チャネル一覧ページを開き、「チャンネルを作る」ボタンから新規チャネルを作ります。
Ambientは、デバイスから送信されてくるデータを、チャネルという単位で管理します。チャネルには、IDとアクセス・キーが割り振られており、デバイスからデータを送信する際に使用します。Ambientを使用すると、2行程度のコードで簡単にデータを送信できます。詳細な使い方については、参考文献(5)、(6)のドキュメントを参照ください。
●データ送信プログラムの定期実行
ラズベリー・パイで送信プログラムの定期実行を行うには、systemdのtimer機能が便利です。
▶必要なファイルの作成と内容
/etc/systemd/system/に,次のように2つのファイルを作ります。ファイル名は同じ名前を付けます。
/etc/systemd/system/myscript.service
/etc/systemd/system/myscript.timer
myscript.serviceは、実行する処理内容について記述します。リスト4には今回の内容を示します。myscript.timerは、定期実行のための条件を記述します。リスト5には毎日午前9時に定期実行するための記述例を示します。
「Unit]
Description=Startup Script
After=network.target
[Service]
ExecStart=/home/pi/PestWatcher/bin/python /home/pi/PestWatcher/app.py
WorkingDirectory=/home/pi/PestWatcher
User=pi
[Install]
WantedBy=multi-user.target
(リスト4)実行する処理内容を記述したmyscript.service
app.pyは推論の実行と Ambient へのデータ送信を実行するプログラム
[Unit]
Description=Run myscript daily at 9:00 AM
[Timer]
OnCalendar=09:00
Unit=myscript.service
[Install]
WantedBy=timers.target
(リスト5)定期実行のための条件を記述したmyscript.timer
$ sudo systemctl daemon-reload
$ sudo systemctl enable myscript.timer
$ sudo systemctl start myscript.timer
害虫モニタリングの結果
今回製作した害虫モニタリング装置を、実際に温室ハウスに設置し、約10日間試運用を行いました。図2にはAmbientの折れ線グラフとマスク画像を示します。
試運用の結果、開始時には小さかった害虫スコアが、数日経過するにつれて増加する様子が確認できました。また、折れ線グラフの傾きに注目することによって、害虫が増加した時期を可視化できました。

【参考文献】
(1)Roth,K.,et al;Towards Total Recall in Industrial Anomaly Detection,In Proc. of the IEEE/CVF conference on computer vision and pattern recognition,pp.14318-14328,2022.
(2)Batzner,K.,et al;Efficientad:Accurate visual anomaly detection at millisecond-level latencies,IEEE/CVF Winter Conference on Applications of Computer Vision,pp.128-138,2024.
(3)ailia-models,GitHub.
https://github.com/axinc-ai/ailia-models
(4)無償版ライセンス条件,ailia SDK License Information.
https://ailia.ai/license/
(5)Ambientを使ってみる,Ambient公開ボード.
https://ambidata.io/docs/gettingstarted/
(6)AmbientのPythonライブラリ,Ambient公開ボード.
https://ambidata.io/refs/python/

小池 誠 氏
キュウリ農家、博士(情報学。大学卒業後、自動車部品メーカーにてソフトウェア・エンジニアとして勤務・退職後、2015年から農業に従事。現在は農業を行う傍ら、大学においてスマート農業に関する研究に取り組んでいる。

コンピューター・サイエンス&テクノロジ専門誌『Interface』
CQ出版社が発行するコンピュータ技術専門の月刊誌です。1974年の創刊以来、組み込みシステム、ソフトウェア、AI、IoTなど、時代とともに進化するコンピュータ技術を幅広く紹介しています。理論だけでなく、実践的なプログラミングや実機製作の記事も豊富で、エンジニアから学生まで、コンピュータ技術を深く学びたい読者に支持されています。
https://interface.cqpub.co.jp/