Deep Learning với Tensorflow Module 4 : Chuẩn bị dữ liệu

MVT
Đang cập nhật

Để có thể xem chi tiết toàn bộ quá trình thực hiện của phần này, bạn nên xem trên notebook | https://github.com/mthang1801/deep-learning/blob/main/extras/Preprocessing_data.ipynb

Khi xử lý dữ liệu, chúng ta thường nên bắt đầu từ những dữ liệu nhỏ trước, vì khi dữ liệu càng lớn thì quá trình xử lý đòi hỏi rất nhiều tài nguyên từ bộ nhớ máy tính đến thời gian xử lý dữ liệu. Đặc biệt là khi dữ liệu chúng ta chưa từng tiếp xúc với nó hoặc không thể nắm hết thông tin về nó, chúng ta sẽ phải trải nghiệm tìm hiểu về các đặc tính và ý nghĩa của các đặc tính đó trong dữ liệu.

Trong thế giới thực, dữ liệu mà ta xử lý cũng có trường hợp ít, nhưng cũng có trường hợp dữ liệu rất nhiều. Nếu bạn không rút gọn những dữ liệu đó, bạn sẽ gặp rắc rối rất lớn về thời hạn mà công việc cho phép, có khi đến ngày deadline, bạn cũng chưa làm đâu vào đâu thì thực sự rất phiền phức. Do đó, một trong những vấn đề cơ bản cũng là rất quan trọng trong lĩnh vực Data Science đó là preprocessing data.

Ở bài này, bài viết sẽ hướng dẫn các bạn cách đẻ tách dữ liệu thành những dữ liệu nhỏ hơn để phục vụ cho việc trải nghiệm trước khi tiến hành những bước quan trọng về sau như xây dựng mô hình, cải thiện mô hình...

Bạn sẽ cần tải xuống dữ liệu từ link sau : https://www.kaggle.com/kmader/food41

Đoạn code dưới đây thực hiện các nội dung bao gồm : * Tập dữ liệu binary class (tách sushi/tacos thành train & test folders) * 10% dữ liệu của Tập dữ liệu binary class (tachs sushi/tacos thành train & test folders) * 10 class của tập dữ liệu (tách 10 classes thành train & test folders) * 10% dữ liệu của 10 class dataset (lấy ngẫu nhiên 10% của training data, nhưng giũ nguyên test data ) * Tạo tất cả class của tập dữ liệu (tách tất cả classes thành train & test folders) * 10% dữ liệu của tất cả các class (lấy ngẫu nhiên 10% của training data, giữ nguyên test data)

import os 
import sys
import shutil
# Nếu bạn chưa cài đặt thư viện tqdm thì cài đặt lần đầu
# !conda install --yes --prefix {sys.prefix} -c conda-forge tqdm

Collecting package metadata (current_repodata.json): done Solving environment: done

## Package Plan ##

  environment location: /home/mvt/anaconda3

  added / updated specs:
    - tqdm

The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    openssl-1.1.1l             |       h7f8727e_0         2.5 MB
    tqdm-4.62.2                |     pyhd8ed1ab_0          80 KB  conda-forge
    ------------------------------------------------------------
                                           Total:         2.6 MB

The following packages will be UPDATED:

  openssl            conda-forge::openssl-1.1.1k-h7f98852_0 --> pkgs/main::openssl-1.1.1l-h7f8727e_0
  tqdm                                  4.62.1-pyhd8ed1ab_0 --> 4.62.2-pyhd8ed1ab_0

The following packages will be SUPERSEDED by a higher-priority channel:

  certifi            pkgs/main::certifi-2021.5.30-py38h06a~ --> conda-forge::certifi-2021.5.30-py38h578d9bd_0

