當前位置: 妍妍網 > 碼農

JoyTag:罕見!開源影像標註工具!

2024-02-05碼農

計畫簡介

JoyTag是一個基於深度學習的影像標註工具,它可以自動辨識圖片中的內容並生成相關標簽。這個計畫利用先進的機器學習演算法,不僅提高了標記的準確性,還大振幅提升了處理速度,適用於大規模影像數據集的快速標註。JoyTag的開源特性允許開發者自由使用和修改程式碼,支持自訂訓練模型以適應特定的標註需求,使其在影像辨識和自動標註領域具有廣泛的套用前景。

掃碼加入交流群

獲得更多技術支持和交流

使用模型

from Models import VisionModelfrom PIL import Imageimport torch.amp.autocast_modefrom pathlib import Pathimport torchimport torchvision.transforms.functional as TVFpath = '/home/.../joytag/models' # Change this to where you downloaded the modelTHRESHOLD = 0.4model = 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 imageif 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, scoresimage = 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計畫落地 」公眾號