CLIP
CLIP은 고정된 레이블 집합 대신 이미지와 텍스트 프롬프트의 점수를 비교하는 이중 타워 모델입니다. LibreYOLO는 학습 단계 없이 제로샷 분류와 이미지/텍스트 임베딩을 지원합니다.
- 작업
- classify, embed
- 크기
- 설치
pip install libreyolo- 지원 티어
- 별도 티어, v부터 지원. 자체 팩토리와 계약을 갖춘 별도의 제품 영역입니다.
- 라이선스
- 코드 MIT, 가중치 MIT. 상업적 사용
설치
CLIP에는 전용 extra가 필요합니다. 이 extra는 벤더링된 BPE 토크나이저가 정확한 토큰 ID를 재현하는 데 사용하는 패키지를 설치합니다.
pip install "libreyolo[clip]"예측
처음 사용할 때 Hugging Face에서 가중치를 다운로드해 로컬에 캐시합니다.
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreCLIPb32-cls.pt")model.set_classes(["a forklift", "an empty aisle", "a spill"])result = model(SAMPLE_IMAGE, save=True) print(model.names[result.probs.top1], float(result.probs.top1conf))# set_classes()를 호출하지 않으면 CLI predict는 모델이 기본으로 불러오는# ImageNet 클래스 이름 1,000개를 사용합니다.libreyolo predict model=LibreCLIPb32-cls.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=Truefrom libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreCLIPb32-cls.pt", task="embed")image_embed = model(SAMPLE_IMAGE).embeddings.datatext_embed = model.embed_text("a photo of a forklift") # 둘 다 L2 정규화되므로 일반 내적이 코사인 유사도입니다.similarity = (image_embed @ text_embed.T).item()set_classes()는 이 모델을 오픈 보캐뷸러리 분류기로 만드는 핵심 기능입니다. 각 레이블을 모든 프롬프트 템플릿으로 렌더링하고 결과를 인코딩해 평균한 뒤 생성된 [K, D] 행렬을 분류기 헤드로 캐시하므로 이미지마다 다시 계산하지 않습니다. 언제든 다시 호출해 클래스를 바꿀 수 있습니다. 호출하지 않으면 LibreCLIP은 ImageNet-1k 클래스 이름 1,000개가 이미 설정된 상태로 불러옵니다.
task="embed"를 사용하면 예측이 클래스 확률 대신 입력마다 L2 정규화된 이미지 벡터 하나를 반환합니다. embed_text()는 같은 벡터 공간에서 정규화된 텍스트 행을 반환하므로 둘 사이의 일반 내적이 코사인 유사도입니다. 두 작업 모두 NMS 단계가 없으므로 iou는 영향을 주지 않습니다. 소스, 스트리밍, 결과 처리는 예측을 참조합니다.
검증
val()은 ImageFolder train/ 분할 아래의 클래스 폴더 이름을 읽고 이를 사용해 set_classes()를 호출한 다음 제로샷 top-1 및 top-5 정확도를 측정합니다. 가중치 업데이트가 전혀 없으므로 정확도는 클래스 이름이 프롬프트로 어떻게 해석되는지에 따라 달라집니다. 검증은 task="classify"만 지원하며 task="embed"에는 데이터셋 검증기가 없습니다.
from libreyolo import LibreYOLO model = LibreYOLO("LibreCLIPb32-cls.pt") # data는 train/ 분할이 있는 ImageFolder 루트입니다. 폴더 이름이# 이번 실행의 제로샷 클래스 프롬프트가 됩니다.metrics = model.val(data="imagenette160") print(metrics["metrics/accuracy_top1"])print(metrics["metrics/accuracy_top5"])libreyolo val model=LibreCLIPb32-cls.pt data=imagenette160내보내기
| 작업 | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| classify | classify to ONNX: 지원함 | classify to TorchScript: 지원함 | classify to ExecuTorch: 지원함 | classify to TensorRT: 지원함 | classify to OpenVINO: 지원함 | classify to Paddle: 지원하지 않음 | classify to MNN: 지원하지 않음 | classify to RKNN: 지원하지 않음 | classify to ncnn: 지원하지 않음 | classify to TFLite: 지원하지 않음 | classify to CoreML: 지원하지 않음 | classify to Core AI: 지원함 |
| embed | embed to ONNX: 지원함 | embed to TorchScript: 지원함 | embed to ExecuTorch: 지원함 | embed to TensorRT: 지원함 | embed to OpenVINO: 지원함 | embed to Paddle: 지원하지 않음 | embed to MNN: 지원하지 않음 | embed to RKNN: 지원하지 않음 | embed to ncnn: 지원하지 않음 | embed to TFLite: 지원하지 않음 | embed to CoreML: 지원하지 않음 | embed to Core AI: 지원하지 않음 |
내보내기는 모델의 현재 상태를 고정 그래프에 넣습니다. task="classify"의 경우 set_classes()가 마지막으로 설정한 레이블과 내보낼 때의 해상도가 최종 선형 계층에 고정됩니다. 따라서 내보낸 ONNX 또는 TensorRT 그래프는 텍스트 타워와 토크나이저가 없는 일반 [B, K] 이미지 분류기이며 클래스나 크기를 바꾸면 다시 내보내야 합니다. task="embed" 내보내기는 이미지 타워만 추적합니다. 둘 다 ONNX opset 14 이상이 필요하며 내보내기가 기본으로 이를 설정합니다.
from libreyolo import LibreYOLO model = LibreYOLO("LibreCLIPb32-cls.pt")model.set_classes(["a forklift", "an empty aisle", "a spill"])model.export(format="onnx") # 현재 set_classes() 레이블과 입력 해상도가 그래프에 고정됩니다.# 둘 중 하나라도 바꾼 뒤에는 다시 내보냅니다.# 여기서는 set_classes()를 호출하지 않으므로 모델이 불러온 기본# ImageNet 클래스 1,000개가 고정됩니다.libreyolo export model=LibreCLIPb32-cls.pt format=onnxfrom libreyolo import LibreYOLO # task="embed"는 이미지 타워만 추적하므로 클래스가 필요하지 않습니다.model = LibreYOLO("LibreCLIPb32-cls.pt", task="embed")model.export(format="onnx")체크포인트
이 계열에 공개된 모든 가중치 파일입니다. 두 체크포인트는 모두 COCO 학습 결과가 아니라 OpenCLIP의 LAION-2B 학습 체크포인트(ViT-B-32, ViT-B-16)를 변환한 것입니다.
| 파일 | 입력(px) | 가중치 라이선스 |
|---|---|---|
| classify | ||
| LibreCLIPb32-cls.pt | mit | |
| LibreCLIPb16-cls.pt | mit | |
위의 모든 파일은 현재 LibreYOLO 조직에 있으며 처음 사용할 때 내려받습니다.
LAION-2B 학습 데이터에는 CSAM 콘텐츠가 포함되었다는 기록이 있습니다(Stanford Internet Observatory, 2023년 12월). LAION은 이후 정제하여 다시 공개한 Re-LAION을 출시했습니다. 이러한 가중치를 다시 호스팅한다면 가능한 경우 Re-LAION 파생 체크포인트를 우선 사용합니다.
라이선스
내려받는 특정 가중치의 Hugging Face 저장소에서 라이선스를 확인하십시오. LibreYOLO 조직의 모든 체크포인트에는 라이선스가 있으며 한 계열 안에서도 항상 같지는 않습니다. 해당 저장소가 신뢰할 수 있는 기준입니다. 아래 요약은 이 페이지를 마지막으로 검증했을 때 적용된 내용을 설명합니다.
관련 라이선스에 관한 설명이며 법률 자문이 아닙니다. 상업적으로 중요한 사안이라면 라이선스를 직접 읽고 별도의 법률 자문을 받으십시오.
- 원작
- CLIP / OpenCLIP, OpenAI; LAION / ML Foundations
- 업스트림 라이선스
- MIT
- LibreYOLO 코드
- MIT
- 가중치
- MIT, huggingface.co/LibreYOLO에 다시 게시됨
- 해석
- MIT is a permissive license, so these weights can be used in commercial and closed-source products. It asks you to keep the license text and copyright notice with any copy you redistribute, and it places no obligation on your own application code. LibreCLIP's tokenizer is vendored from the OpenAI CLIP / OpenCLIP byte-pair-encoding tokenizer (also MIT); its image and text towers are a clean-room re-implementation of the standard CLIP architecture, built without open_clip as a runtime dependency. The shipped checkpoints (b32, b16) are converted from OpenCLIP's LAION-2B-trained weights, which OpenCLIP publishes as MIT-redistributable. Training is not offered for this family: LibreCLIP is zero-shot, and set_classes() replaces the fine-tuning step a trained classifier would otherwise need.
인용
@software{ilharco_gabriel_2021_5143773,
author = {Ilharco, Gabriel and
Wortsman, Mitchell and
Wightman, Ross and
Gordon, Cade and
Carlini, Nicholas and
Taori, Rohan and
Dave, Achal and
Shankar, Vaishaal and
Namkoong, Hongseok and
Miller, John and
Hajishirzi, Hannaneh and
Farhadi, Ali and
Schmidt, Ludwig},
title = {OpenCLIP},
month = jul,
year = 2021,
note = {If you use this software, please cite it as below.},
publisher = {Zenodo},
version = {0.1},
doi = {10.5281/zenodo.5143773},
url = {https://doi.org/10.5281/zenodo.5143773}
}github.com/mlfoundations/open_clip#citing에 있는 저자의 인용 블록에서 복사했습니다.