Pencarian terakhir dengan contoh dapat ditemukan di sini.
Ini terlihat seperti ini:
Saya ingin membuat pencarian gambar terbalik untuk OpenGameArt karena Pencarian Gambar Google dan TinEye tidak memberikan hasil yang baik. Saya sebelumnya telah membuat peta ubin besar untuk memberikan ikhtisar gambar serupa di OpenGameArt, tetapi peta itu tidak terlalu ramah sumber daya di web atau browser gambar dan harus dipecah menjadi file yang lebih kecil, ditambah lagi tidak dapat dicari dengan cara apa pun, hanya dapat digulir. Jadi saya ingin cara bagi orang-orang untuk menjelajahi jenis seni apa yang tersedia di OpenGameArt, dan mulai menggunakan penelusuran kesamaan untuk menelusuri ruang gambar.
Hal pertama yang harus saya lakukan adalah mengambil hasil pencarian untuk kueri yang saya minati di OpenGameArt, sebagian besar adalah seni 2D. Kemudian saya harus mengambil setiap halaman HTML yang ada di indeks hasil pencarian dan mengurai HTML untuk link ke file. OpenGameArt berisi banyak file arsip seperti file zip dan rar, jadi saya harus membongkarnya untuk mendapatkan gambarnya.
Misalnya, berikut cuplikan yang menunjukkan cara mengurai halaman konten dan mendapatkan link file:
responseBody = await Common . ReadURIOrCache ( blob , Common . BaseURI + page , client ) ;
var htmlDoc = new HtmlDocument ( ) ;
htmlDoc . LoadHtml ( responseBody ) ;
var htmlBody = htmlDoc . DocumentNode . SelectSingleNode ( " //body " ) ;
foreach ( var nNode in htmlBody . Descendants ( " a " ) )
{
if ( nNode . NodeType == HtmlNodeType . Element &&
nNode . Attributes [ " href " ] != null &&
nNode . Attributes [ " href " ] . Value . Contains ( " /default/files/ " ) )
{
msg . Add ( HttpUtility . HtmlDecode ( nNode . Attributes [ " href " ] . Value . Replace ( Common . FileURI , " " ) ) ) ;
}
}
Saya menggunakan Azure Functions untuk melakukan langkah-langkah perayapan, dengan beberapa intervensi manual bolak-balik untuk memperbaiki hal-hal sesuai kebutuhan. Setiap langkah memiliki antriannya sendiri dan kemudian menempatkan pekerjaan untuk langkah berikutnya pada antrian berikutnya. Pada akhirnya biaya pemanggilan sekitar 50 USD di Azure, katakanlah 10-20 juta pemanggilan Fungsi jika saya ingat dengan benar.
Saya mencoba menggunakan database Milvus open source, namun crash di server DigitalOcean saya karena saya tidak memiliki cukup memori di dalamnya. Kemudian saya secara tidak sengaja dan untungnya menemukan tautan ke Pinecone di bagian komentar Hacker News dan memutuskan untuk menggunakannya, karena uji cobanya gratis dan saya tidak perlu menambah memori server saya untuk menggunakan Milvus. Pada akhirnya saya tetap memperluas server saya, tetapi saya tidak mencoba Milvus lagi (setidaknya belum).
Saya menggunakan ekstraksi fitur VGG16 dalam skrip saya untuk ini. Lihat artikel untuk informasi lebih lanjut, namun intinya adalah 4096 angka floating point 32-bit untuk setiap gambar, yang menggambarkan berbagai fitur gambar, misalnya dengan cara yang sangat disederhanakan berapa banyak garis atau kotak yang dimilikinya atau seberapa hijau warnanya. . Namun fitur ini didasarkan pada neuron di jaringan saraf untuk VGG16 (yang biasanya digunakan untuk klasifikasi gambar), sehingga fitur tersebut mungkin lebih rumit daripada yang dijelaskan oleh tag fitur sederhana. Dan alasan kita membutuhkan vektor-vektor ini adalah karena mudahnya menggunakan jarak Euclidean atau kesamaan kosinus atau ukuran lain pada dua vektor untuk melihat apakah keduanya serupa, dan akibatnya gambar-gambarnya serupa. Selain itu, terdapat teknologi pencarian pada vektor-vektor ini yang memungkinkan pencarian cepat pada vektor-vektor tersebut dalam jumlah besar.
Berikut skrip python yang disederhanakan untuk menunjukkan cara melakukan ekstraksi fitur:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# vim: ft=python ts=4 sw=4 sts=4 et fenc=utf-8
from tensorflow . keras . applications . vgg16 import VGG16
from tensorflow . keras . preprocessing import image
from tensorflow . keras . applications . vgg16 import decode_predictions , preprocess_input
from tensorflow . keras . models import Model
from tensorflow . compiler import xla
import numpy as np
import time
import os
import sys
import PIL
import json
import math
import multiprocessing
from glob import glob
from PIL import Image
from io import BytesIO
model = VGG16 ( weights = 'imagenet' , include_top = True )
feat_extractor = Model ( inputs = model . input , outputs = model . get_layer ( "fc2" ). output )
def prepImage ( img ):
x = np . array ( img . resize (( 224 , 224 )). convert ( 'RGB' ))
x = np . expand_dims ( x , axis = 0 )
x = preprocess_input ( x )
return x
def main ():
'entry point'
fname = 'demo.jpg'
dt = Image . open ( fname )
pimg = prepImage ( dt )
print ( "Computing feature vector" , fname )
features = feat_extractor . predict ( pimg )
print ( features )
if __name__ == '__main__' :
main ()
Berikut output skripnya:
emh@frostpunk ~ /public_html/ogasearch 0% ./test.py (git)-[gh-pages]
2021-04-07 18:48:03.158023: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library ' libcudart.so.11.0 ' ; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory
2021-04-07 18:48:03.158082: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
2021-04-07 18:48:07.783109: I tensorflow/compiler/jit/xla_cpu_device.cc:41] Not creating XLA devices, tf_xla_enable_xla_devices not set
2021-04-07 18:48:07.783485: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library ' libcuda.so.1 ' ; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory
2021-04-07 18:48:07.783530: W tensorflow/stream_executor/cuda/cuda_driver.cc:326] failed call to cuInit: UNKNOWN ERROR (303)
2021-04-07 18:48:07.783580: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (frostpunk): /proc/driver/nvidia/version does not exist
2021-04-07 18:48:07.784058: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2021-04-07 18:48:07.784513: I tensorflow/compiler/jit/xla_gpu_device.cc:99] Not creating XLA devices, tf_xla_enable_xla_devices not set
2021-04-07 18:48:08.599925: W tensorflow/core/framework/cpu_allocator_impl.cc:80] Allocation of 411041792 exceeds 10% of free system memory.
2021-04-07 18:48:09.194634: W tensorflow/core/framework/cpu_allocator_impl.cc:80] Allocation of 411041792 exceeds 10% of free system memory.
2021-04-07 18:48:09.385612: W tensorflow/core/framework/cpu_allocator_impl.cc:80] Allocation of 411041792 exceeds 10% of free system memory.
2021-04-07 18:48:13.033066: W tensorflow/core/framework/cpu_allocator_impl.cc:80] Allocation of 411041792 exceeds 10% of free system memory.
Computing feature vector demo.jpg
2021-04-07 18:48:13.706621: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:116] None of the MLIR optimization passes are enabled (registered 2)
2021-04-07 18:48:13.717564: I tensorflow/core/platform/profile_utils/cpu_utils.cc:112] CPU Frequency: 2199995000 Hz
[[0. 3.1128967 1.5611947 ... 1.2625191 0.7709812 0. ]]
./test.py 12.20s user 4.66s system 132% cpu 12.731 total
Saya juga ingin memasukkan semua URL gambar ke dalam database SQL pada akhirnya, dan memiliki tanda apakah saya telah membuat ekstraksi fitur VGG16 dan apakah itu ditambahkan ke database vektor (Milvus atau Pinecone. Penting untuk dapat melakukannya memetakan bolak-balik antara kunci utama bilangan bulat, yang digunakan di Pineone, dan URL serta mungkin metadata lain yang dimiliki gambar tersebut, karena [Pinecone](https://www.pinecone.io/ tidak menyimpan metadata lain daripada yang primer kuncinya. Pada akhirnya saya membodohi database SQL ke file teks yang dipisahkan tab dan memuatnya pada startup server kueri.
Saya pikir saya menghabiskan total satu minggu untuk menjalankan semua kode sampai selesai, setiap langkah memakan waktu satu atau dua hari, perayapan, menghitung vektor fitur. Saya tidak ingat berapa lama waktu yang diperlukan untuk memasukkan vektor ke dalam database Pinecone, tapi menurut saya itu bukan langkah yang paling memakan waktu.
Pada akhirnya saya juga menambahkan perbaikan cepat untuk menghapus hasil gambar yang hampir duplikat yang memiliki skor yang sama. Saya mengalami beberapa masalah pada halaman pencarian dengan pengkodean URL "ganda", karena saya telah menyimpan file menggunakan pengkodean URL dalam sistem file, tetapi saya mengatasinya dengan beberapa kode deteksi di frontend ketika browser mengkodekan ganda file tersebut. Nama file yang dikodekan URL. Saya sarankan menyimpan file yang dirayapi tanpa pengkodean URL. Saya menyesal karena skrip saya tidak berkualitas atau dipoles dengan baik, misalnya ada beberapa langkah dalam skrip dan saya mengubah banyak hal dengan mengedit skrip alih-alih mengambil argumen baris perintah. Saya tidak ingin memposting cuplikan dari skrip dan menjelaskannya karena agak berantakan. Selain itu, saya memindahkan file dari penyimpanan Azure ke server DigitalOcean saya di tengah jalan, sebelum memproses ekstraksi fitur, jadi ada beberapa penanganan lokasi data yang tidak konsisten.