mirror of
https://github.com/LostRuins/koboldcpp.git
synced 2025-09-14 19:09:45 +00:00
added llava letterboxing feature
This commit is contained in:
parent
cca3c4c78b
commit
7bc87e1f0f
2 changed files with 51 additions and 2 deletions
|
@ -1554,6 +1554,28 @@ bool clip_image_load_from_file(const char * fname, clip_image_u8 * img) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//note that the memory here must be subsequently freed!
|
||||||
|
uint8_t* make_new_letterbox_img(uint8_t* input_image, int nx, int ny, int nc, int target_width, int target_height) {
|
||||||
|
int new_image_size = target_width * target_height * nc;
|
||||||
|
uint8_t* letterboxed_image = (uint8_t*)malloc(new_image_size);
|
||||||
|
if(letterboxed_image==nullptr)
|
||||||
|
{
|
||||||
|
printf("\nWARNING: make_new_letterbox_img MALLOC FAILED\n");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
memset(letterboxed_image, 0, new_image_size); // fill with black (0) or any color you prefer
|
||||||
|
int offset_x = (target_width - nx) / 2;
|
||||||
|
int offset_y = (target_height - ny) / 2;
|
||||||
|
for (int y = 0; y < ny; ++y) {
|
||||||
|
memcpy(
|
||||||
|
letterboxed_image + ((y + offset_y) * target_width + offset_x) * nc,
|
||||||
|
input_image + (y * nx * nc),
|
||||||
|
nx * nc
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return letterboxed_image;
|
||||||
|
}
|
||||||
|
|
||||||
bool clip_image_load_from_bytes(const unsigned char * bytes, size_t bytes_length, struct clip_image_u8 * img) {
|
bool clip_image_load_from_bytes(const unsigned char * bytes, size_t bytes_length, struct clip_image_u8 * img) {
|
||||||
int nx, ny, nc;
|
int nx, ny, nc;
|
||||||
auto * data = stbi_load_from_memory(bytes, bytes_length, &nx, &ny, &nc, 3);
|
auto * data = stbi_load_from_memory(bytes, bytes_length, &nx, &ny, &nc, 3);
|
||||||
|
@ -1561,7 +1583,34 @@ bool clip_image_load_from_bytes(const unsigned char * bytes, size_t bytes_length
|
||||||
LOG_TEE("%s: failed to decode image bytes\n", __func__);
|
LOG_TEE("%s: failed to decode image bytes\n", __func__);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
build_clip_img_from_data(data, nx, ny, img);
|
|
||||||
|
float aspect_ratio = static_cast<float>(nx) / ny;
|
||||||
|
int new_width = nx;
|
||||||
|
int new_height = ny;
|
||||||
|
bool need_letterbox = false;
|
||||||
|
// Check if the image exceeds the aspect ratio limits
|
||||||
|
float maxaspect = 4.0f;
|
||||||
|
if (aspect_ratio > maxaspect) {
|
||||||
|
new_height = (int)(nx / maxaspect);
|
||||||
|
need_letterbox = true;
|
||||||
|
} else if (aspect_ratio < 1.0f / maxaspect) {
|
||||||
|
new_width = (int)(ny / maxaspect);
|
||||||
|
need_letterbox = true;
|
||||||
|
}
|
||||||
|
if (need_letterbox) {
|
||||||
|
LOG_TEE("\nImage requires letterboxing: %d x %d changed to %d x %d\n",nx,ny,new_width, new_height);
|
||||||
|
uint8_t* letterboxed_image = make_new_letterbox_img(data, nx, ny, nc, new_width, new_height);
|
||||||
|
if(letterboxed_image!=nullptr)
|
||||||
|
{
|
||||||
|
build_clip_img_from_data(letterboxed_image, new_width, new_height, img);
|
||||||
|
free(letterboxed_image);
|
||||||
|
letterboxed_image = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
build_clip_img_from_data(data, nx, ny, img);
|
||||||
|
}
|
||||||
stbi_image_free(data);
|
stbi_image_free(data);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
#include <intrin.h>
|
#include <intrin.h>
|
||||||
#define RWKV_MAYBE_BREAK __debugbreak()
|
// #define RWKV_MAYBE_BREAK __debugbreak()
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
#if !defined(__APPLE__)
|
#if !defined(__APPLE__)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue