Oggi stiamo sperimentando una caratteristica AI utile che riguarda la classificazione delle immagini, cioè un modello AI creato appositamente per restituire una spiegazione scritta di un'immagine tramite l'URL dell'immagine. Per cosa può essere utile? Come prima applicazione, per sapere cosa c'è dentro un'immagine senza nemmeno aprirla; questo apre le porte a una serie di altre applicazioni come il riconoscimento di abusi o comportamenti inappropriati attraverso la scansione di un elenco di trascrizioni di testo da immagini. È anche utile per avere automaticamente una descrizione dell'immagine e salvarla in qualche database. Di cosa abbiamo bisogno?
1) Un account- [Account: an Account contains the personal information that is assigned to those who register and access with email and password] - Cloudflare (anche gratis)
2) A lavoratore nel tuo Account Cloudflare (anche gratis)
Nei lavoratori Cloudflare c'è già uno script preimpostato per generare trascrizioni di testo da immagini, ma gli script preimpostati non sono affatto sicuri da usare in un ambiente di produzione; in questo post vedremo come possiamo personalizzare lo script per renderlo più sicuro e utilizzarlo in un ambiente PHP.
Cosa vogliamo fare? L'obiettivo principale è quello di creare uno script che, a partire da un URL di immagine inviato con il metodo POST, restituisce la descrizione dell'immagine attraverso il modello di intelligenza artificiale chiamato "resnet-50". ResNet è una rete neurale convoluzionale molto profonda (CNN), composta da 152 strati, che con l'aiuto di una tecnica conosciuta come connessione skip ha spianato la strada per reti residue (rete residuale).
Cosa dobbiamo generare? Per la richiesta al nostro lavoratore useremo un file PHP; mentre per lo script da inserire nel nostro lavoratore useremo uno personalizzabile che è più sicuro di quello predefinito.
Scrittore di lavoro
esportazione predefinita (')
async fetch(richiesta, env) {
// Verificare se l'intestazione di autorizzazione contiene un token valido
const authHeader = request.headers.get("Authorization");
constretto valido Token = "YOUR_AUTHENTICATION_TOKEN";
Se (!authHeader) Traduzione: (')
// Se il token è mancante o non valido, restituire un errore 401 non autorizzato
ritorno nuovo Risposta(
JSON.stringify({ errore: "Token di autenticazione non valido o mancante." }),
{ stato: 401, intestazioni: { "Content-Type": "applicazione/json" } }
);
#
// Processo solo richieste POST valide
se (richiesta. metodo!= "POST") {
// Se il metodo non è POST, restituire un metodo 405 Non consentito errore
ritorno nuovo Response(" Metodo di richiesta non valido. Utilizzare POST con i dati richiesti.", (')
stato: 405,
headers: { "Content-Type": "text/plain" },
});
#
prova {}
// Convalida il tipo di contenuto della richiesta
contenuto Tipo = request.headers.get("Content-Type") || ";
se (!contentType.includes("applicazione/json")) {
// Se Content-Type non è JSON, restituisci un errore di 400 Bad Request
ritorno nuovo Risposta(
JSON.stringify({ errore: "Contenuto non valido-Tipo. Domanda prevista/json." }),
{ stato: 400, intestazioni: { "Content-Type": "applicazione/json" } }
);
#
// Parsare il corpo della richiesta
const body = attendere richiesta.text();
se (!body) {
// Se il corpo di richiesta è vuoto, restituisci un errore di 400 Bad Request
ritorno nuovo Risposta(
JSON.stringify({ errore: "Il corpo della richiesta è vuoto." }),
{ stato: 400, intestazioni: { "Content-Type": "applicazione/json" } }
);
#
const {} immagine Url } = JSON.parse(corpo);
se (!imageUrl) {
// Se l'URL dell'immagine non viene fornito nel corpo, restituisci un errore di 400 Bad Request
ritorno nuovo Risposta(
JSON.stringify({ errore: "Nessun URL immagine fornito." }),
{ stato: 400, intestazioni: { "Content-Type": "applicazione/json" } }
);
#
// Prelevare l'immagine dall'URL fornito
const imageResponse = attendere fetch (imageUrl);
const blob = attend imageResponse.arrayBuffer();
// Preparare gli input per il modello AI
const inputs = (')
immagine: [...new Uint8Array(blob)],
}
// Eseguire il modello AI e ottenere la risposta
const risposta = attendere env.AI.run("@cf/microsoft/resnet-50", ingressi);
// Ritorna la risposta del modello AI
ritorno nuovo Risposta(
JSON.stringify
{ headers: { "Content-Type": "applicazione/json" } }
);
} cattura (error) {
// Gestire eventuali errori inaspettati e restituire un errore di server interno 500
ritorno nuovo Risposta(
JSON.stringify({ errore: error.message }),
{ stato: 500, intestazioni: { "Content-Type": "applicazione/json" } }
);
#
♪
}Cosa considerare quando personalizzare questo script? La costante valido Token deve contenere il token personalizzato per passare al momento della richiesta, inserire una password e poi ricordarlo di reinserirlo nel file PHP più in basso; se i token non sono uguali lo script restituirà un errore di 401 e salverà ulteriori lavori della CPU (questa costante può essere modificata ma deve essere lo stesso sul formato PHP); inoltre se la richiesta non viene da un metodo POST, lo script restituirà un errore di lavoro 405 anche usato per salvare Se tutto è corretto, allora possiamo andare avanti per inviare il file immagine all'intelligenza artificiale, che restituirà la sua descrizione in formato JSON pronto per essere catturato dallo script PHP che stiamo per costruire.
script PHP
Chiamiamo questo script imageai.php e salvarlo in una directory protetta
<
// URL del tuo Worker Cloudflare
$cloudflare Url = "https://yoururl.workers.dev/";
$authToken = "YOUR_AUTHENTICATION_TOKEN"; // Token di autenticazione per abbinare il Worker
Se ($_SERVER['REQUEST_METHOD'] == 'POST') {
$imageUrl = $_POST['imageUrl'];
se (vuoto($imageUrl)) (')
// Controllare se l'URL dell'immagine è fornito; in caso contrario, restituire un errore
echo json_encode(['error' => 'Image URL è mancante.');
uscita;
#
// Verifica se l'URL punta a un'immagine reale controllando l'intestazione Content-Type
$headers = get_headers($imageUrl, 1);
se (!isset($headers['Content-Type']) || strpos($headers['Content-Type'], 'image/') === false) {
// Se l'URL non indica un'immagine, restituire un errore
echo json_encode(['error' => 'L'URL non contiene un'immagine valida.');
uscita;
#
// Preparare il carico di pagamento JSON per la richiesta
$data = json_encode(['imageUrl' => $imageUrl]);
// Impostare le opzioni di richiesta, incluso l'intestazione di autorizzazione con il gettone
$options = [
«http» = >
'header' => "Content-Type: applicazione/json\r\n" .
"Autorizzazione: Bearer $authToken\r\n",
// Includere il token nell'intestazione di autorizzazione
'metodo' = > 'POST',
"contenuto" = > $data,
]
]
// Inviare la richiesta al lavoratore e ottenere la risposta
$context = stream_context_create($options);
$response = file_get_contents($cloudflare Url, falso, $context);
se ($response === FALSE) {
// Se il lavoratore è irraggiungibile, restituire un errore
echo json_encode(['error' => "Incapace di contattare il lavoratore".
uscita;
#
// Decodifica la risposta JSON dal Worker
$decodedResponse = json_decode($response, true);
se ($decodedResponse == null) {
// Se la risposta non è valida JSON, restituisci un errore
echo json_encode(['error' => "La risposta non è valida JSON".
uscita;
#
// Uscita della risposta decodificata
echo json_encode($decodedResponse);
#
>Cosa considerare quando personalizzare questo script? La variabile $authToken contiene i token di autenticazione che abbiamo impostato nello script del lavoratore (precedentemente); il valore deve essere lo stesso in entrambi gli script. La variabile $cloudflare Ur contiene l'intero URL in cui viene salvato lo script del lavoratore (precedentemente salvato), di solito inizia con https:// e termina con i lavoratori. dev ma è anche possibile associare un subdominio personalizzato (a vostra preferenza). Lo script può essere chiamato da un
in html e deve passare l'url dell'immagine da un campo con id "imageUrl", ovviamente può essere chiamato anche via POST da un altro script in javascript (come si preferisce); lo script PHP a questo punto controlla che l'url passato via POST è lì e lo controlla per verificare se è in realtà un'immagine; una volta che i controlli hanno passato chiama lo script del lavoratore, controlla se il servizio è disponibile e raggiungibile, e restituisce il formato JSON che deve essere risposta.
Modulo HTML
Oh! DOCTYPE html Traduzione: <Image Classificazione Traduzione: corpo fisico font-family: Arial, sans-serif; margine: 20px; imbottitura: 0; sfondo-colore: #f4f4f9; colore: #333; # formulario larghezza massima: 400px; margine: 0 auto; imbottitura: 20px; sfondo: #fff; confine: 1px solido #ddd; confine-radio: 5px; box-shadow: 0 2px 5px rgba(0, 0, 0, 0,1); # input[type="text"] { larghezza: 100%; imbottitura: 10px; margine: 10px 0; confine: 1px solido #ccc; confine-radio: 3px; # pulsante {} larghezza: 100%; imbottitura: 10px; sfondo-colore: #007bff; colore: bianco; confine: nessuno; confine-radio: 3px; cursore: puntatore; # pulsante:hover { sfondo-colore: #0056b3; # .descrizione {} margin-top: 20px; font-size: 16px; testo-align: centro; imbottitura: 10px; confine-radio: 5px; # .descrizione.successo { sfondo-colore: #d4edda; colore: #155724; # .description.error (') sfondo-colore: #f8d7da; colore: #721c24; # < > < > * Classificazione Inserisci l'URL di un'immagine per classificarla:

