1. Trang chủ
  2. » Tất cả

Xây dựng mô hình phân lớp cho bài toán nhận dạng ảnh

28 6 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 28
Dung lượng 2,37 MB

Nội dung

ĐẠI HỌC HUẾ KHOA KỸ THUẬT VÀ CÔNG NGHỆ  BÁO CÁO ĐỒ ÁN Học kỳ I, năm học 2022 - 2023 Học phần: Học máy Số phách (Do hội đồng chấm thi ghi) Thừa Thiên Huế, ngày …tháng…năm LỜI CAM ĐOAN Trong thời gian làm tiểu luận, em nhận nhiều giúp đỡ, đóng góp ý kiến bảo nhiệt tình thầy cơ, gia đình bạn bè Em xin gửi lời cảm ơn chân thành đến Thầy Nguyễn Đình Hoa Cương, giáo viên Bộ môn Học Máy – Khoa Kỹ Thuật Cơng Nghệ người tận tình hướng dẫn, bảo em suốt trình làm đồ án Em xin chân thành cảm ơn thầy cô giáo trường Khoa Kỹ Thuật Công Nghệ dạy dỗ cho em kiến thức môn đại cương mơn chun ngành, giúp em có sở lý thuyết vững vàng tạo điều kiện giúp đỡ em suốt trình học tập Cuối cùng, em xin chân thành cảm ơn gia đình bạn bè, tạo điều kiện, quan tâm, giúp đỡ, động viên em suốt trình học tập hồn thành khố luận tốt nghiệp i MỤC LỤC LỜI CAM ĐOAN .i MỤC LỤC .ii DANH MỤC HÌNH ẢNH iv DANH MỤC BẢNG BIỂU v CHƯƠNG I: CƠ SỞ LÝ THUYẾT 1.1 Quy trình xây dựng mơ hình phân lớp 1.1.1 Chuẩn bị liệu 1.1.2 Tiền xử lý liệu ảnh 1.1.3 Xây dựng sở liệu ảnh phục vụ việc huấn luyện kiểm thử mơ hình 1.1.4 Phân chia liệu huấn luyện kiểm thử .2 1.2 Mơ hình phân lớp ảnh 1.2.1 Mơ hình Logistic Regression 1.2.2 Mơ hình k- lân cận 1.3 K-fold cross-validation với mơ hình Hồi quy 1.4 Các số thông dụng 1.4.1 Độ xác (Accuracy score) .7 1.4.2 Ma trận hỗn hợp (Confusion matrix) .8 1.4.3 Precision Recall 1.4.4 Phép đo F1 – F1 measure 1.5 Trực quan hóa kết 1.5.1 Đường precision – recall 1.5.2 Đường Receiver Operating Characteristic (ROC) 10 CHƯƠNG II: XÂY DỰNG MƠ HÌNH PHÂN LỚP CHO BÀI TỐN NHẬN DẠNG ẢNH 12 2.1 Tiền xử lí liệu ảnh 12 2.2 Huấn luyện mơ hình phân lớp ảnh 12 2.3 Đánh giá hiệu mơ hình 12 CHƯƠNG III: THÍ NGHIỆM VÀ KẾT LUẬN .13 TÀI LIỆU THAM KHẢO 14 ii KẾT QUẢ KIỂM TRA ĐẠO VĂN 15 iii DANH MỤC HÌNH ẢNH Hình 1: Quy trình xây dựng mơ hình phân lớp Hình 2: Mơ hình Training set Test set Hình 3: Đồ thị hàm Sigmoid không gian chiều Hình 4: Phân lớp liệu mơ hình k-NN Hình 5: Minh họa quy trình 5-fold cross-validation Hình 6: Ma trận hỗn hợp phép đo liên quan Hình 7: Đường Precision – Recall 10 Hình 8: Đường ROC 11 iv DANH MỤC BẢNG BIỂU v CHƯƠNG I: CƠ SỞ LÝ THUYẾT 1.1 Quy trình xây dựng mơ hình phân lớp Quy trình xây dựng mơ hình phân lớp: Hình 1: Quy trình xây dựng mơ hình phân lớp 1.1.1 Chuẩn bị liệu Tập liệu “Dogs&Cats” tải xuống từ website Microsoft, sử dụng để xây dựng mơ hình học máy dùng cho nhiệm vụ phân lớp Tập liệu nén dạng zip với dung lượng 787MB, sau giải nén ta thư mục “Cat” “Dog” bao gồm 25000 hình ảnh chó mèo Ta phát biểu tổng quát sở liệu ảnh tập m số lượng tập tin ảnh, thông số ảnh màu với chiều cao ảnh, chiều rộng ảnh số kênh màu ảnh 1.1.2 Tiền xử lý liệu ảnh Xét ảnh màu có số kênh , kích thước chiều cao , chiều rộng biểu diễn khơng gian ảnh màu Như vậy, sở liệu ảnh có ảnh biểu diễn Từ ảnh màu vẽ ảnh xám biểu diễn ánh xạ (1) Như vậy, trình chuyển sở liệu ảnh màu thành sở liệu ảnh xám biểu diễn ánh xạ (2) Trang Do ảnh có kích thước khác nên cần điều chỉnh chung kích thước để dễ xử lý Trong khn khổ đồ án này, chúng tơi chọ kích thước chuẩn (3) (4) (5) (6) 1.1.3 Xây dựng sở liệu ảnh phục vụ việc huấn luyện kiểm thử mơ hình Một sở liệu ảnh phục vụ mơ hình phân lớp phát biểu (7) Với:  X sở liệu ảnh xám tiền xử lí :  y vector chứa nhãn lớp tương ứng ảnh 1.1.4 Phân chia liệu huấn luyện kiểm thử Trong machine learning, cần kiểm thử để dự đoán khả hoạt động hiệu mơ hình thực tế Có nhiều cách để kiểm thử đánh giá hiệu mơ hình Cách đơn giản đưa dùng thử thời gian Cách tốn thời gian, tốn công để thiết kế kịch kiểm thử phù hợp, nhiều trường hợp khó sử dụng Cách thứ hai hợp lý sử dụng tập liệu kiểm thử (testing set) độc lập tập liệu huấn luyện (training set) để đánh giá vầ ước lượng hiệu mơ hình Thơng thường training set testing set tách từ liệu quan sát cung cấp (chẳng hạn lấy 80% liệu quan sát cung cấp để huấn luyện 20% liệu quan sát lại không liên quan đến 80% trước để đánh giá) Trang Tập huấn luyện (training set) tập liệu sử dụng để huấn luyện mơ hình Các thuật tốn học máy học mơ hình từ tập huấn luyện Việc học khác tùy thuộc vào thuật tốn mơ hình sử dụng Ví dụ, sử dụng mơt hình Hồi quy tuyến tính (Linear Regression), điểm tập huấn luyện sử dụng để tìm hàm số hay đường phù hợp mô tả quan hệ đầu vào đầu tập liệu huấn luyện cách sử dụng số phương pháp tối ưu hóa thuật toán tối ưu gần gradient descent hay stochastic gradient descent Để biết thuật tốn hay mơ hình có tốt hay khơng sau huấn luyện, mơ hình cần đánh giá hiệu thơng qua liệu kiểm thử (testing set) Bộ liệu sử dụng để tính độ xác sai số mơ hình dự đốn huấn luyện Chúng ta biết nhãn thực điểm tập hợp liệu kiểm thử này, tạm thời giả vờ đưa giá trị đầu vào tập vào mơ hình dự đoán để nhận kết dự đoán đầu Sau nhìn vào nhãn thực so sánh với kết dự đốn đầu vào tương ứng xem liệu mơ hình có dự đốn hay khơng Việc tính tổng trung bình tồn lỗi tính tốn lỗi dự đốn tập kiểm thử Hình 2: Mơ hình Training set Test set (Nguồn: tek4.vn) Trang Hình 5: Minh họa quy trình 5-fold cross-validation (Nguồn: scikit-learn.org) 1.4 Các số thơng dụng 1.4.1 Độ xác (Accuracy score) Độ xác thước đo để đánh giá mô hình phân loại Một cách khơng thức, độ xác phần dự đốn mà mơ hình chúng tơi Chính thức, độ xác có định nghĩa sau: (13) Đối với phân loại nhị phân, độ xác tính theo giá trị dương âm sau: (14) Trang Trong TP = Khẳng định Đúng, TN = Phủ định Đúng, FP = Khẳng định Sai FN = Phủ định Sai 1.4.2 Ma trận hỗn hợp (Confusion matrix) Đối với mô hình phân lớp, số thuật ngữ chuyên ngành sau cần nắm bắt kỹ:  true positives, true negatives, false positives, false negatives;  Thuật ngữ positive negative biểu đạt kết dự đốn mơ hình phân lớp;  Thuật ngữ true false biểu đạt kết dự đốn mơ hình phân lớp hay sai;  Như vậy, true positive hiểu mơ hình dự đốn positive đúng; tương tự bạn giải nghĩa thuật ngữ true negatives, false positives, false negatives lại Hình 6: Ma trận hỗn hợp phép đo liên quan (Nguồn: Wikipedia) 1.4.3 Precision Recall Công thức tính Precision Recall dựa vào bảng ma trận hỗn hợp sau: (15) Trang (16) Chỉ số Precision biểu đạt khả mà mơ hình phân lớp khơng gán nhãn positive cho mẫu có nhãn negative Trong khi, số Recall biểu đạt khả tìm tất mẫu positive mơ hình phân lớp 1.4.4 Phép đo F1 – F1 measure Trong phân tích thống kê phân loại nhị phân, số F (F-score) thước đo F (F-measure) thước đo độ xác kiểm tra Nó tính tốn từ độ xác khả thu hồi xét nghiệm, độ xác số kết khẳng định chia cho số lượng tất kết khẳng định, bao gồm kết khơng xác định xác khả thu hồi số kết khẳng định chia cho số lượng tất mẫu lẽ phải xác định khẳng định Độ xác cịn gọi giá trị tiên đoán dương khả thu hồi gọi độ nhạy phân loại nhị phân chẩn đoán Chỉ số F1 tính cơng thức: (17) Giá trị số F1: ≤ F1 ≤ (0 trường hợp xấu nhất; trường hợp tốt nhất) 1.5 Trực quan hóa kết 1.5.1 Đường precision – recall Đường Precision – Recall mức độ ‘trao đổi – tradeoff’ cặp giá trị Precision Recall mức ngưỡng khác Phần diện tích đường cong lớn số Precision Recall cao (ám giá trị false positive false negative tương ứng thấp) Đường Precision – Recall thường dùng tập liệu cân nhãn lớp Mục tiêu có khả thu hồi cao độ xác cao Tương tự, có đánh đổi việc có độ xác cao khả thu hồi cao: ngưỡng δ thấp, khả thu hồi cao độ xác thấp Trang Hình 7: Đường Precision – Recall (Nguồn: towardsdatascience) 1.5.2 Đường Receiver Operating Characteristic (ROC) Đường cong đặc tính vận hành máy thu, đường cong ROC, biểu đồ đồ họa minh họa khả chẩn đoán hệ thống phân loại nhị phân ngưỡng phân biệt thay đổi Phương pháp ban đầu phát triển cho người vận hành máy thu radar quân năm 1941, dẫn đến tên Đường ROC thường áp dụng tập liệu có số lượng nhãn lớp cân Trang 10 Hình 8: Đường ROC (Nguồn: towardsdatascience) Trang 11 CHƯƠNG II: XÂY DỰNG MƠ HÌNH PHÂN LỚP CHO BÀI TOÁN NHẬN DẠNG ẢNH 2.1 Tiền xử lí liệu ảnh 2.2 Huấn luyện mơ hình phân lớp ảnh 2.2.1 Mơ hình Logistic Regression Dựa vào phân tích tốn học bước sử dụng mơ hình Logistic Regression nêu mục 1.2.1, xây dựng hàm phân tích mơ hình Logistic Regression sau: Bảng 1: Thuật tốn mơ hình Logistic Regression Đầu vào Dữ liệu dạng nhị phân Đầu Xác suất để liệu đầu vào rơi vào nhãn hay nhãn Khởi tạo mơ hình Huấn luyện mơ hình với tập liệu logistic_classifier = LogisticRegressionCV(cv=5, solver="sag", max_iter=2000) logistic_classifier.fit(X_train, y_train) X_train, y_train Thuật toán Hàm tổng quát def logistic_regression_cv(X_train, y_train): logistic_classifier = LogisticRegressionCV(cv=5, solver="sag", max_iter=2000) logistic_classifier.fit(X_train, y_train) return logistic_classifier 2.3 Đánh giá hiệu mơ hình Trang 12 CHƯƠNG III: THÍ NGHIỆM VÀ KẾT LUẬN Đầu tiên, ta cần xây dựng hàm để kiểm tra file lỗi không định dạng Để xây dựng hàm này, ta dùng thư viện PIL gọi hàm open class Image CODE # Hàm kiểm t from PIL import Image ảnh lỗi def check_corrupted_image(img_file) : try: with Image.open(img_file) a s img: img.verify() img_new = io.imread(os path.join(img_file)) return False except Exception as e: print(e) return True GHI CHÚ Trong tệp liệu thường có nhiều file bị lỗi Nên ta cần xây dựng hàm check_corrupte d_image()nhằm kiểm tra ảnh bị lỗi hay không định dạng jpg có tập liệu # Hàm kiểm def count_unique_labels(y): tra cân bầng unique, counts = np.unique(y, r nhãn lớp eturn_couts = True) result = dict(zip(unique, count s)) return result # Hàm chuyển def read_img_data(path,label, size) ảnh màu thàn : h vector 102 labels = [] img_data = [] # Đọc ảnh -> # xác định đường dẫn biến xám, resize ảnh ,làm phẳng files = os.listdir(path) # đọc tất file path for img_file in files: if not(check_corrupted_imag e(os.path.join(path,img_file))): img = io.imread(os.path join(path, img_file), as_gray=True Trang 13 - Sử dụng hàm resize() để thay đổi kích thước ảnh, đưa tất ảnh chung kích thước - Hàm flatten() dùng để lát phẳng layer (làm phẳng ảnh) VD: shape : 20x20 qua layer 400x1 ) # chuyển ảnh sang ảnh xám img = resize(img, size) # resize để đưa tất ảnh c kích thước img_vector = img.flatte n() # Làm phẳng ảnh labels.append(labels) img_data.append(img_vec tor) labels = np.array(labels) return labels, img_data # Xây dựng C def build_imd_data(): SDL ảnh cat_path = '/content/drive/MyDr ive/Classroom/Học máy Phần co sV/ final_test1/PetImages/Cat' dog_path = '/content/drive/MyDr ive/Classroom/Học máy Phần co sV/ final_test1/PetImages/Dog' images, labels = read_img_data( cat_path, 'cat', (32, 32)) img_dog, label_dog = read_img_d ata(dog_path, 'dog', (32, 32)) images.extend(img_dog) labels.extend(label_dog) X = np.array(images) y = LabelBinarizer().fit_transf orm(labels) return X, y import pickle pickle_out = open("X.pickle","wb") pickle.dump(X, pickle_out) pickle_out.close() pickle_out = open("y.pickle","wb") pickle.dump(y, pickle_out) pickle_out.close() Trang 14 - Xây dựng hàm sở liệu ảnh qua hàm read_img_data( - Dùng hàm LabelBinarizer ()để mã hóa tập nhãn lớp - Sử dụng thư viện pickle để lưu lại liệu X y sau tiền xử lí liệu Để sử dụng liệu lưu vào pickle nhập lệnh: pickle_in = open("X.pickle", "rb") X = pickle.load(pick le_in) pickle_in = open("y.pickle", "rb") y = pickle.load(pick le_in) Hàm chia tra def featureScalingSplit(X, y): in-test X_train, X_test, y_train, y_test chuẩn hó = a train_test_split(X, y, shuffle=T li rue, ệu test_size=0.3, random_state=15) sc_X = StandardScaler() X_train = sc_X.fit_transform(X_ train) X_test = sc_X.transform(X_test) return X_train, X_test, y_train , y_test Kết bước tiền xử lí liệu ta phát file lỗi:     'PetImages/Cat/666.jpg', 'PetImages/Cat/Thumbs.db', 'PetImages/Dog/Thumbs.db', 'PetImages/Dog/11702.jpg' Và tập liệu X, y để vào huấn luyện mơ hình 2.2 Huấn luyện mơ hình Khi liệu xử lí, ta bắt đầu bước vào huấn luyện mơ hình # Hàm xác định số lượng kfold xác định def checkkFold(y_train): unique, counts = np.unique(y_tr ain, return_counts=True) result = dict(zip(unique, count s)) Trang 15 - Thực chia traintest với tỉ lệ 70%30% - shuffle=True để đảm bảo tính ngẫu nhiên liệu tùy thuộc print("Số lượng k-fold xác o định") số lượng print(result) y_train return result # Mơ hình def logistic_regression_cv(X_train, Logistic X_test, y_train): RegressionCV lgt = LogisticRegression(solver= 'liblinear', max_iter=1500, multi_class='auto ') lgt.fit(X_train, y_train) y_pred = lgt.predict(X_test) print('Kết huấn luyên 10fold cv mơ hình LogisticRegression: ') scores = cross_val_score(lgt, X_ train, y_train, cv=10, scoring='accuracy') print(scores) return lgt, scores, y_pred # Mơ hình k- def kNN_grid_search_cv(X_train, y_t NN rain): from math import sqrt m = y_train.shape[0] k_max = int(sqrt(m)/2) k_values = np.arange(start = 1, s top = k_max + 1, dtype = int) params = {'n_neighbors': k_values } kNN = KNeighborsClassifier() kNN_grid = GridSearchCV(kNN, para ms, cv=3) kNN_grid.fit(X_train, y_train) return kNN_grid 2.3 Đánh giá hiệu mơ hình qua độ đo Dựa vào lý thuyết mục 1.2 Đánh giá hiệu mơ hình ta xây dựng hàm evaluate_Model() nhăm đánh giá hiệu mơ hình phân lớp ảnh qua độ đo accuracy, precision, recall f1 Trang 16 # Hàm đánh giá hiệu def evaluate_Model(y_test, y_pred): acc_score = round(accuracy_score(y_test, y_pred), 3) print("Accuracy: {}%".format(round(100 * accuracy_score(y_test, y_pred), 3))) precision_sc = round(precision_score(y_test, y_pred, average='weighted'), 5) print("\nPrecision score: {} %".format(100*precision_sc)) print('Kết dự đoán precision_score:\n' , precision_score(y_test, y_pred, average=None)) recall_cs = round(recall_score(y_test , y_pred, average='weighted'), 3) print("\nRecall score: {}%".format(100 * recall_cs)) print('Kết dự đoán recall_score:\n' , recall_score(y_test, y_pred, average=None)) f1_sc = round(f1_score(y_test, y_pred , average='weighted'), 5) print("\nF1 score: {}%".format(100 * f1_sc)) print('Kết dự đoán f1_score:\n' , f1_score(y_test, y_pred, average=None)) return acc_score, precision_sc, recall_cs, f1_sc 2.4 Trực quan hóa kết dự đoán # Vẽ đường Precison Recall def pre_recal(X_test, y_test): kNN_probs = kNN_cv.predict_proba(X_test)[:, 1] logistic_probs = logistic_ regression_cv.predict_proba(X_test)[:, 1] kNN_pre, kNN_rec, _ = precision_ recall_curve(y_test, kNN_probs) logistic_pre, logistic_rec, _ = precision_ recall_curve(y_test, logistic_probs) no_model = len(y_test[y_test == 1]) / len(y_test ) plt.plot([0, 1], [no_model, no_model], linestyle Trang 17 =' ', label='No model') plt.plot(kNN_rec, kNN_pre, marker='.', label='kN N') plt.plot(logistic_rec, logistic_pre, marker='o', label='Logistic Regression ') plt.xlabel('Recall') plt.ylabel('Precision') plt.legend() plt.show() # Hàm vẽ confusion matrix def plot_confusion_matrix(cm, classes, normalize=False, title= 'Confusion matrix', cmap=plt.cm.Blues): if normalize: cm = cm.astype('float')/cm.sum(axis=1) [:, np.newaxis] print("Normalized confusion matrix") else: print('Confusion matrix, without normalization') print(cm) plt.imshow(cm, interpolation='nearest', cmap=cma p) plt.title(title) plt.colorbar() tick_marks = np.arange(len(classes)) plt.xticks(tick_marks, classes, rotation=45) plt.yticks(tick_marks, classes) fmt = '.2f' if normalize else 'd' thresh = cm.max() / for i, j in itertools.product( range(cm.shape[0]), range(cm.shape[1])): plt.text(j, i, format(cm[i, j], fmt), horizontalalignment="center", color="white" if cm[i, j] > thresh else "black") plt.ylabel('True label') plt.xlabel('Predicted label') plt.show() Trang 18 Trang 19 TÀI LIỆU THAM KHẢO Trang 20 KẾT QUẢ KIỂM TRA ĐẠO VĂN Trang 21

Ngày đăng: 29/03/2023, 15:43

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w