PHP Google Cloud Vision API: аннотации мгновенно заполняют память

Я использую облачное зрение, чтобы комментировать документы с помощью DOCUMENT_TEXT_DETECTION, и я использую только слова data.

Команда annotate возвращает много информации для каждой буквы / символа (языки, вершины, разрывы, текст, достоверность, …), что увеличивает использование памяти. Запуск аннотации на 4-страничном документе¹ возвращает более 100 МБ данных, что превышает мой предел памяти php, что приводит к сбою сценария. Получение только слов данных, вероятно, будет примерно в 5 раз меньше.

Чтобы было ясно, я загружаю VisionClient, настраиваю изображение, запускаю команду annotate (), и она возвращает переменную размером 100 МБ, в этот момент происходит сбой, прежде чем я получаю возможность выполнить какую-либо очистку.

$vision = new VisionClient([/* key & id here */]);
$image = $vision->image(file_get_contents($imagepath), ['DOCUMENT_TEXT_DETECTION']);
$annotation = $vision->annotate($image); // Crash at that point trying to allocate too much memory.

Есть ли способ не запрашивать полные данные? Документация по аннотированию, кажется, указывает, что можно комментировать только часть изображения, но не бросать данные символов.

На более фундаментальном уровне, я делаю что-то не так в отношении управления памятью в целом?

Спасибо

Редактировать: только что понял: мне также нужно хранить данные в файле, который я делаю с помощью serialize () … который удваивает использование памяти при запуске, даже если я делаю $ annotation = serialize ($ annotation), чтобы избежать 2 переменные. Так что на самом деле мне нужно 200 МБ на пользователя.

¹ Хотя это связано с количеством текста, а не с количеством страниц.

0

Решение

Дино,

При работе с большими изображениями я настоятельно рекомендую загрузить свое изображение в облачное хранилище, а затем выполнить запрос аннотации к изображению в корзине. Таким образом, вы сможете воспользоваться возобновляемыми или потоковыми протоколами, доступными в библиотеке хранилища, чтобы загрузить свой объект с большей надежностью и с меньшим потреблением памяти. Вот краткий фрагмент того, как это может выглядеть при использовании возобновляемого загрузчика:

use Google\Cloud\Core\Exception\GoogleException;
use Google\Cloud\Storage\StorageClient;
use Google\Cloud\Vision\VisionClient;

$storage = new StorageClient();
$bucket = $storage->bucket('my-bucket');
$imageName = 'my-image.png';

$uploader = $bucket->getResumableUploader(
fopen('/path/to/local/image.png', 'r'),
[
'name' => $imageName,
'chunkSize' => 262144 // This will read data in smaller chunks, freeing up memory
]
);

try {
$uploader->upload();
} catch (GoogleException $ex) {
$resumeUri = $uploader->getResumeUri();
$uploader->resume($resumeUri);
}

$vision = new VisionClient();
$image = $vision->image($bucket->object($imageName), [
'FACE_DETECTION'
]);

$vision->annotate($image);

https://googlecloudplatform.github.io/google-cloud-php/#/docs/google-cloud/v0.63.0/storage/bucket?method=getResumableUploader

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]