Comments 21
Интересно посмотреть несколько примеров: изображение на входе, результат на выходе
В статье есть пример JSON-объекта с таким результатом:
Elegant interior showcasing intricate metalwork and lush green drapery. Ideal for modern design enthusiasts. Explore the charm of Ruskeala, Russia through this stylish setting.
Russia, Ruskeala, interior, design, elegance, green, drapery, metalwork, decoration, style, modern, seating, artistic, ambiance, wood, vintage, upholstery, tranquility, cozy, decor, booth, pattern, texture, illumination, hospitality, creativity, aesthetic, luxurious, charming, refinement, sophistication, boutique, comfort, travel, cultural, picturesque, artisan, heritage, classic, unique, rustic, classy, inviting, traditional, fashionable, ornate.

Добрый день. Подскажите, пожалуйста, мне вот тоже самое надо сделать, но только, чтобы просто из одной папки картинки брались и атрибутированные с записанными метаданными клались в другую папку, это что надо поправить в коде? У вас ключевание идет по называнию папок, а мне надо просто описание то, что на картинке и ключевые слова.
Я скажу интереснее, можно воспользоваться свободной нейросеткой
https://huggingface.co/onnx-community/Florence-2-large
(Флоренце одна из лучших, но не единственная, есть еще vikhyatk/moondream2). Они тоже позволяют давать описание картинок. Только важно помнить, что распознавание на уровне 98%, т.е. банальные сцены будут распознаны, но будут картинки или полностью или частично не распознанные.
Можно но зачем, какие плюсы?
Посмотрела, попробовала онлайн-версию. Фото распознает неплохо, на мой взгляд. Возможно ли с ее помощью получать художественные описания в стоковом стиле и определять хотя бы самые известные достопримечательности?
так проэкспериментируй :-) Стандартный ответ: "Конечно". Вопрос нужно по другому было задавать: "Какие промпты и техники лучше всего заходят под мою задачу" :-)
Вы всегда тыкаете незнакомым людям?
Промпт, который выработался в моей практике, приведен в статье.
Обычно если я "выкаю", то человек мне не нравится, если я говорю "ты", то ставлю его на одном уровне со мной (ни выше, ни ниже). Извините, не хотел обидеть.

Нейронка выдала следующее описание: The image presents a digital illustration of a heart-shaped arrangement of pink roses. The roses are the central focus, with three of them standing out prominently. The background is a sky filled with clouds, painted in shades of blue and purple. The sun is shining brightly, casting a warm glow on the scene and highlighting the pink color of the roses. The image is a digital illustration, which suggests the use of advanced technology and software to create the image.
Промпт к moondream2 был какой-то обще-стандартный типа "подробно опиши изображение". Изменением промпта на "сделай короткое описание" можно уменьшить ответ. Просто описательный ответ мне был достаточен. Как я говорил, в большинстве случаев править ничего не нужно.
Локальный запуск позволяет не зависеть от всяких там VPN, банковских карт или пятен на солнце. Из минусов - требуется видеокарта; нужно уметь настроить; качество, видимо, похуже чем у GPT 4o.
а как установить локально модель Florence-2-large и подкллючиться на напитоне?
Я посмотрел по ссылке и ни чего не понял
Флоренце у меня тоже не завелась (вроде что-то там с одной библиотекой питорч у меня не срослось). Я завел moondream2, вот отрывок из кода: from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "vikhyatk/moondream2"
revision = "2024-08-26"
model = AutoModelForCausalLM.from_pretrained( model_id, trust_remote_code=True, revision=revision, device_map='cuda' )
tokenizer = AutoTokenizer.from_pretrained(model_id, revision=revision)
image = Image.open(filename)
enc_image = model.encode_image(image)
title = model.answer_question(enc_image, "Detailed image description.", tokenizer)
я смог подключиться к Florence-2-large, она возвращает данные в виде сложной структуры, которая включает метки объектов (например, bboxes
, labels
) и другие подробности, такие как координаты, а не просто текстовые описания и ключевые слова. Уже пол дня мучаюсь как получить все это в тексте.
Попробую ещё ваш вариант с moondream2
Вот мой код c Florence-2-large
при запуске скрипта он попросит в терминале вставить скопированный путь к картинкам и потом ещё указать имя csv файла, только потом файл будет без расширения csv, но excel откроет, создаст он его в корне пакет там же где и будет сам файл скрита питона.
Может кто ума даст этому коду
import os
import csv
import torch
from PIL import Image
from transformers import AutoProcessor, AutoModelForCausalLM
def analyze_image(image_path, model, processor):
"""
Анализирует изображение с использованием Florence-2-large.
"""
image = Image.open(image_path)
prompt = "<OD>"
inputs = processor(text=prompt, images=image, return_tensors="pt").to(device)
generated_ids = model.generate(
input_ids=inputs["input_ids"],
pixel_values=inputs["pixel_values"],
max_new_tokens=4096,
num_beams=3,
do_sample=False
)
generated_text = processor.batch_decode(generated_ids, skip_special_tokens=False)[0]
parsed_answer = processor.post_process_generation(generated_text, task="<OD>", image_size=(image.width, image.height))
# Разделяем описание и ключевые слова, если они в одном тексте
if "\n" in parsed_answer:
description, keywords = parsed_answer.split("\n", 1)
else:
description, keywords = parsed_answer, ""
return description, keywords
def generate_metadata(input_folder, output_csv, model, processor):
"""
Анализирует изображения в папке и создает CSV файл с метаданными.
"""
supported_formats = (".jpeg", ".jpg", ".png")
image_files = [f for f in os.listdir(input_folder) if f.lower().endswith(supported_formats)]
if not image_files:
print("Нет изображений в указанной папке.")
return
with open(output_csv, mode='w', newline='', encoding='utf-8') as csvfile:
csvwriter = csv.writer(csvfile)
for image_file in image_files:
image_path = os.path.join(input_folder, image_file)
try:
description, keywords = analyze_image(image_path, model, processor)
csvwriter.writerow([
image_file,
description,
f'"{description}"',
f'"{keywords}"'
])
print(f"Обработано: {image_file}")
except Exception as e:
print(f"Ошибка при обработке {image_file}: {e}")
if __name__ == "__main__":
device = "cuda:0" if torch.cuda.is_available() else "cpu"
model = AutoModelForCausalLM.from_pretrained("microsoft/Florence-2-large", trust_remote_code=True).to(device)
processor = AutoProcessor.from_pretrained("microsoft/Florence-2-large", trust_remote_code=True)
input_folder = input("Введите путь к папке с изображениями: ").strip()
output_csv = input("Введите имя выходного CSV файла (например, output.csv): ").strip()
generate_metadata(input_folder, output_csv, model, processor)
Shutterstock вроде бы позволяет импортировать метаданные в формате CSV?
Вроде как да, но я все готовлю на компе а потом уже на сток заливаю. Например в StockSubmitter импортирую csv файл предварительно там открыв папку с всеми картинками которые были проанализированы. Ну это я экспериментировал как импорт работает если в IMStoker получить csv для того, чтобы свою программку сделать
похоже ты запускаешь в режиме Object detection - <OD>. А тебе нужно task=
<MORE_DETAILED_CAPTION>
https://huggingface.co/microsoft/Florence-2-large/blob/main/sample_inference.ipynb
Сравнил я две модели Florence-2-large и moondream2 .
Florence-2 довольно таки сильно проигрывает в создании большого описания изображения. moondream2 более органично это делает прям хорошо, а с выходом новой модели от 2025 года года вообще красота.
Ключевание стоковых изображений с помощью Batch API от OpenAI