Spaces:
Running
Running
File size: 5,084 Bytes
c57c848 18e11fc c57c848 328a8f1 18e11fc c57c848 da1ebea 5b36832 c57c848 da1ebea 18e11fc c57c848 18e11fc fcf78e8 0fd14a7 c57c848 1b8504d db8f51d 1b8504d 9be0260 78cde11 0fd14a7 328a8f1 cd3b61f 0fd14a7 c57c848 da1ebea 911b4eb db8f51d 18e11fc c57c848 5e5a50a 899a753 da1ebea fcf78e8 5b36832 020ecdf 5b36832 fcf78e8 899a753 da1ebea 5e5a50a fcf78e8 c57c848 020ecdf c57c848 fa66b44 c57c848 b5eddd2 fcf78e8 b5eddd2 c57c848 db8f51d c57c848 328a8f1 db8f51d da1ebea 4990a06 c57c848 da1ebea c57c848 db8f51d c57c848 cd3b61f da1ebea c57c848 911b4eb cd3b61f 911b4eb c57c848 911b4eb |
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 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
import gradio as gr
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
model_path = "modernbert.bin"
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
tokenizer = AutoTokenizer.from_pretrained("answerdotai/ModernBERT-base")
model = AutoModelForSequenceClassification.from_pretrained("answerdotai/ModernBERT-base", num_labels=41)
model.load_state_dict(torch.load(model_path, map_location=device))
model.to(device)
model.eval()
label_mapping = {
0: '13B', 1: '30B', 2: '65B', 3: '7B', 4: 'GLM130B', 5: 'bloom_7b',
6: 'bloomz', 7: 'cohere', 8: 'davinci', 9: 'dolly', 10: 'dolly-v2-12b',
11: 'flan_t5_base', 12: 'flan_t5_large', 13: 'flan_t5_small',
14: 'flan_t5_xl', 15: 'flan_t5_xxl', 16: 'gemma-7b-it', 17: 'gemma2-9b-it',
18: 'gpt-3.5-turbo', 19: 'gpt-35', 20: 'gpt4', 21: 'gpt4o',
22: 'gpt_j', 23: 'gpt_neox', 24: 'human', 25: 'llama3-70b', 26: 'llama3-8b',
27: 'mixtral-8x7b', 28: 'opt_1.3b', 29: 'opt_125m', 30: 'opt_13b',
31: 'opt_2.7b', 32: 'opt_30b', 33: 'opt_350m', 34: 'opt_6.7b',
35: 'opt_iml_30b', 36: 'opt_iml_max_1.3b', 37: 't0_11b', 38: 't0_3b',
39: 'text-davinci-002', 40: 'text-davinci-003'
}
def classify_text(text):
inputs = tokenizer(text, return_tensors="pt", truncation=True)
inputs = {key: value.to(device) for key, value in inputs.items()}
with torch.no_grad():
outputs = model(**inputs)
probabilities = torch.softmax(outputs.logits, dim=1)[0]
predicted_class = torch.argmax(probabilities).item()
confidence = probabilities[predicted_class].item() * 100
if predicted_class == 24:
prediction_label = f"✅ - The text is <span class='highlight-human'>**{confidence:.2f}%** likely <b>Human written</b>.</span>"
model_info = ""
else:
prediction_label = f"🤖 - The text is <span class='highlight-ai'>**{confidence:.2f}%** likely <b>AI generated</b>.</span>"
model_info = f"**Identified AI Model:** {label_mapping[predicted_class]}"
result_message = f"**Result:**\n\n{prediction_label}"
if model_info:
result_message += f"\n\n{model_info}"
return result_message
title = "Detect AI Generated Texts!"
description = """
---
Detect AI-generated texts with precision using the new **ModernBERT** model, fine-tuned for machine-generated text detection which capable of identifying 40 different models.
- 🤖 - **Identify AI Models:** Reveals which LLM generated the text if detected as AI.
- ✅ - **Human Verification:** Marks human-written text with a green checkmark.
**Note:** The longer the text, the better the detection accuracy.
---
"""
bottom_text = "**AI detection tool by SzegedAI**"
iface = gr.Blocks(css="""
@import url('https://fonts.googleapis.com/css2?family=Roboto+Mono:wght@400;700&display=swap');
#text_input_box {
border-radius: 10px;
border: 2px solid #4CAF50;
font-size: 18px;
padding: 15px;
margin-bottom: 20px;
width: 60%;
box-sizing: border-box;
margin: auto;
}
#result_output_box {
border-radius: 10px;
border: 2px solid #4CAF50;
font-size: 18px;
padding: 15px;
margin-top: 20px;
width: 40%;
box-sizing: border-box;
text-align: center;
margin: auto;
}
.form.svelte-633qhp {
background: none;
border: none;
box-shadow: none;
}
body {
font-family: 'Roboto Mono', sans-serif;
padding: 20px;
display: block;
justify-content: center;
align-items: center;
height: 100vh;
overflow-y: auto;
}
.gradio-container {
border: 1px solid #4CAF50;
border-radius: 15px;
padding: 30px;
box-shadow: 0px 0px 10px rgba(0,255,0,0.6);
max-width: 600px;
margin: auto;
overflow-y: auto;
}
h1 {
text-align: center;
font-size: 28px;
font-weight: bold;
margin-bottom: 30px;
}
h2 {
text-align: left;
font-size: 28px;
}
.highlight-human {
color: #4CAF50;
font-weight: bold;
background: rgba(76, 175, 80, 0.2);
padding: 5px;
border-radius: 8px;
}
.highlight-ai {
color: #FF5733;
font-weight: bold;
background: rgba(255, 87, 51, 0.2);
padding: 5px;
border-radius: 8px;
}
#bottom_text {
text-align: center;
margin-top: 50px;
font-weight: bold;
font-size: 20px;
}
""")
with iface:
gr.Markdown(f"# {title}")
gr.Markdown(description)
text_input = gr.Textbox(label="", placeholder="Type or paste your content here...", elem_id="text_input_box", lines=5)
result_output = gr.Markdown("**Results will appear here...**", elem_id="result_output_box")
text_input.change(classify_text, inputs=text_input, outputs=result_output)
gr.Markdown(bottom_text, elem_id="bottom_text")
iface.launch(share=True)
|