pdqhash-go

git clone git://archive.git.mtrnord.blog/MTRNord/pdqhash-go.git
Log | Files | Refs | LICENSE

pdq_hasher_test.go (4731B)


      1 package pdq
      2 
      3 import (
      4 	"os"
      5 	"testing"
      6 
      7 	"github.com/MTRNord/pdqhash-go/types"
      8 	"github.com/davidbyttow/govips/v2/vips"
      9 	"github.com/stretchr/testify/assert"
     10 )
     11 
     12 type Pair struct {
     13 	First  string
     14 	Second string
     15 }
     16 
     17 func TestMain(m *testing.M) {
     18 	vips.LoggingSettings(nil, vips.LogLevelMessage)
     19 	vips.Startup(&vips.Config{
     20 		ConcurrencyLevel: 0,
     21 		MaxCacheFiles:    5,
     22 		MaxCacheMem:      50 * 1024 * 1024,
     23 		MaxCacheSize:     100,
     24 		ReportLeaks:      false,
     25 		CacheTrace:       false,
     26 		CollectStats:     false,
     27 	})
     28 	defer vips.Shutdown()
     29 
     30 	os.Exit(m.Run())
     31 }
     32 
     33 var DATA_ARRAY = [19]Pair{
     34 	{
     35 		"./test-images/misc-images/b.jpg",
     36 		"d8f8f0cce0f4a84f0e370a22028f67f0b36e2ed596623e1d33e6b39c4e9c9b22",
     37 	},
     38 	{
     39 		"./test-images/misc-images/c.png",
     40 		"e64cc9d91e623842f8d1f1d9a398e78c9f199a3bd87924f2b7e11e0bf061b064",
     41 	},
     42 	{
     43 		"./test-images/misc-images/small.jpg",
     44 		"0007001f003f003f007f00ff00ff00ff01ff01ff01ff03ff03ff03ff03ff03ff",
     45 	},
     46 	{
     47 		"./test-images/misc-images/wee.jpg",
     48 		"6227401f601ff4ccafcc9fad4b0d95d371a2eb7265a3285234d228ca94deeb2d",
     49 	},
     50 	{
     51 		"./test-images/reg-test-input/labelme-subset/q0003.jpg",
     52 		"54a977c221d14c1c43ba5e6e21d4a13989a3553f1462611cbb85fda7be83b677",
     53 	},
     54 	{
     55 		"./test-images/reg-test-input/labelme-subset/q0004.jpg",
     56 		"992d44af36d69e6ca6b812585928bac11def254ef5398c6d07466c9abcc65b92",
     57 	},
     58 	{
     59 		"./test-images/reg-test-input/labelme-subset/q0122.jpg",
     60 		"cfb2009ddd21c6dab0046a7745b5984757a8a4535b3377aea2591d32b33ff940",
     61 	},
     62 	{
     63 		"./test-images/reg-test-input/labelme-subset/q0291.jpg",
     64 		"a0fe94f1e5cc1cc8dd855948498dc9243f7ca27336f036d7f212b74bc103c9a7",
     65 	},
     66 	{
     67 		"./test-images/reg-test-input/labelme-subset/q0746.jpg",
     68 		"1049d96239e24d4dca2c55512b8bdb77425f4dbcf575a0a95555aaab5554aaaa",
     69 	},
     70 	{
     71 		"./test-images/reg-test-input/labelme-subset/q1050.jpg",
     72 		"489db672e9190276d452aeab41eba20f02375fe4092d88defdf491a5c55c5f70",
     73 	},
     74 	{
     75 		"./test-images/reg-test-input/labelme-subset/q2821.jpg",
     76 		"b150231ffae4710ffcf4f18bb574b109a576f14bb8543189f8743289f174b109",
     77 	},
     78 	{
     79 		"./test-images/reg-test-input/dih/bridge-1-original.jpg",
     80 		"d8f8f0cce0f4a84f0e370a22028f67f0b36e2ed596623e1d33e6b39c4e9c9b22",
     81 	},
     82 	{
     83 		"./test-images/reg-test-input/dih/bridge-2-rotate-90.jpg",
     84 		"38a50efd71c83f429013d68d0ffffc52e34e0e15ada952a9d29684214aa9e5af",
     85 	},
     86 	{
     87 		"./test-images/reg-test-input/dih/bridge-3-rotate-180.jpg",
     88 		"2dadda64b5a142e5d362209057da895ae63b8c7fc277b4b766b319361f893188",
     89 	},
     90 	{
     91 		"./test-images/reg-test-input/dih/bridge-4-rotate-270.jpg",
     92 		"a5f0a457248995e8c9065c275aaa54d8b61ba4bdf8fcfc0387c32f8b0bfc4f05",
     93 	},
     94 	{
     95 		"./test-images/reg-test-input/dih/bridge-5-flipx.jpg",
     96 		"d8f80f31e0f417b00e37f5dd028f980fb36ed12a9662c1e233e64c634e9c64dd",
     97 	},
     98 	{
     99 		"./test-images/reg-test-input/dih/bridge-6-flipy.jpg",
    100 		"0dad259bb1a1bd18d362576556da32a1e63b7380c2374b4866b3c6c91b89ce77",
    101 	},
    102 	{
    103 		"./test-images/reg-test-input/dih/bridge-7-flip-plus-1.jpg",
    104 		"f0a5e10271dcc0bd9c5309720fff018de34ef1e8ada9a956d2967ade1ea91a50",
    105 	},
    106 	{
    107 		"./test-images/reg-test-input/dih/bridge-8-flip-minus-1.jpg",
    108 		"69f05aa8a4996a17c146a2da5aaaab07b61b5b60f8fc07fc83c3d0740bfcb0fa",
    109 	},
    110 }
    111 
    112 func TestPDQHasher(t *testing.T) {
    113 	pdqHasher := NewPDQHasher()
    114 	hammingTolerance := 16
    115 
    116 	for _, pair := range DATA_ARRAY {
    117 		imagePath := pair.First
    118 		expectedHash := pair.Second
    119 
    120 		hash := pdqHasher.FromFile(imagePath)
    121 
    122 		expectedHashObj, err := types.Hash256FromHexString(expectedHash)
    123 		assert.ErrorIs(t, err, nil)
    124 
    125 		computedHash := hash.Hash
    126 
    127 		hammingDistance := computedHash.HammingDistance(expectedHashObj)
    128 		assert.LessOrEqualf(t, hammingDistance, hammingTolerance, "Hamming distance is too high: %s", imagePath)
    129 	}
    130 }
    131 
    132 func TestPDQHasherDehidral(t *testing.T) {
    133 	pdqHasher := NewPDQHasher()
    134 	hashes := pdqHasher.DihedralFromFile("./test-images/reg-test-input/labelme-subset/q0004.jpg", PDQ_DO_DIH_ALL)
    135 
    136 	assert.Equal(t, hashes.hash.String(), "992d44af36d69e6ca6b812585928bac11def254ef5398c6d07466c9abcc65b92")
    137 	assert.Equal(t, hashes.hashRotate90.String(), "9b323dd22976484c939787013f096d1669874a21dab0d3dadef50f2560cf3e4f")
    138 	assert.Equal(t, hashes.hashRotate180.String(), "8c78ee05e38335c6f3edf8f28e7d106b48ba8fe4a06c16c71213c670e993f138")
    139 	assert.Equal(t, hashes.hashRotate270.String(), "c86783787c23e2e6c6c22dab685cc7bc3cd2608b8fe579708ba0a58f359a94e5")
    140 	assert.Equal(t, hashes.hashFlipX.String(), "d92dbb5036d62093a6b82da75928453e1defdab1f539439247469325bcc6a465")
    141 	assert.Equal(t, hashes.hashFlipY.String(), "8c3811fa6383ca39f3ed470d8e7def9448ba701ba06ce9381213398fe9930ecf")
    142 	assert.Equal(t, hashes.hashFlipPlus1.String(), "993242252966b7a3939778fe3d0982e9698735dadab02c25def4f0da60cfc1b0")
    143 	assert.Equal(t, hashes.hashFlipMinus1.String(), "ee676c877c231d19c6c2d2546a5c38433cd29f748fe5868f8ba15a70359a6b1a")
    144 }