Skip to content

AI engineer · Tangerang, Indonesia

I build computer vision and LLM systems, from the training loop to the server that keeps them running.

Kernel
In this headline
Your browser runs a 3×3 Sobel edge filter over this headline. Point at the words to move the window.
Lead project
Semi-Supervised PPE Detection. Pseudo-labeling lifts YOLOv9 from 0.493 to 0.621 mAP@50 on the same 20% of labels. Read the case study
Status
Open to AI Engineer roles, internships, and research collaborations. kennyvws1@gmail.com

Work

Computer Vision2025Team course project · manuscript public

Semi-Supervised PPE Detection

Finds missing safety gear on construction sites, trained with hand labels on only 20% of the images.

Detects helmets and safety vests in construction-site footage, then marks each worker compliant or in violation. Trained on the public SH17 dataset. The 50-epoch training log and the manuscript are public.

mAP@50 by epoch

Repo training log, 20% labeled split. Epoch 50: precision 0.704, recall 0.573, mAP@50-95 0.409. Point at the curve to read any epoch.
View as table
Per-epoch validation metrics
EpochmAP@50mAP@50-95PrecisionRecall
10.3730.2200.5450.368
20.3720.2210.5930.361
30.3890.2310.5690.379
40.3920.2320.4980.376
50.4220.2550.5690.399
60.4220.2570.5490.416
70.4450.2670.6260.428
80.4780.2920.6030.447
90.4700.2890.5940.442
100.5020.3110.6230.470
110.5040.3130.5770.507
120.5130.3210.6060.493
130.5230.3280.6610.494
140.5280.3320.6660.485
150.5360.3360.6420.502
160.5380.3440.6810.498
170.5530.3450.6730.515
180.5440.3490.7270.480
190.5580.3550.6670.510
200.5450.3530.6740.520
210.5470.3510.6620.517
220.5720.3670.7030.535
230.5630.3610.6680.530
240.5710.3710.6660.533
250.5670.3630.6650.543
260.5780.3720.6810.547
270.5870.3810.6690.545
280.5810.3810.6770.555
290.5900.3820.7460.523
300.5970.3900.7020.545
310.5930.3860.7290.537
320.6000.3920.7340.554
330.5940.3920.6990.556
340.6010.3930.6780.568
350.5870.3840.7240.539
360.6060.4010.6890.573
370.6060.3980.6850.575
380.6050.3950.7150.562
390.6060.3950.6850.582
400.6210.4070.7510.559
410.6050.3940.6780.576
420.5970.3970.7390.533
430.6060.4030.7180.560
440.6110.4030.7250.557
450.6130.4080.7390.558
460.6110.4080.7170.558
470.6110.4060.7420.553
480.6130.4080.7220.564
490.6140.4080.7280.562
500.6140.4090.7040.573

+0.128

mAP@50 gained by pseudo-labeling at the best epoch, with the same hand labels.

  • Supervised10% labels0.371
  • Supervised20% labels0.493
  • Semi-supervised20% labels0.621
0.621 is epoch 40, the best epoch of the log above. The run ends at 0.614 on epoch 50.Ablation study · results/grafik_ablation_study.png

How it works

  1. 01Baseline

    Train YOLOv9-c on the 20% labeled split.

  2. 02Pseudo-label

    Run the baseline over the other 80% and keep detections above a confidence threshold.

  3. 03Retrain

    Train again on labeled and pseudo-labeled data together.

  4. 04Comply

    Match each PPE box to a person by IoU, then mark that worker compliant or in violation.

LLM / Agents2025Active

FinRAG-ID

Cited answers from Indonesian financial reports.

Ask an Indonesian annual report, prospectus or financial statement a question and get an answer that cites its pages. It runs local-first, and one Docker Compose command brings up Qdrant, Ollama, the API and the UI.

Code
How FinRAG-ID moves data, in order
  1. Ingest

    pdfplumber pages with metadata, split into sentence chunks.

  2. Retrieve

    Sastrawi BM25 and BGE-M3 dense search over Qdrant, fused by reciprocal rank fusion.

  3. Answer

    Llama 3.1 8B on Ollama, OpenRouter when Ollama is down, sources tagged [S1] to [Sn].

  4. Evaluate

    RAGAS faithfulness, answer relevancy and context precision, plus latency p50 and p95.

Built withPoint at a tool to see the stages it runs in

Also built

Data Systems2025Active

Bandar Tracker

Smart-money flow tracker for the Indonesia Stock Exchange.

Reads KSEI ownership data and broker summaries to show where large players are accumulating or distributing, the analysis IDX traders call bandarmologi. FastAPI with async SQLAlchemy behind a one-file Lightweight Charts front end.

FastAPI / Async SQLAlchemy / Pandas / Data Pipeline

Private repository

LLM / Agents2025Active

RAG Evaluation Harness

Measure retrieval before trusting a RAG answer.

A reproducible harness that scores RAG pipelines with RAGAS against local models on Ollama, and tracks faithfulness and context recall across config changes so regressions show up early.

LlamaIndex / RAGAS / Ollama / Evaluation

No public repo yet

ML Systems2024Complete

Tiny Transformer From Scratch

A 12M-parameter decoder-only model, built to learn the internals.

Trained on Indonesian Wikipedia, with tokenizer training, mixed precision, a KV cache and a minimal inference server.

PyTorch / Transformers / Tokenizers

No public repo yet

About

I'm Kenny, a computer science student at Universitas Multimedia Nusantara in Tangerang, working toward AI engineering. I like the unglamorous parts of machine learning: cleaning the data, fighting the training run, getting a model to behave on a real server instead of a demo notebook.

I build on a Mac and ship to a Linux homeserver with Docker, so everything has to work on both. If a tool is interesting and I can host it myself, I will.

Tools

Languages
  • Python
  • TypeScript
  • C++
  • SQL
  • Bash
ML / Deep Learning
  • PyTorch
  • YOLOv9
  • scikit-learn
  • OpenCV
  • Pandas
  • NumPy
LLM / Applied AI
  • Hugging Face
  • LangChain
  • LlamaIndex
  • Ollama
  • FastAPI
  • RAGAS
Infra / MLOps
  • Docker
  • Linux
  • GitHub Actions
  • Weights & Biases
  • PostgreSQL
  • Ubuntu

Clean the data. Fight the training run. Ship the server.

Hiring an AI engineer or intern, or looking for a research collaborator? Write to me.