農業とディープラーニング: 土壌と作物の収量を改善する

農業とディープラーニング: 土壌と作物の収量を改善する

ソースノード: 3066255

概要

多くのインド人にとって農業は単なる仕事ではありません。それは生き方です。それは彼らが生計を支え、インド経済に多大な貢献をする手段です。粘土、砂、シルトの粒子がそれぞれの割合で含まれる土壌の種類を決定することは、適切な作物の選択と雑草の成長の特定にとって重要です。農業におけるディープラーニングの可能性を発見してください。インドにおける土壌の種類と雑草検出の重要性を理解します。

深い学習 あらゆる分野で役立つ新技術です。深層学習は、現場監視、現場作業、ロボット工学、土壌、水、気候条件の予測、景観レベルの土地と作物の種類の監視など、さまざまな規模のスマート農業に広く応用されています。土壌の写真をディープ ラーニング アーキテクチャに入力し、特徴の検出を学習させ、ディープ ラーニング アーキテクチャを使用して土壌を分類できます。

農業におけるディープラーニング

このブログでは、農業における土壌の重要性について説明します。機械学習と深層学習モデルを使用して土壌を分類します。

学習目標

  • 農業において土がいかに重要であるかがわかります。
  • 機械学習アルゴリズムが土壌の種類を分類する方法を学びます。
  • 農業に深層学習モデルを実装して、土壌の種類を分類します。
  • マルチスタッキング アンサンブル学習の概念を検討して、予測の精度を高めます。

この記事は、の一部として公開されました データサイエンスブログ。

目次

農業における土壌の役割

動植物から排泄される有機物、鉱物、気体、液体などは、農業の基盤となる大切な土壌を形成します。農業の基礎は、植物や動物から発生するガス、ミネラル、有機物などの物質であり、土壌システムを形成します。

インドの経済は純粋に農業に依存しています。土壌は作物にとって重要ですが、その肥沃さゆえに望ましくない雑草の発生につながります。

農業における土壌の役割 |農業におけるディープラーニング

水分と温度は土壌中の細孔や粒子の形成に影響を与える物理的変数であり、根の成長、水の浸透、植物の出現速度に影響を与えます。

しかし、主に土壌には砂と粘土の粒子が含まれています。広く利用可能な土壌粒子の中で、探査現場には粘土が豊富に存在します。粘土粒子が表面に存在するのは、豊富な栄養が供給されているためです。泥炭とロームはほとんど存在しません。粘土質土壌の間には広々とした空間があり、そこに水分が保たれています。

データセット

カグルリンク

データセット |農業におけるディープラーニング
"
"
"
"

特徴抽出は、優れた深層学習モデルを構築するための主要な手順の 1 つです。機械学習アルゴリズムの構築に必要となる可能性のある機能を特定することが重要です。を使用します。 マホタス 画像の空間情報とテクスチャ情報を含むハラリック特徴を抽出するためのライブラリ。

skimage ライブラリを使用して画像をグレースケールに変換し、物体検出に役立つ勾配ヒストグラム (HOG) 特徴を抽出します。最後に、特徴の値を配列に連結し、後で機械学習および深層学習アルゴリズムで使用します。

特徴抽出 |農業におけるディープラーニング
import mahotas as mh
from skimage import color, feature, io
import numpy as np

# Function to extract features from an image
def extract_features(image_path):
    img = io.imread(image_path)
    gray_img = color.rgb2gray(img)  # Converting image to grayscale
    
    # Converting the grayscale image to integer type
    gray_img_int = (gray_img * 255).astype(np.uint8)
    
    # Extracting Haralick features using mahotas
    haralick_features = mh.features.haralick(gray_img_int).mean(axis=0)
    
    # Extracting Histogram of Gradients (HOG) features
    hog_features, _ = feature.hog(gray_img, visualize=True)
    
    # Printing the first few elements of each feature array
    print("Haralick Features:", haralick_features[:5])
    print("HOG Features:", hog_features[:5])
    
    # Concatenating the features into a single array
    all_features = np.concatenate((haralick_features, hog_features))
    
    return all_features

image_path = '/kaggle/input/soil-classification-dataset/Soil-Dataset/Yellow Soil/20.jpg'
features = extract_features(image_path)
print("Extracted Features:", features)
"

土壌分類における機械学習アルゴリズム

次に、Kaggle から取得した土壌画像を使用して機械学習モデルを構築しましょう。

まず、すべてのライブラリをインポートし、次の名前の関数を構築します。 抽出機能 画像から特徴を抽出します。次に、画像がインポートされ、グレースケールへの変換を含む処理が行われ、これらの特徴が得られます。次に、各画像の特徴が抽出された後、次を使用してラベルがエンコードされます。 ラベルエンコーダー。

import os
import numpy as np
import mahotas as mh
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.ensemble import RandomForestClassifier, StackingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, classification_report
from skimage import color, feature, io

# Function to extract features from an image
def extract_features(image_path):
    img = io.imread(image_path)
    gray_img = color.rgb2gray(img)  # Converting image to grayscale
    gray_img_int = (gray_img * 255).astype(np.uint8)
    haralick_features = mh.features.haralick(gray_img_int).mean(axis=0)
    hog_features, _ = feature.hog(gray_img, visualize=True)
    hog_features_flat = hog_features.flatten()  # Flattening the HOG features
    # Ensuring both sets of features have the same length
    hog_features_flat = hog_features_flat[:haralick_features.shape[0]]
    return np.concatenate((haralick_features, hog_features_flat))

data_dir = "/kaggle/input/soil-classification-dataset/Soil-Dataset"

image_paths = []
labels = []

class_indices = {'Black Soil': 0, 'Cinder Soil': 1, 'Laterite Soil': 2, 
'Peat Soil': 3, 'Yellow Soil': 4}

for soil_class, class_index in class_indices.items():
    class_dir = os.path.join(data_dir, soil_class)
    class_images = [os.path.join(class_dir, image) for image in os.listdir(class_dir)]
    image_paths.extend(class_images)
    labels.extend([class_index] * len(class_images))

# Extracting features from images
X = [extract_features(image_path) for image_path in image_paths]

# Encoding labels
le = LabelEncoder()
y = le.fit_transform(labels)

# Splitting the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Initializing and training a Random Forest Classifier
rf_classifier = RandomForestClassifier(n_estimators=100, random_state=42)
rf_classifier.fit(X_train, y_train)

# Making predictions
y_pred_rf = rf_classifier.predict(X_test)

# Evaluating the Random Forest model
accuracy_rf = accuracy_score(y_test, y_pred_rf)
report_rf = classification_report(y_test, y_pred_rf)

print("Random Forest Classifier:")
print("Accuracy:", accuracy_rf)
print("Classification Report:n", report_rf)
出力 |農業におけるディープラーニング
出力

ディープニューラルネットワーク

計算ユニットとニューロンの数に基づいて機能します。各ニューロンは入力を受け取り、出力を提供します。これは精度を高め、より適切な予測を行うために使用されますが、機械学習アルゴリズムはデータの解釈に依存しており、それに基づいて意思決定が行われます。

また読む: ディープラーニングとニューラルネットワークの入門ガイド

ここで、Keras の Sequential API を使用して定義されたモデルを構築しましょう。このモデルには、Conv2D 畳み込み層 MaxPooling2D、平坦化層 Flatten、および密な層 Dense があります。

最後に、モデルは次を使用してコンパイルされます。 アダム オプティマイザーとカテゴリカルクロスエントロピー損失。

import tensorflow as tf
from tensorflow.keras.preprocessing import image_dataset_from_directory

data_dir = "/kaggle/input/soil-classification-dataset/Soil-Dataset"

# Setting up data generators
batch_size = 32
image_size = (224, 224)

# Using image_dataset_from_directory to load and preprocess the images
train_dataset = image_dataset_from_directory(
    data_dir,
    labels='inferred',
    label_mode='categorical',
    validation_split=0.2,
    subset='training',
    seed=42,
    image_size=image_size,
    batch_size=batch_size,
)

validation_dataset = image_dataset_from_directory(
    data_dir,
    labels='inferred',
    label_mode='categorical',
    validation_split=0.2,
    subset='validation',
    seed=42,
    image_size=image_size,
    batch_size=batch_size,
)

# Displaying the class indices
print("Class indices:", train_dataset.class_names)

model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 3)),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(len(train_dataset.class_names), activation='softmax')
])

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

# Training the model
epochs = 10
history = model.fit(train_dataset, epochs=epochs, validation_data=validation_dataset)
"
import numpy as np
from tensorflow.keras.preprocessing import image

# Function to load and preprocess an image for prediction
def load_and_preprocess_image(img_path):
    img = image.load_img(img_path, target_size=image_size)
    img_array = image.img_to_array(img)
    img_array = np.expand_dims(img_array, axis=0)
    img_array /= 255.0  
    return img_array