Downloading and Extracting Packages
openssl-1.1.1l       | 2.5 MB    | ##################################### | 100% 
tqdm-4.62.2          | 80 KB     | ##################################### | 100% 
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
  • Cần 10% tập dữ liệu chỉ có 2 class (chỉ lấy train data)
  • Cần 1% tập dữ liệu chỉ có 2 class
  • Cần 10 tập dữ liệu
  • Cần 10% class dataset
  • Cần 1% class dataset
  • Cần 10% của tất cả các tập dữ liệu

Kiểm tra xem folder hiện tại đang chứa file hay tập tin gì

!ls

archive.zip Preprocessing_data.ipynb

Khi tải file về bạn có thể giải nén bằng cách : click chuột phải -> extract here

Nếu muốn dùng code để giải nén thì bạn làm như sau:

Nhưng trước khi giải nén, bạn cần lưu ý có 2 trường hợp có thể xảy ra : 1. Người nén file đã đưa tất cả các file vào trong 1 folder thì lúc này bạn giải nén sẽ chỉ xuất hiện 1 folder duy nhất trông rất gọn gàng. 2. Người nén file chưa gom tất cả các file vào trong 1 folder, lúc này nếu không để ý mà giải nén vội vàng sẽ tạo rất nhiều file rất lộn xộn dẫn đến khó kiểm soát, nhất là khi folder đó của bạn trước đó chứa rất nhiều file sẵn có rồi.

Do đó, tốt nhất bạn nên tạo một folder chứa file zip này rồi hãy giải nén.

  • Kiểm tra và tạo folder có tên data
  • Có thể sử dụng mkdir data hoặc sử dụng thư viện os trong python để tạo folder
if os.path.isdir("data") : 
    print("Data has already been existing")
else : 
    os.mkdir("data")
    print("Creating data folder successfully")

Creating data folder successfully

Sau đó, di chuyển file nén vào trong folder data mới được tạo

# Sử dụng lệnh của terminal 
# !mv archive.zip data # mv là lệnh chuyển file, archive.zip là tên file cần được chuyển, data chình là folder đích đến
# Sử dụng lệnh trong python
if os.path.isfile("archive.zip") : # Nếu file vẫn còn tồn tại trong folder hiện tại thì mới tiến hành dời file
    shutil.move("archive.zip","data")
    print("Move successfully")
else : 
    print("File not found.")

Move successfully

# Lúc này, folder data đã chứa file nén
!ls data

archive.zip

Tiến hành giải nén file zip

import zipfile

Kiểm tra folder hiện tại

# tạo hàm để kiểm tra vì có thể sử dụng sau này
def get_current_dirname() : 
    """
    return current dirname working
    """
    os.getcwd() # get current working directory
    current_dirname = os.getcwd().split("/")[-1]
    return current_dirname

get_current_dirname()

'extras'

Nếu Folder hiện tại là data thì bỏ qua nếu không thì bạn cần thay đổi folder làm việc hiện tại

if get_current_dirname() != "data" : 
    os.chdir("data")
get_current_dirname()

'data'

OK, đã đúng với folder làm việc hiện tại. Bây giờ, ta sẽ tiến hành giải nén file, nhưng bạn nên tạo function để nếu có thể ta sẽ tái sử dụng tránh lặp đi lặp lại code quá nhiều lần.

def unzip_file(filename) : 
    if os.path.isfile(filename) :
        zipref = zipfile.ZipFile(filename, "r")
        zipref.extractall()
        zipref.close()
        # Sau khi giải nén thì remove file zip 
        os.remove(filename)        
        print("Extracted all and remove zip file!")
unzip_file("archive.zip")

Extracted all and remove zip file!

Sau khi giải nén, folder data hiện tại đã có các file sau :

os.listdir()

['food_c101_n10099_r64x64x3.h5', 'food_test_c101_n1000_r64x64x1.h5', 'food_c101_n10099_r64x64x1.h5', 'images', 'meta', 'food_test_c101_n1000_r128x128x3.h5', 'food_test_c101_n1000_r32x32x1.h5', 'food_c101_n10099_r32x32x3.h5', 'food_test_c101_n1000_r64x64x3.h5', 'food_c101_n10099_r32x32x1.h5', 'food_test_c101_n1000_r32x32x3.h5', 'food_c101_n1000_r384x384x3.h5', 'food_test_c101_n1000_r128x128x1.h5']

Kiểm tra folder images

if os.path.isdir("images") : 
    os.chdir("images")
get_current_dirname()

'images'

!ls

apple_pie eggs_benedict onion_rings baby_back_ribs escargots oysters baklava falafel pad_thai beef_carpaccio filet_mignon paella beef_tartare fish_and_chips pancakes

....

cup_cakes        macarons             takoyaki
deviled_eggs        miso_soup             tiramisu
donuts            mussels             tuna_tartare
dumplings        nachos             waffles
edamame            omelette

Trước khi tiến hành các bước dưới đây, chúng ta cần thay đổi folder làm việc hiện tại sao cho folder này chứa notebook này

os.chdir("../..")
!ls

data Preprocessing_data.ipynb

import json
from tqdm.notebook import tqdm

Lấy labels ( trong JSON )

def get_labels_json(label_path) : 
    """
    chấp nhận một đường dẫn label (ở dạng JSON) và trả về file như một Python Objects
    """
    with open(label_path) as fs : 
        return json.load(fs)
train_labels = get_labels_json("data/meta/meta/train.json")
test_labels = get_labels_json("data/meta/meta/test.json")
def get_labels_txt(label_path) : 
    """
    chấp nhận một đường dẫn label (ở dạng txt) và trả về file như một Python Objects
    """
    with open(label_path) as fs : 
        return list(fs.read().split("\n"))
len(train_labels), len(test_labels)

(101, 101)

Số label trong traintest đều là 101

Tạo danh sách các label

labels = []
for key, values in train_labels.items() : 
    labels.append(key)
str(labels)

"['churros', 'hot_and_sour_soup', 'samosa', 'sashimi',..., 'falafel', 'bread_pudding', 'chicken_wings', 'gnocchi', 'caprese_salad', 'creme_brulee', 'escargots', 'chocolate_cake', ', 'lobster_roll_sandwich', 'nachos', 'oysters']"

Ở mỗi class nên có 750 hình ảnh train, 250 hình test

print(len(train_labels["pho"]))
print(len(test_labels["pho"]))

750 250

Tạo folder cho target class và dời hình đến đó

def copy_images(parent_folder, subset_folder, dataset, target_labels) : 
    """
    Sao chép các tất cả các file có tên folder nằm trong list `target labels` đến `parent_folder/subset_folder/dataset` 

    VD : Sao chép hình ảnh từ đến `data/pizza_subset/train/` & `data/apple_pie/train`
    Tham số : 
    --------
    parent_folder (str) : Đường dẫn liên kết của Folder gốc chứa tất cả data
    subset_folder (str) : Đường dẫn để sao chép đến
    dataset (str) : Tập dữ liệu (train hoặc test)
    target_labels (list) : Danh sách tên của các folder muốn copy    
    """
    # Lấy danh sách labels có sẵn 
    labels = get_labels_json(f"data/meta/meta/{dataset}.json")  
    for label in target_labels : 
        # Tạo folder mới trong subset folder (folder copy)
        os.makedirs(f"{subset_folder}/{dataset}/{label}", exist_ok=True)       
        # Trước khi lặp hình ảnh, tạo list images_copied để lưu lại các image đã copied
        images_copied = [] 

        #Dùng vòng lặp để đi qua từng file image để sao chép đến subset folder          
        for image_path in labels[label] :             
            #Tạo đường dẫn file gốc 
            og_path = f"{parent_folder}/{image_path}.jpg"
            # Tạo đường dẫn đến folder subset
            new_path = f"{subset_folder}/{dataset}/{image_path}.jpg"

            # Sử dụng thư viện shutil trong python để tiến hành copy
            shutil.copy(og_path, new_path)
            # Lưu trư image 
            images_copied.append(image_path)
        print(f"Đã sao chép {len(images_copied)} hình ảnh đến tập dữ liệu {dataset}. Đường dẫn liên kết : {subset_folder}/{dataset}/{label}")

Tạo hàm lấy hình ảnh mẫu ngẫu nhiên

import random
import path
def get_images_randomly(target_dir, new_dir, sample_amount = 0.1, random_state = 42) : 
    """
    Lấy một lượng mẫu hình ảnh ngẫu nhiên từ target_dir, sau đó sao chép vào new_dir

    VD: target_dir = data/images/apple_pie, new_dir= data/new_dir_name/train/apple_pie/X_percent_of_all_files        
    Tham số
    -----------
    target_dir (str) : Đường dẫn liên kết đến Folder chứa tất cả hình ảnh của class mà bạn muốn lấy .
    new_dir (str) : Đường dẫn liên kết đến Folder chuẩn bị chứa một lượng mẫu hình ảnh được sao chép từ target_dir.
    sample_amount (float) : mặc định 0.1 (tương đương 10% trong tổng số file của class đó) - tỉ lệ số file ảnh được copy
    random_state (int) : giá trị random seed
    """    
    random.seed(random_state)
    # Lấy danh sách các các tệp hình ảnh trong target_dir
    images = [{dir_name : os.listdir(os.path.join(target_dir, dir_name))} for dir_name in os.listdir(target_dir)]
    for image in images : 
        for label, values in image.items() : 
                print(f"Đang xử lý {label}")
                sample_number = int(sample_amount * len(values))
                print(f"Thư mục {label} có tất cả {len(values)} file ảnh. Lấy ngẫu nhiên {sample_number} (tương đương {int(sample_amount * 100)}%) số mẫu ")
                random_images = random.sample(values, k=sample_number)
                # Tạo đường dẫn đến thư mục cần sao chép
                new_target_dir = f"{new_dir}/{label}"
                os.makedirs(new_target_dir,exist_ok=True)
                images_copied = []
                for img in random_images : 
                    # Đường dẫn gốc đến file ảnh                     
                    og_path = f"{target_dir}/{label}/{img}"
                    # Đường dẫn mới của file ảnh
                    new_path = f"{new_target_dir}/{img}"
                    # Copy từ đường dẫn gốc đến đường dẫn mới
                    shutil.copy(og_path, new_path)
                    images_copied.append(img)
                print(f"Đã sao chép {len(images_copied)} file ảnh từ {target_dir} đến {new_target_dir}")

                # Chắc chắn số hình ảnh được copy là chính xác
                assert len(os.listdir(new_target_dir)) == sample_number
                assert len(images_copied) == sample_number

get_images_randomly("data/images", "data/new_data", sample_amount=0.2)

Đang xử lý waffles Thư mục waffles có tất cả 1000 file ảnh. Lấy ngẫu nhiên 200 (tương đương 20%) số mẫu Đã sao chép 200 file ảnh từ data/images đến data/new_data/waffles Đang xử lý greek_salad Thư mục greek_salad có tất cả 1000 file ảnh. Lấy ngẫu nhiên 200 (tương đương 20%) số mẫu Đã sao chép 200 file ảnh từ data/images đến data/new_data/greek_salad

...

Đang xử lý chicken_quesadilla
Thư mục chicken_quesadilla có tất cả 1000 file ảnh. Lấy ngẫu nhiên 200 (tương đương 20%) số mẫu 
Đã sao chép 200 file ảnh từ data/images đến data/new_data/chicken_quesadilla
Đang xử lý cup_cakes
Thư mục cup_cakes có tất cả 1000 file ảnh. Lấy ngẫu nhiên 200 (tương đương 20%) số mẫu 
Đã sao chép 200 file ảnh từ data/images đến data/new_data/cup_cakes

Tạo 2 dữ liệu ( VD : pho, fried_rice)

parent_folder = "data/images"
subset_folder = "data/pho_fried_rice"
datasets = ["train", "test"]
target_labels = ["pho", "fried_rice"]

for dataset in datasets : 
    copy_images(parent_folder, subset_folder, dataset, target_labels)

Đã sao chép 750 hình ảnh đến tập dữ liệu train. Đường dẫn liên kết : data/pho_fried_rice/train/pho Đã sao chép 750 hình ảnh đến tập dữ liệu train. Đường dẫn liên kết : data/pho_fried_rice/train/fried_rice Đã sao chép 250 hình ảnh đến tập dữ liệu test. Đường dẫn liên kết : data/pho_fried_rice/test/pho Đã sao chép 250 hình ảnh đến tập dữ liệu test. Đường dẫn liên kết : data/pho_fried_rice/test/fried_rice

print(f"Số lượng hình ảnh trainning của pho : {len(os.listdir('data/pho_fried_rice/train/pho'))}")
print(f"Số lượng hình ảnh test pho : {len(os.listdir('data/pho_fried_rice/test/pho'))}")

Số lượng hình ảnh trainning của pho : 750 Số lượng hình ảnh test pho : 250

# Đảm bảo không có sự trùng lặp trong các train và test
# Lấy filenames từ bộ train / test của mỗi class và đảm bảo đầu ra bằng 0
pho_train_filenames = set(os.listdir("data/pho_fried_rice/train/pho/"))
pho_test_filenames = set(os.listdir("data/pho_fried_rice/test/pho/"))

# Chắc chắn rằng khi intersect (phép giao) giữa 2 set này sẽ phải rỗng
if len(pho_train_filenames.intersection(pho_test_filenames)) == 0 : 
    print("OK")
else : 
    print("Trong set train hoặc set test có chứa filenames của set kia")

OK

# Đảm bảo không có sự trùng lặp trong các tập huấn luyện và kiểm tra
# Lấy filenames từ bộ train / test của mỗi class và đảm bảo đầu ra bằng 0
fried_rice_train_filenames = set(os.listdir("data/pho_fried_rice/train/pho/"))
fried_rice_test_filenames = set(os.listdir("data/pho_fried_rice/test/fried_rice/"))

# Chắc chắn rằng khi intersect (phép giao) giữa 2 set này sẽ phải rỗng
if len(fried_rice_train_filenames.intersection(fried_rice_test_filenames)) == 0 : 
    print("OK")
else : 
    print("Trong set train hoặc set test có chứa filenames của set kia")

-> OK

Tạo 10% cho 2 lớp dữ liệu (binary class dataset)

!ls data/pho_fried_rice/

test train

# Tạo 10% dữ liệu cho tập dữ liệu của 2 class sushi và tacos được tạo sẵn  ở thư mục đã tạo phía trên (chỉ cho trainning)
target_dir_10_percent = "data/pho_fried_rice/train"
new_dir_10_percent = "data/pho_fried_rice_10_percent/train"

get_images_randomly(target_dir_10_percent, new_dir_10_percent,)

Đang xử lý pho Thư mục pho có tất cả 750 file ảnh. Lấy ngẫu nhiên 75 (tương đương 10%) số mẫu Đã sao chép 75 file ảnh từ data/pho_fried_rice/train đến data/pho_fried_rice_10_percent/train/pho Đang xử lý fried_rice Thư mục fried_rice có tất cả 750 file ảnh. Lấy ngẫu nhiên 75 (tương đương 10%) số mẫu Đã sao chép 75 file ảnh từ data/pho_fried_rice/train đến data/pho_fried_rice_10_percent/train/fried_rice

# Tạo 1% dữ liệu cho tập dữ liệu của 
target_dir_1_percent = "data/pho_fried_rice/train"
new_dir_1_percent = "data/pho_fried_rice_1_percent/train"

get_images_randomly(target_dir_1_percent, new_dir_1_percent, sample_amount=0.01)

Đang xử lý pho Thư mục pho có tất cả 750 file ảnh. Lấy ngẫu nhiên 7 (tương đương 1%) số mẫu Đã sao chép 7 file ảnh từ data/pho_fried_rice/train đến data/pho_fried_rice_1_percent/train/pho Đang xử lý fried_rice Thư mục fried_rice có tất cả 750 file ảnh. Lấy ngẫu nhiên 7 (tương đương 1%) số mẫu Đã sao chép 7 file ảnh từ data/pho_fried_rice/train đến data/pho_fried_rice_1_percent/train/fried_rice

Quan sát hình ảnh

import matplotlib.pyplot as plt

Tạo function để quan sát hình ảnh ngẫu nhiên. Trong python có khá nhiều thư viện để đọc file hình ảnh thành matrix như pillow , openCV, hoặc từ matplotlib

import math
import cv2

def view_random_images(target_dir,target_class, num_files=10, num_cols=3) : 
    """
    Tạo hình ảnh ngẫu nhiên từ `target_dir/target_class` 
    Tham số : 
    -----------
    target_dir (str) : Đường dẫn thư mục chứa class
    target_class (str) : Tên class
    num_files (int) : Số hình cần hiển thị min = 1, max = 20
    num_cols (int) : Số hình trên 1 cột
    """
    if num_files > 20 or num_files < 1 :
        return 
    if num_cols > 5 or num_cols < 1: 
        num_cols = 3

    target_path = f"{target_dir}/{target_class}"
    if os.path.isdir(target_path) : 
        image_names = os.listdir(target_path)
        random_images = random.sample(image_names, k=num_files)    

        num_rows = math.ceil(num_files / num_cols)
        plt.figure(figsize=(20,10))
        for i, image_name in enumerate(random_images) :             
            image_path = f"{target_path}/{image_name}"
            # ==============================================
            # Sử dung opencv để mở file hình ảnh dưới dạng matrix
            img = cv2.imread(image_path)
            # Vì cv2 đọc file ảnh dưới dang BGR color channel nên cần chuyển về RGB color Channel
            img = img[:,:,::-1]
            img = cv2.resize(img, dsize=(228,228), interpolation=cv2.INTER_AREA)
            # ==============================================
            # Sử dụng matplotlib
            img = plt.imread(image_path)
            # ==============================================
            plt.subplot(num_rows, num_cols, i+1)            
            plt.imshow(img)
            plt.title(image_name, fontsize=18)
            plt.axis(False)
            plt.suptitle(target_class, fontsize=24)
    else : 
        print("đường dẫn không chính xác")
        return
view_random_images("data/pho_fried_rice/train", "pho",num_files=20,num_cols=5)

view_random_images("data/pho_fried_rice/train", "fried_rice",num_files=20,num_cols=5)

Tạo 10 class tập dữ liệu

Lựa chọn 10 class và tạo folder với 10 tập dữ liệu này.

!ls data/meta/meta/

classes.txt labels.txt test.json test.txt train.json train.txt

classes = []
with open("data/meta/meta/classes.txt") as fs : 
    class_names = fs.read()
    class_names = class_names.split("\n")
    ten_classes = random.sample(class_names, k=10)
    print(ten_classes)

['greek_salad', 'eggs_benedict', 'ramen', 'seaweed_salad', 'paella', 'croque_madame', 'scallops', 'french_onion_soup', 'tiramisu', 'tuna_tartare']

Tạo ngẫu nhiên 10 class thành công. Bây giờ ta sẽ tiến hành tạo folder cho 10 tập này

parent_folder = "data/images"
subset_folder = "data/10_food_classes"
datasets = ["train", "test"]
for dataset in datasets :        
        copy_images(parent_folder,subset_folder, dataset,target_labels=ten_classes)

Đã sao chép 750 hình ảnh đến tập dữ liệu train. Đường dẫn liên kết : data/10_food_classes/train/greek_salad Đã sao chép 750 hình ảnh đến tập dữ liệu train. Đường dẫn liên kết : data/10_food_classes/train/eggs_benedict Đã sao chép 750 hình ảnh đến tập dữ liệu train. Đường dẫn liên kết : data/10_food_classes/train/ramen Đã sao chép 750 hình ảnh đến tập dữ liệu train. Đường dẫn liên kết : data/10_food_classes/train/seaweed_salad Đã sao chép 750 hình ảnh đến tập dữ liệu train. Đường dẫn liên kết : data/10_food_classes/train/paella

