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

CHAPTER 13 - OpenCV

49 416 3
Tài liệu đã được kiểm tra trùng lặp

Đ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

Tiêu đề Máy Học
Trường học Trường Đại Học
Chuyên ngành Máy Học
Thể loại Tài liệu
Định dạng
Số trang 49
Dung lượng 1,18 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Ta có thể sau đó chạy classifier trên tập huấn luyện để học mô hình dự đoán tuối cho các data feature vector.. Ta có thể đầu tiên gộp các khuôn mặt thành các kiểu mặt rộng, hẹp, dài, ngắ

Trang 1

CHAPTER 13

Máy học

What Is Máy học

Mục đích của máy học (ML)* là chuyển data thành thông tin Sau khi học từ một tập

hợp data, ta muốn một máy có thể trả lời các câu hỏi về data: Điều data khác kà hầu hết tương tự với data này? Đó có phải là xe trong ảnh? Ad gì sẽ user đáp ứng vơi? Thường có một thành phần chi phí, do đó câu hỏi này có thể trở thành: “Của các products mà ta làm hầu hết tiền từ, mà cái sẽ hầu hết user thích mua nếu ta cho họ thấy một quảng cáo cho nó?” Máy học chuyển data thành thông tin bởi trích các luật hay mẫu từ data đó

Huấn luyện và Tập kiểm tra

Máy học làm việc trên data chẳng hạn các giá trị nhiệt độ, giá cổ phiếu, cường độ

màu, và hơn nữa Data thường được xử lý trước thành các feature Ta có thể , ví dụ,

lấy một database của 10,000 ảnh khuôn mặt, chạy một edge detector trên các mặt,

và sau đó thu thập các feature chẳng hạn hướng edge, edge strength, và offset từ tâm mặt của mỗi mặt Ta có thể lấy 500 giá trị như thế cho mỗi hay một feature vector của 500 entry Ta có thể sau đó dùng kỹ thuật máy học để xây dựng vài kiểu

mô hình từ data thu thập này Nếu ta chỉ muốn thấy cách các mặt rơi vào các nhóm

khác nhau (rộng, hẹp, ), thì thuật toán clustering sẽ là lựa chọn thích hợp Nếu ta

muốn học để đoán tuổi của một người từ (say) mẫu các cạnh được dò trên mặt, thì

một thuật toán classifier sẽ là thích hợp Để thỏa mãn mục địch của ta, các thuật

toán máy học phân tihcs các features được thu thập và điều chỉnh weights,

thresholds, và các parameters khác để cực đại hiệu suất theo các mục tiêu này Tiến trình của điều chỉnh parameter này để thỏa mãn một mục tiêu là cái ta hiểu bởi từ

học.

Điều luôn luôn quan trọng là biết cách các method máy học làm việc, và điều này có thể là một nhiệm vụ tinh tế Về truyền thống, cái bẻ data ban đầu thành một tập huấn luyên lớn (chẳng hạn 9,000 khuôn mặt, trong ví dụ của ta) và tập kiểm trả nhỏ hơn (1,000 mặt còn lại) Ta có thể sau đó chạy classifier trên tập huấn luyện để học

mô hình dự đoán tuối cho các data feature vector Khi ta đã xong, ta có thể kiểm tra classifier dự đoán tuối trên các ảnh còn lại trong tập kiểm tra

Tập kiểm tra không được dùng trong huấn luyện, và ta không để classifier “thấy” nhãn tuổi tập kiểm tra Ta chạy classifier trên mỗi trong 1,000 faces trong tập kiểm tra của data và ghi cách tuổi nó dự đoán từ feature vector thỏa mãn tuổi thực Nếu classifier làm tệ, ta có thể cố thêm feature mới vào data hay xem xét kiểu khác của classifier Ta sẽ thấy trong chương này có nhiều kiểu classifiers và nhiều thuật toán huấn luyện chúng

Nếu classifier làm việc tốt, ta bây giờ có một mô hìn tiềm năng vô giá mà ta có thể phân phối trên data trong thế giới thực Chẳng hạn hệ thống này sẽ được dùng để đặthành vi của video game dựa trên tuối Như một người chuẩn bị chơi, mặt của người

đó sẽ xử lý vào 500 feature (edge direction, edge strength, offset từ tâm mặt) Data này sẽ được chuyển đến classifier; tuổi nó trả về sẽ đăt hành xử chơi game phù hợp Sau khi nó đã được triển khai, classifier thấy mặt mà nó chưa thấy trước đây và làm các quyết định tùy theo điều nó đã học trên tập huấn luyện

Cuối cùng, khi phát truênr một hệ phân loại, ta thường dùng một tâoj data hợp lệ Đôikhi, kiểm tra toàn bộ hệ thống lúc kết thúc làm quá lớn cho một bước để lấy Ta thường muốn vặn các parameter cùng cách trước khi trình classifier cho kiểm tra cuối cùng Ta có thể làm điều này bởi bẻ tập data 10,000-mặt ban đầu thành ba phần: một tập huấn luyện 8,000 mặt, một tập hợp lệ 1,000 mặt, và một tập kiểm tra 1,000 mặt Bây giờ, trong khi ta đang chạy qua tập data huấn luyện, ta có thể “lén” kiểm tra trước data hợp lệ để thấy cách ta đang làm Chỉ khi ta được thỏa mãn với hiệu suất trên tập hợp lệ làm ta chạy classifier trên tập kiểm tra cho phán quyết cuối

Trang 2

Supervised và Unsupervised Data

Data đôi khi không có các label; ta có thể chỉ muốn thấy kiểu của các nhóm mà các mặt định cư dựa trên thông tin edge Đôi khi data có các nhãn, chẳng hạn tuổi Mà

điều này có nghĩa rằng data máy học có thể được giám sát (chẳng hạn có thể tận

dụng một “tín hiệu” hay “label” dạy mà đi với các data feature vector) Nếu các data

vector không đánh nhãn thì máy học là không giám sát.

Học giám sát có thể là categorical, chẳng hạn học kết hợp một tên với một mặt, hay data có thể có các nhãn số hay thứ tự, chẳng hạn tuổi Khi data các các tên

(categories) như các nhãn, ta nói ta đang làm classification Khi data là số, ta nói ta đang regression: cố thích hợp một output số cho vài data input categorical hay số.

Việc học được giám sát cũng đến với các hình dạng màu xám: Nó có thể liên quan

ghép cặp một-một của các nhãn với các data vector hay nó có thể gồm học trì hoãn (đôi khi gọi là học tăng cường) Trong học tăng cường, nhãn data (cũng gọi là reward hay punishment) có thể đến lâu sau khi các data vector riêng được giám sát Khi một

con chuột đang chạy xuống mê cung tìm thức ăn, con chuột có thể kinh nghiệm một loạt ngã rẽ trước khi nó cuối cùng tìm thấy thức ăn, reward của nó Reward đó phải somehow bỏ mất sự linh hoạt của nó quay về tất cả các cách nhìn và các hành động

mà chuột mất trước khi tìm thấy thức ăn

Học tăng cường làm việc cùng cách: hệ thống nhận một tín hiệu có trễ (một reward hay một punishment) và cố suy luận một chính sách cho những lần chạy tương lai (một cách của làm các quyết định; chẳng hạn cách đi ở mỗi bước qua mê cung) Học giám sát có thể cũng có đánh nhãn một phần, nơi vài nhãn là mất (điều này cũng

được gọi là học nửa giám sát), hay các nhãn nhiễu, trong đó vài nhãn là sai Hầu hết

thuật toán ML handle chỉ một hay hai các trường hợp vừa mô tả Ví dụ, các thuật toán

ML có thể handle classification nhưng không regression; thuật toán có thể cho phép học nửa giám sát nhưng không học tăng cường; thuật toán có thể cho phép làm viieecj số nhưng không với categorical data; và cứ thế

Ngược lại, thường ta không có các nhãn cho data của ta và thích thấy có hay không data rơi tự nhiên vào các nhóm Các thuật toán cho học không giám sát như thế được

gọi là các thuật toán clustering Trong trường hợp này, mục đích là nhóm các data

vector không gắn nhãn mà là “kín” (theo ít xác định trước hay có lẽ ngay cả nhận thức được học) Ta có thể chỉ muốn thấy các các khuôn mặt được phân phối: Làm chúng hình thành các clump của các khuôn mặt gầy, rộng, dài, hay ngắn? Nếu ta đang nhìn dữ liệu ung thư, làm vài cancer gộp vào các nhóm có các tín hiệu hóa học khác nhau? Data gộp không giám sát cũng thường được dùng để hình thành một feature vector cho classifier giám sát mức cao hơn Ta có thể đầu tiên gộp các khuôn mặt thành các kiểu mặt (rộng, hẹp, dài, ngắn) và sau đó dùng như một input, có lẽ với data khác chẳng hạn tần số phát âm trung bình, để đoán giới tính của một người.Hai nhiệm vụ máy học phổ biến , classification và clustering, chông lên với hai trong hầu hết nhiệm vụ chung trong computer vision: recognition và segmentation Điều này đôi khi được xem như “cái gì” và “ở đâu” Mà là, ta thường muốn computer đặt tên đối tượng trong một ảnh (nhận diện, hay “cái gì”) và cũng để nói nơi đối tượng xuất hiện (phân đoạn, hay “ở đâu”) Vì computer vision làm việc dùng mạnh của máyhọc, OpenCV bao gồm nhiều thuật toán máy học mạnh trong thứ viện ML, đặt trong

…/ opencv/ml directory.

Mã máy học OpenCV là tổng quát Mà là, mặc dù nó hữu dụng cao độ cho các nhiệm vụ vision, chính code là không cụ thể cho vision Cái có thể học, nói, các chuỗi gen dùng các routine thích hợp Dĩ nhiên, khái niệm ở đây hầu hết với nhận diện đối tượng cho trước các feature vector được dẫn từ các ảnh.

Generative và Discriminative Models

Nhiều thuật toán đã được phát minh devised để thực hiện học và thu thập OpenCV

hỗ trợ vài trong hầu hết các tiếp cận thống kê hiện sẵn có hữu dụng cho máy học Các tiếp cận xác xuất cho máy học, chẳng hạn các mạnh Bayesian hay các mô hình graphical, ít được hỗ trợ trong OpenCV, một phần vì chúng là mới hơn và vẫn dưới sự

phát triển tích cực OpenCV hướng đến hỗ trợ các thuật toán rõ ràng, mà cho ta khả

Trang 3

