Computer Vision

[Image Classification] Logistic Regression

Xin chào, trong bài viết này chúng ta sẽ tìm hiểu về Logistic Regression – một thuật toán Machine Learning được sử dụng để phân loại nội dung của bức ảnh.


HIỂU VỀ LOGISTIC REGRESSION

Giả sử chúng ta có một tập hợp I gồm nhiều bức ảnh chụp chó, mèo và cần phân loại chúng thành hai Categories “0” (tương ứng với “chó”) và “1” (tương ứng với “mèo”), như vậy tập hợp các label sẽ là L = {0, 1}. Tất cả các bức ảnh trong tập hợp I được trích xuất vector đặc trưng và chứa trong tập hợp F.

Restore-LumaPet-Dogs-and-Cats

Figure 1 – Một tập hợp chó và mèo

Bằng cách sử dụng một hàm toán học f để phân loại, mỗi vector đặc trưng có trong tập hợp F chúng ta sẽ tương ứng với label “0” hoặc “1”. Với đặc tính như vậy, hàm f được gọi là Step Function. Chúng ta có thể mô tả hàm f như sau:

Capture

Figure 2 – Step Function

Nhớ lại môn đại số lớp 12, để tìm ra cực trị của một hàm số trong một khoảng giá trị, chúng ta cần tính đạo hàm của hàm số đó. Tuy nhiên điều này không đúng với Step Function vì đạo hàm của nó luôn bằng 0. Đối với Machine Learning, đây thực sự là một vấn đề.

Tất nhiên cái gì cũng có hướng giải quyết. Chúng ta sẽ sử dụng một hàm gần đúng với Step Function được gọi là Sigmoid Function:

s(x) = \frac{1}{1+e^{-x}}

Hình dạng của Sigmoid Function phụ thuộc vào biến x, như Figure 3:

Sigmoid-function.svg

Figure 3 – Đồ thị của Sigmoid Function

Dựa vào đồ thị trên ta thấy rằng:

  • nếu x = 0 thì y = 0,5;
  • nếu x→+∞ thì y→1;
  • nếu x→-∞ thì y→0.

Trở lại các bức ảnh chó mèo, chú chó Pug này là một ví dụ:

pug1

sau khi trích xuất đặc trưng của bức ảnh trên, ta nhận được vector đặc trưng sau:

V = [v_{0}, v_{1}, v_{2}, ... , v_{n}]

Để thực hiện phân loại với Logistic Regression, chúng ta cần nhân mỗi giá trị v_{i} với trọng số w_{i} và tính tổng x:

x = \sum v_{i}w_{i}

Các giá trị w_{i} có thể được đưa về dạng vector như sau:

W = [w_{0}, w_{1}, w_{2}, ... , w_{n}]

Lúc này, giá trị x sẽ bằng tích vô hướng của 2 vector W và V:

x = W.V

Giá trị x này sẽ được đưa vào Sigmoid Function với giới hạn:

0 \leq s(x) \leq 1

Vấn đề bây giờ là phải tìm ra vector W phù hợp bằng cách áp dụng Gradient Descent với giải thuật như sau:

  1. Khởi tạo W = [1, 1, 1, ..., 1];
  2. Tính sai số E = L - s(W.V);
  3. Cập nhật W = W + \alpha.V.E với α là độ lớn của một lần điều chỉnh. Quay lại bước 2 cho đến khi thỏa mãn điều kiện sai số.

Để trực quan hơn chúng ta xem xét Figure 4.

logit_gradient_descent

Figure 4 – Gradient Ascent/Descent

Chúng ta bắt đầu với W_{0}, sau nhiều lần điều chỉnh, W_{4} đã gần đạt giá trị tối ưu được đánh dấu ở trung tâm.


ÁP DỤNG LOGISTIC REGRESSION

Trong phần này chúng ta sẽ áp dụng Logistic Regression để nhận dạng khuôn mặt từ một subset của LFW dataset.

Source code: LogisticRegression.py

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from sklearn import datasets
from sklearn.model_selection import train_test_split
import numpy as np
import imutils
import cv2

print("[INFO] Fetching data...")
dataset = datasets.fetch_lfw_people(min_faces_per_person=70, funneled=True, resize=0.5)
(trainData, testData, trainLabels, testLabels) = train_test_split(dataset.data, dataset.target, test_size=0.25, random_state=42)
print("[INFO] Training model...")
model = LogisticRegression()
model.fit(trainData, trainLabels)
print(classification_report(testLabels, model.predict(testData), target_names=dataset.target_names))

for i in list(map(int, np.random.randint(0, high=testLabels.shape[0], size=10))):
    image = testData[i].reshape((62,47)).astype("uint8")
    name = dataset.target_names[testLabels[i]]
    image = imutils.resize(image, width=image.shape[1]*3, inter=cv2.INTER_CUBIC)

    predict = model.predict(testData[i].reshape(1,-1))[0]
    predict = dataset.target_names[predict]
    print("[PREDICTION] predicted: {}, actual: {}".format(predict, name))
    cv2.imshow("Face", image)
    cv2.waitKey(0)

Output:
result

Giải thích:
– Nếu chú ý thì chúng ta sẽ thấy rằng, các bức ảnh có khuôn mặt của George W Bush được nhận dạng với độ chính xác rất cao, lên đến 94%. Điều này là do số lượng bức ảnh chứa khuôn mặt của George W Bush chiếm đa số trong traing set, chúng ta có thể khẳng định dựa vào cột “support” của phần thống kê kết quả;
– Sự khác biệt về số lượng các bức ảnh của từng Category trong Traning Set sẽ ảnh hưởng đến hiệu năng của bộ Classifier, do đó cần chú ý đến vấn đề này;
– Ở ví dụ này, chúng ta sử dụng cường độ điểm ảnh để phân loại vì các bức ảnh đã được xử lý rất tốt. Trong các ứng dụng thực tế, chúng ta sẽ phải sử dụng đến Feature Vector của từng bức ảnh.


SUMMARY

Như vậy chúng ta đã tìm hiểu về thuật toán Logistic Regression để phân loại hình ảnh. Cảm ơn các bạn đã theo dõi bài viết.

Thân ái và quyết thắng.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s