Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 11
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Thuật toán PCA trong vấn đề nhận dạng ảnh

    Tớ vừa làm bài tập lớn môn xử lý ảnh,dùng PCA để nhận dạng ảnh,ảnh ở đây chỉ là các chữ số từ 0-9,các bạn muốn dùng để nhận dạng khuôn mặt hay chữ cái cũng được.

    Lý thuyết của PCA :

    Mỗi ảnh có kích thước là M*N
    Giả sử tập huấn luyện có P ảnh , khi đó ta sẽ có P vector : T1 , T2 , … , TP .
    Tìm vecto ảnh trung bình m

    So sánh các ảnh khác so với giá trị trung bình m
    A_i= Ti- m , i=1…P
    Đặc trưng của các hình chính là các vecto riêng và các trị riêng.Vì mỗi ma trận ảnh có 1 phương trình đặc trưng,nhận pi làm trị riêng.Lúc đó sẽ tồn tại vecto riêng u khác 0 sao cho
    A*u = A*pi.
    Ta cần tìm ra các vecto riêng của ma trận từ các trị riêng tìm được.
    Các vecto riêng và trị riêng từ ma trận A * A^T
    Ta thấy ma trận A có kích thước M*N × P , còn ma trận A*A^T có kích thước M*N×M*N
    Đặt L=A^T * A , tìm V là tập hợp các vector riêng của L , D là tập hợp các trị riêng tương ứng
    Ta chỉ cần lấy 1 lượng đặc trưng nhất định.Tức là chỉ cần lấy n vecto riêng là đủ để có thể lấy đặc trưng cho không gian chữ số.
    E là ma trận M*N×n , mỗi cột là một vector riêng .
    Từ tập các vecto riêng ta xây dựng 1 cơ sở trực chuẩn cho không gian chứa chữ số.Các tập vecto trực chuẩn này sẽ mô tả 1 cách tốt nhất sự phân bố các vecto trong không gian chữ số.Từ đó nhận ra đặc trưng riêng biệt của mỗi chữ số.

    Bước so sánh :
    Chiếu hình cần tìm lên trên không gian chữ số.Để làm được điều này cần có cơ sở trực chuẩn đã lấy được từ trên:
    Lý thuyết :
    Cho V là một không gian có tích vô hướng hữu hạn chiều và W là một không gian con của V . Giả sử W có một cơ sở trực chuần là {u_1, … , u_Q} .

    TIếp tục chiếu ảnh kiểm tra lên từng ảnh trong tập huấn luyện
    Khoảng cách gần nhất giữa 2 kết quả trên chính là 2 ảnh giống nhau nhất

    Xây dựng bằng mã giả :

    Mã:
    while(!end_of_path) // vào thư mục traning    A = openfile(file_current,r) // lấy tên file hiện tại    file_next(); // trỏ vào file tiếp        // Bien tat ca anh kich thuoc MxN thanh vector cot M*Nx1     ANH[m,n] = chuyen_anh_thanh_matran(A); // chuyển từ ảnh có kích thước mxn thành ma trận mxn    ANH[m,n] = chuyen_thanh_anh_gray_scarle(); // chuyển thành ảnh trắng đen    T[M,N,P] = T[size_witch,size_height,A];      //T là một ma trận có kích thước M*NxP chứa tất cả ảnh trong csdl , mỗi ảnh là     // một vecto cột.        // tìm m là giá trị trung bình của các ảnh    // Sau đó lấy từng bức ảnh trong T trừ đi bức ảnh trung bình ta được ma trận A có    // kich thuoc M*NxP         m = trungbinh(T,2);     soanh = size(T,2);            // tính độ lệch của mỗi hình huấn luyện với ảnh trung bình    A = [];      for i = 1 : soanh        temp = (T(size(A),i)) - m         A[M*N*P] = temp;    end        // Ta tìm Eigenvecto(các vecto riêng ) của ma trận A*A' , nhưng ma    // trận A*A' có kích thước là M*NxM*N quá lớn , ta sẽ tìm các vecto riêng    // của ma trận A'*A có kích thước PxP        L = A'*A;     [V D] = eigen(L); // hàm eigen để lấy các vecto riêng và trị riêng từ L     //V chứa các vecto riêng còn D chứa các trị riêng    //vecto rieng V(M*N,i) ung voi tri rieng D(i,i)    D1=sort_giamdan(D); // sắp xếp giảm dần tập các vecto riêng        D1=D1[size(D)-20]; // lấy ra 20 vecto riêng : lấy bao nhiêu tùy ý,nhưng 20 có lẽ là    //đủ các đặc trưng cần thiết        D1 chính là tập 20 vecto riêng        /hu da noi o tren , sau khi co cac vector rieng cua ma tran A'*A , ta tim    //cac vector rieng cua ma tran A*A' bang cach lay ma tran A nhan voi D1        //Từ đó ta có tập các vecto riêng đặc trưng cho không gian ma trận A*A' là E    E = A * D1;        //Nhưng E chỉ là 1 tập các vecto trực giao,nên ta cần chuẩn hóa nó để tạo thành    //1 cơ sở trực chuẩn,phục vụ cho phép chiếu về sau.        E=chuyen_ve_co_so_truc_chuan(E); endwhile //thực hiện các phép chiếu :// với//E là tập các vecto trực chuẩn,A là độ lệch giữa ảnh đang xét và m(giá trị trung bình)//tìm tọa độ của các ảnh huấn luyện khi chiếu lên không gian chữ số sovector = size(E);//so vector rieng trong E ( la so cot )for k=1 to tongsoanh do:    for i = 1 to sovector do :        I += E*A(i); //tọa độ hình chiếu I của bức ảnh thứ k    endfortoado[k] = I; // lưu các tọa độ hình chiếu của các bức ảnh lên không gian chữ sốendfor     // tìm tọa độ của ảnh cần kiểm tra chiếu lên không gian chữ số//làm tượng tự nnhư với các ảnh trong tập huấn luyện. for i = 1 to sovector do :    toado_anh_kiemtra += E*A(i); //tọa độ hình chiếu của ảnh kiểm traendfor //so sánh khoảng cách giữa tọa độ ảnh kiểm tra và các ảnh huấn luyện// các hình chiếu lên không gian chữ số là các vecto,vì thế để tính khoảng cách//ta sẽ dùng công thức tính khoảng cách euclipse// khoảng cách từng hình 1 sẽ lưu vào mảng khoangcach khoangcach = [];for k = 1 to tongsoanh do :    for i = 1 to sovector do :        q = toado(m,n,i);        h = (lay_truchuan(toado_anh_kiemtra - q ) )^2;    endkhoangcach[k] = h; // sắp xếp trong mảng khoangcach -> có thể dùng knn để quyết định min = sort_tangdan(khoangcach[],tosoanh);     //min là vị trí của bức ảnh trong tập huấn luyện có tọa độ chiếu so với tọa độ chiếu của ảnh kiểm tra/hỏ nhất//từ đó có thể đưa ra quyết định
    Source đính kèm viết trên VS2008 bằng C++ WinAPI

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    xin chào !
    với thuật toán PCA bạn có xử lí đc vấn đề này chưa :
    - Khi trong data.xml chưa có khuôn mặt nào thì không tìm thấy ( chắc chắn)
    - Khi trong data.xml có 1 hoặc vài khuôn mặt mà đưa 1 khuôn mặt không có trong cơ sở dữ liệu thì nó nhận ra khuôn mặt khác ( do cái ecludience... distance gì gì đó nó tính khoảng cách nhỏ nhất để đưa ra khuôn mặt )
    Được thầy giáo MFC giao cho cái này mà đành pải bỏ vì vấn đề này , search không ra nổi :|

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi prt_awm
    xin chào !
    với thuật toán PCA bạn có xử lí đc vấn đề này chưa :
    - Khi trong data.xml chưa có khuôn mặt nào thì không tìm thấy ( chắc chắn)
    - Khi trong data.xml có 1 hoặc vài khuôn mặt mà đưa 1 khuôn mặt không có trong cơ sở dữ liệu thì nó nhận ra khuôn mặt khác ( do cái ecludience... distance gì gì đó nó tính khoảng cách nhỏ nhất để đưa ra khuôn mặt )
    Được thầy giáo MFC giao cho cái này mà đành pải bỏ vì vấn đề này , search không ra nổi :|
    Mình không dùng file xml mà dùng bộ csdl là ảnh thật(ảnh để trainning).
    Còn về vấn đề của bạn trong code đã giải quyết đầy đủ.Khi khoảng cách euclidean vượt quá ngưỡng beta nào đó thì ảnh không có trong bộ csdl.Điều này là chắc chắn vì khi bạn đưa 1 ảnh khác vào thì hình chiếu của nó so với các ảnh trong csdl là rất khác.

    Chỉ số beta là do thực nghiệm,không có giá trị cụ thể.Bạn test 1 số ảnh khác nhau,sau đó đưa ra ngưỡng beta đó

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Cảm ơn bạn về đề tài này. bạn cho mình hỏi trong kỹ thuật nhận dạng ảnh ta còn có những kỹ thuật nào khác nữa không bạn. mình có thể tham khảo các nguyên cứu về nhận dạng hình ảnh ở đâu vậy?

  5. #5
    Trích dẫn Gửi bởi pdtg50
    Cảm ơn bạn về đề tài này. bạn cho mình hỏi trong kỹ thuật nhận dạng ảnh ta còn có những kỹ thuật nào khác nữa không bạn. mình có thể tham khảo các nguyên cứu về nhận dạng hình ảnh ở đâu vậy?
    Nhận dạng ảnh có rất nhiều kỹ thuật để nhận dạng.Trong 1 topic khác của mình ở đây có trình bày cách nhận dạng khác dựa vào đường đi của nét chữ(stroked base).Ngoài các phương pháp kinh điển như dùng mạng neural,mô hình markov ẩn thì còn các phương pháp như dùng svm,thậm chí có thể dùng mạng bayes để đưa ra quyết định cũng được(bạn xem công thức trang 898 - digital image processing).

    Tóm lại,bạn nên có chút kiến thức về image processing và learning machine rồi hãy làm.

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    mình cảm ơn bạn. mình sẽ theo hướng dẫn của bạn.

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Một bài viết hay va hữu ích,
    mình cũng đang làm về cái này
    cảm ơn bạn nhé. Bạn có tài liệu nào nói rõ về thuật toán PCA không? post cho mình coi với. Mình làm bằng C#

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi tbv
    Một bài viết hay va hữu ích,
    mình cũng đang làm về cái này
    cảm ơn bạn nhé. Bạn có tài liệu nào nói rõ về thuật toán PCA không? post cho mình coi với. Mình làm bằng C#
    http://it08cl2.net/mybb/thread-thuat-toan-pca-va-knn-trong-van-de-trich-loc-va-phan-loai-cac-d%E1%BA%B7c-trung-cua-chu-so

    Làm bằng NN gì cũng vậy thội.Hiểu được giải thuật thì code được hết.

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    anh cho em hoi file resouce.h của anh là thế nào vậy anh

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    chủ pic còn đây ko nhỉ? mình đang gặp vấn đề về so sánh ảnh tương đồng, có bạn nào biết về code java đề tìm ảnh tương đồng ko nhỉ?

 

 
Trang 1 của 2 12 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •