-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprepare.go
61 lines (45 loc) · 1.24 KB
/
prepare.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package similar
import (
"context"
"fmt"
"image"
"io"
"log/slog"
"time"
"github.com/whosonfirst/go-dedupe/embeddings"
)
// PrepareResult is a struct containing the results derived by the `Prepare` method.
type PrepareResult struct {
// Image is the `image.Image` instance that was decoded.
Image image.Image
// Embeddings are the (vector) embeddings derived from 'Image'.
Embeddings []float32
}
// Prepare() derives (vector) embeddings for an image file encoded in 'r' using 'emb'.
func Prepare(ctx context.Context, emb embeddings.Embedder, r io.ReadSeeker) (*PrepareResult, error) {
t1 := time.Now()
defer func() {
slog.Debug("Time to prepare record", "time", time.Since(t1))
}()
im, _, err := image.Decode(r)
if err != nil {
return nil, fmt.Errorf("Failed to decode image, %w", err)
}
_, err = r.Seek(0, 0)
if err != nil {
return nil, fmt.Errorf("Failed to rewind reader, %w", err)
}
body, err := io.ReadAll(r)
if err != nil {
return nil, fmt.Errorf("Failed to read body, %w", err)
}
embeddings, err := emb.ImageEmbeddings32(ctx, body)
if err != nil {
return nil, fmt.Errorf("Failed to generate embeddings, %w", err)
}
pr := &PrepareResult{
Image: im,
Embeddings: embeddings,
}
return pr, nil
}