Mohammed Djenadi · notebook
Open to internships, up to 12 monthsBSc Artificial Intelligence, JKU LinzLinz, Austria

Mohammed Djenadi

I build the data first, then the model.

Abstract

I'm a third-semester AI student who works on computer vision. When the labels I need don't exist, I render them in Unreal Engine 5, train on them, and then write down where the model still fails.

A small language model runs on your own device to find the answer in this page. Nothing is sent to a server.

At a glance

Study
BSc Artificial Intelligence, 3rd semester, JKU Linz
Focus
Computer vision, depth, tracking, detection
Tools
PyTorch, Ultralytics YOLO, Unreal Engine 5, SQL
Datasets
2 published on Hugging Face
Languages
Arabic, English C1, German B1, French B1
Contact
djenadimohammed22@gmail.com
§1
Depth estimation in snow

Alpine snow depth

11/2026

Depth models have little to go on in snow and flat light. So I rendered 1,556 images on real Swiss terrain around the Eiger in Unreal Engine 5, each with exact depth, simulated LiDAR and noisy GPS/IMU, and published them on Hugging Face.

Then I trained a CNN with a transformer bottleneck. It takes Depth Anything 3's depth, the LiDAR and the image, and corrects the depth. It also outputs how confident it is in each pixel.

PyTorch · Unreal Engine 5 · Depth Anything 3 · A* path planning

0.9770.387AbsRel on rendered validation frames
0.9620.854AbsRel on real mountain photos
1,556rendered images with exact depth
5.3kmflown by a simulated drone on its depth
Fig. 1.1

The same frame, in 3D

frame sun_0204 · 28,229 points
Every point is a pixel of one rendered frame, placed at its exact depth from the render. Distances are squeezed so the far mountains fit.drag to turn it · it loads when you get here
Fig. 1.2

Look through the layers

Rendered snowy slope used as the base image
--
My model's depth, log10 metres.
Fig. 1.3

Error before and after, lower is better

Rendered frames Real mountain photos 0.9770.387 0.9620.854 00.250.50.751
Depth Anything 3 alone   with my modelthe gain on real photos is much smaller
Fig. 1.4

Flying on its own depth

To test if the depth is good for anything, I flew a simulated drone across a valley with no terrain map. Every 5 seconds it renders a 720p view, runs DA3 and my model, adds the depth to a height map with 5 m cells and plans a new route with A*. Climbing costs 12 times as much as flying flat, so it goes round the mountains.

It covered 5.3 km for a 3.6 km straight line, never came closer than 11.9 m to the ground, and stopped 13.5 m from the goal.

LimitsThe simulator's LiDAR is much cleaner than a real sensor, so this doesn't show it could fly a real drone. On real roads with real LiDAR, DA3 with a simple scale fix still beats my model.

The sound is made from the flight data, it wasn't recorded. The video is sped up 12 times.simulated in Unreal Engine 5
§2
Tracking and speed estimation

Car speed from one camera

in progress

Real footage with the exact speed of every car on every frame barely exists, so I made it: 150 freeway clips in Unreal Engine 5, each from its own camera between 4 and 21 m up, with masks, track IDs and the true speed of 5,281 cars on every frame.

YOLO26-seg finds the cars, ByteTrack keeps their IDs, and a small transformer reads the second before and after each frame. It only gets numbers taken from the mask, like where the tyres touch the road. It never sees the image.

Unreal Engine 5 · YOLO26-seg · ByteTrack · Transformer · PyTorch

0.884mask mAP50 on road it never trained on
2.75km/hmean error, high camera, close cars
7.32km/hmean error over every camera and car
150cameras, one per clip
Fig. 2.1

Traffic lab

