В этом проекте мы создадим свёрточную нейронную сеть, которая сможет предсказать, страдает ли растение болезнью. Мы будем использовать разные слои и другие гиперпараметры для построения, обучения и тестирования этой модели классификации. Для этого проекта мы будем использовать tensorflow и keras.
Мы должны импортировать все необходимые библиотеки. Поскольку мы создаем модель CNN, мы должны импортировать все необходимые слои, активации, оптимизаторы и т. д.
Мы должны наблюдать за некоторыми изображениями, которые есть в нашем наборе данных.
После визуализации изображений давайте продолжим и создадим функцию, которая преобразует изображения в массив numpy. Это необходимо, потому что после этого мы нормализуем наш набор данных.
Теперь мы преобразуем все изображения в массив numpy.
- Он определяет путь к каталогу изображений как «dir» и назначает список каталогов в этом каталоге переменной «root_dir».
- Он инициализирует два пустых списка, «image_list» и «label_list», для хранения изображений и меток соответственно.
- Он определяет список меток «all_labels» и присваивает двоичное значение каждой метке «binary_labels».
- Он инициализирует переменную «temp» значением -1.
- Он запускает цикл, который перебирает каталоги в «root_dir». Для каждого каталога он получает список изображений в каталоге с помощью метода listdir и присваивает его переменной «plant_image_list».
- Он увеличивает значение «temp» на 1.
- Он запускает еще один цикл, который перебирает изображения в «plant_image_list». Для каждого изображения он создает полный путь к изображению, используя каталог и имя файла, и присваивает его переменной «image_path».
- Он использует функцию convert_image_to_array для преобразования изображения в пустой массив и добавляет полученный массив в «image_list».
- Он добавляет соответствующую метку к «label_list», используя значение «temp» в качестве индекса к списку «binary_labels».
- После обработки всех изображений в текущем каталоге значение «temp» сбрасывается до -1.
- Циклы продолжаются до тех пор, пока не будут обработаны все каталоги в «root_dir», после чего image_list и label_list будут содержать все изображения и метки из набора данных.
Важно отметить, что в этом скрипте функция «convert_image_to_array» не определена и должна быть предоставлена пользователем перед запуском скрипта. Кроме того, функция listdir() используется для получения списка каталогов и файлов в данном каталоге, однако в скрипте отсутствует оператор импорта для os, вам следует импортировать модуль os перед запуском скрипта. Этот сценарий также предполагает, что файлы изображений имеют определенный формат и путь к файлам изображений указан правильно.
Далее мы будем использовать sklearn train_test_split, чтобы разделить набор данных на данные тестирования и обучения. Здесь я взял размер теста равным 0,2, поэтому мои данные будут разделены на 80% обучающих и 20% тестовых данных.
Теперь мы нормализуем набор данных наших изображений. Поскольку значения пикселей варьируются от 0 до 255, мы разделим каждый пиксель изображения на 255, чтобы нормализовать набор данных.
Далее мы создадим сетевую архитектуру для модели. Мы использовали различные типы слоев в соответствии с их характеристиками, а именно Conv_2d (используется для создания сверточного ядра, которое сворачивается с входным слоем для создания выходного тензора), max_pooling2d (это метод понижающей дискретизации, который извлекает максимальное значение из окно, определяемое размером пула), flatten (выравнивает ввод и создает одномерный вывод), Dense (плотный слой создает вывод как скалярное произведение ввода и ядра).
model = Sequential() model.add(Conv2D(32, (3, 3), padding="same",input_shape=(256,256,3), activation="relu")) model.add(MaxPooling2D(pool_size=(3, 3))) model.add(Conv2D(64, (3, 3), padding="same", activation="relu")) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(64, activation="relu")) model.add(Dense(3, activation="softmax")) model.summary()
При компиляции модели нам нужно установить тип потери, который будет двоичной кроссэнтропией для нашей модели, наряду с этим нам также необходимо установить оптимизатор и метрики соответственно.
Сопоставляем модель с данными и выясняем точность в каждую эпоху, чтобы увидеть, как наша модель учится. Теперь мы будем обучать нашу модель на 10 эпохах и размере пакета 128. Вы можете попробовать использовать большее количество эпох для повышения точности, но здесь мы видим, что модель уже достигла очень высокой точности, поэтому нам не нужно запускать это больше. В каждую эпоху мы можем видеть, как работает модель, просматривая точность обучения и проверки.
Далее мы построим график точности модели для истории обучения.
#Plot the training history plt.figure(figsize=(12, 5)) plt.plot(history.history['accuracy'], color='r') plt.plot(history.history['val_accuracy'], color='b') plt.title('Model Accuracy') plt.ylabel('Accuracy') plt.xlabel('Epochs') plt.legend(['train', 'val']) plt.show()
Заключение
Мы начали с загрузки набора данных и визуализации изображений. Нормализация — важный шаг при работе с любым типом набора данных. После этого мы создали модель CNN, которая в дальнейшем используется для прогнозирования болезней растений с использованием изображения, предоставленного модели. Эта модель очень полезна, поскольку ее могут использовать различные сельскохозяйственные фирмы и фермеры для повышения урожайности и предотвращения потерь урожая из-за болезней.