SahrulRamadhani29/portfolio

LatihIsyarat

Public source

An offline sign recognition app: 24 static ASL letters, with J/Z motion recognition developed on a separate branch.

Campus PBL

A campus project-based learning (PBL) project assessed for semester progression.

Team contributor · rhmau1Hand detection, J/Z model contracts, camera integration, learning progress, and testing

My contribution highlights

Read all 8 contribution modules
Contents · 8 contribution modules

Main workflow

6 steps

Camera/photo input becomes letter predictions and practice history. Static poses and J/Z motion follow separate paths according to their implementation branch.

  1. 01Capture practice input

    1. Choose a camera or photo

      User
    2. Find a usable hand

      Hand detector
  2. 02Recognise poses or motion

    1. Prepare model input

      App preprocessor
    2. Run offline inference

      TensorFlow Lite
  3. 03Show and save practice

    1. Read results and guidance

      Flutter app
    2. Local history and progress

      SQLite & app state
Process details & branches
  1. Choose a camera or photoUser

    Start practice using the camera or a photo/upload. Dynamic recognition requires a motion clip with user-controlled start and end.

  2. Find a usable handHand detector

    Hand regions or landmarks provide the input for recognition.

    Is hand input available?

    • Detected. Continue with preprocessing for the recognition path.
    • Not usable yet. Input does not produce a usable recognition result; the user needs to adjust the hand position or image.
  3. Prepare model inputApp preprocessor

    The input format depends on the type of letter being recognised.

    Which recognition path?

    • Static poses · default branch. The hand region becomes classifier input for 24 static letters.
    • J/Z motion · rama branch. Landmarks across frames become sequence features for a GRU model.
  4. Run offline inferenceTensorFlow Lite

    The model predicts a label. J/Z development also handles late results, timeouts, and session cancellation.

  5. Read results and guidanceFlutter app

    Predictions feed into the practice display, target letters, and guidance to help users understand recognition results.

  6. Local history and progressSQLite & app state

    Save practice activity, manage progress, and release the camera when a session closes or the app changes state.

The default branch contains 24 static letters. J/Z motion, 26-letter progress, and session control are developed on the rama branch.

CASE_STUDY.mdProduct & my contributions

About LatihIsyarat

LatihIsyarat is a Flutter application for learning the ASL alphabet. Users can practise through the camera, photos or uploads, read letter guidance, and view practice history and progress. Recognition runs offline using TensorFlow Lite, while history is stored locally in SQLite.

I worked on hand detection, image preprocessing, camera recognition integration, J/Z motion development, learning progress, and testing. The default path covers 24 static letters; I developed J/Z on the rama branch.

My contributions

Hand detection in photos and uploads

I developed hand detection for still images and connected it to the photo/upload workflow. I handled hand region selection, input that is not yet suitable for processing, and the connection between detection results and the classifier. This sends user-selected images through the appropriate recognition stages.

Preprocessing and the TensorFlow Lite classifier

I worked on image preprocessing to match the model’s expected input, invoked the TensorFlow Lite classifier, and mapped prediction labels to application results. I also improved model identifier validation and classifier tests so model or label mapping errors can be handled at the recognition layer.

J/Z training package and model contract

On the rama branch, I built a Python J/Z training/evaluation package using sequence features and a GRU model. I prepared labels, metadata, and preprocessing contracts, grouped data by source video, and recorded split manifests. I also checked conversion to TensorFlow Lite, including float16 variants, and archived static model sources.

Hand landmarks and native Android integration

I connected MediaPipe components, detectors/landmarks, frame encoders, sequence preprocessing, and the J/Z classifier. I worked on the native Android/Kotlin bridge and isolate inference so camera frames can become sequence features consumed by the motion recognition service.

J/Z target practice and free mode

I integrated J/Z target practice and a free mode combining static pose and motion recognition. J/Z clips use user-controlled start/end actions. I configured timeouts, rejected results arriving from old sessions, and handled cancellation to keep predictions associated with the active session.

Camera lifecycle and session storage

I fixed camera release when users change pages or the application enters the background. I also handled history storage for interrupted sessions so saving and camera shutdown do not interfere. This work supports camera stability during practice and when stopping a session.

History, 26-letter progress, and guidance

I extended history models and progress to cover 26 letters in the J/Z development, fixed weekly practice markers based on activity dates, and added explanations of J/Z movements to the guide. I also refined practice controls, guidance pages, and progress displays connected to local session data.

Service and application integration tests

I wrote tests for classifiers, hand detectors, J/Z services, camera integration, history, gamification, and guidance. The focus includes input/output contracts, session handling, and connecting recognition results to learning workflows. This development remains distinct from the default branch’s 24-static-letter path.

Fields & core technologies

Project fields

Mobile DevelopmentComputer VisionMachine LearningAI Engineering

Core technologies

FlutterDartPythonTensorFlowTensorFlow LiteMediaPipeOpenCVSQLite

20 commits in the last 12 months

All branches
NovDecJanFebMarAprMayJunJulAugSeptOctNov
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Hover over a square or focus it to see the date.
LessMore
Current streak0 days
Longest streak in this period2 days
Active days in this period4 days
Verified data · updates scheduled hourly.
How it is counted · 1 repo · 6 branch

My authored commits reachable from all remote branches at sync time. Each SHA is counted once, even across branches or forks. Merge commits are excluded. Dates use the author timestamp in Western Indonesia Time (UTC+7), rather than push time. The current streak remains active when the last commit was yesterday and today is still in progress.

This calendar covers commits across all branches. Its totals may differ from GitHub’s contribution calendar, which includes other activity types and follows its own branch rules. This calendar covers only the project you are viewing.

Contribution history

20 of my non-merge commits · All branches · Data as of 3 November 2026.

Public commit examples

Contribution evidence

Back to all projects