PHP Google Cloud Vision API: аннотации мгновенно заполняют память - PullRequest
0 голосов
/ 27 апреля 2018

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

Команда annotate возвращает много информации для каждой буквы / символа (языки, вершины, разрывы, текст, достоверность, ...), что увеличивает использование памяти. Запуск аннотации в документе на 4 страницы pages возвращает более 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) для Избегайте двух переменных. Так что на самом деле мне нужно 200 МБ на пользователя.

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

1 Ответ

0 голосов
/ 02 мая 2018

Дино

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

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

...