Logo Zephyrnet

Phân loại hình ảnh bằng Máy học

Ngày:

Bài báo này đã được xuất bản như một phần của Blogathon Khoa học Dữ liệu.

Gởi bạn đọc,

Trong blog này, chúng ta sẽ thảo luận về cách thực hiện phân loại hình ảnh bằng cách sử dụng bốn thuật toán học máy phổ biến là, Bộ phân loại rừng ngẫu nhiên, KNN, Bộ phân loại cây quyết định và bộ phân loại Naive Bayes. Chúng tôi sẽ trực tiếp bắt đầu thực hiện từng bước.

Ở phần cuối của bài viết, bạn sẽ hiểu tại sao Deep Learning lại được ưu tiên dùng để phân loại hình ảnh. Tuy nhiên, công việc được chứng minh ở đây sẽ giúp phục vụ mục đích nghiên cứu nếu người ta muốn so sánh mô hình phân loại hình ảnh CNN của họ với một số thuật toán học máy.

Vì vậy, hãy bắt đầu…

Lịch trình sự kiện

  • Mua lại tập dữ liệu
  • Xử lý trước tập dữ liệu
  • Triển khai công cụ phân loại rừng ngẫu nhiên
  • Triển khai KNN
  • Triển khai bộ phân loại cây quyết định
  • Triển khai trình phân loại Naive Bayes
  • Kết quả
  • Kiểm tra đầu vào tùy chỉnh
  • Kết luận

Mua lại tập dữ liệu

Thu thập dữ liệu

nguồn

Tập dữ liệu được sử dụng trong blog này là tập dữ liệu CIFAR-10. Nó là một tập dữ liệu Keras và do đó có thể được tải xuống trực tiếp từ đây với một mã đơn giản! Nó bao gồm mười lớp, cụ thể là máy bay, ô tô, chim, mèo, nai, chó, ếch, ngựa, tàu và xe tải. đang giải quyết vấn đề phân loại nhiều lớp.

Đầu tiên, hãy nhập các gói bắt buộc như sau:

from tensorflow import keras import matplotlib.pyplot as plt
từ sklearn.metrics nhập chính xác_score, nhầm lẫn_matrix, phân loại_report nhập numpy dưới dạng np
nhập cv2

Tập dữ liệu có thể được tải bằng cách sử dụng mã bên dưới:

(x_train, y_train), (x_test, y_test) = keras.datasets.cifar10.load_data ()

Hơn nữa, chúng ta có thể lấy kích thước của tập dữ liệu thử nghiệm và tàu như được hiển thị bên dưới:

x_train.shape, x_test.shape

Như vậy, có tổng cộng 50,000 hình ảnh để đào tạo và 10,000 hình ảnh để thử nghiệm. Bên cạnh đó, mỗi hình ảnh này có kích thước 32 × 32 và màu sắc. Các chi tiết trên có thể dễ dàng suy ra từ hình dạng được trả về.

LƯU Ý: Hãy chú ý rằng không cần phân chia thử nghiệm tàu ​​trong trường hợp này vì có thể lấy trực tiếp các bộ thử nghiệm và huấn luyện từ Keras!

Xử lý trước tập dữ liệu

Bước này bao gồm quá trình chuẩn hóa hình ảnh, sau đó là việc định hình lại chúng.

Chuẩn hóa là một bước phổ biến của quá trình tiền xử lý hình ảnh và đạt được bằng cách chỉ cần chia x_train cho 255.0 cho tập dữ liệu tàu và x_test cho 255.0 cho tập dữ liệu thử nghiệm. Điều này là cần thiết để duy trì các pixel của tất cả các hình ảnh trong một phạm vi đồng nhất.

# Chuẩn hóa x_train = x_train / 255.0 x_test = x_test / 255.0

Bây giờ là bước thiết yếu nhất của quá trình tiền xử lý, chỉ áp dụng trong trường hợp này vì chúng tôi muốn sử dụng học máy để phân loại hình ảnh. Vì chúng ta sẽ sử dụng các thuật toán ML từ sklearn, nên cần phải định hình lại các hình ảnh của tập dữ liệu thành một mảng hai chiều. Điều này là do sklearn mong đợi một mảng 2D làm đầu vào cho hàm fit () sẽ được gọi trên mô hình trong quá trình đào tạo.

Do đó, hình ảnh của tập dữ liệu thử nghiệm cũng nên được thay đổi kích thước thành mảng 2D vì mô hình đã được huấn luyện với hình dạng đầu vào này.

