OpenCV và các thuật toán học máy

MỤC LỤC

Common Routines in the Thư viện ML

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. Cho các mô hình máy họ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à ra disk.

Huấn luyện

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. 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ác mask 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.

Prediction

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. 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.

Mahalanobis Distance

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. Để 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­Means

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. 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ó.

Các vấn đề và Solutions

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. 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ộ.

K­Means Code

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. 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.

Nạve/Normal Bayes Classifier

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. 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.

Nạve/Normal Bayes Code

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. 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).

Classification Impurity

Đ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

Đ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. 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. 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 );. Điều này giới hạn số các giá trị categorical trước khi cây quyết định sẽ cluster trước các category này sao cho nó sẽ phải kiểm tra không hơn 2max_categories–2 possible value subsets.* Đây không là vấn đề cho các feature ordered hay numerical, trong đó thuật toán chỉ phải tìm thấy một threshold mà ở đó để cắt trái hay phải.

Cây quyết định Results

Cây quyết định đầy đủ cho nấm poisonous (p) hay edible (e): cây này được dựng với độ phức tạp đầy đủ cho 0% error trên tập huấn luyện và do đó có lẽ đủ với các vấn đề variance trên kiểm tra hay data thực (phần tối của chữ nhật biểu diễn phần độc của nấm ở pha đó của categorization). Các matrix confusion cho cây quyết định nấm thường (được tỉa): cây unbiased sản ra hiệu suất toàn cực (panel đỉnh) nhưng đôi khi misclassifies các nấm độc như thường; biased tree không thực nhiệu tốt trên toàn bộ (panel thấp hơn) nhưng không misclassifies nấm độc.

Boosting

Cho classification nó sẽ được lưu ý rằng, như được thực hiện trong OpenCV, boosting là một two-class (yes-or-no) classifier* (không giống các classifier cây quyết định hay cây ngẫu nhiên, mà có thể handle nhiều classes một lúc). Với các method boosting OpenCV khác nhau, LogitBoost và GentleBoost (tham khảo trong “Boosting Code” subsection theo sau) có thể được dùng thực hiện regression thêm vào đó với binary classification.

AdaBoost

Mỗi trong những cái này là các biến đổi của AdaBoost ban đầu, và thường ta tìm thấy rằng các dạng “thực” và “chung” của AdaBoost làm việc tốt nhất. Vì bạn cần chỉ đặt một flag, không có nguyên nhân để cố tất cả các kiểu trên một data set và sau đó chọn boosting method mà làm việc tốt.‡ Ở đây ta sẽ mô tả AdaBoost ban đầu.

Boosting Code

CvBoost class chứa phần tử weak, mà là một CvSeq* pointer đến các weak classifier mà thừa kế từ cây quyết định CvDTree.† Cho LogitBoost và GentleBoost, các cây là các cây regression (các cây mà dự đoán các giá trị floating-point); cây quyết định cho các method khác trả về chỉ các phiếu bầu cho class 0 (nếu positive) hay class 1 (nếu negative). (Lưu ý rằng mask này không thể được dùng trừ phi bạn đã huấn luyện classifier bằng use_surrogates parameter đặt cho. CvDTreeParams::use_surrogates.) Nếu ta muốn lấy lại các đáp ứng của mỗi trong các weak classifier, ta có thể chuyển vài một floating-point CvMat vector, weak_responses, vớii chiều dài bằng với số các weak classifier.

Cây ngẫu nhiên

Mà là, ở bất kỳ node cho trước, huấn luyện xảy ra trên một subset mới của data mà là ngẫu nhiễn được chọn bằng sự thay thế,* và phần còn lại của data—các giá trị này không ngẫu nhiễn được chọn, gọi là “out of bag” (hay OOB) data—được dùng để định lượng hiệu quả của cắt. Như tất cả tree-based method, cây ngẫu nhiên thừa kế nhiều trong các đặc tính tốt của cây: đại diện cắt cho các giá trị thiếu, handling các categorical và numerical value, không cần normalize values, và các method dễ để tìm thất các biến mà là quan trọng để dự đoán.

Random Tree Code

Đo lường xấp xỉ này có thể được dùng để nhận biết các outlier (các điểm này rất không giống bất kỳ cái khác) và cũng để cluster các điểm (nhóm điểm gần cùng nhau). const float* _priors, bool _calc_var_importance, int _nactive_vars,. int max_tree_count, float forest_accuracy, int termcrit_type, );. Một ví dụ của gọi function huấn luyện cho một vấn đề học multiclass được cung cấp trong sample directory mà chuyển cùng OpenCV; xem …/opencv/samples/c/letter_recog.cpp file, trong đó classifier cây ngẫu nhiên được đặt tên forest.

