アクセル×『Interface』編集部特別企画 現場で役立つ! AI装置やアプリ製作 第五回 AIスマホ・アプリ作り①…構想&学習済みモデル作成

本連載は、コンピューター・サイエンス&テクノロジ専門誌『Interface』編集部と、株式会社アクセルの共同企画です。記事を担当するのは、現役のきゅうり農家を営みながらプログラミングや開発を行う、小池 誠さん。連載では製作やアプリ開発を通してエッジAIの技術解説を行います。
AIの推論モデル実行には、アクセルのエッジAI用推論エンジン「アイリアSDK」を使います。
手軽に利用できるようになった物体検出や画像異常検知の技術を活用し、農業現場で役に立つアプリケーションの製作方法について紹介します.ディープ・ラーニングの利点は、学習データさえ集めれば、高度な専門知識や高価なソフトウェアがなくても、実用レベルの画像認識が可能になる点です。大企業が対応しない個人レベルのニッチな課題はDIY精神で解決していきましょう。
前回に続き、今回から出荷用にキュウリが箱詰めされた段ボールを数えて,等級とともに表示するスマートフォン用のアプリケーションを作ります.まずは学習モデルを作り,その評価を行います.
※本企画は『Interface』2025年9月号に掲載された記事を再編集したものです。

解決したい課題

●キュウリの出荷作業の流れ

収穫したキュウリは等級ごとに段ボール箱に箱詰めされ、毎日トラックで卸売市場へ運ばれます。卸売市場では、指定された場所にキュウリの入った段ボール箱が積まれます(写真 1)。キュウリの等級は、段ボール箱に印刷された等級表示のどの位置に〇が記されているかで判断できるようになっています(写真 2)。最後に、等級ごとの出荷数を数えて用紙に記録して、卸売市場へ提出することで出荷作業は完了です。

(写真 1)卸売市場で箱詰めされたキュウリ
(写真 2)箱詰めされたキュウリの等級表示

●数え間違いの課題

このとき、出荷数の記録ミスがごくまれに発生することがあります。数える作業は人間が行っているため、十分注意していても低頻度でケアレス・ミスが起こります。もちろん、誤った出荷数を提出すると、後にクレームにつながるため、何としても防がなければなりません。

こんなアプリを作りたい

●スマホで段ボールの写真を撮ると等級ごとに

出荷数を自動表示する数え間違いの課題を解決するために、図1に示すような画像認識アプリケーションを考えました。カメラを搭載したデバイスを使って積まれた段ボール箱の写真を撮ると、等級ごとに出荷数を集計して画面に表示します。等級ごとのカウントは、物体検出の技術を利用することで実現できそうです。
識別する等級は、

  • 2L等級
  • L等級
  • M等級
  • S等級
  • 2S等級
  • UNKNOWN(上記等級以外、等級のチェックが見えない

のように5等級と等級表示が確認できない場合で、合計6クラスの識別を想定します。
加えて、本アプリケーションは、卸売市場でも手軽に使えるように、スマートフォンで実行できることが求められます。

(図1)考案した出荷数カウント・アプリのイメージ。これで出荷数の記録ミスを防げる

●物体検出によるカウント

物体検出とは、画像の中から、どんな物体がどの位置に写っているかを認識する技術です。物体検出の技術は、自動運転における歩行者の検出や、X線やMRIなどの医療画像から病変部位を発見するためなど、さまざまな分野で活用が進められています。農業分野でも、果樹園での果実数のカウントや収穫ロボットの研究開発などで活用されています。
本アプリケーションでは、この物体検出の技術を活用し、段ボール箱に印刷された等級表示を認識することで、等級の分類と箱の数のカウントを同時に実行する仕組みを採用しました。

推論を実行するフレームワークの選択

スマートフォンでディープ・ラーニングの推論を実行するには、(表1)に示すフレームワークが利用できます。各フレームワークは、対応するモデル・フォーマットが異なるため、選択時には注意が必要です。

今回採用した「アイリアSDK」は、ONNXモデルに対応し、Flutter向けSDKが提供されています。マルチプラットフォームなアプリケーション開発に対応したFlutter(※1)を利用することで、AndroidとiOS両方に対応したアプリ開発が可能になります。

名称対応デバイス対応モデル特徴
ONNX RuntimeAndroid/iOSONNX形式ONNX モデルの推論を実行するための標準的なランタイムで、さまざまなハードウェアに対応している
ailia SDKAndroid/iOSONNX形式アクセルが開発した ONNX モデルの推論を高速に実行するための推論エンジンで、Flutter 向けの SDK が提供されている
TensorFlow LiteAndroid/iOSTFLite形式モバイルや組み込みデバイスで機械学習モデルを実行するためのフレームワーク
ExecuTorchAndroid/iOSPyTorch形式AR/VR から iOS、Android 展開まで、あらゆるデバイスどでPyTorch モデルを実行するためのプラットフォーム
Core MLiOSCoreML形式Apple シリコンに最適化することで省メモリ&省電力で AI を実行するためのフレームワーク
MediaPipeAndroid/iOSTFLite形式グーグルが開発したモバイルや組み込みアプリケーションに AI をデプロイするためのフレームワーク
NCNNAndroid/iOSNCNN形式テンセントが開発したモバイル向け推論フレームワーク
(表1)スマートフォン実装のためのフレームワーク

モデルの選択

物体検出は、今までに数多くの手法が研究開発されてきており、どれを使ったらよいか迷ってしまいます。選定基準としては、次の4項目を考慮しました。

  • 比較的新しくベンチマーク的な公開データセットで精度が良いもの
  • ライブラリ化されており簡単に試せるもの
  • 軽量でスマートフォンでも実行できそうなもの
  • ライセンス的に使用しやすいもの(個人が無料で使用できるもの)

例えば、Ultralyticsライブラリでは、高精度で軽量なYOLO11を利用できます。他にもMMDetectionライブラリでは、自由度の高いApache License 2.0で利用できます。
今回は、最終的にスマートフォンへ実装することを考慮して、推論エンジンであるアイリアSDKにおいて利用例が公開されており、Apach License 2.0で利用可能なYOLOX(※2)を利用することにしました。

ステップ 1…データ収集

●段ボールが積まれた状態を画角を変えて撮影

物体検出用の画像データは、スマートフォンのカメラ・アプリを使って収集します。出荷前の段ボール箱が積まれた状態を、画角を変えながら複数枚撮影し、これを1週間にわたって毎日続けました。その結果、合計で238枚の写真を撮りためることができました。

●画像は正方形にリサイズする

YOLOXが対応する画像サイズは、640×640ピクセルの正方形です。撮影した画像から(図2)のように正方形の領域を切り出し、1280×1280ピクセルにリサイズします。この段階では、後の画像加工や高解像度入力が可能なモデルへ切り替えることも考慮して、1280×1280ピクセルの正方形で保存しました。収集した画像データの例を(図3)に示します。

(図2)YOLOXに対応させるために撮影画像はトリミングして保存する
(図3)収集した画像データの例

ステップ 2…アノテーション作業

収集した画像データに対して、アノテーション作業を行います。検出したい対象物に対し、BBoxとラベル情報を付加します。アノテーション作業には、オープンソースのツールCVAT(※3)を使用します。CVATは、Webアプリケーション型のアノテーション・ツールで、ローカル環境にDockerを使って立ち上げることができます。

●アノテーション環境の構築

CVATのインストール方法については、次のURLのドキュメントを参照してください。

https://docs.cvat.ai/docs/administration/basics/installation

筆者は、Windows環境にDocker Desktopを構築し、Dockerを使ってCVATを起動しました。Docker Desktopを利用したCVATの起動手順を次に示します。

  1. Docker Desktopからターミナルを開く
  2. gitを使ってCVATのリポジトリをクローンする(図4)
  3. 次のコマンドでDockerコンテナを起動する
    cd cvat
    docker compose up -d
  4. 次のコマンドで初期ユーザを追加する
    docker exec -it cvat_server bash-ic 'python3 ~/manage.py createsuperuser'
  5. ブラウザを起動しlocalhost:8080にアクセスする
(図4)Docker のターミナルからリポジトリをクローン

●アノテーション・ツール CVAT の使い方

CVATの基本的な使い方を次に示します。

  1. 新規にプロジェクトを作成する
  2. プロジェクトにタスク(学習用データ)を作成する
    • 「Create a new task」をクリックする
    • Subsetから「Train」を選択する
    • 画像データを登録する
    • 「OK」をクリックする
  3. タスクに登録されたジョブを選択する
  4. アノテーション作業を行う(図5)

4まで終了したら、2に戻って次はタスク(検証用データ)を作成します。その際に、Subsetから「Validation」を選択します。
このCVATは、プロジェクト→タスク→ジョブという階層構造でデータと作業を管理します。データセットごとにプロジェクトを作成し、学習用/検証用/テスト用といった区分けでタスクを作成します。さらに、各タスクに対してアノテーション・ジョブを生成します。

(図5)CVAT によるブラウザ上でアノテーション作業

●データセットの出力

学習用と検証用のアノテーション作業が完了したら、データセットを出力します。プロジェクト・タブを開き、プロジェクトのメニューから「Exportdataset」をクリックしてください。出力設定を次の通り設定し、「OK」をクリックしてください。

  • Export format:COCO 1.0
  • Save images:On
  • Custom name:shipping-box
  • Use default settings:On

しばらくすると、リクエスト・タブからデータセットがダウンロードできるようになります。ダウンロードしたデータセットを解凍し、(図6)に示すフォルダ構成になるようフォルダ名などを修正してください。

(図6)MS-COCO 形式データセットのフォルダ構成

●データセットの形式

物体検出モデルの学習に使用される一般的なデータセット形式には、次の形式があります。

  • MS-COCO形式
  • Pascal-VOC形式
  • YOLO形式
  • OpenImages形式

どの形式が利用できるかは、使用するモデルやライブラリによって異なります。そのため、事前に必要なデータセット形式を確認し、アノテーション・ツールの出力形式を選択することが重要です。または、形式変換ツールを利用することもできます。YOLOXを学習する場合は、MS-COCO形式が対応しています。

ステップ3…モデルの学習

●YOLOXのインストール

今回も学習はGoogle Colaboratory環境(以降、Colab)で行います。はじめに、Colab環境にYOLOXをインストールします。インストール手順を次に示します・

▶ステップ1…YOLOXのライブラリをクローンする
 次のコマンドを実行します。
!git clone https://github.com/Megvii-BaseDetection/YOLOX.git

▶ステップ 2…requirements.txt の編集
 YOLOXのrequirements.txtを開き、(リスト1)のように編集します。2025年7月時点では、このバージョンで動作することを確認しています。

(リスト1)requirements.txt の修正方法

▶ステップ 3…インストール・コマンドを実行
 次のコマンドを実行します。
%cd YOLOX/
!pip install -v -e .

●学習の実行

次に、モデルの学習を行います。今回はYOLOX-sをベースにファイン・チューニングを行いました。学習の手順を次に示します。

▶ステップ1…データセットの圧縮と解凍
 前節で作成したデータセットをzip圧縮し、GoogleColab環境へアップロードしてdatasetsフォルダ内に解凍します。
!unzip -q ../shipping-box.zip -d
datasets/

▶ステップ2…設定ファイルの作成
 学習設定ファイルYOLOX/exps/example/custom/dev_s.pyを新規作成し、(リスト2)の内容をコピー&ペーストします。
!/usr/bin/env python3
-- coding:utf-8 --
Copyright (c) Megvii, Inc. and its affiliates.
import os

from yolox.exp import Exp as MyExp

class Exp(MyExp):
def init(self):
super(Exp, self).init()
self.depth = 0.33
self.width = 0.50
self.exp_name = os.path.split(os.path.realpath(file))[1].split(".")[0]

# データセットのパスを指定
self.data_dir = "datasets/shipping-box"
self.train_ann = "instances_train.json"
self.val_ann = "instances_val.json"

# 学習の設定
self.num_classes = 6

self.max_epoch = 300
self.data_num_workers = 4
self.eval_interval = 10
self.no_aug_epochs = 15
self.save_history_ckpt = False

# データ拡張の設定
self.degrees = 10.0
self.translate = 0.1
self.scale = (0.9, 1.3)
self.hsv_prob = 0.5
self.flip_prob = 0.5
self.mosaic_scale = (0.8, 1.6)
self.shear = 2.0
self.perspective = 0.0
self.enable_mixup = False

▶ステップ3…モデルの重みファイルのダウンロード
 YOLOX-sモデルの重みファイルを次のコマンドでダウンロードします。
!wget https://github.com/Megvii-BaseDetection/YOLOX/releases/download/0.1.1rc0/yolox_s.pth

▶ステップ4…学習の開始
 次のコマンドで学習を始めます。
!python tools/train.py -f exps/example/custom/dev_s.py -b 16 -o-c yolox_s.pth

学習テクニック

学習の進行状況を確認するには、学習曲線の可視化が重要です。YOLOXはデフォルトではTensorboardによる可視化に対応していますが、学習時のオプションを追加することでWeights&Biases(Wandb)を用いた可視化に切り替えることが可能です。Wandbを使用するためには、学習コマンドを次のように変更してください。
!python tools/train.py -f exps/example/custom/dev_s.py -b 16 -o-c yolox_s.pth -l wandb

モデルの評価

●評価するコマンド

学習したモデルの評価を行います。評価は次のコマンドで実行できます。
!python tools/eval.py -f exps/example/custom/dev_s.py

●評価指標

物体検出の評価指標は、

  • Average Precision(AP)
  • Average Recall(AR)
  • Intersection over Union(IoU)

が用いられます。
まず、IoUとはモデルが推論した領域と正解の領域が、どの程度一致しているかを表す指標です(図7)。完全に一致する場合に1.0となり、不一致の領域が増えると0.0に近づきます。
次に、IoUを基準にモデルが推論したBBoxが正解か不正解かを判定します。例えば、IoU=0.5の場合、IoUが0.5以上であれば正解と判定することを表します。続いてAPは、モデルの検出精度を表す指標で、AP@[IoU=0.5:0.95]ではIoUが0.5以上を正解とする場合から、IoUが0.95以上を正解とする場合までの平均適合率を表します。最後にARは、モデルの検出性能を表す指標です。areaはBBoxの面積を表し、maxDetsはモデルの最大検出数を表します。

(図7)IoUの定義…モデルの推論領域と正解領域の一致度合いを表す

●結果

先に示した評価コマンドを実行すると、(図8)に示す評価結果が出力されます。per class APとper classARは、分類クラスごとのAPとARです。結果を見ると、等級M、S、2Sは90%以上の精度で検出できていることが分かります。一方で、2L、L、UNKNOWNはやや精度が低下しています。これは、今回収集したデータにこれらの等級が少なかったことが原因だと考えられます。

(図8)学習したモデルの評価結果

ONNXモデルの保存

学習したモデルをONNX形式で保存します。モデルを保存するには、tools/export_onnx.pyの79行目と91行目を次のように修正する必要があります。
79行 目:torch.load(<省略>, weights_only=False)
91行目:torch.onnx.export(

これは、使用するPyTorchのバージョンによる仕様変更に対応するための修正です。
ソースコードを修正した後、(リスト3)のコマンドを実行すると、model.onnxというファイル名でモデルが保存されます。保存したモデル・ファイルをダウンロードして、次のステップへ進みます。
(リスト3)モデル・ファイルの保存
!pip install onnxruntime
!python tools/export_onnx.py --output-name model.onnx -f exps/example/custom/dev_s.py -c YOLOX_outputs/dev_s/best_ckpt.pth

次回はONNXモデルを取り込んだ物体検出用スマホ・アプリを作ります。
ディープ・ラーニングに基づく物体検出は、2013年に登場したR-CNN(Region Based ConvolutionalNeural Networks)以降、急速に研究開発が進んできました。2016年にはエンド・ツー・エンドなアーキテクチャを採用し高速化されたYOLOやSSDが登場しました。2020年にはTransformerアーキテクチャを採用したDETRなど、高精度な手法も登場しています。
現在では、このような手法は、UltralyticsやMMDetectionなどのライブラリを通じて、簡単に利用できるようになっています。

【参考文献】

(1)Flutter  https://flutter.dev/
(2)YOLOX  https://github.com/Megvii-BaseDetection/YOLOX
(3)CVAT  https://www.cvat.ai/

小池 誠 氏

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

コンピューター・サイエンス&テクノロジ専門誌『Interface』

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

SHARE THIS ARTICLE