3D Model recontruction from Point Cloud

Discussion in 'Computer science & Electrical Engineering' started by laoshudo, May 13, 2013.

  1. laoshudo

    laoshudo Thèm thuồng

    Chào cả nhà,

    Mình đang có chủ để nghiên cứu thuật toán reconstruct 3D Model

    Input:
    Point Cloud file format được chụp từ camera 3D chẳng hạn
    đối tượng là công trường, hoặc máy móc, mô hình kiến trúc

    Output
    3D Model, được save dưới dạng DXF của AutoCad

    Bạn nào đã hoặc đang nghiên cứu vấn đề này thì cùng trao đổi nhé

    Best regards
    Laoshu
     
  2. tynguyen

    tynguyen Thèm thuồng

    Bác Lashudo ơi, bác đang làm nghiên cứu ở lab nào thế ạ?
     
  3. laoshudo

    laoshudo Thèm thuồng

    Mình đang nghiên cứu ở FPT Software :)
     
  4. compvis

    compvis Thèm thuồng

    Mình cũng đang tự nghiên cứu, nhưng cái model 3d thu được thì chưa được ưng ý. Đang không biết nó bị ảnh hưởng bởi cái gì: ánh sáng, cách setup hệ thống....Bác nào biết chỉ em với:

    http://s23.postimg.org/xv80hrjjv/IMG_2794.jpg
     
  5. sieubebuvietnam

    sieubebuvietnam Viên mãn

    Bác dùng thuật toán gì. Active hay passive cho nó. Active rất nhạy với ánh sáng. Passive thì đỡ hơn nhưng chất lượng kém hơn
     
  6. compvis

    compvis Thèm thuồng

    Mình dùng passive, chả biết xử lý cái nguồn sáng như thế nào nữa
     
  7. sieubebuvietnam

    sieubebuvietnam Viên mãn

    Passive chỉ gặp vấn đề về nguồn sáng khi bác làm với đối tượng outdoor thôi, ở đây bác làm trong lab thì lo gì. Tuy nhiên nhìn qua cái ảnh của bác thì chắc bác định dùng stereo camera để tính disparity map rồi tính depth map, qua đó dùng hàm trong openCV để dựng ra mô hình 3D. Nếu đúng như em đoán thì kết quả kém là đương nhiên.
    1. Chắc là bác dùng cái hình bàn cờ và hàm trong OpenCV để calib cái camera. Nhưng 2 cái camera của bác trong không thẳng thế kia, không biết bác đã chạy bước rectify cho nó chưa.
    2. Bác nói ít thông tin bác làm theo hướng nào, cụ thể ra sao nên khó cho nhận xét lắm. Nếu bác chỉ chụp vật theo một hướng thì không đủ dữ kiện để dựng vất đâu, bác làm sao giải quyết được cái occlusion của nó, chưa kể là nó còn bị nhiễu nữa.
    Opencv vì nó hướng đến mục tiêu là chạy được real time nên nhiều chi tiết nó bỏ qua lắm, kết quả tính rất lớm. Bác mà hy vọng sử dụng cái đấy có kết quả tốt thì rất khó.
     
  8. compvis

    compvis Thèm thuồng

    Cảm ơn bạn, không biết có đúng là mình gặp được chuyên gia không nữa. Nhưng hẳn là bạn có rất nhiều kinh nghiệm về lĩnh vực này. Rất vui được biết bạn.

    Đúng như bạn nói, mình dùng hai camera để tính disparity rồi tính depth map, sau đó dùng ICP để khôi phục 3D. Các bước như sau:

    - Stereo camera system setting
    - Stereo camera calibration
    - Rectify images
    - Depth map calculation
    - 3D point cloud calculation
    - ICP to reconstruct 3D

    Hệ được đặt trong phòng nghiên cứu với ánh sáng là đèn tuýp. Camera được sử dụng là camera Gige, CMOS, 1280x1024, 30fps. Lens được sử dụng là lens có focal length từ 3.8mm tới 13mm.

    Mình chưa thể kiểm tra hết được các khả năng xảy ra: nguồn sáng, ảnh hưởng của texture, màu của nền phải dùng, khoảng cách giữa hai con cameras, góc quay của mỗi camera...

    Mong bạn cho mình lời khuyên nhá!?

    Xin bạn cho biết hiện bạn đang công tác hay nghiên cứu tại đơn vị nào ạ?

    Cảm ơn bạn trước !
     
  9. sieubebuvietnam

    sieubebuvietnam Viên mãn

    Em chưa đủ tuổi và trình độ để làm chuyên gia bác ạ :)) nhưng có làm về mảng này một thời gian.

    Em nghĩ bác cần xác định một số vấn đề sau thì làm nó mới dễ. Lịch sử của cái topic này là rất lâu đời rồi, gần nửa thế kỷ cho cái topic này nên nó có rất nhiều hướng nghiên cứu. Để có thể ra được mô hình cuối cùng với chất lượng tốt là không hề đơn giản vì nó là tổ hợp của tầm hơn 10 thuật toán trở lên nối tiếp nhau.

    1. Đối tượng của bác là gì:
    + Các mô hình kiến trúc lớn (outdoor)
    + Các vật trong nhà (indoor)
    + Khuôn mặt người (face reconstruction)
    + Nhưng vật với cấu trúc hết sức phức tạp (sculpture, museum, thin structure...)
    Đối tượng hết sức đa dạng, dựa vào đối tượng khác nhau sẽ liên quan đến các thuật toán khác nhau
    2. Mục tiêu của thuật toán của bác là gì:
    + Chất lượng của mô hình bác dựng lên
    + Tốc độ dựng mô hình (có phải bài toán real time hay không?)
    3. Nhìn vào ảnh bác đưa thì đối tượng bác là một đối tượng hú họa, điều này là không tốt cho thuật toán bác muốn kiểm tra.
    Thông thường người ta sẽ test sử dụng vào các benchmark và groundtruth được cung cấp trên mạng. Bác sẽ không thể kiểm soát được nhiều yếu tố bên ngoài như light, rồi outlier...
    Kinh điển của cái này luôn là bộ dataset của Middlebury.
    4. Chất lượng đầu vào của anh sẽ ảnh hưởng rất nhiều đến kết quả đầu ra của bác. Đầu vào của bác chỉ là HD nên em nghĩ đấy cũng là một phần nguyên nhân. Từ depth map bác dựng được point clound, nhưng vì đầu vào chất lượng thấp, nên số lượng point clound ít, chưa kể còn bị noise, nonuniform distributed, misleading, outlier thì chất lượng không cao là phải.

    Trả lời 2 câu hỏi đầu tiên trên xong thì bác sẽ định hình được phần nào hướng để đi tiếp
    - Chọn active method: chất lượng rất tốt nhưng nhạy với sáng, thường có điều kiện giả sử là thỏa mãn điều kiện Lambertian. Điển hình của cái này có thể kể đến phương pháp photometric, sillhousette, rồi combine của mấy cái đấy. Cái này nhược điểm là thiết bị đắt tiền. Trước thiên hạ hay phải làm trong studio vì nó nhạy với sáng, về sau có hệ thống LiDAR nhưng đắt, em nghĩ ở Việt Nam không đủ tiền mua đâu, trừ khi bác là đại gia :D
    - Chon passive method: thì đợt trước phổ biến nhất là multi view stereo method. Cái này thì ít nhạy với sáng nhưng đương nhiên là chất lượng kém hơn, tính toán rất khủng. Máy bác mà không hỗ trợ GPU thì đuối lắm.

    Em không biết bác nghiên cứu bao lâu rồi nhưng bập một cái mà bác dùng luôn OpenCV và mong kết quả tốt thì khó lắm. Như đợt em mới làm toàn phải đọc hết mọi thứ, xem thiên hạ nó làm gì rồi, hay dở ở đâu rồi mới chọn hương để đi. Quan điểm của em là OpenCV dùng cho vui thì được chứ để mong kết quả tốt thì em thấy bọn tác giả nó toàn tự viết code, ít thấy thằng nào implement dùng OpenCV toàn bộ từ đầu đến cuối cả.

    Ngoài ra trên thị trường hiện nay nó có cung cấp các stereo camera, những cái đấy nó có sẵn hết các thông số của camera nên chất lượng đầu vào cũng tốt hơn là bác chơi loại tự calib bằng tay như thế kia. Điển hình của stereo camera, em có dùng 3 cái là Kinect, ZED camera và DUO MLX camera.

    Tạm thời em nói thế đã. Chúc bác cải thiện được kết quả công việc
    P/s: Em chỉ là thằng sinh viên graduate vớ vẩn, không phải nghiên cứu ở viện gì đâu bác ạ :)
     
  10. compvis

    compvis Thèm thuồng

    Cảm ơn bạn,

    Đối tượng của mình là các vật hình khối trên dây chuyền sản xuất => indoor

    Tốc độ không phải là real-time, chất lượng của đối tượng thu được càng chinh xác càng tốt vì nó sẽ được sử dụng như golden template để nhận dạng sau này

    Mình không dùng OpenCV (mình không sử dụng OpenCV cho các ứng dụng commercial)

    Mình nghiên cứu cho hệ Stereo tổng quát => mình sẽ không dùng 3D cameras

    Ý của bạn là gì ? Đầu vào HD là tốt chứ bạn?

    Bạn có thể cho mình tham khảo hệ bạn đã nghiên cứu không? Theo bạn mình có thể làm Tiến sĩ với đề tài này ở Việt Nam không bạn?

    Cảm ơn bạn trước!
     
  11. sieubebuvietnam

    sieubebuvietnam Viên mãn

    Post trước em nói lan man quá :">
    Một vấn đề rất căn bản với bác là bác sử dụng thuật toán gì để tính disparity map. Chất lượng của disparity map sẽ ảnh hưởng trực tiếp đến depth map và point cloud của bác.
    Nói sơ qua về disparity map tí:
    1. Dạng đơn giản dễ xài là sử dụng block matching, kết hợp với winner-take-all để đưa ra kết quả. SAD và SSD là 2 cái tên quen thuộc được implement trong OpenCV. Nếu bác dùng thẳng source code của nó trong mục 12.3 của quyển "Learning OpenCV'' (có thể modify đi tí :D) thì em đoán bác dùng SAD. Đương nhiên chất lượng thấp là phải vì cái thuật toán này nó chỉ được cái tính nhanh. Chưa kể bản thân cái hàm đấy trong OpenCV nó đã bỏ qua một vài chi tiết để tính cho nhanh. Em nhớ không nhầm thì dải tính disparity của nó chỉ từ 0 đên 63. Đương nhiên khi bác đọc giá trị hiển thị của nó sẽ thấy tại sao kết quả lại không phải là (0-63) như mình nghĩ (đọc trong source code của nó để biết nguyên nhân). Nhược điểm nữa của 2 cách tính này là nó chịu ảnh hưởng rất lớn của sự thay đổi illumination (search google để biết thêm chi tiết).
    2. Để giải quyết nhược điểm trên thì phương pháp NCC (Normalization Cross-Correlation) ra đời. Hơ hơ :-? Cái này tính toán nặng hơn 2 thằng kia kha khá. OpenCV không implement cái này, cái này phải tự chiến đấu thôi bác nhé.
    3. Đương nhiên chất lượng của cả 3 phương pháp trên vẫn là kém vì nó chỉ là "local method". Chính vì thế mới xuất hiện phương pháp "graph cut" sử dụng "alpha-beta move" và "alpha-expansion". Chất lượng là rất tốt. Thực chất bài toán này là xuất phát từ MRF (Markov Random Field) mà ra. Đương nhiên nó là "global optimal" nên chất lượng tốt hơn hẳn mấy thằng trên (dù thực ra nó chỉ là approximation algorithm, do đây là bài toán NPC mà). Cái này có 2 nhược điểm lớn là: 1. Tính toán khủng do là global optimization problem. 2. Chỉ áp dụng được cho lớp submodular (để bài toán optimal là convex optimal). Hiển nhiên ta cần convex optimal để cực trị "địa phương" cũng là cực trị cho "toàn cục". Phương pháp này không thể áp dụng với 3 label trở lên được. Nó có một biến thể cho trường hợp multi-lebel. Bác đọc paper "Global Stereo Reconstruction under Second Order Smoothness Priors" để biết thêm chi tiết nhé.
    4. Đến lúc này để giải quyết việc tính toán chậm của graph-cut thì phương pháp SGM ra đời, đương nhiên phải chịu thiệt về chất lượng. Cái này OpenCV có implement nhưng chất lượng theo em nhận xét là kém, bác cứ thử xem thế nào.

    Tạm thời thế đã bác nhỉ. Chúc bác thành công :)
     
  12. sieubebuvietnam

    sieubebuvietnam Viên mãn

    Đầu vào em toàn dùng ảnh từ 2,5kx 1,7k trở lên. Anh muốn chất lượng tốt thì phải tầm 4kx3k trở lên. Đầu vào thế là bình thường thôi bác ạ.
    Em làm về facial reconstruction.
    Gửi bác cái hình minh họa. Hình này chỉ dừng ở mức surface reconstruciton thôi. Còn các bước về refinement và texturing nữa.
     

    Attached Files:

  13. compvis

    compvis Thèm thuồng

    Cảm ơn bạn,

    Thực tế mình đã nghiên cứu qua cả ba thuật toán trên. SAD và SSD so sánh các giá trị mức xám của các điểm ảnh trong cửa sổ lấy mẫu, NCC bù các giá trị xám trung bình và sự thay đổi của nó trong cửa sổ lấy mẫu (mask window). Phương pháp NCC khá tốt với hai ảnh có sự khác nhau về độ sáng và độ tương phản, còn với hai ảnh có độ sáng và độ tương phản thì SAD và SSD cho kết quả kha khá. Kha khá ở đây (cho cả SAD, SSD, NCC) mình muốn nói là nó đã lên được vài phần trăm disparity map mà thôi. Vì thế mình không sử dụng ba thuật toán này. Mình sử dụng thuật toán Multi-Scanline, kết quả là nó cho depthmap khá tốt, cơ mà vẫn chưa ưng ý. Chắc mình sẽ phải cải thiện hơn nữa.

    Cái phương pháp SGM của bạn là gì vậy?
     
  14. compvis

    compvis Thèm thuồng

    Ối giời ơi, bạn reconstruct được thế này cơ à? Bạn dùng 3D camera scanner?
     
  15. sieubebuvietnam

    sieubebuvietnam Viên mãn

    Là semi-global matching. Cái này nổi tiếng mà bác. Từ bước Point Cloud đến lúc ra được final model còn gian nan lắm bác ạ. Em nghĩ bác nên tìm hiểu thêm từ đấy nữa đi.
     
  16. sieubebuvietnam

    sieubebuvietnam Viên mãn

    Em dùng passive mà bác, không phải active method.
     
  17. compvis

    compvis Thèm thuồng

    Công nhận hay thật đấy ! Thanks
     
  18. HCMUT_Knight

    HCMUT_Knight Thèm thuồng

    Em biết các anh ở đây đều là chuyên gia trong lĩnh vực này ạ. Hiện em cũng đang tập tành nghiên cứu về mảng 3D này, em đang học ĐH. Các anh cho em hỏi em muốn bắt đầu từ việc đơn giản nhất là chuyển ảnh từ 2D sang 3D thì phải bắt đầu từ đâu ạ? Có các textbook cũng như những đoạn code matlab nào không ạ? Em cũng đã google nhưng vẫn lan man quá. Mong các anh giúp em. Em chân thành cảm ơn ạ
     
    ITStudentFr likes this.
  19. bờm

    bờm Thèm thuồng

    bạn mua ZED depth camera ở đâu vậy, giá bao nhiêu vậy.
    Camera này có cho kết quả tốt không vậy bạn.
     
  20. sieubebuvietnam

    sieubebuvietnam Viên mãn

    Chuyển từ ảnh 2D sang 3D (depth map) thì đơn giản nhất là dùng mấy thuật toán tính disparity map trong OpenCV nếu code bằng C/C++, Python để xem mặt mũi của nó thế nào, sau đấy nó sẽ nảy sinh các vấn đề và tìm hiểu dần dần thì mới hiểu hết được. Nếu không thì dùng thẳng hàm trong Matlab cũng được thì nó làm hết mọi việc cho. Chỉ việc mỗi load ảnh và nhìn :)). Muốn chuyển từ 2D sang 3D thì cần làm mấy bước sau đây trước
    1. Làm cho ảnh hết bị biến dạng
    2. Rectification để phục vụ cho bước sau
    3. Tạo pyramid image để giảm việc tính toán
    4. Sau khi làm các bước trên thì tính disparity map để tạo depth map là có ảnh 3D
    Chú ý: phải scale dải giá trị thì mới thấy kết quả giống như các testbench trên mạng
    Để biết thêm chi tiết thì vào trang của middlebury mà mò thêm về dataset, ground truth và cách nó tính toán so sánh kết quả và hiện thị kết quả thế nào
     
    compvis likes this.

Share This Page