iT邦幫忙

2022 iThome 鐵人賽

DAY 29
0
AI & Data

菜鳥工程師第一個電腦視覺(CV)專案-農作物影像辨識競賽系列 第 29

D29-競賽公開測試集預測表現_1st

  • 分享至 

  • xImage
  •  

Part0:前言

昨晚打第四劑疫苗,今天早上開始頭痛、手臂痛,後來實在有點快體力不支,在工作學姐們建議下跟老闆請了半天假,回到家吃完午餐,直接在床上睡了2.5小時,感覺好多了~~
起床後就開始趕鐵人賽的文章,今天進度很不錯~塞翁失馬,焉知非福XD

但晚餐後開始狂拉肚子(肚子超痛那種嗚嗚),接近快要22:30又開始感到超冷,一直顫抖~~ 決定速速完成今天的發文!


Part1:今日目標

1.下載公開測試集圖片(共11148張)&確認上傳格式(下圖)
2.使用前幾天訓練並儲存好的模型進行公開測試集資料預測


Part2:內容

1.解壓縮下載的公開測試集圖片(共11148張)&確認上傳格式(下圖)

2.使用前幾天訓練並儲存好的模型進行公開測試集資料預測: AlexNet

Step1: Load the Pretrained model: AlexNet

test_data_path = str(prjt_path + r"\test_data")  # 競賽給的公開測試資料集
output_path = str(prjt_path + r"\output")

AlexNet_path_model = str(output_path + "./ALL_AlexNet_model.pkl")
model_alexnet = torch.load(AlexNet_path_model)
model_alexnet.eval()

Step2: Load test data (載入競賽平台提供的公開測試資料集)
(1)載入資料位置

ALL_test_data_path = test_data_path
print('Total test images:', len(os.listdir(ALL_test_data_path)))


共有11148張測試集圖片

(2)自建Dataset

t = transforms.Compose([
    transforms.ToPILImage(),  # first convert the numpy array to a PIL Image
    transforms.ToTensor(),  # you can add other transformations in this list
    transforms.Resize(size=(255, 255))
])

class CustomImageDataset_NOT_label(Dataset):
    def __init__(self, transform=None, target_transform=None):
        self.img_name =  os.listdir(ALL_test_data_path)
        #print(self.img_name[100])
        self.transform = transform
        self.target_transform = target_transform

    def __len__(self):
        return len(self.img_name)

    def __getitem__(self, idx):
        #print(self.img_name[100])
        img_path = os.path.join(test_data_path, str(self.img_name[idx]))
        img_specific_name = self.img_name[idx]
        image = read_image(img_path)
        if self.transform:
            image = self.transform(image)
        return img_specific_name, image
    
test_dataset = CustomImageDataset_NOT_label(transform=t)  # same size to each img
print(test_dataset[1][1])  # 第一張圖片的 tensor
print(test_dataset[1][0])  # 第一張圖片的 檔案名稱: 0006061f-abda-4e2b-a07f-506ce19a0efc.jpg
print(len(test_dataset))

(3)自建Dataloader(without label)
以前2個batch進行測試

batch_size = 10 # 一個batch有10張圖片

# all test data
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size)
print(len(test_loader))  # 1115

Step3: Use a saved model for inference: (Predict for test data)

def test(model, test_loader, optimizer):  # predict
    model.eval()
    with torch.no_grad():
        ALL_img_name_list = []  # jpg檔名
        ALL_pred_class_str_list = []  # 預測類別index對應的字串
        for i, data in enumerate(tqdm(test_loader)):
            img_name_list, x = data  # <class 'tuple'>, tensor
            x = x.cuda()
            optimizer.zero_grad()
            y_hat = model(x)  # tensor, torch.Size([10, 33])  
            pred_class_idx = torch.max(y_hat, 1)[1]
            
            pred_class_idx = pred_class_idx.detach().cpu().numpy()  # <class 'numpy.ndarray'>, (10, 1)
            ALL_img_name_list.extend(img_name_list)
            pred_class_str = list(map(class_names_dict.get, pred_class_idx))  # list, 預測類別的字串種類
            ALL_pred_class_str_list.extend(pred_class_str)
            
        return ALL_img_name_list, ALL_pred_class_str_list

Step4:將以上輸出轉成類別字串,以符合平台上傳要求

test_flag = True
optimizer_conv = torch.optim.SGD(model_alexnet.classifier[6].parameters(), lr=0.001, momentum=0.9) 
optimizer = optimizer_conv

def use_save_model_to_predict(test_flag, save_model):
    if test_flag:
        model = save_model
        model.eval()
        ALL_img_name_list, ALL_pred_class_str_list = test(model, test_loader, optimizer)
    return ALL_img_name_list, ALL_pred_class_str_list
        
ALL_img_name_list, ALL_pred_class_str_list = use_save_model_to_predict(test_flag = True, save_model=model_alexnet)

prediction_df = pd.DataFrame(
    {'filename': ALL_img_name_list,
     'label': ALL_pred_class_str_list})

prediction_df.to_csv(output_path + "./AlexNet_preditions_1014.csv", index=False)
  • 儲存的csv內容:
  • 上傳平台的成績:

Part3:專案進度

完成預測資料程式碼撰寫,目前正在進行多個模型在公開測試集資料預測。

Part4:下一步

因共有1萬多張圖片要進行預測,需要時間進行運算,結果應該可以在明天和大家分享,剩下兩個模型: EfficientNet和ResNet,若預測結果明天還沒出來,則會以鐵人賽季後賽的形式和大家分享~


心得小語:
身體洗三溫暖的一天,但今天進度不錯,非常開心!! 美中不足是一直狂拉肚子&畏寒,但是一定比中鏢得COVID好一點啦,感恩一切~明天就是鐵人賽最終日啦!!
今日工時: 50min*5

我不害怕明天,因為我經歷過昨天,也熱愛今天
I am not afraid of tomorrow for I have seen yesterday and love today.


上一篇
D28-競賽資料集運算Pretrained_ResNet_1st
下一篇
D30-競賽公開測試資料集預測表現_2nd&完賽心得
系列文
菜鳥工程師第一個電腦視覺(CV)專案-農作物影像辨識競賽32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言