Update
This commit is contained in:
parent
c1214662a3
commit
f770973b5e
|
|
@ -311,9 +311,9 @@ function App() {
|
||||||
</Tabs.List>
|
</Tabs.List>
|
||||||
</Box>
|
</Box>
|
||||||
<Box className="px-4 flex items-center gap-4 w-fit">
|
<Box className="px-4 flex items-center gap-4 w-fit">
|
||||||
<Button disabled={isLoading} onClick={() => setOpenConfirm(true)} leftSection={<IconReportAnalytics size={14} />} color="#caa32c">
|
{/* <Button disabled={isLoading} onClick={() => setOpenConfirm(true)} leftSection={<IconReportAnalytics size={14} />} color="#caa32c">
|
||||||
Training
|
Training
|
||||||
</Button>
|
</Button> */}
|
||||||
<Button disabled={!clickData || isLoading} onClick={handleClearSelect} leftSection={<IconRefreshDot size={14} />} color="orange">
|
<Button disabled={!clickData || isLoading} onClick={handleClearSelect} leftSection={<IconRefreshDot size={14} />} color="orange">
|
||||||
Reset select
|
Reset select
|
||||||
</Button>
|
</Button>
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,8 @@ IMAGE_EXTENSION = ".png"
|
||||||
LOG_FILE = "training_logs.log"
|
LOG_FILE = "training_logs.log"
|
||||||
LATEST_DETECT_IMAGES = "latest_detect/images"
|
LATEST_DETECT_IMAGES = "latest_detect/images"
|
||||||
LATEST_DETECT_LABELS = "latest_detect/labels"
|
LATEST_DETECT_LABELS = "latest_detect/labels"
|
||||||
|
image_folder=""
|
||||||
|
label_folder=""
|
||||||
|
|
||||||
def get_label_names():
|
def get_label_names():
|
||||||
conn = sqlite3.connect("my_database.db")
|
conn = sqlite3.connect("my_database.db")
|
||||||
|
|
@ -75,6 +77,7 @@ for folder in [train_img_folder, train_lbl_folder, val_img_folder, val_lbl_folde
|
||||||
|
|
||||||
# 📂 Get image list
|
# 📂 Get image list
|
||||||
image_files = [f for f in os.listdir(image_folder) if f.endswith(IMAGE_EXTENSION)]
|
image_files = [f for f in os.listdir(image_folder) if f.endswith(IMAGE_EXTENSION)]
|
||||||
|
label_files = [f for f in os.listdir(label_folder) if os.path.exists(label_folder)]
|
||||||
|
|
||||||
# 🌀 Shuffle images
|
# 🌀 Shuffle images
|
||||||
random.shuffle(image_files)
|
random.shuffle(image_files)
|
||||||
|
|
@ -86,18 +89,18 @@ split_idx = int(len(image_files) * train_ratio)
|
||||||
train_files = image_files[:split_idx]
|
train_files = image_files[:split_idx]
|
||||||
val_files = image_files[split_idx:]
|
val_files = image_files[split_idx:]
|
||||||
|
|
||||||
latest_img_folder = [f for f in os.listdir(LATEST_DETECT_IMAGES) if f.endswith(IMAGE_EXTENSION)]
|
def copy_file_latest_training():
|
||||||
train_files += latest_img_folder
|
latest_img_folder = [f for f in os.listdir(LATEST_DETECT_IMAGES) if f.endswith(IMAGE_EXTENSION)]
|
||||||
# Copy latest detect images to train folder
|
train_files += latest_img_folder
|
||||||
for img_file in latest_img_folder:
|
# Copy latest detect images to train folder
|
||||||
img_path = os.path.join(LATEST_DETECT_IMAGES, img_file)
|
for img_file in latest_img_folder:
|
||||||
label_file = os.path.splitext(img_file)[0] + ".txt"
|
img_path = os.path.join(LATEST_DETECT_IMAGES, img_file)
|
||||||
label_path = os.path.join(LATEST_DETECT_LABELS, label_file)
|
label_file = os.path.splitext(img_file)[0] + ".txt"
|
||||||
|
label_path = os.path.join(LATEST_DETECT_LABELS, label_file)
|
||||||
if os.path.exists(img_path) and os.path.exists(label_path) and not os.path.exists(os.path.join(image_folder, img_file)):
|
|
||||||
shutil.copy(img_path, os.path.join(image_folder, img_file))
|
if os.path.exists(img_path) and os.path.exists(label_path) and not os.path.exists(os.path.join(image_folder, img_file)):
|
||||||
shutil.copy(label_path, os.path.join(label_folder, label_file))
|
shutil.copy(img_path, os.path.join(image_folder, img_file))
|
||||||
|
shutil.copy(label_path, os.path.join(label_folder, label_file))
|
||||||
|
|
||||||
def log_message(message: str):
|
def log_message(message: str):
|
||||||
"""Ghi log vào file"""
|
"""Ghi log vào file"""
|
||||||
|
|
@ -266,35 +269,39 @@ def train_yolo_model(
|
||||||
call_reload_model_api()
|
call_reload_model_api()
|
||||||
clear_images_source()
|
clear_images_source()
|
||||||
|
|
||||||
# 🚀 Copy files
|
if(len(label_folder) >= 20):
|
||||||
train_copied_imgs, train_copied_lbls = move_files(train_files, train_img_folder, train_lbl_folder)
|
copy_file_latest_training()
|
||||||
val_copied_imgs, val_copied_lbls = move_files(val_files, val_img_folder, val_lbl_folder)
|
|
||||||
|
|
||||||
# Create yml file
|
# 🚀 Copy files
|
||||||
create_dataset_yaml(dataset_folder, class_names)
|
train_copied_imgs, train_copied_lbls = move_files(train_files, train_img_folder, train_lbl_folder)
|
||||||
|
val_copied_imgs, val_copied_lbls = move_files(val_files, val_img_folder, val_lbl_folder)
|
||||||
|
|
||||||
|
# Create yml file
|
||||||
|
create_dataset_yaml(dataset_folder, class_names)
|
||||||
|
|
||||||
|
|
||||||
# 🏁 Log summary
|
# 🏁 Log summary
|
||||||
with open(LOG_FILE, "a") as log:
|
|
||||||
log.write(f"\n[{datetime.datetime.now()}] Dataset split completed\n")
|
|
||||||
log.write(f"Source folder: {image_folder}\n")
|
|
||||||
log.write(f"Dataset saved in: {dataset_folder}\n")
|
|
||||||
log.write(f"Planned Train: {len(train_files)} images, Val: {len(val_files)} images\n")
|
|
||||||
log.write(f"Actual Train: {train_copied_imgs} images, {train_copied_lbls} labels\n")
|
|
||||||
log.write(f"Actual Val: {val_copied_imgs} images, {val_copied_lbls} labels\n")
|
|
||||||
|
|
||||||
|
|
||||||
if(train_copied_imgs <=0 or train_copied_lbls <= 0 or val_copied_imgs <=0 or val_copied_lbls <=0):
|
|
||||||
with open(LOG_FILE, "a") as log:
|
with open(LOG_FILE, "a") as log:
|
||||||
log.write(f"\n[{datetime.datetime.now()}] Data not qualified\n")
|
log.write(f"\n[{datetime.datetime.now()}] Dataset split completed\n")
|
||||||
log.write("=" * 50 + "\n")
|
log.write(f"Source folder: {image_folder}\n")
|
||||||
else:
|
log.write(f"Dataset saved in: {dataset_folder}\n")
|
||||||
train_yolo_model(pretrained_model = get_latest_model(
|
log.write(f"Planned Train: {len(train_files)} images, Val: {len(val_files)} images\n")
|
||||||
trained_model_folder=TRAINED_MODEL_FOLDER,
|
log.write(f"Actual Train: {train_copied_imgs} images, {train_copied_lbls} labels\n")
|
||||||
default_model=PRETRAINED_MODEL),
|
log.write(f"Actual Val: {val_copied_imgs} images, {val_copied_lbls} labels\n")
|
||||||
dataset_folder = dataset_folder,
|
|
||||||
epochs = 50,
|
|
||||||
name=today_str,
|
|
||||||
project_name=model_folder_name,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
|
if(train_copied_imgs <=0 or train_copied_lbls <= 0 or val_copied_imgs <=0 or val_copied_lbls <=0):
|
||||||
|
with open(LOG_FILE, "a") as log:
|
||||||
|
log.write(f"\n[{datetime.datetime.now()}] Data not qualified\n")
|
||||||
|
log.write("=" * 50 + "\n")
|
||||||
|
else:
|
||||||
|
train_yolo_model(pretrained_model = get_latest_model(
|
||||||
|
trained_model_folder=TRAINED_MODEL_FOLDER,
|
||||||
|
default_model=PRETRAINED_MODEL),
|
||||||
|
dataset_folder = dataset_folder,
|
||||||
|
epochs = 50,
|
||||||
|
name=today_str,
|
||||||
|
project_name=model_folder_name,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
log_message(f"Date: {today_str}. Need more image for training!!")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue