Reactor is a face swap tool, i use it to get cleaner faces on images i create, and others create. Currently all the code works pretty good...except face swapping
The code:
def api_change_face(file, face_image, input_model,
input_image, processing_unit, source_choice,
output_dir):
...
result_path = os.path.join(output_dir, file) # now it exists
# โโ headers (same token you use elsewhere) โโโโโโโโโโโโโโโโโโโโโโ
headers = {
"Authorization": API_CONFIG[0]['headers']["Authorization"],
"accept": "application/json",
"Content-Type": "application/json"
}
# โโ device โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
device_choice = "CUDA" if processing_unit.upper().startswith("GPU") else "CPU"
# โโ encode images โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
with open(input_image, "rb") as f:
base64_target = base64.b64encode(f.read()).decode()
if face_image:
with open(face_image, "rb") as f:
base64_source = base64.b64encode(f.read()).decode()
else:
base64_source = ""
# โโ where to save the swapped PNG โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
result_path = os.path.join(GENERATED_DIR, file)
# โโ payload (your original fields retained) โโโโโโโโโโโโโโโโโโโโโ
payload = {
"face_model": input_model, # filename from dropdown
"source_image": base64_source,
"target_image": base64_target,
"source_faces_index": [0],
"face_index": [0],
"upscaler": "None",
"scale": 1,
"upscale_visibility": 1,
"face_restorer": "CodeFormer",
"restorer_visibility":0.7,
"codeformer_weight": 0.6,
"restore_first": 1,
"model": "inswapper_128.onnx",
"gender_source": 0,
"gender_target": 0,
"save_to_file": 1,
"result_file_path": result_path,
"device": device_choice,
"select_source": source_choice
}
# โโ call Reactor โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
r = requests.post(
"http://135.131.174.76:40221/reactor/image",
headers=headers, json=payload, timeout=120)
if r.status_code == 200:
log_message("โ
Reactor completed OK")
return result_path
else:
log_message(f"โ Reactor error {r.status_code}: {r.text}")
return None
def on_model_selected(selected_model: str) -> None:
root.face_model_var.set(selected_model)
if selected_model == "None":
log_message("โ ๏ธ Faceโswap disabled (None selected).")
return
if verify_face_model(selected_model):
log_message(f"โ
Face model chosen: {selected_model}")
else:
log_message(f"โ Model verification failed for: {selected_model}")
root.face_model_var.set("None")
And:
def on_model_selected(selected_model: str) -> None:
root.face_model_var.set(selected_model)
if selected_model == "None":
log_message("โ ๏ธ Faceโswap disabled (None selected).")
return
if verify_face_model(selected_model):
log_message(f"โ
Face model chosen: {selected_model}")
else:
log_message(f"โ Model verification failed for: {selected_model}")
root.face_model_var.set("None")
and then finally:
(i cant post the rest, no more room to do so) will post in next message, the generate command doesnt actually swap the face... but it DOES generate the correct image!