在forgeUI上加进去了那个anyline的预处理器
jingtmionaya
编辑于 2024年06月05日 00:12

嗯……编程早忘了,不会python,全靠猜着改

更新MistoLine和anyline的代码参考,forge上直接改buildin的extension

https://github.com/Mikubill/sd-webui-controlnet/commit/69d80e5a57f0add1a6007299b2d7d85ef1fc4285

备份并修改

E:\stable-diffusion-webui-forge\extensions-builtin\forge_legacy_preprocessors\annotator\teed\__init__.py

备份并修改

E:\stable-diffusion-webui-forge\extensions-builtin\forge_legacy_preprocessors\legacy_preprocessors

preprocessor_compiled.py

"softedge_anyline": {

       "label": "softedge_anyline",

       "call_function": te_anyline,

       "unload_function": unload_te_anyline,

       "managed_model": "model_te_anyline",

       "model_free": False,

       "no_control_mode": False,

       "resolution": {

           "label": "Resolution",

           "value": 1280,

           "minimum": 64,

           "maximum": 2048,

         "step": 8

       },

       "slider_1": {

           "label": "Safe Steps",

           "minimum": 0,

           "maximum": 10,

           "value": 2,

           "step": 1

       },

       "slider_2": None,

       "slider_3": None,

       "priority": 0,

       "tags": [

           "SoftEdge"

       ]

   },   

preprocessor.py

def te_anyline(img: np.ndarray, res=512, thr_a=2, **kwargs):

   o_img, remove_pad = resize_image_with_pad(img, res)

   global model_te_anyline

   if model_te_anyline is None:

       from annotator.teed import TEEDDector

       model_te_anyline = TEEDDector(mteed=True)

   mteed_result = model_te_anyline(o_img, safe_steps=int(thr_a))

   mteed_result = HWC3(mteed_result)

   lineart_result, mf = lineart_standard(o_img, res)

   lineart_result = get_intensity_mask(

       lineart_result, lower_bound=0, upper_bound=1

   )

   cleaned = morphology.remove_small_objects(

       lineart_result.astype(bool), min_size=36, connectivity=1

   )

   lineart_result = lineart_result * cleaned

   final_result = combine_layers(mteed_result, lineart_result)

   return remove_pad(final_result), True

def unload_te_anyline():

   if model_te_anyline is not None:

       model_te_anyline.unload_model()

def get_intensity_mask(image_array, lower_bound, upper_bound):

   #image_array1=np.array(image_array, dtype=object)

   print("ndim == 2 or \n",image_array.ndim)

   if image_array.ndim == 2:

       mask = image_array

   else:

       mask = image_array[:, :, 0]

   mask = np.where((mask >= lower_bound) & (mask <= upper_bound), mask, 0)

   mask = np.expand_dims(mask, 2).repeat(3, axis=2)

   return mask