AI Slop Code RIsk Monitor

danielgatis/rembg

Rembg is a tool to remove images background

79.9 High pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for danielgatis/rembg, a Python project with 25,018 GitHub stars. SynthScan examined 6,992 lines of code across 61 source files, recording 187 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 79.9 (High pattern signal); it is not an authorship estimate.

Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.

79.9
Adjusted Signal
79.9
Raw Pattern Score
100%
Time Factor
2026-10-10
Last Push
25.0K
Stars
Python
Language
7.0K
Lines of Code
61
Files
187
Pattern Hits
2026-10-12
Scan Date
1.44
HC Hit Rate

Risk Review · v3

Use each vector to guide manual verification of the underlying findings.

Cognitive Ownership Risk 92.0/100 · CRITICAL

Can maintainers explain intent, assumptions, and trade-offs? 132 finding(s).

Hallucinated Dependency & Supply Chain Risk 4.2/100 · LOW

Are imports declared and package/API names verified? 6 finding(s).

Agent Over-Engineering Ratio 87.0/100 · CRITICAL

Are wrappers, guards, and repeated structures necessary? 122 finding(s).

PR Review Velocity Impact 98.9/100 · CRITICAL

Which changes need focused human review? 187 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.

Severity Breakdown

Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.

CRITICAL 0HIGH 88MEDIUM 4LOW 95

Directory Score Breakdown

This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.

Pattern Findings

The scanner identified 187 distinct pattern matches across 9 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.

Docstring Block Structure52 hits · 260 pts
SeverityFileLineSnippetContext
HIGHrembg/session_factory.py16 Create a new session object based on the specified model name. This function searches for the session class baSTRING
HIGHrembg/sessions/u2net_custom.py15 Initialize a new U2netCustomSession object. Parameters: model_name (str): The name of the STRING
HIGHrembg/sessions/u2net_custom.py34 Predict the segmentation mask for the input image. Parameters: img (PILImage): The input iSTRING
HIGHrembg/sessions/u2net_custom.py67 Download the model files. Parameters: *args: Additional positional arguments. STRING
HIGHrembg/sessions/u2net_custom.py81 Get the name of the model. Parameters: *args: Additional positional arguments. STRING
HIGHrembg/sessions/withoutbg.py34 Initialize a WithoutBgSession. Does not call BaseSession.__init__ because no local ONNX model is used.STRING
HIGHrembg/sessions/withoutbg.py60 Predict the alpha mask for the input image via the withoutBG API. Parameters: img (PILImagSTRING
HIGHrembg/sessions/u2net_cloth_seg.py74 Predict the cloth category of an image. This method takes an image as input and predicts the cloth catSTRING
HIGHrembg/sessions/birefnet_portrait.py15 Downloads the BiRefNet-Portrait model file from a specific URL and saves it. Parameters: *STRING
HIGHrembg/sessions/birefnet_portrait.py46 Returns the name of the BiRefNet-Portrait session. Parameters: *args: Additional positionaSTRING
HIGHrembg/sessions/birefnet_general.py21 Predicts the output masks for the input image using the inner session. Parameters: img (PISTRING
HIGHrembg/sessions/birefnet_general.py54 Downloads the BiRefNet-General model file from a specific URL and saves it. Parameters: *aSTRING
HIGHrembg/sessions/birefnet_general.py85 Returns the name of the BiRefNet-General session. Parameters: *args: Additional positionalSTRING
HIGHrembg/sessions/u2net_human_seg.py18 Predicts human segmentation masks for the input image. Parameters: img (PILImage): The inpSTRING
HIGHrembg/sessions/u2net_human_seg.py51 Downloads the U2Net model weights. Parameters: *args: Variable length argument list. STRING
HIGHrembg/sessions/u2net_human_seg.py82 Returns the name of the U2Net model. Parameters: *args: Variable length argument list. STRING
HIGHrembg/sessions/ben_custom.py63 Download the model files. Parameters: *args: Additional positional arguments. STRING
HIGHrembg/sessions/ben_custom.py77 Get the name of the model. Parameters: *args: Additional positional arguments. STRING
HIGHrembg/sessions/dis_anime.py18 Use a pre-trained model to predict the object in the given image. Parameters: img (PILImagSTRING
HIGHrembg/sessions/dis_anime.py49 Download the pre-trained models. Parameters: *args: Variable length argument list. STRING
HIGHrembg/sessions/dis_anime.py80 Get the name of the pre-trained model. Parameters: *args: Variable length argument list. STRING
HIGHrembg/sessions/dis_custom.py62 Download the model files. Parameters: *args: Additional positional arguments. STRING
HIGHrembg/sessions/dis_custom.py76 Get the name of the model. Parameters: *args: Additional positional arguments. STRING
HIGHrembg/sessions/birefnet_general_lite.py15 Downloads the BiRefNet-General-Lite model file from a specific URL and saves it. Parameters: STRING
HIGHrembg/sessions/birefnet_general_lite.py46 Returns the name of the BiRefNet-General-Lite session. Parameters: *args: Additional positSTRING
HIGHrembg/sessions/birefnet_hrsod.py15 Downloads the BiRefNet-HRSOD model file from a specific URL and saves it. Parameters: *argSTRING
HIGHrembg/sessions/birefnet_hrsod.py46 Returns the name of the BiRefNet-HRSOD session. Parameters: *args: Additional positional aSTRING
HIGHrembg/sessions/dis_general_use.py45 Downloads the pre-trained model file. This class method downloads the pre-trained model file from a spSTRING
HIGHrembg/sessions/dis_general_use.py78 Returns the name of the model. This class method returns the name of the model. Parameters: STRING
HIGHrembg/sessions/birefnet_massive.py15 Downloads the BiRefNet-Massive model file from a specific URL and saves it. Parameters: *aSTRING
HIGHrembg/sessions/birefnet_massive.py46 Returns the name of the BiRefNet-Massive session. Parameters: *args: Additional positionalSTRING
HIGHrembg/sessions/atlascloud.py40 Initialize an AtlasCloudSession. Does not call BaseSession.__init__ because no local ONNX model is useSTRING
HIGHrembg/sessions/atlascloud.py96 Predict the alpha mask for the input image via the Atlas Cloud API. The endpoint is asynchronous: the STRING
HIGHrembg/sessions/birefnet_dis.py15 Downloads the BiRefNet-DIS model file from a specific URL and saves it. Parameters: *args:STRING
HIGHrembg/sessions/birefnet_dis.py46 Returns the name of the BiRefNet-DIS session. Parameters: *args: Additional positional argSTRING
HIGHrembg/sessions/sam.py208 Predict masks for an input image. This function takes an image as input and performs various preprocesSTRING
HIGHrembg/sessions/sam.py336 Class method to download ONNX model files. This method is responsible for downloading two ONNX model fSTRING
HIGHrembg/sessions/sam.py438 Class method to return a string value. This method returns the string value 'sam'. ParametersSTRING
HIGHrembg/sessions/u2net.py18 Predicts the output masks for the input image using the inner session. Parameters: img (PISTRING
HIGHrembg/sessions/u2net.py51 Downloads the U2net model file from a specific URL and saves it. Parameters: *args: AdditiSTRING
HIGHrembg/sessions/u2net.py82 Returns the name of the U2net session. Parameters: *args: Additional positional arguments.STRING
HIGHrembg/sessions/silueta.py16 Predict the mask of the input image. This method takes an image as input, preprocesses it, and performSTRING
HIGHrembg/sessions/silueta.py51 Download the pre-trained model file. This method downloads the pre-trained model file from a specifiedSTRING
HIGHrembg/sessions/silueta.py84 Return the name of the model. This method returns the name of the Silueta model. Parameters: STRING
HIGHrembg/sessions/bria_rmbg.py18 Predicts the output masks for the input image using the inner session. Parameters: img (PISTRING
HIGHrembg/sessions/bria_rmbg.py51 Downloads the BRIA-RMBG 2.0 model file from a specific URL and saves it. Parameters: *argsSTRING
HIGHrembg/sessions/bria_rmbg.py82 Returns the name of the Bria-rmbg session. Parameters: *args: Additional positional argumeSTRING
HIGHrembg/sessions/birefnet_cod.py15 Downloads the BiRefNet-COD model file from a specific URL and saves it. Parameters: *args:STRING
HIGHrembg/sessions/birefnet_cod.py46 Returns the name of the BiRefNet-COD session. Parameters: *args: Additional positional argSTRING
HIGHrembg/commands/p_command.py216 Command-line interface (CLI) program for performing background removal on images in a folder. This program takSTRING
HIGHrembg/commands/i_command.py103 Click command line interface function to process an input file based on the provided options. This function isSTRING
HIGHrembg/commands/b_command.py112 Command-line interface for processing images by removing the background using a specified model and generating a maSTRING
Cross-File Repetition30 hits · 150 pts
SeverityFileLineSnippetContext
HIGHrembg/sessions/u2net_custom.py0download the model files. parameters: *args: additional positional arguments. **kwargs: additional keyword arguments. reSTRING
HIGHrembg/sessions/ben_custom.py0download the model files. parameters: *args: additional positional arguments. **kwargs: additional keyword arguments. reSTRING
HIGHrembg/sessions/dis_custom.py0download the model files. parameters: *args: additional positional arguments. **kwargs: additional keyword arguments. reSTRING
HIGHrembg/sessions/u2net_custom.py0get the name of the model. parameters: *args: additional positional arguments. **kwargs: additional keyword arguments. rSTRING
HIGHrembg/sessions/ben_custom.py0get the name of the model. parameters: *args: additional positional arguments. **kwargs: additional keyword arguments. rSTRING
HIGHrembg/sessions/dis_custom.py0get the name of the model. parameters: *args: additional positional arguments. **kwargs: additional keyword arguments. rSTRING
HIGHrembg/sessions/birefnet_portrait.py0downloads the birefnet-cod model file from a specific url and saves it. parameters: *args: additional positional argumenSTRING
HIGHrembg/sessions/birefnet_general.py0downloads the birefnet-cod model file from a specific url and saves it. parameters: *args: additional positional argumenSTRING
HIGHrembg/sessions/birefnet_general_lite.py0downloads the birefnet-cod model file from a specific url and saves it. parameters: *args: additional positional argumenSTRING
HIGHrembg/sessions/birefnet_hrsod.py0downloads the birefnet-cod model file from a specific url and saves it. parameters: *args: additional positional argumenSTRING
HIGHrembg/sessions/birefnet_massive.py0downloads the birefnet-cod model file from a specific url and saves it. parameters: *args: additional positional argumenSTRING
HIGHrembg/sessions/birefnet_dis.py0downloads the birefnet-cod model file from a specific url and saves it. parameters: *args: additional positional argumenSTRING
HIGHrembg/sessions/u2net.py0downloads the birefnet-cod model file from a specific url and saves it. parameters: *args: additional positional argumenSTRING
HIGHrembg/sessions/bria_rmbg.py0downloads the birefnet-cod model file from a specific url and saves it. parameters: *args: additional positional argumenSTRING
HIGHrembg/sessions/birefnet_cod.py0downloads the birefnet-cod model file from a specific url and saves it. parameters: *args: additional positional argumenSTRING
HIGHrembg/sessions/birefnet_portrait.py0returns the name of the birefnet-cod session. parameters: *args: additional positional arguments. **kwargs: additional kSTRING
HIGHrembg/sessions/birefnet_general.py0returns the name of the birefnet-cod session. parameters: *args: additional positional arguments. **kwargs: additional kSTRING
HIGHrembg/sessions/birefnet_general_lite.py0returns the name of the birefnet-cod session. parameters: *args: additional positional arguments. **kwargs: additional kSTRING
HIGHrembg/sessions/birefnet_hrsod.py0returns the name of the birefnet-cod session. parameters: *args: additional positional arguments. **kwargs: additional kSTRING
HIGHrembg/sessions/birefnet_massive.py0returns the name of the birefnet-cod session. parameters: *args: additional positional arguments. **kwargs: additional kSTRING
HIGHrembg/sessions/birefnet_dis.py0returns the name of the birefnet-cod session. parameters: *args: additional positional arguments. **kwargs: additional kSTRING
HIGHrembg/sessions/u2net.py0returns the name of the birefnet-cod session. parameters: *args: additional positional arguments. **kwargs: additional kSTRING
HIGHrembg/sessions/bria_rmbg.py0returns the name of the birefnet-cod session. parameters: *args: additional positional arguments. **kwargs: additional kSTRING
HIGHrembg/sessions/birefnet_cod.py0returns the name of the birefnet-cod session. parameters: *args: additional positional arguments. **kwargs: additional kSTRING
HIGHrembg/sessions/birefnet_general.py0predicts the output masks for the input image using the inner session. parameters: img (pilimage): the input image. *argSTRING
HIGHrembg/sessions/u2net.py0predicts the output masks for the input image using the inner session. parameters: img (pilimage): the input image. *argSTRING
HIGHrembg/sessions/bria_rmbg.py0predicts the output masks for the input image using the inner session. parameters: img (pilimage): the input image. *argSTRING
HIGHrembg/sessions/ben_custom.py0predicts the mask image for the input image. this method takes a pilimage object as input and returns a list of pilimageSTRING
HIGHrembg/sessions/dis_custom.py0predicts the mask image for the input image. this method takes a pilimage object as input and returns a list of pilimageSTRING
HIGHrembg/sessions/dis_general_use.py0predicts the mask image for the input image. this method takes a pilimage object as input and returns a list of pilimageSTRING
Hyper-Verbose Identifiers70 hits · 84 pts
SeverityFileLineSnippetContext
LOWtests/test_atlascloud.py38def test_missing_api_key_raises(monkeypatch):CODE
LOWtests/test_atlascloud.py51def test_api_key_kwarg_overrides_env(monkeypatch):CODE
LOWtests/test_atlascloud.py67def test_name_and_download_models():CODE
LOWtests/test_atlascloud.py78def test_predict_rejects_oversized_upload(monkeypatch):CODE
LOWtests/test_atlascloud.py96def test_predict_polls_then_returns_mask_matching_input_size(monkeypatch):CODE
LOWtests/test_atlascloud.py128def test_predict_raises_when_prediction_fails(monkeypatch):CODE
LOWtests/test_atlascloud.py160def test_predict_http_error_raises(monkeypatch):CODE
LOWtests/test_atlascloud.py187def test_default_model_is_the_served_remove_background_model(monkeypatch):CODE
LOWtests/test_decontaminate.py60def test_decontaminate_removes_background_color_fringing():CODE
LOWtests/test_decontaminate.py79def test_decontaminate_preserves_alpha():CODE
LOWtests/test_decontaminate.py89def test_decontaminate_leaves_opaque_pixels_alone():CODE
LOWtests/test_sam_model_allowlist.py17def test_download_models_rejects_injected_names(sam_model, tmp_path, monkeypatch):CODE
LOWtests/test_sam_model_allowlist.py30def test_download_models_rejects_before_any_download(tmp_path, monkeypatch):CODE
LOWtests/test_sam_model_allowlist.py43def test_allowlist_holds_only_published_checkpoints():CODE
LOWtests/test_sam_model_allowlist.py52def test_injected_name_never_reaches_a_url_or_path(tmp_path, monkeypatch):CODE
LOWtests/test_sam_model_allowlist.py75def test_every_allowed_model_has_pinned_checksums():CODE
LOWtests/test_sam_model_allowlist.py91def test_vit_h_sidecar_blobs_are_pinned():CODE
LOWtests/test_sam_model_allowlist.py100def test_checksums_cover_only_allowed_models():CODE
LOW⚡tests/test_model_home.py17def test_defaults_to_dot_rembg(clean_env):CODE
LOW⚡tests/test_model_home.py21def test_rembg_home_env_wins_over_default(clean_env):CODE
LOW⚡tests/test_model_home.py26def test_xdg_data_home_has_no_leading_dot(clean_env):CODE
LOW⚡tests/test_model_home.py32def test_legacy_env_still_takes_precedence(clean_env):CODE
LOWtests/test_model_home.py43def test_model_dir_is_per_model(clean_env):CODE
LOWtests/test_model_home.py48def test_resolve_existing_prefers_new_layout(clean_env, tmp_path):CODE
LOWtests/test_model_home.py59def test_resolve_existing_falls_back_to_legacy(clean_env, tmp_path):CODE
LOWtests/test_model_home.py71def test_resolve_existing_returns_none_when_absent(clean_env, tmp_path):CODE
LOWtests/test_model_home.py78def test_validate_model_path_accepts_both_roots(clean_env, tmp_path):CODE
LOW⚡tests/test_model_home.py89def test_validate_model_path_rejects_outside_paths(clean_env, tmp_path):CODE
LOW⚡tests/test_model_home.py96def test_validate_model_path_rejects_traversal(clean_env, tmp_path):CODE
LOW⚡tests/test_model_home.py105def test_validate_model_path_rejects_sibling_prefix(clean_env, tmp_path):CODE
LOW⚡tests/test_model_home.py115def test_validate_model_path_requires_the_argument(clean_env):CODE
LOW⚡tests/test_matting.py13def test_default_variant_is_a_known_one():CODE
LOW⚡tests/test_matting.py17def test_every_variant_declares_a_file_and_checksum():CODE
LOW⚡tests/test_matting.py23def test_resolve_variant_defaults_when_unset():CODE
LOW⚡tests/test_matting.py27def test_resolve_variant_accepts_known_names():CODE
LOW⚡tests/test_matting.py32def test_resolve_variant_rejects_unknown_names():CODE
LOW⚡tests/test_matting.py37def test_resolve_variant_error_lists_the_options():CODE
LOW⚡tests/test_matting.py53def test_trimap_has_only_the_three_expected_levels():CODE
LOW⚡tests/test_matting.py58def test_trimap_marks_an_unknown_band():CODE
LOW⚡tests/test_matting.py63def test_trimap_keeps_the_mask_size():CODE
LOW⚡tests/test_matting.py68def test_larger_erode_size_widens_the_unknown_band():CODE
LOW⚡tests/test_matting.py75def test_trimap_accepts_a_non_grayscale_mask():CODE
LOWtests/test_withoutbg.py18def test_missing_api_key_raises(monkeypatch):CODE
LOWtests/test_withoutbg.py30def test_api_key_kwarg_overrides_env(monkeypatch):CODE
LOWtests/test_withoutbg.py36def test_name_and_download_models():CODE
LOWtests/test_withoutbg.py47def test_predict_rejects_oversized_upload(monkeypatch):CODE
LOWtests/test_withoutbg.py65def test_predict_returns_mask_matching_input_size(monkeypatch):CODE
LOWtests/test_withoutbg.py93def test_predict_http_error_raises(monkeypatch):CODE
LOWtests/test_migrate.py27def test_dry_run_touches_nothing(layout):CODE
LOWtests/test_migrate.py35def test_migrate_copies_into_per_model_dirs(layout):CODE
LOW⚡tests/test_migrate.py48def test_migrate_keeps_originals_by_default(layout):CODE
LOW⚡tests/test_migrate.py55def test_unrecognised_files_are_never_moved(layout):CODE
LOW⚡tests/test_migrate.py62def test_orphans_are_kept_unless_asked(layout):CODE
LOW⚡tests/test_migrate.py67def test_clean_orphans_removes_them(layout):CODE
LOW⚡tests/test_migrate.py72def test_migrate_is_idempotent(layout):CODE
LOW⚡tests/test_migrate.py81def test_second_pass_reclaims_already_migrated_files(layout):CODE
LOWtests/test_migrate.py93def test_mismatched_copy_is_left_alone(layout):CODE
LOWtests/test_migrate.py105def test_missing_legacy_dir_is_not_an_error(monkeypatch, tmp_path):CODE
LOWtests/test_migrate.py116def test_same_source_and_target_is_refused(monkeypatch, tmp_path):CODE
LOWtests/test_ssrf_ipv6_transition.py43def test_plain_internal_addresses_stay_blocked(addr):CODE
10 more matches not shown…
Empty Error Handlers6 hits · 30 pts
SeverityFileLineSnippetContext
HIGHrembg/sessions/withoutbg.py116except (json.JSONDecodeError, AttributeError):CODE
HIGHrembg/sessions/atlascloud.py89except (json.JSONDecodeError, AttributeError):CODE
HIGHrembg/commands/p_command.py240except Exception:CODE
HIGHrembg/commands/i_command.py120except Exception:CODE
HIGHrembg/commands/s_command.py317except Exception:CODE
HIGHrembg/commands/s_command.py284except Exception:CODE
Excessive Try-Catch Wrapping13 hits · 18 pts
SeverityFileLineSnippetContext
MEDIUM⚡rembg/bg.py248 print(f"Error: no model found: {model}")CODE
LOW⚡rembg/bg.py256 except Exception as e:CODE
MEDIUM⚡rembg/bg.py257 print(f"Error downloading model: {e}")CODE
LOWrembg/sessions/base.py64 except Exception: # pragma: no cover - defensiveCODE
LOWrembg/commands/p_command.py240 except Exception:CODE
LOWrembg/commands/p_command.py272 except Exception as e:CODE
LOWrembg/commands/i_command.py120 except Exception:CODE
LOWrembg/commands/b_command.py131 except Exception:CODE
LOWrembg/commands/s_command.py284 except Exception:CODE
LOWrembg/commands/s_command.py317 except Exception:CODE
LOWrembg/commands/s_command.py332 except Exception:CODE
MEDIUMrembg/commands/s_command.py314def startup():CODE
LOWrembg/commands/m_command.py20 except Exception: # nosec B112 - a session that cannot report its ownCODE
Deep Nesting6 hits · 6 pts
SeverityFileLineSnippetContext
LOWtests/test_remove.py14CODE
LOWrembg/bg.py237CODE
LOWrembg/bg.py260CODE
LOWrembg/sessions/u2net_cloth_seg.py73CODE
LOWrembg/sessions/base.py14CODE
LOWrembg/commands/m_command.py60CODE
Unused Imports6 hits · 6 pts
SeverityFileLineSnippetContext
LOWrembg/bg.py32CODE
LOWrembg/__init__.py11CODE
LOWrembg/__init__.py12CODE
LOWrembg/sessions/__init__.py1CODE
LOWrembg/sessions/__init__.py3CODE
LOWrembg/commands/b_command.py6CODE
AI Structural Patterns3 hits · 3 pts
SeverityFileLineSnippetContext
LOWrembg/bg.py260CODE
LOWrembg/commands/s_command.py181CODE
LOWrembg/commands/s_command.py230CODE
Self-Referential Comments1 hit · 1 pts
SeverityFileLineSnippetContext
MEDIUMrembg/sessions/u2netp.py13 """This class represents a session for using the U2netp model."""STRING