Quy trình xử lý dữ liệu Midjourney để huấn luyện mô hình LoRA

1.【Xóa văn bản lỗi và thêm nhãn】Xóa tiền tố (tên người dùng), xóa hậu tố (văn bản lỗi), thêm nhãn thống nhất, và mở Excel để điều chỉnh chi tiết. (Đầu vào: 1. Địa chỉ thư mục đơn 2. Tên nhãn cần thêm vào thư mục)

*Lưu ý: Nếu muốn thêm nhiều nhãn, hãy dùng dấu phẩy tiếng Anh "," để ngăn cách.

import os
import openpyxl
import re

CAC_TU_CAN_XOA = ["undefined", "皮皮", "zly324"]


# Bước 1: Đổi tên tệp
doi_ten_tep(duong_dan):
    tep = [f for f in os.listdir(duong_dan) if os.path.isfile(os.path.join(duong_dan, f))]
    tep_da_doi_ten = []

    dem = 1
    for tep in tep:
        ten_tep, mo_rong = os.path.splitext(tep)

        # Văn bản lỗi
        if re.search(r'[a-f0-9]{32}', ten_tep) or not '_' in ten_tep:
            ten_moi = f"({dem})"
            dem += 1
        # Hình ảnh do AI tạo
        else:
            phan = re.split(r'[_]+', ten_tep)
            phan.pop(0)  # Xóa phần tử đầu tiên

            # Xóa các phần tử cụ thể
            phan = [phan for phan in phan if phan not in CAC_TU_CAN_XOA]

            # Xóa tất cả các phần tử chứa số
            phan = [phan for phan in phan if not any(char.isdigit() for char in phan)]

            # Quy tắc kết thúc
            # Xóa số theo định dạng UUID
            while phan and re.search(r'^[a-f0-9\-]{32,}$', phan[-1]):
                phan.pop(-1)
            # Xóa các phần có độ dài nhỏ hơn hoặc bằng 4
            while phan and len(phan[-1]) <= 4:
                phan.pop(-1)

            ten_moi = '_'.join(phan)

        tep_da_doi_ten.append(ten_moi + mo_rong)

    return tep_da_doi_ten


# Bước 2: Thêm tiền tố
them_tien_tep(tep, tien_tu):
    tep_co_tien_tu = [f"{tien_tu}_{tep}" if not tep.startswith(tien_tu) else tep for tep in tep]

    # Xóa các phần tử cụ thể
    tep_co_tien_tu = ['_'.join([phan for phan in re.split(r'[_]+', ten) if phan not in CAC_TU_CAN_XOA]) for ten in
                      tep_co_tien_tu]

    return tep_co_tien_tu


# Bước 3: Tạo Excel và tự động mở
tao_mo_excel(tep, tep_da_doi_ten, duong_dan):
    wb = openpyxl.Workbook()
    ws = wb.active

    for goc, da_doi_ten in zip(tep, tep_da_doi_ten):
        ws.append([goc, da_doi_ten])

    duong_dan_excel = os.path.join(duong_dan, os.path.basename(duong_dan) + ".xlsx")
    wb.save(duong_dan_excel)

    # Mở tệp Excel
    os.system(f'start "" "{duong_dan_excel}"')

    return duong_dan_excel


# Bước 5: Đọc Excel và đổi tên tệp
doi_ten_tep_tu_excel(duong_dan, duong_dan_excel):
    wb = openpyxl.load_workbook(duong_dan_excel)
    ws = wb.active

    for hang in ws.iter_rows(values_only=True):
        ten_goc, ten_moi = hang
        duong_dan_muc_tieu = os.path.join(duong_dan, ten_moi)

        # Kiểm tra tệp gốc có tồn tại không
        if os.path.exists(os.path.join(duong_dan, ten_goc)):
            # Nếu tên tệp đích đã tồn tại, thêm số
            dem = 1
            ten_co_so, mo_rong = os.path.splitext(ten_moi)
            while os.path.exists(duong_dan_muc_tieu):
                ten_moi = f"{ten_co_so} ({dem}){mo_rong}"
                duong_dan_muc_tieu = os.path.join(duong_dan, ten_moi)
                dem += 1

            os.rename(os.path.join(duong_dan, ten_goc), duong_dan_muc_tieu)

    print("Hoàn thành đổi tên.")


