feat: Implement upscale functionality with ONNX models

- Added upscale operator to handle image upscaling by 4x using AI models.
- Introduced new jobs for upscale processing in the server, including debug and standard upscale jobs.
- Created a new ONNX model handler for upscale operations, supporting tiled inference and resource management.
- Updated tests to cover new upscale functionality, including input validation and output verification.
- Added documentation for the upscale feature, detailing usage and model options.
This commit is contained in:
2026-08-23 20:34:35 +08:00
parent 1613bd3194
commit 0cf04a13c6
66 changed files with 2156 additions and 1088 deletions

View File

@@ -20,24 +20,10 @@ class ModelTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.models = load_module(
"anyimage_models",
"src/anyimage/model_catalog.py",
)
cls.server_models = load_module(
"anyimage_server_models",
"src/anyimage/server/model_catalog.py",
)
def test_client_and_server_catalogs_share_storage_contract(self):
client = self.models.DOWNLOADABLE_MODELS
server = self.server_models.DOWNLOADABLE_MODELS
self.assertEqual(set(client), set(server))
for key in client:
with self.subTest(key=key):
self.assertEqual(client[key].directory_name, server[key].directory_name)
self.assertEqual(client[key].ready_patterns, server[key].ready_patterns)
def test_base_model_is_default_friendly_apache_model(self):
model = self.models.get_model("BASE")
@@ -89,33 +75,26 @@ class ModelTest(unittest.TestCase):
"BEN2-ONNX",
)
def test_realesrgan_general_x4v3_uses_verified_onnx_artifact(self):
model = self.models.get_downloadable_model(
"REALESRGAN_GENERAL_X4V3"
)
def test_upscale_models_use_verified_onnx_artifacts(self):
expected = {
"REALESRGAN_GENERAL_WDN_X4V3": ("realesr-general-wdn-x4v3.onnx", 4867419, "b021a837"),
"SAFMN_REAL_X4": ("safmn-real-x4.onnx", 22657477, "8f13867b"),
"REALESRGAN_X4PLUS": ("realesrgan-x4plus.onnx", 67051618, "4ed6a45a"),
}
self.assertEqual(set(self.models.UPSCALE_MODELS), set(expected))
for key, (filename, size, checksum_prefix) in expected.items():
with self.subTest(model=key):
model = self.models.get_downloadable_model(key)
self.assertEqual(model.download_patterns, (filename,))
self.assertEqual(model.ready_patterns, (filename,))
self.assertEqual(model.r2_files[0][:2], (filename, size))
self.assertTrue(model.r2_files[0][2].startswith(checksum_prefix))
self.assertEqual(self.models.model_record(model)["family"], "upscale")
wdn = self.models.UPSCALE_MODELS["REALESRGAN_GENERAL_WDN_X4V3"]
self.assertEqual(wdn.repository, "xinntao/Real-ESRGAN")
self.assertEqual(wdn.huggingface_repository, "")
self.assertEqual(
model.repository,
"jonathanst29/tinier-upscale-models",
)
self.assertEqual(model.license_name, "BSD 3-Clause")
self.assertEqual(
model.download_patterns,
("realesr-general-x4v3.onnx",),
)
self.assertEqual(model.ready_patterns, model.download_patterns)
self.assertEqual(model.r2_directory, "realesr-general-x4v3")
self.assertEqual(
model.r2_files,
((
"realesr-general-x4v3.onnx",
4866396,
"924ebad6532777303582d4ce7811849b88869231a3ae7093e0f21200249df8d5",
),),
)
self.assertEqual(
self.models.model_record(model)["family"],
"upscale",
self.models.UPSCALE_MODELS["SAFMN_REAL_X4"].huggingface_repository, ""
)
def test_enabled_da3_models_use_onnx_and_r2_checksums(self):