Rename debug to train

This commit is contained in:
Nicolas Mowen 2025-01-02 10:09:03 -07:00
parent b3072087d4
commit 0e4be95e56
2 changed files with 46 additions and 30 deletions

View File

@ -517,7 +517,7 @@ class EmbeddingMaintainer(threading.Thread):
if self.config.face_recognition.save_attempts: if self.config.face_recognition.save_attempts:
# write face to library # write face to library
folder = os.path.join(FACE_DIR, "debug") folder = os.path.join(FACE_DIR, "train")
file = os.path.join(folder, f"{id}-{sub_label}-{score}-{face_score}.webp") file = os.path.join(folder, f"{id}-{sub_label}-{score}-{face_score}.webp")
os.makedirs(folder, exist_ok=True) os.makedirs(folder, exist_ok=True)
cv2.imwrite(file, face_frame) cv2.imwrite(file, face_frame)

View File

@ -5,6 +5,12 @@ import { Button } from "@/components/ui/button";
import { ScrollArea, ScrollBar } from "@/components/ui/scroll-area"; import { ScrollArea, ScrollBar } from "@/components/ui/scroll-area";
import { Toaster } from "@/components/ui/sonner"; import { Toaster } from "@/components/ui/sonner";
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"; import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group";
import {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
} from "@/components/ui/tooltip";
import useOptimisticState from "@/hooks/use-optimistic-state"; import useOptimisticState from "@/hooks/use-optimistic-state";
import axios from "axios"; import axios from "axios";
import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { useCallback, useEffect, useMemo, useRef, useState } from "react";
@ -24,7 +30,7 @@ export default function FaceLibrary() {
const faces = useMemo<string[]>( const faces = useMemo<string[]>(
() => () =>
faceData ? Object.keys(faceData).filter((face) => face != "debug") : [], faceData ? Object.keys(faceData).filter((face) => face != "train") : [],
[faceData], [faceData],
); );
const faceImages = useMemo<string[]>( const faceImages = useMemo<string[]>(
@ -32,24 +38,24 @@ export default function FaceLibrary() {
[pageToggle, faceData], [pageToggle, faceData],
); );
const faceAttempts = useMemo<string[]>( const trainImages = useMemo<string[]>(
() => faceData?.["debug"] || [], () => faceData?.["train"] || [],
[faceData], [faceData],
); );
useEffect(() => { useEffect(() => {
if (!pageToggle) { if (!pageToggle) {
if (faceAttempts.length > 0) { if (trainImages.length > 0) {
setPageToggle("attempts"); setPageToggle("train");
} else if (faces) { } else if (faces) {
setPageToggle(faces[0]); setPageToggle(faces[0]);
} }
} else if (pageToggle == "attempts" && faceAttempts.length == 0) { } else if (pageToggle == "train" && trainImages.length == 0) {
setPageToggle(faces[0]); setPageToggle(faces[0]);
} }
// we need to listen on the value of the faces list // we need to listen on the value of the faces list
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [faceAttempts, faces]); }, [trainImages, faces]);
// upload // upload
@ -117,7 +123,7 @@ export default function FaceLibrary() {
} }
}} }}
> >
{faceAttempts.length > 0 && ( {trainImages.length > 0 && (
<> <>
<ToggleGroupItem <ToggleGroupItem
value="attempts" value="attempts"
@ -149,7 +155,7 @@ export default function FaceLibrary() {
</div> </div>
{pageToggle && {pageToggle &&
(pageToggle == "attempts" ? ( (pageToggle == "attempts" ? (
<AttemptsGrid attemptImages={faceAttempts} onRefresh={refreshFaces} /> <TrainingGrid attemptImages={trainImages} onRefresh={refreshFaces} />
) : ( ) : (
<FaceGrid <FaceGrid
faceImages={faceImages} faceImages={faceImages}
@ -162,11 +168,11 @@ export default function FaceLibrary() {
); );
} }
type AttemptsGridProps = { type TrainingGridProps = {
attemptImages: string[]; attemptImages: string[];
onRefresh: () => void; onRefresh: () => void;
}; };
function AttemptsGrid({ attemptImages, onRefresh }: AttemptsGridProps) { function TrainingGrid({ attemptImages, onRefresh }: TrainingGridProps) {
return ( return (
<div className="scrollbar-container flex flex-wrap gap-2 overflow-y-scroll"> <div className="scrollbar-container flex flex-wrap gap-2 overflow-y-scroll">
{attemptImages.map((image: string) => ( {attemptImages.map((image: string) => (
@ -195,7 +201,7 @@ function FaceAttempt({ image, onRefresh }: FaceAttemptProps) {
const onDelete = useCallback(() => { const onDelete = useCallback(() => {
axios axios
.post(`/faces/debug/delete`, { ids: [image] }) .post(`/faces/train/delete`, { ids: [image] })
.then((resp) => { .then((resp) => {
if (resp.status == 200) { if (resp.status == 200) {
toast.success(`Successfully deleted face.`, { toast.success(`Successfully deleted face.`, {
@ -225,19 +231,24 @@ function FaceAttempt({ image, onRefresh }: FaceAttemptProps) {
onClick={isDesktop ? undefined : () => setHovered(!hovered)} onClick={isDesktop ? undefined : () => setHovered(!hovered)}
> >
{hovered && ( {hovered && (
<Tooltip>
<div className="absolute right-1 top-1"> <div className="absolute right-1 top-1">
<TooltipTrigger>
<Chip <Chip
className="cursor-pointer rounded-md bg-gray-500 bg-gradient-to-br from-gray-400 to-gray-500" className="cursor-pointer rounded-md bg-gray-500 bg-gradient-to-br from-gray-400 to-gray-500"
onClick={() => onDelete()} onClick={() => onDelete()}
> >
<LuTrash className="size-4 fill-destructive text-destructive" /> <LuTrash className="size-4 fill-destructive text-destructive" />
</Chip> </Chip>
</TooltipTrigger>
<TooltipContent>Delete Face Attempt</TooltipContent>
</div> </div>
</Tooltip>
)} )}
<div className="rounded-md bg-secondary"> <div className="rounded-md bg-secondary">
<img <img
className="h-40 rounded-md" className="h-40 rounded-md"
src={`${baseUrl}clips/faces/debug/${image}`} src={`${baseUrl}clips/faces/train/${image}`}
/> />
<div className="p-2">{`${data.name}: ${data.score}`}</div> <div className="p-2">{`${data.name}: ${data.score}`}</div>
</div> </div>
@ -314,14 +325,19 @@ function FaceImage({ name, image, onRefresh }: FaceImageProps) {
onClick={isDesktop ? undefined : () => setHovered(!hovered)} onClick={isDesktop ? undefined : () => setHovered(!hovered)}
> >
{hovered && ( {hovered && (
<Tooltip>
<div className="absolute right-1 top-1"> <div className="absolute right-1 top-1">
<TooltipTrigger>
<Chip <Chip
className="cursor-pointer rounded-md bg-gray-500 bg-gradient-to-br from-gray-400 to-gray-500" className="cursor-pointer rounded-md bg-gray-500 bg-gradient-to-br from-gray-400 to-gray-500"
onClick={() => onDelete()} onClick={() => onDelete()}
> >
<LuTrash className="size-4 fill-destructive text-destructive" /> <LuTrash className="size-4 fill-destructive text-destructive" />
</Chip> </Chip>
</TooltipTrigger>
<TooltipContent>Delete Face</TooltipContent>
</div> </div>
</Tooltip>
)} )}
<img <img
className="h-40 rounded-md" className="h-40 rounded-md"