Это проект, созданный мной и членами моей команды как часть наших внутренних компонентов. Цель этого проекта — использовать изображение манго, чтобы выяснить, что это за манго, а затем использовать эту информацию и некоторые другие входные данные, такие как штат, район, рынок и дата (дд/мм/гггг). чтобы понять, сколько это будет стоить. Он использует методы машинного обучения с учителем и представляет собой простой, но уникальный проект, который предлагает глубокое понимание и понимание концепций, связанных с машинным обучением с учителем и предварительной обработкой данных. Я бы разделил весь этот проект на 3 сегмента для простоты.

Используемые наборы данных:

  1. Набор данных классификации: изображения для классификации были получены из:


Классификация и классификация сортов манго
Набор данных сортов и классификации мангоwww.kaggle.com



2. Набор данных регрессии. Набор данных для второго шага, т. е. прогнозирования цены манго, выглядит следующим образом:



Эта часть охватывает первый сегмент проекта, который представляет собой постановку задачи классификации.

Загрузка набора данных. Первым шагом любого проекта является загрузка набора данных. Чтобы не загружать наборы данных на мою машину, я предпочитаю использовать библиотеку opendatasets, которая позволяет нам напрямую импортировать набор данных из Kaggle в наши файлы Colab. Код для этого:

!pip install opendatasets
import opendatasets as od
import pandas

 od.download(
    "https://www.kaggle.com/datasets/saurabhshahane/mango-varieties-classification")

Имя пользователя и пароль, необходимые для запуска приведенного выше кода, можно получить, перейдя в свой профиль Kaggle, затем на вкладку учетной записи и выбрав опцию создания нового токена API.

Загруженный файл будет содержать учетные данные, которые необходимо ввести, и набор данных будет автоматически загружен в раздел файлов вашего блокнота Colab. Обратите внимание, что, как и все другие файлы в colab, даже этот набор данных будет стерт после отключения среды выполнения, и, следовательно, эту ячейку необходимо запустить снова после запуска среды выполнения.

Импорт библиотек. Следующим шагом является импорт всех необходимых библиотек следующим образом:

import pandas as pd
import os
import numpy as np
import matplotlib.pyplot as plt
import cv2
from google.colab.patches import cv2_imshow
import pickle
import random
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score
from sklearn.metrics import classification_report
from skimage.transform import resize
from skimage.io import imread

Предварительная обработка данных. Сначала мы указываем корневой путь набора данных и извлекаем только три категории, общие для двух наборов данных (ссылки на которые были предоставлены выше). Эта часть проекта имеет дело только с первым набором данных. Затем мы изменяем изображения, сглаживаем массив и получаем нашу матрицу признаков.

dir = './mango-varieties-classification/Dataset/Classification_dataset'
categories = ['Chaunsa (White)','Dosehri','Langra']
data = []
for category in categories:
  path = os.path.join(dir,category)
  label = categories.index(category)

  for img in os.listdir(path):
    imgpath = os.path.join(path,img)
    mango_img = cv2.imread(imgpath,0)
    try:
      mango_img = cv2.resize(mango_img,(50,50))
      image = np.array(mango_img).flatten() #flattening 2d pixel array
      data.append([image,label])

    except Exception as e:
      pass
print(len(data))

Как видно из вывода приведенной выше ячейки, всего в нашем наборе данных 600 изображений, по 200 для каждой категории, и, следовательно, в наборе данных нет проблемы дисбаланса классов.

Разделение данных. Следующим шагом будет разделение данных следующим образом:

random.shuffle(data)
features = []
labels = []

for feature, label in data:
  features.append(feature)
  labels.append(label)

xtrain, xtest, ytrain, ytest = train_test_split(features, labels, test_size = 0.20)

Создание модели. Последний шаг — создание модели классификации. В этом проекте мы создаем три разные модели, каждая из которых использует свой алгоритм, и выбираем ту, которая имеет наибольшую точность среди всех трех.

Модель 1 (SVM): первая созданная модель использовала метод опорных векторов. Машина опорных векторов, или SVM, является одним из самых популярных алгоритмов обучения с учителем, который используется как для классификации, так и для задач регрессии. Однако в первую очередь он используется для задач классификации в машинном обучении.

Цель алгоритма SVM — создать наилучшую линию или границу решения, которая может разделить n-мерное пространство на классы, чтобы мы могли легко поместить новую точку данных в правильную категорию в будущем. Эта граница наилучшего решения называется гиперплоскостью.

SVM выбирает крайние точки/векторы, которые помогают в создании гиперплоскости. Эти крайние случаи называются опорными векторами, и, следовательно, алгоритм называется машиной опорных векторов. Рассмотрим приведенную ниже диаграмму, на которой есть две разные категории, которые классифицируются с использованием границы решения или гиперплоскости:

Код для этого приведен ниже:

#SVM
from sklearn import svm
model_svm = SVC(class_weight='balanced', probability=True)
#Train the model using the training sets
model_svm.fit(xtrain, ytrain)
#Predict the response for test dataset
y_prediction_svm = model_svm.predict(xtest)

from sklearn.metrics import classification_report
print("SVM")
print(classification_report(ytest, y_prediction_svm))

Из отчета о классификации мы видим, что точность этой модели составляет примерно 0,96.

Модель 2 (KNN).Алгоритм k-ближайших соседей, также известный как KNN или k-NN, представляет собой непараметрический классификатор с контролируемым обучением, который использует близость для классификации или прогнозирования группировки. отдельной точки данных. Хотя его можно использовать как для задач регрессии, так и для задач классификации, обычно он используется в качестве алгоритма классификации, основанного на предположении, что похожие точки могут быть найдены рядом друг с другом.

Код для этого:

#KNN model
from sklearn.neighbors import KNeighborsClassifier
model_knn=KNeighborsClassifier(n_neighbors=7)
model_knn.fit(xtrain, ytrain)
y_prediction_knn= model_knn.predict(xtest)

print("knn")
print(classification_report(ytest, y_prediction_knn))

Модель 3 (Дерево решений). Дерево решений – это самый мощный и популярный инструмент для классификации и прогнозирования. Дерево решений представляет собой древовидную структуру, похожую на блок-схему, где каждый внутренний узел обозначает проверку атрибута, каждая ветвь представляет результат проверки, а каждый конечный узел содержит метку класса.

Реализация:

from sklearn.tree import DecisionTreeClassifier
model_dectree= DecisionTreeClassifier()
# Train Decision Tree Classifer
model_dectree.fit(xtrain,ytrain)
#Predict the response for test dataset
y_prediction_dectree = model_dectree.predict(xtest)
from sklearn.metrics import classification_report
print("decision tree")
print(classification_report(ytest, y_prediction_dectree))

Эта модель дает нам точность 0,98.

Следующим шагом является создание кадра данных отчета, чтобы мы могли сравнить фактические результаты и результаты, предсказанные всеми созданными моделями.

report=pd.DataFrame()
actual=[]
pred_svm=[]
pred_knn=[]
pred_dectree=[]
for i in ytest:
  actual.append(categories[i])

for i in y_prediction_svm:
  pred_svm.append(categories[i])

for i in y_prediction_knn:
  pred_knn.append(categories[i])

for i in y_prediction_dectree:
  pred_dectree.append(categories[i])

report['Actual Values']=actual
report['Predicted for SVM']=pred_svm
report['Predicted for KNN']=pred_knn
report['Predicted for Decision Tree']=pred_dectree

Вывод должен выглядеть так:

Перекрестная проверка. Затем мы выполняем перекрестную проверку, чтобы проверить наличие переобучения. Перекрестная проверка — это метод, используемый в машинном обучении для оценки производительности модели на невидимых данных. Он включает в себя разделение доступных данных на несколько сгибов или подмножеств, использование одного из этих сгибов в качестве проверочного набора и обучение модели на оставшихся сгибах. Этот процесс повторяется несколько раз, каждый раз используя разные складки в качестве проверочного набора. Наконец, результаты каждого шага проверки усредняются, чтобы получить более надежную оценку производительности модели.

from sklearn.model_selection import cross_val_score
scores = cross_val_score(model_svm, features, labels, cv=10)

# Print the average cross-validation score
print("Cross-validation score:", np.mean(scores))

scores = cross_val_score(model_knn, features, labels, cv=10)

# Print the average cross-validation score
print("Cross-validation score:", np.mean(scores))

scores = cross_val_score(model_dectree, features, labels, cv=10)

# Print the average cross-validation score
print("Cross-validation score:", np.mean(scores))

Поскольку модель 1 имеет наивысший балл 0,9533, мы выбираем ее в качестве нашей окончательной модели и создаем для нее файл рассола.

#Since model 1 has the highest cross validation score i.e, the best true we consider it our final model for the classification problem:

import pickle
model = open('classification_model.pkl', 'wb')
pickle.dump(model_svm,model)
model.close()

Далее мы тестируем модель на случайно скачанном изображении:

x = open("classification_model.pkl","rb")
model=pickle.load(x)
x.close()
path='/content/dosheri_test.jpg'
img = cv2.imread(path,0)
plt.imshow(img)
plt.show()
img_resize=cv2.resize(img,(50,50))
l=[np.array(img_resize).flatten()]
probability=model.predict_proba(l)
for ind,val in enumerate(categories):
    print(f'{val} = {probability[0][ind]*100}%')
print("The predicted image is : "+categories[model.predict(l)[0]])

Вывод должен выглядеть так:

Вот и все, мы закончили первую часть проекта.

Я действительно надеюсь, что вы найдете этот проект интересным и полезным, и я призываю вас подписаться, чтобы получать уведомления о публикации новых статей.

Счастливого обучения!!

Имя: Вайшнави Гупта

Идентификатор электронной почты:[email protected]

Профиль LinkedIn:www.linkedin.com/in/vaishnavi-gupta-11102002