...

Đã sao chép 250 hình ảnh đến tập dữ liệu test. Đường dẫn liên kết : data/10_food_classes/test/scallops
Đã sao chép 250 hình ảnh đến tập dữ liệu test. Đường dẫn liên kết : data/10_food_classes/test/french_onion_soup
Đã sao chép 250 hình ảnh đến tập dữ liệu test. Đường dẫn liên kết : data/10_food_classes/test/tiramisu
Đã sao chép 250 hình ảnh đến tập dữ liệu test. Đường dẫn liên kết : data/10_food_classes/test/tuna_tartare
view_random_images("data/10_food_classes/train",ten_classes[3])

# Tạo 10% dữ liệu trong 10_food_classes (chỉ lấy trainning data)
get_images_randomly("data/10_food_classes/train", "data/10_food_classes_10_percent/train", sample_amount=0.1)

Đang xử lý greek_salad Thư mục greek_salad có tất cả 750 file ảnh. Lấy ngẫu nhiên 75 (tương đương 10%) số mẫu Đã sao chép 75 file ảnh từ data/10_food_classes/train đến data/10_food_classes_10_percent/train/greek_salad Đang xử lý croque_madame Thư mục croque_madame có tất cả 750 file ảnh. Lấy ngẫu nhiên 75 (tương đương 10%) số mẫu Đã sao chép 75 file ảnh từ data/10_food_classes/train đến data/10_food_classes_10_percent/train/croque_madame

...

Đang xử lý seaweed_salad
Thư mục seaweed_salad có tất cả 750 file ảnh. Lấy ngẫu nhiên 75 (tương đương 10%) số mẫu 
Đã sao chép 75 file ảnh từ data/10_food_classes/train đến data/10_food_classes_10_percent/train/seaweed_salad
Đang xử lý eggs_benedict
Thư mục eggs_benedict có tất cả 750 file ảnh. Lấy ngẫu nhiên 75 (tương đương 10%) số mẫu 
Đã sao chép 75 file ảnh từ data/10_food_classes/train đến data/10_food_classes_10_percent/train/eggs_benedict
# Tạo 1% dữ liệu trong 10_food_classes (chỉ lấy trainning data)
get_images_randomly("data/10_food_classes/train", "data/10_food_classes_1_percent/train", sample_amount=0.01)

Đang xử lý greek_salad Thư mục greek_salad có tất cả 750 file ảnh. Lấy ngẫu nhiên 7 (tương đương 1%) số mẫu Đã sao chép 7 file ảnh từ data/10_food_classes/train đến data/10_food_classes_1_percent/train/greek_salad Đang xử lý croque_madame Thư mục croque_madame có tất cả 750 file ảnh. Lấy ngẫu nhiên 7 (tương đương 1%) số mẫu Đã sao chép 7 file ảnh từ data/10_food_classes/train đến data/10_food_classes_1_percent/train/croque_madame

...

Đang xử lý seaweed_salad
Thư mục seaweed_salad có tất cả 750 file ảnh. Lấy ngẫu nhiên 7 (tương đương 1%) số mẫu 
Đã sao chép 7 file ảnh từ data/10_food_classes/train đến data/10_food_classes_1_percent/train/seaweed_salad
Đang xử lý eggs_benedict
Thư mục eggs_benedict có tất cả 750 file ảnh. Lấy ngẫu nhiên 7 (tương đương 1%) số mẫu 
Đã sao chép 7 file ảnh từ data/10_food_classes/train đến data/10_food_classes_1_percent/train/eggs_benedict
# Sao chép thư mục 10 classes test vào thư muc 10 classes percentage
ten_percent_test = "data/10_food_classes/test/"
shutil.copytree(ten_percent_test, "data/10_food_classes_10_percent/test")
shutil.copytree(ten_percent_test, "data/10_food_classes_1_percent/test")