# Hàm chính
def main():
    duong_dan = input("Vui lòng nhập địa chỉ thư mục: ")
    tep = [f for f in os.listdir(duong_dan) if os.path.isfile(os.path.join(duong_dan, f))]
    tep_da_doi_ten = doi_ten_tep(duong_dan)

    tien_tu = input("Vui lòng nhập từ cần đặt tên hàng loạt: ")
    tep_co_tien_tu = them_tien_tep(tep_da_doi_ten, tien_tu)

    duong_dan_excel = tao_mo_excel(tep, tep_co_tien_tu, duong_dan)
    print(f"Tệp Excel đã được lưu là: {duong_dan_excel}")
    print("Vui lòng điều chỉnh dữ liệu cột B trong Excel, sau đó lưu và đóng tệp Excel. Hoàn thành nhấn Enter để tiếp tục...")

    input()

    # Đổi tên tệp
    doi_ten_tep_tu_excel(duong_dan, duong_dan_excel)


if __name__ == "__main__":
    main()

2.【Xử lý dấu gạch dưới】Giữ lại chỉ dấu gạch dưới đầu tiên, xóa các dấu gạch dưới sau (Đầu vào: Địa chỉ tổng)

import os
import shutil

class XuLyThuMuc:
    def __init__(self, duong_dan_nguon, duong_dan_dich):
        self.duong_dan_nguon = duong_dan_nguon
        self.duong_dan_dich = duong_dan_dich
    
    def sao_chep_thu_muc(self):
        """Sao chép thư mục nguồn đến thư mục đích."""
        try:
            shutil.copytree(self.duong_dan_nguon, self.duong_dan_dich)
        except FileExistsError:
            print(f"Thư mục sao lưu '{self.duong_dan_dich}' đã tồn tại.")

    def doi_ten_hinh_anh(self):
        """Đổi tên tệp hình ảnh, giữ dấu gạch dưới đầu tiên, thay thế các dấu gạch dưới sau bằng dấu cách."""
        for thu_muc_goc, thu_muc_con, tep in os.walk(self.duong_dan_dich):
            for tep_hinh in tep:
                if tep_hinh.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')):
                    # Tìm vị trí dấu gạch dưới đầu tiên
                    dau_gach_dau_tien = tep_hinh.find('_')
                    if dau_gach_dau_tien != -1:
                        # Giữ dấu gạch dưới đầu tiên, thay thế các dấu gạch dưới sau bằng dấu cách
                        truoc_dau_gach = tep_hinh[:dau_gach_dau_tien + 1]
                        sau_dau_gach = tep_hinh[dau_gach_dau_tien + 1:].replace('_', ' ')
                        ten_tep_moi = truoc_dau_gach + sau_dau_gach
                    else:
                        ten_tep_moi = tep_hinh

                    if ten_tep_moi != tep_hinh:
                        duong_dan_goc = os.path.join(thu_muc_goc, tep_hinh)
                        duong_dan_moi = os.path.join(thu_muc_goc, ten_tep_moi)
                        tang_bien = 1
                        # Lặp lại cho đến khi tìm tên tệp không xung đột
                        while os.path.exists(duong_dan_moi):
                            # Tách tên tệp và phần mở rộng
                            ten_tep, phan_mo_rong = os.path.splitext(ten_tep_moi)
                            # Thêm số tăng dần
                            ten_tep_moi = f"{ten_tep} ({tang_bien}){phan_mo_rong}"
                            duong_dan_moi = os.path.join(thu_muc_goc, ten_tep_moi)
                            tang_bien += 1
                        os.rename(duong_dan_goc, duong_dan_moi)
                        print(f"Tệp {duong_dan_goc} đã được đổi tên thành {duong_dan_moi}")

def main():
    # Yêu cầu người dùng nhập đường dẫn thư mục cần xử lý
    duong_dan_nhap = input("Vui lòng nhập đường dẫn thư mục cần xử lý: ")

    # Kiểm tra thư mục có tồn tại không
    if not os.path.exists(duong_dan_nhap):
        print(f"Thư mục được chỉ định {duong_dan_nhap} không tồn tại.")
        return

    # Tạo thư mục sao lưu
    duong_dan_sao_luu = os.path.join(duong_dan_nhap, "_backup")
    print(f"Đang tạo thư mục sao lưu: {duong_dan_sao_luu}")
    xu_ly = XuLyThuMuc(duong_dan_nhap, duong_dan_sao_luu)
    xu_ly.sao_chep_thu_muc()

    # Đổi tên tệp hình ảnh trong thư mục sao lưu
    print("Đang đổi tên tệp hình ảnh trong thư mục sao lưu...")
    xu_ly.doi_ten_hinh_anh()
    print("Hoàn thành thao tác đổi tên.")

