add cats
Gitea Actions Demo / build_and_push (push) Failing after 1m19s Details

This commit is contained in:
artem 2025-04-21 21:58:21 +03:00
parent b8dc67edf7
commit bff80715b6
4 changed files with 91 additions and 9 deletions

View File

@ -35,11 +35,16 @@ def load_model(model_path, device="cpu"):
with open("server/meta/images.json", "r") as f:
IMAGES = json.loads(f.read())
MODEL = load_model("server/models/dogs_model.pth")
DOG_MODEL = load_model("server/models/dogs_model.pth")
CAT_MODEL = load_model("server/models/cats_model.pth")
with open("server/meta/labels_dogs.json", "r") as f:
data_labels = f.read()
labels_dict = json.loads(data_labels)
labels_dogs = json.loads(data_labels)
with open("server/meta/labels_cats.json", "r") as f:
data_labels = f.read()
labels_cats = json.loads(data_labels)
def predict_image(image, model, device="cuda") -> list[tuple]:
@ -71,18 +76,18 @@ class BeerdsController(Controller):
path = "/beerds"
@post("/dogs")
async def beerds(
async def beerds_dogs(
self, data: UploadFile = Body(media_type=RequestEncodingType.MULTI_PART)
) -> dict:
body = await data.read()
img_file = Image.open(io.BytesIO(body))
predicted_data = predict_image(img_file, MODEL, "cpu")
predicted_data = predict_image(img_file, DOG_MODEL, "cpu")
results = {}
images = []
for d in predicted_data:
predicted_idx, probabilities = d
predicted_label = labels_dict[str(predicted_idx)]
predicted_label = labels_dogs[str(predicted_idx)]
name = predicted_label.replace("_", " ")
images.append({"name": name, "url": IMAGES[name]})
results[float(probabilities[0])] = name
@ -91,6 +96,24 @@ class BeerdsController(Controller):
"images": images,
}
@post("/cats")
async def beerds_cats(
self, data: UploadFile = Body(media_type=RequestEncodingType.MULTI_PART)
) -> dict:
body = await data.read()
img_file = Image.open(io.BytesIO(body))
predicted_data = predict_image(img_file, CAT_MODEL, "cpu")
results = {}
for d in predicted_data:
predicted_idx, probabilities = d
predicted_label = labels_cats[str(predicted_idx)]
results[float(probabilities[0])] = predicted_label
return {
"results": results,
"images": [],
}
class BaseController(Controller):
path = "/"
@ -98,6 +121,10 @@ class BaseController(Controller):
@get("/")
async def main(self) -> Template:
return Template(name="index.html")
@get("/cats")
async def cats(self) -> Template:
return Template(name="cats.html")
@get("/sitemap.xml", media_type=MediaType.XML)
async def sitemaps(self) -> bytes:
@ -112,7 +139,11 @@ class BaseController(Controller):
<url>
<loc>https://xn-----6kcp3cadbabfh8a0a.xn--p1ai/</loc>
<lastmod>2023-05-01T19:01:03+00:00</lastmod>
<lastmod>2025-04-21T19:01:03+00:00</lastmod>
</url>
<url>
<loc>https://xn-----6kcp3cadbabfh8a0a.xn--p1ai/cats</loc>
<lastmod>2025-04-21T19:01:03+00:00</lastmod>
</url>

View File

@ -1,13 +1,13 @@
let urlCreator = window.URL || window.webkitURL;
async function SavePhoto() {
async function SavePhoto(self) {
document.getElementById("result").innerHTML = "";
let photo = document.getElementById("file-input").files[0];
let formData = new FormData();
// TODO: пройтись по всем результатм - если совпадают дважды - поднять вверх
formData.append("f", photo);
let response = await fetch('/beerds/dogs', { method: "POST", body: formData });
let response = await fetch(self.action, { method: "POST", body: formData });
if (response.ok) {
let json = await response.json();
let text = "<h3 class='image-results'>Результаты</h3>";

View File

@ -0,0 +1,50 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="yandex-verification" content="2d4efced567f0f7f" />
<meta name="google-site-verification" content="gKPSnPZ1ULUF9amD0vw_JQqkS5GLqc937UxayaN_s-I" />
<meta name="description" content="Опередление породы собаки по фото. Определение породы происходит при помощи нейронной сети - точность опеределения составляет 60%." />
<link rel="icon" type="image/x-icon" href="static/favicon.ico">
<title>Определение породы кошки по фото</title>
<link rel="stylesheet" href="static/styles.css">
<!-- Yandex.Metrika counter -->
<script type="text/javascript" >
(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
m[i].l=1*new Date();
for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }}
k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
ym(93420354, "init", {
clickmap:true,
trackLinks:true,
accurateTrackBounce:true
});
</script>
<noscript><div><img src="https://mc.yandex.ru/watch/93420354" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter -->
</head>
<body>
<section id="main">
<h1>Определить породу кошки по фото</h1>
<p>Узнать породу <a href = "/">Собаки</a></p>
<p>Загрузите фото, чтобы опеределить породу собаки или щенка. Если порода смешанная (или порода определена неточно), после загрузки будет показана вероятность породы животного.</p>
<p>Определение породы происходит при помощи нейронной сети - точность опеределения составляет 60%, сеть обучена на 65 породах. Если на фото будет неизвестная порода или не кошка - сеть не сможет правильно опеределить, что это.</p>
<p>Для распознования все фото отправляются на сервер, но там не сохраняются</p>
<form enctype="multipart/form-data" method="post" action="/beerds/cats" onsubmit="SavePhoto(this);return false">
<p><input type="file" name="f" id="file-input">
<input type="submit" value="Определить"></p>
</form>
<div>
<div id="upload-image">
<div id="upload-image-text"></div>
<img id="image" style="max-width: 200px;"/>
</div>
<div id="result"></div>
</div>
</body>
</section>
<script src="static/scripts.js"></script>
</html>

View File

@ -28,10 +28,11 @@
<body>
<section id="main">
<h1>Определить породу собаки по фото</h1>
<p>Узнать породу <a href = "/cats">Кошки</a></p>
<p>Загрузите фото, чтобы опеределить породу собаки или щенка. Если порода смешанная (или порода определена неточно), после загрузки будет показана вероятность породы животного.</p>
<p>Определение породы происходит при помощи нейронной сети - точность опеределения составляет 60%, сеть обучена на <a href="https://vk.com/albums-220240483" target="_blank">125 породах</a>. Если на фото будет неизвестная порода или не собака - сеть не сможет правильно опеределить, что это.</p>
<p>Для распознования все фото отправляются на сервер, но там не сохраняются</p>
<form enctype="multipart/form-data" method="post" action="/beerds/dogs" onsubmit="SavePhoto();return false">
<form enctype="multipart/form-data" method="post" action="/beerds/dogs" onsubmit="SavePhoto(this);return false">
<p><input type="file" name="f" id="file-input">
<input type="submit" value="Определить"></p>
</form>