Rafat Hossain
Class of 2027, open to new grad roles, any field
CS student, leaning toward ML
Computer science honours student at Dalhousie, graduating May 2027. Co-op developer at SpryPoint, research assistant on Greenland ice segmentation. Looking for new grad roles.
-
Systems Canon film scanners Two desktop apps that turn a Canon EOS R7 into a film scanner, one over USB at 59.79 fps and one over Wi-Fi at 3.98. -
ML SPECTRA-ICA A team-built EEG artifact remover that strips only artifact-characteristic frequencies during detected events, and beat plain ICA on all 7 P300 metrics. -
ML CamusGPT A fine-tuned 12B Camus persona that keeps his biography in a retrieval layer, so a wrong fact is a data bug and not a retrain. -
Web Lumen Gallery A snap-through feed of the Cleveland Museum of Art's open collection, with docent notes written once and cached for good.
- 1.
Co-op developer at SpryPoint Worked on a Scala/Java and Knockout.js billing platform for municipal utilities: bug fixes, configuration pages, forms and tests. About 20 client-facing stories.
- 2.
Research assistant at Dalhousie Worked on U-Net models and patch datasets over Landsat-8 Greenland imagery, plus an Honours study on backdoor attacks in vision models.
- 3.
Treasurer, Dalhousie Machine Learning Society Grants of $1,500+ across two terms for a society of 150+ members.
Timeline
Drag to see my degree year by year; the projects below update to match.
- SQL
- Python
- PyTorch
- JavaScript
- TypeScript
- React
- Next.js
- AWS
- Java
- Scala
- Knockout.js
- PostgreSQL
- Docker
- scikit-learn
- Ollama
- Cloudflare Workers
Projects
Eight projects, pulled apart. Hover, tab or tap one to lift it out and read its summary.
Canon film scanners
Two desktop apps that turn a Canon EOS R7 into a film scanner, one over USB at 59.79 fps and one over Wi-Fi at 3.98.
Not started yet.
- +Two apps for one job: EDSDK at 59.79 fps over USB, CCAPI at 3.98 fps over Wi-Fi, 15x the frame rate.
- +A double-clickable build of 66 MB with a mock camera, and 250 tests that need neither a camera nor the SDK.
- +Deflate TIFF positives at 2.4 to 2.6x, verified lossless by reading every pixel back.
- ~Dropped OpenCV for Pillow, tifffile and numpy, taking the packaged app from 176 MB to 66 MB.
- ~Stopped reading Canon HEIF as sRGB and read the PQ transfer characteristic out of the file instead.
- ~Gave the SDK the main thread on macOS, because EdsGetCameraList returns zero cameras from anywhere else.
- ~Cut fine focus to the SDK minimum of one step by one after the whole-frame metric stopped resolving it.
- !Corner-by-corner alignment is not built; the per-region sharpness it needs is.
- !The CCAPI build still previews colour negatives cyan, because its inversion is the first linear flip.
- !Packaged builds are unsigned, so Gatekeeper blocks them on any other Mac.
SPECTRA-ICA
A team-built EEG artifact remover that strips only artifact-characteristic frequencies during detected events, and beat plain ICA on all 7 P300 metrics.
Not started yet.
- +Beat standard ICA on all 7 P300 BCI metrics across 10 subjects, Cohen's d = 0.703, a medium effect.
- +Found 28 more P300 targets and produced 11 fewer false alarms than binary ICA exclusion.
- +Type-specific event detectors and a per-component spectral weight, with no hardcoded frequency bands.
- ~Dropped the spectral path for muscle components after it measurably degraded neural preservation.
- ~Grew the sample benchmark from 6 subjects to the full 10-subject leave-one-person-out result.
- !The spectral path needs at least 5 STFT frames of artifact; fewer than 5 blinks or heartbeats falls back to broadband.
- !The Gini quality threshold of 0.05 was never tuned systematically against the full dataset.
- !One dataset only, so nothing is known about other EEG hardware, electrode layouts or clinical populations.
CamusGPT
A fine-tuned 12B Camus persona that keeps his biography in a retrieval layer, so a wrong fact is a data bug and not a retrain.
Not started yet.
- +Shipped a 12B two-pass fine-tune, judged at factuality 4.06 against 3.44 for the 8B build it replaced.
- +A knowledge base of 13,794 entries holding 109 hand-verified facts, trimmed so those facts surface more often.
- +34 probes across 10 categories, scored through the real chat pipeline and tracked per commit.
- +A memory layer, off by default, that fixed a self-reference probe scoring 0 of 5.
- ~Dropped DPO for a second balanced SFT pass after DPO caused mode collapse.
- ~Replaced the flat curated boost with BM25 fused into dense, then a cross-encoder reranker.
- ~Rejected a leaner CORE prompt after a blind A/B: median reply length only moved from 40 words to 38.
- !Asking for a full list of works is bimodal: it refuses to catalogue in about half of runs.
- !It still invents titles for posthumous work, and swaps the dogs out for cats.
- !The public Space is inactive and its code still targets the 8B build.
Lumen Gallery
A snap-through feed of the Cleveland Museum of Art's open collection, with docent notes written once and cached for good.
Not started yet.
- +AI docent notes for $0 a month: cached per artwork, rate limited per IP, capped in the OpenAI dashboard.
- +Grew the explore pool from 1,000 reachable works to 41,511 by moving off a capped search API.
- +Lighthouse accessibility 100 and CLS 0, with the first search fired from an inline script before the bundle.
- ~Moved the whole feed from Chicago to Cleveland in one release after their CDN began 403ing images.
- ~Fixed a pagination cap nobody had measured: 1,000 records, not the 10,000 the spec assumed.
- ~Replaced the catalogue grid with a full-screen snap feed, a single-tap lightbox and pinch zoom.
- !Cleveland publishes no IIIF service, so the fixed web rendition is the only usable image size.
- !The OpenAI key is live on a keyless public endpoint; the dashboard budget cap is the only backstop.
Greenland ice segmentation
U-Net segmentation of snow and glacier ice in a Landsat-8 archive over West Greenland, scored against a published ice mask.
Not started yet.
- +IoU 0.766 for the U-Net against an independent ice mask on 10,318 patches, 3.1x the spectral rule beside it.
- +40,836 patches and 132 GB across four sets, after re-exporting a winter set that had lost two of its four tiles.
- +A DL4GAM split script on the official folds, after finding 140 of 239 test glaciers inside the training fold.
- +A season audit that found August imagery filed as winter across two export sets, and 4,009 duplicate patches.
- ~Rejected the R/B channel swap: it made the U-Net measurably worse, IoU 0.744 down to 0.619.
- ~Fixed the nodata rule to reject NaN as well as -9999, which 21.7% of a winter re-export had slipped past.
- ~Moved the 2015 re-exports into a new folder rather than over the live ones, so nobody read a half-written directory.
- !About 16% of winter pixels carry reflectance above 1.0, so no winter number can be checked against the ice mask at all.
- !The 0.520 precision from the refit is provisional: a reflectance filter removes the water half of the denominator.
- !IoU 0.766 is about 89% of the 0.862 that two independent published ice products agree on between themselves.
WorkSync
Employee management and payroll app I built on my own: employees log hours on a worksheet, HR forwards the request, admin pays it.
Not started yet.
- +The payroll path: employees log hours, HR forwards the request, admin marks it paid and the paid rows leave the worksheet.
- +Sign-in by email, password or Google, plus a server check that signs out anyone whose record says status fired.
- +Three role views off one login, because the navbar, profile and home page each switch on the userType read from Mongo.
- +Full CRUD on the worksheet collection, the only one with create, read, update and delete routes.
- ~Fixed the payment pipeline after a 2025-01-26 commit recorded the database updating while the worksheet entries stayed behind.
- ~Added the fired-user check at login, one day after the firing system itself landed on 2025-01-19.
- ~Took the admin option out of the registration form on 2025-01-19, so a signup could not pick its own role.
- ~Deleted the .env and the Firebase service account key from the server repository on 2025-02-25, after both had been committed.
- !The hourly rate is a literal 20 inside the amount-owed query, and the employee record has no rate field, so a pay change means a redeploy.
- !The README claims JWT authentication for role-based access, but the server has no jsonwebtoken dependency and no auth middleware on any route.
- !Neither repository has a test: the server's test script prints 'no test specified' and exits, and the client package.json has no test script.
DEEBug
A Python debugging platform built with a course team: five locked sections of Keras code, run on a server, scored against a known-good file.
Not started yet.
- +The five-section editor, with next and previous navigation between sections and a sticky header over them.
- +Templates for both supervised and unsupervised mode, each section opening on the same starter Keras code.
- +Template locking: a marker line per section, and Monaco read-only ranges below it, so the harness cannot be edited away.
- +Per-section saving with a validity check, so an edit that drops a required call is refused instead of overwriting the section.
- ~Fixed the supervised data preparation step on 2025-03-27, after templating it stopped running.
- ~Fixed the model definition step in unsupervised mode on 2025-03-27, where the required Dense layers did not match the harness.
- ~Kept the last valid text per section rather than resetting the whole section, added 2025-03-04 when an invalid edit wiped a stage.
- ~Rebuilt the editor page around the desktop wireframe, with a sticky header, on 2025-01-30.
- !The editable ranges are anchored to fixed line numbers, and a comment in CodeTemplates.jsx says so: add an import line and every boundary shifts.
- !app.py unpacks model, X, Y from generateModel(), which returns a single log filename, so /train_with_logging cannot run as written.
- !The only test in the repository is the Create React App placeholder in src/App.test.js; none of the Flask routes have one.
LBook
Staff-facing library system built with a team of three: catalog books, track students and loans, and put every page behind a login.
Not started yet.
- +Eight add and list pages over five tables, every one of them behind a staff login.
- +Adding a loan wrote the borrowbooks row and set books.status to 1 in the same request.
- +A dashboard of eight stat tiles and four percentage dials, each tile one query.
- +A loan list that joins students, borrowbooks and books, so one row shows the student and the book.
- ~Removed a debug print_r that was left in the tree.
- ~Replaced the seven per-day shift checkboxes on the employee form with one three-way shift field.
- ~Took the icons off the list pages.
- ~Stripped the starter template's redundant comments and reformatted the HTML, CSS and JS, in five commits in January 2025.
- !Passwords are md5, and checking.php keeps the same hash in the session for the life of the login.
- !No prepared statements anywhere: the id from ?eid= goes into four SELECTs unescaped, and the list pages delete on a posted id.
- !The dashboard's Unavailable tile counts books.status = 2, but the book form only writes 0 or 1, so that tile reads zero.
- Canon film scanners Systems Two desktop apps that turn a Canon EOS R7 into a film scanner, one over USB at 59.79 fps and one over Wi-Fi at 3.98.
- SPECTRA-ICA ML A team-built EEG artifact remover that strips only artifact-characteristic frequencies during detected events, and beat plain ICA on all 7 P300 metrics.
- CamusGPT ML A fine-tuned 12B Camus persona that keeps his biography in a retrieval layer, so a wrong fact is a data bug and not a retrain.
- Lumen Gallery Web A snap-through feed of the Cleveland Museum of Art's open collection, with docent notes written once and cached for good.
- lazy-catalog Systems A zero-dependency catalogue for a film folder, combining TMDB metadata with ffprobe facts read out of the files themselves.
- PhotosByRH Web A photography portfolio that keeps motion off the critical path, so the first photographs paint from the HTML.
- Greenland ice segmentation ML U-Net segmentation of snow and glacier ice in a Landsat-8 archive over West Greenland, scored against a published ice mask.
- WorkSync Product Employee management and payroll app I built on my own: employees log hours on a worksheet, HR forwards the request, admin pays it.
- DEEBug ML A Python debugging platform built with a course team: five locked sections of Keras code, run on a server, scored against a known-good file.
- LBook Web Staff-facing library system built with a team of three: catalog books, track students and loans, and put every page behind a login.
All projects
Every project, not only the featured ones. Rows dim for anything not yet started at the point in the timeline you pick.
| No. | Project | Version | Stack | Type | Status |
|---|---|---|---|---|---|
| 01 | Canon film scanners | v1.0.0 | Python, NumPy, Canon EDSDK, Canon CCAPI, LibRaw, PyInstaller | Systems | Stable New Planned |
| 02 | SPECTRA-ICA | v1.0.0 | Python, MNE, scikit-learn, NumPy, ICLabel | ML | Archived New Planned |
| 03 | CamusGPT | v0.4.0 | Python, PyTorch, Ollama, Unsloth, rank-bm25, Gradio | ML | In progress New Planned |
| 04 | Lumen Gallery | v1.0.0 | React 18, Vite 6, Tailwind 4, Cloudflare Pages, Workers KV, OpenAI | Web | In production New Planned |
| 05 | lazy-catalog | v0.2.0 | Python 3.9+, ffprobe, TMDB API, OMDb API, Ollama, launchd | Systems | In progress New Planned |
| 06 | PhotosByRH | v1.0.0 | Next.js 16, React 19, Tailwind CSS v4, Framer Motion, Vercel | Web | In production New Planned |
| 07 | Greenland ice segmentation | v0.2.0 | Python, U-Net, Google Earth Engine, Landsat 8, NSIDC GIMP | ML | In progress New Planned |
| 08 | WorkSync | v0.5.0 | React, Express, MongoDB, Firebase Auth, TanStack Table, Vite | Product | Archived New Planned |
| 09 | DEEBug | v0.6.0 | React, Flask, TensorFlow, Gemini API, Pyodide, MySQL | ML | Archived New Planned |
| 10 | LBook | v0.3.0 | PHP, MySQL, HTML, CSS, JavaScript, Bootstrap | Web | In progress New Planned |
Experience
Work, research, leadership, teaching and awards.
| No. | Dates | Role |
|---|---|---|
| Software development | ||
| D | 2026 — present | Software Developer, co-op, SpryPoint Services Inc. Worked on about 20 client-facing stories on SpryCIS, a billing platform for municipal utilities. Invited back for a second term. 3 more outcomes
|
| A | 2023 — 2025 | Data Architect / Technician, Knownautoparts Built and maintained a relational product database of 1,000+ automotive SKUs. 2 more outcomes
|
| Research | ||
| B | 2025 — present | Honours directed study (CSCI 4192), Dalhousie University, Faculty of Computer Science Promoted once Reproduced a defocus-blur backdoor on a small CIFAR-10 network: 99.80% attack success, clean accuracy within 0.08% of baseline. Previously Undergraduate Research Assistant. 2 more outcomes
|
| Leadership and teaching | ||
| C | 2025 — present | Treasurer, Dalhousie Machine Learning Society Managed the society's grants and budgets: $1,500+ across two terms, for 150+ members. 2 more outcomes
|
| Hackathons and awards | ||
| E | 2026 | SURGE NeuroHack 2026, 1st place, Machine Learning category Part of the team that built SPECTRA-ICA, an EEG artifact-removal algorithm that beat standard ICA on all 7 metrics of a P300 benchmark. |
Certifications
Issuer and year for each one.
| No. | Certification | Issuer | Year |
|---|---|---|---|
| C1 | AWS Certified Cloud Practitioner | Amazon Web Services | 2025 |
| C2 | Fundamentals of Cloud Administration with Azure | ShiftKey Labs | 2025 |
| C3 | Level Up with CCubed (cybersecurity) | Computing Councils of Canada | 2025 |
| C4 | Practical Cybersecurity | ShiftKey Labs | 2025 |
Get in touch
Open to new grad roles, any field, starting May 2027; a useful first message names the company, the role and the problem you want solved.