năng của nhãn cho trước data (P(L | D)), hơn là các thuật tốn generative, mà cho phân bố của data cho trước nhãn (P(D | L)) Mặc dù sự phân biệt khơng luơn luơn rõ

ràng, các mơ hình rõ ràng là tốt để sản ra các dự đốn cho trước data trong khi các

mơ hình generative là tốt cho bạn các biểu diễn mạnh của data hay tổng hợp cĩ điều kiện data mới (nghĩ về “hình dung” một con voi; bạn tạo data cho trước một điều kiện

“con voi”)

Thường là dễ hơn để hiểu một mơ hình generative vì nĩ mơ hình (đúng hay sai) nguyên nhân của data Việc học rõ ràng thường đi xuống để làm một quyết định dựa trên vài threshold mà cĩ thể dường như tùy ý Ví dụ, giả sử một miếng vá đường đượcnhận diện trf một cảnh một phần vì màu “đỏ” của nĩ nhỏ hơn 125 Nhưng điều gì cĩ nghĩa rằng red = 126 khơng là đường một cách cụ thể? Các vấn đề như thế cĩ thể là khĩ hiểu Với các mơ hình generative bạn thường làm việc với các phân bố cĩ điều kiện của data cho trước các category, do đĩ bạn cĩ thể phát triển một cảm giác cho cái nĩ cĩ nghĩa là “gần” với phân bố kết quả

OpenCV ML Algorithms

Các thuật tốn máy học kể vào trong OpenCV được cho trong Table 13-1 Tất cả các

thuật tốn ở trong thư viên ML với ngoại lệ của Mahalanobis và K-means, mà ở trong CVCORE, và dị mặt , mà trong CV.

Table 13-1 Các thuật tốn máy học được hỗ trợ trong OpenCV, các tham chiếu ban đầu đến các thuật tốn được cung cấp sau các mơ tả

Algorithm Comment

Mahalanobis Đo khoảng cách mà tính tốn “sự co giãn” của khơng gian data bởi

chia covariance của data Nếu covariance là identity matrix (biến đồng nhất), thì phép đo này là đồng nhất với phép đo khoảng cách Euclidean [Mahalanobis36].

K-means Thuật tốn gộp khơng giám sát mà biểu diễn một phân bố data

dùng các K center, trong đĩ K được chọn bởi user Khác biệt giữa

thuật tốn này và cực đại kỳ vọng là các center khơng là Gaussian

và các cụm kết quả trơng như những bong bĩng sauap, vì các center (về hiệu ứng) hồn thành “sở hữu” các điểm data gần nhất Những vùng cụm này thường được dùng như các sparse histogram bin để biểu diễn data Ngược bởi Steinhaus [Steinhaus56], như dùng bởi Lloyd [Lloyd57].

Normal/Nạve

Bayes classifier Một generative classifier mà trong đĩ các feature được giả sử đượcphân bố Gaussian và độc lập thống kê với nhau, một giả thiết

mạnh mà nhìn chung là khơng đúng Cho nguyên nhân này, nĩ thường được gọi là “nạve Bayes” classifier Tuy nhiên, method này thường làm việc tốt ngạc nhiên Đề cập ban đầu[Maron61;

Minsky61].

Cây quyết định Một discriminative classifier Cây tìm một data feature và một

threshold ở một node hiện tại mà chia tốt nhất data thành các lớp riêng Data được cắt và ta lặp đề quy thủ tục xuống các nhánh phải và trái của cây Dù khơng thường top performer, nĩ thường là điều đầu tiên bạn sẽ cố vì nĩ nhanh và cĩ chức năng

cao[Breiman84].

Boosting Một nhĩm discriminative của các classifier Quyết định

classification tồn bộ được làm từ các quyết định classification trọng số kết hợp của nhĩm các classifier Trong huấn luyện, ta học nhĩm các classifier cùng một lúc Mỗi classifier trong nhĩm là một classifier “yếu” (vừa trên hiệu suất cơ hội) Những classifier yếu này điển hình được bao gồm các cây quyết định biến đơn gọi là các

“gốc cây” Trong huấn luyện, gốc cây quyết định học các quyết định classification của nĩ từ data và cũng học một trọng số cho

“phiếu bầu” của nĩ từ sự chính xác của nĩ trên data Giữa huấn

Trang 4

luyện mỗi classifier từng cái một, các điểm data được trọng số lại sao cho sự tập trung hơn được trả cho các điểm data nới các lỗi được làm Tiến trình này tiếp tục đến khi toàn bộ lỗi trên tập data, đến từ phiếu bầu trọng kết kết hợp của các cây quyết định, rơi bên dưới một threshold đặt Thuật toán này thường hiệu quả khi lượng lớn data huấn luyện sẵn có [Freund97].

Cây ngẫu nhiên Một rừng discriminative của nhiều cây quyết định, mỗi cái được tạo

xuống thành một độ sâu chia cắt lớn hay cực đại Trong khi học, mỗi node của mỗi cây được cho phép chọn các biến cắt chỉ từ một tập con ngẫu nhiên của các data features Điều này giúp đảm bảo mỗi cây trở thành một bộ tạo quyết định độc lập về thống kê

Trong mode chạy, mỗi cây lấy một phiếu bầu không trọng số

Thuật toán này thường rất hiệu quả và có thể cũng thực hiện từ chối bởi trung bình các số output từ mỗi cây [Ho95]; được thực hiện: [Breiman01].

Face detector /

Haar classifier Một ứng dụng dò đối tượng dựa trên dùng thông minh của boosting Phân bổ OpenCV đến với một bộ dò mặt trức được huấn

luyện mà làm việc đặc biệt tốt Bạn có thể huấn luyện thuật toán trên các đối tượng khác với phần mềm cung cấp Nó làm việc tốt cho các đối tượng cứng nhắc và các view đặc trưng [Viola04].

Expectation

maximization (EM) Một thuật toán không giám sát generative mà được dùng cho clustering Nó sẽ fit N multidimensional Gaussians thành data,

trong đó N được chọn bởi user Điều này có thể mà cách hiệu quả

để biểu diễn một phân bố phức tạp hơn với chỉ vài parameter (means và variances) Thường được dùng trong segmentation So với K-means được kê trước đây [Dempster77].

K-nearest

neighbors Discriminative classifier có lẽ đơn giản nhất Data huấn luyên đơn giản được lưu với các nhãn Do đó, một điểm data kiểm tra được

phân loại theo phiếu bầu đa số của K điểm data khác gần nhất (theo nhận thức Euclidean của độ gần) Đây có lẽ là điều đơn giản nhất thing bạn có thể làm Nó thường hiệu quả nhưng chậm và đòi hỏi nhiều memory [Fix51].

Các mạng thần

kinh /

Multilayer

perceptron (MLP)

Một thuật toán discriminative mà (hầu như luôn luôn) có “các đơn

vị ẩn” giữa các node output và input để biểu diễn tốt hơn tín hiệu input Nó có thể là chậm để huấn luyện nhưng rất nhanh khi chạy Vẫn trình hiệu suất đỉnh cho các thứ như nhận diện ký tự

[Werbos74; Rumelhart88].

Support vector

machine (SVM) Một discriminative classifier mà có thể cũng làm sự hồi quy Một function khoảng cách giữa bất kỳ hai điểm data trong không gian

chiều cao hơn được định nghĩa (Chiếu data các các chiều cao hơn làm data giống hơn với có thể phân tách tuyến tính.) Thuật toán học các hyperplane riêng rẽ mà chia tách tối đa các lớp trong các chiều cao hơn Nó hướng đến là dọc theo data tốt nhất có giới hạn, mất đi boosting hay các cây ngẫu nhiên chỉ khi các tập data lớn là sẵn có [Vapnik95].

Dùng Máy học trong Vision

Nhìn chung, tất cả các thuật toán trong Table 13-1 lấy như input một data vector được làm từ nhiều feature, trong đó số các features có thể đánh số theo hàng ngàn Giả sử nhiệm vụ của bạn là nhận diện kiểu nào đó của đối tượng—ví dụ, một người Vấn đề đầu tiên mà bạn sẽ chạm trán là cách thu thập và gắn nhãn dữ liệu huấn luyện mà rơi vào các trường hơpk chủ động (có người trong cảnh) và thụ động (không

Trang 5

người) Bạn sẽ sớm nhận thấy rằng mọi người xuất hiện ở các tỉ lệ khác nhau: ảnh của họ có thể gồm chỉ vài pixel, hay bạn có thể thấy một cái tai mà chiếm toàn bộ screen Ngay cả xấu, mọi người sẽ thường bị giữ: một người bên trong xe; khuôn mặt người phụ nữ; một chân phía sau cây Bạn cần định nghĩa điều bạn thực sự có nghĩa bởi nói một người ở trong cảnh.

Tiếp theo, bạn các vần đề với thu thập data Bạn có phải thu thập nó từ security

camera, vào http://www.flicker.com và thử tìm thấy các nhãn “person”, hay cả hai

(và hơn nữa)? Bạn có phải thu thập thông tin di chuyển? Có phải bạn thu thập thông tin khác, chẳng hạn có hay không một cửa trong cảnh là mở, thời gian, nguyên nhân, nhiệt độ? Một thuật toán mà tìm người trên một bãi biển có thể thất bại trên một ski slope Bạn cần băts các biến đổi trong data: các view khác nhau của người, ánh sáng khác nhau, điều kiên thời tiết, bóng, và hơn nữa Sau khi bạn đã thu thập nhiều data, cách sẽ bạn đánh nhãn chúng? bạn phải đầu tiên quyết định trên điều bạn hiểu là

“đánh nhãn” Cs phải bạn muốn biết nơi người trong cảnh? Có phải các hành động (chạy, đi, crawling, following) là quan trọng? Bạn có thể kết thúc với một triệu ảnh hay hơn Cách sẽ bạn gắn nhãn tất cả? Có nhiều mẹo, chẳng hạn làm trừ backgroundtheo một setting được điều khiển và thu thập các foreground phân đoạn những người

mà đi vào cảnh Bạn có thể dùng dịch vụ data để giúp classification; ví dụ, bạn có thể