if __name__ == "__main__":
    main()

3.【Chuyển dấu phẩy thành dấu gạch dưới】Trong thư mục lớn, chuyển tất cả dấu phẩy trong tên tệp hình ảnh thành dấu gạch dưới, phù hợp cho trường hợp nhập nhiều nhãn. (Đầu vào: Địa chỉ lớn)

import os

class BienDoiTenTep:
    def __init__(self, duong_dan):
        self.duong_dan = duong_dan
        self.ten_tep_da_chinh_sua = []
        self.dinh_dang_hinh_anh = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff', '.webp']
    
    def thuc_hien_chuyen_doi(self):
        """Thực hiện chuyển đổi dấu phẩy thành dấu gạch dưới trong tên tệp hình ảnh."""
        for thu_muc_goc, thu_muc_con, tep in os.walk(self.duong_dan):
            for tep_hinh in tep:
                if any(tep_hinh.endswith(dinh_dang) for dinh_dang in self.dinh_dang_hinh_anh):
                    # Thay thế dấu phẩy bằng dấu gạch dưới
                    ten_tep_moi = tep_hinh.replace(',', '_').replace(',', '_')
                    if ten_tep_moi != tep_hinh:
                        os.rename(os.path.join(thu_muc_goc, tep_hinh), os.path.join(thu_muc_goc, ten_tep_moi))
                        self.ten_tep_da_chinh_sua.append(os.path.join(thu_muc_goc, ten_tep_moi))
        
        return self.ten_tep_da_chinh_sua

def main():
    # Yêu cầu người dùng nhập đường dẫn thư mục
    duong_dan = input("Vui lòng nhập đường dẫn thư mục: ")
    bien_doi = BienDoiTenTep(duong_dan)
    da_chinh_sua = bien_doi.thuc_hien_chuyen_doi()
    
    print("Các tệp đã được chỉnh sửa:")
    for f in da_chinh_sua:
        print(f"Đã chỉnh sửa tệp: {f}")

if __name__ == "__main__":
    main()

4.Bước 1-3 tham chiếu MJ chuyển huấn luyện mô hình lớn, điểm khác biệt là: cần tạo ảnh đối xứng trái phải (để tránh hình ảnh không đủ)

import os
from PIL import Image

class XuLyHinhAnh:
    def __init__(self, thu_muc_xu_ly):
        self.thu_muc_xu_ly = thu_muc_xu_ly
        self.tong_tep = 0
        self.da_xu_ly = 0
    
    def tinh_tong_tep(self):
        """Tính tổng số tệp hình ảnh để hiển thị tiến độ."""
        for thu_muc_goc, thu_muc_con, tep in os.walk(self.thu_muc_xu_ly):
            for tep_hinh in tep:
                if tep_hinh.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp')):
                    self.tong_tep += 1
    
    lat_anh(self, duong_dan_hinh_anh, duong_dan_xuat):
        """Lật hình ảnh theo chiều ngang và lưu bản sao với hậu tố."""
        try:
            with Image.open(duong_dan_hinh_anh) as img:
                img_lat = img.transpose(Image.FLIP_LEFT_RIGHT)
                img_lat.save(duong_dan_xuat)
            return True
        except Exception as e:
            print(f"Không thể xử lý hình ảnh {duong_dan_hinh_anh}: {e}")
            return False
    
    def xu_ly_hinh_anh(self):
        """Xử lý tất cả hình ảnh trong thư mục và thư mục con."""
        self.tinh_tong_tep()
        
        for thu_muc_goc, thu_muc_con, tep in os.walk(self.thu_muc_xu_ly):
            for tep_hinh in tep:
                if tep_hinh.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp')):
                    duong_dan_goc = os.path.join(thu_muc_goc, tep_hinh)
                    ten_tep, phan_mo_rong = os.path.splitext(tep_hinh)
                    duong_dan_xuat = os.path.join(thu_muc_goc, f"{ten_tep}(1){phan_mo_rong}")
                    
                    if not os.path.exists(duong_dan_xuat):  # Tránh ghi đè tệp đã tồn tại
                        if self.lat_anh(duong_dan_goc, duong_dan_xuat):
                            self.da_xu_ly += 1
                    
                    # In tiến độ xử lý
                    print(f"Tiến độ xử lý: {self.da_xu_ly}/{self.tong_tep} ({(self.da_xu_ly/self.tong_tep)*100:.2f}%)")

def main():
    duong_dan = input("Vui lòng nhập đường dẫn thư mục cần xử lý: ")
    if os.path.exists(duong_dan) and os.path.isdir(duong_dan):
        xu_ly = XuLyHinhAnh(duong_dan)
        xu_ly.xu_ly_hinh_anh()
        print("Hoàn thành xử lý hình ảnh.")
    else:
        print("Đường dẫn không hợp lệ hoặc không phải là thư mục.")

# Chạy script
main()

5.Tạo văn bản dựa trên tên tệp và loại bỏ các phần tử dư thừa, chỉ giữ lại mô tả

import os
import re

class TaoTepVanBan:
    def __init__(self, thu_muc_goc):
        self.thu_muc_goc = thu_muc_goc
        self.tep_txt_da_tao = []
        self.dau ngoac_pattern = re.compile(r'\(\d+\)')
        self.dau_gach_duong = "_"
    
    def tao_tep_tu_hinh_anh(self):
        """Tạo tệp văn bản từ tên tệp hình ảnh."""
        if not os.path.exists(self.thu_muc_goc):
            print("Đường dẫn không tồn tại, vui lòng kiểm tra lại.")
            return
        
        # Duyệt qua thư mục và tất cả thư mục con
        for duong_dan, thu_muc, tep in os.walk(self.thu_muc_goc):
            for tep_hinh in tep:
                # Kiểm tra tệp có phải là hình ảnh không
                if tep_hinh.endswith(('.jpg', '.png', '.jpeg')):
                    # Lấy tên tệp không có phần mở rộng
                    ten_co_so = os.path.splitext(tep_hinh)[0]
                    
                    # Tạo đường dẫn tệp txt tương ứng
                    duong_dan_txt = os.path.join(duong_dan, ten_co_so + '.txt')
                    self.tep_txt_da_tao.append(duong_dan_txt)
                    
                    # Ghi tên tệp (không có phần mở rộng) vào tệp txt
                    with open(duong_dan_txt, 'w', encoding='utf-8') as tep_txt:
                        tep_txt.write(ten_co_so)
        
        print("Đã tạo xong các tệp txt tương ứng với hình ảnh.")
    
    def chinh_sua_noi_dung_txt(self):
        """Chỉnh sửa nội dung các tệp txt, loại bỏ dấu ngoặc và số, chuyển dấu gạch dưới thành dấu phẩy."""
        for duong_dan_txt in self.tep_txt_da_tao:
            with open(duong_dan_txt, 'r', encoding='utf-8') as tep:
                noi_dung = tep.read()
            
            # Xóa dấu ngoặc và số bên trong
            noi_dung = self.dau ngoac_pattern.sub('', noi_dung)
            # Thay thế dấu gạch dưới bằng dấu phẩy
            noi_dung = noi_dung.replace(self.dau_gach_duong, ",")
            
            with open(duong_dan_txt, 'w', encoding='utf-8') as tep:
                tep.write(noi_dung)
        
        print("Đã xóa dấu ngoặc và số trong nội dung tệp txt, và chuyển đổi dấu gạch dưới thành dấu phẩy.")

def main():
    # Yêu cầu người dùng nhập đường dẫn thư mục hình ảnh
    thu_muc_goc = input("Vui lòng nhập đường dẫn đầy đủ của thư mục chứa hình ảnh: ")
    tao_tep = TaoTepVanBan(thu_muc_goc)
    tao_tep.tao_tep_tu_hinh_anh()
    tao_tep.chinh_sua_noi_dung_txt()

# Chạy hàm
main()

Thẻ: Midjourney lora xử lý dữ liệu huấn luyện mô hình xử lý hình ảnh

Đăng vào ngày 3 tháng 6 lúc 17:50