in functions/image-analysis/go/main.go [56:119]
func VisionAnalysis(ctx context.Context, e GCSEvent) error {
log.Printf("Event: %#v", e)
filename := e.Name
filebucket := e.Bucket
log.Printf("New picture uploaded %s in %s", filename, filebucket)
client, err := vision.NewImageAnnotatorClient(ctx)
if err != nil {
log.Printf("Failed to create client: %v", err)
return errors.New("Failed to create CloudVision client")
}
defer client.Close()
request := &pb.AnnotateImageRequest{
Image: &pb.Image{
Source: &pb.ImageSource{
ImageUri: fmt.Sprintf("gs://%s/%s", filebucket, filename),
},
},
Features: []*pb.Feature{
{Type: pb.Feature_LABEL_DETECTION},
{Type: pb.Feature_IMAGE_PROPERTIES},
{Type: pb.Feature_SAFE_SEARCH_DETECTION},
},
}
r, err := client.AnnotateImage(ctx, request)
if err != nil {
log.Printf("Failed annotate image: %v", err)
return fmt.Errorf("Vision API error: code %d, message: '%s'", r.Error.Code, r.Error.Message)
}
resp := visionResponse{r}
log.Printf("Raw vision output for: %s: %s", filename, resp.toJSON())
labels := resp.getLabels()
log.Printf("Labels: %s", strings.Join(labels, ", "))
color := resp.getDominantColor()
log.Printf("Color: %s", color)
if !resp.isSafe() {
return nil
}
// if the picture is safe to display, store it in Firestore
pictureStore, err := firestore.NewClient(ctx, firestore.DetectProjectID)
if err != nil {
log.Printf("Failed to get 'pictures' firestore collection: %v", err)
return errors.New("Failed to get 'pictures' firestore collection")
}
_, err = pictureStore.Doc("pictures/"+filename).Create(ctx, firestorePicture{
Labels: labels,
Color: color,
})
if err != nil {
log.Printf("Failed to add picture in firestore: %v", err)
return errors.New("Failed to add picture in firestore")
}
return nil
}