CV / CLIP

CLIP ViT-B/32

reComputer RK3588

Mise en correspondance image-texte OpenAI CLIP ViT-B/32 accélérée par RKNN sur reComputer RK3576 et RK3588.

36 téléchargements
Précision
RKNN

Choisissez l'appareil que vous utilisez. Le guide de configuration et la documentation seront mis à jour en conséquence.

Pour commencer

Armbian 26.8.7 Gnome ou version ultérieure avec OTA overlayroot : Configurez le stockage de Docker avant de lancer des conteneurs pour éviter les erreurs de montage overlay.

Déployer
sudo docker run --rm --privileged --net=host \
  -e PYTHONUNBUFFERED=1 -e RKNN_LOG_LEVEL=0 \
  -v /proc/device-tree/compatible:/proc/device-tree/compatible:ro \
  ghcr.io/seeed-projects/recomputer-rk-cv/rk3588-clip:latest

API REST

Utilisez l'API REST pour exécuter l'inférence. Copiez les commandes ci-dessous.

Curl
curl http://localhost:8080/v1/chat/completions -d '{
  "model": "clip-rknn",
  "messages": [{"role": "user", "content": "Hello"}]
}'
Python
import requests

resp = requests.post(
    "http://localhost:8080/v1/chat/completions",
    json={"model": "clip-rknn", "messages": [{"role": "user", "content": "Hello"}]},
)
print(resp.json())

Détails du modèle

Armbian 26.8.7 Gnome ou version ultérieure avec OTA overlayroot : Configurez le stockage de Docker avant de lancer des conteneurs pour éviter les erreurs de montage overlay.

Démarrage rapide

1. Installer Docker

Exécutez les commandes suivantes sur la carte de développement pour installer Docker :

bash
# Download installation script
curl -fsSL https://get.docker.com -o get-docker.sh
# Install using Aliyun mirror source
sudo sh get-docker.sh --mirror Aliyun
# Start Docker and enable auto-start on boot
sudo systemctl enable docker
sudo systemctl start docker

2. Exécuter le projet (une commande, aperçu à deux modes)

Ce projet permet la classification d'images zero-shot et la recherche d'images en langage naturel depuis un navigateur web. Les encodeurs d'images et de texte s'exécutent tous deux comme des modèles RKNN.

Étape A : récupérer les images

bash
sudo docker pull ghcr.io/Seeed-Projects/recomputer-rk-cv/rk3588-clip:latest
sudo docker pull ghcr.io/Seeed-Projects/recomputer-rk-cv/rk3576-clip:latest

Étape B : exécuter en une commande

Pour RK3588 :

bash
sudo docker run --rm --privileged --net=host \
    -e PYTHONUNBUFFERED=1 \
    -e RKNN_LOG_LEVEL=0 \
    -v /proc/device-tree/compatible:/proc/device-tree/compatible:ro \
    ghcr.io/seeed-projects/recomputer-rk-cv/rk3588-clip:latest

Accès via : http://<Board_IP>:8000


Pour RK3576 :

bash
sudo docker run --rm --privileged --net=host \
    -e PYTHONUNBUFFERED=1 \
    -e RKNN_LOG_LEVEL=0 \
    -v /proc/device-tree/compatible:/proc/device-tree/compatible:ro \
    ghcr.io/seeed-projects/recomputer-rk-cv/rk3576-clip:latest

Accès via : http://<Board_IP>:8000

3. Inférence en ligne de commande

Classer une image avec des descriptions candidates :

bash
python inference.py --platform rk3576 --model_dir model \
    --file samples/dog_224x224.jpg \
    --prompts 'a photo of a dog|a photo of a cat'

Classer plusieurs images à l'aide d'une requête en langage naturel :

bash
python inference.py --platform rk3576 --model_dir model \
    --files image1.jpg image2.jpg --query 'a red car' --topk 2

Utilisez --platform rk3588 lorsque vous exécutez le répertoire source RK3588.


🔌 Documentation de l'API

Le service fournit des interfaces REST distinctes pour la classification zero-shot et la recherche d'images à partir de texte. La documentation OpenAPI interactive est disponible à http://<Board_IP>:8000/docs.

1. Classification d'images zero-shot

Point d'accès : POST /api/models/clip/predict