trả tiền cho người ta để gắn nhãn các ảnh qua “mechanical turk” của Amazon (http:// www.mturk.com/mturk/welcome) Nếu bạn sắp xếp các thứ là đơn giản, có chi phí hạ

đâu đó quanh một xu mỗi nhãn

Sau khi đánh nhãn data, bạn phải quyết định các feature mà để trích từ các object Lần nữa, bạn phải biết điều bạn là sau đó Nếu mọi người luôn luôn xuất hiện phía bên phải, không có lý do để dùng rotation-invariant features và không lý do để cố quay các object trước Nhìn chung, bạn phải tìm thấy features mà biểu diễn ít bất biến trong các object, chẳng hạn các scale-tolerant histograms của các gradients haycolors hay các SIFT features phổ biến.* Nếu bạn có thông tin cảnh background, bạn

có thể muốn đầu tiên bỏ nó để làm các đối tượng khác nổi lên Bạn sau đó thực hiện phân tích ảnh, mà có thể gồm normalizing ảnh (rescaling, rotation, histogram

equalization, ) và tính nhiều kiểu feature khác Các vector data kết quả được cho cho mỗi label kết hợp với đối tượng, hành động, hay cảnh đó

Một khi data được thu thập và chuyển vào các feature vector, bạn thường muốn bẻ data vào huấn luyện, phê chuẩn, và kiểm tra các tập Nó là một “thực tế tốt nhất” để làm học, phê chuẩn, và kiểm ta bên trong một framework phê chuẩn chéo Mà là,

data được chia thành nto K tập con và bạn chạy nhiều phiên huấn (có thể phê chuẩn)

và kiểm tra, nơi mỗi phiên gồm các tập khác nhau của data đóng vai trò của huân luyện (phê chuẩn) và kiểm tra.† Các kết quả kiểm tra từ những phiên riêng rẽ này sau

đó được trung bình để lấy kết quả thực hiện cuối cùng Phê chuẩn chéo cho bức tranhchính xác hơn về cách classifier sẽ thực hiện khi triển khai hoạt động trên data mới (Ta sẽ có nhiều điều để nói về điều này trong các điều sau.)

Bây giờ data được chuẩn bị, bạn phải chọn classifier Thường việc chọn classifier được

ra lệnh bởi các xem xét về tính toán, data, hay memory Cho vài ứng dụng, chẳng hạn mô hình thích user online, bạn phải huấn luyệ classifier nhanh Trong trường hợp này, lân cận gần nhất, normal Bayes, hay cây quyết định sẽ là lựa chọn tốt Nếu memory là quan tâm, cây quyết định hay mạng thần kinh là hiệu quả về không gian Nếu bạn có thời gian huấn luyệ classifier nhưng nó phải chạy nhanh, mạng thần kinh

là lựa chọn tốt, như Bayes classifiers và support vector machines Nếu bạn có thời gian huấn luyện nhưng cần độ chính xác cao, thì boosting và cây ngẫu nhiên là vừa với nhu cầu của bạn Nếu bạn chỉ muốn một kiểm tra tường minh dễ, có thể hiểu mà các feature của bạn được chọn tốt, thì cây quyết định hay lân cận gần nhất là đánh cược tốt Cho hiệu suất classification “out of the box”, thử boosting hay cây ngẫu nhiên đầu tiên

Không có classifier “tốt nhất” (xem

http://en.wikipedia.org/wiki/No_free_lunch_theorem) Trung bình trên tất cả kiểu có thể

của các phân bố data, tất cả các classifiers thực hiện giống nhau Do đó, ta không thể bảo thuật toán nào trong Table 13-1 là “tốt nhất” Với bất kỳ phân bố data cho trước

Trang 6

hay tập các phân bố data, tuy nhiên, thường có một classifier tốt nhất Do đó, khi đối diện với data thực ý tương tốt là thử nhiều classifier Xem xét mục đích của bạn: Có phải nó là điểm cao, hay có phải nó hiểu data? Có phải bạn tìm tính toán nhanh, các yêu cầu memory nhỏ, hay các biên tin cậy trên các quyết định? Các classifier khác nhau có các thuộc tính khác nhau cùng những chiều này.

Variable Importance

Hai trong các thuật toán trong Table 13-1 cho phép bạn ấn định sự quan trọng của biến.* Cho trước một vector các feature, cách bạn xác định sự quan trọng của các feature này cho độ chính xác classification? Cây quyết định nhị phân làm điều này trực tiếp: chúng được huấn luyện vơi chọn biến mà cắt toots nhất data ở mỗi node Biến của node đinht là biến hầu hết quan trọng; các biến ở mức tiếp theo là hầu hết quan trọng thứ hai, và hơn nữa Cây ngẫu nhiên có thể đo sự quan trọng biến dùng một kỹ thuật được phát triển bởi Leo Breiman;† Kỹ thuật này có thể được dùng với bất cứ classifier, mà hơn nữa nó được thực hiện chỉ ch cây ngẫu nhiên và quyết định trong OpenCV

Một dùng của quan trọng biến là giảm số feature mà classifier phải quan tâm Bắt đầu với nhiều features, bạn huấn luyện classifier và sau đó tìm thấy sự quan rọng củamỗi feature liên quan với các feature khác Bạn có thể sau đó bỏ các feature không quan trọng Loại các feature không quan trong cải thiện tốc độ thực hiện (vì nó loại

xử lý mà nó mất để tính các feature đó) và làm huấn luyện và kiểm tra nhanh hơn Tương tự, nếu bạn không có đủ data, mà thường là trường hợp, sau đó loại các biến không quan trọng có thể tăng chính xác classification; điều này sản ra xử lý nhanh hơn với các kết quả tốt hơn

Thuật tpans quan trọng biến của Breiman chạy như sau

1 Huấn luyện một classifier trên tập huấn luyện

2 Dùng một phê chuẩn hay tập kiểm tra để xác định sự chính xác của classifier

3 Cho mọi điểm data và một feature được chọn, ngẫu nhiễn chọn một giá trị mới mà feature trong số các giá trị feature có trong phần còn lại của tập data (gọi là “lấy mẫu

có thay thế”) Điều này đảm bảo rằng phân bổ của feature đó sẽ duy trì sự giống như trong tập data ban đầu, nhưng bây giờ structure thực hay ý nghĩa của feature đó bị xóa (vì giá trị của nó được chọn ngẫu nhiên từ phần còn lại của data)

4 Huấn luyện classifier trên tập thay đổi của dữ liệu huấn luyện và sau đó đo sự chính xác classification trên kiểm tra thay đổi hay phê chuẩn tập data Nếu ngẫu nhiên một feature tổn thương sự chính xác nhiều, thì feature đó rất quan trọng Nếu ngẫu nhiên một feature không tổn thương sự chính xác nhiều, thì feature đó ít quan trọng và là ứng viên để xóa

5 Phục hồi kiểm tra ban đầu hay tập data phê chuẩn và thử feature tiếp theo đến khi

ta làm xong Kết quả là một trật tự của mỗi feature bởi sự quan trọng của nó

Thủ tục này được dựng trên cây ngẫu nhiên và cây quyết định Do đó, bạn có thể dùng cây ngẫu nhiên hay cây quyết định để quyết định các biến mà bạn sẽ thực sự dùng như các feature; sau đó bạn có thể dùng các vector feature được làm ốm lại để huấn luyện cùng (hay khác) classifier

Chuẩn đoán Máy học Các vấn đề

Để máy học làm việc tốt có thể là nhiều hơn là một nghệ thuật hơn là khoa học Các thuật toán thường “sắp xếp” công việc nhưng không hoàn toàn cũng như bạn cần cầnchúng Đó là nơi nghệ thuật đến; bạn phải hình dung điều sai để chữa nó Mặc dù ta không thể đi vào tất cả chi tiết ở đây, ta sẽ cho một tổng quan của các vấn đề chung bạn có thể chạm trán.* Đầu tiên, vài luật ngón cái: Nhiều data hơn thắng ít data, và các feature tốt hơn thắng các thuật toán tốt hơn Nếu bạn thiết kế các feature tốt—cực đại độc lập của chúng từ một cái khác và tối thiểu cách chúng thay đổi dưới các điều kiện khác nhau—sau đó hầu hết bất kỳ thuật toán sẽ làm việc tốt Vượt qua điều

đó, có hai vấn đề chung:

Bias

Các giả thiết mô hình là quá mạnh cho data, do đó mô hình sẽ không thích hợp tốt

Variance

Trang 7

Thuật toán của bạn nhớ data gồm nhiễu, do đó nó không thể tổng quát hóa Figure

13-1 cho thấy thiết lập cơ bản cho máy học thống kê Công việc của ta là mô hình

function đúng f mà biến đổi các input nằm dưới thành vài output Function này có thể

là vấn đề hồi quy (chẳng hạn dự đoán tuổi người từ mặt của học) hay vấn đề đoán category (chẳng hạn nhận diện một người cho trước các feature mặt) Cho các vấn đềtrong thế giới thực, các hiệu ứng nhiễu và không được xem sét có thể làm ra các output được giám sát khác với các output lý thuyết Ví dụ, trong nhận diện mặt ta có thể học một mô hình của khoảng cách đo được giữa mắt, môi, và mũi để nhận biết một khuôn mặt Nhưng các thay đổi ánh sáng từ một bóng đèn rung rinh ở gần có thểgây ra nhiễn trong đo lường, hay camera lens chất lượng tệ có thể gây ra méo hệ thống trong các đo lường mà không được quan tâm như một phần của mô hình Những ảnh hưởng này sẽ làm cho sự chính xác khó chịu

Figure 13-1 Setup cho máy học thống kê: ta huấn luyện một classifier để thích hợp tập data;

mô hình đúng f hầu hết luôn luôn bị sai lạc bởi nhiễu hay các ảnh hưởng không biết

Figure 13-2 cho thấy fitting dưới và trên của data trong hai panel trên và các tương ứng theo dạng dạng của error với size tập huấn luyện trong hai panel thấp Trên cạnhtrái của Figure 13-2 ta thử huấn luyện một classifier để đoán data trong panel thấp hơn của Figure 13-1 Nếu ta dùng một mô hình mà quá giới hạn—nhận diện ở đây bởiđường dashed mạnh, thẳng—sau đó ta có thể không bao giờ sửa parabola đúng nằm

dưới f nhận diện bởi đường dashed mỏng Do đó, việc sửa với cả dữ liệu huấn luyện

và data kiểm tra sẽ là tệ, ngay cả với nhiều data Trong trường hợp này ta có bias vì

cả data huấn luyện và kiểm tra được dự đoán hệ Trên cạnh phải của Figure 13-2 ta chữa dữ liệu huấn luyện chính xác, nhưng các thủ tục này sản ra một function không nhận thức mà sửa từng tí nhiễu Do đó, it nhớ dữ liệu huấn luyện cũng như nhiễu trong data đó Một lần nữa, việc sửa kết quả để data kiểm tra là nghèo

Error huấn luyện thấp kết hợp với error kiểm tra cao nhận biết một vấn đề biến đổi (overfit) Đôi khi bạn phải cẩn thận mà bạn đang giải quyết vấn đề đúng Nếu error huấn luyện và tập kiểm tra là thấp nhưng thuật toán không thực hiện tốt trong thế giới thực, tập data có thể đã được chọn từ các điều kiện không thực—có lẽ vì những điều kiện này làm thu thập hay mô phỏng data dễ hơn Nếu thuật toán không thể chỉ sản lại data kiểm tra hay tập huấn luyện, sau đó có lẽ thuật toán là cái sai để dùng hay các features mà được trích từ data là không hiệu quả hay “tín hiệu” chỉ không ở trong data bạn thu thập Table 13-2 đề cập vài sửa chữa có thể với các vấn đề ta mô

tả ở đây Dĩ nhiên, đây không là danh sách hoàn chỉnh của các vấn đề hay giải pháp

có thể Hãy nghĩ cẩn thận và thiết kế data mà để thu thập và các features mà tính theo thứ tự cho máy học để làm tốt Nó có thể cũng mất vài ý nghĩ hệ thống để chuẩn đoán các vấn đề máy học

Trang 8

Figure 13-2 Model fitting tệ trong máy học và hiệu quả có nó trên thực hiện huấn luyện và dự đoán kiểm tra, nới true function được vẽ vơiis đường dashed mỏng hơn ở đỉnh: một underfit model cho data (trên trái) sản ra error cao trong huấn luyện và tập kiểm tra (thấp trái), ngược lại một overfit model cho data (trên phải) sản ra error thấp trong dữ liệu huấn luyện nhưng error cao trong data kiểm tra (thấp phải)

Table 13-2 Các vấn đề chạm trán trong máy học và giải pháp có thể để thử; đến với các feature tốt hơn sẽ giúp bất kỳ vấn đề

Vấn đề có thể Giải pháp

Bias • Nhiều features hơn có thể giúp làm fit tốt hơn.

• Dùng một thuật toán mạnh hơn.

Variance • Nhiều dữ liệu huấn luyện hơn có thể giúp làm trơn

learn test or train • Thiết kế lại các features để bắt tốt hơn các bất biếntrong data.

• Thu thập data mới, thích hợp hơn.

• Dùng một thuật toán mạnh hơn.

Cuối cùng, có vài công cụ cơ bản được dùng trong máy học để đo các kết quả Trong học giám sát, một trong các vấn đề hầu hết cơ bản là đơn giản biết độ tốt thuật toán của bạn đã thực hiện: Độ chính xác mà nó đang classifying hay fitting data? Bạn có thể nghĩ: “Dễ thôi, tôi sẽ chạy nó trên data kiểm tra và phê chuẩn và lấy kết quả.” Nhưng cho các vấn đề thực, ta phải lượng nhiễu, các biến động lấy mẫu, và các error

Trang 9

lấy mẫu Đơn giản đặt, kiểm tra hay tập phê chuẩn của bạn vào data không thể ảnh hưởng chính xác phân bố của data Để đến gần với “đoán” hiệu suất thực của

classifier, ta thực hiện kỹ thuật của phê chuẩn chéo và/hoặc kỹ thuật liên quan gần của bootstrapping.*

Trong hầu hết dạng đơn giản của nó, kiểm tra chéo liên quan chia data thành K subset khác nhau của data Bạn huấn luyện trên K – 1 của các subset và kiểm tra

trên subset cuối của data (“validation set”) mà không được huấn luyện trên Bạn làm

điều này K lần, nơi mỗi trong K subset lấy một “lượt” ở validation set, và sau đó trung

bình các kết quả

Bootstrapping là tương tự với kiểm tra chéo, nhưng validation set được chọn ngẫu nhiên từ dữ liệu huấn luyện Các điểm được chọn mà phạm vi được dùng chỉ trong kiểm tra, không huấn luyện Sau đó tiến trình bắt đầu lại từ linh tinh Bạn làm điều

này N lần, trong đó mỗi lúc bạn ngẫu nhiễn chọn một tập với của validation data và

trung bình các kết quả khi kết thúc Lưu ý rằng điều này có nghĩa vài và/hoặc nhiều các điểm data được dùng lại trong các validation set khác nhau, nhưng các kết quả thường được so sánh cao hơn với kiểm tra chéo

Dùng một trong những cái này kỹ thuật có thể sản ra các đo lường chính xác hơn của thực hiện thực sự Sự chính xác được tăng này có thể đến lượt được dùng để chỉnh các parameter của hệ thống học khi bạn thay đổi, huấn luyện, và đo lặp lại Hai cách

vô cùng hữu ích để ấn định, đặc trưng, và chỉnh các classifier đang vẽ receiver operating characteristic (ROC) và điền vào một matrix lộn xộn; xem Figure 13-3

Đường ROC đo lường đáp ứng trên các parameter thực hiện của classifier trên dải đủ các setting của parameter đó Hãy bảo parameter là một threshold Chỉ làm điều này

cụ thể hơn, giả sử ta đang nhận diện những bông hoa vàng trong một ảnh và mà ta

có một threshold về màu vàng như detector của ta

Setting threshold vàng cực kỳ cao sẽ có nghĩa rằng classifier sẽ thất bại để nhận biết bất kỳ hoa màu vàng, sản ra một rate dương sai 0 nhưng chi phí của một rate dương đúng cũng ở 0 (phần thấp trái của đường cong trong Figure 13-3) Mặt khác, nếu threshold vàng được đặt thành 0 thì bất kỳ tín hiệu ở tất cả các count như một nhận biết Điều này có nghĩa rằng tất cả các dương đúng (các hoa vàng) được nhận diện cũng như tất cả dương sai (hoa cam và đỏ); do đó ta có một rate dương sai 100% (phần trên phải của đường cong trong Figure 13-3) Đường cong ROC có thể tốt nhất

sẽ là cái theo sau trục y- lên đến 100% và sau đó cắt ngang trên cạnh phải trên Việc

rơi mà, gần hơn đường cong đến với góc trái trên, tốt hơn Cái có thể tính phần diện tích dưới đường cong ROC với diện tích toàn bộ của ROC vẽ như thông kê tóm tắt của merit: Gần hơn với ratio là với 1 tốt hơn cho classifier

Trang 10

Figure 13-3 Receiver operating curve (ROC) và matrix lộn xộn kết hợp: các trước cho thấy đáp ứng của các classification đúng với các false positive cùng với dải đủ của thay đổi một

parameter thực hiện của classifier; cái sau cho thấy các false positive (các nhận diện sai) và các false negative (các nhận diện nhầm)

Figure 13-3 cũng cho thấy một confusion matrix Đây chỉ là đồ thì của các true và

false positive cùng với các true và false negative Nó là một một cách nhanh khác để ước lượng hiệu quả của một classifier: về lý tưởng ta thấy 100% cùng với đường chéo NW-SE và 0% ở trong Nếu ta có một classifier mà có thể học nhiều hơn một class (chẳng hạn một multilayer perceptron hay random forest classifier có thể học nhiều nhãn class khác nhau một lúc), sau đó confusion matrix tổng quát với nhiều class và bạn chỉ giữ track của class mà với mỗi điểm data gẵn nhãn được gán

Cost of misclassification Một điều ta đã không thảo luận ở dây là cho phí của

classification sai Mà là, nếu classifier của ta được tạo để dò nấm độc (ta sẽ thấy một

ví dụ mà dùng data set như thế ngắn gọn) sau đó ta quyết tâm có nhiều false

negative hơn (nấm ăn được bị nhầm như có độ) cũng như một ta tối thiểu các false positive (nấm độc nhầm như ăn được) Đường cong ROC có thể giúp với điều này; ta

có thể đặt ROC parameter để chọn điểm hoạt động thấp hơn trên đường cong—hướng đến thấp dưới của đồ thị trong Figure 13-3 Cách khác của làm điều này là trọng số các false positive error nhiều hơn các false negative khi tạo đường cong ROC Ví dụ, bạn có thể đặt mỗi false positive error để đếm bao nhiêu mười false negative.* Vì thuật toán máy học OpenCV, chẳng hạn cây quyết định và SVM, có thể điều chỉnh cân bằng này của “hit rate versus false alarm” bởi chỉ định các khả năng trước của chính các class (mà các class được mong để mong nhiều hơn và mà ít) hay bởi chỉ định các trọng số của các mẫu huấn luyện riêng biệt

Mismatched feature variance Một vấn đề chung khác với huấn luyện vài classifier

đến khi feature vector gồm các feature của các thay đổi khác nhau rộng rãi Về cụ thể, nếu một feature được biểu diễn bởi các ký tự ASCII thường sau đó nó range trên chỉ 26 giá trị khác nhau Ngược lại, một feature mà được biểu diễn bởi đếm các tế bào sinh học trên một microscope slide có thể thay đổi trên vài tỉ giá trị Một thuật toán chẳng hạn K-lân cận gần nhất có thể sau đó thấy feature đầu tiên như tương đốikhông đổi (không gì để học) so với feature đếm tế bào Cách để làm đúng vấn đề này

là xử lý trước mỗi biến feature bởi normalizing cho thay đổi của nó Thực tế này là khả chấp nhận được cung cấp các feature không được tương quan với nhau; khi các

Trang 11

features bị tương quan, bạn có thể normalize bởi thay đổi trung bình của chúng hay bởi covariance của chúng Vài thuật toán, chẳng hạn cây quyết định,* không bị ảnh hưởng bất lợi bởi rộng rãi thay đổi khác nhau và do đó nhu cầu cảnh báo này không được lấy Luật ngón cái là nếu thuật toán phụ thuộc theo vài cách trên một đo lường khoảng cách (chẳng hạn các giá trị trọng số ) thì bạn nên normalize cho variance Cái

có thể normalize tất cả các feature ở một lúc và mô tả covariance của chúng bởi dùng khoảng cách Mahalanobis, mà được thảo luận sau trong chương này.† Ta bây giờ chuyển đến thảo luận về các thuật toán máy học hỗ trợ trong OpenCV, hầu hết

mà được thấy trong …/opencv/ml directory Ta bắt đầu với vài trong các class

method mà là thống nhất trên ML sublibrary

Common Routines in the Thư viện ML

Chương này được viết để cho bạn và chạy với các thuật toán máy học Khi bạn cố và trở thành thoải mái các các method khác, bạn sẽ cũng muốn reference

…/opencv/docs/ref/opencvref_ml.htm manual mà cài đặt với OpenCV và/hoặc tài liệu online OpenCV Wiki (http://opencvlibrary.sourceforge.net/) vì phần này của thư viện

đang phát triển tích cực, bạn sẽ muốn biết về các công cụ sẵn có mới nhất và mạnh nhất

Tất cả routines trong thư viện ML‡ được viết như các C++ class và tất cả dẫn từ

CvStatModel class, mà giữ các method mà thống nhất với tất cả các thuật toán Nhữngmethod này được kê trong Table 13-3 Lưu ý rằng trong CvStatModel có hai cách của lưu và nhớ lại model từ disk: save() với write() và load() với read() Cho các mô hình máyhọc, bạn nên dùng save() và load() đơn giản hơn nhiều, mà thực sự wrap các hàm

write() và read() phức tạp hơn vào một interface mà viết và đọc XML và YAML vào và radisk Hơn nữa, để học từ data hai hàm hầu hết quan trọng, predict() và train(), thay đổi bởi thuật toán và sẽ được thảo luận tiếp theo

Table 13-3 Các class method cơ sở cho thư viênj máy học (ML)

save(

const char* filename,

const char* name = 0

)

Lưu mô hình được học trong XML hay YMAL Dùng method này để lưu

load(

const char* filename,

const char* name=0

CvStatModel::~CvStatModel(); Destructor của ML model.

Trang 12

Write/Read support (but dùng save/load

Generic CvFileStorage structured write to disk,

located in the cvcore library (discussed in

chương 3) and called by save().

<misc_huấn luyện_alg_params>

);

Method train() cho các thuật toán máy học có thể giả thiêys các dạng khác nhau theo điều thuật toán có thể làm Tất cả các thuật toán lấy một CvMat matrix pointer như dữliệu huấn luyện Matrix này phải có kiểu 32FC1 (32-bit, floating-point, single-channel)

CvMat cho phép cho các ảnh đa kênh, nhưng các thuật toán máy học lấy của một kênh—mà là, chỉ một matrix hai chiều các số Điển hình matrix này được tổ chức như các hàng của các điểm data, trong đó mỗi “điểm” được biểu diễn như một vector của các feature Do đó các cột chứa các feature riêng cho mỗi data point và các data point được xếp chồng để sản ra matrix huấn luyện một kênh 2D Đọc cẩn thuận chủ đề: data matrix điển hình do đó được hợp thành của (rows, columns) = (data points, features) Tuy nhiên, vài thuật toán có thể handle các matrix chuyển vị trực tiếp Cho những thuật toán như thế bạn có thể dùng tflag parameter để bảo thuật toán điều màcác điểm huấn luyện được tổ chức theo các cột Điều này chỉ là một thuận tiện sao cho bạn sẽ không phải chuyển vị một data matrix lớn Khi thuật toán có thể handle cảdata theo hàng và theo cột, áp dụng flags như sau

tflag = CV_ROW_SAMPLE

Có nghĩa rằng các feature vector được lưu như hàng (mặc định)

tflag = CV_COL_SAMPLE

Có nghĩa rằng các feature vector được lưu như cột

Người đọc có thể hỏi: Cái mà nếu dữ liệu huấn luyện của tôi không là các số point nhưng thay vì các ký tự của alphabet hay các số nguyên biểu diễn các nốt nhạc hay tên cây? Câu trả lời là: Tốt, chỉ chuyển chúng thành các số 32-bit floating-point duy nhất khi bạn điền CvMat Nếu bạn có các ký tự như các feature hay các label, bạn

floating-có thể chuyển ký tự ASCII thành các float khi điền data array Tương tự áp dungj với các số nguyên Khi chuyển đổi là duy nhất, các thứ sẽ làm việc—nhưng nhớ rằng vài routine là nhậy với các thay đổi khác nhau rộng rãi cùng các feature Nhìn chung tốt nhất là normalize thay đổi của các feature như được thảo luận trước đây Với ngoài lệ của các thuật toán dựa trên cây (cây quyết định, cây ngẫu nhiên, và boosting) mà hỗ trợ cả các biến input categorical và thứ tự, tất cả các thuật toán ML OpenCV khác làmviệc với các ordered input Một kỹ thuật phổ biến để làm các thuật toán ordered-inputcũng làm việc với categorical data để biểu diễn chúng trong ghi chú 1-radix; ví dụ, nếu biến input màu có thể có bảy giá trị khác nhau sau đó nó có thể được thay thế bởi bảy biến nhị phân, nơi một và chỉ một trong các biến có thể được đặt thành 1.Các đáp ứng parameter là một trong các categorical label chẳng hạn “độc” hay

“không độc”, như với nhận diện nấm, hay các giá trị đồng quy (các số) chẳng hạn

Trang 13

nhiệt độ cơ thể được lấy với nhiệt kế Các giá trị đáp ứng hay “các label” thường là một vector một chiều của một giá trị trên data point—ngoại trừ cho các mạng thần kinh, mà cĩ thể cĩ một vector các đáp ứng cho mỗi data point Các giá trị đáp ứng là một trong hai kiểu: Cho các đáp ứng categorical, kiểu cĩ thể là nguyên (32SC1); cho các giá trị đồng quy, đáp ứng là 32-bit floating-point (32FC1) Quan sát vài thuật tốn

cĩ thể làm việc chỉ với các vấn đề classification và những cái khác chỉ với đồng quy; nhưng những cái khác cĩ thể handle cả hai Trong trường hợp cuối này, kiểu của biến output được chuyển một trong như một parameter riêng hay như một phần tử cuối của một var_type vector, mà cĩ thể được đặt như sau

như các parameter Những cái này cĩ thể được mặc định để “dùng tất cả data” bởi chuyển các giá trị NULL cho những parameter này, nhưng var_idx cĩ thể được dùng để nhận diện các biến (các feature) của sự quan tâm và sample_idx cĩ thể nhận diện các data point của quan tâm Dùng những cái này, bạn cĩ thể chỉ định các feature mà và các sample point mà trên đĩ huấn luyện Cả hai vector là một trong các vector một kênh nguyên (CV_32SC1)— mà à, các danh sách của các index tính từ khơng—hay cácmask một kênh 8-bit (CV_8UC1) của các biến//mẫu tích cực, trong đĩ một giá trị khác khơng cĩ nghĩa tích cực Parameter sample_idx đặc biệt là hữu ích khi đã đọc vào một

bĩ data và muốn dùng vài trong nĩ để huấn luyện và một ít của nĩ để kiểm tra

khơng cĩ bẻ nĩ thành hai vector khác nhau.

Thêm vào đĩ, vài thuật tốn cĩ thể handle các đo lường thiếu Ví dụ, khi các tác giả đang làm việc với data sản xuất, vài feature đo lường sẽ kết thúc việc thiếu trong thờigian mà những người làm đi nghỉ Đơi khi data thí nghiệm đơn giản bị quên, chẳng hạn quên lấy nhiệt độ bệnh nhân một ngày trong một thí nghiệm y tế Cho những trường hợp như thế, parameter missing_mask, một 8-bit matrix của cùng các chiều như train_data, được dùng đánh dấu các giá trị bọ mất (các phần tử khác khơng của mask) Vài thuật tốn khơng thể handle các giá trị mất, do đĩ các điểm mất nên đượcnội suy bởi user trước khi huấn luyện hay các các record sai nên được bỏ trước Các thuật tốn khác, chẳng hạn cây quyết định và nạve Bayes, handle các giá trị mất theo các cách khác nhau Cây quyết định dùng việc cắt thay thế (gọi là “surrogate splits” bởi Breiman); thuật tốn nạve Bayes suy ra các giá trị

Bình thường, trạng thái model trước được state bị xĩa bởi clear() trước khi chạy thủ tục huấn luyện Tuy nhiên, vài thuật tốn cĩ thể tùy chọn cập nhậ mơ hình học với dữ liệu huấn luyện mới thay vì bắt đầu từ linh tinh

Prediction

Khi dùng method predict(), var_idx parameter chỉ định các feature mà được dùng trong

train() method được nhớ và sau đĩ dùng để trích chỉ các thành phần cần thiết từ inputsample Dạng chung của predict() method như sau:

float CvStatMode::predict(

const CvMat* sample [, <prediction_params>]

) const;

Trang 14

Method này được dùng để đoán đáp ứng cho một input data vector mới Khi dùng một classifier, predict() trả về một class label Cho trường hợp của đồng quy, method này trả về một giá trij số Lưu ý rằng input sample phải có bằng số thành phần như

train_data mà đã được dùng để huấn luyện prediction_params phụ là thuật toán chỉ định

và cho phép các thứ như mất các giá trị feature trong các method dựa trên cây Function suffix const bảo ta rằng dự đoán không ảnh hưởng trạng thái của model, do

đó method này là thread-safe và có thể được chạy song song, mà hữu ích cho các web servers thực hiện nhận cho ảnh cho nhiều client và cho các robots mà cần tăng tốc quét của cảnh

Controlling Huấn luyện Iterations

Mặc dù cấu trúc điều khiển lặp CvTermCriteria đã được thảo luận trong các chương khác,

nó được dùng bởi vài routine máy học Do đó, nhắc bạn về điều mà function là, ta lặp lại nó ở đây

typedef struct CvTermCriteria {

int type; /* CV_TERMCRIT_ITER và/hoặc CV_TERMCRIT_EPS */

int max_iter; /* maximum number of iterations */

double epsilon; /* stop khi error is bên dưới giá trị này */

}

Parameter nguyên max_iter đặt tổng số lần lặp mà thuật toán sẽ thực hiện Epsilon

parameter đặt một error threshold cho tiêu chuẩn dừng; khi error rơi bên dưới level này, routine dừng Cuối cùng, type mà nói hai tiêu chuẩn để dùng, dù bạn có thể thêm tiêu chuẩn cùng nhau và do đó dùng cả (CV_TERMCRIT_ITER | CV_TERMCRIT_EPS) Các giá trị được định nghĩa cho term_crit.type là:

#define CV_TERMCRIT_ITER 1

#define CV_TERMCRIT_NUMBER CV_TERMCRIT_ITER

#define CV_TERMCRIT_EPS 2

Bây giờ hãy chuyển đến mô tả các thuật toán cụ thể mà được thực hiện trong

OpenCV Ta sẽ bắt đầu với metric khoảng cách Mahalanobis thường xuyên được dùng

và sau đó đi vào vài chi tiết trên một thuật toán không giám sát (K-means); cả những

cái này có thể được thấy trong cxcore library Ta sau đó chuyển vào thư viện máy học

thích hợp với Bayes classifier bình thường, sau khi ta thảo luận các thuật toán cây quyết định (cây quyết định, boosting, cây ngẫu nhiên, và Haar cascade) Cho các thuật toán khác ta sẽ cung cấp các mô tả ngắn và các ví dụ sử dụng

Mahalanobis Distance

Khoảng cách Mahalanobis là khoảng cách đo lường mà mô tả covariance hay

“stretch” của không gian mà trong đó data nằm Nếu bạn biết cái mà một Z-score là

sau đó bạn có thể nghĩ về khoảng cách Mahalanobis như một tương tự đa chiều của

Z-score Figure 13-4(a) cho thấy một phần phối ban đầu giữa ba tập data mà làm

thành các tập dọc trông gần nhau Khi ta normalize không gian bởi covariance trong data, ta thấy trong Figure 13-4(b) rằng các data set ngang thực sự gần nhau hơn Kiểu này của các thứ xảy ra thường xuyên; cụ thể, nếu ta đang so sánh chiều cao người theo meter với tuổi theo ngày, ta thấy rất ít thay đổi trong chiều cao liên quan đến biến đổi lớn theo tuổi Bởi normalizing cho biến đổi này ta có thể có được so sánhthực hơn của cac biến Vài classifier chẳng hạn K-nearest neighbors làm việc tệ với các khác biệt lớn trong thay đổi, ngược lại các thuật toán khác (chẳng hạn cây quyết định) không quan tâm nó Ta có thể đã có một lời khuyên cho điều khoảng cách Mahalanobis phải đang quan sáy ở Figure 13-4;* ta phải bằng cách này hay cách khác chia covariance của data trong khi đo khoảng cách Đầu tiên, ta hãy xem lại

nghĩa covariance là Cho trước một list X của N data point, trong đó mỗi data point có thể là chiều (vector length) K với nghĩa là vector μ x (gồm các mean riêng μ1, ,K),

covariance là một matrix K-by-K cho bởi:

Trang 15

const CvArr** vects, int count,

CvArr* cov_mat, CvArr* avg, int flags );

Function này có một ít tinh tế Lưu ý rằng vects là một pointer đến một pointer của

CvArr Điều này ngụ ý ta có vects[0] đến vects[count-1], nhưng nó thực sự phụ thuộc vào các setting flags như được mô tả sau Cơ bản, có hai trường hợp

1 Vects là một 1D vector của các pointer đến các 1D vectors hay các matrix 2D (hai chiêuuf là thích hợp các ảnh) Mà là, mỗi vects[i] có thể trỏ đến một 1D hay a 2D vector, mà xảy ra nếu một trong CV_COV_ROWS hay CV_COV_COLS được đặt Tính toán covariance lỹ kế được tỉ lệ hay chia bởi số các data point được cho bởi count

CV_COVAR_SCALE được đặt

2 Thường có chỉ một input vector, do đó dùng chỉ vects[0] nếu một trong

CV_COVAR_ROWS hay CV_COVAR_COLS được đặt Nếu nếu này được đặt, thì scaling bởi giá trị được cho bởi count được bỏ qua trong đối xử với số các data vector thực chứa trong vects[0] Tất cả các data points sau đó theo:

Figure 13-4 Tính toán Mahalanobis cho phép ta hiểu lại covariance của data như một “kéo dãn” của không gian: (a) khoảng cách dọc giữa các data set thô là nhỏ hơn khoảng cách ngang; (b) sau khi không gian được normalized cho sự thay đổi, khoảng cách ngang giữa các data set là nhỏ hơn khoảng cách dọc

a các hàng của vects[0] nếu CV_COVAR_ROWS được đặt; hay

b các cột của vects[0] nếu thay vào đó CV_COVAR_COLS được đặt Bạn không thể set

cả row và column flags đồng thời (xem các mô tả flag cho chi tiết hơn)

Vects có thể là các kiểu 8UC1, 16UC1, 32FC1, hay 64FC1 Trong bất kỳ trường hợp, vects chứa một list của các K-dimensional data point Để duyệt lại: count là bao nhiêu vector

có trong vects[] cho trường hợp 1 (CV_COVAR_ROWS và CV_COVAR_COLS không đặt); cho trường hợp 2a và 2b (CV_COVAR_ROWS hay CV_COVAR_COLS được đặt), count được bỏ qua và số thực sự của các vector trong vects[0] được dùng thay vào đó K-by-K

covariance matrix kết quả sẽ được trả về trong cov_mat, và nó có thể là kiểu CV_32FC1 hay CV_64FC1 Có hay không vector avg được dùng phụ thuộc vào các setting của flags

(xem liệt kê mà theo sau) Nếu avg được dùng thì nó có cùng liểu như vects và chứa

các trung bình K-feature theo vects Parameter flags có thể có nhiều kết hợp của các setting hình thành bởi cộng các giá trị cùng nhau (cho các ứng dụng phức tạp hơn,

tham khảo …/opencv/docs/ref/opencvref_cxcore.htm documentation) Nhìn chung,

bạn sẽ đặt flags thành một trong những cái sau

CV_COVAR_NORMAL

Làm kiểu quy định của tính toán covariance như trong phương trình được trình bày trước đây Trung bình các kết quả bởi số trong count nếu CV_COVAR_SCALE không đượcđặt; ngược lại, trung bình bởi số các data point trong vects[0]

CV_COVAR_SCALE

Normalize covariance matrix được tính

Trang 16

Dùng avg matrix thay vì tự động tính trung bình mỗi feature Setting này tiết kiệm thời gian tính toán nếu bạn đã có các trung bình (chẳng hạn bởi đã gọi cvAvg() tự bạn); ngược lại, routine sẽ tính những trung bình này cho bạn.*

Thường hầu hết bạn sẽ kết hợp data thành một matrix lớn, hãy nói bởi cac hàng của các data point; sau đó flags sẽ được đặt như flags = CV_COVAR_NORMAL |

CV_COVAR_SCALE |CV_COVAR_ROWS

Ta bây giờ có covariance matrix Cho khoảng cách Mahalanobis, tuy nhiên, ta sẽ cần

chia biến đổi của không gian và do đó sẽ cần inverse covariance matrix Điều này dễ

dàng được làm bởi dùng:

double cvInvert(

const CvArr* src, CvArr* dst, int method = CV_LU );

Trong cvInvert(), src matrix nên là covariance matrix được tính trước và dst nên là matrix cùng size, mà sẽ được điền với nghịch đảo khi return Bạn có thể bỏ qua

method ở value mặc định, CV_LU, nhưng nó tốt hơn là đặt method thành

CV_SVD_SYM.†

Với inverse covariance matrix 1

 trong tay, ta có thể chuyển đến đo khoảng cách Mahalanobis Đo lường này giống với đo khoảng cách Euclidean, mà là căn bậc

hai của tổng casc sai khác bình phương giữa hai vectors x và y, nhưng nó chia với

covariance để không gian:

) ( ) ( ) ,

vectors (vec1 và vec2) và covariance nghịch đảo trong mat, và nó trả về khoảng cách như một double:

double cvMahalanobis(

const CvArr* vec1, const CvArr* vec2, CvArr* mat );

Khoảng cách Mahalanobis là đo lường quan trọng của sự tương tự giữa hai data point khác nhau trong một không gian nhiều chiều, nhưng không là thuật toán hay

classifier clustering tự nó Ta hãy bây giờ chuyển vào, bắt đầu với thuật toán

clustering hầu hết thường xuyên dùng: K-means

K-Means

K-means là một thuật toán clustering thực hiện trong cxcore vì nó được viết lâu trước

khi thư viện ML K-means thử tìm thấy các cluster tự nhiên hay các “clump” trong data User đặt số mong muốn cá cluster và sau đó K-means nhanh chóng tìm một vị trí tốt cho ác tâm cluster này, nơi “tốt” có nghĩa rằng các tâm cluster hướng đến kết thúc ở vị trí ở giữa các clump tự nhiên của data Nó là cái trong hầu hết kỹ thuật clustering được dùng và các các tương tự mạnh cho thuật toán tối đa kỳ vọng cho Gaussian mixture (thực hiện như CvEM() trong Thư viện ML) cũng như vài tương tự với thuật tôans mean-shift thảo luận trong chương 9 (thực hiện như cvMeanShift() trong

CV library) K-means là một thuật toán lặp và, được thực hiện trong OpenCV, cũng được biết như thuật toán của Lloyd * hay (tương đương) “Voronoi iteration”

Thuật toán chạy như sau

1 Lấy như input (a) một data set và (b) số mong muốn của các cluster K (chọn bởi

user)

2 Ngẫu nhiễn gán các vị trí tâm cluster

3 Kết hợp mỗi data point với cluster center gần nhất của nó

4 Cguyeenr các tâm cluster đến trọng tâm các data point của chúng

Trang 17

5 Trở về bước 3 đến khi hội tụ (trọng tâm không di chuyển).

Figure 13-5 mô tả K-means khi chạy; trong trường hợp này, nó mất chỉ hai lần lặp để hội tụ Trong các trường hợp thực thuật toán thường hội tụ nhanh, but nó có thể đôi khi đòi hỏi một lượng lớn các lần lặp

Các vấn đề và Solutions

K-means là thuật toán clustering cực kỳ hiệu quả, nhưng nó có ba vấn đề

1 K-means không đảm bảo tìm thấy lời giải có thể tốt nhất để định vị các tâm

cluster Tuy nhiên, nó đảm bbaor hội tụ với vài vấn đề (chẳng hạn các lần lặp sẽ không tiếp tục không xác định)

2 K-means không bảo bạn bao nhiêu các tâm cluster bạn nên dùng Nếu ta đã chọn hai hay bốn cluster cho vì dụ của Figure 13-5, thì các kết quả sẽ là khác nhau và có lẽkhông trực giác

3 K-means đoán rằng covariance trong không gian một trong không vấn đề hay đã được normalized (so với thảo luận của ta về khoảng cách Mahalanobis)

Mỗi một trong các vấn đề này có một “lời giải”, hay tối thiểu một tiếp cận mà giúp

đỡ Hai cái đầu của những lời giải này phụ thuộc vào “giải thích sự thay đổi của data”.Trong K-means, mỗi cluster center “sở hữu” các data point của nó và ta tính thay đổi của các điểm này

Figure 13-5 K-means khi chạy cho hai lần lặp: (a) các tâm cluster được đặt ngẫu nhiễn và mỗi data point sau đó được gán cho cluster center gần nhất của nó; (b) các tâm cluster được chuyển đến trọng tâm của các điểm của chúng; (c) các điểm lần nữa được gán cho các tâm cluster gần nhất của chúng; (d) các tâm cluster lần nữa được chuyển đến trọng tâm các điểm của chúng

Trang 18

1 Clustering tốt nhất tối thiểu thay đổi không gây ra quá nhiều phức tạp (quá nhiều cluster) Với điều đó trong đầu, các vấn đề được kê có thể được cải thiện như sau Chạy K-means vài lần, với mỗi vị trí khác nhau của các tâm cluster (dễ để làm, vì OpenCV đặt các tâm ngẫu nhiên); sau đó chọn việc chạy mà của các kết quả trưng bày sự thay đổi tối thiểu.

2 Bắt đầu với một cluster và cố tăng số các cluster (lên đến vài giới hạn), mỗi lần thực hiện method của #1 Thường thay đổi tổng sẽ co rất nhanh, sau khi một “elbow”

mà sẽ xuất hiện trong đường cong thay đổi; điều này nhận biết rằng một cluster center mới không giảm ý nghĩa thay đổi toàn bộ Dừng ở elbow đó và giữ các tâm cluster đó

3 Nhân data với covariance matrix nghịch đảo (như được mô tả trong phần

“Mahalanobis Distance”) Ví dụ, nếu các input data vector D được tổ chức như các

hàng với một data point mỗi hàng, thì normalize sự “kéo dãn” trong không gian bởi

tính một data vector mới D*, trong đó * 1/2

Các samplearray là một matrix của các data point đa chiều, mỗi cái mỗi hàng Có một ít tinh tế ở đây trong mỗi phần tử của data point có thể là một trong một vector thực quy định của các số CV_32FC1 hay một điểm nhiều chiều của kiểu CV_32FC2 hay CV_32FC3 hay ngay cả CV_32FC(K).* Parameter cluster_count là đơn giản bao nhiêu clusters bạn muốn, và vector trả về labels chứa cluster index cuối của mỗi data point

Ta chạm trán termcrit trong Phần “Common Routines in the Thư viện ML” và trong

“Controlling Huấn luyện Iterations” subsection

Nó là cơ sở để thấy một ví dụ hoàn chỉnh của K-means trong code (Example 13-1), vì các phần tạo data có thể được dùng để kiểm tra các routine máy học khác

int k, cluster_count = cvRandInt(&rng)%MAX_CLUSTERS + 1;

int i, sample_count = cvRandInt(&rng)%1000 + 1;

CvMat* points = cvCreateMat( sample_count, 1, CV_32FC2 );

CvMat* clusters = cvCreateMat( sample_count, 1, CV_32SC1 );

/* generate random sample from multivariate

Trang 19

int cluster_idx = clusters->data.i[i];

cvCircle( img, cvPointFrom32f(pt), 2,

color_tab[cluster_idx], CV_FILLED );

}

cvReleaseMat( &points );

cvReleaseMat( &clusters );

cvShowImage( “clusters”, img );

int key = cvWaitKey(0);

if( key == 27 ) // ‘ESC’

break;

}

}

Trong mã này ta kể vào highgui.h để dùng một window output interface và cxcore.h

vì nĩ chứa Kmeans2() Trong main(), ta thiết lập màu của các cluster trả về để display, đặt giới hạn trên cho bao nhiêu tâm cluster cĩ thể được chọn ở ngẫu nhiên đến

MAX_CLUSTERS (ở đây 5) trong cluster_count, và cho phép lên đến 1,000 data points, trong đĩ các giá trị ngẫu nhiên cho điều này được giữ trong sample_count Trong for{}

loop ngồi, mà lặp lại đến khi Esc key được nhấn, ta cấp phát một point matrix động

points cho sample_count data points (trong trường hợp này, một cột đơn của 2D data points CV_32FC2) và cấp phát một integer matrix clusters để chứa các cluster label kết quả, 0 đến cluster_count - 1

Ta tiếp theo vào data generation for{} loop mà cĩ thể được dùng lại để kiểm tra các thuật tốn khác Cho mỗi cluster, ta điền vào các points array trong các bĩ liên tiếp của size sample_count/cluster_count Mỗi bĩ được điềm bằng một phân bố bình thường,

CV_RAND_NORMAL, của 2D (CV_32FC2) data points cĩ tâm trên một 2D center được chọn ngẫu nhiên

for{} loop tiếp theo hồn tồn ngẫu nhiên “pack” tổng kết quả các điểm Ta then gọi

cvKMeans2(), mà chạy đến khi di chuyển lớn nhất của cluster center là nhỏ hơn 1 (nhưng khơng cho phép nhiều hơn mười lần lặp)

for{} loop cuối chỉ vẽ các kết quả Điều này được theo sau bởi cấp phát lại các array được cấp phát và hiển thị các kết quả trong ảnh “clusters” Cuối cùng, ta đợi vơ hạn (cvWaitKey(0)) cho phép user một trình chạy khác hay quit qua Esc key

Nạve/Normal Bayes Classifier

Các routine trước từ cxcore Ta sẽ bây giờ bắt đầu thảo luận phần thư viện máy học

(ML) của OpenCV Ta sẽ bắt đầu với supervised classifier đơn giản nhất của OpenCV,

CvNormalBayesClassifier, mà được cùng gọi normal Bayes classifier và nạve Bayes

classifier Nĩ là “nạve” vì nĩ giả thiết rằng tất cả các feature là độc lập nhau ngay cả

dù điều này hiếm là trường hợp (chẳng hạn tìm một con mắt thường ngụ ý rằng một

Trang 20

mắt khác đang dấu gần đĩ) Zhang thảo luận những nguyên nhân cĩ thể cho đơi khi hiệu quả tốt đáng ngạc nhiên của classifier này[Zhang04] Nạve Bayes khơng được dùng cho đồng quy, nhưng nĩ là một classifier hiệu quả mà cĩ thể handle các đa class, khơng chỉ hai Classifier này là trường hợp cĩ thể đơn giản nhất của điều mà bây giờ là lĩnh vực lớn và phát triển được biết như mạng Bayesian, hay “probabilistic graphical models” Các mạng Bayesian là các mơ hình nhân quả; trong Figure 13-6,

ví dụ, các face features trong một image bị gây ra bởi cĩ mặt của một khuơn mặt

Trong sử dụng, biến khuơn mặt được quan tâm như một biến bị ẩn và các face

feature—qua các tác vụ xử lý ảnh trên input image—cấu thành bằng chứng được giám sát cho sự cĩ mặt của một khuơn mặt Ta gọi điều này là một mơ hình

generative vì khuơn mặt về nhân quả tạo các face features Ngược lại, ta cĩ thể bắt

đầu bởi giả thiết face node là tích cực và sau đĩ ngẫu nhiễn lấy mẫu các features mà được tạo xác xuất cho trước khuơn mặt đĩ là tích cực.* Sự tạo trên-xuống này của data với cùng thống kê như mơ hình nhân quả được học (ở đây, khuơn mặt) là khả năng hữu ích mà một mơ hình hồn tồn tách bạch khơng xử lý Ví dụ, cái cĩ thể tạo các khuơn mặt cho hiển thị đồ họa máy tính, hay một robot cĩ thể thực sự “hình dung” điều nĩ sẽ làm tiếp theo bởi tạo các cảnh, các đối tượng, và các tương tác Ngược với Figure 13-6, một mơ hình rõ ràng sẽ cĩ hướng của các mũi tên ngược

Figure 13-6 Mạnh (nạve) Bayesian, trong đĩ các features mức thấp hơn được gây ra bởi sự hiện diện của một một object (khuơn mặt)

Các mạng Bayesian là lĩnh vực sâu và khĩ ban đầu để hiển, nhưng thuật tốn nạve Bayes dẫn từ một ứng dụng đơn giản application của luật Bayes Trong trường hợp

này, xác xuất (ký hiệu p) của một khuơn mặt được cho các features (ký hiệu, trái

sang phải trong Figure 13-6, là LE, RE, N, M, H) là:

),,,,(

)()

|,,,,(),,,,

|

(

H M N RE LE p

face p face H M N RE LE p H M N RE

LE

face

Nhờ đĩ bạn sẽ biết, trong tiếng Anh phương trình này cĩ nghĩa:

Xác xuất sau = (khả năng đúng x xác xuất trước) / bằng chứng

Trong thực tế, ta tính vài bằng chứng và sau đĩ quyết định đối tượng mà gây ra nĩ Vìbằng chứng được tính ở cùng cho các object, ta cĩ thể bỏ term đĩ Nếu ta cĩ ave nhiều mơ hình thì ta cần chỉ tìm thấy một xác xuất cực đại Numerator chính xác là

xác xuất chung của mơ hình với data: p(face, LE, RE, N, M, H) Ta cĩ thể sau đĩ dùng

định nghĩa của xác xuất điều kiện để dẫn xác xuất giao chung:

),,,,

|(),,,

|(

),,

|(),

|()

|()

(

),,,,

,

(

M N RE LE face H p N RE LE face M

p

RE LE face N p LE face RE p face LE p

face

p

H M N RE

Trang 21

Áp dụng giả thiết của ta về độc lập của cac features, các features điều kiện bỏ rơi Do

đĩ, tổng hợp face cho “đối tượng” và các features cụ thể cho “tất cả features”, ta cĩ được phương trình rút gọn:

features all

i

feature p

object p

features all

) (

) ,

(

Để dùng điều này như một classifier tồn bộ, ta học các mơ hình cho các các đối tượng mà ta muốn Trong chế độ chạy ta tính các features và tìm thấy đối tượng mà cực đại phương trình này Ta điển hình sau đĩ kiểm tra để thấy nếu xác xuất để

“thẳng” đối tượng trên một ngưỡng cho trước Nếu là thế, thì ta cơng bố đối tượng được tìm thấy; nếu khơng, ta cơng bố rằng khơng cĩ đối tượng được nhận diện

Nếu (như thường xuyên xảy ra) cĩ chỉ một đối tượng quan tân, thì bạn cĩ thể hỏi: “Xác xuất tơi đang tính là xác xuất liên quan đến cái gì?” Trong các trường hợp như thế, luơn

luơn cĩ một đối tượng thứ hai ngần định— cĩ tên, background—mà mọi thứ mà khơng

đối tượng quan tâm mà ta đang học và nhận diện.

Học là mơ hình là dễ Ta lấy nhiều ảnh của các object; ta sau đĩ tính các features trên các đối tượng này và tính fraction của bao nhiêu lầm mmm feature xuất hiện trên tập huấn luyện cho mỗi đối tượng Trong thực tế, ta khơng cho phép các xác xuất zero vì điều đĩ sẽ ngăn cơ hội của một object hiện cĩ; do đĩ ác xác xuất zero điển hình được đặt thành số rất thấp Nhìn chung, nếu bạn khơng cĩ nhiều data thì các mơ hình đơn giản chẳng hạn nạve Bayes sẽ hướng đến outperform các mơ hình phức tạp hơn, mà sẽ “giả sử” quá nf về data (bias)

Nạve/Normal Bayes Code

Method huấn luyên cho Bayes classifier bình thường là:

bool CvNormalBayesClassifier::train(

const CvMat* _train_data, const CvMat* _responses, const CvMat* _var_idx = 0, const CvMat* _sample_idx = 0, bool update = false

);

Điều này theo sau method chung cho huấn luyện được mơ tả trước đây, nhưng nĩ cho phép chỉ data mà cho mỗi hàng là điểm huấn luyện (chẳng hạn như nếu

tflag=CV_ROW_SAMPLE) Tương tự, input _train_data là một vector một cột CV_32FC1 mà

cĩ thể chỉ là kiểu thứ tự, CV_VAR_ORDERED (các số) output label _responses là một cột vector mà cĩ thể chỉ là kiểu categorical CV_VAR_CATEGORICAL (integers, ngay cả nếu chứa theo một float vector)

parameters _var_idx và _sample_idx là optional; chúng cho phép bạn đánh dấu (tương ứng) các features và data points mà bạn muốn use Hầu như bạn sẽ dùng tất cả features và data và đơn giản chuyển NULL cho những vector này, nhưng _sample_idx

cĩ thể được dùng để chia các tập huấn luyện và kiểm tra, ví dụ Cả các vector là một trong các index tính trên khơng một kênh (CV_32SC1) hay các giá trị mặt nạ 8-bit (CV_8UC1), nơi 0 khơng nghĩa bỏ qua Cuối cùng, update cĩ thể được đặt để cập nhật hồn tồn normal Bayes learning hơn để học một model mới từ linh tính

Sự dự đốn cho method cho CvNormalBayesClassifier tính class hầu hết cĩ thể cho các input vector của nĩ Một hay nhiều input data vectors được lưu như các hàng của các samplematrix Các dự đốn được trả về theo các hàng tương ứng của các vector kết quả Nếu chỉ cĩ một input đơn trong samples, thì dự đốn kết quả được trả về như một giá trị float bởi method dự đốn và các array kết quả cĩ thể được đặt thành NULL(mặc định) Định dạng cho method được đốn là:

float CvNormalBayesClassifier::predict(

const CvMat* samples, CvMat* các kết quả = 0 ) const;

Ta chuyển tiếp đến một thảo luận về các classifier dựa trên cây

Binary Cây quyết định

Trang 22

Ta sẽ đi qua cây quyết định chi tiết, vì chúng hữu ích cao và dùng hầu hết chức năng trong thư viện máy học (và do đó phục vụ tốt nhưmm ví dụ giới thiệu) Cây quyết định nhị phân được phát minh bởi Leo Breiman và đồng sự,* người đặt tên họ là thuật

toán classification and regression tree (CART) Đây là thuật toán cây quyết định mà

OpenCV thực hiện Thực chất của thuật toán là định nghĩa một metric tạp chất liên quan đến data trong mọi node của cây Ví dụ, khi dùng regression để fit một function,

ta có thể dùng tổng các sai khác bậc hai giữa giá trị đúng và giá trị dự đoán Ta muốntối thiểu tổng các sai khác (“tạp chất”) trong mỗi node của cây Cho các categorical label, ta định nghĩa một đo lường mà là tối thiểu khi hầu hết các giá trị trong node là

của cùng class Ba đo lường chung để dùng là entropy, Gini index, và

misclassification (tất cả được mô tả trong phần này) Một khi ta có một metric như

thế, một cây quyết định nhị phân tìm qua feature vector để tìm thấy feature mà kết hợp với threshold mà hầu hết lọc sạch data Bởi quy định, ta bảo rằng các feature trên threshold là “đúng” và mà data do đó được phân loại sẽ phân nhanh bên trái; các data point khác phân nhánh phải Quy trình này sau đó được dùng đệ quy xuống mỗi nhánh của cây đến khi data là để sạch hay đến khi số các data points trong một node đạt một tối thiểu được đặt

Các phương trình cho tạp chất node i(N) được cho tiếp theo Ta phải làm việc với hai

trường hợp, regression và classification

Regression Impurity

Cho regression hay function fitting, phương trình tạp chất node đơn giản là bình

phương của sai khác trong các giá trị giữa giá trị node y và giá trị data x Ta muốn tối

Entropy impurity

)(log)()

i

j

i P P

1

)

Trang 23

Figure 13-7 Các đo lường tạp chất cây quyết định

Cây quyết định có lẽ là kỹ thuật phân loại được dùng hầu hết rộng rãi Điều này do sựđơn giản của chúng trong thực hiện, dễ của hiểu các kết quả, linh hoạt với các kiểu data khác nhau (categorical, numerical, unnormalized và trộn lẫn những cái đó), khả năng handle mất data qua cắt thay thế, và cách tự nhiên của gán sự quan trong cho các data feature bởi thứ tự của cắt Cây quyết định hình thành cơ sở của các thuật toán khác chẳng hạn boosting và cây ngẫu nhiên, mà ta sẽ thảo luận ngay

Cây quyết định Usage

Trong điều sau ta có lẽ mô tả đủ nhiều cho bạn để làm cây quyết định làm việc tốt Tuy nhiên, có nhiều method khác để truy cập các node, thay đổi việc cắt, và hơn nữa.Cho mức đó của chi tiết (mà vài người đọc là thấy cần thiết) bạn nên tham khảo user

manual …/opencv/docs/ref/opencvref_ml.htm, đặc biệt quan tâm đến các class

CvDTree{}, huấn luyện class CvDTreeTrainData{}, và các node CvDTreeNode{} và cắt

CvDTreeSplit{}

Cho một giới thiệu thực tế, ta bắt đầu bởi phân tích một ví dụ cụ thể Trong thư mục

…/opencv/samples/c, có một file mushroom.cpp mà chạy cây quyết định trên

agaricuslepiota data data file Data file này chứa một label “p” hay “e” (biết tắt

poisonous hay edible, tương ứng) theo sau bởi 22 categorical attributes, mỗi cái biểu diễn bằng một ký tự Nhận thấy rằng data file được cho theo “comma separated value” (CSV) format, trong đó các giá trị của các features được chia với nhau bởi dấu

phẩy Trong mushroom.cpp có một một function rắc rối hơn mushroom_read_database()

để đọc vào data file cụ thể này Function này là overspecific và brittle hơn nhưng chủ yếu nó chỉ điều ba array như sau (1) Một floating-point matrix data[][], mà có các chiều rows = số data points nhân columns = số các features (22 trong trường hợp này) và trong đó tất cả các features được chuyển từ các giá trị ký tự categorical thành các số floating-point

(2) Một character matrix missing[][], nơi “true” hay “1” nhận biết một missing value

mà được nhận diện trong data file thô bởi một dấu hỏi và trong đó tất cả các value khác được đặt thành 0

(3) Một floating-point vector responses[], mà chứa cast tương ứng poison “p” hay edible “e” theo các giá trị floating-point Trong hầu hết các trường hợp bạn sẽ viết một chương trình data input chung hơn Ta sẽ bây giờ thảo luận các điểm làm việc

chính trong mushroom.cpp, tất cả mà được gọi trực tiếp hay gián tiếp từ main() trong chương trình

Huấn luyện the tree

Cho huấn luyện cây, ta điền vào tree parameter structure CvDTreeParams{}:

Trang 24

struct CvDTreeParams {

int max_categories; //Until pre-clustering int max_depth; //Maximum levels in a tree int min_sample_count; //Don’t split a node if less int cv_folds; //Prune tree with K fold kiểm tra chéo bool use_surrogates; //Alternate splits for missing data bool use_1se_rule; //Harsher pruning

bool truncate_pruned_tree; //Don’t “remember” pruned branches float regression_accuracy; //One of the “stop splitting” criteria const float* priors; //Weight of each prediction category CvDTreeParams() : max_categories(10), max_depth(INT_MAX), min_sample_count(10), cv_folds(10), use_surrogates(true), use_1se_rule(true), truncate_pruned_tree(true),

regression_accuracy(0.01f), priors(NULL) { ; } CvDTreeParams(

int _max_depth, int _min_sample_count, float _regression_accuracy, bool _use_surrogates, int _max_categories, int _cv_folds, bool _use_1se_rule, bool _truncate_pruned_tree, const float* _priors

max_categories sẽ có các giá trị category của chúng được cluster xuống đến các giá trị

có thể max_categories Theo cách này, cây quyết định sẽ phải kiểm tra nhiều nhiều hơn các mức max_categories ở một lúc Parameter này, khi đặ thành một giá trị thấp, giảm tính toán theo chi phí của sự chính xác

Các parameter khác là hoàn toàn tự giải thích Parametercuối, priors, có thể là quan trọng Nó đặt trong lượng tương đối mà bạn cho cho misclassification Mà là, nếu trọng lượng của category đầu tiên là 1 và trọng lượng của category thứ hai là 10, sau

đó mỗi mistake trong dự đoán category thứ hai là tương đương viwus làm 10 mistake trong dự đoán category đầu tiên Trong code ta có các nấm edible và poisonous, do

đó ta “trừng phạt” mistaking một nấm poisonous cho một edible 10 lần hơn

mistaking một edible mushroom cho cái poisonous

Mẫu của các method cho huấn luyện một cây quyết định bên dưới Có hai method: đầu tiên được dùng để làm việc trực tiếp với cây quyết định; thứ hai là cho các ensembles (được dùng trong boosting) hay forests (được dùng trong cây ngẫu nhiên)

// Work trực tiếp with cây quyết định:

// Method that ensembles of cây quyết định dùng to call individual

// huấn luyện for each tree in the ensemble

bool CvDTree::train(

CvDTreeTrainData* _train_data, const CvMat* _subsample_idx );

Trong train() method, ta có floating-point _train_data[][] matrix Trong matrix đó, nếu

_tflag được đặt thành CV_ROW_SAMPLE thì mỗi row là một data point gồm một vector

Ngày đăng: 15/01/2013, 10:51

HÌNH ẢNH LIÊN QUAN

Hỡnh rừ ràng là tốt để sản ra cỏc dự đoỏn cho trước data trong khi cỏc mụ hỡnh - CHAPTER 13 - OpenCV
nh rừ ràng là tốt để sản ra cỏc dự đoỏn cho trước data trong khi cỏc mụ hỡnh (Trang 3)

TỪ KHÓA LIÊN QUAN

w