'data/10_food_classes_1_percent/test'

Tách toàn bộ tập dữ liệu thành train và test

class_names = list(filter(lambda x : x, class_names))
class_names

['apple_pie', 'baby_back_ribs', 'baklava', 'beef_carpaccio', 'beef_tartare', 'beet_salad', 'beignets', ..... 'shrimp_and_grits', 'spaghetti_bolognese', 'spaghetti_carbonara', 'spring_rolls', 'steak', 'strawberry_shortcake', 'sushi', 'tacos', 'takoyaki', 'tiramisu', 'tuna_tartare', 'waffles']

parent_folder = "data/images"
subset_folder = "data/all_food_classes"
datasets=["train","test"]

for dataset in datasets : 
    copy_images(parent_folder, subset_folder, dataset, class_names)

Đã sao chép 750 hình ảnh đến tập dữ liệu train. Đường dẫn liên kết : data/all_food_classes/train/apple_pie Đã sao chép 750 hình ảnh đến tập dữ liệu train. Đường dẫn liên kết : data/all_food_classes/train/baby_back_ribs Đã sao chép 750 hình ảnh đến tập dữ liệu train. Đường dẫn liên kết : data/all_food_classes/train/baklava

...

Đã sao chép 750 hình ảnh đến tập dữ liệu train. Đường dẫn liên kết : data/all_food_classes/train/tiramisu    
Đã sao chép 750 hình ảnh đến tập dữ liệu train. Đường dẫn liên kết : data/all_food_classes/train/tuna_tartare
Đã sao chép 750 hình ảnh đến tập dữ liệu train. Đường dẫn liên kết : data/all_food_classes/train/waffles

Đã sao chép 250 hình ảnh đến tập dữ liệu test. Đường dẫn liên kết : data/all_food_classes/test/apple_pie

   

...

Đã sao chép 250 hình ảnh đến tập dữ liệu test. Đường dẫn liên kết : data/all_food_classes/test/tiramisu
Đã sao chép 250 hình ảnh đến tập dữ liệu test. Đường dẫn liên kết : data/all_food_classes/test/tuna_tartare
Đã sao chép 250 hình ảnh đến tập dữ liệu test. Đường dẫn liên kết : data/all_food_classes/test/waffles
# Tạo 10% data cho all_food_class (Chỉ lấy train data)
get_images_randomly("data/all_food_classes/train/", "data/all_food_classes_10_percent/train")

Đang xử lý waffles Thư mục waffles có tất cả 750 file ảnh. Lấy ngẫu nhiên 75 (tương đương 10%) số mẫu Đã sao chép 75 file ảnh từ data/all_food_classes/train/ đến data/all_food_classes_10_percent/train/waffles Đang xử lý greek_salad Thư mục greek_salad có tất cả 750 file ảnh. Lấy ngẫu nhiên 75 (tương đương 10%) số mẫu Đã sao chép 75 file ảnh từ data/all_food_classes/train/ đến data/all_food_classes_10_percent/train/greek_salad

...

Đã sao chép 75 file ảnh từ data/all_food_classes/train/ đến data/all_food_classes_10_percent/train/chicken_quesadilla
Đang xử lý cup_cakes
Thư mục cup_cakes có tất cả 750 file ảnh. Lấy ngẫu nhiên 75 (tương đương 10%) số mẫu 
Đã sao chép 75 file ảnh từ data/all_food_classes/train/ đến data/all_food_classes_10_percent/train/cup_cakes
# Sao chép toàn bộ folder test vào tất cả các folder rút gọn
ten_percent_test = "data/all_food_classes/test/"
shutil.copytree(ten_percent_test, "data/all_food_classes_10_percent/test")

'data/all_food_classes_10_percent/test'


Bài viết có liên quan