Features¶
Everything ovkit can answer today: 19 composed capabilities, 68 models (36 curated), 44 Korean names — and what each one hands back.
pip install ovkit
Extras: ovkit[genai] (LLM/STT/VLM) · ovkit[hf] (Hugging Face conversion) ·
ovkit[train] (RT-DETR training) · ovkit[quant] (INT8) · ovkit[all].
One call in, one answer out¶
Choosing a model, downloading it, converting it, preprocessing, and decoding output tensors — one line does all of it.
from ovkit import Model
r = Model("detect", "image.jpg") # download -> convert -> cache -> run
print(r) # 2x person, car
r.save("out.jpg") # the boxes drawn on the photo
What it takes¶
The call is the same whatever you point it at. A photo gives one result, a
folder a list, a video or camera or microphone a stream. The table holds for
a model you keep, too — m = Model("detect") and then m("a.jpg") answers
exactly as Model("detect", "a.jpg") does.
Source |
Example |
You get |
|---|---|---|
image path |
|
one |
numpy array |
|
one |
folder |
|
a list of |
video |
|
a stream |
webcam |
|
a stream |
microphone |
|
a stream |
for r in Model("detect", "photos/"): # a whole folder
print(r.path, r)
for r in Model("track", 0): # webcam, as a stream
print(r, r.elapsed_ms, r.device) # 2x person (#1, #4) 14.2 GPU
if not r.show("track"): # a window; q ends the loop
break
What it hands back — Results¶
What |
|
|---|---|
|
2x person, car — one readable line |
|
per detection: |
|
draw and write. A background-removal result saves as a transparent PNG |
|
the picture with one wrapped caption that never overlaps |
|
just the i-th thing it found |
|
put it in a window; with no window support it saves frames and says why. |
|
straight to a file or a server |
|
the raw values, when you want numbers |
|
how long it took and where it ran |
On an AI PC that last pair is teaching material on its own — run the same photo on CPU and on NPU and read the two numbers.
Hold the model when you want the detail:
m = Model("detect", device="GPU")
m.predict("a.jpg", conf=0.4, imgsz=960)
m.infer(x) # raw output tensors
19 composed capabilities¶
Detect, crop, feed the crop to another model, stitch the answers together —
the part beginners get stuck on is what a capability name replaces. Same
sources, same Results as above.
|
Korean |
Answers |
Chains |
|---|---|---|---|
|
장면설명 |
2 people (1 happy) · a laptop and a cup · floor 47% |
detection + segmentation + faces |
|
얼굴분석 |
2 faces: age 31 · male 98% · happy 92% … |
face detection + age/gender + emotion |
|
사람분석 |
3 people: male 0.98 · long pants 0.95 · bag 0.71 … |
person detection + attributes |
|
차량분석 |
2 vehicles: car (0.98) · black (0.83) … |
vehicle detection + type/colour |
|
글자읽기 |
|
text detection + recognition |
|
번호판읽기 |
2 vehicles: black car — 12GA3456 … |
plate detection + recognition + attributes |
|
따라가기 |
2x person (#1, #4) — ids stable across frames |
detection + IoU association |
|
개수세기 |
pencil 3 · cup 1 (optionally one kind only) |
detection + per-kind tally |
|
졸음감지 |
EYES CLOSED 1.4s — drowsy |
face + landmarks + eye state + head pose, over time |
|
거북목알림 |
neck 32° — sit up (6s) |
pose + neck angle, over time |
|
운동횟수 |
squat x 12 (down) |
pose + joint-angle hysteresis |
|
동작알아보기 |
thumb up 0.94 |
sign-language model over a rolling 8-frame clip |
|
시선 |
1 face: looking right and slightly up |
face + landmarks + head pose + gaze |
|
뭘보나 |
1 person looking at: laptop |
gaze + detection (ray-cast into the boxes) |
|
모자이크 |
the picture with every face pixelated |
face (and plate) detection + redaction |
|
누구지 |
|
embedding + cosine matching |
|
출석체크 |
present 24/26 + |
face detection + roster matching |
|
가르치기 |
your own classes, from example photos |
embedding + nearest neighbour |
|
— |
this part scored normal or anomalous |
anomalib model |
Two more are a single model, but they answer in sentences the same way:
|
Korean |
Answers |
|---|---|---|
|
거리재기 |
nearest: bottom-left · 34% of the frame is close, plus a colour map |
|
배경지우기 |
the subject, as a transparent PNG |
speak — text out loud¶
r = Model("읽어주기", "안녕하세요. 오늘은 기계 학습을 배웁니다.")
r.save("hello.wav") # 44.1 kHz WAV
r.plot() # the waveform
31 languages, Korean among them. The language is read off the script unless
you name one (lang="en").
Model("speak", "Good morning.", voice="M3") # ten voices: F1..F5, M1..M5
Model("speak", "안녕하세요", speed=1.3) # faster
Model("speak", "안녕하세요", steps=2) # rougher and quicker (8 by default)
Model("speak", "script.txt") # a file works too
Four networks in a row: predict how long the sentence takes
(duration_predictor), encode the text (text_encoder), push that much noise
towards the sentence a few times (vector_estimator, steps passes), turn the
result into a waveform (vocoder). Under a second per sentence on a laptop CPU.
The same sentence sounds the same twice (seed=0 by default); pass seed=None
for a fresh sample each call.
The ovkit gui window has 읽어주기 / Speak in its list too: type a
sentence, pick a voice, press 읽기, and Save writes the .wav.
Licence: the model is OpenRAIL-M, © Supertone Inc. Commercial use and redistribution are allowed, and the same use-based restrictions must travel with every copy you pass on.
LICENSEsits beside the weights on the mirror.
gesture, drowsiness, posture and exercise need time — point them at
a webcam or a video, not a still.
Aliases: ocr anpr blur driver describe faces people vehicle
tracking reid. To see what exists: list_pipelines() or
ovkit capabilities.
from ovkit import Model, list_pipelines
list_pipelines() # every capability, described
Model("read_text")("sign.jpg").text # 'STOP AHEAD'
Model("face_analyze", attributes=("age_gender",)) # configure what runs
Models¶
Only permissive licences (Apache-2.0 / MIT family) are registered — AGPL and
non-commercial weights are refused at load time. Everything comes from one
repository, leeyunjai/ovkit-models. Below are the 35 curated ones; the other
32 load by name and are listed with ovkit list --all.
Detection¶
Model |
What |
|---|---|
|
COCO-80, NMS-free. Fastest — the |
|
when r18 misses small objects |
|
stills and accuracy work |
|
the largest |
|
faces in general scenes |
|
people, surveillance scenes |
|
vehicles, surveillance scenes |
|
text regions on signs and documents |
|
vehicle + plate |
Faces¶
Model |
What |
|---|---|
|
age (0–100) and gender |
|
neutral · happy · sad · surprise · anger |
|
98 points — eyelid and lip contours, jawline |
|
5 points — eyes, nose tip, mouth corners |
|
yaw / pitch / roll |
|
256-d face embedding |
Classification and embeddings¶
Model |
What |
|---|---|
|
ImageNet 1000-class classifier |
|
256-d person embedding — the same person with their face turned away |
|
scene embedding (find similar images) |
|
bag, hat, sleeves and the rest |
|
type and colour |
|
eye crops + head pose → gaze |
|
eye open or closed |
Segmentation, pose, depth, image processing¶
Model |
What |
|---|---|
|
21-class semantic segmentation (Pascal VOC) |
|
per-person masks |
|
multi-person, 17 keypoints |
|
depth from a single photo |
|
subject cut from its background |
|
3x upscale (4x is |
|
mosaic style transfer |
Text, sound, motion¶
Model |
What |
|---|---|
|
Korean text recognition (PP-OCRv3, CTC) — what |
|
read a cropped Latin word (CTC) |
|
12 hand gestures (video clip) |
|
16 kHz speech denoising |
The zoo tier keeps aclnet (53 environmental sounds),
bert_small…squad_0002 (extractive QA),
machine_translation_nar_en_de_0002 and
time_series_forecasting_electricity_0001 loadable by name.
Teach your own AI¶
An embedding model turns examples into vectors; a new input matches the nearest one. It compares rather than trains, so it finishes in seconds on a laptop with no GPU, and what it saves is a single JSON file.
ai = Model("teach") # or Model("가르치기")
ai.learn("can", "photos/cans/") # a folder per thing to recognise
ai.learn("bottle", "photos/bottles/")
ai.guess("new.jpg") # ('can', 0.93)
ai.score("test/") # accuracy + what it confuses
ai.save("recycling") # -> Documents/ovkit/recycling.json
for r in ai.predict(0, stream=True): # webcam, over YOUR classes
print(r)
Five modes: photo (default) · face (expressions) · hand (needs
ovkit[hand]) · upper · body. Korean method names work too:
배우기 맞혀봐 점수 저장.
Collect examples with the webcam:
from ovkit.pipelines.teach import collect
collect("scissors", 30)
Korean¶
44 capability names and around 200 class names are translated. Every result
also carries the stable English name_en, so your code is never tied to the
Korean. OVKIT_LANG=en switches the display back to English.
r = Model("얼굴분석", "group.jpg")
for row in r.found:
print(row["name"], row["name_en"], row["pos"])
# 사람 person 왼쪽 위
See the Korean page for the full table of names.
GenAI — talking, listening, describing¶
pip install "ovkit[genai]". This side uses ovkit.genai, not Model():
these are openvino-genai pipelines rather than OpenVINO IR.
from ovkit.genai import pipeline, transcribe, describe
llm = pipeline("llm") # Qwen2.5 1.5B INT4
llm.generate("Hello", max_new_tokens=50)
transcribe("lecture.wav") # Whisper base
describe("photo.jpg", "what is happening here?") # Qwen3-VL 4B
Models that aren’t registered¶
Straight from the Hugging Face Hub¶
optimum-intel converts almost any Hub model to OpenVINO IR. Converting is the
heavy half and happens once; what lands in the cache is a plain OpenVINO model,
so running it afterwards needs nothing but ovkit — a classroom machine can
be handed the cache and never see PyTorch. The pull also writes the model’s own
class names and the normalisation its image processor declares, so results read
as answers and not as confident nonsense.
pip install "ovkit[hf]"
ovkit pull google/vit-base-patch16-224
Model("google/vit-base-patch16-224", "photo.jpg") # tabby 0.94
Tasks: image classification, zero-shot (CLIP) classification, feature
extraction. Detection and segmentation are not available — optimum-intel
does not export them, so those come from the registry (detect, segment).
Train your own detector¶
Train RT-DETR on your own data and load it through the same Model(). It reads
a YOLO-format data.yaml as is.
pip install "ovkit[train]"
ovkit train --data data.yaml --epochs 100
ovkit val --data data.yaml --weights best.pt
ovkit export best.pt # -> OpenVINO IR + labels.txt
Model("best_openvino/model.xml", "test.jpg")
INT8 quantization¶
Model("detect").quantize(calib_data) # ovkit[quant]
Worth the most on NPU.
From the shell¶
Command |
What it does |
|---|---|
|
a window: pick a capability, point it at your webcam — the easiest start |
|
prints results, saves |
|
what |
|
curated models / every registered name |
|
source, licence, input size, preprocessing |
|
fetch ahead of time (the night before class) |
|
convert a Hugging Face model to IR |
|
what this machine can run on |
|
RT-DETR training, evaluation, export |
Runtime¶
|
the default. |
streams |
folders, video and webcam run through |
|
cache location, default |
|
no network at all — for a classroom machine handed a copied cache |
|
|
model mirror |
everything from |
integrity |
|
Reading text, and which language¶
read_text picks the recogniser that matches the display language — the
PP-OCRv3 Korean model in Korean, the Latin one otherwise. Naming one yourself
wins over both.
Model("read_text")("sign.jpg") # Korean when OVKIT_LANG=ko
Model("read_text", recognizer="text_recognition") # force Latin + digits
If the Korean model cannot be loaded (offline, nothing cached) it warns once and falls back to Latin rather than quietly returning empty strings.
Not there yet¶
hand landmarks |
|
converting detectors |
what the Hub path can bring over stops at classification and embeddings |
the 7 newest models |
rescued from the mirror and registered, but verified as manifest entries only. Run |