# 135th Place Solution

135th Place Solution
First of all, I’d like to express my gratitude to my teammates (
[@kazukishida](https://www.kaggle.com/kazukishida)
,
[@nozomiyamamoto](https://www.kaggle.com/nozomiyamamoto)
), Kaggle, and everyone who participated in this competition. Special thanks to
[@richolson](https://www.kaggle.com/richolson)
for releasing such an excellent starter notebook!
The three of us on the team have been friends for a long time, and after
[placing 4th on the public leaderboard in the Konwinski Prize competition](https://www.kaggle.com/competitions/konwinski-prize/discussion/568799)
(private results will be announced on June 12), we joined this competition right afterward.
1. Validation Strategy
1.1. Dataset Creation
Since the provided training dataset included only 15 samples, we needed to create our own dataset.
We followed the steps below:
Generated approximately 2,400 new descriptions using AI, covering landscape, abstract, and fashion categories.
Selected 268 instances as a validation set.
The rest of the instances, including the unused ones, were used to train a category classification machine learning model (described later).
1.2. Additional Categories
Based on our judgment, we believe the following list covers most relevant categories:
categories: [] = [
    ,
    ,
    ,
    ,
    ,
    ,
    ,
    ,
    ,
    ,
    ,
    ,
    ,
    ,
    ,
    ,
    ,
    ,
    ,
    ,
    ,
    ,
    ,
    ,
]
To ensure completeness and avoid category omissions, we used the
[LLM 20 Questions solution](https://www.kaggle.com/competitions/llm-20-questions/discussion/529525)
.
1.3. Category Classification Model
While we brainstormed many possible categories, we concluded that it was not necessary to cover every possible category exhaustively.
The key was to design an algorithm that performs well on the distribution of the dataset.
So we built a
3-class classification model
for the categories
landscape
,
abstract
, and
fashion
, and split our dataset into landscape-like, abstract-like, and fashion-like subsets.
We then fine-tuned generation parameters for each subset.
One of our final submissions also included an
animals-like
category.
2. Modeling
We tried various models from the list shared by
[@kawchar85](https://www.kaggle.com/kawchar85)
and selected
SDXL Turbo
, a high-performance model with fast inference time.
For the scheduler, we adopted
HeunDiscreteScheduler
, which performed best both in CV and on the leaderboard.
Each of the categories —
landscape-like
,
abstract-like
,
fashion-like
, and
animal-like
(or
landscape/abstract/fashion
in another final submission) — used the following parameter configurations:
Category
Image Size
num_colors
ignore_area_threshold
guidance_scale
landscape-like
512
12 or 9
65 or 55
5 or 20
abstract-like
384
10 or 9
55 or 55
5 or 20
fashion-like
384
8 or 9
60 or 55
5 or 20
animal-like
384
9
65
5
Common parameters across all categories:
num_attempts_per_description:  = 
num_inference_steps:  = 
prompt_prefix:  = 
prompt_suffix:  = 
negative_prompt:  =
3. OCR Hallucination Mitigation
Initially, we experimented with adding various short text snippets to reduce hallucination, which showed some effect.
However, the OCR hallucination prevention function published by
[@richolson](https://www.kaggle.com/richolson)
was excellent, so we adopted it.
To reduce the number of online evaluations, we only ran OCR evaluations on top candidate SVGs ranked by metrics, instead of evaluating all of them.
This allowed us to maintain quality while significantly reducing evaluation calls.
Observation: In online evaluation, if an SVG was flagged for OCR hallucination, it typically was in the final evaluation as well.
However, there were rare cases where an SVG passed the online test but still failed in the final evaluation.
4. Pseudo-VQA
We tried to simulate VQA evaluation using AI, inspired by the provided dataset of questions, choices, and answers.
We generated 417 questions and evaluated them to find the combinations with the highest correlation to the true VQA.
The final selected 3 questions were:
questions.append()
choices_list.append()
answers.append()

questions.append()
choices_list.append()
answers.append()

questions.append()
choices_list.append()
answers.append()
We used the following weights for scoring:
[0.50, 0.29, 0.21]
.
5. What Didn’t Work
Applying various geometric transformations to the inferred SVGs and selecting based on improved scores
Selecting pseudo-VQA questions tailored for each category
Calibrating the mean and variance of pseudo-VQA scores to match the real VQA distribution
: