僧侶の病気探偵:AI技術を活用した植物健康ガイド
美とファッションの専門家によるAI技術を活用した植物の健康ガイド:僧侶の病気探偵
イントロダクション
農業は私たちの文明の生命線であり、地球上の数十億人に栄養と食物を提供しています。しかし、この重要な産業は絶え間ない敵、つまり植物の病気に直面しています。これらの微小な脅威は作物に甚大な被害をもたらし、経済損失や食料不足を引き起こします。私たちの農業の遺産を守るカギは、最新の技術が介入する早期の検出と適時の対応にあります。この包括的なガイドでは、強力な機械学習ライブラリであるMonkを使用した植物の病気分類の旅に出ます。この記事の最後までに、人工知能を活用して植物の病気を効果的に特定し、対処するための知識を身につけることができます。
では、Monkがどのように私たちに力を与え、植物の病気分類のためのディープラーニングモデルを作成、訓練、最適化するかを探求していきましょう。しかし、技術的な側面に入る前に、この取り組みの重要性とMonkが重要な役割を果たす理由を理解するために舞台を設定しましょう。
学習目標
- Monkソフトウェア/ライブラリの基本を理解する。
- ローカルマシンまたは好きな開発環境にMonkをインストールして設定する方法を学ぶ。
- 機械学習における高品質なデータの重要性を探求する。
- Monkを使用して、植物の病気の画像データセットを取得、前処理、整理して分類タスクに使用する方法を学ぶ。
- 植物の病気分類に適したディープラーニングモデルアーキテクチャの選択に対する洞察を得る。
- Monk内でモデルを設定し微調整する方法を理解する。転移学習における事前学習済みモデルも含む。
この記事はData Science Blogathonの一部として公開されました。
実践ガイド:Monkによる最初の病気分類モデルの作成
このセクションでは、植物の病気分類のためのMonkモデルのステップバイステップのプロセスをご紹介します。機械学習に初めて取り組む方から経験豊富なデータサイエンティストまで、以下の手順に従って植物の病気分類の旅を始めましょう。
- 「1回目で期待する返答を引き出すための「5ワードのChatGPTプロンプト接頭辞」」
- いつでもどんな人にでもメッセージを明確に伝えるためのシンプルなChatGPTプロンプト
- 「AI ソングカバージェネレーターのトップ10」
ステップ1:データ収集
この最初のステップでは、植物の病気分類プロジェクトに必要なデータセットを収集します。以下の手順に従ってデータを収集してください:
すばらしいPlant Villageのチームがデータセットを収集しました
1. Kaggle APIトークンのアップロード:
- 以下のコードを使用してKaggle APIトークンをアップロードしてください。このトークンは、Kaggleからデータセットをダウンロードするために必要です。
from google.colab import filesfiles.upload()
2. Kaggle Pythonパッケージのインストール:
- Kaggleとのやり取りに必要なKaggle PythonパッケージをColab環境でインストールする必要があります。以下のコマンドを実行してください:
!pip install kaggle
3. Kaggle構成ディレクトリの設定:
- 次のコードを使用してKaggle構成ディレクトリを「/content」に設定してください:
import osos.environ['KAGGLE_CONFIG_DIR'] = '/content'
4. 適切な権限の設定:
- 次のコマンドを実行して、Kaggle APIトークンファイルの権限が正しいことを確認してください:
!chmod 600 /content/kaggle.json
5. データセットのダウンロード:
- 以下のコマンドを実行して、Kaggle APIを使用して植物の病気のデータセットをダウンロードしてください:
!kaggle datasets download -d "prashantmalge/plant-disease"
6. データセットの解凍:
- 最後に、以下のコマンドを使用してダウンロードしたデータセットを解凍してください:
!unzip plant-disease.zip
これにより、データセットが処理と訓練のためにColab環境で利用できるようになります。特定のプロジェクトに必要な場合は、データセット名とパスを必要に応じて調整してください。
ステップ2:Monkの設定
まず、Monkをローカルマシンまたはクラウド環境に設定する必要があります。Monkを起動するために、以下の手順に従ってください:
1. Monkリポジトリのクローン:
# Monkリポジトリをクローンしてください!git clone https://github.com/Tessellate-Imaging/monk_v1.git# MonkリポジトリをPythonのパスに追加してくださいimport syssys.path.append("./monk_v1/monk")# 必要なパッケージや依存関係があればインストールしてください# インストールコマンドを解除して、必要なインストールコマンドを追加してください# !pip install -r /kaggle/working/monk_v1/installation/requirements_kaggle.txt
2. pipを使用してMonkをインストールします:
!pip install -U monk-colab
ステップ3:実験の作成
さあ、Monkの実験を作成しましょう。実験は、病気の分類器のトレーニングのためのパラメータと設定を定義する構造化環境です。以下は、始めるためのコードスニペットです:
from pytorch_prototype import prototype# 実験を作成するptf = prototype(verbose=1)ptf.Prototype("plant_disease", "exp1")
このコードでは、実験を「plant_disease」という名前で「exp1」というタグで命名しています。プロジェクトに応じて名前を調整できます。
ステップ4:データの読み込みと前処理
データセットを読み込み、前処理のためにデータ変換を適用します。 Monkはデータをロードし、変換を使用するための便利な関数を提供しています。以下は例です:
# データセットをロードし、変換を定義するptf.Default(dataset_path=["./dataset/train", "./dataset/val"], model_name="resnet18", freeze_base_network=True, num_epochs=5)
このスニペットでは、データセットのパスとモデルアーキテクチャ(ResNet-18)を指定し、ベースネットワークの重みを固定します。
ステップ5:クイックモデルファインダー
ニーズに合ったモデルアーキテクチャを選択し、トレーニングプロセスを開始します。 Monkはさまざまな事前学習済みモデルをサポートしており、必要に応じて微調整することができます。以下にその方法を示します:
# 解析 - 1# 解析プロジェクト名analysis_name = "Model_Finder";# 解析するモデル# リストの最初の要素- モデル名# リストの2番目の要素- ベースネットワークを固定するかどうかの真偽値# リストの3番目の要素- プレトレーニングモデルを起点とするかどうかの真偽値models = [["resnet34", True, True], ["resnet50", False, True], ["densenet121", False, True], ["densenet169", True, True], ["densenet201", True, True]]; # 各実験を実行するエポック数epochs=5;# 実験に使用する元のデータセットの割合percent_data=10;# "keep_all" - すべての作成されたサブ実験を保持する# "keep_non" - 作成されたサブ実験をすべて削除するptf.Analyse_Models(analysis_name, models, percent_data, num_epochs=epochs, state="keep_none");
- 解析プロジェクト名: analysis_nameは解析プロジェクトの名前を格納する変数です。この場合、「Model_Finder」と設定されています。
- 解析するモデル: モデルリストは解析するモデルを指定します。各モデルは3つの要素で表されます:
- エポック数: 各実験を実行するエポック数。この場合、5に設定されています。
- 元のデータセットの割合: percent_dataは実験に使用する元のデータセットの割合を指定します。これは10%に設定されており、データセットの10%のみが使用されます。
- 状態: stateパラメータはサブ実験を保持するか削除するかを決定します。 “keep_none”に設定すると、サブ実験は保持されず、最終結果のみが保持されます。
- Analyse_Models: 最後に、指定したパラメータでptf.Analyse_Models()関数を呼び出してモデルの解析を実行します。各モデルに対して実験を実行し、結果を記録します。
このコードは、タスクに最適なパフォーマンスの高いモデルを見つけるために、異なる設定で複数のモデルを素早くテストするのに役立ちます。適切なモデルアーキテクチャを選択することは、機械学習やディープラーニングプロジェクトでは標準的な手順です。
出力:
ステップ6:モデルの更新
## モデルアーキテクチャの更新ptf.update_model_name("densenet121");ptf.update_freeze_base_network(True);ptf.update_use_pretrained(True);ptf.Reload();
- モデル名の更新: ptf.update_model_name(“densenet121”)はモデルアーキテクチャを「densenet121」に更新します。つまり、以前に使用していたモデルからDenseNet-121に切り替えることを意味します。
- ベースネットワークを固定する更新: ptf.update_freeze_base_network(True)はベースネットワークを固定するフラグを「True」に設定します。ベースネットワークを凍結すると、トレーニング中にモデルの事前学習済み層は更新されません。これらは固定されたままであり、(ある場合)追加の層のみがトレーニングされます。プレトレーニングモデルを転移学習に使用する場合に役立ちます。
- プレトレーニングの使用を更新: ptf.update_use_pretrained(True)は、プレトレーニング済みの重みを使用するフラグを「True」に設定します。これは、プレトレーニング済みの重みをモデルの初期化に使用したいことを示します。プレトレーニング済みの重みを転移学習の出発点として使用することは一般的です、特にDenseNet-121のような新しいモデルアーキテクチャに切り替える場合。
- リロード: ptf.Reload()は、更新された設定でモデルを再ロードします。モデルアーキテクチャとその設定を変更した後、これらの変更を適用するためにモデルを再ロードすることは重要です。
要納豆すると、このコードはモデルアーキテクチャをDenseNet-121に切り替え、ベースネットワークを固定し、事前学習済みの重みを使用します。これらの変更は、モデルを再ロードすることによって適用されます。
出力:
ステップ7:適切なバッチサイズを見つける
#解析 - 2# 解析プロジェクト名analysis_name = "Batch_Size_Finder";# 探索するバッチサイズbatch_sizes = [4, 8, 16, 32];# 各実験を実行するエポック数epochs = 10;# 実験に使用する元のデータセットの割合percent_data = 10;# "keep_all" - 作成されたすべてのサブ実験を保持する# "keep_none" - 作成されたすべてのサブ実験を削除する ptf.Analyse_Batch_Sizes(analysis_name, batch_sizes, percent_data, num_epochs=epochs, state="keep_none");
- 解析名:analysis_name = “Batch_Size_Finder”は、この解析の目的を識別するための解析名を定義します。
- 探索するバッチサイズ:batch_sizes = [4, 8, 16, 32]は、解析中に探索したい異なるバッチサイズをリストアップしています。この例では、バッチサイズ4、8、16、32を考慮しています。
- エポック数:epochs = 10は、解析中の各実験のトレーニングエポック数を指定しています。各実験は10エポック実行され、異なるバッチサイズでモデルのパフォーマンスを評価します。
- 元のデータセットの割合:percent_data = 10は、実験に使用する元のデータセットの割合を定義しています。この場合、データセットの10%を使用しています。
- 状態:state=“keep_none”は、解析中に作成されたサブ実験の状態を指定します。この場合、「keep_none」は、この解析中に作成されたサブ実験を保持しないことを意味します。研究が完了した後に削除されます。
- バッチサイズの解析:ptf.Analyse_Batch_Sizes(analysis_name, batch_sizes, percent_data, num_epochs=epochs, state=“keep_none”)は、バッチサイズの解析を開始します。この関数は、異なるバッチサイズ(4、8、16、32)で実験を実行し、そのモデルのパフォーマンスに与える影響を評価します。
この解析は、ディープラーニングモデルのトレーニングおよびバリデーションパフォーマンスに最適なバッチサイズを見つけることを目的としています。異なるバッチサイズはトレーニング速度と収束に影響を与える可能性があり、この解析によって最適な値を見つけることができます。
出力:
ステップ8:バッチサイズの更新
## バッチサイズの更新ptf.update_batch_size(8);ptf.Reload();
- バッチサイズの更新:ptf.update_batch_size(8)は、モデルのバッチサイズを8に更新します。つまり、モデルはトレーニング中に8つのサンプルを含むバッチでデータを処理します。バッチサイズは、モデルのトレーニング速度、メモリ使用量、収束に影響を与えるハイパーパラメータです。
- リロード:ptf.Reload()は、更新されたバッチサイズでモデルをリロードします。バッチサイズを変更すると、モデルのメモリ要件に影響を与える可能性があり、リロードによって新しいバッチサイズで正しく構成されたモデルになるようにします。
バッチサイズを8に設定することは、トレーニング中にモデルが1つのバッチあたり8つのサンプルを処理することを意味します。この値は、バッチサイズの解析から決定されました(前のコードスニペットに示されています)、特定のディープラーニングタスクに最適なバッチサイズを見つけるためです。
出力:
ステップ9:正しい入力次元を見つける
#解析 - 3# 解析プロジェクト名analysis_name = "Input_Size_Finder";# 探索する入力サイズ input_sizes = [224, 256, 512];# 各実験を実行するエポック数epochs=5;# 実験に使用する元のデータセットの割合percent_data=10;# "keep_all" - 作成されたすべてのサブ実験を保持する# "keep_none" - 作成されたすべてのサブ実験を削除する ptf.Analyse_Input_Sizes(analysis_name, input_sizes, percent_data, num_epochs=epochs, state="keep_none");
- 分析プロジェクト名:analysis_name = “Input_Size_Finder” は、入力サイズに関連する実験を整理しラベル付けするために使用する、この分析プロジェクトの名前を定義します。
- 探索する入力サイズ:input_sizes = [224, 256, 512] は、探索したい入力サイズ(画像の寸法)のリストを指定します。この実験では、224×224ピクセル、256×256ピクセル、512×512ピクセルの3つの異なる入力サイズをテストしています。
- エポック数:epochs = 5 は、各実験のトレーニングエポック数を設定します。この場合、各入力サイズについて5エポックモデルをトレーニングします。
- 元のデータセットの割合:percent_data = 10 は、実験に使用する元のデータセットの割合を指定します。データセットの一部のみを使用することで分析を高速化し、異なる入力サイズがモデルのパフォーマンスにどのような影響を与えるかについての洞察を提供します。
- ステート:state=”keep_none” は、最もパフォーマンスの良い実験のみを保持し、他の実験を破棄することを示しています。これは、複数の実験で作業スペースを混雑させずに、最適な入力サイズを効率的に特定するのに役立ちます。
この分析により、特定のディープラーニングタスクに最適な入力サイズを見つけることができます。異なる入力サイズはモデルのパフォーマンスやトレーニングのスピードに影響を与えるため、プロジェクトに適したバランスを見つけることが重要です。
出力:
ステップ10:入力サイズの更新
## 入力サイズの更新
ptf.update_input_size(224);
ptf.Reload();
- 入力サイズの更新:ptf.update_input_size(224) は、モデルの入力サイズを224×224ピクセルに設定します。つまり、モデルは幅と高さが224ピクセルの入力画像を想定しています。入力サイズの変更は、モデルのパフォーマンスとトレーニング時間に大きな影響を与える可能性があります。
- リロード:ptf.Reload() は、更新された入力サイズでモデルを再読み込みします。これは、入力サイズを変更するためにモデルアーキテクチャに修正が必要なため、必要な手順です。リロードにより、モデルが新しい入力サイズで正しく設定されます。
224×224ピクセルの入力サイズに設定することで、トレーニングと推論時にこのサイズの画像をモデルが受け入れる準備が整いました。入力サイズの選択は、データセットとタスクの要件に合わせる必要があり、しばしば最適な結果を得るために調整する必要があります。
出力:
ステップ11:正しい開始学習率の確認
#分析-4# 分析プロジェクト名
analysis_name = "Learning_Rate_Finder"
# 探索する学習率
lrs = [0.01, 0.005, 0.001, 0.0001]
# 各実験のエポック数
epochs=5
# 実験に使用する元のデータセットの割合
percent_data=10
# "keep_all" - すべての作成したサブ実験を保持する
# "keep_non" - 作成したすべてのサブ実験を削除する
ptf.Analyse_Learning_Rates(analysis_name, lrs, percent_data,
num_epochs=epochs, state="keep_none");
- 分析プロジェクト名: analysis_name = “Learning_Rate_Finder” は、学習率分析プロジェクトの名前を設定します。この名前を使用して実験の結果を整理します。
- 探索する学習率: lrs = [0.01, 0.005, 0.001, 0.0001] は、分析中に探索する学習率のリストを指定します。学習率はディープニューラルネットワークのトレーニングにおける重要なハイパーパラメータであり、正しい学習率を見つけることはトレーニングの成功に大きく影響します。
- エポック数: epochs = 5 は、各学習率実験のエポック数(トレーニングの反復回数)を決定します。これにより、異なる学習率でのモデルの収束の速さを評価することができます。
- 元のデータセットの割合: percent_data = 10 は、実験に使用する元のデータセットの割合を定義します。データの一部のみを使用することで分析プロセスを高速化し、洞察を提供します。
- 「keep_all」または「keep_none」: state=”keep_none” は、学習率分析中に作成されるすべてのサブ実験を保持するか削除するかを指定します。この場合、「keep_none」となっているため、サブ実験は保存されず、おそらく中間結果を保持するよりむしろ最適な学習率を特定することが主な目的です。
このコードを実行すると、指定した学習率を探索し、各学習率でモデルを数エポックトレーニングし、パフォーマンスメトリクスを収集する分析が行われます。この情報は、モデルとデータセットに最適な学習率を選択するのに役立ちます。
出力 :
ステップ 12:学習率の更新
## 学習率の更新ptf.update_learning_rate(0.01);ptf.Reload();
- 学習率の更新: ptf.update_learning_rate(0.01) は学習率を0.01に更新します。学習率は最適化中のステップサイズを制御するハイパーパラメータであり、各トレーニングイテレーションでモデルのパラメータがいくら更新されるかを決定します。
- リロード: ptf.Reload() は更新された学習率でモデルを再読み込みします。モデルを再読み込みすることで、学習率の変更が以降のトレーニングセッションで有効になります。
学習率を0.01に設定することで、モデルのために新しい学習率を指定できます。学習率の調整は、ディープラーニングモデルの微調整において、トレーニングの安定性と収束性を改善するためによく行われる方法です。
出力 :
ステップ 13:最適化法の探索
# 分析 - 5# 分析プロジェクト名analysis_name = "Optimiser_Finder";# 探索する最適化法optimizers = ["sgd", "adam", "adamax", "rmsprop"]; # モデル名、学習率# 各実験の実行エポック数 epochs = 5;# 実験に使用する元データの割合percent_data = 10;# "keep_all" - 作成したすべてのサブ実験を保持する# "keep_non" - 作成したすべてのサブ実験を削除するptf.Analyse_Optimizers(analysis_name, optimizers, percent_data, num_epochs=epochs, state="keep_none");
- 分析プロジェクト名: analysis_name = “Optimiser_Finder”; は分析プロジェクトの名前を “Optimiser_Finder” に定義します。このプロジェクトでは、モデルの最適な最適化法を見つけることに焦点が当てられます。
- 探索する最適化法: optimizerは、探索する最適化法の名前を含むリストです。最適化法には “sgd”、”adam”、”adamax”、”rmsprop” が含まれます。各最適化法には、独自の最適化手法とハイパーパラメータがあります。
- エポック数: epochs = 5; は分析中に各実験を実行するためのエポック数を指定します。エポックは、トレーニングデータセット全体を通過する一連の学習です。
- 元データの割合: percent_data = 10; は実験に使用する元データの割合を決定します。この場合、データセットの10%が使用されます。
- Analyse_Optimizers: ptf.Analyse_Optimizers(analysis_name, optimizers, percent_data, num_epochs=epochs, state=”keep_none”); は異なる最適化法の分析を開始します。最適化法リストに記載されている各最適化法を使用して実験を実行し、結果を記録します。
異なる最適化法を分析することで、データセットとディープラーニングモデルに最適な最適化法を特定することができます。最適化法の選択は、ニューラルネットワークの訓練やパフォーマンスに大きな影響を与えることがあります。
出力 :
ステップ 14:最適化法の更新
## 最適化法の更新ptf.optimizer_adamax(0.001);ptf.Reload();
- 最適化法の名前の更新: ptf.optimizer_adamax(0.001); は最適化法を “Adamax” に更新し、学習率を0.001に設定します。
- モデルの再読み込み: ptf.Reload(); は新しい最適化法の設定でモデルを再読み込みします。
最適化法を更新することで、トレーニング中に使用される最適化アルゴリズムを変更しています。最適化法を “Adamax” に更新し、特定の学習率を設定します。異なる最適化法は異なる収束速度を持つ場合があり、トレーニングプロセスと最終的なモデルのパフォーマンスにばらつきが生じることがあります。特定のディープラーニングタスクに対して最適な組み合わせを見つけるために、他の最適化法や学習率との実験を行うことは一般的です。
ステップ 15:中間状態の設定 – 保存しない
ptf.update_save_intermediate_models(False);
- ptf:作成したPyTorchのプロトタイプオブジェクトを指します。
- update_save_intermediate_models(False):この関数はトレーニング中に中間モデルを保存する設定を更新します。引数としてFalseを渡すことで中間モデルの保存オプションをオフにします。
中間モデルはトレーニング中に特定の間隔で保存されるモデルのパラメータのスナップショットです。特定のチェックポイントからトレーニングを再開するのに役立ち、トレーニングのさまざまな段階でモデルのパフォーマンスを分析するのに役立ちます。
このオプションをFalseに設定することで、コードはトレーニングプロセス中に中間モデルを保存しません。これはディスク容量を節約したり、中間のチェックポイントを追跡する必要がない場合に役立ちます。
次に、copy_experimentを使用して新しい実験を作成し、トレーニングを再開してさらなる改善を目指します。
ptf = prototype(verbose=1);ptf.Prototype("plant_disease", "exp2", copy_from=["plant_disease", "exp1"]);
- ptf = prototype(verbose=1);:verboseモードが有効な新しいプロトタイプオブジェクト”ptf”を作成します。このオブジェクトを使用して、機械学習の実験を定義および管理することができます。
- ptf.Prototype(“plant_disease”, “exp2”, copy_from=[“plant_disease”, “exp1”]);:この行は新しい実験の詳細を指定します。
既存の設定と同じ設定で新しい実験を作成することで、実験を繰り返し行いながら、設定の一貫性と進捗の追跡を保つことができます。
実験の設定の概要:
ptf.Summary()
出力:
ステップ16:比較
Monkは、統計情報を収集し、結果を視覚化し、どのモデルアーキテクチャとハイパーパラメータが最も効果的かを判断するための「比較」機能を提供しています。このステップは、モデルを微調整し、性能を徐々に向上させる反復的なプロセスを支援し、最終的にデプロイのために最も性能の良いモデル構成の選択をガイドします。
from compare_prototype import comparectf = compare(verbose=1);ctf.Comparison("plant_disease");ctf.Add_Experiment("plant_disease", "exp1");ctf.Add_Experiment("plant_disease", "exp2");
これらのコードスニペットでは、Monkの「compare_prototype」モジュールの使用方法を示しています。最初に必要な「compare」関数をインポートします。次に、報告のためにverbosityを1に設定した比較オブジェクト「ctf」を初期化します。ctf.Comparisonを使用して比較を”plant_disease”と名付けます。
これに続いて、プロジェクト”plant_disease”で行われた2つの実験「exp1」と「exp2」を比較に追加します。これにより、これら2つの実験の結果、メトリクス、パフォーマンスを分析および比較し、モデルの選択と微調整についての情報を得ることができます。
ステップ17:推論
Monkでは、訓練済みモデルを使用して新しい、未知のデータを予測するための「推論」が行われます。これにより、訓練済みモデルを使用して画像の分類、オブジェクトの認識、モデルの出力に基づいた意思決定など、実世界のアプリケーションでモデルを活用することができます。推論では、通常、訓練済みモデルの読み込み、入力データの提供、モデルからの予測や分類の取得などが行われます。Monkは、推論プロセスを効率化し、実用的な機械学習モデルの展開を簡素化するためのツールと関数を提供しています。
import numpy as npimport PIL.Image as Imageimport requeststest_url = "https://gardenerspath.com/wp-content/uploads/2019/08/ Frogeye-spots-Botryosphaeria-obtusa-on-apple-leaf-FB.jpg"# 画像のURLをimage_urlとして定義する r = requests.get(test_url) # HTTPのレスポンスオブジェクトを作成 with open('test.jpg','wb') as f: f.write(r.content) test = Image.open('./test.jpg')test
出力:
ptf.Prototype("plant_disease", "exp2", eval_infer=True);
- ptf.Prototype(“plant_disease”, “exp2”, eval_infer=True);:これは、MonkのPrototype関数を使用して「plant_disease」というプロジェクトの下で「exp2」という新しい実験をセットアップします。また、評価と推論モード(eval_infer=True)も有効にします。これにより、この実験は新しいデータに対して予測を行うために使用されます。
出力 :
- モデルの詳細:実験を初期化した後、コードは事前にトレーニングされたモデルを読み込みます。この場合、ディレクトリ「workspace/plant_disease/exp2/output/models/final」からモデルを読み込みます。このモデルは推論に使用されます。
- 実験の詳細:このセクションでは、プロジェクト名(「plant_disease」)、実験名(「exp2」)、および実験が保存されているディレクトリなど、実験に関する情報が提供されます。
ステップ18:予測
img_name = "test.jpg";predictions = ptf.Infer(img_name=img_name, return_raw=True);print(predictions)
- img_name = “test.jpg”:この行は、推論を実行する画像ファイル(”test.jpg”)の名前を指定します。分析したい画像のパスに “test.jpg” を置き換えることができます。
- Predictions = ptf.Infer(img_name=img_name, return_raw=True):このコード行は、指定された画像に対して予測を行うために、Monkの実験(ptf)で提供される「Infer」関数を呼び出します。画像ファイル名を入力し、”return_raw=True” を設定して、生の予測スコアを要求します。これにより、各クラスの生の数値スコアが返されます。
- print(predictions):最後に、コードは予測を表示します。これらの予測には、各クラスの予測されたクラスと関連する生のスコアなどの情報が含まれることが一般的です。
このコードにより、トレーニングされたモデルを使用して指定された画像を分析し、さまざまなクラスとその信頼スコアに対する予測を取得することができます。表示された出力は、指定された画像に対するモデルの予測に関する洞察を提供します。
import csvdef read_labels(): mydict = {} with open('./dataset/labels.csv', mode='r') as infile: reader = csv.reader(infile) with open('labels_new.csv', mode='w') as outfile: writer = csv.writer(outfile) mydict = {rows[0]:rows[1] for rows in reader} return mydictdef predict_label(predictions): pred_class = predictions['predicted_class'] label_dict = read_labels() out_label = label_dict[pred_class] return out_labelprint("Predicted class for test image is : {}".format(predict_label(predictions)))
- read_labels() 関数:この関数は、ラベル情報を「labels.csv」ファイルから読み取ります。CSV ファイルを開き、その内容を読み取り、キーにクラス ID、値に対応するラベルがある辞書(mydict)を作成します。そして、このラベル情報を「labels_new.csv」という新しい CSV ファイルに書き込みます。
- predict_label(predictions) 関数:この関数は、前の推論から得られた予測を入力として受け取ります。予測から予測されたクラス ID を抽出し、前に作成したラベル辞書を使用して対応するラベルを検索します。そのラベルが out_label として返されます。
- 結果の表示:コードは predict_label(predictions) 関数を呼び出して、予測クラスに関連付けられたラベルを取得し、「テスト画像の予測クラスは」として表示します。
要約すると、このコードは、モデルによって予測された数値のクラス ID を人が読めるラベルに変換し、モデルの出力を理解しやすくします。
出力:テスト画像の予測クラスは:Apple___Black_rot
植物病気分類のための高度なテクニック
次のレベルに進めるように、高度な技術と戦略を探ってみましょう。
1. カスタムデータによる転移学習
事前にトレーニングされたモデルを使用することは優れた出発点ですが、カスタムデータでファインチューニングすることで、分類器の精度をさらに向上させることができます。対象の植物種や病気に特化したより多くの画像を収集します。事前にトレーニングされたモデルをカスタムデータセットに適応させることで、ユニークなパターンや症状を認識できるようにすることができます。
# カスタムデータで事前にトレーニングされたモデルをファインチューニングするptf.update_model_name("resnet50")ptf.update_freeze_base_network(False) # ファインチューニングのためにベースネットワークの凍結を解除ptf.update_use_pretrained(True)ptf.Reload()ptf.Train()
2. データ拡張
データ拡張は、トレーニングデータセットの多様性を人工的に増やすための強力なテクニックです。回転、切り抜き、明るさ調整など、ランダムな変換を画像に適用することで、モデルの一般化能力を向上させることができます。Monkは、データ拡張のための便利な関数を提供しています:
# データ拡張変換を適用する
ptf.apply_random_rotation(train=True, val=True)
ptf.apply_random_crop(scale=[0.8, 1.0], ratio=[0.8, 1.2], train=True)
ptf.apply_random_brightness(train=True)
3. クラスの不均衡の扱い
実際のシナリオでは、一部の植物病気が他よりも一般的であるクラスの不均衡に遭遇することがあります。この問題に対処するために、少数クラスのオーバーサンプリングやトレーニング中のクラスの重み付けなどの技術を考慮してください。 Monkは不均衡なデータセットを扱うためのクラス別重み付き損失関数を提供しています。
# クラス別重み付きの損失関数を使用する
ptf.loss_weighted_softmax_crossentropy(class_weights)
4. アンサンブル学習
アンサンブル学習は、複数のモデルの予測結果を組み合わせて精度と頑健性を向上させる手法です。異なるアーキテクチャや同じモデルのバリエーションのアンサンブルを作成して、より良い結果を得ることができます。 Monkはアンサンブル学習をサポートしており、異なるモデルの組み合わせを試すことができます。
# モデルのアンサンブルを作成する
ensemble = ptf.create_ensemble(models)
ensemble.Train()
5. ハイパーパラメータのチューニング
ハイパーパラメータの微調整は、モデルのパフォーマンスを最適化するために重要です。 Monkはハイパーパラメータのチューニングツールを提供しており、さまざまな学習率、バッチサイズ、最適化アルゴリズムを試すことができます。
# ハイパーパラメータのチューニング - 学習率、バッチサイズ、最適化アルゴリズム
ptf.Analyse_Learning_Rates("LR_Finder", lrs, percent_data=10, num_epochs=5)
ptf.Analyse_Batch_Sizes("Batch_Size_Finder", batch_sizes, percent_data=10, num_epochs=5)
ptf.Analyse_Optimizers("Optimizer_Finder", optimizers, percent_data=10, num_epochs=5)
6. モデルの解釈可能性
モデルが特定の予測を行う理由を理解することは、疾患分類などの重要なアプリケーションにおいて不可欠です。 MonkはGrad-CAM(Gradient-weighted Class Activation Mapping)などの解釈性ツールを提供し、予測に最も影響を与える画像の領域を視覚化することができます。
# Grad-CAMを使用してモデルの予測を視覚化する
heatmap = ptf.Visualize_With_GradCAM(image_path, target_layer)
結論
この包括的なガイドでは、Monkを使用した植物病気の分類の魅力的な世界を探索しました。実験のセットアップからモデルの微調整や実世界の応用まで、さまざまなトピックをカバーしました。総括として、主なポイントを振り返り、この技術のエキサイティングな将来の方向性について話し合いましょう。
主なポイント:
- Monkはディープラーニングを簡略化します: Monkは使いやすい直感的なインターフェースを提供し、ディープラーニングモデルの構築、トレーニング、デプロイメントを可能にします。モジュラーなアプローチにより、初心者でも簡単にコンピュータビジョンに没頭することができます。
- 早期の病気検出: 植物病気は作物に甚大な被害を与え、食品の安全保障を脅かすことがあります。 Monkを活用したモデルにより、農家は作物を積極的に保護するための早期の病気検出を行うことができます。
- プレシジョン農業: Monkはリソースの使用を最適化し、化学物質の投入を減らし、作物の収量を増やすことで、プレシジョン農業に貢献します。農家はより高い収益性と環境の持続可能性を実現することができます。
- 現実世界への影響: Monkの応用は農業にとどまらず、研究、保護、市民科学にも広がっています。個人や組織は植物の健康と生態系にポジティブな影響を与えることができます。
さらなる学習のためのリソース
Monkを使用した植物病気分類についてさらに学ぶには、次の貴重なリソースを参考にしてください:
- Monk 公式ドキュメント -> Docs
- Plant Village データセット -> Docs
- Monk のセットアップ -> Docs
- Quick Mode PyTorch -> Docs
- Quick Mode Keras -> Docs
- Quick Mode Gluon -> Docs
- モデルファインダー -> Docs
モンクは植物病害分類ソリューションの最前線に位置しています。その使いやすいインターフェースと強力な能力により、個人や組織は地球の生態系とグローバルな食糧供給に貢献することができます。
よく寄せられる質問
この記事で表示されているメディアはAnalytics Vidhyaの所有ではなく、著者の裁量で使用されています。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles