Convolutional Neural Networks là gì

Convolutional Neural Networks

Convolutional Neural Networks

Những năm gần đây, ta đã chứng kiến được nhiều thành tựu vượt bậc trong ngành Thị giác máy tính (Computer Vision). Các hệ thống xử lý ảnh lớn như Facebook, Google hay Amazon đã đưa vào sản phẩm của mình những chức năng thông minh như nhận diện khuôn mặt người dùng, phát triển xe hơi tự lái hay drone giao hàng tự động.

Convolutional Neural Network (CNNs – Mạng nơ-ron tích chập) là một trong những mô hình Deep Learning tiên tiến giúp cho chúng ta xây dựng được những hệ thống thông minh với độ chính xác cao như hiện nay. Trong bài viết này, tôi sẽ giải thích đơn giản về Convolution (tích chập) cũng như ý tưởng của mô hình CNNs trong phân lớp ảnh (Image Classification).

Convolution (tích chập) là gì

Tích chập được sử dụng đầu tiên trong xử lý tín hiệu số (Signal processing). Nhờ vào nguyên lý biến đổi thông tin, các nhà khoa học đã áp dụng kĩ thuật này vào xử lý ảnh và video số.

Để dễ hình dung, ta có thể xem tích chập như một cửa sổ trượt (sliding window) áp đặt lên một ma trận. Bạn có thể theo dõi cơ chế của tích chập qua hình minh họa bên dưới.

Ma trận bên trái là một bức ảnh đen trắng. Mỗi giá trị của ma trận tương đương với một điểm ảnh (pixel), 0 là màu đen, 1 là màu trắng (nếu là ảnh grayscale thì giá trị biến thiên từ 0 đến 255).

Sliding window còn có tên gọi là kernel, filter hay feature detector. Ở đây, ta dùng một ma trận filter 3×3 nhân từng thành phần tương ứng (element-wise) với ma trận ảnh bên trái. Gía trị đầu ra do tích của các thành phần này cộng lại. Kết quả của tích chập là một ma trận (convoled feature) sinh ra từ việc trượt ma trận filter và thực hiện tích chập cùng lúc lên toàn bộ ma trận ảnh bên trái.

Có thể bạn sẽ thắc mắc ứng dụng của phép toán tích chập này là gì. Dưới đây là một vài ví dụ của phép toán tích chập.

  • Ta có thể làm mờ bức ảnh ban đầu bằng cách lấy giá trị trung bình của các điểm ảnh xung quanh cho vị trí điểm ảnh trung tâm.
Blur an image

Blur an image

  • Ngoài ra, ta có thể phát hiện biên cạnh bằng cách tính vi phân (độ dị biệt) giữa các điểm ảnh lân cận.
Edge detection

Edge detection

Bạn có thể tham khảo thêm các ví dụ tại GIMP manual và cơ chế hoạt động của tích chập qua bài viết của Chris Olah.

Convolutional Neural Networks là gì?

Bây giờ, bạn đã biết thế nào là convolution. Vậy CNNs là gì? CNNs chỉ đơn giản gồm một vài layer của convolution kết hợp với các hàm kích hoạt phi tuyến (nonlinear activation function) như ReLU hay tanh để tạo ra thông tin trừu tượng hơn (abstract/higher-level) cho các layer tiếp theo.

Trong mô hình Feedforward Neural Network (mạng nơ-ron truyền thống), các layer kết nối trực tiếp với nhau thông qua một trọng số w (weighted vector). Các layer này còn được gọi là có kết nối đầy đủ (fully connected layer) hay affine layer.

Trong mô hình CNNs thì ngược lại. Các layer liên kết được với nhau thông qua cơ chế convolution. Layer tiếp theo là kết quả convolution từ layer trước đó, nhờ vậy mà ta có được các kết nối cục bộ. Nghĩa là mỗi nơ-ron ở layer tiếp theo sinh ra từ filter áp đặt lên một vùng ảnh cục bộ của nơ-ron layer trước đó.

Mỗi layer như vậy được áp đặt các filter khác nhau, thông thường có vài trăm đến vài nghìn filter như vậy. Một số layer khác như pooling/subsampling layer dùng để chắt lọc lại các thông tin hữu ích hơn (loại bỏ các thông tin nhiễu). Tuy nhiên, ta sẽ không đi sâu vào khái niệm của các layer này.

Trong suốt quá trình huấn luyện, CNNs sẽ tự động học được các thông số cho các filter. Ví dụ trong tác vụ phân lớp ảnh, CNNs sẽ cố gắng tìm ra thông số tối ưu cho các filter tương ứng theo thứ tự raw pixel > edges > shapes > facial > high-level features. Layer cuối cùng được dùng để phân lớp ảnh.

Neural Network

Feedforward Neural Network

Image Classification with CNN

Image Classification with CNN

tensorflow full python code

tensorflow full python code

CNNs có tính bất biến và tính kết hợp cục bộ (Location Invariance and Compositionality). Với cùng một đối tượng, nếu đối tượng này được chiếu theo các gốc độ khác nhau (translation, rotation, scaling) thì độ chính xác của thuật toán sẽ bị ảnh hưởng đáng kể. Pooling layer sẽ cho bạn tính bất biến đối với phép dịch chuyển (translation), phép quay (rotation) và phép co giãn (scaling).

Tính kết hợp cục bộ cho ta các cấp độ biểu diễn thông tin từ mức độ thấp đến mức độ cao và trừu tượng hơn thông qua convolution từ các filter. Đó là lý do tại sao CNNs cho ra mô hình với độ chính xác rất cao. Cũng giống như cách con người nhận biết các vật thể trong tự nhiên. Ta phân biệt được một con chó với một con mèo nhờ vào các đặc trưng từ mức độ thấp (có 4 chân, có đuôi) đến mức độ cao (dáng đi, hình thể, màu lông). Bạn có thể hiểu thêm về triết lý đằng sau Deep Learning ở video bên dưới.

Tham khảo thêm:

Advertisements