LƯU Ý: Trong trường hợp mạng nơ-ron, chúng ta phải chỉ định hình dạng đầu vào cho mô hình và do đó nó linh hoạt hơn. Tuy nhiên, trong trường hợp của sklearn, có một số hạn chế.

Mã bắt buộc cho đoàn tàu như sau:

#sklearn dự kiến ​​i / p là 2d array-model.fit (x_train, y_train) => định hình lại thành mảng 2d nsamples, nx, ny, nrgb = x_train.shape x_train2 = x_train.reshape ((nsamples, nx * ny * nrgb ))

Đoạn mã trên định dạng lại hình ảnh tập hợp xe lửa từ (50000,32,32,3) là mảng 4D thành (50000,3072), mảng 2D. 3072 nhận được bằng cách nhân các kích thước của hình ảnh (32x32x3 = 3072).

Mã bắt buộc cho bộ thử nghiệm được cung cấp dưới đây:

# vì vậy, cuối cùng, model.posystem () cũng phải là một đầu vào 2d nsamples, nx, ny, nrgb = x_test.shape x_test2 = x_test.reshape ((nsamples, nx * ny * nrgb))

Tương tự, các hình ảnh của bộ thử nghiệm được định hình lại từ (10000,32,32,3) thành (10000,3072).

Triển khai công cụ phân loại rừng ngẫu nhiên

Hãy xây dựng Bộ phân loại rừng ngẫu nhiên để phân loại ảnh CIFAR-10.

Đối với điều này, trước tiên chúng ta phải nhập nó từ sklearn:

từ sklearn.ensemble nhập RandomForestClassifier

Tạo một phiên bản của lớp RandomForestClassifier:

model = RandomForestClassifier ()

Cuối cùng, chúng ta hãy tiến hành đào tạo mô hình:

model.fit (x_train2, y_train) LƯU Ý: Truyền x_train2 cho hàm fit () vì nó là mảng 2D được định hình lại của hình ảnh và sklearn cần một mảng 2D làm đầu vào ở đây. Làm điều này trong khi phù hợp với tất cả các mô hình vì tất cả chúng đều được triển khai bằng sklearn

Bây giờ, hãy dự đoán cho tập thử nghiệm bằng cách sử dụng mô hình Bộ phân loại rừng ngẫu nhiên được trang bị:

y_pred = model.p Dự đoán (x_test2) y_pred

Mô hình trả về một số từ 0 đến 9 làm đầu ra. Điều này có thể được quan sát rõ ràng từ các dự đoán được hiển thị. Các câu trả lời này có thể được ánh xạ tới các lớp tương ứng của chúng với sự trợ giúp của bảng sau:

Đầu ra 

Lớp

0

1

Xe hơi

2

Chim

3

Cát

4

Nai

5

Dog

6

Frog

7

Ngựa

8

Tàu Thuyền

9

Xe tải

Bây giờ, hãy đánh giá mô hình bằng các hình ảnh kiểm tra bằng cách lấy báo cáo phân loại, ma trận nhầm lẫn và điểm độ chính xác của nó.

Độ chính xác_score (y_pred, y_test) in (báo cáo phân loại (y_pred, y_test))
đầu ra | rừng ngẫu nhiên
nhầm lẫn_matrix (y_pred, y_test)
Phân loại hình ảnh ML

Do đó, Random Forest Classifier chỉ hiển thị độ chính xác 47% trên bộ thử nghiệm.

Triển khai KNN

KNN là viết tắt của K-Những người hàng xóm gần nhất. Nó cũng là một thuật toán được sử dụng phổ biến để phân loại nhiều lớp.

Nó được thực hiện trong sklearn bằng cách sử dụng lớp KNeighborsClassifier. Chúng tôi bắt đầu bằng cách nhập nó:

từ sklearn.neighbors nhập KNeighborsClassifier

và sau đó khởi tạo nó để tạo mô hình KNN:

knn = KNeighborsClassifier (n_neighbors = 7)

Tôi đã chọn ngẫu nhiên 7 người hàng xóm. Hãy thoải mái chơi với số lượng hàng xóm để đi đến một mô hình tốt hơn và do đó tối ưu.

Cuối cùng, đào tạo nó:

knn.fit (x_train2, y_train)

Bây giờ, hãy dự đoán cho tập thử nghiệm bằng mô hình KNN được trang bị:

y_pred_knn = knn.p Dự đoán (x_test2) y_pred_knn

Các dự đoán là kết quả đầu ra đại diện cho các lớp như được mô tả trong thuật toán trước.

Bây giờ, hãy tiến hành đánh giá mô hình KNN giống như cách chúng ta đã đánh giá mô hình trước đó của mình.

