Xây dựng mô hình AI phân loại hình ảnh bằng Pytorch: Hướng dẫn từ A – Z cho người mới bắt đầu

Hướng dẫn xây dựng mô hình phân loại hình ảnh

Nhận dạng và phân loại hình ảnh là một trong những bài toán cơ bản về Thị giác máy tính mà bất kỳ kỹ sư AI nào cũng nên nắm được. Vậy làm thế nào để bắt đầu luyện tập xây dựng mô hình AI phân loại ảnh? Dưới đây là hướng dẫn từng bước chi tiết bằng cách sử dụng Python và Pytorch.

Bước 1: Nhập thư viện

Khi lập trình, việc viết mã thủ công cho mỗi thao tác nhỏ có thể đem lại không ít rắc rối. Đôi khi, sử dụng các đoạn mã đã được phát triển sẵn là cần thiết. Các đoạn mã được đóng gói này gọi là Thư viện và có thể được thêm vào chương trình bằng cách nhập (import). Các lập trình viên thường import tất cả các thư viện khi bắt đầu chương trình.

Bước 2: Xác định phép biến đổi

Để cung cấp dữ liệu hình ảnh đào tạo cho mô hình AI, ta cần chỉ định những thay đổi muốn thực hiện trên những ảnh này.

Các biến đổi này được thực hiện bằng thư viện torchvision.transforms. Cách tốt nhất để hiểu các biến đổi này là đọc tài liệu đầy đủ tại đây. Tuy nhiên, bài viết cũng sẽ trình bày ngắn gọn về chức năng của từng lệnh.

  • transforms.Compose cho phép kết hợp nhiều biến đổi với nhau 
  • transforms.Resize((255)) thay đổi kích thước hình ảnh sao cho cạnh ngắn nhất có chiều dài 255 pixel. Cạnh còn lại được chia tỷ lệ để duy trì tỷ lệ khung hình của hình ảnh.
  • transforms.CenterCrop(224) cắt phần giữa của hình ảnh để có được một hình vuông kích thước 224 x 224 pixel.

Lưu ý cần thực hiện các phép biến đổi để đảm bảo tất cả hình ảnh được đưa vào mô hình AI đều có cùng kích thước.

  • transforms.ToTensor() chuyển đổi hình ảnh sang tensor (là kiểu dữ liệu đa chiều được sử dụng trong pytorch). Về cơ bản, kỹ thuật này chuyển đổi các pixel của mỗi hình ảnh có màu thành độ sáng của màu, từ 0 đến 255. Các giá trị này được chia cho 255, vì vậy chúng có thể nằm trong khoảng từ 0 đến 1.
  • transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) trừ đi giá trị trung bình rồi chia cho độ lệch chuẩn. Với mô hình được đào tạo trước, ta cần sử dụng các giá trị trung bình và độ lệch chuẩn mà Pytorch chỉ định. Có ba giá trị trong giá trị trung bình và độ lệch chuẩn để khớp với từng ảnh RGB.

Bước 3: Nhập dữ liệu và đưa vào DataLoader

Cuối cùng, ta có thể nhập ảnh của mình vào chương trình, sử dụng thư viện torchvision.datasets.

Ở đây cần chỉ định hai bộ dữ liệu khác nhau, một bộ dữ liệu để đào tạo mô hình (bộ đào tạo – training set) và bộ còn lại để kiểm tra mô hình (bộ xác thực – validation set).

Lệnh datasets.ImageFolder() muốn dữ liệu được sắp xếp theo cách sau: root/label/picture.png. Nói cách khác, các hình ảnh nên được sắp xếp vào các thư mục. 

Các lệnh sử dụng ở đây là:

  • Đường dẫn đến tất cả các thư mục
  • Các biến đổi đã chỉ định trong bước trước.

Sau đó, cần đưa hình ảnh đã nhập vào Dataloader. Dataloader có thể lấy ra các mẫu dữ liệu ngẫu nhiên, vì vậy, mô hình sẽ không phải xử lý toàn bộ tập dữ liệu một lần. Điều này làm cho việc đào tạo trở nên hiệu quả hơn.

Ta có thể chỉ định số lượng hình ảnh xử lý cùng một lúc làm batch_size (ví dụ 32 có nghĩa là Dataloader sẽ trả về 32 mẫu cùng một lúc). Ta cũng có thể xáo trộn hình ảnh để nó được huấn luyện ngẫu nhiên vào mô hình với tham số shuffle=True.

Bước 4: Xây dựng mô hình

Các mô hình AI cần được đào tạo trên nhiều dữ liệu để có hiệu quả. Nếu không có nhiều dữ liệu như vậy, ta có thể sử dụng một mô hình đã được đào tạo trước đó trên nhiều hình ảnh, nhưng điều chỉnh nó để phù hợp với yêu cầu và các hình ảnh cụ thể. Quá trình này được gọi là transfer learning.

Mô hình nhận dạng hình ảnh có hai phần:

  • phần tích chập và
  • phần phân loại

Ta giữ phần tích chập được đào tạo trước nhưng đưa vào bộ phân loại của riêng mình. Bởi lẽ: 

Phần chập/tổng ​​hợp trong mô hình được sử dụng để nhận dạng các đặc trưng bên trong một hình ảnh. Đầu tiên, nó xác định các cạnh, sau đó sử dụng các cạnh để xác định các hình dạng và sử dụng các hình dạng này để xác định các đối tượng.

Nhưng cần RẤT NHIỀU dữ liệu để đào tạo phần này — có thể nhiều hơn những gì ta có — vì vậy, thay vào đó, ta có thể sử dụng các lớp tích chập được đào tạo trước, mặc định. Các lớp tích chập này đã được đào tạo để xác định rất tốt các đặc trưng, bất kể bạn có loại hình ảnh nào.

Ngoài ra còn có các lớp tổng hợp ở giữa các lớp chập giúp lọc hình ảnh thành kích thước nhỏ hơn để có thể dễ dàng nhập vào bộ phân loại.

Phần cuối cùng của mô hình là bộ phân loại. Bộ phân loại lấy tất cả thông tin được trích xuất từ ​​​​ảnh trong phần tích chập và sử dụng thông tin đó để nhận dạng ảnh. Đây là một phần của mô hình được đào tạo trước mà ta cần thay thế và đào tạo trên hình ảnh của chính mình. Điều này làm cho mô hình được điều chỉnh để xác định đúng những hình ảnh mà ta cung cấp cho nó.

Ở đây sử dụng thư viện torchvision.models để tải xuống mô hình được đào tạo trước. Ví dụ chọn một mô hình có tên là densnet161 và chỉ định nó được đào tạo trước bằng cách đặt pretraining=True. Sau đó, ta chỉ đào tạo bộ phân loại mà không tiến hành đào tạo cả mô hình.

Bây giờ, cần thay thế bộ phân loại mặc định của mô hình bằng bộ phân loại riêng. Bộ phân loại là các mạng thần kinh được kết nối đầy đủ, vì vậy để làm được điều này, trước tiên ta phải xây dựng mạng thần kinh.

Mạng thần kinh chỉ là một phương pháp để tìm các mẫu phức tạp và kết nối giữa các số của đầu vào và đầu ra. Trong trường hợp này, nó sử dụng các đặc điểm của hình ảnh được đánh dấu bằng phần tích chập để xác định khả năng hình ảnh là một nhãn nhất định.

Điều đầu tiên là xác định số lượng số được nhập vào mạng thần kinh. Nó phải khớp với số lượng số được xuất ra từ phần trước (phần tích chập). Vì ta hoàn toàn không thay đổi phần tích chập, nên số lượng số được nhập vào bộ phân loại phải giống với bộ phân loại mặc định của mô hình.

Tiếp theo, ta xác định số lượng đầu ra. Con số này phải phù hợp với số lượng loại hình ảnh ta có. Mô hình sẽ cung cấp một danh sách các tỷ lệ phần trăm, mỗi tỷ lệ tương ứng với mức độ chắc chắn của hình ảnh đối với nhãn đó. 

