Skip to content

ahmadmayahi/php-google-vision

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

95 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PHP Google Vision

STILL IN ACTIVE DEVELOPMENT - DO NOT USE IN PRODUCTION

Requires PHP 8.0+

For feedback, please contact me.

Latest Version on Packagist Tests GitHub Code Style Action Status Total Downloads codecov Maintainability

This package provides an elegant wrapper around Google Vision API and more.

It's an effort to make Google Vision API easy and fun to work with.

Contents

Installation

You may install the package via composer:

composer require ahmadmayahi/php-google-vision

Creating Google Service Account

First, you must create a Google service account and setup the configuration object.

Configuration

use AhmadMayahi\Vision\Config; $config = (new Config()) // Required: path to your google service account. ->setCredentials('path/to/google-service-account.json') // Optional: defaults to `sys_get_temp_dir()`	->setTempDirPath();

Original Responses

All the features come with getOriginalResponse() method which returns the original response that's returned by PHP Google Vision Package.

You may get the original response for any feature as follows:

use AhmadMayahi\Vision\Vision; $response = Vision::init($config) ->file('/path/to/input/file.jpg') ->faceDetection() ->getOriginalResponse();

Depending on the feature, the response type might vary, here is a list of all the response types:

Feature Response Type
faceDetection Google\Protobuf\Internal\RepeatedField contains Google\Cloud\Vision\V1\FaceAnnotation
imageTextDetection Google\Protobuf\Internal\RepeatedField contains Google\Cloud\Vision\V1\EntityAnnotation
imagePropertiesDetection Google\Cloud\Vision\V1\ImageProperties
labelDetection Google\Protobuf\Internal\RepeatedField contains Google\Cloud\Vision\V1\AnnotateImageResponse
landmarkDetection Google\Protobuf\Internal\RepeatedField contains Google\Cloud\Vision\V1\AnnotateImageResponse
logoDetection Google\Protobuf\Internal\RepeatedField contains Google\Cloud\Vision\V1\AnnotateImageResponse
objectLocalizer Google\Protobuf\Internal\RepeatedField contains Google\Cloud\Vision\V1\AnnotateImageResponse
safeSearchDetection Google\Cloud\Vision\V1\SafeSearchAnnotationcontains Google\Cloud\Vision\V1\AnnotateImageResponse

The file() method accepts the following types:

  • Local file path: path/to/your/file.
  • Google Storage path: gs://path/to/file.
  • File resource, such as fopen().
  • SplFileInfo.
  • SplFileObject.

Integration with Laravel

Open up the AppServiceProvider and add the following lines:

use AhmadMayahi\Vision\Vision; use AhmadMayahi\Vision\Config; public function register() { $this->app->singleton(Vision::class, function ($app) { $config = (new Config()) ->setCredentials(config('vision.service_account_path')); return Vision::init($config); }); }

Using Dependency Injection:

use AhmadMayahi\Vision\Vision; use Illuminate\Http\Request; class FaceDetectionController { public function detect(Request $request, Vision $vision) { $vision = $vision ->file($request->face_file->path()) ->faceDetection() ->detect(); // ... } }

You may also resolve the object using the app helper as follows:

use AhmadMayahi\Vision\Vision; /** @var Vision $vision */ $vision = app(Vision::class); $result = $vision ->file('path/to/file') ->faceDetection() ->detect(); // ...

Image Text Detection (OCR)

Get plain text

The plain() method returns an object of type AhmadMayahi\Vision\Data\ImageText.

use AhmadMayahi\Vision\Vision; $response = Vision::init($config) ->file('/path/to/input/image.jpg') ->imageTextDetection() ->plain(); $response->locale; // locale, for example "en" $response->text; // Image text

You may also get the plain text using __toString() magic method:

echo $response;

Get Document

The getDocument returns an object of type AhmadMayahi\Vision\Data\ImageText.

use AhmadMayahi\Vision\Vision; $response = Vision::init($config) ->file('/path/to/input/image.jpg') ->imageTextDetection() ->document(); $response->locale; // locale, for example "en" for English $response->text; // Image text

The difference between plain() and docuemnt() is that the first one only retrieves the plain text (no bullets, signs, etc...), whereas the latter one tries to retrieve the entire document (including bullets, symbols, etc...).

Handwriting

The document method can also be used to detect handwriting in an image.

PDF and Tiff

Coming soon.

Crop Hints Detection

Crop Hints suggests vertices for a crop region on an image.

Detect Vertices

use AhmadMayahi\Vision\Vision; $response = Vision::init($config) ->file('/path/to/input/image.jpg') ->cropHintsDetection() ->detect(); /** @var \AhmadMayahi\Vision\Data\CropHints $item */ foreach ($response as $item) { $item->bounds; // An array of \AhmadMayahi\Vision\Data\Vertex $item->confidence; $item->importanceFraction; }

Draw box around hints

You may use the drawBoxAroundHints method as follows:

use AhmadMayahi\Vision\Vision; use AhmadMayahi\Vision\Enums\Color; Vision::init($config) ->file('/path/to/input/image.jpg') ->cropHintsDetection() ->drawBoxAroundHints(Color::GREEN) ->toJpeg('out.jpg')

Draw box around hints

Crop Image

You may export the cropped image as follows:

use AhmadMayahi\Vision\Vision; $response = Vision::init($config) ->file('/path/to/input/image.jpg') ->cropHintsDetection() ->crop() ->toJpeg('out.jpg');

Original Image:

Original Image

Cropped Image:

Cropped Image

Face Detection

Face Detection detects multiple faces within an image along with the associated key facial attributes such as emotional state or wearing headwear.

The detect method returns a Generator of AhmadMayahi\Vision\Data\Face:

use AhmadMayahi\Vision\Vision; $vision = Vision::init($config); $faces = $vision ->file('/path/to/image.jpg') ->faceDetection() ->detect(); echo count($faces). ' faces found'; /** @var \AhmadMayahi\Vision\Data\Face $faceData */ foreach ($faces as $faceData) { $faceData->anger; $faceData->surprise; $faceData->joy; $faceData->blurred; $faceData->headwear; $faceData->landmarking; $faceData->underExposes; $faceData->detectionConfidence; $faceData->bounds; }

anger, surprise and joy etc... return Likelihoods ratings which are expressed as six different values: UNKNOWN, VERY_UNLIKELY, UNLIKELY, POSSIBLE, LIKELY, or VERY_LIKELY. See Likelihood.

Get the detect method as array:

$faces = $vision ->file('/path/to/image.jpg') ->faceDetection() ->asArray();

Get the detect method as JSON:

$faces = $vision ->file('/path/to/image.jpg') ->faceDetection() ->asJson();

Draw box around faces

use AhmadMayahi\Vision\Vision; use AhmadMayahi\Vision\Enums\Color; $analyzer = Vision::init($config) ->file('/path/to/input/image.jpg') ->faceDetection() ->drawBoxAroundFaces(Color::MAGENTA) ->toJpeg('faces.jpg');

Alternatively, you may use toPng, toGif, toBmp methods. All the drawing methods return an object of type AhmadMayahi\Vision\Utils\Image.

Larry Page and Sergey Brin Faces

This feature doesn't support Google Storage yet.

Image Properties Detection

The Image Properties feature detects general attributes of the image, such as dominant color.

The detect method returns a Generator of AhmadMayahi\Vision\Data\ImagePropertiesData:

use AhmadMayahi\Vision\Vision; $properties = Vision::init($config) ->file('/path/to/input/image.jpg') ->imagePropertiesDetection() ->detect(); /** @var \AhmadMayahi\Vision\Data\ImageProperties $item */ foreach ($properties as $item) { $item->red; $item->blue; $item->green; $item->pixelFraction; }

Landmark Detection

Landmark Detection detects popular natural and human-made structures within an image.

use AhmadMayahi\Vision\Vision; $landmarks = Vision::init($config) ->file('/path/to/baghdad.jpg') ->landmarkDetection() ->detect(); /** @var \AhmadMayahi\Vision\Data\Landmark $landmark */ foreach ($landmarks as $landmark) { $landmark->name; // An array containing the detected locations in latitude/longitude format. $landmark->locations; }

Safe Search Detection

SafeSearch Detection detects explicit content such as adult content or violent content within an image.

The detect method returns an object of type AhmadMayahi\Vision\Data\SafeSearch:

use AhmadMayahi\Vision\Vision; $result = Vision::init($config) ->file('/path/to/input/image.jpg') ->safeSearchDetection() ->detect(); $result->adult; $result->medical; $result->violence; $result->racy; $result->spoof;

Label Detection

Detect and extract information about entities in an image, across a broad group of categories.

The detect method returns an a Generator of labels:

use AhmadMayahi\Vision\Vision; $labels = Vision::init($config) ->file('/path/to/input/image.jpg') ->labelDetection() ->detect();

Logo Detection

Detect and extract information about entities in an image, across a broad group of categories.

The detect method returns an Generator of logos:

use AhmadMayahi\Vision\Vision; $labels = Vision::init($config) ->file('/path/to/input/image.jpg') ->logoDetection() ->detect();

Object Localizer

Object Localizer detects and extract multiple objects in an image with Object Localization.

Detect Objects

The detect method returns a Generator of AhmadMayahi\Vision\Data\LocalizedObjectData:

use AhmadMayahi\Vision\Vision; $objects = Vision::init($config) ->file('/path/to/image.jpg') ->objectLocalizer() ->detect(); /** @var AhmadMayahi\Vision\Data\LocalizedObject $obj */ foreach ($objects as $obj) { $obj->name; $obj->languageCode; $obj->mid; $obj->normalizedVertices; $obj->score; }

Draw Box Around Objects

You may draw box around objects using the drawBoxAroundObjects method:

use AhmadMayahi\Vision\Vision; use AhmadMayahi\Vision\Enums\Color; $objects = Vision::init($config) ->file('/path/to/input/image.jpg') ->objectLocalizer() ->drawBoxAroundObjects(Color::GREEN) ->toJpeg('out.jpg');

Larry Page and Sergey Brin faces

The drawBoxAroundObjects() takes an optionalcallback as a second parameter:

use AhmadMayahi\Vision\Vision; use AhmadMayahi\Vision\Enums\Color; use AhmadMayahi\Vision\Support\Image; use AhmadMayahi\Vision\Data\LocalizedObject; $objects = Vision::init($config) ->file('/path/to/input/image.jpg') ->objectLocalizer() ->drawBoxAroundObjects(Color::GREEN, function(Image $outputImage, LocalizedObject $object) { // Get GD Image $outputImage->getImage(); // Get object info $object->getName(); });

This feature doesn't support Google Storage yet.

Draw Box Around Objects With Text

You may want to draw box around objects and include the object's text as well:

use AhmadMayahi\Vision\Vision; use AhmadMayahi\Vision\Enums\Color; use AhmadMayahi\Vision\Enums\Font; use AhmadMayahi\Vision\Support\Image; use AhmadMayahi\Vision\Data\LocalizedObject; $objects = Vision::init($config) ->file('/path/to/input/image.jpg') ->objectLocalizer() ->drawBoxAroundObjectsWithText( boxColor: Color::GREEN, textColor: Color::RED, fontSize: 15, font: Font::OPEN_SANS_BOLD_ITALIC, ) ->toJpeg('output.jpg');

Larry Page and Sergey Brin Objects

This feature doesn't support Google Storage yet.

Web Detection

Web Detection detects Web references to an image.

use AhmadMayahi\Vision\Vision; use AhmadMayahi\Vision\Enums\Color; use AhmadMayahi\Vision\Enums\Font; use AhmadMayahi\Vision\Support\Image; use AhmadMayahi\Vision\Data\LocalizedObject; $response = Vision::init($config) ->file('/path/to/input/image.jpg') ->webDetection() ->detect(); $response->fullMatchingImages; $response->bestGuessLabels;; $response->pagesWithMatchingImages; $response->pagesWithMatchingImages; $response->visuallySimilarImages; $response->webEntities;

The detect method returns either an object of tupe AhmadMayahi\Vision\Data\WebData or null value.

Testing

composer test

Changelog

Please see CHANGELOG for more information on what has changed recently.

Contributing

Please see CONTRIBUTING for details.

Security Vulnerabilities

Please review our security policy on how to report security vulnerabilities.

Credits

License

The MIT License (MIT). Please see License File for more information.

About

An elegant wrapper around Google Vision API

Topics

Resources

License

Contributing

Security policy

Stars

Watchers

Forks

Sponsor this project

Packages

No packages published

Languages