độ chính xác_score (y_pred_knn, y_test) in (báo cáo phân loại (y_pred_knn, y_test))
Phân loại hình ảnh ML
nhầm lẫn_matrix (y_pred_knn, y_test)
thực hiện KNN

Do đó, KNN Classifier chỉ hiển thị độ chính xác 34% trên bộ thử nghiệm.

Triển khai cây quyết định

Nó được triển khai trong sklearn bằng cách sử dụng lớp DecisionTreeClassifier. Chúng tôi bắt đầu bằng cách nhập nó:

từ sklearn.tree import DecisionTreeClassifier

và sau đó khởi tạo nó để tạo một mô hình DecisionTreeClassifier:

dtc = DecisionTreeClassifier ()

Cuối cùng, đào tạo nó:

dtc.fit (x_train2, y_train)

Bây giờ, hãy dự đoán cho tập thử nghiệm bằng cách sử dụng mô hình cây quyết định được điều chỉnh:

y_pred_dtc = dtc.p Dự đoán (x_test2)
y_pred_dtc

Các dự đoán là kết quả đầu ra đại diện cho các lớp như được mô tả trong thuật toán trước.

Bây giờ, hãy tiến hành đánh giá mô hình cây quyết định giống như cách chúng ta đã đánh giá mô hình trước đó của mình.

độ chính xác_score (y_pred_dtc, y_test) in (báo cáo phân loại (y_pred_dtc, y_test))
đầu ra | cây quyết định
nhầm lẫn_matrix (y_pred_dtc, y_test)
Phân loại hình ảnh ML

Do đó, Bộ phân loại cây quyết định chỉ hiển thị độ chính xác 27% trên tập kiểm tra.

Triển khai trình phân loại Naive Bayes

Nó là bộ phân loại học máy cơ bản nhất, còn được viết tắt là NB. Nó hoạt động dựa trên Định lý Bayes và có các tính năng độc lập.

Nó được triển khai trong sklearn bằng cách sử dụng lớp GaussianNB. Chúng tôi bắt đầu bằng cách nhập nó:

từ sklearn.naive_bayes nhập GaussianNB

và sau đó khởi tạo nó để tạo mô hình NB:

nb = GaussianNB ()

Cuối cùng, đào tạo nó:

nb.fit (x_train2, y_train)

Bây giờ, hãy dự đoán cho tập thử nghiệm bằng cách sử dụng mô hình NB được trang bị:

y_pred_nb = nb.p Dự đoán (x_test2)
y_pred_nb

Các dự đoán là kết quả đầu ra đại diện cho các lớp như được mô tả trong thuật toán trước.

Bây giờ, hãy tiến hành đánh giá mô hình cây quyết định giống như cách chúng ta đã đánh giá mô hình trước đó của mình.

độ chính xác_score (y_pred_nb, y_test) in (báo cáo phân loại (y_pred_nb, y_test))
đầu ra | Phân loại hình ảnh ML
nhầm lẫn_matrix (y_pred_nb, y_test)
Đầu ra | Naives Bayes

Do đó, Bộ phân loại Naive Bayes chỉ hiển thị độ chính xác 30% trên bộ thử nghiệm.

Kết quả

Phân loại hình ảnh ML

Độ chính xác của bốn thuật toán ML, chúng tôi vừa khám phá cho tập dữ liệu CIFAR-10 của chúng tôi, có thể được tóm tắt bằng cách sử dụng biểu đồ hiển thị ở trên.

Công cụ Phân loại Rừng Ngẫu nhiên cho thấy hiệu suất tốt nhất với độ chính xác 47%, tiếp theo là KNN với độ chính xác 34%, NB với độ chính xác 30% và Cây quyết định với độ chính xác 27%. Do đó, Rừng Ngẫu nhiên thể hiện hiệu suất tốt nhất và Cây Quyết định là kém nhất.

Tuy nhiên, tất cả các thuật toán Máy học hoạt động kém như được chỉ ra bởi độ chính xác. Cao nhất chỉ là 47% trong khi các thuật toán học sâu vượt trội hơn chúng một cách đặc biệt với độ chính xác gần như vượt quá 90% !!!

Đó là lý do tại sao tôi đã đề cập ngay từ đầu rằng công việc này chỉ có thể được sử dụng để so sánh mô hình Học sâu và bảo vệ mô hình DL.

Kiểm tra đầu vào tùy chỉnh

Từ các kết quả trên, vì RandomForestClassifier cho thấy hiệu suất tốt nhất trong số tất cả và độ chính xác khá tốt, chúng ta hãy chọn mô hình này.

Đầu vào tùy chỉnh đề cập đến một hình ảnh duy nhất mà bạn muốn chuyển đến mô hình và thử nghiệm. Thử nghiệm một mô hình cho một đầu vào duy nhất được sử dụng rộng rãi trong các ứng dụng thời gian thực khác nhau. Ví dụ: ảnh của một cá nhân được nhập vào hệ thống để nhận dạng khuôn mặt.

Tôi đã sử dụng hình ảnh tùy chỉnh sau để kiểm tra mô hình của mình:

Phân loại hình ảnh ML                                                                                                        nguồn

Đề cập đến đường dẫn của hình ảnh của bạn - vị trí mà bạn đã lưu trữ hình ảnh tùy chỉnh mà bạn muốn kiểm tra.

img_path = '/ content / bird.jfif' LƯU Ý: Vì tôi đã triển khai công việc trên Google Colab, tôi đã tải lên một hình ảnh ở đó và bao gồm đường dẫn của hình ảnh cho phù hợp. Thay đổi giá trị của img_path theo vị trí của hình ảnh bạn muốn kiểm tra.

Đầu tiên, đọc hình ảnh bằng OpenCV và sau đó thay đổi kích thước của nó thành 32 × 32.

img_arr = cv2.imread (img_path) img_arr = cv2.resize (img_arr, (32,32))

Bây giờ, hãy định hình lại hình ảnh thành 2D như đã thảo luận trong phần tiền xử lý:

# vì vậy, cuối cùng, model.posystem () cũng phải là đầu vào 2d nx, ny, nrgb = img_arr.shape img_arr2 = img_arr.reshape (1, (nx * ny * nrgb))

Hãy để chúng tôi khai báo một danh sách được gọi là các lớp:

class = ["máy bay", "ô tô", "chim", "mèo", "hươu", "chó", "ếch", "ngựa", "tàu", "xe tải"]

Nó có tất cả mười loại. Đầu ra của mô hình, như đã thảo luận trước đó, sẽ từ 0 đến 9 và lớp tương ứng có thể được truy xuất từ ​​danh sách trên.

Cuối cùng, chuyển mảng được yêu cầu đến Bộ phân loại rừng ngẫu nhiên bằng cách sử dụng hàm dự đoán ().

ans = model.p Dự đoán (img_arr2) print (các lớp [ans [0]]) #RandomForestClassifier

Biến answer là một danh sách chỉ có một số là chỉ số của danh sách lớp. Loại tại chỉ mục này là loại được dự đoán.

Mô hình dự đoán nó là một con chim là đúng! Tuy nhiên, nó dự đoán không chính xác đối với một vài hình ảnh thử nghiệm. Hạn chế có thể được khắc phục bằng cách xây dựng mô hình CNN hoặc ANN thay thế.

Kết luận

Do đó, trong blog này, chúng ta đã thảo luận về cách sử dụng phân loại hình ảnh trong Học máy bằng cách triển khai bốn thuật toán ML phổ biến bao gồm Rừng ngẫu nhiên, KNN, Cây quyết định và bộ phân loại Naive Bayes. Do độ chính xác kém, Học sâu được ưu tiên cho các nhiệm vụ phân loại hình ảnh.

Bạn có thể khám phá thêm công việc này bằng cách cố gắng cải thiện việc phân loại hình ảnh này trong các mô hình ML bằng cách sử dụng điều chỉnh siêu tham số. Bạn có thể đạt được độ chính xác tốt hơn trong trường hợp đó! Hãy tiếp tục và cố gắng!

Về tôi

Tôi là Nithyashree V, sinh viên năm cuối Khoa học máy tính và Kỹ thuật BTech. Tôi thích học những công nghệ tuyệt vời như vậy và áp dụng chúng vào thực tế, đặc biệt là quan sát cách chúng giúp chúng tôi giải quyết các vấn đề thách thức của xã hội. Các lĩnh vực tôi quan tâm bao gồm Trí tuệ nhân tạo, Khoa học dữ liệu và Xử lý ngôn ngữ tự nhiên.

Bạn có thể đọc các bài viết khác của tôi về Analytics Vidhya từ Ở đây.

Bạn có thể tìm thấy tôi trên LinkedIn từ Ở đây.

Phương tiện hiển thị trong bài viết này không thuộc sở hữu của Analytics Vidhya và được sử dụng theo quyết định riêng của Tác giả. 

Nguồn: https://www.analyticsvidhya.com/blog/2022/01/image-classification-using-machine-learning/

tại chỗ_img

Tin tức mới nhất

tại chỗ_img

Trò chuyện trực tiếp với chúng tôi (chat)

Chào bạn! Làm thế nào để tôi giúp bạn?