progress
1205
.vscode/PythonImportHelper-v2-Completion.json
vendored
Normal file
|
@ -73,6 +73,7 @@ export class SpawnProcessUseCase {
|
|||
subprocess.on("close", (code) => {
|
||||
console.log(`Процесс завершился с кодом: ${code}`);
|
||||
});
|
||||
return Result.ok('ok');
|
||||
} catch (error) {
|
||||
return Result.error(error);
|
||||
}
|
||||
|
|
|
@ -15,16 +15,14 @@ export class ExecCalculationInstanceProcessScenario extends CallbackStrategyWith
|
|||
async (model) => {
|
||||
const fileOutPath = model.instancePath.pathNormalize() + "/form.json";
|
||||
return (await new IsHaveActiveProcessUseCase().call()).map(async () => {
|
||||
const execCommand = `${
|
||||
model.script
|
||||
} --path ${model.instancePath.pathNormalize()} --form ${fileOutPath}`.replace("\n", "");
|
||||
|
||||
const execCommand = `${model.script
|
||||
} --path ${model.instancePath.pathNormalize()} --form ${fileOutPath}`.replace("\n", "");
|
||||
|
||||
await new CreateFileUseCase().call(fileOutPath, Buffer.from(JSON.stringify(model.formBuilder)));
|
||||
await CalculationInstanceDBModel.findById(id).updateOne({
|
||||
processStatus: "RUN",
|
||||
lastProcessExecCommand: execCommand,
|
||||
});
|
||||
|
||||
new ExecProcessUseCase().call(
|
||||
// @ts-expect-error
|
||||
`${model.project.rootDir}/`,
|
||||
|
|
|
@ -14,7 +14,7 @@ export class ExecSimulationUseCase extends CallbackStrategyWithValidationModel<E
|
|||
App.staticFilesStoreDir(),
|
||||
el.execCommand.replace("${dir_path}", "/Users/idontsudo/train"),
|
||||
"btBuilder",
|
||||
new ProcessWatcher(2000, "localhost")
|
||||
new ProcessWatcher()
|
||||
);
|
||||
return Result.ok("200");
|
||||
});
|
||||
|
|
|
@ -1,13 +1,29 @@
|
|||
import { CrudController } from "../../core/controllers/crud_controller";
|
||||
import { ExecRunTimeCommandValidationModel } from "./model/run_time_validation_model";
|
||||
import { ExecRuntimeDatabaseModel } from "./model/run_time_database_model";
|
||||
import { CoreHttpController, SubRouter, HttpMethodType } from "../../core/controllers/http_controller";
|
||||
import { CoreHttpController, SubRouter, HttpMethodType, CallbackStrategyWithIdQuery, ResponseBase } from "../../core/controllers/http_controller";
|
||||
import { ExecBtBuilderUseCase } from "./domain/exec_bt_builder_usecase";
|
||||
import { ExecSimulationUseCase } from "./domain/exec_simulation_usecase";
|
||||
import { GetBtBuilderStateUseCase } from "./domain/get_bt_builder_status_usecase";
|
||||
import { GetSimulationStateScenario } from "./domain/get_simulation_state_usecase";
|
||||
import { MongoIdValidation } from "../../core/validations/mongo_id_validation";
|
||||
import { CoreValidation } from "../../core/validations/core_validation";
|
||||
import { ReadByIdDataBaseModelUseCase } from "../../core/usecases/read_by_id_database_model_usecase";
|
||||
import { ICalculationInstance, CalculationInstanceDBModel } from "../calculations_instance/models/calculations_instance_database_model";
|
||||
import { Result } from "../../core/helpers/result";
|
||||
import { SpawnProcessUseCase } from "../../core/usecases/exec_process_usecase";
|
||||
import { ProcessWatcher } from "./service/process_watcher";
|
||||
|
||||
export class RunTimePresentation extends CoreHttpController<ExecRunTimeCommandValidationModel> {
|
||||
class ExecAnalyzeScenario extends CallbackStrategyWithIdQuery {
|
||||
|
||||
idValidationExpression: CoreValidation = new MongoIdValidation()
|
||||
call = async (id: string) =>
|
||||
(await new ReadByIdDataBaseModelUseCase<ICalculationInstance>(CalculationInstanceDBModel).call(id)).map(async (model) =>
|
||||
(await new SpawnProcessUseCase().call('/Users/idontsudo/webservice', `nix run github:nixos/nixpkgs#python312Packages.tensorboard -- --logdir ${model.instancePath}`, "", new ProcessWatcher())).map(() => Result.ok('ok'),),
|
||||
)
|
||||
}
|
||||
|
||||
export class RunTimePresentation extends CrudController<ExecRunTimeCommandValidationModel, any> {
|
||||
constructor() {
|
||||
super({
|
||||
url: "run_time",
|
||||
|
@ -16,6 +32,7 @@ export class RunTimePresentation extends CoreHttpController<ExecRunTimeCommandVa
|
|||
this.subRoutes.push(new SubRouter("POST", "/exec/bt/builder", new ExecBtBuilderUseCase()));
|
||||
this.subRoutes.push(new SubRouter("POST", "/get/bt/builder/state", new GetBtBuilderStateUseCase()));
|
||||
this.subRoutes.push(new SubRouter("POST", "/get/simulator/state", new GetSimulationStateScenario()));
|
||||
this.subRoutes.push(new SubRouter('POST', "exec/analyze", new ExecAnalyzeScenario()))
|
||||
this.subRoutes.push({
|
||||
method: "POST",
|
||||
subUrl: "/exec/simulation/",
|
||||
|
|
|
@ -4,19 +4,16 @@ import { ExecError, SpawnError } from "../../../core/models/exec_error_model";
|
|||
import { ExecutorResult } from "../../../core/models/executor_result";
|
||||
|
||||
export class ProcessWatcher extends TypedEvent<Result<ExecError | SpawnError, ExecutorResult>> {
|
||||
logs = "";
|
||||
delay: number;
|
||||
constructor(delay: number, pattern: string) {
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
this.on(this.lister);
|
||||
setTimeout(() => {
|
||||
console.log(this.logs);
|
||||
}, delay);
|
||||
|
||||
}
|
||||
|
||||
lister = (event: Result<ExecError | SpawnError, ExecutorResult>) => {
|
||||
event.map(async (success) => {
|
||||
this.logs += success.data;
|
||||
console.log(success.data)
|
||||
});
|
||||
};
|
||||
}
|
||||
|
|
|
@ -17,11 +17,7 @@ export class CreateRobotScenario extends CallbackStrategyWithValidationModel<Rob
|
|||
)
|
||||
).map((projectModel) => {
|
||||
const { rootDir } = projectModel[0];
|
||||
console.log(
|
||||
`python3 $PYTHON_ROBOT_BUILDER --path ${
|
||||
projectModel[0].rootDir + "/" + StaticFilesProject.robots + "/"
|
||||
} --name ${model.name} --nDOF ${model.nDof} --toolType ${model.toolType}`
|
||||
);
|
||||
|
||||
return new GetServerAddressUseCase().call().map(async (serverAddress) =>
|
||||
(
|
||||
await new ExecProcessUseCase().call(
|
||||
|
|
|
@ -3,7 +3,8 @@ import { App } from "./core/controllers/app";
|
|||
import { SocketSubscriber } from "./core/controllers/socket_controller";
|
||||
import { extensions } from "./core/extensions/extensions";
|
||||
import { httpRoutes } from "./core/controllers/routes";
|
||||
import { executorProgramService } from "./core/usecases/exec_process_usecase";
|
||||
import { SpawnProcessUseCase, executorProgramService } from "./core/usecases/exec_process_usecase";
|
||||
import { ProcessWatcher } from "./features/runtime/service/process_watcher";
|
||||
|
||||
extensions();
|
||||
|
||||
|
|
|
@ -127,16 +127,6 @@ export abstract class FormState<V, E> extends UiErrorState<E> {
|
|||
this.viewModel = plainToInstance(instance, viewModel);
|
||||
};
|
||||
}
|
||||
abstract class Foo {
|
||||
abstract init?(): void;
|
||||
}
|
||||
interface Foo1 {
|
||||
init?(param1: number | undefined): void;
|
||||
}
|
||||
class Bar implements Foo1 {}
|
||||
export interface LifeCycleStore {
|
||||
init?(navigate?: NavigateFunction | undefined): void;
|
||||
dispose?(): void;
|
||||
}
|
||||
|
||||
|
||||
class VVV implements LifeCycleStore {}
|
||||
|
|
@ -83,7 +83,7 @@ export const getModelCard = (
|
|||
|
||||
{match(calculationModel.card ?? "")
|
||||
.with(CardModel.pose_estimate, () => {
|
||||
return <PoseEstimateCard dependency={calculationModel.formBuilder} empty={false} />;
|
||||
return <PoseEstimateCard dependency={calculationModel} empty={false} />;
|
||||
})
|
||||
.otherwise(() => {
|
||||
return <></>;
|
||||
|
|
|
@ -1,6 +1,12 @@
|
|||
|
||||
import makeAutoObservable from "mobx-store-inheritance";
|
||||
import { ButtonV2 } from "../../../../../../core/ui/button/button_v2";
|
||||
import { HttpMethod, HttpRepository } from "../../../../../../core/repository/core_http_repository";
|
||||
import { useStore } from "../../../../../../core/helper/use_store";
|
||||
import { UiErrorState } from "../../../../../../core/store/base_store";
|
||||
import { NavigateFunction } from "react-router-dom";
|
||||
|
||||
export interface IModelCardProps {
|
||||
_id?: string;
|
||||
dependency?: Object;
|
||||
processStatus?: string;
|
||||
name?: string;
|
||||
|
@ -16,13 +22,31 @@ export interface IModelCardProps {
|
|||
datasetName?: string;
|
||||
epochNextTraining?: number;
|
||||
}
|
||||
|
||||
export class PoseEstimateRepository extends HttpRepository {
|
||||
execAnalyze = (id: string) => this._jsonRequest(HttpMethod.POST, `/run_time/exec/analyze?id=${id}`);
|
||||
}
|
||||
export class PoseEstimateStore extends UiErrorState<any> {
|
||||
navigate?: NavigateFunction;
|
||||
poseEstimateRepository = new PoseEstimateRepository();
|
||||
constructor() {
|
||||
super();
|
||||
makeAutoObservable(this);
|
||||
}
|
||||
async init(navigate?: NavigateFunction | undefined) {
|
||||
this.navigate = navigate;
|
||||
}
|
||||
onClickExecAnalyze = async (id: string) =>
|
||||
(await this.poseEstimateRepository.execAnalyze(id)).fold(
|
||||
() => {
|
||||
setTimeout(() => {
|
||||
window.open("http://localhost:6006/", "mozillaWindow", "popup");
|
||||
}, 3000);
|
||||
},
|
||||
() => {}
|
||||
);
|
||||
}
|
||||
export const PoseEstimateCard = (props: IModelCardProps) => {
|
||||
return (
|
||||
<div
|
||||
|
||||
>
|
||||
ModelCard
|
||||
</div>
|
||||
);
|
||||
const store = useStore(PoseEstimateStore);
|
||||
// @ts-ignore
|
||||
return <ButtonV2 onClick={() => store.onClickExecAnalyze(props.dependency._id ?? "")} text="Запустить анализ" />;
|
||||
};
|
||||
|
|
BIN
web_p/train/F1_curve.png
Normal file
After Width: | Height: | Size: 81 KiB |
BIN
web_p/train/PR_curve.png
Normal file
After Width: | Height: | Size: 73 KiB |
BIN
web_p/train/P_curve.png
Normal file
After Width: | Height: | Size: 71 KiB |
BIN
web_p/train/R_curve.png
Normal file
After Width: | Height: | Size: 86 KiB |
105
web_p/train/args.yaml
Normal file
|
@ -0,0 +1,105 @@
|
|||
task: detect
|
||||
mode: train
|
||||
model: /home/shalenikol/fork_work/webservice/server/build/public/4c4f3909-74b0-4206-aec1-fc4acd3a1081/weights/od_w01/yolov8n.pt
|
||||
data: /home/shalenikol/fork_work/webservice/server/build/public/4c4f3909-74b0-4206-aec1-fc4acd3a1081/weights/od_w01/rbs_train.yaml
|
||||
epochs: 33
|
||||
time: null
|
||||
patience: 50
|
||||
batch: 16
|
||||
imgsz: 640
|
||||
save: true
|
||||
save_period: -1
|
||||
cache: false
|
||||
device: null
|
||||
workers: 8
|
||||
project: /home/shalenikol/fork_work/webservice/server/build/public/4c4f3909-74b0-4206-aec1-fc4acd3a1081/weights/od_w01
|
||||
name: train
|
||||
exist_ok: false
|
||||
pretrained: true
|
||||
optimizer: auto
|
||||
verbose: true
|
||||
seed: 0
|
||||
deterministic: true
|
||||
single_cls: false
|
||||
rect: false
|
||||
cos_lr: false
|
||||
close_mosaic: 10
|
||||
resume: false
|
||||
amp: true
|
||||
fraction: 1.0
|
||||
profile: false
|
||||
freeze: null
|
||||
multi_scale: false
|
||||
overlap_mask: true
|
||||
mask_ratio: 4
|
||||
dropout: 0.0
|
||||
val: true
|
||||
split: val
|
||||
save_json: false
|
||||
save_hybrid: false
|
||||
conf: null
|
||||
iou: 0.7
|
||||
max_det: 300
|
||||
half: false
|
||||
dnn: false
|
||||
plots: true
|
||||
source: null
|
||||
vid_stride: 1
|
||||
stream_buffer: false
|
||||
visualize: false
|
||||
augment: false
|
||||
agnostic_nms: false
|
||||
classes: null
|
||||
retina_masks: false
|
||||
embed: null
|
||||
show: false
|
||||
save_frames: false
|
||||
save_txt: false
|
||||
save_conf: false
|
||||
save_crop: false
|
||||
show_labels: true
|
||||
show_conf: true
|
||||
show_boxes: true
|
||||
line_width: null
|
||||
format: torchscript
|
||||
keras: false
|
||||
optimize: false
|
||||
int8: false
|
||||
dynamic: false
|
||||
simplify: false
|
||||
opset: null
|
||||
workspace: 4
|
||||
nms: false
|
||||
lr0: 0.01
|
||||
lrf: 0.01
|
||||
momentum: 0.937
|
||||
weight_decay: 0.0005
|
||||
warmup_epochs: 3.0
|
||||
warmup_momentum: 0.8
|
||||
warmup_bias_lr: 0.1
|
||||
box: 7.5
|
||||
cls: 0.5
|
||||
dfl: 1.5
|
||||
pose: 12.0
|
||||
kobj: 1.0
|
||||
label_smoothing: 0.0
|
||||
nbs: 64
|
||||
hsv_h: 0.015
|
||||
hsv_s: 0.7
|
||||
hsv_v: 0.4
|
||||
degrees: 0.0
|
||||
translate: 0.1
|
||||
scale: 0.5
|
||||
shear: 0.0
|
||||
perspective: 0.0
|
||||
flipud: 0.0
|
||||
fliplr: 0.5
|
||||
mosaic: 1.0
|
||||
mixup: 0.0
|
||||
copy_paste: 0.0
|
||||
auto_augment: randaugment
|
||||
erasing: 0.4
|
||||
crop_fraction: 1.0
|
||||
cfg: null
|
||||
tracker: botsort.yaml
|
||||
save_dir: /home/shalenikol/fork_work/webservice/server/build/public/4c4f3909-74b0-4206-aec1-fc4acd3a1081/weights/od_w01/train
|
BIN
web_p/train/confusion_matrix.png
Normal file
After Width: | Height: | Size: 82 KiB |
BIN
web_p/train/confusion_matrix_normalized.png
Normal file
After Width: | Height: | Size: 85 KiB |
BIN
web_p/train/labels.jpg
Normal file
After Width: | Height: | Size: 124 KiB |
BIN
web_p/train/labels_correlogram.jpg
Normal file
After Width: | Height: | Size: 141 KiB |
34
web_p/train/results.csv
Normal file
|
@ -0,0 +1,34 @@
|
|||
epoch, train/box_loss, train/cls_loss, train/dfl_loss, metrics/precision(B), metrics/recall(B), metrics/mAP50(B), metrics/mAP50-95(B), val/box_loss, val/cls_loss, val/dfl_loss, lr/pg0, lr/pg1, lr/pg2
|
||||
1, 0.62674, 1.281, 0.92555, 0.99239, 0.99448, 0.99323, 0.90966, 0.40212, 0.8264, 0.80447, 0.00066247, 0.00066247, 0.00066247
|
||||
2, 0.60996, 0.71899, 0.93387, 0.9945, 0.99945, 0.99484, 0.91551, 0.43253, 0.60301, 0.8228, 0.0012893, 0.0012893, 0.0012893
|
||||
3, 0.58648, 0.54879, 0.92909, 1, 0.98871, 0.99494, 0.9213, 0.40211, 0.39327, 0.81593, 0.0018761, 0.0018761, 0.0018761
|
||||
4, 0.58195, 0.48301, 0.92375, 0.99087, 0.9337, 0.97172, 0.89393, 0.41614, 0.46785, 0.82069, 0.00182, 0.00182, 0.00182
|
||||
5, 0.56201, 0.44926, 0.92381, 0.99447, 0.99385, 0.99494, 0.94951, 0.34807, 0.32406, 0.8013, 0.00182, 0.00182, 0.00182
|
||||
6, 0.52696, 0.40581, 0.9068, 0.95813, 0.98343, 0.99281, 0.94494, 0.33023, 0.48053, 0.79401, 0.00176, 0.00176, 0.00176
|
||||
7, 0.51017, 0.3952, 0.90752, 0.99889, 1, 0.995, 0.95388, 0.3192, 0.33973, 0.7992, 0.0017, 0.0017, 0.0017
|
||||
8, 0.50772, 0.37889, 0.90238, 0.98351, 0.98842, 0.98581, 0.94918, 0.30154, 0.28504, 0.79667, 0.00164, 0.00164, 0.00164
|
||||
9, 0.47737, 0.3576, 0.89251, 0.99946, 0.99448, 0.995, 0.97205, 0.28135, 0.23642, 0.79101, 0.00158, 0.00158, 0.00158
|
||||
10, 0.46587, 0.34547, 0.89324, 0.99948, 1, 0.995, 0.96897, 0.28021, 0.28522, 0.78694, 0.00152, 0.00152, 0.00152
|
||||
11, 0.45881, 0.33452, 0.89055, 0.99954, 1, 0.995, 0.97012, 0.26364, 0.21443, 0.7813, 0.00146, 0.00146, 0.00146
|
||||
12, 0.44939, 0.32887, 0.89206, 0.9996, 1, 0.995, 0.98382, 0.24486, 0.20614, 0.78109, 0.0014, 0.0014, 0.0014
|
||||
13, 0.44388, 0.32289, 0.88796, 0.99932, 1, 0.995, 0.97195, 0.27681, 0.21443, 0.77933, 0.00134, 0.00134, 0.00134
|
||||
14, 0.43847, 0.31282, 0.88496, 0.99965, 1, 0.995, 0.98019, 0.25014, 0.20255, 0.7775, 0.00128, 0.00128, 0.00128
|
||||
15, 0.41585, 0.30067, 0.8774, 0.99943, 1, 0.995, 0.97609, 0.25842, 0.21239, 0.78006, 0.00122, 0.00122, 0.00122
|
||||
16, 0.41436, 0.29784, 0.87488, 0.99964, 1, 0.995, 0.97823, 0.25499, 0.19837, 0.78004, 0.00116, 0.00116, 0.00116
|
||||
17, 0.414, 0.29771, 0.87575, 0.99943, 1, 0.995, 0.98746, 0.2251, 0.203, 0.77468, 0.0011, 0.0011, 0.0011
|
||||
18, 0.39273, 0.29075, 0.86927, 0.99445, 1, 0.995, 0.98597, 0.22693, 0.19648, 0.77208, 0.00104, 0.00104, 0.00104
|
||||
19, 0.40052, 0.28802, 0.87804, 0.99958, 1, 0.995, 0.98541, 0.22268, 0.18749, 0.77233, 0.00098, 0.00098, 0.00098
|
||||
20, 0.38066, 0.27951, 0.86666, 0.99969, 1, 0.995, 0.98901, 0.20959, 0.1775, 0.7697, 0.00092, 0.00092, 0.00092
|
||||
21, 0.38115, 0.27813, 0.8658, 0.99964, 1, 0.995, 0.98895, 0.20699, 0.1779, 0.77073, 0.00086, 0.00086, 0.00086
|
||||
22, 0.37441, 0.27094, 0.87121, 0.99965, 1, 0.995, 0.98975, 0.20138, 0.17235, 0.76785, 0.0008, 0.0008, 0.0008
|
||||
23, 0.36808, 0.26148, 0.86426, 0.99965, 1, 0.995, 0.98829, 0.19861, 0.1628, 0.76706, 0.00074, 0.00074, 0.00074
|
||||
24, 0.25547, 0.199, 0.77555, 0.99955, 1, 0.995, 0.98791, 0.21853, 0.18063, 0.76972, 0.00068, 0.00068, 0.00068
|
||||
25, 0.24799, 0.1969, 0.78404, 0.99958, 1, 0.995, 0.98812, 0.23069, 0.18178, 0.76985, 0.00062, 0.00062, 0.00062
|
||||
26, 0.24232, 0.1915, 0.78022, 0.99968, 1, 0.995, 0.99024, 0.20883, 0.16788, 0.76752, 0.00056, 0.00056, 0.00056
|
||||
27, 0.23288, 0.1839, 0.77463, 0.99968, 1, 0.995, 0.99151, 0.2026, 0.16501, 0.76809, 0.0005, 0.0005, 0.0005
|
||||
28, 0.23066, 0.18012, 0.77547, 0.99961, 1, 0.995, 0.98912, 0.19388, 0.1534, 0.76246, 0.00044, 0.00044, 0.00044
|
||||
29, 0.22286, 0.17062, 0.77932, 0.9997, 1, 0.995, 0.99039, 0.20566, 0.14978, 0.76601, 0.00038, 0.00038, 0.00038
|
||||
30, 0.21427, 0.16357, 0.77529, 0.9997, 1, 0.995, 0.99215, 0.18345, 0.14148, 0.76206, 0.00032, 0.00032, 0.00032
|
||||
31, 0.20895, 0.16067, 0.77189, 0.9997, 1, 0.995, 0.99187, 0.17027, 0.13746, 0.76124, 0.00026, 0.00026, 0.00026
|
||||
32, 0.20248, 0.15421, 0.77526, 0.9997, 1, 0.995, 0.99246, 0.17229, 0.13828, 0.76056, 0.0002, 0.0002, 0.0002
|
||||
33, 0.19494, 0.15005, 0.76361, 0.99971, 1, 0.995, 0.99302, 0.16442, 0.12543, 0.76043, 0.00014, 0.00014, 0.00014
|
|
BIN
web_p/train/results.png
Normal file
After Width: | Height: | Size: 280 KiB |
BIN
web_p/train/train_batch0.jpg
Normal file
After Width: | Height: | Size: 216 KiB |
BIN
web_p/train/train_batch1.jpg
Normal file
After Width: | Height: | Size: 206 KiB |
BIN
web_p/train/train_batch2.jpg
Normal file
After Width: | Height: | Size: 205 KiB |
BIN
web_p/train/train_batch3657.jpg
Normal file
After Width: | Height: | Size: 189 KiB |
BIN
web_p/train/train_batch3658.jpg
Normal file
After Width: | Height: | Size: 179 KiB |
BIN
web_p/train/train_batch3659.jpg
Normal file
After Width: | Height: | Size: 181 KiB |
BIN
web_p/train/val_batch0_labels.jpg
Normal file
After Width: | Height: | Size: 171 KiB |
BIN
web_p/train/val_batch0_pred.jpg
Normal file
After Width: | Height: | Size: 179 KiB |
BIN
web_p/train/val_batch1_labels.jpg
Normal file
After Width: | Height: | Size: 178 KiB |
BIN
web_p/train/val_batch1_pred.jpg
Normal file
After Width: | Height: | Size: 187 KiB |
BIN
web_p/train/val_batch2_labels.jpg
Normal file
After Width: | Height: | Size: 177 KiB |
BIN
web_p/train/val_batch2_pred.jpg
Normal file
After Width: | Height: | Size: 186 KiB |
BIN
web_p/train/weights/best.pt
Normal file
BIN
web_p/train/weights/last.pt
Normal file
24
web_p/train_mock.py
Normal file
|
@ -0,0 +1,24 @@
|
|||
import shutil
|
||||
import argparse
|
||||
import os.path
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--path")
|
||||
parser.add_argument("--form")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
|
||||
def copy_and_move_folder(src, dst):
|
||||
try:
|
||||
if os.path.exists(dst):
|
||||
shutil.rmtree(dst)
|
||||
shutil.copytree(src, dst)
|
||||
print(f"Folder {src} successfully copied")
|
||||
except shutil.Error as e:
|
||||
print(f"Error: {e}")
|
||||
|
||||
|
||||
source_folder = os.path.dirname(os.path.abspath(__file__)) + "/train/"
|
||||
|
||||
copy_and_move_folder(source_folder, args.path)
|