Chia sẻ kinh nghiệm xử lý ảnh

  Oct 19, 2019      2m
   

OpenCV - tut 20: Tổng hợp kinh nghiệm xử lý ảnh

Chia sẻ kinh nghiệm xử lý ảnh

Trước khi bắt đầu bài viết kết thúc cho chuỗi series Xử Lý Ảnh này, Minh xin tâm sự "mỏng" một chút nhe. Minh đã đến với lĩnh vực Xử Lý Ảnh này rất tình cờ. Trong những năm tháng học đại học ở trường Bách Khoa, mình đã đăng ký một môn học tên là "Xử Lý Ảnh và Thị Giác Máy Tính"; nó chỉ là một trong những môn học tự chọn. Mình còn chẳng biết sẽ vào học nội dung gì, đơn giản là vì thấy tên nó hay hay (có chữ Thị Giác Máy Tính). Mình còn nhớ những bài mở đầu của môn này là nói về tổng quan của Xử Lý Ảnh và Thầy đã cố gắng giảng giải về cách tổ chức dữ liệu của ảnh (hình ảnh được lưu trữ dưới dạng ma trận, mỗi pixel có giá trị 0-255, ảnh màu thường được biểu diễn bởi 3 layer RGB, vâng vâng và mây mây).

Một trong những điểm ấn tượng đầu tiên khiến mình muốn theo đuổi môn học này là vì người Thầy dạy môn học này khá "khó" tính và rất giỏi trong lĩnh vực này. Sau khi học sâu thêm nữa thì mình cũng công nhận môn học này khó thật (vd: ban đầu mình đã vật vã để hiểu được khái niệm convolution, biến đổi Fourier, nén ảnh, …). Không chỉ có giải thuật mà còn có những kiến thức toán học chen vào, mà sinh viên thì thấy công thức Toán là lại sợ, e dè. Sau khi kết thúc môn học, mình quyết định đăng ký đề tài làm luận văn tốt nghiệp với Thầy dạy Xử Lý Ảnh đó luôn. Mình được học và tìm hiểu về cách đọc báo (paper - những bài báo khoa học), bài luận văn của mình làm với bộ lọc Gabor (Gabor filtering); thời đó năm 2014 Deep Learning còn chưa nổi, CNN chưa là trending. Framework mình sử dụng là dùng MATLAB (có những extension cho computer vision), thời điểm đó Python chưa soán ngôi được MATLAB đâu. Về sau Python nổi lên vì tính ưu việt, nhanh chóng vá khá phù hợp để thử nghiệm AI. Nên bây giờ thấy những hình ảnh meme cà khịa MATLAB là mình thấy vui vui, haha.

Và đến thời điểm hiện tại, mình đang "đú trend" theo Deep Learning! Dĩ nhiên, những kiến thức thời xử lý ảnh không phải là thừa; mà rất thiết yếu để mình hiểu sâu bản chất và cách làm việc của CNN nữa là đằng khác. Theo Minh, nền tảng cơ sở vẫn là quan trọng; mình cũng không quá mặn mà với những cách tiếp cận theo kiểu "mì ăn liền". Vì làm kiểu đó đúng là nhanh thật nhưng bản thân mình không thể cải tiến cũng như nhanh chóng chuyển đổi qua bài toán bất kỳ. Đó là sự phát triển không bền vững.

Do đó, series bài viết đầu tiên của Minh muốn chia sẻ là về Xử Lý Ảnh, chứ không phải Deep Learning. Tính từ bài post đầu tiên cho chuỗi bài viết XLA này, thì bài post kết thúc hôm nay là khoảng tròn 1 năm. Minh cũng muốn gửi lời xin lỗi đến những bạn nào có theo dõi từ những bài viết đầu tiên vì việc viết quá lâu như vậy. M cũng khá bận rộn với công việc hàng ngày, chỉ có thể dành thời gian rảnh rỗi để viết post; và để hoàn thành 1 bài viết thì toàn bộ code chia sẻ mình đều đã chạy thử để đảm bảo nó làm việc được nên cũng mất kha khá thời gian chứ không thể tiến hành nhanh chóng được.

Chém chuối nãy giờ cũng dữ lắm rồi, thôi mình tiếp đến các mục chính thôi nào. Tổng kết một số kinh nghiệm cho việc học và hành XLA qua góc nhìn cá nhân của Minh :).

Học xử lý ảnh nên bắt đầu từ đâu?

Trước khi chia sẻ điểm bắt đầu để đặt chân vào thế giới Xử Lý Ảnh / Thị giác máy tính. Mình xin tóm tắt những hành trang cần chuẩn bị nhá:

  • Toán học: ở mức độ sương sương thôi, bạn phải cố gắng mày mò công thức toán để hiểu chúng, bay không trốn khỏi nó được đâu => tu-bi-không-tình-iu :))
  • Tiếng Anh: XLA đã là kiến thức chuyên ngành của Khoa học máy tính rồi, không phải là kiến thức phổ thông nữa nên dùng trình tiếng Anh kha khá để có thể nhanh chóng đọc và hiểu tài liệu là một lợi thế.
  • Đam mê: thích thú với những ứng dụng mà computer vision mang lại: nhận diện khuôn mặt, đọc biển số xe, phát hiện người, … rất nhiều luôn kể mỏi miệng không thể hết được.
  • Khả năng lập trình: ở mức độ nhất định, không được quá kém. "Bộ môn" này học mà không hành là ngủm! Có những thứ bạn phải trải nghiệm mới thực sự hiểu và hiểu sâu được nó. Mình không tin bạn có thể học XLA chỉ từ lý thuyết, chính Thầy dạy lý thuyết XLA của mình còn code demo được cho cả lớp xem mà.
  • Tư duy: đây là lĩnh vực khó, có chút cao cấp vì nó tổng hợp nhiều kiến thức. Hình ảnh được số hóa thành một ma trận, vì vậy bạn sẽ cần tư duy tính toán làm việc trên ma trận. Qua deep learning lại tiếp tục sử dụng tư duy theo kiểu ma trận này để làm việc với ảnh. Ngoài ra, bạn phải nỗ lực tư duy để hiểu các giải thuật (bắt não tập thể dục).

Rồi, điểm bắt đầu để tiếp cận XLA theo mình đó là một người Thầy dạy XLA (giống như mình đã từng) hoặc bạn phải đọc sách (sách cũng chính là Thầy của mình mà :)). Quyển đó mình xin giới thiệu là quyển "Digital Image Processing - Rafael C. Gonzalez & Richard E. Woods". Đây cũng là quyển sách mình bám theo trong quá trình học môn học. Bên cạnh đó có điểm nào chưa hiểu bạn phải tìm kiếm trên mạng nghiên cứu thêm, sẽ có một số kết quả từ Wikipedia chẳng hạn. Ngoài việc đọc lý thuyết bạn phải tự mình lập trình để chạy chương trình nữa. Code mẫu mô tả 1, bạn phải thực hành từ code đó, biến đổi tham số thành 10 kiểu khác nhau để từ đó mình nắm rõ bản chất của sự việc. Các giải thuật XLA bạn sẽ hay thấy người ta đặc tả tham số, ví dụ như nếu là nhị phân hóa ảnh người ta chọn 1 ngưỡng (threshold) là giá trị 0.5 chẳng hạn. Bạn phải code và chạy chương trình với ngưỡng 0.5 xem kết quả ra như nào, chạy với ngưỡng 0.7 coi hình kết quả biến đối ra sao, thử qua ngưỡng 0.1 luôn coi có gì khác và từ đó bạn phải nắm được cách chọn ngưỡng như thế nào để giải quyết một bài toán. Học XLA mà không táy máy, không nhiệt huyết thì khó lắm.

Triển khai ứng dụng xử lý ảnh

Minh phải nói rằng những bài viết mà mình chia sẻ cũng là cố gắng chia sẻ để mọi người nắm được lắm rồi. Nhưng nhiều khi cũng thấy có vài điểm chưa rõ lắm cho những người mới, nên mấy bác chịu khó tự tìm hiểu thêm nha, đừng chỉ chăm chăm học từ 1 nguồn tài liệu duy nhất. Việc tinh thông code được XLA chạy ra kết quả thực sự mới chỉ dừng lại ở mức độ học hành và demo. Chưa thể áp dụng vào thực tế ngay đâu ạ.

Điều kiện để dùng được vào thực tế:

  • Nhanh: chương trình bạn phải chạy thật nhanh, 1 ảnh mà mất 5s xử lý là thua, người dùng không thể đợi được. Cái này tùy vào nhu cầu ứng dụng nhưng nói chung phải càng nhanh càng tốt.
  • Chính xác: kết quả chạy phải đủ tốt. Tốc độ xử lý và Độ chính xác luôn có sự đánh đổi (trade off), được cái này sẽ giảm cái kia.

Vì vậy để ra được một ứng dụng thực tế chạy thiệt thì phải đủ nhanh và đủ chính xác. Mà nếu bạn muốn triển khai trên các phần cứng nhúng thì lại khó ác nữa, vì các bo nhúng nhỏ gọn nhưng bù lại cấu hình yếu. Đó sẽ là một thử thách vô cùng lớn mà bạn phải vượt qua. Không qua được thì ta chỉ có thể ở mức demo. Sự thật là vậy và đôi khi mình phải chấp nhận nhìn thẳng vào.

Tóm lại bạn muốn ra một ứng dụng XLA thực tế hẳn hoi, bạn phải mày mò thêm nữa; bỏ công optimize giải thuật; code trên những ngôn ngữ lập trình cấp thất nhanh nhất như C/C++ chẳng hạn. Kinh nghiệm xương máu của mình rồi, mình từng nỗ lực deploy chương trình bằng Python và phải nói là nó thất bại thảm hại! Không thể trốn thoát khỏi C/C++ đâu các pé :). Nếu bác nào làm được trên Python thì M quá khâm phục, cũng muốn học hỏi. Ahihi.

Tổng kết

Tổng kết lại bài viết này là bài viết kết thúc series chia sẻ về XLA của M. Nội dung dừng lại ở giải thuật HOG nhưng thực ra XLA còn nhiều giải thuật trích đặc trưng hình ảnh nhắm: Gabor filter, LBP, SIFT, SURF, Dense SIFT, … để theo đuổi mấy cái đó bạn cũng nên đọc paper của các tác giả gốc, nếu có thể thì code lại theo paper đó hoặc tìm code mẫu để follow. Giải thuật HOG là mình tự code lại từ đầu luôn á theo paper, nhưng nếu mình ở trình độ 4 năm về trước thì mình thú thật mình không thể làm được. Do đó càng theo đuổi lâu thì bạn sẽ càng có nhiều kinh nghiệm. Bề dày kiến thức và kinh nghiệm trong "ngành" sẽ giúp bạn đi nhanh và đi xa hơn. Hãy kiên trì nha.

Cánh cửa này đóng lại sẽ có cánh cửa khác mở ra. Sắp tới mình đang dự định bắt đầu 1 series bài viết mới, các ứng cử viên tiềm năng:

  • Deep Learning cơ bản: mình thấy cũng có 1 bác viết về chủ đề này rồi, mình viết nữa thì sợ đụng hàng mà chất lượng giả dụ có kém hơn thì lại không hay :P.
  • Machine Learning cơ bản: cũng có vẻ hấp dẫn, sẵn dịp để M ôn lại SVM, k-nn, neural net, tree, …
  • Xử Lý Ảnh trên OpenCV C/C++: một version khác của series XLA cũ nhưng sẽ code bằng C/C++, chú trọng đến tối ưu performance hơn và sẽ gần gũi ứng dụng thực tế hơn; M còn chưa biết có làm nổi topic này không nữa ^^~.
  • CNN cơ bản: tập trung về khai thác bản chất của mạng Convolutional Neural Network (CNN), hàm loss trong các bài toán phân loại, biến đổi dữ liệu ảnh (augmentation).

Phân vân các đề tài trên quá, bác nào nếu có quan tâm hoặc ủng hộ thì comment tăng tương tác nha. Hihi.

Chào tạm biệt! Minh


Cảm ơn bạn đã theo dõi bài viết. Hãy kết nối với tớ nhé!


Danh sách bài viết series OpenCV: