カリキュラム


📅 全体スケジュール(28週:7ヶ月)

🔹 フェーズ1:AIと画像処理の基礎(Week 1–12)

テーマ内容実習教材
1導入・AIと農業AIの概要、農業との関係農業事例を使ったAIの分類ワーク
2Python基礎①変数、データ型、制御構文Jupyterノートでの基本練習
3Python基礎②関数、クラス、ライブラリ簡単な画像読み込みコード作成
4NumPy/Pandas入門配列処理とデータフレーム作物データの統計処理ノート
5Matplotlib/Seabornデータの可視化生育データ可視化演習
6OpenCV入門①画像の読み込み・表示・保存畑の写真を処理して保存する演習
7OpenCV入門②画像の変換(リサイズ、ぼかしなど)作物画像の前処理ノート
8OpenCV入門③輪郭検出、ヒストグラム果実の輪郭抽出演習
9OpenCV+NumPyマスク処理・フィルタ葉の病斑抽出
10機械学習基礎①回帰・分類とはScikit-learnで作物分類演習
11機械学習基礎②データ前処理、評価指標作物の病気画像分類準備
12小プロジェクト作物画像分類システムグループごとに分類モデル作成

🔹 フェーズ2:ディープラーニングと農業応用(Week 13–24)

テーマ内容実習教材
13ニューラルネットワーク基礎Perceptron、活性化関数簡単なNNをKerasで構築
14CNN基礎①畳み込み・プーリング野菜画像でCNNモデル作成
15CNN基礎②正則化・データ拡張Augmentationで精度向上
16CNN応用①作物病害診断モデル葉の画像を分類するCNN
17CNN応用②精度評価・混同行列複数クラス分類と評価
18センサーデータ処理IoTセンサと画像の連携土壌湿度+画像による推定
19衛星データ基礎NDVI、衛星画像の読み方衛星画像読み込み・NDVI算出
20衛星データ応用①NDVIによる生育診断複数地点の衛星比較演習
21衛星データ応用②AIで異常検知異常エリア自動検出モデル
22GAN基礎画像生成モデル葉画像の拡張用GAN構築
23時系列AI基礎LSTMによる予測センサー+画像の成長予測
24中プロジェクト画像+衛星データ統合スマート畑監視システム設計

🔹 フェーズ3:実践応用・スマート農業プロジェクト(Week 25–28)

テーマ内容実習教材
25実装準備チームビルディング・テーマ決定オリジナルプロジェクト設計
26プロジェクト開発①実装フェーズデータ収集・AIモデル統合
27プロジェクト開発②検証フェーズテスト・評価・改善
28成果発表最終プレゼン・フィードバック発表資料とコード提出

✅ 実習教材(第1週)導入・AIと農業


🧠 ワークの目的:


📋 例題(イメージ):

農業事例該当するAI分類コメント
作物の病害を画像から診断画像分類(教師あり)教師データとして「病気画像+ラベル」が必要
異常気象を検知してアラートを出す異常検知(教師なし)正常パターンからの逸脱を検出
センサーデータから収量を予測回帰(教師あり)気温・湿度などを説明変数にして収量予測

✅ 実習教材(第2週)Python基礎①


🧠 目的:


📘 練習内容(例):

1.Jupyter Notebookの起動と操作

2.Python基礎(1)

3.Python基礎(2)


🧪 演習例:

# 面積を求める簡単な演習
length = 5
width = 3
area = length * width
print("面積は", area, "平方メートルです")

✅ 実習教材(第3週)Python基礎②


🧠 目的:


📘 学習ポイント:


🧪 演習例(OpenCVを使用):

import cv2
import matplotlib.pyplot as plt

def load_and_show_image(path):
    image = cv2.imread(path)
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # OpenCVはBGRなのでRGBに変換
    plt.imshow(image)
    plt.title("Loaded Image")
    plt.axis('off')
    plt.show()

# 実行
load_and_show_image("sample_image.jpg")

🔧 応用課題:


✅ 実習教材(第4週)NumPy/Pandas入門


🧠 目的:


📘 学習ポイント:


🧪 演習例:

import pandas as pd

# データ読み込み
df = pd.read_csv("crop_data.csv")

# データの基本情報
print(df.head())
print(df.describe())

# 平均収穫量の計算
average_yield = df["収穫量"].mean()
print("平均収穫量:", average_yield, "kg")

# 月ごとの収穫量をグループ化
monthly_yield = df.groupby("月")["収穫量"].sum()
print(monthly_yield)

🔧 応用課題:


✅ 実習教材(第5週)Matplotlib/Seaborn


🧠 目的:


📘 学習ポイント:

1.Matplotlib

2.Seaborn


🧪 演習例:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# データ読み込み
df = pd.read_csv("crop_growth.csv")

# 折れ線グラフ:日数ごとの平均身長推移
plt.figure(figsize=(10, 5))
sns.lineplot(data=df, x="日数", y="草丈", hue="品種")
plt.title("品種ごとの草丈推移")
plt.xlabel("日数")
plt.ylabel("草丈 (cm)")
plt.grid(True)
plt.show()

# ヒートマップ:特徴量の相関
plt.figure(figsize=(8, 6))
sns.heatmap(df.corr(), annot=True, cmap="coolwarm")
plt.title("特徴量間の相関")
plt.show()

🔧 応用課題:


✅ 実習教材(第6週)OpenCV入門①


🧠 目的:


📘 学習ポイント:

1.画像の読み込み・表示

2.画像の保存

3.カラー形式の変換(BGR → RGB)


🧪 演習例(Jupyter Notebook用にmatplotlib表示):

import cv2
import matplotlib.pyplot as plt

# 画像の読み込み(BGR形式)
image = cv2.imread("field_photo.jpg")

# RGB形式に変換
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# 画像の表示
plt.imshow(image_rgb)
plt.title("畑の写真")
plt.axis("off")
plt.show()

# 画像の保存
cv2.imwrite("saved_field_photo.jpg", image)

🔧 応用課題:


✅ 実習教材(第7週)OpenCV入門②


🧠 目的:


📘 学習ポイント:

1.画像のリサイズ

2.ぼかし(ブラー)

3.回転・反転

4.カラースケール変換


🧪 演習例:

編集する
import cv2
import matplotlib.pyplot as plt

# 画像読み込み
img = cv2.imread("crop_leaf.jpg")

# リサイズ
resized = cv2.resize(img, (200, 200))

# ぼかし処理
blurred = cv2.GaussianBlur(resized, (5, 5), 0)

# グレースケール変換
gray = cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY)

# 表示
plt.figure(figsize=(12, 4))
plt.subplot(1, 3, 1)
plt.imshow(cv2.cvtColor(resized, cv2.COLOR_BGR2RGB))
plt.title("Resized")
plt.axis("off")

plt.subplot(1, 3, 2)
plt.imshow(cv2.cvtColor(blurred, cv2.COLOR_BGR2RGB))
plt.title("Blurred")
plt.axis("off")

plt.subplot(1, 3, 3)
plt.imshow(gray, cmap='gray')
plt.title("Grayscale")
plt.axis("off")

plt.show()

🔧 応用課題:


✅ 実習教材(第8週)OpenCV入門③


🧠 目的:


📘 学習ポイント:

  1. 画像の二値化処理(Threshlid)
  2. エッジ検出(Cannyアルゴリズム)
  3. 輪郭抽出(cv2.findContours())
  4. 輪郭の描画(cv2.drawContours())
  5. ヒストグラムの作成(明度や色分布の分析)

🧪 演習例:

import cv2
import matplotlib.pyplot as plt

# 画像の読み込みとグレースケール変換
img = cv2.imread("fruit.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# ぼかし & エッジ検出
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
edges = cv2.Canny(blurred, 50, 150)

# 輪郭の検出
contours, _ = cv2.findContours(edges.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 輪郭の描画
contour_img = img.copy()
cv2.drawContours(contour_img, contours, -1, (0, 255, 0), 2)

# 表示
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
plt.imshow(edges, cmap='gray')
plt.title("エッジ検出")
plt.axis("off")

plt.subplot(1, 2, 2)
plt.imshow(cv2.cvtColor(contour_img, cv2.COLOR_BGR2RGB))
plt.title("輪郭検出")
plt.axis("off")

plt.show()

🔧 応用課題:


✅ 実習教材(第9週)OpenCV+NumPy


🧠 目的:


📘 学習ポイント:

1.マスク処理

2.フィルタ処理

3.色空間の変換

4.NumPy配列による画像操作


🧪 演習例:

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 画像読み込みとHSV変換
img = cv2.imread("leaf.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 病斑(茶色〜暗色)の色範囲を指定
lower_brown = np.array([10, 50, 50])
upper_brown = np.array([30, 255, 255])
mask = cv2.inRange(hsv, lower_brown, upper_brown)

# マスク適用
result = cv2.bitwise_and(img, img, mask=mask)

# 表示
plt.figure(figsize=(12, 4))
plt.subplot(1, 3, 1)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title("元画像")
plt.axis("off")

plt.subplot(1, 3, 2)
plt.imshow(mask, cmap="gray")
plt.title("病斑マスク")
plt.axis("off")

plt.subplot(1, 3, 3)
plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))
plt.title("抽出結果")
plt.axis("off")

plt.show()

🔧 応用課題:


✅ 実習教材(第10週)機械学習基礎①


🧠 目的:


📘 学習ポイント:

1.回帰と分類の違い

2.Scikit-learnの基本フロー

3.代表的な分類アルゴリズム


🧪 演習例:

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
import pandas as pd

# データ読み込み(例:作物の特徴量と種類ラベル)
df = pd.read_csv("crop_features.csv")
X = df.drop("label", axis=1)
y = df["label"]

# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# モデル学習
clf = RandomForestClassifier()
clf.fit(X_train, y_train)

# 予測と評価
y_pred = clf.predict(X_test)
print(classification_report(y_test, y_pred))

🔧 応用課題:


✅ 実習教材(第11週)機械学習基礎②


🧠 目的:


📘 学習ポイント:

1.データ前処理の基礎

2.教師データの構成

3.評価指標の理解


🧪 演習例(画像フォルダからラベル生成・前処理の準備):

import os
import cv2
import numpy as np
from sklearn.model_selection import train_test_split

# データ準備(フォルダ構造に応じてラベル付け)
def load_images_from_folder(folder_path):
    images = []
    labels = []
    for label_folder in os.listdir(folder_path):
        label_path = os.path.join(folder_path, label_folder)
        for file in os.listdir(label_path):
            img = cv2.imread(os.path.join(label_path, file))
            if img is not None:
                img = cv2.resize(img, (64, 64))  # サイズ統一
                images.append(img)
                labels.append(label_folder)
    return np.array(images), np.array(labels)

X, y = load_images_from_folder("crop_disease_data")

# データの確認と分割
print("データ数:", len(X))
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

🔧 応用課題:


✅ 実習教材(第12週)小プロジェクト


🧠 目的:


📘 学習ポイント:

1.プロジェクト型学習(PBL)

2.システム構築のステップ

3.プロトタイピング


🧪 実践内容(例):

テーマ例:「トマトの病気画像を分類するAI」

構成例:


🔧 推奨構成:

project/
├── data/
│   ├── healthy/
│   └── diseased/
├── notebooks/
│   ├── preprocessing.ipynb
│   ├── training.ipynb
│   └── evaluation.ipynb
├── model/
│   └── saved_model.pkl
└── presentation/
    └── slides.pdf

💡 発展課題:


✅ 実習教材(第13週)ニューラルネットワーク基礎


🧠 目的:


📘 学習ポイント:


🧪 演習例:

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# データ準備
data = load_iris()
X = data.data
y = tf.keras.utils.to_categorical(data.target, num_classes=3)

# 前処理
scaler = StandardScaler()
X = scaler.fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# モデル構築
model = Sequential([
    Dense(10, activation='relu', input_shape=(4,)),
    Dense(3, activation='softmax')
])

# コンパイル・学習
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=30, batch_size=8, verbose=1)

# 評価
loss, acc = model.evaluate(X_test, y_test, verbose=0)
print(f"Test Accuracy: {acc:.2f}")

🔧 応用課題:

この週はディープラーニング入門の第一歩として、シンプルかつ直感的に理解できる構成になっています。Jupyterノートブック形式や可視化ツール(TensorBoard)の導入も可能です。必要に応じてご提案します!


✅ 実習教材(第14週)CNN基礎①


🧠 目的:


📘 学習ポイント:


🧪 演習例(簡易CNNで画像分類):

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
from tensorflow.keras.preprocessing.image import ImageDataGenerator

# データ前処理
datagen = ImageDataGenerator(rescale=1./255)
train_generator = datagen.flow_from_directory(
    'vegetable_data/train',
    target_size=(64, 64),
    batch_size=16,
    class_mode='categorical'
)

# CNNモデル構築
model = Sequential([
    Conv2D(32, (3,3), activation='relu', input_shape=(64, 64, 3)),
    MaxPooling2D(2, 2),
    Flatten(),
    Dense(64, activation='relu'),
    Dense(train_generator.num_classes, activation='softmax')
])

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(train_generator, epochs=10)

🔧 応用課題:

この演習をベースに、後の「データ拡張」「病害診断CNN」へとスムーズにステップアップできます。


✅ 実習教材(第15週)CNN基礎②


🧠 目的:


📘 学習ポイント:


🧪 演習例:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.preprocessing.image import ImageDataGenerator

# 拡張付きデータジェネレータ
train_datagen = ImageDataGenerator(
    rescale=1./255,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest'
)

train_generator = train_datagen.flow_from_directory(
    'vegetable_data/train',
    target_size=(64, 64),
    batch_size=16,
    class_mode='categorical'
)

# CNNモデル構築(Dropoutあり)
model = Sequential([
    Conv2D(32, (3,3), activation='relu', input_shape=(64, 64, 3)),
    MaxPooling2D(2, 2),
    Dropout(0.3),
    Flatten(),
    Dense(64, activation='relu'),
    Dropout(0.3),
    Dense(train_generator.num_classes, activation='softmax')
])

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(train_generator, epochs=15)

🔧 応用課題:

この週は「高精度なAIモデル構築」の鍵を握る技術習得の回です。


✅ 実習教材(第16週)CNN応用①


🧠 目的:


📘 学習ポイント:


🧪 演習例(葉画像の病気分類CNNモデル):

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.preprocessing.image import ImageDataGenerator

# 拡張込みデータ準備
train_datagen = ImageDataGenerator(
    rescale=1./255,
    rotation_range=15,
    zoom_range=0.1,
    horizontal_flip=True,
    validation_split=0.2
)

train_generator = train_datagen.flow_from_directory(
    'leaf_dataset',
    target_size=(128, 128),
    batch_size=16,
    class_mode='categorical',
    subset='training'
)

val_generator = train_datagen.flow_from_directory(
    'leaf_dataset',
    target_size=(128, 128),
    batch_size=16,
    class_mode='categorical',
    subset='validation'
)

# CNNモデル構築
model = Sequential([
    Conv2D(32, (3,3), activation='relu', input_shape=(128, 128, 3)),
    MaxPooling2D(2, 2),
    Conv2D(64, (3,3), activation='relu'),
    MaxPooling2D(2, 2),
    Dropout(0.3),
    Flatten(),
    Dense(128, activation='relu'),
    Dropout(0.4),
    Dense(train_generator.num_classes, activation='softmax')
])

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(train_generator, validation_data=val_generator, epochs=20)

🔧 応用課題:

この週は「農業画像診断AIの中核」をなす実践回です。


✅ 実習教材(第17週)CNN応用②


🧠 目的:


📘 学習ポイント:


🧪 演習例(混同行列と評価指標の算出・可視化):

from sklearn.metrics import classification_report, confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

# y_true と y_pred はそれぞれ正解と予測のラベル(整数型)
y_true = [0, 1, 2, 1, 0, 2]
y_pred = [0, 2, 1, 1, 0, 2]

# 混同行列
cm = confusion_matrix(y_true, y_pred)
sns.heatmap(cm, annot=True, fmt="d", cmap="Blues")
plt.xlabel("予測ラベル")
plt.ylabel("正解ラベル")
plt.title("混同行列")
plt.show()

# 詳細評価
print(classification_report(y_true, y_pred, target_names=["Healthy", "Blight", "Mildew"]))

🔧 応用課題:

この週は「AIモデルの良し悪しを見極める」視点を育てる重要な回です。


✅ 実習教材(第18週)センサーデータ処理


🧠 目的:


📘 学習ポイント:


🧪 演習例(湿度+画像のデータ連携処理):

import pandas as pd
import cv2
import numpy as np

# センサーデータ読み込み(例:CSV)
sensor_df = pd.read_csv("sensor_data.csv")  # timestamp, soil_moisture, temperature...

# 対応する画像の読み込みと特徴抽出(簡易例:平均色)
def extract_image_features(img_path):
    img = cv2.imread(img_path)
    img = cv2.resize(img, (64, 64))
    avg_color = img.mean(axis=(0, 1))  # 平均BGR
    return avg_color

sensor_df["img_path"] = "images/" + sensor_df["timestamp"].astype(str) + ".jpg"
sensor_df[["B", "G", "R"]] = sensor_df["img_path"].apply(lambda p: pd.Series(extract_image_features(p)))

# センサ+画像特徴の結合 → モデル入力に
features = sensor_df[["soil_moisture", "temperature", "B", "G", "R"]]
labels = sensor_df["label"]  # 例:生育状態ラベル

🔧 応用課題:

  • この週は「スマート農業」らしさが特に強く表れる実践回です。


    ✅ 実習教材(第19週)衛星データ基礎

    • 衛星画像読み込み・NDVI算出

    🧠 目的:

    • 衛星画像データの扱い方を学び、植生の健康状態を表すNDVI(正規化植生指数)を算出する実習を通じて、リモートセンシングとAIの橋渡しを行う。

    📘 学習ポイント:

    1.衛星データ(例:Sentinel-2、Landsat)の構造理解

    • 複数バンド画像(例:赤・近赤外)を扱う方法

    2.NDVIの基本式と意義

    NDVI = (NIR−RED) / (NIR+RED)

    3.衛星画像ファイルの読み込み

    • rasterio や numpy を用いたTIFFファイル処理

    🧪 演習例(NDVIの算出と可視化):

    import rasterio
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 衛星画像の読み込み(例:赤バンド=3、近赤外バンド=4)
    with rasterio.open("satellite_image.tif") as src:
        red = src.read(3).astype(float)
        nir = src.read(4).astype(float)
    
    # NDVI計算
    ndvi = (nir - red) / (nir + red + 1e-10)  # 0除算防止の微小値を加える
    
    # NDVIの可視化
    plt.imshow(ndvi, cmap='RdYlGn')
    plt.colorbar(label='NDVI')
    plt.title('NDVI (Normalized Difference Vegetation Index)')
    plt.axis('off')
    plt.show()
    

    🔧 応用課題:

    • NDVI値をもとに「健康な区画」と「ストレス区画」を判定
    • NDVIの時間変化をグラフ化(複数画像を時系列に並べる)
    • NDVIのヒートマップから自動アラート条件を設定(例:0.3未満で警告)

    この週は「衛星データの使いこなし」を始める入り口になります。


    ✅ 実習教材(第20週)衛星データ応用①

    • 複数地点の衛星比較演習(NDVIによる生育診断)

    🧠 目的:

    • NDVIを用いて、異なる圃場や地点ごとの生育状況を比較し、リモートセンシングを活用した「広域の生育診断」の手法を学ぶ。複数地点のNDVIを並列処理・分析する力を養う。

    📘 学習ポイント:

    1.複数地点・複数画像のNDVI比較

    • 異なる位置・時期の衛星画像を読み込み、NDVIの分布や平均を比較

    2.マスク処理による特定領域の抽出

    • AOI(関心領域)を定義し、場所ごとにNDVIを集計

    3.グラフ化・レポート作成

    • 時系列グラフやヒートマップを用いた視覚的比較

    🧪 演習例(複数圃場のNDVIを比較):

    import rasterio
    import numpy as np
    import matplotlib.pyplot as plt
    
    def calc_ndvi(path):
        with rasterio.open(path) as src:
            red = src.read(3).astype(float)
            nir = src.read(4).astype(float)
            ndvi = (nir - red) / (nir + red + 1e-10)
        return ndvi
    
    # 複数地点のNDVI読み込み
    ndvi_field_a = calc_ndvi("field_A.tif")
    ndvi_field_b = calc_ndvi("field_B.tif")
    
    # 平均NDVIの比較
    avg_a = np.nanmean(ndvi_field_a)
    avg_b = np.nanmean(ndvi_field_b)
    print(f"Field A NDVI平均: {avg_a:.3f}")
    print(f"Field B NDVI平均: {avg_b:.3f}")
    
    # NDVIマップの表示
    fig, axes = plt.subplots(1, 2, figsize=(12, 5))
    axes[0].imshow(ndvi_field_a, cmap="RdYlGn")
    axes[0].set_title("Field A NDVI")
    axes[1].imshow(ndvi_field_b, cmap="RdYlGn")
    axes[1].set_title("Field B NDVI")
    for ax in axes:
        ax.axis("off")
    plt.show()
    

    🔧 応用課題:

    • NDVIの値をCSVに出力し、ExcelやBIツールで可視化
    • NDVIのしきい値を使った「ストレス検出ゾーン」の抽出
    • 複数時点データを使った生育推移の折れ線グラフ作成

    この週は、実際の農業現場における圃場管理の可視化につながる重要な応用実習です。


    ✅ 実習教材(第21週)衛星データ応用②

    • 異常エリア自動検出モデル

    🧠 目的:

    • 衛星画像やNDVIデータをもとに、生育異常の兆候があるエリアをAIで自動検出する。クラスタリングや閾値処理などの手法を用い、広範囲の圃場監視を効率化する仕組みを学ぶ。

    📘 学習ポイント:

    • 異常検知の基本的考え方
    • 正常データからの逸脱を捉える(教師なし学習が中心)
    • NDVIを使った異常検知手法
    • 固定閾値によるしきい値判定
    • K-meansなどのクラスタリングで異常領域を分離
    • 可視化とレポート化
    • 異常エリアを地図上にマスク表示/ラベル付け

    🧪 演習例(NDVIのクラスタリングによる異常検知):

    import rasterio
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.cluster import KMeans
    
    # NDVI計算(以前の週と同様)
    with rasterio.open("ndvi_image.tif") as src:
        red = src.read(3).astype(float)
        nir = src.read(4).astype(float)
        ndvi = (nir - red) / (nir + red + 1e-10)
    
    # クラスタリングによる異常検知(例:2クラス)
    ndvi_flat = ndvi.reshape(-1, 1)
    kmeans = KMeans(n_clusters=2, random_state=42).fit(ndvi_flat)
    labels = kmeans.labels_.reshape(ndvi.shape)
    
    # 可視化
    plt.imshow(labels, cmap="coolwarm")
    plt.title("異常検知(クラスタリング)")
    plt.axis("off")
    plt.show()
    

    🔧 応用課題:

    • NDVI値の時系列変化から異常の早期発見(差分NDVI)
    • ヒートマップと重ね合わせて視覚的にリスクを報告
    • K-meansのクラスタ数を変えて安定性を検証/自動推定(エルボー法)

    ✅ 実習教材(第22週)GAN基礎

    • 葉画像の拡張用GAN構築

    🧠 目的:

    • GAN(敵対的生成ネットワーク)の基本を学び、作物や葉の画像を人工的に生成・拡張する技術を体験する。データ不足を補うための「AIによる学習データ生成」を実践的に学ぶ。

    📘 学習ポイント:

    • GANの基本構造
    • 生成器(Generator)と識別器(Discriminator)の対立関係
    • 単純なGANの構築
    • 低次元ノイズから画像を生成する基本構造の理解
    • 画像生成の評価
    • 生成画像の品質確認と学習の進捗可視化(損失の推移)

    🧪 演習例(Kerasによる簡易GANの構築):

    import tensorflow as tf
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense, LeakyReLU, Reshape, Flatten
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 生成器
    def build_generator():
        model = Sequential()
        model.add(Dense(128, input_dim=100))
        model.add(LeakyReLU(0.2))
        model.add(Dense(28*28, activation='tanh'))
        model.add(Reshape((28, 28)))
        return model
    
    # 識別器
    def build_discriminator():
        model = Sequential()
        model.add(Flatten(input_shape=(28, 28)))
        model.add(Dense(128))
        model.add(LeakyReLU(0.2))
        model.add(Dense(1, activation='sigmoid'))
        return model
    
    # GANの組み立てと学習は省略可(希望があれば拡張)
    
    # 画像生成の例
    generator = build_generator()
    noise = np.random.normal(0, 1, (1, 100))
    generated_image = generator.predict(noise)
    
    plt.imshow(generated_image[0], cmap='gray')
    plt.title("生成画像(例)")
    plt.axis('off')
    plt.show()
    

    🔧 応用課題:

    • 実際の葉画像を学習させたDCGAN(Deep Convolutional GAN)への拡張
    • 生成画像をデータ拡張用に分類モデルへ投入し、精度変化を検証
    • 学習進行中の生成画像をGIF化して可視化(成長の観察)

    この週は「AIがAIの学習を助ける」高度で創造的な内容です。



    ✅ 実習教材(第23週)
    • センサー+画像の成長予測(LSTMによる時系列予測)

    🧠 目的:

    • 作物の成長過程や環境データ(温度・湿度など)を時系列で扱い、LSTM(長短期記憶)を用いたAIによる未来予測を体験する。画像データと時系列データを組み合わせた成長モデル構築に挑戦。

    📘 学習ポイント:

    • 時系列予測モデルとしてのLSTMの基礎
    • RNNとの違い、長期依存性の扱い
    • センサーデータの整形と系列化
    • 過去N日分を1サンプルとして学習データを作成
    • LSTMによる成長パラメータの予測
    • 草丈や葉数などの連続値を予測する

    🧪 演習例(センサーデータを使ったLSTM予測):

    import numpy as np
    import pandas as pd
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import LSTM, Dense
    from sklearn.preprocessing import MinMaxScaler
    
    # データ読み込み
    df = pd.read_csv("growth_sensor_data.csv")  # 例:日付, 温度, 湿度, 草丈
    
    # 特徴量とターゲットの分離
    features = df[["temperature", "humidity"]].values
    target = df["height"].values
    
    # スケーリング
    scaler = MinMaxScaler()
    features_scaled = scaler.fit_transform(features)
    
    # 時系列データの作成(例:過去7日分を1サンプルとする)
    def create_sequences(X, y, seq_len=7):
        Xs, ys = [], []
        for i in range(len(X) - seq_len):
            Xs.append(X[i:i+seq_len])
            ys.append(y[i+seq_len])
        return np.array(Xs), np.array(ys)
    
    X_seq, y_seq = create_sequences(features_scaled, target)
    
    # モデル構築
    model = Sequential([
        LSTM(50, activation='relu', input_shape=(X_seq.shape[1], X_seq.shape[2])),
        Dense(1)
    ])
    
    model.compile(optimizer='adam', loss='mse')
    model.fit(X_seq, y_seq, epochs=20, batch_size=8)
    

    🔧 応用課題:

    • 予測結果と実測値をグラフで比較(成長曲線の可視化)
    • LSTMに画像由来の特徴量(NDVIなど)を追加して複合予測
    • 未来のセンサーデータを想定して数日後の状態をシミュレーション

    この週では「未来を読むAI」を農業に応用するステップを体験します。


    ✅ 実習教材(第24週)時系列AI基礎

    • スマート畑監視システム設計(画像+衛星データ統合)

    🧠 目的:

    • これまで学習してきた技術(画像分類、NDVI解析、異常検知、時系列予測など)を総合し、スマート農業の中核となる監視システムを設計・プロトタイプ構築する。
    • チームでプロジェクトとして実装を行い、提案力・設計力・実装力を統合的に鍛える。

    📘 学習ポイント:

    統合型AIシステムの設計

    1.入力:画像、衛星データ、センサーデータ

    • 処理:分類・異常検知・予測など

    2.出力:可視化、アラート、ダッシュボードなど

    • データフローとモジュール設計
    • コンポーネント分離、役割分担、API設計

    3.プロジェクトマネジメント

    • スケジュール設計、課題管理、成果発表の準備

    🧪 実践内容(プロジェクト例):

    🛰️ データ入力:
    - ドローン画像(病害分類モデルへ)
    - 衛星画像(NDVI異常検知モジュールへ)
    - センサーデータ(LSTM成長予測モジュールへ)
    
    🔁 AI処理:
    - 画像分類 → 異常抽出 → 成長予測 → 統合分析
    
    📊 出力:
    - モニタリング用ダッシュボード(Streamlitなど)
    - NDVIマップ+病害リスト+予測グラフ
    - 異常発見時の通知(メール or LINE APIなど)
    
    project/
    ├── data/(画像・NDVI・センサ)
    ├── modules/
    │   ├── classify.py
    │   ├── ndvi_detect.py
    │   └── growth_predict.py
    ├── dashboard/
    │   └── app.py(Streamlitなど)
    └── docs/
        └── report.pdf / slides.pptx
    

    この週は中プロジェクトとして、6か月コースの集大成となるハイライト実習です。


    ✅ 実習教材(第25週)実装準備

    • オリジナルプロジェクト設計(チームビルディング・テーマ決定)

    🧠 目的:

    • スマート農業をテーマにした実践的なAIプロジェクトを、チーム単位で計画・実装していく準備フェーズ。今後の開発・検証・発表に向けたチーム形成と企画設計を行う。

    📘 学習・活動ポイント:

    1.チームビルディング

    • 役割分担(例:データ担当、モデル担当、UI担当、まとめ役)
    • コミュニケーションツール設定(Slack / Discord / GitHub など)

    2.テーマ決定と要件定義

    • 農業課題(例:病害検出、生育モニタリング、省力化など)をベースに自由にテーマ設計
    • 利用技術(画像処理、衛星データ、LSTM、GAN、可視化など)を明確に

    3.企画書/構想資料の作成

    • 目的・背景・対象データ・AI活用ポイント・完成像を明文化
    • 作業スケジュールや必要なリソースも整理

    🧪 実践例(構想シート項目):

    項目内容例
    プロジェクト名AIによるトマト病害早期検出システム
    チーム構成4名(データ・画像処理・学習・UI)
    使用データドローン画像、病害画像、気象データ
    主なAI技術CNN分類、NDVI、異常検知、Streamlit
    成果物Webベースダッシュボード+レポート

    🔧 応用課題・支援内容:

    • Notionテンプレートやプロジェクト提案シートの配布
    • GitHubリポジトリのひな形提供(フォルダ構成+README)
    • メンタリング枠の設置(週1進捗確認など)

    この週は「自ら考え、形にしていく」工程のスタート地点です。


    ✅ 実習教材(第26週)プロジェクト開発①

    • プロジェクト開発①:実装フェーズ(データ収集・AIモデル統合)

    🧠 目的:

    • 第25週で設計した各チームのオリジナルプロジェクトをもとに、実際の実装作業に着手する週。データの整理、前処理、モデル構築、可視化の構築などを進める。

    📘 学習・作業ポイント:

    1.データ収集と整備

    • 画像・衛星・センサーデータなどをチームごとに準備・統合
    • 欠損・ノイズ・形式違いなどを整理し、使える状態に加工

    2.AIモデル統合

    • すでに学習済みの分類器/予測器の流用 or 新規学習
    • 画像処理パイプライン、NDVI処理、LSTMなどの統合

    3.システム構築の開始

    • StreamlitやFlaskでのUI作成
    • GitHubでのコード管理とドキュメント整備

    🛠️ 実装例:

    project/
    ├── data/
    │   ├── drone_images/
    │   ├── sensor_logs.csv
    │   └── satellite_ndvi/
    ├── ai_models/
    │   ├── classifier.h5
    │   ├── lstm_predictor.pkl
    ├── app/
    │   └── dashboard.py(Streamlit)
    └── docs/
        └── README.md / dev_notes.md
    

    🔧 応用課題:

    • 実装と並行してテストコードやロギング機能の導入
    • 外部APIの利用(天気API、LINE通知Botなど)
    • フロント・バックエンドの役割分担と連携

    この週はプロジェクトを形にする重要なステップです。


    ✅ 実習教材(第27週)プロジェクト開発②

    プロジェクト開発②:検証フェーズ(テスト・評価・改善)


    🧠 目的:

    チームで構築したスマート農業システムに対して動作検証・性能評価・改善作業を行う。ユーザビリティ・精度・処理時間などを意識しながら、より完成度を高めていく段階。


    📘 学習・作業ポイント:

    1.AIモデルの性能評価

    • 精度、Recall、F1スコアなどの指標で評価
    • 混同行列や予測グラフの可視化
    • 誤分類・予測ミスの傾向分析

    2.システム全体の検証

    • UI/UXの使いやすさ
    • 衛星+画像+センサの連携の信頼性と動作確認
    • 実行スピード・ロバスト性の確認(異常データや欠損対応)

    3.改善のサイクル

    • ユーザー視点でのフィードバック反映
    • 精度が低いクラスへの対処(追加データ・調整)
    • モジュール単位での再設計・改良

    🛠️ 評価の記録例(ドキュメント作成含む):

    # モデル評価レポート
    - 精度: 89.5%
    - 誤分類の多かったカテゴリ: Blight → Mildew
    - 改善策:
      - Blight画像の拡張(左右反転、明度変化)
      - クラスウェイトの調整
    
    # UI改善点
    - マップ上でNDVI異常地点にラベル表示追加
    - 予測グラフに凡例追加、日付の形式統一
    

    🔧 応用課題:

    • 複数モデルのアンサンブル化による精度向上
    • 最終評価用のベンチマークデータ作成
    • 評価レポート自動出力スクリプトの作成(PDF/HTML)

    この週は「仕上げに向けた詰めと磨き込み」のフェーズです。


    ✅ 実習教材(第28週)成果発表

    最終プレゼン・フィードバック(成果発表)


    🧠 目的:

    6か月間の学びの集大成として、各チームが開発したスマート農業プロジェクトの成果発表を実施。技術内容だけでなく、「社会にどう役立つか」という視点で伝える力を養う。


    📘 学習・発表ポイント:

    1.成果プレゼンテーション

    • 背景・目的・課題設定
    • データと技術(AI手法や処理フロー)の説明
    • デモ or 実行結果の紹介
    • 成果と反省・今後の展望

    2.コードと成果物の提出

    • GitHub リポジトリの整備(README、使用方法、学習済みモデル)
    • 成果レポート(PDF or スライド)
    • 実行動画(任意)またはライブデモ
    3.フィードバックとふりかえり
    • 講師・他チームからの質疑応答とコメント
    • チーム内での振り返り:良かった点・改善点・気づき
    • 個人としての学びと今後にどう活かすかを共有

    📝 発表フォーマット例:

    セクション内容
    タイトル/メンバー紹介プロジェクト名+担当分野
    課題と背景なぜこのテーマか?
    データとAI活用使用データ、前処理、モデル選定理由
    結果・デモ予測精度、UI画面、NDVIマップ等
    今後の展望改善案・社会実装の可能性など

    🔧 提出物まとめ(例):

    /final_submission/
    ├── presentation.pdf
    ├── final_report.pdf
    ├── github_link.txt
    ├── model/(学習済みモデル)
    └── demo.mp4(任意)