計畫簡介
JoyTag是一個基於深度學習的影像標註工具,它可以自動辨識圖片中的內容並生成相關標簽。這個計畫利用先進的機器學習演算法,不僅提高了標記的準確性,還大振幅提升了處理速度,適用於大規模影像數據集的快速標註。JoyTag的開源特性允許開發者自由使用和修改程式碼,支持自訂訓練模型以適應特定的標註需求,使其在影像辨識和自動標註領域具有廣泛的套用前景。
掃碼加入交流群
獲得更多技術支持和交流
使用模型
from Models import VisionModel
from PIL import Image
import torch.amp.autocast_mode
from pathlib import Path
import torch
import torchvision.transforms.functional as TVF
path = '/home/.../joytag/models' # Change this to where you downloaded the model
THRESHOLD = 0.4
model = VisionModel.load_model(path)
model.eval()
model = model.to('cuda')
with open(Path(path) / 'top_tags.txt', 'r') as f:
top_tags = [line.strip() for line in f.readlines() if line.strip()]
def prepare_image(image: Image.Image, target_size: int) -> torch.Tensor:
# Pad image to square
image_shape = image.size
max_dim = max(image_shape)
pad_left = (max_dim - image_shape[0]) // 2
pad_top = (max_dim - image_shape[1]) // 2
padded_image = Image.new('RGB', (max_dim, max_dim), (255, 255, 255))
padded_image.paste(image, (pad_left, pad_top))
# Resize image
if max_dim != target_size:
padded_image = padded_image.resize((target_size, target_size), Image.BICUBIC)
# Convert to tensor
image_tensor = TVF.pil_to_tensor(padded_image) / 255.0
# Normalize
image_tensor = TVF.normalize(image_tensor, mean=[0.48145466, 0.4578275, 0.40821073], std=[0.26862954, 0.26130258, 0.27577711])
return image_tensor
@torch.no_grad()
def predict(image: Image.Image):
image_tensor = prepare_image(image, model.image_size)
batch = {
'image': image_tensor.unsqueeze(0).to('cuda'),
}
with torch.amp.autocast_mode.autocast('cuda', enabled=True):
preds = model(batch)
tag_preds = preds['tags'].sigmoid().cpu()
scores = {top_tags[i]: tag_preds[0][i] for i in range(len(top_tags))}
predicted_tags = [tag for tag, score in scores.items() if score > THRESHOLD]
tag_string = ', '.join(predicted_tags)
return tag_string, scores
image = Image.open('test.jpg')
tag_string, scores = predict(image)
print(tag_string)
for tag, score in sorted(scores.items(), key=lambda x: x[1], reverse=True):
print(f'{tag}: {score:.3f}')
目標
大多數公共視覺模型在其訓練數據集中包含了大量的過濾工作。這意味著,今天的基礎視覺模型在許多概念上的基本層面上表現較弱。這限制了表達自由、包容性和多樣性。這也限制了機器學習模型對我們世界的基本理解及將來的理解能力。JoyTag團隊認為,人類使用者應該自由表達自己,不應該因為隨意和反復無常的內容過濾而受到歧視。
JoyTag團隊也相信,機器學習模型應該對世界有一個廣泛、深入和包容的理解。這並不排除在訓練後使用對齊技術來減少模型的偏見,但它確實排除了使用過濾或對齊,這些做法減少了模型理解世界的能力或使用者表達自己的能力。
開發手冊
模型目前主要受到數據的限制,如果超出當前的訓練方案或模型大小,就會發生過擬合。基於L/14@224的模型能夠訓練到F1得分為0.51之前就開始過擬合。對於H/14也是如此,即使增加了StochDepth,F1得分只有小幅改善然後過擬合。這是預期之中的,因為B/16@448的計算成本與L/14@224相似,但參數更少,因此似乎提供了一種在保持良好正則化的同時擴充套件模型的方法。
在我在220M和440M規模的測試中,MixUp和標簽平滑都沒有提供改進。Mixup提供了最多的正則化,但最終F1得分比沒有使用它時更低。當前的學習率、權重衰減和stochdepth率在220M範圍內基於掃描似乎接近最優。對於448訓練部份的設定沒有進行實驗,所以那裏可能有更優的學習率。
簡單增強比RandAugment和其他增強方案工作得更好,提供了對抗過擬合的最佳治療。可能其他增強方式能提供更多的正則化並允許更多的訓練。
當過擬合時,模型的F1傾向於繼續改善,而驗證損失下降。
在220M掃描中,焦點損失似乎與普通的BCE損失相比沒有顯著差異。按標簽頻率加權沒有改善結果。
穩定訓練必須使用損失乘數,可能是由於與典型BCE任務相比,標簽的數量和極端分布導致損失過低,以至於GradScaler無法考慮。簡單地將損失乘以128或256就足以穩定訓練。
AdamW也能工作,並且可以提供非常小的F1改進,但LAMB結果在訓練曲線更穩定,且不需要調整預熱計劃。
使用CNN主幹而不是ViTs的傳統打修補程式主幹,在B/16模型上大幅提升了F1。對L/14模型似乎幫助較小。更多的調查可能會有成果。
計畫連結
https://github.com/fpgaminer/joytag
關註「 開源AI計畫落地 」公眾號