Compare commits
2
Commits
8f2834775b
...
e443191833
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e443191833 | ||
|
|
589b775cda |
+10
-6
@@ -6,13 +6,15 @@ use JSON;
|
|||||||
use Data::Dumper;
|
use Data::Dumper;
|
||||||
|
|
||||||
my $seconds = $ENV{'SECONDS_PER_FRAME'} || 30;
|
my $seconds = $ENV{'SECONDS_PER_FRAME'} || 30;
|
||||||
my $ollama = $ENV{'OLLAMA_URL'} || die "OLLAMA_URL environment variable not set\n";
|
my $ollama = $ENV{'OLLAMA_URL'} || 'http://10.0.1.7:11434';
|
||||||
my $api = $ENV{'API_BASE_URL'} || die "API_BASE_URL environment variable not set\n";
|
my $api = $ENV{'API_BASE_URL'} || 'http://10.0.1.7:3000';
|
||||||
my $task_count = $ENV{'TASK_COUNT'} || 1;
|
my $task_count = $ENV{'TASK_COUNT'} || 1;
|
||||||
my $sensitivity = 20;
|
my $sensitivity = 20;
|
||||||
my $resolution = "672:672";
|
my $resolution = "672:672";
|
||||||
|
my $model = "hf.co/Jommarn/UNSEEN_Gemma_4_26B_NSFW-GGUF:Q8_0";
|
||||||
|
|
||||||
chdir("/tmp") || die "Unable to change directory to /tmp: $!\n";
|
chdir("/tmp") || die "Unable to change directory to /tmp: $!\n";
|
||||||
|
|
||||||
my $ua = LWP::UserAgent->new;
|
my $ua = LWP::UserAgent->new;
|
||||||
$ua->timeout(60);
|
$ua->timeout(60);
|
||||||
|
|
||||||
@@ -56,16 +58,16 @@ sub CheckPath {
|
|||||||
$data=undef;
|
$data=undef;
|
||||||
|
|
||||||
my $ref = {
|
my $ref = {
|
||||||
'model' => 'srizon/pixie:latest',
|
'model' => $model,
|
||||||
'prompt' => "Are there any african american people in this photo, whether they are shown completely or not? Please answer 'yes' or 'no' only.",
|
'prompt' => "Are there any african american men in this photo, whether they are shown completely or not? Judge based on skin tone, accounting for shadows. Answer yes for very dark skin.Please answer 'yes' or 'no' only.",
|
||||||
'images' => [$base64],
|
'images' => [$base64],
|
||||||
};
|
};
|
||||||
|
|
||||||
my $url = "$ollama/api/generate";
|
my $url = "$ollama/api/generate";
|
||||||
my $res = GetRest($url, $ref);
|
my $res = GetRest($url, $ref);
|
||||||
print "\t$res\n";
|
print "$file\t$res\n";
|
||||||
$total++;
|
$total++;
|
||||||
if($res=~/yes/i) {
|
if($res=~/yes$/i) {
|
||||||
$yes++;
|
$yes++;
|
||||||
}
|
}
|
||||||
unlink($file);
|
unlink($file);
|
||||||
@@ -91,6 +93,8 @@ sub CheckPath {
|
|||||||
'yes' => $yes,
|
'yes' => $yes,
|
||||||
'percentage'=> $percentage,
|
'percentage'=> $percentage,
|
||||||
'verdict' => $verdict,
|
'verdict' => $verdict,
|
||||||
|
'model' => $model,
|
||||||
|
'path' => $path,
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -214,6 +214,10 @@ def index():
|
|||||||
@app.route("/review/<int:task_id>")
|
@app.route("/review/<int:task_id>")
|
||||||
def review_task(task_id):
|
def review_task(task_id):
|
||||||
"""Detail view: show task info + embedded video player."""
|
"""Detail view: show task info + embedded video player."""
|
||||||
|
return_page = request.args.get("page", 1, type=int) or 1
|
||||||
|
return_page = max(return_page, 1)
|
||||||
|
return_queue_url = "/" if return_page == 1 else f"/?page={return_page}"
|
||||||
|
|
||||||
try:
|
try:
|
||||||
data = api_get(f"task/{task_id}")
|
data = api_get(f"task/{task_id}")
|
||||||
if not data or not data.get("id"):
|
if not data or not data.get("id"):
|
||||||
@@ -240,7 +244,11 @@ def review_task(task_id):
|
|||||||
except (json.JSONDecodeError, TypeError):
|
except (json.JSONDecodeError, TypeError):
|
||||||
video_obj["prev_results"] = {}
|
video_obj["prev_results"] = {}
|
||||||
|
|
||||||
return render_template_string(_REVIEW_TEMPLATE, video=video_obj)
|
return render_template_string(
|
||||||
|
_REVIEW_TEMPLATE,
|
||||||
|
video=video_obj,
|
||||||
|
return_queue_url=return_queue_url,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
@@ -411,7 +419,7 @@ _INDEX_TEMPLATE = """
|
|||||||
<td><span class="badge">{{ t.task_type }}</span></td>
|
<td><span class="badge">{{ t.task_type }}</span></td>
|
||||||
<td>{{ t.status }}</td>
|
<td>{{ t.status }}</td>
|
||||||
<td>{{ t.created_at|string|truncate(19, True, '') if t.created_at else '—' }}</td>
|
<td>{{ t.created_at|string|truncate(19, True, '') if t.created_at else '—' }}</td>
|
||||||
<td><a href="/review/{{ t.id }}" class="btn">Review</a></td>
|
<td><a href="{{ url_for('review_task', task_id=t.id, page=page) }}" class="btn">Review</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
@@ -464,7 +472,7 @@ _REVIEW_TEMPLATE = """
|
|||||||
<div id="flash"></div>
|
<div id="flash"></div>
|
||||||
<div class="header">
|
<div class="header">
|
||||||
<h1>VideoDetect</h1>
|
<h1>VideoDetect</h1>
|
||||||
<a href="/">« Back to queue</a>
|
<a href="{{ return_queue_url }}">« Back to queue</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
{% if video.prev_results and video.prev_results.review_verdict %}
|
{% if video.prev_results and video.prev_results.review_verdict %}
|
||||||
@@ -505,6 +513,8 @@ _REVIEW_TEMPLATE = """
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
const returnQueueUrl = {{ return_queue_url|tojson }};
|
||||||
|
|
||||||
async function submitVerdict(verdict) {
|
async function submitVerdict(verdict) {
|
||||||
setActionButtonsDisabled(true);
|
setActionButtonsDisabled(true);
|
||||||
showFlash('Submitting verdict...', '#007bff');
|
showFlash('Submitting verdict...', '#007bff');
|
||||||
@@ -518,7 +528,7 @@ async function submitVerdict(verdict) {
|
|||||||
const body = await resp.json().catch(() => ({}));
|
const body = await resp.json().catch(() => ({}));
|
||||||
if (resp.ok) {
|
if (resp.ok) {
|
||||||
showFlash('Verdict submitted', '#28a745');
|
showFlash('Verdict submitted', '#28a745');
|
||||||
setTimeout(() => location.href = '/', 1000);
|
setTimeout(() => location.href = returnQueueUrl, 1000);
|
||||||
} else {
|
} else {
|
||||||
alert(body.error || 'Submission failed');
|
alert(body.error || 'Submission failed');
|
||||||
setActionButtonsDisabled(false);
|
setActionButtonsDisabled(false);
|
||||||
@@ -538,7 +548,7 @@ async function skipTask() {
|
|||||||
const resp = await fetch(`/api/review/skip/{{ video.id }}`, {method: 'POST'});
|
const resp = await fetch(`/api/review/skip/{{ video.id }}`, {method: 'POST'});
|
||||||
if (resp.ok) {
|
if (resp.ok) {
|
||||||
showFlash('Task skipped, returned to queue', '#6c757d');
|
showFlash('Task skipped, returned to queue', '#6c757d');
|
||||||
setTimeout(() => location.href = '/', 1000);
|
setTimeout(() => location.href = returnQueueUrl, 1000);
|
||||||
} else {
|
} else {
|
||||||
alert('Skip failed');
|
alert('Skip failed');
|
||||||
setActionButtonsDisabled(false);
|
setActionButtonsDisabled(false);
|
||||||
|
|||||||
Reference in New Issue
Block a user