1.1 Fine-tuning là gì ?

Chắc hẳn các ai làm việc với các mã sản phẩm vào deep learning gần như đang nghe/quen thuộc với định nghĩa Transfer learning cùng Fine tuning. Khái niệm tổng quát: Transfer learning là tận dụng tối đa học thức học tập được từ là một vụ việc nhằm vận dụng vào 1 vấn đề bao gồm tương quan khác. Một ví dụ đơn giản: chũm bởi train 1 mã sản phẩm new trọn vẹn cho bài xích tân oán phân nhiều loại chó/mèo, tín đồ ta hoàn toàn có thể tận dụng 1 mã sản phẩm đã được train vào ImageNet dataset với hằng triệu hình ảnh. Pre-trained model này sẽ được train tiếp bên trên tập dataset chó/mèo, quy trình train này ra mắt nkhô giòn rộng, kết quả thường xuyên giỏi rộng. Có tương đối nhiều giao diện Transfer learning, những chúng ta cũng có thể tham khảo vào bài bác này: Tổng vừa lòng Transfer learning. Trong bài này, bản thân đang viết về 1 dạng transfer learning phổ biến: Fine-tuning.

Bạn đang xem: Fine tune là gì

Đang xem: Fine tuning là gì

Hiểu đơn giản, fine-tuning là bạn đem 1 pre-trained Mã Sản Phẩm, tận dụng tối đa một trong những phần hoặc tổng thể những layer, thêm/sửa/xoá 1 vài layer/nhánh để tạo thành 1 model new. Thường các layer đầu của Mã Sản Phẩm được freeze (đóng góp băng) lại – tức weight những layer này sẽ không xẩy ra biến hóa quý giá trong quá trình train. Lý vì vày những layer này đã có khả năng trích xuất biết tin nút trìu tượng phải chăng , tài năng này được học tự quá trình training trước kia. Ta freeze lại nhằm tận dụng tối đa được kĩ năng này cùng giúp câu hỏi train diễn ra nhanh hao rộng (model chỉ nên update weight ngơi nghỉ các layer cao). Có rất nhiều những Object detect mã sản phẩm được xuất bản dựa trên những Classifier mã sản phẩm. VD Retina model (Object detect) được kiến tạo với backbone là Resnet.

*

1.2 Tại sao pytorch vậy vì chưng Keras ?

Chủ đề nội dung bài viết hôm nay, bản thân vẫn lý giải fine-tuning Resnet50 – 1 pre-trained mã sản phẩm được hỗ trợ sẵn vào torchvision của pytorch. Tại sao là pytorch mà lại chưa hẳn Keras ? Lý vì chưng vì Việc fine-tuning Mã Sản Phẩm trong keras rất đơn giản và dễ dàng. Dưới đó là 1 đoạn code minch hoạ cho Việc xuất bản 1 Unet dựa trên Resnet vào Keras:

from tensorflow.keras import applicationsresnet = applications.resnet50.ResNet50()layer_3 = resnet.get_layer(“activation_9”).outputlayer_7 = resnet.get_layer(“activation_21”).outputlayer_13 = resnet.get_layer(“activation_39”).outputlayer_16 = resnet.get_layer(“activation_48”).output#Adding outputs decoder with encoder layersfcn1 = Conv2D(…)(layer_16)fcn2 = Conv2DTranspose(…)(fcn1)fcn2_skip_connected = Add()()fcn3 = Conv2DTranspose(…)(fcn2_skip_connected)fcn3_skip_connected = Add()()fcn4 = Conv2DTranspose(…)(fcn3_skip_connected)fcn4_skip_connected = Add()()fcn5 = Conv2DTranspose(…)(fcn4_skip_connected)Unet = Model(inputs = resnet.đầu vào, outputs=fcn5)Quý khách hàng rất có thể thấy, fine-tuning model trong Keras thực thụ khôn cùng đơn giản dễ dàng, dễ làm, dễ hiểu. Việc add thêm những nhánh rất đơn giản vị cú pháp đơn giản và dễ dàng. Trong pytorch thì trở lại, xây dừng 1 model Unet tương tự sẽ rất vất vả với tinh vi. Người new học sẽ chạm mặt khó khăn vì chưng trên mạng rất ít các gợi ý mang lại bài toán này. Vậy nên bài này mình đã gợi ý cụ thể phương pháp fine-tune vào pytorch để áp dụng vào bài xích toán Visual Saliency prediction

2. Visual Saliency prediction

2.1 What is Visual Saliency ?

*

lúc nhìn vào 1 bức ảnh, mắt thường sẽ có xu hướng tập trung nhìn vào 1 vài công ty bao gồm. Ảnh trên đó là 1 minh hoạ, màu rubi được thực hiện nhằm bộc lộ mức độ nóng bỏng. Saliency prediction là bài xích tân oán mô bỏng sự tập trung của mắt bạn Khi quan liêu gần kề 1 tấm hình. Cụ thể, bài xích toán thù yên cầu xuất bản 1 Model, Model này dìm hình họa nguồn vào, trả về 1 mask tế bào bỏng mức độ ham. vì vậy, model nhấn vào 1 input image và trả về 1 mask bao gồm form size tương tự.

Để rõ rộng về bài tân oán này, chúng ta có thể đọc bài: Visual Saliency Prediction with Contextual Encoder-Decoder Network.Dataphối thịnh hành nhất: SALICON DATASET

2.2 Unet

Note: Quý khách hàng rất có thể làm lơ phần này ví như sẽ biết về Unet

Đây là 1 trong bài bác toán Image-to-Image. Để giải quyết bài xích toán này, mình sẽ xây dựng 1 Model theo phong cách thiết kế Unet. Unet là một trong những kiến trúc được thực hiện nhiều vào bài bác toán thù Image-to-image như: semantic segmentation, auto color, super resolution … Kiến trúc của Unet tất cả điểm tương tự cùng với phong cách thiết kế Encoder-Decoder đối xứng, đạt thêm các skip connection từ Encode sang Decode tương ứng. Về cơ bản, các layer càng tốt càng trích xuất lên tiếng ở tại mức trìu tượng cao, điều đó đồng nghĩa với câu hỏi những thông tin nút trìu tượng phải chăng nhỏng đường đường nét, màu sắc, độ phân giải… sẽ ảnh hưởng mất non đi vào quy trình Viral. Người ta thêm những skip-connection vào để xử lý vấn đề này.

Với phần Encode, feature-maps được downscale bằng những Convolution. trái lại, ở vị trí decode, feature-maps được upscale do các Upsampling layer, trong bài xích này mình sử dụng các Convolution Transpose.

*

2.3 Resnet

Để giải quyết bài toán thù, bản thân sẽ xây dựng Model Unet với backbone là Resnet50. quý khách hàng cần khám phá về Resnet nếu như chưa chắc chắn về kiến trúc này. Hãy quan tiền gần cạnh hình minh hoạ dưới đây. Resnet50 được phân thành các kân hận mập . Unet được gây ra cùng với Encoder là Resnet50. Ta sẽ lôi ra output của từng khối, chế tác các skip-connection kết nối từ bỏ Encoder sang trọng Decoder. Decoder được desgin vì chưng các Convolution Transpose layer (xen kẽ trong những số đó là những lớp Convolution nhằm mục tiêu sút số chanel của feature maps -> giảm số lượng weight cho model).

Theo quan điểm cá nhân, pytorch rất dễ code, dễ dàng nắm bắt rộng không ít so với Tensorflow 1.x hoặc ngang ngửa Keras. Tuy nhiên, Việc fine-tuning model trong pytorch lại nặng nề hơn tương đối nhiều so với Keras. Trong Keras, ta ko buộc phải vượt quan tâm cho tới bản vẽ xây dựng, luồng cách xử trí của Mã Sản Phẩm, chỉ việc lôi ra những output tại 1 số ít layer nhất định có tác dụng skip-connection, ghxay nối và tạo ra Mã Sản Phẩm bắt đầu.

*

Trong pytorch thì trở lại, bạn cần hiểu được luồng cách xử lý cùng copy code số đông layer mong muốn gìn giữ trong mã sản phẩm bắt đầu. Hình trên là code của resnet50 vào torchvision. quý khách rất có thể xem thêm link: torchvision-resnet50. Bởi vậy lúc tạo Unet nlỗi kiến trúc đã biểu hiện trên, ta phải bảo đảm an toàn đoạn code tự Conv1 -> Layer4 không xẩy ra biến hóa. Hãy hiểu phần tiếp theo sau để hiểu rõ hơn.

Xem thêm: Hướng Dẫn Download, Cài Đặt Và Crack Sketchup 2015 + Vray + Plugins Full

3. Code

Tất cả code của bản thân được đóng gói trong tệp tin notebook Salicon_main.ipynb. Quý khách hàng hoàn toàn có thể tải về và run code theo links github: github/trungthanhnguyen0502 . Trong nội dung bài viết mình sẽ chỉ giới thiệu hầu hết đoạn code chủ yếu.

Import các package

import albumentations as Aimport numpy as npimport torchimport torchvisionimport torch.nn as nn import torchvision.transforms as Timport torchvision.models as modelsfrom torch.utils.data import DataLoader, Datasetimport ….

3.1 utils functions

Trong pytorch, dữ liệu bao gồm thiết bị tự dimension không giống với Keras/TF/numpy. Thông thường với numpy tốt keras, ảnh có dimension theo lắp thêm tự (batchform size,h,w,chanel)(batchform size, h, w, chanel)(batchsize,h,w,chanel). Thứ trường đoản cú trong Pytorch trở lại là (batchform size,chanel,h,w)(batchsize, chanel, h, w)(batchsize,chanel,h,w). Mình sẽ xây dựng dựng 2 hàm toTensor với toNumpy để biến hóa hỗ tương thân nhì format này.

def toTensor(np_array, axis=(2,0,1)): return torch.tensor(np_array).permute(axis)def toNumpy(tensor, axis=(1,2,0)): return tensor.detach().cpu().permute(axis).numpy() ## display one image in notebookdef plot_img(img): … ## display multi imagedef plot_imgs(imgs): …

3.2 Define model

3.2.1 Conv và Deconv

Mình sẽ xây dựng dựng 2 function trả về module Convolution và Convolution Transpose (Deconv)

def Deconv(n_input, n_output, k_size=4, stride=2, padding=1): Tconv = nn.ConvTranspose2d( n_input đầu vào, n_output, kernel_size=k_kích cỡ, stride=stride, padding=padding, bias=False) bloông xã = return nn.Sequential(*block) def Conv(n_input đầu vào, n_output, k_size=4, stride=2, padding=0, bn=False, dropout=0): conv = nn.Conv2d( n_input, n_output, kernel_size=k_kích cỡ, stride=stride, padding=padding, bias=False) bloông xã = return nn.Sequential(*block)

3.2.2 Unet model

Init function: ta sẽ copy các layer bắt buộc giữ lại từ bỏ resnet50 vào unet. Sau đó khởi sản xuất các Conv / Deconv layer cùng các layer cần thiết.

Forward function: phải bảo đảm luồng xử lý của resnet50 được giữ nguyên như là code nơi bắt đầu (trừ Fully-connected layer). Sau kia ta ghép nối các layer lại theo phong cách xây dựng Unet đang biểu thị trong phần 2.

Tạo model: phải load resnet50 và truyền vào Unet. Đừng quên Freeze các layer của resnet50 trong Unet.

Xem thêm: Chứng Chỉ Tiếng Anh Aptis Là Gì ? Bài Thi Tiếng Anh Aptis Của Hội Đồng Anh

class Unet(nn.Module): def __init__(self, resnet): super().__init__() self.conv1 = resnet.conv1 self.bn1 = resnet.bn1 self.relu = resnet.relu self.maxpool = resnet.maxpool self.tanh = nn.Tanh() self.sigmoid = nn.Sigmoid() # get some layer from resnet to lớn make skip connection self.layer1 = resnet.layer1 self.layer2 = resnet.layer2 self.layer3 = resnet.layer3 self.layer4 = resnet.layer4 # convolution layer, use to reduce the number of channel => reduce weight number self.conv_5 = Conv(2048, 512, 1, 1, 0) self.conv_4 = Conv(1536, 512, 1, 1, 0) self.conv_3 = Conv(768, 256, 1, 1, 0) self.conv_2 = Conv(384, 128, 1, 1, 0) self.conv_1 = Conv(128, 64, 1, 1, 0) self.conv_0 = Conv(32, 1, 3, 1, 1) # deconvolution layer self.deconv4 = Deconv(512, 512, 4, 2, 1) self.deconv3 = Deconv(512, 256, 4, 2, 1) self.deconv2 = Deconv(256, 128, 4, 2, 1) self.deconv1 = Deconv(128, 64, 4, 2, 1) self.deconv0 = Deconv(64, 32, 4, 2, 1) def forward(self, x): x = self.conv1(x) x = self.bn1(x) x = self.relu(x) skip_1 = x x = self.maxpool(x) x = self.layer1(x) skip_2 = x x = self.layer2(x) skip_3 = x x = self.layer3(x) skip_4 = x x5 = self.layer4(x) x5 = self.conv_5(x5) x4 = self.deconv4(x5) x4 = torch.cat(, dim=1) x4 = self.conv_4(x4) x3 = self.deconv3(x4) x3 = torch.cat(, dim=1) x3 = self.conv_3(x3) x2 = self.deconv2(x3) x2 = torch.cat(, dim=1) x2 = self.conv_2(x2) x1 = self.deconv1(x2) x1 = torch.cat(, dim=1) x1 = self.conv_1(x1) x0 = self.deconv0(x1) x0 = self.conv_0(x0) x0 = self.sigmoid(x0) return x0 device = torch.device(“cuda”)resnet50 = models.resnet50(pretrained=True)Model = Unet(resnet50)Mã Sản Phẩm.to(device)## Freeze resnet50″s layers in Unetfor i, child in enumerate(Model.children()): if i 7: for param in child.parameters(): param.requires_grad = False

3.3 Datamix và Dataloader

Dataset trả dấn 1 list các image_path với mask_dir, trả về image với mask tương ứng.

Define MaskDataset

class MaskDataset(Dataset): def __init__(self, img_fns, mask_dir, transforms=None): self.img_fns = img_fns self.transforms = transforms self.mask_dir = mask_dir def __getitem__(self, idx): img_path = self.img_fns img_name = img_path.split(“/”).split(“.”) mask_fn = f”self.mask_dir/img_name.png” img = cv2.imread(img_path) mask = cv2.imread(mask_fn) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY) if self.transforms: sample = “image”: img, “mask”: mask sample = self.transforms(**sample) img = sample mask = sample # lớn Tensor img = img/255.0 mask = np.expand_dims(mask, axis=-1)/255.0 mask = toTensor(mask).float() img = toTensor(img).float() return img, mask def __len__(self): return len(self.img_fns)Test dataset

img_fns = glob(“./Salicon_dataset/image/train/*.jpg”)mask_dir = “./Salicon_dataset/mask/train”train_transsize = A.Compose(, height=256, width=256, p=0.4), A.HorizontalFlip(p=0.5), A.Rotate(limit=(-10,10), p=0.6),>)train_dataphối = MaskDataset(img_fns, mask_dir, train_transform)train_loader = DataLoader(train_datamix, batch_size=4, shuffle=True, drop_last=True)# Test datasetimg, mask = next(iter(train_dataset))img = toNumpy(img)mask = toNumpy(mask)img = (img*255.0).astype(np.uint8)mask = (mask*255.0).astype(np.uint8)heatmap_img = cv2.applyColorMap(mask, cv2.COLORMAP_JET)combine_img = cv2.addWeighted(img, 0.7, heatmap_img, 0.3, 0)plot_imgs(

3.4 Train model

Vì bài xích tân oán dễ dàng và đơn giản cùng khiến cho dễ hiểu, bản thân đang train theo cách đơn giản dễ dàng duy nhất, không validate vào qúa trình train nhưng chỉ lưu giữ model sau 1 số epoch duy nhất định

train_params = optimizer = torch.optlặng.Adam(train_params, lr=0.001, betas=(0.9, 0.99))epochs = 5Mã Sản Phẩm.train()saved_dir = “model”os.makedirs(saved_dir, exist_ok=True)loss_function = nn.MSELoss(reduce=”mean”)for epoch in range(epochs): for imgs, masks in tqdm(train_loader): imgs_gpu = imgs.to(device) outputs = model(imgs_gpu) masks = masks.to(device) loss = loss_function(outputs, masks) loss.backward() optimizer.step()

3.5 Test model

img_fns = glob(“./Salicon_dataset/image/val/*.jpg”)mask_dir = “./Salicon_dataset/mask/val”val_transsize = A.Compose()mã sản phẩm.eval()val_datamix = MaskDataset(img_fns, mask_dir, val_transform)val_loader = DataLoader(val_datamix, batch_size=4, shuffle=False, drop_last=True)imgs, mask_targets = next(iter(val_loader))imgs_gpu = imgs.to(device)mask_outputs = model(imgs_gpu)mask_outputs = toNumpy(mask_outputs, axis=(0,2,3,1))imgs = toNumpy(imgs, axis=(0,2,3,1))mask_targets = toNumpy(mask_targets, axis=(0,2,3,1))for i, img in enumerate(imgs): img = (img*255.0).astype(np.uint8) mask_output = (mask_outputs*255.0).astype(np.uint8) mask_target = (mask_targets*255.0).astype(np.uint8) heatmap_label = cv2.applyColorMap(mask_target, cv2.COLORMAP_JET) heatmap_pred = cv2.applyColorMap(mask_output, cv2.COLORMAP_JET) origin_img = cv2.addWeighted(img, 0.7, heatmap_label, 0.3, 0) predict_img = cv2.addWeighted(img, 0.7, heatmap_pred, 0.3, 0) result = np.concatenate((img,origin_img, predict_img),axis=1) plot_img(result)Kết quả thu được:

*

Đây là bài tân oán dễ dàng và đơn giản đề nghị bản thân chú ý vào quá trình và phương pháp fine tuning trong pytorch hơn là đi sâu vào xử lý bài xích toán. Cảm ơn các bạn đang đọc

4. Reference

Dataset: salicon.net

Code bài viết: https://github.com/trungthanhnguyen0502/-alokapidakaldim.com-Visual-Saliency-prediction

Resnet50 torchvision code: torchvision-resnet

Bài viết thuộc chủ thể Visual saliency: Visual Saliency Prediction with Contextual Encoder-Decoder Network!

Theo dõi những bài viết chuyên sâu về AI/Deep learning tại: Vietphái mạnh AI Link Sharing Community

Bài viết liên quan

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *