Requires PHP 8.0+
For feedback, please contact me.
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.
- Installation
- Creating Google Service Account
- Configuration
- Original Responses
- Integration with Laravel
- Image Text Detection
- Crop Hints Detection
- Face Detection
- Detect Image Properties
- Label Detection
- Landmark Detection
- Logo Detection
- Object Localizer
- Web Detection
You may install the package via composer:
composer require ahmadmayahi/php-google-vision
First, you must create a Google service account and setup the configuration object.
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();
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\SafeSearchAnnotation contains 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
.
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(); // ...
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;
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()
anddocuemnt()
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...).
The document
method can also be used to detect handwriting in an image.
Coming soon.
Crop Hints suggests vertices for a crop region on an image.
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; }
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')
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:
Cropped Image:
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
andjoy
etc... return Likelihoods ratings which are expressed as six different values:UNKNOWN
,VERY_UNLIKELY
,UNLIKELY
,POSSIBLE
,LIKELY
, orVERY_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();
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 typeAhmadMayahi\Vision\Utils\Image
.
This feature doesn't support Google Storage yet.
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 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; }
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;
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();
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 detects and extract multiple objects in an image with Object Localization.
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; }
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');
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.
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');
This feature doesn't support Google Storage yet.
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.
composer test
Please see CHANGELOG for more information on what has changed recently.
Please see CONTRIBUTING for details.
Please review our security policy on how to report security vulnerabilities.
The MIT License (MIT). Please see License File for more information.