Akjava's picture
update explain
e9ea134
raw
history blame contribute delete
27.3 kB
import spaces
import gradio as gr
import subprocess
from PIL import Image,ImageOps,ImageDraw,ImageFilter
import json
import os
import time
import mp_box
from mp_estimate import ratios_cordinates,estimate_horizontal,estimate_vertical,mean_std_label,normalized_to_pixel,get_feature_angles_cordinate,create_detail_labels,get_feature_ratios_cordinate
from mp_utils import get_pixel_cordinate_list,extract_landmark,get_pixel_cordinate,get_pixel_xyz,get_normalized_landmarks
from glibvision.draw_utils import points_to_box,box_to_xy,plus_point
from glibvision.cv2_utils import plot_points,create_color_image,pil_to_bgr_image,set_plot_text,copy_image
from glibvision.numpy_utils import rotate_point_euler,load_data
from gradio_utils import save_image,save_buffer,clear_old_files ,read_file
import cv2
#from cv2_pose_estimate import draw_head_pose
import numpy as np
from numpy.typing import NDArray
'''
innner_eyes_blur - inner eyes blur
iris_mask_blur - final iris edge blur
'''
def process_images(image,base_image,order,
double_check_offset_center,center_index,
draw_mediapipe_mesh,z_multiply=0.8,draw_mediapipe_angle=False,draw_hozizontal_line=False,draw_vertical_line=False,draw_faceratio_line=False,
progress=gr.Progress(track_tqdm=True)):
clear_old_files()
"""
image_indices = [4,199,#6,#center of eye
133,362,#inner eye
33,263, #outer eye
61,291]#mouth
"""
def landmarks_to_model_corsinates(face_landmarks,indices,w,h):
cordinates = []
z_depth = w if w<h else h
z_depth *=z_multiply
for index in indices:
xyz = get_pixel_xyz(face_landmarker_result.face_landmarks,index,w,h)
#print(xyz,xyz[2]*z_multiply) #TODO chose?
cordinates.append([
xyz[0],xyz[1],xyz[2]*z_depth
])
return cordinates
if image == None:
raise gr.Error("Need Image")
cv2_image = pil_to_bgr_image(image)
size = cv2_image.shape
center: tuple[float, float] = (size[1] / 2, size[0] / 2)
import math
def calculate_distance(xy, xy2):
return math.sqrt((xy2[0] - xy[0])**2 + (xy2[1] - xy[1])**2)
mp_image,face_landmarker_result = extract_landmark(cv2_image,"face_landmarker.task",0,0,True)
im = mp_image.numpy_view()
h,w = im.shape[:2]
first_landmarker_result = None
def get_first_landmarker_result():
if first_landmarker_result:
return first_landmarker_result
else:
return face_landmarker_result
first_translation_vector = None
if double_check_offset_center:
root_cordinate = get_pixel_cordinate(face_landmarker_result.face_landmarks,center_index,w,h)#nose tip
diff_center_x = center[0] - root_cordinate[0]
diff_center_y = center[1] - root_cordinate[1]
base = np.zeros_like(cv2_image)
copy_image(base,cv2_image,diff_center_x,diff_center_y)
#cv2.imwrite("center.jpg",base)
first_landmarker_result = face_landmarker_result
mp_image,face_landmarker_result = extract_landmark(base,"face_landmarker.task",0,0,True)
im = mp_image.numpy_view()
transformation_matrix=first_landmarker_result.facial_transformation_matrixes[0]
rotation_matrix, first_translation_vector = transformation_matrix[:3, :3],transformation_matrix[:3, 3]
else:
diff_center_x=0
diff_center_y=0
#return base,"",""
#cordinates = get_pixel_cordinate_list(face_landmarker_result.face_landmarks,image_indices,w,h)
if draw_mediapipe_mesh:
result = first_landmarker_result
if result == None:
result = face_landmarker_result
image = mp_box.draw_landmarks_on_image(result,image)
cv2_image = pil_to_bgr_image(image)#here must be bug,but somehow working
# draw lines
#x_ratios = []
z_angles,y_ratios,h_cordinates,_ = estimate_horizontal(get_first_landmarker_result().face_landmarks)
if draw_hozizontal_line:
for cordinates in h_cordinates:
#print(cordinates)
points = normalized_to_pixel(cordinates,w,h)
#print(points)
plot_points(cv2_image,points[:2],False,5,(255,0,0),3)#last one is middle point on horizontal
_,x_ratios,v_cordinates,_ = estimate_vertical(get_first_landmarker_result().face_landmarks)
if draw_vertical_line:
for cordinates in v_cordinates:
plot_points(cv2_image,normalized_to_pixel(cordinates,w,h),False,5,(0,0,255),3,(255,0,0))#second one is middle point on vertical
#these are for training feature
key_cordinates,angles = get_feature_angles_cordinate(get_first_landmarker_result().face_landmarks)
for cordinates in key_cordinates:
pass
#plot_points(cv2_image,normalized_to_pixel(cordinates,w,h),False,5,(0,0,255),3,(255,0,0))
key_cordinates,angles = get_feature_ratios_cordinate(get_first_landmarker_result().face_landmarks)
for cordinates in key_cordinates:
pass
#plot_points(cv2_image,normalized_to_pixel(cordinates,w,h),False,5,(0,0,255),3,(255,0,0))
z_angle_text = mean_std_label(z_angles,True)
y_ratio_text = mean_std_label(y_ratios)
x_ratio_text = mean_std_label(x_ratios)
z_angle_detail = create_detail_labels(z_angles,True)
y_ratio_detail = create_detail_labels(y_ratios)
x_ratio_detail = f"forehead-chin = {np.mean(x_ratios)}"
focal_length: float = calculate_distance(cordinates[0],cordinates[1])
focal_length = focal_length*1
camera_matrix: NDArray = np.array([
[focal_length, 0, center[0]],
[0, -focal_length, center[1]],
[0, 0, 1]
], dtype="double")
dist_coeffs: NDArray = np.zeros((4, 1))
# offset center usually improve result
image_points: NDArray = np.array(cordinates, dtype="double")
from scipy.spatial.transform import Rotation as R
def print_euler(rotation_vector,label=""):
order = "yxz"
rotation_matrix, _ = cv2.Rodrigues(rotation_vector)
r = R.from_matrix(rotation_matrix)
euler_angles = r.as_euler(order, degrees=True)
label = f"{label} Euler Angles {order} (degrees): {euler_angles}"
return label
rotation_vector = None
translation_vector = None
im_with_pose = cv2_image
mediapipe_text = None
def face_landmarker_result_to_angle_label(face_landmarker_result,order="yxz"):
if len(face_landmarker_result.facial_transformation_matrixes)>0:
transformation_matrix=face_landmarker_result.facial_transformation_matrixes[0]
rotation_matrix, translation_vector = transformation_matrix[:3, :3],transformation_matrix[:3, 3]
#TODO change base-size
vector_multiply=10
scaled_translation_vector =(translation_vector[0]*vector_multiply,translation_vector[1]*vector_multiply,translation_vector[2]*vector_multiply)
#scaled_translation_vector = (-512,-512,-1024)
#im_with_pose = draw_head_pose(im_with_pose, image_points, rotation_matrix, scaled_translation_vector, camera_matrix, dist_coeffs,32,-diff_center_x,-diff_center_y)
#print("mediapipe",scaled_translation_vector)
#mediapipe_label = print_euler(rotation_vector,"MediaPipe")
r = R.from_matrix(rotation_matrix)
euler_angles = r.as_euler(order, degrees=True)
#label = f"Media pipe {order}-Euler Angles [x,y,z] (degrees): [{euler_angles[1]:.2f},{euler_angles[0]:.2f},{euler_angles[2]:.2f}]"
label = f"[{order[0]}:{euler_angles[0]:.2f},{order[1]}:{-euler_angles[1]:.2f},{order[2]}:{-euler_angles[2]:.2f}]"
return label,rotation_matrix,scaled_translation_vector
if first_landmarker_result != None:
mediapipe_first_text,_,_ = face_landmarker_result_to_angle_label(first_landmarker_result,order)
else:
mediapipe_first_text = ""
mediapipe_second_text,rotation_matrix,scaled_translation_vector = face_landmarker_result_to_angle_label(face_landmarker_result,order)
rotation_vector, _ = cv2.Rodrigues(rotation_matrix)
translation_vector = scaled_translation_vector
#if first_translation_vector.all():
# translation_vector = first_translation_vector
#im_with_pose = draw_head_pose(im_with_pose, image_points, rotation_vector, translation_vector, camera_matrix, dist_coeffs,255,-diff_center_x,-diff_center_y)
# mediapipe metrix
#print("opencv",translation_vector)
if draw_mediapipe_angle:
root_cordinate = get_pixel_xyz(get_first_landmarker_result().face_landmarks,4,w,h)
r = R.from_matrix(rotation_matrix)
euler_angles = r.as_euler("yxz", degrees=False)
#print(r.as_euler("yxz", degrees=True))
draw_cordinate1=rotate_point_euler((0,0,-100),[-euler_angles[1],euler_angles[0],euler_angles[2]],"yxz")
draw_cordinate2=rotate_point_euler((0,0,-200),[-euler_angles[1],euler_angles[0],euler_angles[2]],"yxz")
plot_points(im_with_pose,[root_cordinate[:2]+draw_cordinate1[:2],root_cordinate[:2]+draw_cordinate2[:2],root_cordinate[:2]],False,5,(0,128,0),3,(0,255,0))
#analyze face ratios
landmarks = get_normalized_landmarks(get_first_landmarker_result().face_landmarks)
face_ratio_infos = []
#print("landmark",[landmarks[37],landmarks[267]])
#print("numpy",np.array([landmarks[37],landmarks[267]]))
#print("mean",np.mean(np.array([landmarks[37],landmarks[267]]),axis=0))
v_cordinates=[
["philtrum",landmarks[175],landmarks[13],np.mean((landmarks[164],landmarks[2]),axis=0).tolist()],
["straight",landmarks[175],landmarks[94],landmarks[9]],
["face",landmarks[175],landmarks[9],landmarks[127],landmarks[356]],
["r-eyes",landmarks[33],landmarks[190],landmarks[414]],
["r-contour",landmarks[127],landmarks[33],landmarks[190]],
["l-eyes",landmarks[263],landmarks[414],landmarks[190]],
["l-contour",landmarks[356],landmarks[263],landmarks[414]],
["lips",landmarks[17],landmarks[13],np.mean((landmarks[37],landmarks[267]),axis=0).tolist()],
["mouth-eye",landmarks[61],landmarks[291],landmarks[133],landmarks[362]],
]
for cordinates in v_cordinates:
ratio=ratios_cordinates(cordinates[1:])
if draw_faceratio_line:
plot_points(cv2_image,normalized_to_pixel(cordinates[1:],w,h),False,5,(0,255,255),3,(255,255,0))
label = f"{cordinates[0]}:{ratio:.2f}"
face_ratio_infos.append(label)
face_ratio_info=",".join(face_ratio_infos)
return cv2.cvtColor(im_with_pose,cv2.COLOR_BGR2RGB),mediapipe_first_text,mediapipe_second_text,z_angle_text,y_ratio_text,x_ratio_text,z_angle_detail,y_ratio_detail,x_ratio_detail,face_ratio_info
#deprecated
def find_nearest_weighted_euclidean_2d(target_angles_full, all_angles_full, weights):
target_angles = target_angles_full[:5] # 最初の3つの角度を使用
all_angles = all_angles_full[:, :5] # 最初の3列を使用
weighted_diff = (all_angles - target_angles) * weights
distances = np.linalg.norm(weighted_diff, axis=1)
nearest_index = np.argmin(distances)
return nearest_index, all_angles_full[nearest_index]
import math
from mp_estimate import estimate_horizontal_points ,estimate_vertical_points,estimate_rotations_v2
import joblib
stacking8_model = joblib.load(f"models/stacking8.joblib")
cached_models = {}
def find_angles(image,order):
if image is None:
raise gr.Error("need image")
cv2_image = pil_to_bgr_image(image)
size = cv2_image.shape
mp_image,face_landmarker_result = extract_landmark(cv2_image,"face_landmarker.task",0,0,True)
features_text = estimate_rotations_v2(face_landmarker_result)
features_value_origin = [float(value) for value in features_text.split(",")]
features_value = features_value_origin.copy()
print("features x-angle",math.degrees(features_value[3])-90)
#print(features_value)
#weights = np.array([0.2, 0.2,0.3,0.3])
#index,matched = find_nearest_weighted_euclidean_2d(target_angles,all_angles,weights)
#index,matched = find_nearest_euclidean_2d(target_angles,all_angles)
#formatted_arr = [np.format_float_positional(x) for x in matched]
#print(formatted_arr)
x_ratios = 11 #magic vertical ratios
#short
features_values = [
[np.add(features_value[-x_ratios:],features_value[0:1])],
[features_value[:-x_ratios]],
[np.hstack([features_value[ 3:5],features_value[ 6:-x_ratios]])]
#[features_value[:-x_ratios]]
]
from scipy.spatial.transform import Rotation as R
def flatten_for(lst):
return [round(item, 3) for sublist in lst for item in sublist]
def change_euler_order(orderd_array,from_order,to_order,degrees=True):
r = R.from_euler(from_order,orderd_array,degrees=degrees)
result = r.as_euler(to_order,degrees=degrees)
return np.round(result,2).tolist()
def load_joblib(path):
if path in cached_models:
return cached_models[path]
else:
model = joblib.load(path)
cached_models[path] = model
return model
def estimate(model_path,scaler_path,features_values,multi=True):
scalers = load_joblib("models/"+scaler_path)
if not isinstance(scalers,list):
scalers=(scalers,scalers,scalers)
for i,scaler in enumerate(scalers):
#print(i,scaler)
features_values[i] = scaler.transform(features_values[i].copy())
result_preds=[]
models = load_joblib("models/"+model_path)
if multi:
for i,model in enumerate(models):
y_pred = model.predict(features_values[i])
result_preds.append(y_pred.round(2))
result_preds=flatten_for(result_preds)
yxz =[result_preds[1],result_preds[0],result_preds[2]]
else:
result_preds=models.predict(features_values[0])
result_preds=flatten_for(result_preds)
#yxz=flatten_for(yxz)
#yxz =[yxz[1],yxz[0],yxz[2]]
#zyx = change_euler_order(yxz,"yxz","zyx")
#return [round(zyx[2],2),round(zyx[1],2),round(zyx[0],2)]#
return result_preds # yxz-orderd x,y,z
def estimate2(model_key,features_values):
model_path=f"models/{model_key}.joblib"
scaler_path=f"models/{model_key}_scaler.joblib"
polynomial_path=f"models/{model_key}_polynomial_features.joblib"
selectkbest_path=f"models/{model_key}_selectkbest.joblib"
model = load_joblib(model_path)
scaler = load_joblib(scaler_path)
polynomial = load_joblib(polynomial_path)
selectkbest = load_joblib(selectkbest_path)
result_preds=[]
for i in range(3):
x = polynomial[i].transform(features_values[i].copy())
x = selectkbest[i].transform(x)
x = scaler[i].transform(x)
y_pred = model[i].predict(x)
result_preds.append(y_pred.round(2))
return result_preds # yxz-orderd x,y,z
"""
import onnxruntime as ort
def estimate3(model_key,features_values):
model_path=f"models/{model_key}.onnx"
ort_session = ort.InferenceSession(model_path)
#result_preds=[]
#result_preds=models.predict(features_values[0])
#result_preds=flatten_for(result_preds)
input_name = ort_session.get_inputs()[0].name
input_data = features_values.astype(np.float32)
result_preds = ort_session.run(None, {input_name: input_data})
#print((result_preds))
return result_preds[0] # yxz-orderd x,y,z
"""
#short_result = estimate('linear-svr-xyz_5.joblib','linear-svr-xyz_5_scaler.joblib',features_values)
features_value = features_value_origin.copy()
features_values = [
[features_value],[features_value],[features_value]
]
#short_result = estimate('lgbm-optimizer_15.joblib','lgbm-optimizer_15_scaler.joblib',features_values.copy())
short_result = estimate2('hyper-hgr-random15',features_values.copy())
#middle_result = estimate('lgbm-xyz_90-rand47.joblib','lgbm-xyz_90-rand47_scaler.joblib',features_values.copy())
middle_result = estimate2('hyper-hgr-random45',features_values.copy())
long_result = estimate2('hyper-hgr-random90',features_values.copy())
e1_key="lgbm-optimizer_15dart_random"
short_result2a = estimate(f'{e1_key}.joblib',f'{e1_key}_scaler.joblib',features_values.copy())
e1_key="lgbm-optimizer_15_random"
short_result2 = estimate(f'{e1_key}.joblib',f'{e1_key}_scaler.joblib',features_values.copy())
e1_key="lgbm-optimizer_45_random"
middle_result2 = estimate(f'{e1_key}.joblib',f'{e1_key}_scaler.joblib',features_values.copy())
e1_key="lgbm-optimizer_90_random"
long_result2 = estimate(f'{e1_key}.joblib',f'{e1_key}_scaler.joblib',features_values.copy())
e1_key="etr_90"
long_result3 = estimate(f'{e1_key}.joblib',f'{e1_key}_scaler.joblib',features_values.copy(),False)
#long_result3 = estimate3(e1_key,np.array([features_value]))#single
#long_result3 = flatten_for(long_result3)
#long_result3 = long_result2
def average(values):
flat_values=[]
for value in values:
flat_values += [flatten_for(value)]
#print(np.mean(flat_values,axis=0))
import average
data={
"hgbr-15":flatten_for(short_result),
"hgbr-45":flatten_for(middle_result),
"hgbr-90":flatten_for(long_result),
"lgbm-15dart":(short_result2a),
"lgbm-15":(short_result2),
"lgbm-45":(middle_result2),
"lgbm-90":(long_result2),
}
stack_x = short_result2a+short_result2+middle_result2+long_result2+flatten_for(short_result)+flatten_for(middle_result)+flatten_for(long_result)+long_result3
#average_data=estimate3("stacking8",np.array([stack_x]))#onnx not
average_data=stacking8_model.predict(np.array([stack_x]))
#change order
#all data train with yxz-order x,y,z
def yxz_xyz_to_yxz(euler):
return [euler[1],euler[0],euler[2]]
average_data = change_euler_order(yxz_xyz_to_yxz(flatten_for(average_data)),"yxz",order)
short_result = change_euler_order(yxz_xyz_to_yxz(flatten_for(short_result)),"yxz",order)
middle_result = change_euler_order(yxz_xyz_to_yxz(flatten_for(middle_result)),"yxz",order)
long_result = change_euler_order(yxz_xyz_to_yxz(flatten_for(long_result)),"yxz",order)
short_result2a = change_euler_order(yxz_xyz_to_yxz(short_result2a),"yxz",order)
short_result2 = change_euler_order(yxz_xyz_to_yxz(short_result2),"yxz",order)
middle_result2 = change_euler_order(yxz_xyz_to_yxz(middle_result2),"yxz",order)
long_result2 = change_euler_order(yxz_xyz_to_yxz(long_result2),"yxz",order)
long_result3 = change_euler_order(yxz_xyz_to_yxz(long_result3),"yxz",order)
#print(data)
#average_data=average.analyze_3d_data(data.values())
#print(average_data)
#average((short_result,middle_result,long_result,short_result2a,short_result2,middle_result2,long_result2))
return average_data,short_result,middle_result,long_result,(short_result2a),(short_result2),(middle_result2),(long_result2),long_result3
#return average_data['trimmed_mean'],flatten_for(short_result),flatten_for(middle_result),flatten_for(long_result),(short_result2a),(short_result2),(middle_result2),(long_result2)
css="""
#col-left {
margin: 0 auto;
max-width: 640px;
}
#col-right {
margin: 0 auto;
max-width: 640px;
}
.grid-container {
display: flex;
align-items: center;
justify-content: center;
gap:10px
}
.image {
width: 128px;
height: 128px;
object-fit: cover;
}
.text {
font-size: 16px;
}
"""
#css=css,
with gr.Blocks(css=css, elem_id="demo-container") as demo:
with gr.Column():
gr.HTML(read_file("demo_header.html"))
gr.HTML(read_file("demo_tools.html"))
with gr.Row():
with gr.Column():
image = gr.Image(height=800,sources=['upload','clipboard'],image_mode='RGB',elem_id="image_upload", type="pil", label="Image")
with gr.Row(elem_id="prompt-container", equal_height=False):
with gr.Row():
btn = gr.Button("Head-Pose Estimate", elem_id="run_button",variant="primary")
order = gr.Dropdown(label="Order",value="xyz",choices=["xyz","xzy","yxz","yzx","zxy","zyx"],info="returened array order is same as label")
with gr.Accordion(label="Advanced Settings", open=True):
#need better landmarker
base_image = gr.Image(sources=['upload','clipboard'],image_mode='RGB',elem_id="image_upload", type="pil", label="Image",visible=False)
with gr.Row( equal_height=True):
double_check = gr.Checkbox(label="Double Check",value=True,info="move center-index and detect again(usually more accurate).recommend choose 195")
center_index = gr.Slider(info="center-index",
label="Center-index",
minimum=0,
maximum=467,
step=1,
value=195)
z_multiply = gr.Slider(info="nose height",
label="Depth-Multiply",
minimum=0.1,
maximum=1.5,
step=0.01,
value=0.8)
with gr.Row( equal_height=True):
draw_mediapipe_mesh = gr.Checkbox(label="Draw mediapipe mesh",value=True)
draw_mediapipe_angle = gr.Checkbox(label="Draw mediapipe angle(green)",value=True)
with gr.Row( equal_height=True):
draw_hozizontal_line = gr.Checkbox(label="Draw horizontal line(red)",value=True)
draw_vertical_line = gr.Checkbox(label="Draw vertical line(blue)",value=True)
draw_faceratio_line = gr.Checkbox(label="Draw Face-Ratio line(blue)",value=False)
with gr.Column():
result_image = gr.Image(height=760,label="Result", elem_id="output-animation",image_mode='RGB')
with gr.Row( equal_height=True):
mediapipe_last_text = gr.Textbox(label=f"2nd or last mediapipe result",)
mediapipe_first_text = gr.Textbox(label=f"first mediapipe result")
with gr.Row( equal_height=True):
z_angle_text = gr.Textbox(label="Z angle by horizontal-line",info="start with 0,exactly Z-Angle")
y_ratio_text = gr.Textbox(label="Y Left-Right length ratio",info="start 0.49-0.51")
x_ratio_text = gr.Textbox(label="X Up-down length ratio",info="start near 0.49,look at nose-hole-shape")
with gr.Accordion(label="Angle Ratio Details", open=False):
with gr.Row( equal_height=True):
z_angle_detail_text = gr.TextArea(label="Z-angle detail")
y_ratio_detail = gr.TextArea(label="Y-ratio detail")
x_ratio_detail = gr.TextArea(label="X-ratio detail",value="")
with gr.Row( equal_height=True):
face_ratio_info = gr.Text(label="Face Ratio",info="Average philtrum:1.82(std 0.13),straight:0.82(std 0.04),face:0.91(std 0.02),r-eyes:0.86(std 0.03),r-contour:0.77(std 0.05),l-eyes:0.86(std 0.03),l-contour:0.75(std 0.05),lips:1.43(std 0.16),mouth-eye:1.21(std 0.07)")
gr.HTML("<h5>For Rotation sometime differenct to mediapipe's result</h5>")
with gr.Row( equal_height=True):
bt_test = gr.Button("Estimate by Models")
average_result = gr.Text(label="stacking(mix of 8 results with trained weight)")
gr.HTML("<p>number is max training angle,usually stacking is works well.slow because of etr</p>")
with gr.Row( equal_height=True):
short_result = gr.Text(label="hgbr-15")
middle_result = gr.Text(label="hgbr-45")
long_result = gr.Text(label="hgbr-90")
long_result3 = gr.Text(label="etr-90")
with gr.Row( equal_height=True):
short_result2a = gr.Text(label="lgbm-15dart")
short_result2 = gr.Text(label="lgbm-15")
middle_result2 = gr.Text(label="lgbm-45")
long_result2 = gr.Text(label="lgbm-90")
#,
bt_test.click(fn=find_angles,inputs=[image,order],outputs=[average_result,short_result,middle_result,long_result,short_result2a,short_result2,middle_result2,long_result2,long_result3])
btn.click(fn=process_images, inputs=[image,base_image,order,
double_check,center_index,
draw_mediapipe_mesh,z_multiply,draw_mediapipe_angle,draw_hozizontal_line,draw_vertical_line,draw_faceratio_line,
],outputs=[result_image,mediapipe_first_text,mediapipe_last_text,z_angle_text,y_ratio_text,x_ratio_text,z_angle_detail_text,y_ratio_detail,x_ratio_detail,face_ratio_info] ,api_name='infer')
example_images = [
["examples/02316230.jpg"],
["examples/00003245_00.jpg"],
["examples/00827009.jpg"],
["examples/00002062.jpg"],
["examples/00824008.jpg"],
["examples/00825000.jpg"],
["examples/00826007.jpg"],
["examples/00824006.jpg"],
["examples/00828003.jpg"],
["examples/00002200.jpg"],
["examples/00005259.jpg"],
["examples/00018022.jpg"],
["examples/img-above.jpg"],
["examples/00100265.jpg"],
["examples/00039259.jpg"],
]
example1=gr.Examples(
examples = example_images,label="Image",
inputs=[image],examples_per_page=8
)
gr.HTML(read_file("demo_footer.html"))
if __name__ == "__main__":
demo.launch()