24 thoughts on “Convolutional Neural Networks là gì

  1. Cảm ơn anh về những bài viết bổ ích về Convolutional Neural Network. Qua tìm hiểu về Deep Learning , e có thấy còn một mô hình được nhắc đến là Deep Belief Network. Anh có kinh nghiệm về mạng này ko? Em có đọc một vài tài liệu những ko hiểu vấn đề mấy :(. Mong hồi âm của anh

    Like

  2. Cám ơn các bài viết bổ ích của bạn.

    Tôi là người mới nhập môn Deep learning đã đọc các tài liệu nhưng cảm giác hoang mang lan rộng, nhưng tiếp cận được các bài viết của bạn tôi đã rút ngắn được rất nhiều thời gian cho nghiên cứu tìm hiểu của tôi.
    Trân trọng.

    Liked by 1 person

  3. Chào anh,

    Khi mình classify images bằng mô hình CNN thì kích thước ảnh ảnh hưởng như thế nào đến mô hình CNN vậy anh? Width và height của image có cần bằng nhau không anh? Nếu width và height lớn thì mô hình CNN của mình cần phải có nhiều lớp hơn phải không anh (hay mình sẽ resize cho hình bé lại)? Mình thường dùng các thuật toán xử lý ảnh nào vậy anh?

    Câu hỏi này hơi nhiều ý, mong anh thông cảm ^^

    Cám ơn anh.

    Like

    • Bản chất của CNN là feature engineering tự động, kích thước ảnh không ảnh hưởng nhiều đến độ chính xác của mô hình.
      Trong thực tế, bạn cần detect đối tượng để có thể xử lý (bounding box chẳng hạn). Width và height không cố định có thể vuông đối với khuôn mặt, có thể tứ giác đối với các vật thể. Bạn resize ảnh để dễ dàng lưu trữ và tính toán nhanh.
      Thuật toán xử lý ảnh thì có nhiều (pre-processing, post-processing), bạn có thể tham khảo các hàm trong phần mềm Photoshop đều có. Thông thường ta dùng các hàm filter hay clustering để làm trơn ảnh, phát hiện biên cạnh, vân hoặc dáng.

      Like

    • Hi, cảm ơn em đã quan tâm đến blog.
      Deep learning phụ thuộc nhiều vào thực nghiệm để thiết kế các layer phù hợp với tập dữ liệu đang xét.
      Nhìn chung mô hình DL state-of-the-art thường có dạng sau:
      – Convolutional Neural Networks
      – Generative Adversarial Nets
      – Multitask deep learning for image understanding

      Like

      • Em cảm ơn anh
        Em muốn hỏi cụ thể hơn một chút là emcó thể dùng Convolutional Neural Networks để xác định vị trí của một đối tượng trong ảnh không( Nói cách là em có thể khoanh một ô vuông bao quanh một đối tượng nào đó trong ảnh bằng mạng CNN được không ạ)

        Like

          • Như vậy phải sử dụng rất nhiều sliding window phải không anh vì object có sẽ có rất nhiều kích thước khác nhau. Em muốn tìm một mô hình nào đó có thể tự khoanh đối tượng khi nó được trained trên một tập dữ liệu chuẩn đã được khoanh trước. Em ví dụ như muốn tìm một con mèo trong ảnh thì mô hình đó sẽ được xây dựng theo một kiến trúc mà đầu ra của nó sẽ là toạ độ tâm công với chiều rộng + chiều cao của bound box xung quanh con mèo. Còn đầu vào sẽ là tập ảnh có chứa một con mèo trong đó và bound box chuẩn quanh con mèo đó.
            Hi vọng anh hiểu ý của em 😦

            Like

              • Em thật sự cảm ơn anh đã dành thời gian trả lời cho em. Bài báo anh vừa gửi là mạng R-CNN, mạng này em hiểu sơ sơ là họ sử dụng một thuật toán gọi là selective search để khoanh tầm 2K boxes khác nhau căn cứ vào các mức nền của ảnh. Sau đó đưa số ô này vào mạng CNN để classify để lọc ra ô nào là object. Tuy nhiên tốc độ mạng vẫn rất chậm ko đáp ứng được real video. Sau này họ có cải tiến lên mạng fast-RCNN và faster-RCNN với tốc độ tốt hơn rất nhiều. Nhưng nguyên lý của nó cũng tương tự như sliding- window, lọc dần một cách mò mẫm. Em có một ý nghĩ đơn giản là, con người nhận ra đối tượng sau đó mới khoanh ô xung quanh đối tượng đó thì sao máy lại làm ngược lại. Có cách gì giảm bớt các thuật toán khi detect mà chỉ sử dụng thuần mạng Deep được ko?
                Em không phải dân IT nên những thắc mắc của em mà ngô nghê a bỏ qua nhé. Các thành tựu của Deep làm e bị thu hút và dẫn e đến blog này của anh. Những bài viết của anh đã giúp em rất rất nhiều trong việc tiếp cận. Cảm ơn anh nhiều lắm

                Like

                • Em có tư duy cải tiến như vậy là rất tốt. Thách thức của ngành Computer Vision đó là làm thế nào cho máy tính hiểu được ảnh và video số vì máy tính chỉ biết ảnh là một ma trận gồm các phần tử là pixel.
                  Do đó, những nhà nghiên cứu sẽ đơn giản hoá hay biến đổi bài toán về dạng tương đương mà mình có thể giải quyết được. Ví dụ như rút trích biên cạnh để xác định được có hình vuông, hình tròn trong ảnh không. Xác định xem ảnh đầu vào là con chó hay con mèo. Tìm xem trong ảnh đâu là người…
                  Nếu em có quan tâm đến Cấu trúc dữ liệu và giải thuật thì em sẽ biết về bài toán tìm kiếm và sắp xếp. Nếu là con người, khi cho trước dãy số 2,3,1,4,5 thì con người sẽ dễ dàng tìm ra số lớn nhất đó là số 5, ngược lại máy tính sẽ phải duyệt tuần tự để tìm ra số lớn nhất. Nhưng khi cho dãy số gồm 1 triệu phần tử, lúc này con người sẽ thua máy tính về tốc độ xử lý. Động lực của Computer Vision nói riêng hay AI nói chung là như thế. Ta cần sử dụng máy móc để giảm khối lượng công việc cho con người.
                  Do đó, bài toán còn có đó để chúng ta tiếp tục nghiên cứu, cải tiến góp phần làm cho cộng đồng và xã hội ngày càng phát triển hơn.
                  Thật ra nếu theo hướng appearance-based thì em có thể detect object nhưng trong môi trường khá hoàn hảo (foreground background rõ ràng). Ví dụ như em detect một trái bóng màu đỏ trên nền trắng, phân biệt màu các vật thể trong hộp đồ chơi, xác định bàn tay giơ ra 2 hay 3 ngón trên background dễ phân biệt…
                  Chúc em ngày càng đam mê hơn trong lĩnh vực này.

                  Like

                  • Người ta có thể phân loại hàng ngàn đối tượng chỉ bằng việc cho nhân chập ảnh chúng với các ô kernel thích hợp để có thể rút trích ra các features sau đó nhét chúng vào các tầng mạng. Vậy tại sao để detect một vài các features cần tìm giữa những features khác lại không thể tồn tại một kiến trúc mạng nào đó để làm việc này 😦
                    Em sẽ tìm hiểu thêm rồi trao đổi với anh nhé. Chúc anh luôn thành công

                    Like

  4. anh ơi, cho em hỏi thêm chút là giả sử em cắt nhỏ ảnh một con mèo thành nhiều phần rồi phân tán rải rác vào một ảnh nền nào đó. Nếu em đưa ảnh này vào một mạng CNN đã được trained với con mèo bình thường thì nó có trả về đầu ra là có mèo không ạ?

    Like

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s