こんにちは。InsightEdgeのDataScientistのSugaです。最近もサウナに通っていますが、サウナ好きのなかではオロポという飲み物があります。 オロナミンC+ポカリスエットというもので独特な味がして気にっています。さて、今回は、生成AIを駆使して、バーチャル水田で稲作をシミュレーションしてみようと思います。
取り組むきっかけ
最近のニュースから
最近のニュースを見ていたら、「農林水産省、「天穂のサクナヒメ」とコラボ」という記事がありました。知らない方もいると思うので、少し説明すると、「天穂(てんすい)のサクナヒメ」というゲーム作品が2020年にリリースされました。ゲームの中で米作りの工程をする必要があり、その内容がとてもリアルだと話題になりました。さらに、農林水産省の公式WEBサイトがゲームの攻略に使えるということがわかり、そのことがニュースになっていたりしました。
Youtube : アニメ「天穂のサクナヒメ」とのコラボに寄せて 坂本農林水産大臣メッセージ
2020年に原作ゲームが発売された当時、「田起こし」「種籾選別」「田植え」等の米作りの工程が非常にリアルだと大きな話題になり、また、農林水産省の公式ウェブサイトがゲーム攻略に使えると評判にもなりました。 このようなご縁もあり、この度のテレビアニメ化にあたり、正式にコラボする運びとなりました。サクナヒメたちとともに、「生きるための食べものを作る大切さ」、「仲間とともに食卓を囲む喜び」、そして「お米の魅力」をお伝えしてまいります。多くの皆さまに、食や農林水産業について興味や関心を持っていただけるきっかけになることを期待しています。<
農業xTech
近年の世界人口の増加や気候変動もあって食料安全保障の問題に対応するためにも農業分野には注目が集まっていると思います。特にIT技術を使った農業の発展には著しいものがあります。
技術革新の例としては、
- IoTデバイスやセンサーデバイスの活用:作物や家畜のリアルタイム監視と管理を可能にします。センサーは土壌の湿度、温度、植物の健康状態を追跡し、自動化された灌漑システムは正確なデータに基づいて最適な灌漑をします。
- 精密農業:衛星データやセンサーデータなど様々な情報源から畑の詳細な区分レベルで管理をして、植え付け、施肥、収穫といった管理の意思決定をデータを用いて行います。
- 農業ロボット:従来は農業機械を人が操作して行っていた除草や収穫などを自律ロボットが自動で作業します。これにより単純な機械化よりも効率化して、労働コストを削減するものです。
- 再生農業:土壌の健康と生物多様性を回復させることに焦点を当てるなど、耕作しない農法、カバークロップの利用、輪作放牧などの技術を含みます。これにより、土壌構造が改善され、侵食が減少し、長期的な持続可能性と生産性向上を目指した取り組みです。
- データ活用やクラウド技術活用:精密農業と関連しますが、広範なデータ収集と分析によって作物管理するものです。さらに発展させて、収穫量予測、灌漑量予測、可変施肥予測などを行います。
これらの取り組みでは従来の農業分野で活躍していた、農家や農業研究者、農学者、農業経済学者だけではなく他の分野の専門家も農業分野に進出して、協力して技術開発が行われています。
稲作について
米は世界で最も重要な穀物の1つで、多くの国で主食として広く消費されています。米の栽培は約10,000年前にアジアで始まったとされ、特に中国、インド、タイなどが古くからの主要産地です。現在では、世界中の熱帯・亜熱帯地域で広く栽培されています。米は温暖な気候を好みます。最適な気温は20℃から30℃で、特に生育期には十分な日光が必要です。多くの品種が水田で栽培され、水の管理が重要です。水田は、稲の根が常に水に浸かっている状態を保つため、灌漑システムが必要となります。
さらに、米は肥沃な粘土質の土壌でよく育ち、土壌のpHは5.5から7.0が適しているといわれています。米には数多くの品種があり、大きくジャポニカ種(短粒種)とインディカ種(長粒種)に分類されます。ジャポニカ種は、日本や韓国、中国北部で多く栽培され、粘り気が強く、寿司やおにぎりに適しています。インディカ種はインド、タイ、ベトナムなどで広く栽培され、パラパラとした食感が特徴です。バスマティ米やジャスミン米が代表的です。
日本では、米は主食として広く消費されており、稲作は農業の中心的な役割を果たしています。主要な稲作地域としては、新潟、秋田、山形などの県が挙げられます。近年では、品種改良や農業技術の進歩により、より高品質な米の生産が可能となっています。
稲作の基本プロセス
田んぼの準備
田んぼの準備が行われます。これは、耕起と呼ばれる土壌を耕す作業から始まります。耕起により、土壌が均一に整えられ、稲の根が張りやすくなります。次に、代かきが行われます。これは、田んぼに水を張り、土を泥状にして均一にする作業です。代かきにより、田んぼ全体が均一な状態となり、苗が均等に育ちやすくなります。
苗の育成
田んぼの準備が整ったら、次に苗の育成が始まります。まず、種もみを苗床にまき、苗を育てます。この段階を種まきと呼びます。苗床で育った苗は、苗代と呼ばれる場所に移され、一時的に育てられます。ここで苗が十分に育つまで待ちます。
田植え
苗が十分に育ったら、田植えを行います。田植えは、育てた苗を田んぼに植える作業です。手作業で行う手植えと、機械を使う機械植えがあります。機械植えは、大規模な稲作地帯でよく使われ、効率的に作業を進めることができます。
生育管理
田植えが終わったら、生育管理の段階に入ります。この段階では、水管理、施肥、除草などが行われます。水管理は、稲の成長に必要な水を適切に供給し、過剰な水を排水する作業です。施肥は、稲に必要な栄養分を補うために肥料を与えることです。除草は、田んぼの中の雑草を取り除く作業です。これらの作業を通じて、稲が健康に育つ環境を維持します。
収穫
稲が成熟したら、収穫の時期となります。収穫は、稲刈りと呼ばれ、手作業で行う手刈りと機械を使う機械刈りがあります。
乾燥と脱穀
収穫された稲をまず乾燥させます。乾燥により、稲から余分な水分を取り除きます。次に、脱穀が行われます。脱穀は、稲のもみを取り除く作業です。脱穀されたもみは、玄米として保存されます。
精米
最後に、玄米を精米して白米にする作業が行われます。精米により、玄米の外皮が取り除かれ、白くて美しい米が出来上がります。この米が最終的に食卓に並ぶことになります。 稲作は一連の精密なプロセスを経て行われ、このように各段階で適切な管理と作業が求められます。
対象の作物選定
今回のTechblogを書くにあたっては、作物の題材を決める必要があり、その題材として当初は「コーヒー」を選んでいました。単純に自分がコーヒー好きという理由からです。しかし、調査をしてみると、コーヒーはとても情報が少ないことに気づきました。
研究例としては、 コロンビアのサンタ・マルタ山脈地方でスペシャリティコーヒー栽培に作物モデルを適用した例(Vega Molina et al., 2018)がありました。この研究では特定の農業気象条件で生産性を予測することに成功したという内容です。ただ、コーヒーは主要作物ではないため、元となるデータが少なく手元で再現することが難しかったために、以後の対象作物は「米」にしています。
作物モデル研究
農業研究の分野として、作物モデルを用いるものがあります。これは、作物成長をシミュレーションするための数理モデルです。作物の生理学的過程の理解を深めて、農業生産の効率化や最適化を図る目的で研究されています。そのなかでも、いつくかの種類があり、経済モデルといわれる少し大きなマクロな視点で統計的にモデリングする手法やプロセスベースモデルといった、光合成、呼吸、蒸散など生理学的過程をシミュレーションするものなどがあります。
作物モデルを使うことによって、気候変動の影響評価や農業経営支援や農業政策など広範に利用することが出来ます。ですので、世界中の研究者によって様々な研究が行われてきました。
代表的な作物モデル:
DSSAT(Decision Support System for Agrotechnology Transfer): 作物の生育、収量、リソース利用をシミュレートする総合的なモデルシステムです。多くの作物と気象条件に対応しており、研究や実務で広く使用されています。特徴としては、多種多様な作物(穀物、野菜、果物など)をモデリング可能であり、土壌、水分、気象データを統合して作物の成長をシミュレートできます。作物管理の決定支援、収量予測、環境影響評価に使用されます。
APSIM(Agricultural Production Systems Simulator): 作物、家畜、気象、土壌の相互作用をシミュレートするためのモデルで、農業システムの管理と持続可能性を評価するために使用されます。特徴としては、作物と気象条件の詳細なシミュレーションが出来て、土壌水分動態、栄養素循環、作物管理オプション、作物ローテーション、混作システムの評価に使用できます。
CERES(Crop Environment Resource Synthesis): トウモロコシ、米、小麦などの主要作物の成長と収量を予測するためのモデルです。土壌、水分、気象データを使用して作物の生理学的過程をシミュレートします。特徴としては、作物の成長、生理学的プロセスの詳細なシミュレーションを行い、天候、土壌、管理条件に基づく収量予測や作物生育の段階的なモデル化に対応していることです。
シンプルな作物モデル
稲作の成長をシミュレーションするにあたって、シンプルな作物モデル成長モデルを実装して、原理を確認しました。モデルとしては土壌栄養素と水分を消費して作物が育つようにしました。 サンプルコードは以下のようになります。
import numpy as np import pandas as pd import matplotlib.pyplot as plt from scipy.integrate import odeint # 作物成長モデルの定義 def crop_growth(y, t, params): C, N, W = y # C:作物バイオマス, N:土壌栄養素, W:土壌水分 k1, k2, k3 = params # 成長率、栄養素吸収率、水分吸収率 dCdt = k1 * N * W dNdt = -k2 * C * W dWdt = -k3 * C * N return [dCdt, dNdt, dWdt] # 初期条件とパラメータの設定 initial_conditions = [1, 1, 1] # 初期バイオマス、栄養素、水分 params = [0.1, 0.05, 0.02] # 成長率、栄養素吸収率、水分吸収率 t = np.linspace(0, 100, 100) # シミュレーション期間 # シミュレーションの実行 result = odeint(crop_growth, initial_conditions, t, args=(params,)) C, N, W = result.T # 結果のプロット plt.figure(figsize=(10, 6)) plt.plot(t, C, label='Crop Biomass') plt.plot(t, N, label='Soil Nutrients') plt.plot(t, W, label='Soil Moisture') plt.xlabel('Time') plt.ylabel('Quantity') plt.legend() plt.title('Crop Growth Simulation') plt.show()
実行結果は以下のようになります。時間の経過とともに作物が成長して、土壌栄養素と水分が減少する様子を示しています。このモデルは、作物成長における基本的な相互作用をシンプルに表現したものです。
米の作物モデル
今回のTechBlogのテーマとしては、実際に米の作物モデルを実験してシミュレーションしてみることを目的としたので、ChatGPTに米の作物モデルで使いやすいものはあるかを聞いて見ました。その結果、PCSE(Python Crop Simulation Environment)というライブラリがあることや、シミュレーション手順についても教えてくれました。PCSEはオランダで開発されたPythonパッケージです。
適用できる作物モデルとしてWOFOST(WOrld FOld Studies)というものがあります。 一年生作物の成長と生産を定量的に分析するためのモデルだそうです。
実行手順
PCSEを使用して米のシミュレーションを行うためには、まず米に関する適切なパラメータセット、天候データ、土壌データ、そして農業管理データを準備する必要があります。以下にその手順を詳細に説明します。こちらもChatGPTに聞いたら見事に答えてくれていました。
手順
1.パラメータセットの準備 米の成長に関するパラメータセット(作物データ、土壌データ、サイトデータ)を準備します。これらのデータは、PCSEの提供するフォーマットに従って準備する必要があります。
- 作物データ:米の成長段階、光合成効率、呼吸率、成長期間などの生理学的パラメータ。
- 土壌データ:土壌の物理的・化学的特性(水分保持能力、浸透率、栄養素含有量など)。
- サイトデータ:地理的特性(水分バランス、CO2濃度など)。
2.天気データの取得 PCSEは様々な天気データプロバイダーをサポートしています。NASA Power Weather Data Providerを使用して、シミュレーションに必要な天気データ(温度、降水量、日照量など)を取得します。
3.農業管理データの作成 農業管理データ(例えば、播種日、灌漑スケジュール、施肥計画など)をYAML形式で作成します。
4.モデルの設定とシミュレーションの実行 これらのデータを使用して、PCSEのWOFOSTモデルを設定し、シミュレーションします。
シミュレーション実行
シミュレーションコードもChatGPTに聞いて見ましたが、こちらは全くうまくいかずにある程度の限界があることに気づきました。ですので、PCSEの本家のサイトを参考にシミュレーションコードを実行してみました。
関連モジュールのインポートとバージョン確認
まずはpip install pcseを実行してライブラリをインストールした後で、インストールがされているかの確認します。
%matplotlib inline import sys from pathlib import Path import matplotlib matplotlib.style.use("ggplot") import matplotlib.pyplot as plt import pandas as pd data_dir = Path.cwd() / "data" import pcse print("This notebook was built with:") print(f"python version: {sys.version}") print(f"PCSE version: {pcse.__version__}")
作物パラメータの指定
作物固有のパラメータが提供されているので、ここでは作物と品種の指定を行います。このパラメータはフェノロジー(Phenology)と呼ばれる成長段階や成長ステージを表すものが表現されていて、特定の気象条件や時間経過に基づいて育成をシミュレートします。また、同化(Assimilation)と呼ばれる作物が光合成によって二酸化炭素を取り込み、有機物を生成するプロセスも含まれます。光合成の効率は光強度、温度、CO2濃度、葉面積などに影響されます。
さらに、呼吸(Respiration)という植物がエネルギーを消費して成長や維持活動を行うプロセスもあります。加えて、分配(Partitioning)と呼ばれる植物が生成した有機物を各器官(根、茎、葉、穂など)に対してどのように分配するかも考慮されています。
from pcse.fileinput import YAMLCropDataProvider, CABOFileReader cropd = YAMLCropDataProvider() cropd.set_active_crop('rice', 'Rice_501')
土壌パラメータ
土壌の種類と土壌の物理的特製に関連するパラメータを決定します。今回は自由排水土壌(過剰な水分が土壌中に滞留せず、速やかに排出される特性を持つ土壌)、中細砂の土壌ファイルを指定しています。
soilfile = data_dir / "soil" / "ec3.soil" soild = CABOFileReader(soilfile)
サイトパラメータ
サイトパラメータは作物や土壌に関連しない補助的なパラメータです。初期土壌水分含有量(WAV) や初期および最大表面貯留量(SSI、SSMAX)などの水バランスの初期条件があります。また、大気中のCO2濃度も、典型的なサイトパラメータです。今回はデフォルト値を採用しました。
from pcse.util import WOFOST72SiteDataProvider sited = WOFOST72SiteDataProvider(WAV=10) print(sited)
{'IFUNRN': 0, 'NOTINF': 0, 'SSI': 0.0, 'SSMAX': 0.0, 'WAV': 10.0, 'SMLIM': 0.4}
パラメータをパッケージ
これまで指定してきたパラメータを1つの変数にまとめる。
from pcse.base import ParameterProvider parameters = ParameterProvider(cropdata=cropd, soildata=soild, sitedata=sited)
農業管理
作物を育てるときにどのようなオペレーションをするかを指定します。主な要素は種まきをいつ開始したかや収穫時期の指定などです。このファイルはYAML形式で入力します。今回はデフォルト値を参考にして、米で使えるように少し変更したファイルを用いました。
from pcse.fileinput import YAMLAgroManagementReader agromanagement_file = data_dir / "agro" / "rice_calendar.agro" agromanagement = YAMLAgroManagementReader(agromanagement_file)
天気観測
シミュレーションするには天気の情報も必要です。PCSEには天気データを読み取るためのデータプロバイダーの機能もあります。空間解像度0.5度(約50km)で世界の気象データを提供するNASA PowerDataの気象データを読み込むことが出来ます。今回は日本の新潟市の緯度経度を指定してみました。
from pcse.input import NASAPowerWeatherDataProvider wdp = NASAPowerWeatherDataProvider(latitude=37.9123837, longitude=140.0106058) print(wdp)
Weather data provided by: NASAPowerWeatherDataProvider --------Description--------- NASA/POWER CERES/MERRA2 Native Resolution Daily Data ----Site characteristics---- Elevation: 551.5 Latitude: 37.912 Longitude: 140.011 Data available for 1984-01-01 - 2024-07-20 Number of missing days: 3
作物シミュレーションの実行
PCSEのエンジンをインポートして、指定した構成ファイルとパラメータで初期化して起動します。その後、シミュレーションした結果を時系列データとして取得します。結果はpandasデータフレームに格納しておきます。
from pcse.models import Wofost72_WLP_CWB wofsim = Wofost72_WLP_CWB(parameters, wdp, agromanagement) wofsim.run_till_terminate() df_results = pd.DataFrame(wofsim.get_output()) df_results = df_results.set_index("day") df_results.tail()
シミュレーション結果
発育 (Development Stage, DVS)
発育段階 (Development Stage, DVS) は、作物の成長段階を数値化したものです。DVSは通常、0から2の範囲で表され、作物のライフサイクルを以下のように示します。
- DVS = 0:播種(種まき)または発芽の段階
- DVS = 1:花が咲く段階(開花)
- DVS = 2:作物が完全に成熟する段階(収穫準備)
DVSは、作物の成長に伴う生理的な変化を示すため、モデル内で成長段階ごとの異なるプロセス(例えば、葉の展開、実の形成など)を管理するのに役立ちます。
総バイオマス (Total Above Ground Biomass, TAGP)
総バイオマス (Total Above Ground Biomass, TAGP) は、地上部における作物全体のバイオマス量を示します。これは、作物が光合成によって生成した有機物の総量であり、以下の要素を含みます。
- 葉:光合成を行う主要な部位
- 茎:作物の支持構造
- 穂や果実:作物の収穫部位
TAGPは作物の全体的な成長と生産性を評価する重要な指標です。
葉面積指数 (Leaf Area Index, LAI)
葉面積指数 (Leaf Area Index, LAI) は、単位地表面積あたりの総葉面積の割合を示す指標です。具体的には、以下のように定義されます。
- LAI=葉の総面積/地表面積
例えば、LAIが3の場合、地表1平方メートルあたりに3平方メートルの葉面積が存在することを意味します。LAIは、作物の光合成能力を評価するために使用され、光エネルギーの捕捉効率や蒸散量に直接影響します。
根圏土壌水分 (Soil Moisture, SM)
根圏土壌水分 (Soil Moisture, SM) は、根が存在する土壌層の水分量を示します。これは、作物の水利用効率と成長に大きな影響を与えます。SMは以下のような要因に影響されます。
- 降水量:自然の雨水供給
- 灌漑:人工的な水供給
- 蒸発散:土壌からの蒸発と作物からの蒸散による水分損失
土壌の保水力:土壌の種類や構造による水分保持能力。 SMは、作物の水ストレスを評価し、灌漑スケジュールの最適化や水管理戦略の立案に役立ちます。
シミュレーション結果の可視化
シミュレーション結果を表示します。DVSは0からはじまり10月には収穫段階の2まで成長しています。TAGPも順調に量が増えていることがわかります。LAIは8月頃をピークに減少していますが、過去の調査結果(堀江・桜谷, 2014)を参照する限りにおいては、出穂期ごろに最大値へ達して、その後は減少していくとの記述があるので、この時系列変化で概ねあっているように見えます。また、稲作では「中干し」「土用干し」と言われる夏の時期に田んぼの水を抜いて乾燥させる農法があるため、SMの推移もこれに近いグラフの形になっていると思われます。
fig, axes = plt.subplots(nrows=4, ncols=1, figsize=(12,12), sharex=True) for var, ax in zip(["DVS", "TAGP", "LAI", "SM"], axes.flatten()): ax.plot_date(df_results.index, df_results[var], 'b-') ax.set_title(var) fig.autofmt_xdate()
まとめと今後
今回は作物モデルを用いて稲作をシミュレーションしてみることをやってみました。この分野自体は初めて調査してみたので、わからないことも多かったですが、あらためて農場分野の専門知識も大切だと感じました。データ分析だけでなくドメイン知識も大事と言われますが、まさにこのことだと思いました。
また、作物モデルにおいては指定するパラメータの数が多かったのでベイズ最適化のようなパラメータ探索と決定といった分野と親和性が高いとも思いました。例えば、収穫量を最大化するようなパラメータを探索してそれを営農に活用するなどまだまだデータを活用できる余地は大きいと思いました。