Các mô hình tầm nhìn dựa trên Tranformer đang dần phát triển và được báo cáo là tốt như các mô hình Hợp lệ về các nhiệm vụ Phân loại, Phân đoạn và Nhận biết hành động. Chúng tôi có toàn bộ một loạt các mô hình Chuyển đổi cho các nhiệm vụ tầm nhìn và phổ biến hơn các mô hình dựa trên Biến áp. Blog này đi sâu vào mô hình SWin Transformer Vision đã được trình bày trong Hội nghị Quốc tế về Thị giác Máy tính (ICCV) năm 2021 bởi Nhóm Nghiên cứu của Microsoft. Nó đánh giá hiệu suất của mình so với một số mô hình dựa trên SOTA Convolution trong nhiệm vụ Phân loại hình ảnh giống chó.
Liệu các mô hình dựa trên máy biến áp có trở thành điều lớn tiếp theo trong Computer Vision? Với việc máy biến áp là một giải pháp thành công cho các tác vụ ngôn ngữ, liệu nó có hợp nhất các trường con AI khác nhau và đưa ra các giải pháp mạnh mẽ cho các vấn đề phức tạp hơn không? Vì vậy, hãy xắn tay áo của tôi để đánh giá mức độ tốt của họ trong nhiệm vụ phân loại bắt đầu.
Vô số giống chó với những thay đổi tinh tế về ngoại hình đã là một thách thức đối với bác sĩ thú y, chủ sở hữu chó, nhân viên trại động vật và những người nuôi chó tiềm năng trong việc xác định đúng giống chó của họ. Họ cần xác định giống chó để đưa ra cách huấn luyện, điều trị thích hợp và đáp ứng nhu cầu dinh dưỡng của chúng. Dữ liệu được lấy từ Tập dữ liệu về chó Stanford chứa ~ 20K hình ảnh về 120 giống chó trên khắp thế giới. Dữ liệu này đã được chia gần như bằng nhau thành tập huấn luyện và thử nghiệm cho Nhận dạng giống chó cạnh tranh Kaggle.
Mục tiêu của giải pháp là xây dựng một hệ thống nhận dạng giống chó có khả năng xác định chính xác các giống chó với dữ liệu tối thiểu và xác định đúng các giống chó trông giống nhau. Đây là một nhiệm vụ phân loại nhiều lớp và đối với mọi hình ảnh, mô hình phải dự đoán xác suất cho tất cả 120 giống. Con có xác suất cao nhất là giống chó có khả năng xảy ra cao nhất trong ảnh.
Mặc dù không có sự mất cân bằng về lớp, nhưng dữ liệu có thể không đủ để huấn luyện mạng nơ-ron. Tăng cường hình ảnh bằng cách sử dụng nhiễu ảnh ngẫu nhiên và các mô hình được đào tạo trước sẽ có thể giải quyết vấn đề này.
Top 5 giống chó có nhiều hình ảnh nhất là scottish_deerhound, maltese_dog, afghan_hound, entlebucher và bernese_mountain_dog. 5 giống chó dưới cùng có ít hình ảnh nhất là golden_retriever, brabancon_griffon, komondor, eskimo_dog và briard.
Một phân tích nhanh về kích thước không gian của hình ảnh đào tạo được thực hiện để hiểu sự phân bố của chiều cao, chiều rộng hình ảnh và tỷ lệ khung hình của chúng.
Hình ảnh có tỷ lệ khung hình rất thấp (<0,5) và rất cao (> 2,3) được coi là hình ảnh dị thường. 1,5 được coi là một tỷ lệ khung hình tốt.
Khi phân tích các giống chó khác nhau, các cặp giống chó dưới đây thường được tìm thấy trông giống nhau.
Kiến trúc này dựa trên “Swin Transformer: Hierarchical Vision Transformer sử dụng Windows Shifted” do Nhóm Nghiên cứu của Microsoft phát triển. Bài báo này thảo luận về một kiến trúc ViT được cải tiến tạo ra một biểu diễn phân cấp của các bản đồ đối tượng địa lý làm giảm độ phức tạp tính toán của cơ chế tự chú ý từ bậc hai sang tuyến tính. Nó được chứng minh là cho kết quả giống hệt như các Mạng SOTA Convolution như EfficientNet về vấn đề phân loại Imagenet.
Các khối xây dựng của kiến trúc này được giải thích trong các ghi chú dưới đây:
Trong NLP, các mã thông báo là các yếu tố xử lý của một mô hình, là các từ trong một câu mà kích thước của 1 mã thông báo là 1 (chỉ 1 từ). ViT ( Vi sion T ransformers) coi “các bản vá hình ảnh” như các mã thông báo trong đó mỗi bản vá là một phân vùng của hình ảnh bao gồm một nhóm các pixel lân cận. Mỗi bản vá hình ảnh là một mã thông báo. Kích thước của 1 mã thông báo trong bất kỳ ViT nào là patch_height * patch_width * số kênh. Dựa trên kích thước bản vá, chúng tôi nhận được một số bản vá hoặc mã thông báo cho một hình ảnh duy nhất. Nếu kích thước hình ảnh (H * W * 3) là 224 * 224 * 3 pixel và kích thước bản vá là 4 * 4, thì chúng tôi nhận được 224/4 * 224/4 = 56 * 56 bản vá hoặc 3136 mã thông báo từ hình ảnh. Mỗi mã thông báo hoặc bản vá sẽ có kích thước 4 * 4 * 3 = 48 kích thước hoặc 48 pixel dữ liệu. Vì vậy, đầu vào cho kiến trúc cho hình ảnh này bao gồm 3136 mã thông báo mỗi mã có kích thước 48 chiều.
Cơ chế cơ bản của biến áp SWIN tương tự như bất kỳ kiến trúc dựa trên CNN nào trong đó kích thước không gian của hình ảnh bị giảm và số lượng kênh được tăng lên. Biến áp SWIN ở mọi giai đoạn trong kiến trúc phân cấp, cũng làm giảm số lượng các bản vá hình ảnh hoặc số lượng mã thông báo trong khi tăng kích thước mã thông báo. Với cơ chế này, bạn sẽ dễ dàng hiểu được kiến trúc SWIN một cách dễ dàng hơn.
Ở mọi giai đoạn của kiến trúc, chúng ta có thể thấy số lượng mã thông báo giảm xuống trong khi kích thước mã thông báo tăng lên.
Kiến trúc SWIN-T, ngoài “ Patch Partitioner”, còn được tạo thành từ 3 khối xây dựng khác - Nhúng tuyến tính, Khối biến áp Swin, Hợp nhất bản vá. Các khối xây dựng này được lặp lại và nó xử lý các bản đồ tính năng theo kiểu phân cấp.
3136 mã thông báo mỗi chiều 48 từ “Patch Partitioner” được đưa vào một lớp chuyển tiếp nguồn cấp dữ liệu để nhúng mã thông báo của vectơ đặc trưng 48 vào một vectơ đặc trưng có kích thước 'C'. 'C' ở đây đóng vai trò là công suất của máy biến áp và kiến trúc SWIN có 4 biến thể dựa trên nó.
Việc vá hình ảnh và nhúng tuyến tính được thực hiện cùng nhau trong một phép chập duy nhất có kích thước hạt nhân và độ dài sải chân giống với kích thước bản vá. Số kênh trong tập hợp sẽ là 'C'.
Khối biến áp SWin khác với khối biến áp tiêu chuẩn trong kiến trúc ViT. Trong SWin Transformers,
Giai đoạn 1 bao gồm 2 Khối biến áp SWIN-T (tham khảo hình ảnh) trong đó Khối biến áp đầu tiên có Window MSA (W-MSA) và Khối biến áp thứ hai có mô-đun Dịch chuyển Window MSA (SW-MSA). Trong Khối Biến áp SWin, các đầu vào và đầu ra của các lớp W-MSA và SW-MSA được chuyển qua các Lớp chuẩn hóa. Sau đó, nó phải chịu một Mạng chuyển tiếp nguồn cấp dữ liệu 2 lớp với kích hoạt Đơn vị tuyến tính lỗi Gaussian (GELU). Có các kết nối dư trong mỗi khối và giữa 2 khối này.
Mô-đun Window MSA (W-MSA) và Shifted Window MSA (SW-MSA)
Lớp chú ý tiêu chuẩn trong ViT là lớp toàn cục tính toán sự chú ý của một bản vá với tất cả các bản vá khác trong hình ảnh, do đó dẫn đến độ phức tạp bậc hai tỷ lệ với kích thước hình ảnh. Điều này không hiệu quả lắm đối với hình ảnh có độ phân giải cao.
Cơ chế tự chú ý trong mô-đun W-MSA hoặc SW-MSA là một cơ chế cục bộ chỉ tính toán khả năng tự chú ý giữa các bản vá trong cùng một cửa sổ của hình ảnh chứ không phải bên ngoài cửa sổ.
Windows giống như các phân vùng lớn hơn của hình ảnh trong đó mỗi cửa sổ bao gồm các bản vá M * M. Việc thay thế sự chú ý toàn cục bằng sự chú ý cục bộ đã làm giảm độ phức tạp tính toán từ bậc hai xuống tuyến tính.
Sự khác biệt chính giữa mô-đun chú ý W-MSA và SW-MSA là ở cách cấu hình các cửa sổ cho hình ảnh.
Trong mô-đun W-MSA, một chiến lược phân vùng cửa sổ thông thường được tuân theo. Hình ảnh được phân chia đều thành các cửa sổ không chồng chéo bắt đầu từ pixel trên cùng bên trái của hình ảnh và mỗi cửa sổ chứa các bản vá M * M hoặc M2.
Trong mô-đun SW-MSA, cấu hình cửa sổ được chuyển từ cấu hình của lớp W-MSA, bằng cách dịch chuyển các cửa sổ bằng (M / 2, M / 2) các bản vá từ chiến lược phân vùng thông thường.
Vì sự chú ý bị hạn chế cục bộ trong một cửa sổ trong W-MSA, cửa sổ được dịch chuyển cho phép sự chú ý qua nhiều cửa sổ vẫn mang lại lợi ích của sự chú ý toàn cầu. Điều này có thể thực hiện được vì các ranh giới của window1 trong lớp W-MSA được chia sẻ với các cửa sổ W2, W4 và W5 trong lớp SW-MSA. Do đó, sự chú ý toàn cầu xảy ra gián tiếp thông qua "sự chú ý của địa phương trên các cửa sổ được thay đổi".
Lớp Patch Merging giảm số lượng mã thông báo khi mạng ngày càng sâu hơn. Lớp hợp nhất bản vá đầu tiên nối các tính năng của mỗi nhóm các bản vá 2 × 2 lân cận.
Gói tfswin trong PyPI đã đào tạo trước các biến thể TF-Keras của Máy biến áp SWIN và được xây dựng dựa trên việc triển khai pytorch chính thức . Mã của nó có sẵn trong github . tfswin được sử dụng để huấn luyện hình ảnh giống chó.
from tfswin import SwinTransformerBase224, preprocess_input def build_model1(swintransformer): tf.keras.backend.clear_session() inputs = Input(shape=(resize_height, resize_width, 3)) outputs = Lambda(preprocess_input)(inputs) outputs = swintransformer(outputs) outputs = Dense(num_classes, activation='softmax')(outputs) swin_model = Model(inputs=inputs, outputs=outputs) return swin_model #build the model swintransformer = SwinTransformerBase224(include_top=False,pooling='avg') swin_model1 = build_model1(swintransformer) #set the layers of the pretrained model as non-trainable for layer in swin_model1.layers[2].layers: layer.trainable = False swin_model1.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),loss='categorical_crossentropy',metrics=['accuracy'])
#Logloss of the test set using various ResNet variants +------------+---------------+-------------------------+----------+ | Model Name | Retrained | Top Layers Replacement | Log_Loss | +------------+---------------+-------------------------+----------+ | ResNet50 | None | ConvBlock_FC_Output | 0.96463 | | ResNet50 | None | GlobalAvgPooling_Output | 0.58147 | | ResNet50 | last 4 layers | ConvBlock_FC_Output | 2.10158 | | ResNet50 | last 4 layers | GlobalAvgPooling_Output | 0.57019 | +------------+---------------+-------------------------+----------+
Mã tương ứng với mô hình ResNet50 với ít mất nhật ký nhất
from tensorflow.keras.layers import Input,Conv2D,Dense,BatchNormalization,Flatten,Concatenate, Dropout,MaxPooling2D from tensorflow.keras.models import Model from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input def build_model(): tf.keras.backend.clear_session() inputs = Input(shape=(resize_height, resize_width, 3)) #added preprocess_input method as a layer to convert input images to those expected by Resnet processed_inputs = preprocess_input(inputs) #use the pretrained ResNet model (Parameter pooling = 'avg' will take care of the Gobal Average Pooling of the ResNet model features) base_model = ResNet50(weights="imagenet", include_top=False,pooling='avg')(processed_inputs) #output layer output = Dense(units=num_classes,activation='softmax',name='Output')(base_model) resnet_model = Model(inputs=inputs, outputs=output) return resnet_model #build the model resnet_model = build_model() #set the layers of the resnet pretrained model as non-trainable except for its last 4 layers which needs to be re-trained for this data for layer in resnet_model.layers[3].layers[:-4]: layer.trainable = False #compile the model resnet_model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),loss='categorical_crossentropy',metrics=['accuracy']) print(resnet_model.summary()) history = resnet_model.fit(train_ds, epochs=50, validation_data=val_ds, callbacks=callbacks_list)
#Logloss of the standalone model variants +----------------------------+-------------+ | Model Name | Log_Loss | +----------------------------+-------------+ | EfficientNetV2M | 0.28347 | | Inception ResNet | 0.28623 | | NasNetLarge | 0.33285 | | Xception | 0.34187 | | Inception_V3 | 0.54297 | | EfficientNetV2M_GlobalAveg | 0.50423 | | InceptionV3_GlobalAveg | 0.46402 | +----------------------------+-------------+
+--------------------------------------------------------------------------+-----------+ | Model Name | Log_Loss | +--------------------------------------------------------------------------+-----------+ | Ensemble1 - EfficientNEt,InceptionResNet,NasNet,Xception) | 0.17363 | | Ensemble2 - EfficientNEt,InceptionResNet,NasNet,Xception and InceptionV3 | 0.16914 | | Ensemble3 - Ensemble2 with 50% dropout. | 0.16678 | | Ensemble4 - Ensemble of various EfficientNet Architecture | 0.16519 | +--------------------------------------------------------------------------+-----------+
Each of these models accepts varied input formats and in Keras they have their own preprocessing functions.
Kết quả đo điểm chuẩn
+----------------------------------+------------+----------------------+----------+ | Model Name | Parameters | Train time (seconds) | Log_Loss | +----------------------------------+------------+----------------------+----------+ | EfficientNet_ConvBlock_Output | 54.7M | ~260s | 0.28347 | | InceptionResNet_ConvBlock_Output | 56.1M | ~260s | 0.28623 | | NASNetLarge_ConvBlock_Output | 89.6M | ~330s | 0.33285 | | XCeption_ConvBlock_Output | 23.3M | ~240s | 0.34187 | | InceptionV3_ConvBlock_Output | 24.2M | ~225s | 0.54297 | | EfficientNet_GlobalAvg | 53.3M | ~260s | 0.50423 | | InceptionV3_GlobalAvg | 22M | ~215s | 0.46402 | | swin_base224 | 86.8M | ~550s | 0.47289 | | swin_base384 | 87M | ~600s | 0.41902 | | swin_large384 | 195M | ~1000s | 0.42207 | +----------------------------------+------------+----------------------+----------+
SWIN Transformers đã hoạt động tốt hơn tất cả các biến thể ResNet50 và mô hình InceptionV3.
Log-Loss của SWIN Transformer trên dữ liệu này cao hơn một chút so với các mô hình InceptionResNet, EfficientNet, Xception và NasNet Large khi kết quả đầu ra của chúng được xử lý sau đó bởi lớp phức hợp tiếp theo là Maxpooling.
Tuy nhiên, SWIN hoạt động tốt như mô hình EfficientNet khi kết quả đầu ra trung bình của chúng được xử lý trực tiếp bởi lớp đầu ra.
Các mô hình SWIN lớn hơn so với bất kỳ mô hình Convol Hiến nào và do đó sẽ ảnh hưởng đến thông lượng và độ trễ của hệ thống.
Nghiên cứu này tỏ ra hữu ích trong việc hiểu ứng dụng của các mô hình dựa trên máy biến áp cho thị giác máy tính.
Bạn có thể tìm thấy mã cho sổ ghi chép trên Github của tôi và GUI cho tiện ích này tại đây.
https://www.kaggle.com/competitions/dog-breed-identification
https://arxiv.org/pdf/2103.14030.pdf