Khi có những thông tin chi tiết đó, sử dụng thư viện torch.nn để tạo bộ phân loại. 

  • nn.Sequential có thể giúp nhóm nhiều module lại với nhau.
  • nn.Linear chỉ định sự tương tác giữa hai lớp. Ta cung cấp cho nó 2 số, chỉ định số lượng nút trong hai lớp. Ví dụ: trong nn.Linear đầu tiên, lớp đầu tiên là lớp đầu vào và ta có thể chọn bao nhiêu số ta muốn trong lớp thứ hai.
  • nn.ReLU là chức năng kích hoạt cho các lớp ẩn. Các chức năng kích hoạt giúp mô hình tìm hiểu các mối quan hệ phức tạp giữa đầu vào và đầu ra. Ta sử dụng ReLU trên tất cả các lớp ngoại trừ đầu ra.

Tiến hành lặp lại điều này cho bao nhiêu lớp ẩn tùy thích, với bao nhiêu nút tùy thích trong mỗi lớp.

  • nn.LogSoftmax là chức năng kích hoạt cho đầu ra. Hàm softmax biến các số xuất ra thành tỷ lệ phần trăm cho mỗi nhãn và hàm log được áp dụng để giúp tính toán nhanh hơn.

Sau khi tạo bộ phân loại của riêng mình, ta thay thế bộ phân loại mặc định của mô hình.

Bước 5: Đào tạo và đánh giá mô hình

Đào tạo một mô hình trên GPU nhanh hơn rất nhiều so với CPU. Vì vậy, để xác định thiết bị nào có sẵn cho bạn, sử dụng Torch để kiểm tra. Nếu có GPU tương thích, ta đặt biến thành GPU, nếu không, nó gắn với CPU. Sau đó, ta chuyển mô hình của mình sang thiết bị này.

Trong khi đào tạo, ta cần xác định khả năng học của mô hình. Để đánh giá mức độ lỗi mà mô hình mắc phải, ta sử dụng nn.NLLLoss. Hàm này nhận đầu ra của mô hình mà ta đã sử dụng hàm nn.LogSoftmax.

Để đào tạo mô hình, cần chấp nhận lỗi và xem cách ta có thể điều chỉnh các trọng số đã nhân với các số của mình để có được lỗi nhỏ nhất. Phương pháp tính toán cách điều chỉnh trọng số và áp dụng nó cho trọng số trong mô hình được lấy ví dụ là Adam. Sử dụng thư viện torch.optim để áp dụng phương thức này và cung cấp cho nó các tham số.

Bây giờ ta tiến hành đào tạo. Để mô hình duyệt qua toàn bộ tập dữ liệu nhiều lần, sử dụng vòng lặp for. Mỗi lần quét qua toàn bộ tập hợp các hình ảnh được gọi là một epoch. Trong một epoch, mô hình trải qua cả tập đào tạo và tập đánh giá.

Bắt đầu với tập huấn luyện.

Trước tiên, đặt mô hình ở chế độ đào tạo và sử dụng for loop để duyệt qua mọi hình ảnh.

Sau đó, ta có thể tính toán đầu ra của mô hình dựa trên hình ảnh đầu vào và tính độ lỗi giữa kết quả dự đoán của mô hình và nhãn dữ liệu.

Tiếp theo, ta áp dụng các điều chỉnh cần thực hiện để giảm lỗi này bằng cách gọi hàm loss.backward() và sử dụng trình tối ưu hóa để điều chỉnh trọng số bằng cách gọi optimizer.step().

Khi đào tạo, theo dõi tổng số lỗi mà ta đã tính toán và in ra tiến trình đào tạo.

Tiếp tục với bộ đánh giá

Đặt mô hình ở chế độ đánh giá và sử dụng for loop để lặp lại tất cả các hình ảnh trong bộ dữ liệu.

Lặp lại các bước đã thực hiện cho tập huấn luyện để lấy đầu ra của mô hình và mức độ sai lệch của mô hình so với nhãn thực.

Mô hình đã sử dụng hàm LogSoftmax để tăng tốc độ tính toán, nhưng bây giờ ta muốn tỷ lệ phần trăm thực chứ không phải tỷ lệ phần trăm log. Vì vậy, sử dụng torch.exp để đảo ngược chức năng log. Sau đó, để xem mô hình đã đoán lớp nào cho hình ảnh, .topk cung cấp thông tin về lớp hàng đầu đã được đoán và tỷ lệ phần trăm mà nó đoán được.

Để xác định xem nó đoán đúng bao nhiêu hình, ta kiểm tra xem lớp đoán nào bằng lớp thực. Sau đó, có thể lấy trung bình trên toàn bộ lượt để xác định độ chính xác của mô hình (có bao nhiêu hình ảnh mô hình đoán đúng trên tổng số lượng hình ảnh).

Bước 6: Sử dụng mô hình trên thực tế 

Sau khi xây dựng một bộ phân loại hình ảnh AI, ta muốn thực sự sử dụng nó – cung cấp cho mô hình một hình ảnh ngẫu nhiên và xem mô hình cho đó là nhãn nào.

Đầu tiên, ta thiết lập mô hình cho chế độ đánh giá.

Sau đó, tạo một chức năng xử lý hình ảnh để có thể nhập nó vào mô hình.

Ta mở hình ảnh, thay đổi kích thước bằng cách giữ nguyên tỷ lệ khung hình nhưng chỉ tạo cạnh ngắn nhất 255 px và cắt phần giữa 224px x 224px. Sau đó, chuyển ảnh thành một mảng và đảm bảo rằng số lượng kênh màu là thứ nguyên đầu tiên thay vì thứ nguyên cuối cùng bằng cách hoán vị mảng. Tiếp theo, chuyển đổi từng giá trị từ 0 đến 1 bằng cách chia cho 255. Sau đó, chuẩn hóa các giá trị bằng cách trừ đi giá trị trung bình và chia cho độ lệch chuẩn. Cuối cùng, chuyển đổi mảng thành một tensor Torch và chuyển đổi các giá trị thành float.

Các bước này giống như các bước đã chỉ định trong Bước 2, nhưng lần này ta phải viết code các lệnh theo cách thủ công thay vì dựa vào thư viện biến đổi (transforms library).

Sau khi xử lý hình ảnh, ta có thể xây dựng một hàm để sử dụng mô hình của mình nhằm  dự đoán nhãn: nhập hình ảnh vào mô hình và thu được đầu ra. Sau đó, ta đảo ngược log trong hàm LogSoftmax đã áp dụng trong lớp đầu ra và trả về lớp trên cùng mà mô hình đã dự đoán và mức độ chắc chắn của nó đối với dự đoán đó.

Cuối cùng, để hiển thị hình ảnh, ta biến hình ảnh trở lại thành một mảng và hủy chuẩn hóa bằng cách nhân với độ lệch chuẩn và cộng lại giá trị trung bình. Sau đó, sử dụng thư viện matplotlib.pyplot để vẽ sơ đồ hình ảnh.

Giờ đây, ta đã có thể sử dụng mô hình trên thực tế nhằm nhận dạng hình ảnh.

Bài viết liên quan

    Cảm ơn bạn đã quan tâm và ủng hộ.

    File hiện tại không thể tải xuống
    Vui lòng liên hệ hỗ trợ.

    VinOCR eKYC

    Chọn ảnh từ máy của bạn

    Chọn ảnh demo dưới đây hoặc tải ảnh lên từ máy của bạn

    Tải lên ảnh CMND/CCCD/Hộ chiếu,...

    your image
    Chọn ảnh khác
    Tiến hành xử lý

    Thông tin đã được xử lý

    Mức độ tin cậy: 0%

    • -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    • -

    Xác thực thông tin thẻ CMND/CCCD

    Vui lòng sử dụng giấy tờ thật. Hãy đảm bảo ảnh chụp không bị mờ hoặc bóng, thông tin hiển thị rõ ràng, dễ đọc.

    your image
    Chọn ảnh khác

    Ảnh mặt trước CMND/CCCD

    your image
    Chọn ảnh khác

    Ảnh mặt sau CMND/CCCD

    your image
    Chọn ảnh khác

    Ảnh chân dung

    This site is registered on wpml.org as a development site.