Máy học trong 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á:
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ý ảnhMinh 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ế:
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ếtTổ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:
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 Bài viết tiếp theo: Tut 21: Xử lý ảnh - Hiện thực trích đặc trưng Local Binary Patterns (LBP) Cảm ơn bạn đã theo dõi bài viết. Hãy kết nối với tớ nhé!
Khám phá xử lý ảnh - GVGroup Danh sách bài viết series OpenCV:
|