Mô hình phân loại hình dạng xử lý ảnh c
Bài toán phân loại (classification) là bài toán mà ta cần phân loại hình ảnh có đang chứa đối tượng hay không. Đặc điểm của bài toán phân loại là hình ảnh của đối tượng cần phân loại phải lớn nhất (chiếm chủ yếu) trong ảnh. Bài toán của ta có nhiều loại đối tượng thì mỗi loại đối tượng được gọi là một lớp đối tượng (class). Bài toán phân loại đối tượng ngườiỞ bài viết trước, ta đã có thể trích đặc trưng hình ảnh bằng cách sử dụng phương pháp HOG. Nói cách khác, với một ảnh đầu ta đã có thể "encode" ảnh đó thành một vector 3780 chiều! Như vậy, với bài toán phân loại người, là một bài toán phân loại nhị phân: chỉ có 2 lớp, lớp người (ta cần tìm) và lớp background (không có người). Để giải quyết bài toán phân loại đối tượng này, ta cần một mô hình học máy (machine learning) tiếp nhận dữ liệu là các vector đặc trưng đã trích xuất và nhãn tương ứng của đặc trưng đó -> đây chính là dữ liệu huấn luyện cho mô hình. Dữ liệu huấn luyện là tri thức cho mô hình để nó có thể đưa ra những dự đoán. Nếu vậy, bạn có đang thắc mắc rằng tính chất của dữ liệu huấn luyện mà ta sẽ dùng để học như thế nào là tốt?! Đây là một vài gợi ý của Minh:
Giới thiệu văn chương lai láng vậy cũng được rồi, mình bắt tay vào huấn luyện một mô hình phân loại đối tượng người nhé :) Tập dữ liệuTrong bài báo HOG, các tác giả đã sử dụng tập dữ liệu huấn luyện là INRIA Person Dataset. Thông tin tập dữ liệu:
Sau khi tải về ta sẽ có file 0. Cấu trúc tổ chức thư mục của INRIA như sau:Các file groundtruth nằm tại:
Nội dung các file này sẽ chứa đường dẫn tương đối đến các file ảnh. Sau khi download và giải nén cho nó nằm yên vị trên máy là xong rồi đó, hehee. Ta tiếp tục qua bước tiếp theo. Huấn luyện mô hình phân loại người dùng đặc trưng HOGLộ trình các bước thực hiện để học tập trên tập dữ liệu phân loại ta làm như sau:
Chém dữ quá rồi, thể nào cũng có người đang nghĩ… "nôn code ra coi", và đây… là code đây :)). Đặt file python này cùng cấp với thư mục 0 nhé. Sau đó chạy lệnh:Cài đặt thêm dependency (OpenCV, numpy là đương nhiên phải có rồi nha, mình không list ra đây):
requirements.txt
Huấn luyện mô hình phân loại người dùng đặc trưng hình ảnh HOG:
hog_train.py
Sau khi đọc xong code thì phải thốt lên rằng… "móa, sao code dài thế" :)). Cái đó đương nhiên rồi nha, M đã cố gắng viết ngắn gọn nhất có thể rồi. Sau đây là note giải thích một số điểm khó hiểu trong code train trên.
=> Do ảnh trong tập dữ liệu này đã quá lâu đời (2005 - cách đây 14 năm!) và mình đã thử OpenCV không đọc được ảnh png của nó. Do đó mình phải dùng PILLOW để đọc và convert sang cấu trúc Numpy để tiếp tục xử lý bằng OpenCV -> làm xử lý ảnh là vậy, bạn phải "thông" từ OpenCV, Numpy cho đến tận Pillow xa xôi luôn :))~
=> Giải thuật random crop M tự viết, ý tưởng như sau: random ngẫu nhiên kích thước patch ảnh, chọn vị trí (x, y) ngẫu nhiên trên ảnh sau đó crop ra và lưu vào danh sách. Tí nữa duyệt trích đặc trưng HOG sau.
=> Ráp thành ma trận siêu to khổng lồ và nhãn tương ứng của nó. Train mô hình học máy SVM dùng thư viện scikit-learn. Tới quá trình huấn luyện SVM nó sẽ mất thời gian hơi lâu nheeeeeeeee. Hãy kiên nhẫn chờ cho đến khi file mô hình được lưu xuống: 2. Có được mô hình này là bạn đã tu thành chính quả rồi đó :D.Dự đoán phân loại ảnh ngườiSau khi có mô hình đã huấn luyện (pretrained model), mình chỉ việc load trọng số của SVM lên và dùng nó dự đoán thôi. Bạn download file woman.jpg (bên dưới) về và để cùng cấp với file hog_test.py nha. Sau đó chạy lệnh 3 hoặc lệnh 4 để nó xử lý ảnh ở đường dẫn chỉ định.Nếu bạn không đủ kiên nhẫn để chờ đợi mô hình được huấn luyện, hãy tải mô hình của M về ở link sau đây: model_hog_person_190901 (139MB) woman.jpg hog_test.py
Chạy lệnh test:
Ố là la, ngạc nhiên chưa. Mô hình nó phân loại ảnh woman.jpg là có NGƯỜI (99%) :">. Như vậy, ta cơ bản đã có thể huấn luyện được một mô hình machine learning cho tác vụ phân loại đối tượng. Từ đây, ta có thể kết hợp nó với kỹ thuật sliding window để giải quyết bài toán phát hiện đối tượng => chỉ ra box đối tượng là ở đâu trên ảnh! Tu-bi-con-tờ-niu. |