01/10/2018, 15:55

PCA cho từng ảnh trong Opencv?

Hello
Mình có 1 thắc mắc về pca giảm chiều dữ liệu
Theo mình biết pca có 2 cách tiếp cận
PCA trên từng ảnh, ma trận hiệp phương sai đươc xây dựng dựa vào chuyển vị của ảnh đó, nên eigen vector dùng để giảm chiều dữ liệu cũng được xây dựng trên từng ảnh
PCA trên tập training, ma trận hiệp phương sai và eigen vector được xây dựng từ ma trận gộp các ảnh lại
Mình đã thử pca trên toàn tập nhưng có kết quả khi nhân dạng không cao. Nên mình muốn thử pca trên từng ảnh xem thế nào. Nhưng mình không tìm thấy hướng dẫn nào pca cho từng ảnh cả, toàn thấy cho cả tập. Bạn nào từng dùng pca rồi chỉ mình với

Tiện đây mình muốn hỏi, mình thử nhân dạng loại chó bằng svm với đặc trưng thu được bằng pp hog lại cho kết quả cao hơn đặc trưng thu được bằng pca là sao nhỉ. Mình thầy nhận dạng khuôn mặt bằng pca tuy k phải tốt nhất nhưng cũng khá ổn. Vậy mà nhân dạng loại chó thì cho kết quả thấp. Hog thì cao hơn được chút

Thank you

rogp10 viết 18:01 ngày 01/10/2018

Bạn thử 2DPCA chưa? Không cần trải phẳng gì cả.

H[1…n]: MxN size
avgH = 1/nsum_all(H)
H’[i] = cov(H[i]) = 1/n * T(H[i] - avgH) * (H[i] - avgH)
M[i] = 1/n
sum_all(H’)
trích 20 vector riêng của M[i] V = [v[1] v[2] … v[20]]
H’[i] <- H’[i] * V

A. Vinay et al., BF-ASIFT-2DPCA and ABF-ASIFT-2DPCA for Face Recognition, Procedia Technology 25, 2016.

Thực ra trích xuất từ cov(avgH) là được rồi về toán thì như nhau.

HelloWorld viết 17:56 ngày 01/10/2018

Mình đọc lý thuyết thì pca có 2 cách tiếp cận. Cho từng ảnh và cho cả tập. Mình đã làm ví dụ bằng tay cả 2 cách. Nhưng k biết trong opencv dùng pca 1 ảnh ntn. Trang chủ chỉ hướng dẫn làm cho cả tập. Mà thầy k cho tự code
Mà pca cho từng ảnh cách của bạn khác cách mình đọc được
Khác chỗ này
M[i] = 1/n*sum_all(H’)

rogp10 viết 18:04 ngày 01/10/2018

Vậy là bạn muốn trích từ cov của mỗi hình?

HelloWorld viết 18:09 ngày 01/10/2018

Mình đọc tài liệu thấy vậy. Bạn cho mình xin nguồn cách bạn làm với, có thể có nhiều biến thể khác nhau của pca

HelloWorld viết 18:09 ngày 01/10/2018
  1. H[1…n]: MxN size
  2. avgH = 1/n*sum_all(H)
  3. H’[i] = cov(H[i]) = 1/n * T(H[i] - avgH) * (H[i] - avgH)
  4. M[i] = 1/n*sum_all(H’)
  5. trích 20 vector riêng của M[i] V = [v[1] v[2] … v[20]]
  6. H’[i] <- H’[i] * V

cụ thể là tài liệu mình đọc không có bước 4 mà từ bước 3 tính luôn eigen vector cho cov của các Hi, như vậy mỗi Hi có 1 cov và eigen vector cũng được tìm trên tưng ảnh
và số thành phần chính ở đây chọn cố định là 20 à bạn

rogp10 viết 18:03 ngày 01/10/2018

Chỗ đó có thể thay bằng H’[i] = cov(avgH) rồi trích luôn, do mình dẫn từ bên đó qua nó ghi vậy
Mà mình tìm một buổi rồi, toàn là tổng hợp lại rồi trích thôi, chứ không có trích riêng cho mỗi ảnh.

và số thành phần chính ở đây chọn cố định là 20 à bạn

Nếu ta chọn cỡ 300*240 thì sẽ sinh ra ma trận 240x240, chọn 20 là cũng khá rồi. Nếu trải ra như PCA cơ bản thì sẽ tới 10000 biến (bằng số ảnh trong tập huấn luyện n).

HelloWorld viết 18:07 ngày 01/10/2018

Chỗ đó có thể thay bằng H’[i] = cov(avgH) rồi trích luôn

Sao nhiều cách vậy, mình đếm thấy pca trên từng ảnh có 3 cách rồi :3

Mà mình tìm một buổi rồi, toàn là tổng hợp lại rồi trích thôi, chứ không có trích riêng cho mỗi ảnh.

Thầy hướng dẫn tt mình bảo có thể thực hiện trên mỗi ảnh. Vế lý thuyết thì mình cũng thấy ng ta làm trên từng ảnh nhưng khi dùng opencv thì k thấy :3

rogp10 viết 18:05 ngày 01/10/2018

Sao nhiều cách vậy, mình đếm thấy pca trên từng ảnh có 3 cách rồi :3

Bạn dùng tính chất phương sai thì sẽ thấy tính cov ngay trên avgH hay tính trên mỗi ảnh rồi lấy trung bình là như nhau. Vậy ta tính trên avgH thôi.

HelloWorld viết 18:04 ngày 01/10/2018

Ví dụ mình làm bằng tay cho cách pca tưng ảnh


Ví dụ làm bằng tay cho pca trên tập dữ liệu










Bạn thấy giống cách của bạn không

rogp10 viết 18:07 ngày 01/10/2018

À, PCA trên một ảnh đó là để nén ảnh, chứ đâu dùng để nhận dạng được

HelloWorld viết 18:03 ngày 01/10/2018

Cách 2 mình làm trên là eigenface dùng để nhân dạng face. cách 1 tương tự cách 2 chỉ có là làm trên 1 ảnh thôi
À cách 1 ở trên khác ở bước cuối với cách 2. chuẩn hóa eigen và giảm chiều

rogp10 viết 17:56 ngày 01/10/2018

Vậy bạn so với khuôn mặt mẫu ntn nếu mỗi hình có một bộ eigenvector khác nhau?

Mà mình đang đề cập đến 2D, ảnh chuyển thẳng qua ma trận.

HelloWorld viết 18:10 ngày 01/10/2018

Cách nhận dạng mặt của eigneface là sử dụng chung bộ eigenvector để giảm chiều dữ liệu rồi đánh giá độ tương đồng
Mình nghĩ mình train với svm chẳng hạn thì mình chỉ cần giảm chiều dữ liệu của các ảnh trong tập huấn luyện làm sao cho nó giữ lại k thành phần chính (với số k ở các ảnh là như nhau) mà mỗi ảnh được giảm chiều dữ liệu không cần cùng bộ eigen vector. Vì mục đích giữ lại k lượng thông tin nhất đinh thôi
Mình đã thử pca cho cả tập nhưng kết quả k cao nên thầy bảo thử pca cho tưng ảnh. Vấn đề là pca cho từng ảnh như trên mình nói thấy nhiều cách mà trong opencv k biết pca 1 ảnh kiểu gì, trên trang chủ toàn làm theo cả tập
Thì từ đầu pca mình bàn là 2d mà

HelloWorld viết 18:10 ngày 01/10/2018

Bạn đã dùng pca trong opencv bao giờ chưa. Thay vì chọn số k thành phần tính thì mình sử dụng chỉ số retained varianve đại diện cho lượng thông tin dữ lại (%) mà thấy sau khi thực hiện phép chiếu, cỡ vector cho ra khác nhau ~~

Bài liên quan
0