Using Cây ngẫu nhiên

Ta có thể cũng có được một đo lường của xấp xỉ mô hình cây ngẫu nhiên được học của một data point với một cái khác bởi dùng lời gọi. Giá trị này thường là giữa 0 và 1 cho hai data points được vẽ từ một phân phối tương tự với mà của data tập huấn luyện.

Face Detection hay Haar Classifier

Thật ra, vài công ty đã sắp đặt “face” detector trong OpenCV để dò các đối tượng “hầu như khắt khe” (mặt, xe, moto, thân người) bởi huấn luyện các detector mới trên nhiều ngàn ảnh huấn luyện được chọn cho mỗi view của đối tượng. OpenCV thực hiện một version của kỹ thuật face-detection đầu tiên được phát triển bởi Paul Viola và Michael Jones—được biết chung như Viola-Jones detector*—và cái sau được phát triển bởi Rainer Lienhart và Jochen Maydt* để dùng diagonal features (nhiên hơn về sự phân biệt này theo sau).

Supervised Learning và Boosting Theory

Ta lưu ý một lần nữa rằng code huấn luyện (createsamples(), haartraining()) và dò (cvHaarDetectObjects()) làm việc tốt trên bất kỳ đối tượng (không chỉ mặt) mà là textured thích hợp và hầu hết rigid. Như trong AdaBoost truyền thống, mỗi feature vector (data point) cũng được trọng số lại thành thấp hay cao tùy theo có hay không nó được phân loại đùng hay không* trong lần lặp đó của classifier.

Viola­Jones Classifier Theory

Mà là, các view trước của faces làm việc tốt; sau, cạnh, hay trước của xe hơi làm việc tốt; nhưng views cạnh của faces hay views “góc” của cars làm việc ít tốt—chủ yếu vì những views này giới thiệu các thay đổi trong template mà các “blocky” features (xem đoạn tiếp) dùng trong detector này không thể handle tốt. Rejection cascade dùng trong Viola-Jones classifier: mỗi node biểu diễn một multitree boosted classifier ensemble được chỉnh để hiếm khi mất một true face tg khi rejecting một phần có lẽ nhỏ nr các nonface; tuy nhiên, hầu hết tất cả nonfaces đã được rejected bởi node cuối cùng, để lại chỉ các true face.

Code for Detecting Faces

Tất cả mà được nói, nếu bạn quyết thu thập nhiều data tốt, phân đoạn tốt trêb các đối tượng hoàn toàn rigid, thì classifier này có thể vẫn hoàn thành tốt nhất, và sự xây dụng của nó như một rejection cascade làm nó chạy rất nhanh (dù không huấn luyện, tuy nhiên). Điều này theo sau bởi cân bằng histogram qua cvEqualizeHist(), mà làn truyền các giá trị độ sáng —cần thiết vì các features ảnh integral được dựa trên các khác biệt của các vùng chữ nhật và, nếu histogram không được cân bằng, những khác biệt này có thể được khâu bởi ánh sáng hay phơi sáng toàn bộ của ảnh kiểm tra.

Learning New Objects

Đặt scale_factor parameter xác định độ lớn của một bước nhảy có giữa mỗi tỉ lệ; đặt điều này thành các giá trị cao hơn có nghĩa thời gian tính toán thành hơn ở cost của khả năng dò sai nếu việc tỉ lệ mất các face của các size nào đó. Face detection trên một cảnh công viên: vài tilted faces không được dò, và cũng có một false positive (áo shirt gần tâm); cho ảnh 1054-by-851 cho thấy, hơn một triệu vị trí và tỉ lệ được tìm để có được kết quả này khoảng 1.5 giây trên một máy 2 GHz.

Other Các thuật toán máy học

Mà là, nếu ta muốn học các faces trong các online videos, cho các kết quả tốt nhất ta nên lấy các mẫu negative của ta từ các frame có thể só sánh (chẳng hạn các frame khác từ cùng video). Các weak classifiers được chỉ định trong trường hợp này như các “stumps”, mà means chúng có thể có chỉ một split (-nsplits); ta có thể yêu cầu nhiều hơn, và điều này có thể cải thiện các kết quả trong vài trường hợp.

Expectation Maximization

Cho thông tin chi tiết hơn bạn nên tham khảo literature và cũng tham chiếu đến …/opencv/docs/ref/opencvref_ml.htm manual.

Exercises

Draw how a cây quyết định would approximate the true curve (the dashed line) with three splits (here ta seek a regression, not một classification model). Modify the sample code for data generation in Example 13-1—near the top of the outer for{} loop in the K-means section— để sản ra a ngẫu nhiễn generated labeled data set.