click a car
--
now--
max--
avg--
A small version of the dataset's traffic. Cars follow the Intelligent Driver Model, so they speed up, queue and brake like in the clips. The boxes and speeds are ground truth, the same kind of labels the dataset has.click a car · press brake to send a wave back
Table 2.1 · Speed error on cameras the model never saw
Setupmean error
Camera over 12 m, car over 1,500 px2.75 km/h
Camera over 12 m, every car3.94 km/h
Every camera, car over 1,500 px4.75 km/h
Every camera, every car7.32 km/h
Always guessing the average, 67.9 km/h21.00 km/h
Fig. 2.2

A frame from the dataset

Rendered freeway frame with ground-truth boxes, IDs and speeds
Ground truth drawn on: ID, speed now, max, average and true speed for each car.City Sample, Unreal Engine 5.8
§3
Defect detection

PCB defects, tile by tile

10/2026

A defect on a circuit board can be a few pixels wide in a 2,500 px photo, so shrinking the photo loses it. My app cuts the board into 320 px tiles that overlap by 64 px, runs a fine-tuned YOLO26l on each one and puts the boxes back together.

Each tile only keeps boxes whose centre is in its own half of the overlap, so a defect on a border isn't counted twice. On 6 boards it never saw, it finds all 30 labelled defects, plus a few extra boxes.

YOLO26 · OpenCV · Streamlit · 10 defect types · 10,000+ training images

Fig. 3.1

Replay of a real scan

Full photo of a printed circuit board
tile0 / 0
boxes kept0
modelyolo26l, 320 px, conf 0.25
    tile it seespart whose boxes it keeps
    These are the real boxes my model returned on this board, run tile by tile with the app's settings. Only the replay speed is changed.hover a tile to see it
    §4
    Data and machine learning

    More work

    4.1

    TikTok AI content detector10/2026 · PyTorch · Qwen3 embeddings

    Spots AI-made TikTok posts from metadata and captions only, trained on a 99-million-post (11 GB) dataset. I kept the 22% of duplicate captions on one side of the split to stop leakage, and reweighted the test set to the real 5.8% AI rate.

    0.841ROC-AUC, catches ~70% as a review filter
    code ↗
    4.2

    Superstore discount optimiser08–10/2026 · SQL · XGBoost · PyTorch

    Cleaned retail data in MySQL, then compared a PyTorch network with XGBoost to predict an order's profit class. I found and fixed a duplicate-row data leak on the way. The app suggests discount ranges for a target profit.

    89.3%test accuracy
    app ↗code ↗
    4.3

    Steam genre predictor2026 · Sentence Transformers · PyTorch

    Predicts a game's genres and store categories from its stats, name and description, with sentence embeddings and a multi-label network. Adding the description embedding gave most of the gain.

    0.496macro mAP on genres, up from 0.294
    app ↗code ↗
    4.4

    Satellite image classifierCourse project · PyTorch · CNN

    My final project for Programming in Python II at JKU: a small CNN that sorts 64×64 satellite images into 10 land-use classes, with a Streamlit app around it.

    97.3%validation accuracy
    app ↗code ↗
    §5
    About

    Third semester, AI at JKU Linz

    I'm studying for a BSc in Artificial Intelligence at Johannes Kepler University in Linz, after a year of computer engineering in Algeria. Most of my courses are online, so I can take an internship of up to 12 months and move anywhere in Austria.

    I like projects where I have to build the data first. I also write down where my models fail, from data leaks to results that don't carry over from renders to real images.

    Machine learning
    PyTorch, scikit-learn, XGBoost, Transformers, CNNs, model evaluation
    Computer vision
    YOLO (Ultralytics), segmentation, depth estimation, OpenCV
    NLP
    Sentence Transformers, Hugging Face
    Data
    Python, SQL (MySQL), pandas, NumPy, Matplotlib, Parquet
    Tools
    Unreal Engine 5, Streamlit, Git, CUDA, Claude Code
    Contact

    Looking for a machine learning, computer vision or data internship.

    click to copy
    Mohammed Djenadi · Linz, AustriaSet in Instrument Serif and IBM Plex · the figures use real data and model output