image_path = '/kaggle/input/soil-classification-dataset/Soil-Dataset/Peat Soil/13.jpg'
new_image = load_and_preprocess_image(image_path)

# Making predictions
predictions = model.predict(new_image)
predicted_class = np.argmax(predictions[0])

# Getting the class label based on the class indices
class_labels = {0: 'Black Soil', 1: 'Cinder Soil', 2: 'Laterite Soil',
 3: 'Peat Soil', 4: 'Yellow Soil'}
predicted_label = class_labels[predicted_class]

# Displaying the prediction
print("Predicted Class:", predicted_class)
print("Predicted Label:", predicted_label)
出力
出力

ご覧のとおり、予測されたクラスは 0、つまり Black Soil です。したがって、私たちのモデルは土壌の種類を正しく分類しています。

提案されたマルチスタッキングアンサンブル学習モデルのアーキテクチャ

  スタッキング分類子 BaseClassifiers と ロジスティック回帰 メタ分類子 最終推定者。これにより、baseClassifier の出力が結合されて、最終的な予測が行われます。次に、トレーニングと予測を行った後、精度が計算されます。

base_classifiers = [
    ('rf', RandomForestClassifier(n_estimators=100, random_state=42)),
    ('knn', KNeighborsClassifier(n_neighbors=5)),
    ('svm', SVC(kernel='rbf', C=1.0, probability=True)),
    ('nb', GaussianNB())
]

# Initializing the stacking classifier with a logistic regression meta-classifier
stacking_classifier = StackingClassifier(estimators=base_classifiers, 
final_estimator=LogisticRegression())

# Training the stacking classifier
stacking_classifier.fit(X_train, y_train)

# Making predictions with Stacking Classifier
y_pred_stacking = stacking_classifier.predict(X_test)

# Evaluating the Stacking Classifier model
accuracy_stacking = accuracy_score(y_test, y_pred_stacking)
report_stacking = classification_report(y_test, y_pred_stacking)

print("nStacking Classifier:")
print("Accuracy:", accuracy_stacking)
print("Classification Report:n", report_stacking)
"

まとめ

土壌は良い作物を生み出すために重要な要素です。特定の作物を生産するにはどのような土壌タイプが必要かを知ることが重要です。したがって、土壌の種類を分類することが重要になります。土壌の種類を手動で分類するのは時間のかかる作業であるため、深層学習モデルを使用して土壌を分類するのが簡単になります。この問題ステートメントを実装するための機械学習モデルと深層学習モデルが多数あります。最適なものを選択するかどうかは、データセット内に存在するデータの品質と量、および当面の問題ステートメントによって異なります。最適なアルゴリズムを選択するもう 1 つの方法は、それぞれを評価することです。それは、土壌をどの程度正確に分類できるかという精度を測定することで実現できます。最後に、複数のモデルを使用して最適なモデルを構築する、マルチスタッキング アンサンブル モデルを実装しました。

主要な取り組み

  • 効果的な作物選択のためには、土壌を完全に理解する必要があります。
  • 農業におけるディープラーニングは、植物の病気の予測から土壌の種類や水の需要に至るまで、強力なツールです。
  • 土壌画像から特徴を取得するために特徴抽出を行いました。
  • このブログでは、土壌を分類するための機械学習モデルと深層学習モデル、および精度を向上させるためのマルチスタック アンサンブル モデルを検討しました。

よくある質問

Q1.農業において土壌を正しく分類することがなぜ重要なのでしょうか?

A. 適切な作物を選択し、雑草の成長を特定するために重要です。

Q2.土壌の識別で考慮される主な特徴は何ですか?

A. 砂、粘土、シルト、泥炭、ロームなどの地物が考慮されます。

Q3.このトピックにおいて、ディープ ラーニングは従来の機械学習とどのように異なるのでしょうか?

A. 従来の機械学習がデータを解釈して意思決定を行うのに対し、ディープ ラーニングではモデルがインテリジェントな意思決定を行うことができます。

Q4.提案されたマルチスタッキングアンサンブルモデルの役割は何ですか?

A. マルチスタッキング アンサンブル モデルにより、土壌タイプの分類の精度が向上します。

この記事に示されているメディアは Analytics Vidhya が所有するものではなく、著者の裁量で使用されています。

タイムスタンプ:

より多くの 分析Vidhya