File size: 3,085 Bytes
b4b645c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import os
import pandas as pd
from PIL import Image, UnidentifiedImageError
import torch
from torchvision import transforms
from transformers import AutoProcessor, FocalNetForImageClassification
import pyarrow as pa
import pyarrow.parquet as pq

# 画像フォルダとモデルのパスを指定
image_folder = "scraped_images"  # 画像フォルダのパス
model_path = "MichalMlodawski/nsfw-image-detection-large"  # NSFWモデルのパス

# サブフォルダを含めてjpgファイルを再帰的に取得
jpg_files = []
for root, dirs, files in os.walk(image_folder):
    for file in files:
        if file.lower().endswith(".jpg"):
            jpg_files.append(os.path.join(root, file))

# jpgファイルが存在するか確認
if not jpg_files:
    print("No jpg files found in folder:", image_folder)
    exit()

# モデルとプロセッサの読み込み
feature_extractor = AutoProcessor.from_pretrained(model_path)
model = FocalNetForImageClassification.from_pretrained(model_path)
model.eval()

# 画像の変換処理
transform = transforms.Compose([
    transforms.Resize((512, 512)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])

# ラベルとNSFWカテゴリのマッピング
label_to_category = {
    "LABEL_0": "Safe",
    "LABEL_1": "Questionable",
    "LABEL_2": "Unsafe"
}

# 結果を保存するためのリスト
results = []

# ログファイルを作成(破損画像ファイルを記録)
error_log = "error_log.txt"

# 各画像に対して分類処理を行い、結果を取得
for jpg_file in jpg_files:
    try:
        # 画像を開く
        image = Image.open(jpg_file).convert("RGB")
    except UnidentifiedImageError:
        # 画像を識別できない場合のエラーハンドリング
        with open(error_log, "a", encoding="utf-8") as log_file:
            log_file.write(f"Unidentified image file: {jpg_file}. Skipping...\n")
        print(f"Unidentified image file: {jpg_file}. Skipping...")
        continue
    
    image_tensor = transform(image).unsqueeze(0)
    
    # モデルでの推論
    inputs = feature_extractor(images=image, return_tensors="pt")
    with torch.no_grad():
        outputs = model(**inputs)
        probabilities = torch.nn.functional.softmax(outputs.logits, dim=-1)
        confidence, predicted = torch.max(probabilities, 1)
    
    # ラベルを取得
    label = model.config.id2label[predicted.item()]
    category = label_to_category.get(label, "Unknown")

    # 結果をリストに追加
    results.append({
        "file_path": jpg_file,
        "label": label,
        "category": category,
        "confidence": confidence.item() * 100
    })

# 結果をDataFrameに変換
df = pd.DataFrame(results)

# Parquet形式で保存
parquet_file = "nsfw_classification_results.parquet"
table = pa.Table.from_pandas(df)
pq.write_table(table, parquet_file)

print(f"Classification completed and saved to {parquet_file}!")