Paramètres de la requête (Multipart/Form-Data) :

  • file : Fichier image obligatoire. Les images sont prétraitées en 224 x 224.
  • prompts : Étiquettes candidates obligatoires, sous forme de tableau JSON, de texte séparé par des sauts de ligne ou de texte séparé par |. Au maximum 32 étiquettes sont acceptées.
  • topk : Nombre facultatif d'étiquettes renvoyées, de 1 à 32. La valeur par défaut est 5.

Exemple d'utilisation :

bash
curl -X POST "http://127.0.0.1:8000/api/models/clip/predict" \
    -F 'file=@samples/dog_224x224.jpg' \
    -F $'prompts=a photo of a dog\na photo of a cat' \
    -F 'topk=2'

Format de réponse (JSON) :

json
{
  "success": true,
  "model": "clip",
  "platform": "rk3576",
  "inference_time_ms": 58.2,
  "result": {
    "mode": "classification",
    "image": {"width": 224, "height": 224},
    "candidate_count": 2,
    "predictions": [
      {"text": "a photo of a dog", "score": 0.97}
    ]
  }
}

2. Recherche d'images en langage naturel

Point d'accès : POST /api/models/clip/retrieve

Paramètres de la requête (Multipart/Form-Data) :

  • files : Champ répété obligatoire contenant de 1 à 32 images.
  • text : Requête obligatoire en langage naturel.
  • topk : Nombre facultatif de correspondances renvoyées, de 1 à 32.

Exemple d'utilisation :

bash
curl -X POST "http://127.0.0.1:8000/api/models/clip/retrieve" \
    -F 'files=@image1.jpg' \
    -F 'files=@image2.jpg' \
    -F 'text=a red car' \
    -F 'topk=2'

L'encodeur de texte converti possède une entrée fixe de 20 tokens ; les descriptions et les requêtes doivent donc rester concises. La similarité est calculée à partir des caractéristiques normalisées d'images et de texte.

3. Interface de configuration du système

Obtenir la configuration actuelle

  • Point d'accès : GET /api/config
  • Réponse : {"topk": 5}

Mettre à jour la configuration

bash
curl -X POST "http://127.0.0.1:8000/api/config" \
    -H 'Content-Type: application/json' \
    -d '{"topk": 3}'

Utilisez GET /api/health pour examiner la plateforme active, les fichiers RKNN chargés et les capacités de l'environnement d'exécution.


🛠️ Guide du développeur (recommandations de production)

Description du code

  • web_service.py :
    • API web : Fournit l'interface du navigateur, les API de prédiction, de recherche et de configuration, ainsi que l'état de santé.
    • Validation des requêtes : Limite les téléversements à 64 MB et la recherche à 32 images.
  • task_runtime.py :
    • Traitement des images : Redimensionne l'entrée en 224 x 224 et normalise les caractéristiques des images.
    • Traitement du texte : Tokenise les descriptions avec clip_vocab.h et applique l'entrée fixe de 20 tokens du modèle converti.
    • Classement : Calcule la similarité cosinus normalisée pour la classification et la recherche.
  • inference.py : Fournit la classification et la recherche en une exécution en ligne de commande.

Fichiers du modèle

ComposantFichier
Encodeur d'imagesmodel/clip_images.rknn
Encodeur de textemodel/clip_text.rknn
Vocabulairemodel/clip_vocab.h

Modifier les modèles

  1. Placez des fichiers .rknn compatibles pour les encodeurs d'images et de texte dans le répertoire model/ et conservez les noms ci-dessus.
  2. Utilisez les deux encodeurs et le vocabulaire issus du même ensemble de conversion.
  3. Avant le déploiement, vérifiez que le remplacement conserve l'entrée image 224 x 224 et le contrat d'entrée texte fixe de 20 tokens.

Le projet amont fournit actuellement un ensemble de modèles par plateforme. Les deux encodeurs sont des composants du pipeline, pas des tailles de quantification alternatives ; cette version n'a aucun paramètre de variante de modèle.

Construire les images locales

Exécutez depuis la racine de reComputer-RK-CV :

bash
docker build -f docker/rk3576/clip.dockerfile \
    -t rk3576-clip:local src/rk3576_clip

docker build -f docker/rk3588/clip.dockerfile \
    -t rk3588-clip:local src/rk3588_clip

Entrées et sorties

Entrée : une image et des invites candidates, ou jusqu’à 32 images et une requête textuelle. Sortie : scores de similarité normalisés et résultats classés.