Skip to content

技術者経歴書

J.R.

Full-Stack Engineer / AI & Backend

A Python-centred engineer since 2019 — from machine-learning implementation to production-grade backends. Currently in Japan working on legacy-system modernisation with LLMs.

Scroll

ABOUT

About

My strength is a strong curiosity toward new things and a willingness to take on challenges. Whenever a new technology or tool appears, I learn it and try it out hands-on first. As a result I pick things up quickly and adapt flexibly to new environments. I welcome change and keep growing while enjoying new opportunities.

Education

  • Hebei University of Economics and Business (B.Sc.)

    Mathematics and Applied Mathematics

    2015.09 – 2019.06 ・ GPA 3.97 / 5 · Rank 9 / 30 in major

  • SANKO Japanese Language School, Tokyo ↗

    Japanese language

    2024.07 – 2025.11 ・ Enrolled Jul 2024 / left school Nov 2025 · JLPT N2

Profile

Gender
Male
Age
30
Nationality
China
Nearest station
Kameari Station
Arrived in Japan
2024.07
Experience
About 6 years
Location
Tokyo, Japan

SKILLS

Technical Skills

Python Backend

Building and maintaining web applications with Django, Tornado and Flask. Data processing and storage with MySQL, MongoDB, Redis, Kafka and Milvus. Interface design and integration over RESTful APIs and Protobuf-based gRPC.

Machine Learning & Computer Vision

Data analysis (regression, clustering) with scikit-learn. Object detection (Faster R-CNN), recognition (ResNet) and YOLOv8 with PyTorch. Inference acceleration on NVIDIA CUDA and Huawei Ascend ACL with C++ integration.

Frontend

Admin UIs with Vue 2 / Vue-Element-Admin. Screen development with React, TypeScript and Angular. Data visualization with ECharts.

Multiple Languages

C++11 project work. API and business-logic implementation in Go. Experience with a migration project to Rust.

Deployment & Ops

Provisioning and deployment with Docker, docker-compose, Nginx and shell scripts. Production setup and operations on AWS and Azure. Handling vulnerability scans with tools such as Fortify.

Data Processing & Misc.

Crawler development (XPath-based and API-based). Data manipulation with NumPy and Pandas. Image processing with OpenCV; video rotation, affine transforms and cropping with FFmpeg. Applied LLM / prompt engineering at work, including building an internal GPT bot.

Experience Matrix

◎: 1+ year professional / ○: professional experience / △: familiar

OS

  • Windows ◎
  • Windows Server ◎
  • Linux ◎
  • macOS ◎
  • AWS ◎
  • Azure ◎

Language

  • Python ◎
  • Vue.js ◎
  • React.js ◎
  • Angular.js ◎
  • TypeScript ◎
  • JavaScript ◎
  • HTML ◎
  • jQuery ◎
  • AJAX ◎
  • Go ◎
  • Shell Script ◎
  • C ○
  • C++ ○
  • VC++ ○
  • COBOL △
  • C# ○

Database

  • MySQL ◎
  • PostgreSQL ◎
  • SQL Server ◎
  • SQLite ◎
  • MongoDB ◎
  • Redis ◎
  • Milvus ◎

Web / AP Server

  • Nginx ◎
  • Apache ◎
  • IIS ○
  • Tomcat ○

Other

  • Docker / docker-compose ◎
  • Kafka ◎
  • PyTorch ◎
  • scikit-learn ◎
  • OpenCV / FFmpeg ◎
  • gRPC / Protobuf ○
  • Ray ○
  • Selenium ◎
  • LLM / Prompt Engineering ◎
  • CUDA / Huawei Ascend ACL ○
  • Django / DRF ◎
  • Tornado ◎
  • Celery ○
  • Elasticsearch ○
  • Cython ◎
  • SWIG ○
  • TensorRT ◎
  • Suricata ○
  • ANTLR4 / Lark ◎
  • RAG / MCP ◎

Summary

Focus areas
Deep learning (CV)Machine learningData analysisWeb developmentWeb crawling
Languages
Python (professional)Vue / React / TypeScript (professional)GoC++Rust (familiar)
Infrastructure & middleware
MySQL / MongoDB / PostgreSQL / RedisKafka / MilvusDocker / docker-compose / NginxAWS / Azure

Languages

  • Chinese Native

    Mother tongue

  • Japanese JLPT N2 / basic business conversation

    Studied at a Japanese language school (Jul 2024 – Nov 2025)

  • English Technical reading & writing

Certifications

  • 2026.07 JLPT N2 (Japanese-Language Proficiency Test)

EXPERIENCE

Work Experience

Open any company to see what I did there — responsibilities, projects, system data flow and takeaways.

  1. 2025.10 – Present 1 yr 1 mo

    ◯◯ Co., Ltd. (SES)

    Developer (Python) ・ Contract development · legacy modernisation (SES)

    Working in Japan as an SES engineer on legacy-system modernisation: automatic COBOL functional specs with ANTLR4 + RAG + MCP, a people-and-organisation sync tool for a major electronics maker's departmental system, and — as the engineer in charge — a rule-plus-generative-AI CMD → C# conversion platform.

    • Python
    • Lark
    • ANTLR4
    • Azure OpenAI
    • MCP
    • ChromaDB
    3 projects
  2. 2023.07 – 2024.07 1 yr 1 mo

    Guangzhou Chenchuang Technology Development Co., Ltd.

    Python Developer ・ Simulation & wargaming (research software)

    Backend and agent work on a simulation product line: the main business service, engine lifecycle management and multi-user co-editing of a battlefield-simulation platform in Go (Gin), plus Python integration with a C++ wargaming platform, red/blue agents and a live monitor.

    • Go
    • Gin
    • Python
    • Tornado
    • MongoDB
    • MySQL
    2 projects
  3. 2022.08 – 2023.07 1 yr

    Zhejiang Mulian Technology Co., Ltd.

    Python Developer ・ Industrial control security

    Python backend in industrial-control security: the traffic pipeline, allow-list detection engine and Django REST API of an out-of-band audit system, with Suricata integrated for deny-list detection and deep parsing of 27 industrial protocols.

    • Python
    • Django / DRF
    • Celery
    • Kafka
    • Redis
    • PostgreSQL
    1 project
  4. 2020.08 – 2022.08 2 yrs 1 mo

    People's Zhongke Intelligent Technology Co., Ltd.

    Algorithm Application Engineer ・ AI × content safety

    Owned algorithm scheduling and the cross-language layer of a content-safety platform: Ray to orchestrate 10+ capabilities, SWIG to bring C++ SDKs into Python, a share of the Ascend Atlas inference SDK, and a cross-modal retrieval product shipped offline on my own.

    • Python
    • C++11
    • Ray
    • Kafka
    • Protobuf
    • gRPC
    3 projects
  5. 2019.07 – 2020.07 1 yr 1 mo

    Beijing Yunshangzuo Technology Co., Ltd.

    Software Engineer ・ AI × education

    Applied algorithms and full-stack work in AI × education: real-time classroom-behaviour analysis and alerts with Mask R-CNN + ResNet, an internal labelling and training platform, the stats backend of an online-class monitoring system, face verification and screenshot-recognition services.

    • Python
    • PyTorch
    • Mask R-CNN
    • ResNet
    • YOLOv5
    • MXNet
    4 projects

How I Got Here

  1. 01

    During university (mathematics): learned data analysis with Python/scikit-learn and NumPy/Pandas. Amid the face-recognition boom, studied the C++ OSS face-recognition framework SeetaFace.

  2. 02

    After joining AI × education: implemented Faster R-CNN and ResNet with PyTorch inside business logic. Web moved to Tornado; the frontend moved from HTML/JS/CSS to Vue, broadening my CS foundation.

  3. 03

    AI × public-opinion period: worked with CV, OCR and NLP; used Kafka to unify multiple platforms in the core algorithm program, and ran Docker and cloud operations. Learned model distillation/pruning and hardware-level acceleration on CUDA / Ascend.

  4. 04

    Security industry: understood common attack techniques and privilege escalation. Became proficient with Django; took part in a C++-to-Rust migration and Python speedups via Cython or rewrites in Go.

  5. 05

    Simulation-software period: wrote server-side Go for the first time (Gin, WebSocket, goroutines) and used Python for integration with a C++ wargaming platform and for agent development.

  6. 06

    In Japan: moved in July 2024, studied Japanese at a language school and passed JLPT N2 (left the school in November 2025). Since then, as an SES engineer: automatic COBOL functional specs (ANTLR4 + RAG + MCP), a people-and-organisation sync tool, and a CMD → C# conversion platform (rules plus generative AI).

WORKS

Project History

Japan 2026.04 – Present

Legacy batch (CMD/JCL) → C# automatic conversion platform

Public sector (municipal core-system migration) ・ Engineer in charge (architecture design, core implementation, review)

Details
  • Python
  • Lark (LALR)
  • regex
  • Azure OpenAI
  • C# / .NET
  • pytest
  • +1

An automatic conversion platform that migrates long-running Windows batch scripts (CMD, Shift-JIS) to C# programs on an in-house batch framework. Rewriting by hand is costly and hard to prove equivalent, so I built a two-stage system — rule-based conversion plus generative-AI completion — guided by one principle: leave a TODO rather than silently change business logic.

System architecture

Two-stage conversion architecture
Legacy CMD scriptsShift-JIS batch files Stage 1 · deterministic transpile pipeline Preprocess8 normalisation passes LALR parseLark ~490-line grammar AST transform27 node types C# generationclass / Main / using Rule engine + variable expansion33 built-in commands + 1,084 mappings Stage-1 output.cs (with TODOs) · .cs.ast · .utf8.cmd Stage 2 · AI completion of CALL :LABEL Three-way alignmentTODO·AST·CMD Cache lookupSHA-256 hash Azure OpenAItemperature 0 Two-layer validationStructure & logic Feedback-driven retryUp to 7 times, otherwise keep the TODO Final output.label.ai.cs (original .cs is never overwritten)

Responsibilities

  • Two-stage architecture: stage one converts most of each script deterministically (preprocess → Lark parse → AST → rule engine → C# generation); stage two calls an LLM only for CALL :label subroutines the rules cannot express, keeping AI scope and risk minimal
  • CMD grammar modelling: designed and kept extending a ~490-line Lark (LALR) grammar that copes with cmd.exe quirks — redirects anywhere, the ambiguity of < > & |, %VAR:old=new% substitution, many IF/ELSE bracket styles, labels containing Japanese
  • Input-normalisation layer (8 passes): unifies mixed line endings, glued closing brackets, multi-line ELSE, ECHO metacharacters and full-width spaces without changing semantics, so the grammar stays small
  • AST and rule engine: 27 custom AST node types; 33 built-in commands plus a 1,084-entry external-command mapping table (job-process and job-flow call modes); variable expansion handled separately for string, argument-line and integer-expression contexts
  • LLM subroutine conversion with semantic-preservation checks: LabelMapper aligns the .cs TODO, the .cs.ast call node and the .cmd source; structural and business-semantic validators (ERRORLEVEL, cancel branches, error jumps and status flags must survive); on failure the reason is fed back for up to 7 retries, otherwise the TODO is kept for a human
  • Cost and stability: JSON cache keyed by SHA-256 of the normalised label block, exponential back-off on 429/5xx, automatic fallback from Chat Completions to the Responses API, temperature=0 for reproducibility
  • Quality loop: ~465 test cases over the grammar and transpiler layers; batch runs emit .cs.ERR files that are classified into four causes (CMD source issue / grammar gap / code defect / environment), with a shared list of common errors

Outcomes

  • ✓ Found several latent defects in the legacy CMD during migration (e.g. a missing & that means a GOTO never actually runs; an unescaped < when ECHO writes SQL) and logged them as legacy-system issues
  • ✓ Example: a 117-line data-linkage CMD became 156 lines of C#; the remaining 11 TODOs are all external commands missing from the mapping table and shrink as the table grows

Data flow

Legacy CMD → encoding detection → input normalisation → Lark parse → AST → rule engine → C# generation; TODO subroutines → three-way alignment → LLM generation → two-layer validation (≤7 retries) → .label.ai.cs

Scope: 外部設計 / 機能設計 / 内部設計 / 製造 / 単体試験
  • Python
  • Lark (LALR)
  • regex
  • Azure OpenAI
  • C# / .NET
  • pytest
  • Git
Company:◯◯ (SES) Open company page
Japan 2026.01 – 2026.03(3 mos)

Departmental project-management system — people & organisation auto-sync tool

Manufacturing (major electronics maker) ・ Development, testing, release and hand-over of a Python sync tool (dispatched)

Details
  • Python
  • Selenium
  • paramiko
  • MySQL / MariaDB
  • Redmine REST API
  • SendGrid
  • +3

A software-engineering division of a major electronics maker built its own project-management and status-reporting platform on Redmine (Angular + Go + Redmine). People and organisation data live in an internal staff directory with no usable API, so I built the sync tool: it scrapes members and the org tree with Selenium and syncs them into Redmine accounts, department/section organisations and permission groups (4 departments, ~30 sections).

System architecture

Sync tool structure (my part)
① Customer intranet · WINDOWS operations PC ② AZURE VM · production server Task Scheduler → executor.ps1 Excel macro → staff allow-list find_users_emails_and_departments Automates Microsoft SSO login Expand org tree · collect e-mails → new_users / new_organization.csv generate_all_users_data Look up each e-mail: unit, role, name → all_users_data.csv transport_csv paramiko SFTP upload into a timestamped directory remove_old_dir Clean up expired CSVs and logs Each step is its own subprocess; a failure stops later steps Staff directory Staff directory (old directory system retired) Org tree Employee search SFTP cron → executor.sh Find the latest data directory of the day SFTP landing directory Dedicated account · batchgroup rights manage_user_batch (11 steps) 1 csv_validator: headers, e-mail format, dangerous characters 2 Org diff → update_organization.sql Unexpected org change → exit code 2 → abort and alert 3 People diff → update_users.sql New members enabled · leavers deactivated · re-hires unlocked 4 Permission-group diff → curl script Reporting groups · department-head group · allow-list group kept 5 Run SQL / scripts → clean old directories Two-phase execution EXEC_UPDATE_USER_SQL_FLAG controls whether to write to the DB directly On org change, generate SQL first; after the owner confirms, run executor_after_confirmed.sh MySQL (Redmine DB) users · email_addresses Department / section · roles · config Redmine REST API Group member add / remove SendGrid 3 kinds of alert e-mails System owner Release manually after SQL is confirmed
See 1 more diagrams on the company page →

Responsibilities

  • Data-source migration: when the old staff directory was retired, moved the crawler to the new site — new page structure and Microsoft SSO login — while keeping the legacy role markers so downstream sync logic needed no change
  • Selenium (headless Edge) logs in automatically, walks the org tree and looks up each person's unit and role; results are pushed one-way from the intranet PC to an Azure server via paramiko SFTP
  • Sync batch: diffs old and new data, generates and runs SQL for account creation, deactivation, re-hire unlock and department/section/role sync; updates the reporting permission groups through the Redmine REST API, leaving allow-listed members untouched
  • Three kinds of SendGrid alert e-mails; on an unexpected organisation change the job aborts and the SQL runs only after the owner confirms it (two-phase), so bad data never lands in production directly
  • Centralised department mappings scattered in code into a database config table; handled the April reorganisation per the customer's policy and designed/ran test cases covering screens, the application flow and permission groups
  • Diagnosed and fixed production issues: lock mis-detection from duplicate people, missing accounts for re-hires, page time-outs under network jitter, Edge driver mismatch
  • Released to two production environments (intranet PC + Azure VM): backup, deploy, dry-run with DB writes disabled to verify the SQL, then go live; wrote the operations runbook (deployment, alert guide, troubleshooting, org-change SOP) and handed over
  • Ran Fortify / FOSSology security and licence scans over the whole project, fixed high-severity findings such as JSON and SQL injection, and compiled the OSS licence list

Data flow

Staff directory → Selenium crawler (intranet PC) → CSV → SFTP → diff SQL / Redmine REST API (Azure VM) → accounts, organisation, permission groups

Scope: 製造 / 単体試験 / 結合試験 / 運用保守
  • Python
  • Selenium
  • paramiko
  • MySQL / MariaDB
  • Redmine REST API
  • SendGrid
  • Bash
  • PowerShell
  • Azure VM
Company:◯◯ (SES) Open company page
Japan 2025.10 – 2025.12(3 mos)

Automatic COBOL functional-spec generation with ANTLR4 + RAG + MCP

AI (visualising and documenting legacy assets) ・ Design, implementation and validation (led individually)

Details
  • Python
  • ANTLR4
  • ChromaDB
  • SentenceTransformers
  • MCP (FastMCP)
  • Gemma-3 4B
  • +3

The customer's core batch work still runs on COBOL written decades ago: no usable design documents, abbreviated variables such as TR1-HINSHU whose business meaning is scattered across DB design manuals and glossaries, and fewer and fewer people who know COBOL. The goal: feed in COBOL source and get a Japanese functional specification (Markdown) that business staff can read. Design principle — deterministic work (syntax, layout, call graph) is done by programs; the model only gives meaning and writes it up.

System architecture

Knowledge base + MCP + spec-generation pipeline
① Offline · knowledge-base build (once) Sources DB design manuals · glossary table / file / job-flow defs Semantic split file → record → field → group Unify as {key, value} embed only the key (field ID) Embedding multilingual-e5-small JA / ZH / EN search ChromaDB aliases · no OCCURS index hierarchy paths kept MCP server (FastMCP) lookup_field · lookup_record batch_lookup_fields · get_subroutine_summary vector search exposed as tools ② Online · spec generation (once per program) COBOL source Unisys dialect Preprocess Shift_JIS → UTF-8 line numbers · dialect ANTLR4 parse Cobol85.g4 → AST Call graph + topo sort PERFORM · skip EXT bottom-up Gemma-3 4B per-subroutine generation Functional spec .md (Japanese) fetch only needed definitions Deterministic work (syntax, layout, call graph) is done by programs; the model only gives meaning and writes it up

Responsibilities

  • Model validation and change of course: benchmarked Gemma-3 4B on COBOL comprehension; LoRA fine-tuning on Colab could not finish because of memory limits. Since the business dictionary changes per customer, moved to RAG, which needs no retraining
  • Knowledge base: unified DB design manuals, glossaries and table/file/job-flow definitions into {key, value}, split semantically by file → record → field → group; embedded only the key (multilingual-e5-small) into ChromaDB, stripping OCCURS subscripts before lookup and building aliases and hierarchy paths
  • COBOL parsing: generated a Python lexer/parser/visitor from Cobol85.g4; preprocessing for Shift_JIS→UTF-8, line-number removal and dialect directives such as $SET; turned the parse tree into a compact AST for the LLM; a variable extractor handling REDEFINES / OCCURS / COMP / level-88
  • Call-hierarchy analysis: built a call graph from PERFORM, dropped EXT paragraphs that only serve as exits in RTN/EXT pairs, and used a topological sort to fix a bottom-up analysis order
  • MCP integration: exposed vector search through FastMCP as four tools — lookup_field, lookup_record, batch_lookup_fields, get_subroutine_summary — so the model fetches only the variables it uses instead of hundreds of definitions
  • Generation and prompt tuning: per subroutine, extract input/output/work variables and callees, look definitions up via MCP, pass lower-level summaries up, and have Gemma-3 write Markdown; prompt constraints drop empty items and require business language instead of literal MOVE paraphrases

Outcomes

  • ✓ Two programs (13.7 KiB and 13.5 KiB) produced specs of about 6.5 KiB and 6.7 KiB, with retrieved terms matching expectations
  • ✓ Established a layered design — static parsing + RAG + tool calls: splitting by subroutine and analysing bottom-up lets a 4B model handle programs longer than its context, with variable descriptions mapped to the right business names

Data flow

Knowledge base (manuals → semantic split → embeddings → ChromaDB) ⇄ MCP ⇄ COBOL source → preprocessing → ANTLR4 → AST → PERFORM call graph → topological sort → Gemma-3 per-subroutine generation → functional spec .md

Scope: 外部設計 / 機能設計 / 内部設計 / 製造 / 単体試験
  • Python
  • ANTLR4
  • ChromaDB
  • SentenceTransformers
  • MCP (FastMCP)
  • Gemma-3 4B
  • Hugging Face Transformers
  • Google Colab
  • WSL
Company:◯◯ (SES) Open company page
China 2023.07 – 2024.07(1 yr)

Battlefield Parallel Simulation System

Simulation & wargaming (for research institutes) ・ Backend developer (Go / Python)

Details
  • Go
  • Gin
  • MongoDB
  • MySQL
  • Redis
  • NSQ
  • +5

The company's core product: a browser-based battlefield-simulation platform for research institutes. Users compose scenarios on a 3D digital globe, push them to a simulation engine with one click, and get live situation display, multi-user co-editing, recording/replay and effectiveness evaluation.

System architecture

Overall system architecture
L1 Browser Scenario editor Vue 2 + Cesium 3D globe multi-user co-editing Simulation control start / pause / resume speed · timeline Situation display 3D view · record & replay effectiveness evaluation L2 Services (Go) Main service (Gin) 17 modules · ~100 endpoints router / controller / service / model WebSocket hub per-task rooms read/write goroutines + heartbeat Operator service scenario JSON → engine XML (3000+ lines) GeoJSON spatial ops · recording L3 Engine control Engine lifecycle dynamic ports · os/exec spawn goroutine reclaims on exit Engine console (Go) TCP to scheduler · relays commands start / pause / resume over HTTP Radar-signal service Tornado + SciPy · Docker chirp pulses · clutter · echoes L4 Engine & storage Simulation engine (external) runs the scenario · streams situation back Storage & messaging MongoDB · MySQL · Redis · NSQ

Responsibilities

  • Designed and built the main business service (Gin + MongoDB) in router/controller/service/model layers — 17 modules and about 100 endpoints covering models, entities, equipment, data dictionaries, templates and scenario versions
  • Designed simulation-engine lifecycle management: dynamic port allocation, scenario export as engine input, process launch and registration via os/exec, goroutines that detect exit and reclaim resources — supporting several simulations in parallel
  • Implemented multi-user scenario co-editing with a WebSocket hub and per-task rooms: separate read/write goroutines with heartbeat, a flattened scenario-tree index cache, and incremental command broadcast
  • Built the operator service: scenario JSON → external simulation-engine XML conversion (3,000+ lines) and GeoJSON area/intersection/union computation; per-frame situation recording with pause, speed control and timeline replay
  • Wrote the engine console in Go: connects to the scheduler over TCP, relays engine commands, and exposes HTTP endpoints to start, pause and resume a simulation
  • Built a radar-signal generation service with Tornado + SciPy (chirp pulses, clutter, echoes), generated asynchronously on background threads and deployed with Docker

Data flow

Scenario editor (Vue + Cesium) ⇄ WebSocket co-editing → Gin main service → operator service (JSON → XML) → engine console (TCP) → simulation engine → situation feedback → 3D display / replay

Scope: 機能設計 / 内部設計 / 製造 / 単体試験 / 結合試験
  • Go
  • Gin
  • MongoDB
  • MySQL
  • Redis
  • NSQ
  • WebSocket
  • Python
  • Tornado
  • SciPy
  • Docker
Company:Guangzhou Chenchuang Tech Open company page
China 2023.07 – 2024.07(8 mos)

Intelligent adversarial wargaming

Intelligent game-playing (unmanned air-sea scenario) ・ Python developer — agents and platform integration

Details
  • Python
  • ZeroMQ
  • Protobuf
  • MQTT
  • PyQt5
  • NumPy

A command-and-decision agent project for an unmanned air-sea scenario (island defence vs carrier strike group). A C++ wargaming platform adjudicates; on the Python side I built the platform integration, the red and blue agents and a live monitor of the engagement.

System architecture

Integration layer and agent architecture
L1 Platform (C++) Wargaming platform adjudicates the simulation and damage L2 Integration (Python) ZeroMQ (REQ + DEALER) request / reply channels Protobuf messages serialises simulation data 38 wrapped interfaces control · unit / task / damage queries routes · take-off · grouping L3 Main loop Runner fixed step: observe → decide → command Scoring per-round results L4 Agents Red defence agent perception → fusion fire allocation → strike check Blue attack agent multiple courses of action drone squadrons · saturation strike Entrant evaluation 16 deployed · dependency fixes dissect representative strategies L5 Monitoring MQTT publish agent state PyQt5 live monitor tabs: red/blue units and damage Offline dumps for review saved per round

Responsibilities

  • Built the platform-integration layer over ZeroMQ (REQ + DEALER) and Protobuf, wrapping 38 interfaces — simulation control, unit/task/damage queries, routes, take-off, grouping; a runner drives the observe → decide → command loop at a fixed step and scores the outcome
  • Red defence agent: staged decision-making — perception, information fusion, missile/gun/laser fire allocation, strike verification. Blue attack agent: multiple courses of action, drone-squadron launch and saturation strikes
  • Deployed and evaluated 16 entered agents (rule-based, ML, deep networks), resolved dependency and runtime problems, dissected representative strategies and gave a tech talk
  • Agent state is published over MQTT; built a PyQt5 live monitor with tabs for red/blue units and damage, plus per-round offline dumps for review

Data flow

C++ wargaming platform ⇄ ZeroMQ + Protobuf ⇄ runner (observe → decide → command) → red/blue agents → MQTT → PyQt5 live monitor

Scope: 機能設計 / 内部設計 / 製造 / 単体試験 / 結合試験
  • Python
  • ZeroMQ
  • Protobuf
  • MQTT
  • PyQt5
  • NumPy
Company:Guangzhou Chenchuang Tech Open company page
China 2022.08 – 2023.07

Industrial-control security audit platform

Industrial-control security (power, manufacturing) ・ Python backend developer ・ Team 13

Details
  • Python
  • Django / DRF
  • Celery
  • Kafka
  • Redis
  • PostgreSQL
  • +4

An out-of-band traffic-audit system for power and manufacturing control networks: probes capture mirrored switch traffic, Kafka feeds a Cython protocol-parsing engine, and three layers of policy — assets, allow-list, deny-list — drive detection and alerting. It parses 27 industrial protocols in depth (Modbus, S7COMM, IEC104, IEC61850 MMS/GOOSE/SV, DNP3, OPC UA/DA/AE, PROFINET, ENIP/CIP, BACnet and more) and has been deployed at power-sector research institutes.

System architecture

Overall architecture and data flow
Capture · probe Message bus Parse · detect Store · sync Application · management Offline alerts HTTP REST rules · assets · protocol switches · thresholds — pulled every 5 s (hot reload) Industrial-network mirrored trafficSPAN port · read-only network-capturer Capture probe · Python Scapy L2 raw socket selector polling over multiple NICs Cython Cstat counters deque buffer → Producer Operations safeguards Supervisor keeps daemons alive Celery checks probes every 5 min Capture / Kafka-write dual counters systemd checks Pilosa status cpulimit caps process CPU Suricata 4.0.4 AF_PACKET · cluster_flow 996 industrial vulnerability signatures Writes unified2 binary logs Kafka cluster cp-kafka 5.4 · ZooKeeper SASL auth · Docker deployment retention.ms = -1 raw_packets Raw frames · 300 GB retention alerts Alerts · 1 GB retention Kafka design points Decouples capture / parsing Parser restarts lose no data Producer retries = 5 Batch of 100 per send BufferError → flush and retry raw 300 GB / others 1 GB unified2 logs /var/log/suricata packet-inspector parse & detect engine · Consumer pulls raw_packets · pypkt (Cython) parses 70+ protocols · 5-tuple + MAC + protocol + payload → hash · Redis 10 s expiry window aggregates counts · Batch INSERT … RETURNING every 5 s · WhitelistInspector policy checks · Anomaly → Producer writes alerts · ThreadPool(16) + fail2restart self-healing Thread model in section 2 store.py · alert ingest Consume alerts → sec_alert table Syslog out · push to exercise range Supervisor daemons gunicorn · celery worker/beat store.py · unified2_recorder db_2_pilosa · packet_stat detect_device_offline cpulimit unified2_recorder idstools parse → deny-list alerts ingested Redis 6 DB0/1 Celery broker / results DB2 flow window TTL 10 s DB3 device activity TTL N min keyspace expiry events (Ex) PostgreSQL 10 packet_packet Flow records (with count / length) sec_alert_secalert Security alerts Assets · allow-list · deny-list · config wal_level = logical max_connections = 300 Kafka Connect · Debezium pgoutput logical replication → Avro auditor.public.* CDC stream · Schema Registry db_2_pilosa AvroConsumer writes bitmaps Pilosa bitmap index Traffic stats · allow-list self-learning Vue 2 frontend Vuex · Router · ECharts iView · axios · Electron Django 1.11 + DRF Gunicorn 8 workers :9003 Assets · allow-list · deny-list Security alerts · system alerts Packet audit · report export Policy backup / restore · settings Users · licence activation Allow-list self-learning Central-platform integration drf-yasg API docs About 12 Django apps Celery worker + beat Redis as broker Reports · policy backup · stats Expired-data cleanup · process checks bigdaddy device agent Change IP / time / reboot Configure capture NICs · push rules Firmware upgrade RSA + AES Certificates · licence activation External integration Central platform · SM4 (national crypto) Syslog · exercise-range push 1 2 3 4 5 6 7 8 9 10
See 2 more diagrams on the company page →

Responsibilities

  • Worked on the traffic pipeline: capture probe → Kafka → protocol-parsing engine → PostgreSQL; used Redis key-expiry events for 10-second flow aggregation and batch inserts, sharply cutting database writes, and Redis TTLs for device-offline detection
  • Implemented the allow-list detection engine keyed on 5-tuple, MAC and protocol function code, with a bitmap that separates "behaviour anomalies" from "content anomalies"; deep rule matching on IEC104 ASDU and OPC interface/function codes, plus automatic allow-list learning over a chosen time window
  • Built the Django REST endpoints for asset management, allow/deny-list policies, alerts and reports; Celery Beat jobs for report export, policy backup, expired-data cleanup and probe health checks
  • Integrated Suricata, parsed unified2 alerts and loaded nearly a thousand (996) industrial-vulnerability signatures for deny-list detection
  • Synced data to a Pilosa bitmap index through Kafka Connect (Debezium CDC) to back traffic statistics and multi-dimensional queries
  • (Customised edition) Parsed IEC 61850 SCD files to generate substation IED communication baselines and topology automatically

Outcomes

  • ✓ Protocol parsing is CPU-bound, byte-level work: the parsing library is written in Cython, compiling hot paths to C extensions — near-C speed with a Python interface for upper layers; only the .so is shipped, which also protects the core code

Data flow

Switch mirror port → probe (Scapy) → Kafka raw_packets → Cython parsing engine → Redis 10 s flow aggregation → PostgreSQL → allow-list detection → alerts → Django + Vue; Suricata runs deny-list detection in parallel; PostgreSQL →(Debezium CDC)→ Pilosa

Scope: 機能設計 / 内部設計 / 製造 / 単体試験 / 結合試験
  • Python
  • Django / DRF
  • Celery
  • Kafka
  • Redis
  • PostgreSQL
  • Pilosa
  • Suricata
  • Cython
  • Vue 2
Company:Zhejiang Mulian Tech Open company page
China 2020.08 – 2022.08(2 yrs)

AI content-safety algorithm platform

AI × content safety ・ Platform / algorithm backend (Python / C++11) ・ Team 15

Details
  • Python
  • C++11
  • Ray
  • Kafka
  • Protobuf
  • gRPC
  • +12

An AI system modelled on leading content-moderation products: it monitors and analyses public media and offers review capabilities to government users and partners. It exposes 10+ algorithm capabilities by subscription across images, video, audio and text. I owned the Ray scheduling platform and the SWIG cross-language layer, and contributed to the Ascend Atlas ACL inference SDK and the dual-platform model toolchain.

System architecture

Five-layer stack overview
L5 Delivery Product delivery Online review SaaS · Kafka return CDF cross-modal retrieval (offline image) Standard open API · signing / callback L4 Scheduling Ray algorithm scheduling platform Kafka consumer actors ×N MsgWorker · message layer InferWorker · routing layer Model actor pool ×8 L3 Bridge SWIG cross-language wrapper .i interface file _wrap.cxx → .so numpy pointer, zero copy pyporn / pyivcpd … L2 Inference C++ inference SDK acl_manager decoder · FFmpeg + DVPP inference / pre- & post-processing Retrieval index L1 Hardware Heterogeneous compute NVIDIA T4 · CUDA · TensorRT 7 INT8 Huawei Ascend Atlas · ACL · DVPP Side Toolchain Data & model toolchain Crawler collection Frame cut / label parsing pth → ONNX Robustness evaluation
See 4 more diagrams on the company page →

Responsibilities

  • Built the Ray-based distributed algorithm scheduling platform (owner): orchestrated 10+ capabilities as actors — adult-content and violent/terror detection, OCR, TV-logo and logo detection, face search, video copy detection, cross-modal search
  • Message reliability: Kafka auto-commit off, commit after each processed batch (at-least-once); puller actors start 1:1 with the partitions the client discovers
  • GPU slicing: fractional resources with num_gpus=0.2 let one card host 5 model instances in parallel (single node, 4× Tesla T4)
  • Designed a three-layer abstraction — message, routing, model: the message layer re-batches inference input as downloads finish with ray.wait; the routing layer intersects the subscribed algo_id set with each model's capabilities; adding a model means adding one actor and touching nothing else
  • Wrapped C++ algorithm libraries as Python extension modules with SWIG 4.0 (owner): images are passed as numpy memory pointers after a C_CONTIGUOUS check, removing cross-language copies
  • Contributed to the Huawei Ascend Atlas ACL inference SDK (C++11 / CMake): device and stream management, FFmpeg demuxing with DVPP hardware decoding; migrated vector search from AscendFaiss to Milvus; adapted to three CANN driver releases; found and fixed index-deletion failures in multi-chip search caused by an OpenMP thread-count mismatch
  • Dual-platform model delivery: PyTorch → ONNX (opset 11) → TensorRT 7 INT8 (for Tesla T4) and Ascend ATC .om models, so one business codebase runs on both NVIDIA and Ascend; 17 model packages maintained
  • In-house OCR pipeline for sensitive content: PSENet detection + CRNN (LSTM) recognition + angle classification, with results matched against a ~20,000-word dictionary using a DFA algorithm

Outcomes

  • ✓ 10+ algorithm capabilities served from one scheduling platform; the GPU and Ascend SDK archives together hold 17 model packages
  • ✓ Unified the vector-search backend on Milvus so the GPU and Ascend lines share one retrieval interface

Data flow

Kafka tasks → pullers ×N (1:1 with partitions) → message layer → routing layer (algo_id ∩ model capability) → model actor pool (×5 per card) → result Kafka; C++ SDKs attached via SWIG; gallery data → Milvus + MySQL

Scope: 機能設計 / 内部設計 / 製造 / 単体試験 / 結合試験 / 運用保守
  • Python
  • C++11
  • Ray
  • Kafka
  • Protobuf
  • gRPC
  • SWIG
  • CMake
  • PyTorch
  • ONNX
  • TensorRT
  • 昇腾 ACL
  • Milvus
  • Redis
  • MySQL
  • MongoDB
  • Docker
  • FFmpeg
Company:People's Zhongke Open company page
China 2020.08 – 2022.08

Cross-modal retrieval offline product (customer-specific)

AI × content safety (customer-specific offline delivery) ・ Sole developer

Details
  • Python
  • Tornado
  • gRPC
  • Milvus
  • Redis
  • NumPy
  • +2

An offline deliverable for customer-specific needs: the developer-facing, many-parameter model API is wrapped into one simple retrieval endpoint and shipped as a Docker image, hiding model paths, feature dimensions and index partitions.

System architecture

Cross-modal retrieval flow and performance iterations
Main retrieval flow Three-modality input Text / image / video base64 or plain text Frame sampling / decode cv2: every 25th frame Video branch only Cross-modal two-tower text.en / image.en Unified 512-dim features Video feature synthesis Average of frame features np.average Milvus gRPC search TopK candidates Multi-condition logic engine AND / OR / NOT / contains Result-set operations RRF re-rank Reciprocal rank fusion 1/(rank_l + rank_r) Batch tagging QueryTags batch TopK tag words Redis cache → JSON Video info / tag 2nd-level cache Tornado async response Four performance iterations · history in API/readme v1 · old Single gRPC query Baseline v2 Concurrent gRPC API Batch request merging v3 · new Logic filter first Filter, then tag v4 · thread Multi-threaded sharded query 100/batch + np.dot similarity

Responsibilities

  • Tornado service accepting text, image and video: video is sampled every 25th frame, encoded by a cross-modal two-tower model into 512-dim features, with frame features averaged
  • gRPC lookups against Milvus return TopK candidates, a multi-condition logic engine (AND / OR / NOT / contains) does set operations, RRF reciprocal-rank fusion re-ranks, tags are attached in batch, and Redis serves as a second-level cache
  • Four performance iterations: single gRPC queries → concurrent batch API → logic filtering first → multi-threaded sharded queries (100 per batch) with np.dot batch matrix products; gallery lookups went from N serial gRPC calls to ⌈N/100⌉ concurrent batches
  • A sibling offline product handles video object filtering: frame extraction → SDK 512-dim features → gRPC search in Milvus → post-processing → Docker delivery

Outcomes

  • ✓ Delivered 3 customer-specific offline editions in total (Docker images)
  • ✓ Replaced per-item similarity comparison with a single matrix dot-product, with threshold cut-off for early exit

Data flow

Three-modality input (text / image / video) → frame sampling → cross-modal encoding (512-dim) → gRPC · Milvus → logic engine → RRF re-rank → tagging → Redis cache → JSON

Scope: 機能設計 / 内部設計 / 製造 / 単体試験 / 結合試験
  • Python
  • Tornado
  • gRPC
  • Milvus
  • Redis
  • NumPy
  • OpenCV
  • Docker
Company:People's Zhongke Open company page
China 2020.08 – 2022.08

CV Data-Processing System

AI × content safety (data platform) ・ Systems Engineer ・ Team 1

Details
  • Python
  • Tornado
  • Vue
  • Vue-Element-Admin
  • MongoDB
  • OpenCV
  • +1

Built to visualize and streamline the data-processing work that deep learning needs, letting team members collect and transform data through a GUI. Scattered personal scripts were consolidated into one system, improving reuse and efficiency.

System architecture

CV data-processing system modules and data flow
L1 UI Vue admin UI one UI instead of personal scripts L2 API Tornado API layer RESTful API · task dispatch L3 Three modules Data collection RESTful link to crawler API collection tasks from the UI Data processing OpenCV image · FFmpeg video scripts resumable file upload Model-defect analysis initial labels + human review (UI) import datasets & model paths L4 Output MongoDB collected data Processed images / video cropping, transforms, etc. PR metrics + PDF report generated by the backend

Responsibilities

  • Data-collection module: integrated crawler services over RESTful APIs, ran collection tasks from the UI, stored results in MongoDB
  • Data-processing module: exposed OpenCV image ops and FFmpeg video ops as Tornado APIs, operable from a Vue UI; designed resumable chunked uploads
  • Model-defect analysis module: GUI for initial labeling and human review; computed PR metrics across datasets/models and auto-generated PDF reports
  • Worked across frontend and backend, including page fixes and UI improvements
Scope: 要件定義 / 外部設計 / 機能設計 / 内部設計 / 製造 / 単体試験 / 結合試験
  • Python
  • Tornado
  • Vue
  • Vue-Element-Admin
  • MongoDB
  • OpenCV
  • FFmpeg
Company:People's Zhongke Open company page
China 2019 – 2020

AI classroom behaviour analysis system

AI × education ・ Full-stack engineer (algorithms, backend, internal training platform) ・ Team 5

Details
  • Python
  • Tornado
  • PyTorch
  • maskrcnn-benchmark
  • face_recognition (dlib)
  • OpenCV
  • +6

Classroom cameras recognise student behaviour (heads up, head down, hand raised, slumped on desk, turned away), face recognition maps it to individual students, and the system offers live alerts and multi-level class reports. I built two subsystems: a school-facing real-time analysis and alert platform, and an internal data-labelling and model-training platform.

System architecture

Real-time analysis & alert platform architecture
Capture layer Streaming & inference layer Data layer Service layer Clients Classroom camera RTSP video stream Demo video stream infinitevideo.sh FFmpeg loops the stream Live path (started when ClassDetailHandler opens a class) FFmpeg RTSP → RTMP relay nginx-rtmp rtmp://…/mytv/ H5 player ckplayer/video.js Start / stop analysis process (nohup + kill, check free GPU memory first) GPU inference process · one per class · front_back_frame ①OpenCV read + frame-drop control Skip frames when the video timestamp lags real time, keeping it real-time ②Mask R-CNN (R-101-FPN) detects students Keep "person" only · conf ≥ 0.7 · de-dup overlapping boxes (0.8) ③ResNet18 behaviour (6 classes) Pad single-person crop to square → 224×224 · conf < 0.95 = "uncertain" ④face_recognition identifies students CNN face location → 128-d feature → match class face gallery ⑤Cross-frame tracking + in-track identity vote 5-second bidirectional-overlap association · most frequent student ID in a track wins Slumped / turned away → crop face, write base64 into alert Write MongoDB realtimewarning Latest frame result per class record_pics Per-frame history pg_classes Class/stream/faces school/class/student School · class · student records students_performances Behaviour results per lesson bf_kaoqin … Customer-specific data Tornado Web :8080 · pymongo Account system Secure cookie · three roles Alert system Poll /getfaster Report views Student / class / grade / school Customer-specific pages Customer A · Customer B Mini-program API xcx.py Partner open API jyd_api.py Amaze UI · ECharts Principal / teacher Browser Mini program Parent / teacher Partner Third-party systems Operations & delivery supervisor keeps 4 processes alive (web · analysis · stream · VPN) | Cython compiles the core algorithm to .so | dongle licensing | Linux + NVIDIA GPU (CUDA)
See 2 more diagrams on the company page →

Responsibilities

  • Two-stage recognition: Mask R-CNN (R-101-FPN) finds students, ResNet18 classifies behaviour into 6 classes (confidence below 0.95 becomes "uncertain") — more accurate than one detector doing both, and changing the behaviour set only means retraining the small classifier
  • Real-time analysis: OpenCV reads the RTSP stream and drops frames whenever the video timestamp lags wall-clock time; one GPU process per class, with an nvidia-smi free-memory check before launch
  • Tracking and identity: wrote my own tracker using bidirectional overlap over a 5-second window; face_recognition (dlib) 128-d features are matched to the class face gallery, and the most frequent ID within a track wins — so identity survives head-down and side-face frames
  • Live alerts for slumping / turning away: the student's face crop (base64) goes into the alert; latest results and per-frame history are stored separately in MongoDB
  • Tornado backend: accounts with three roles, alerts and reports at four levels (student, class, grade, school), a WeChat mini-program API and an open API for third-party platforms; designed API field protocols against the product manager's prototype
  • Analysed behaviour data with scikit-learn and produced weekly, monthly and term reports per student, pushed to parents' WeChat mini program
  • Internal labelling and training platform: video trimming → Mask R-CNN pre-labelling (labelme JSON) → human correction → cropping → dataset building → ResNet18 training (resumable, loss/accuracy curves) → validation; the whole-lesson offline analysis was the prototype of the real-time algorithm
  • Delivery: compiled the core tracking algorithm to .so with Cython, ran under supervisor and used a licence dongle, deployed on-premise at several customers

Outcomes

  • ✓ One codebase serves three customers' custom interfaces, a full third-party open API and the WeChat mini program
  • ✓ Turned data production into web tools: model pre-labelling cuts manual work so non-algorithm staff can take part in labelling

Data flow

Camera RTSP → OpenCV read / frame drop → Mask R-CNN detection → ResNet18 behaviour classification → face recognition + tracking / voting → MongoDB → Tornado pages / live alerts / WeChat mini program

Scope: 外部設計 / 機能設計 / 内部設計 / 製造 / 単体試験 / 結合試験
  • Python
  • Tornado
  • PyTorch
  • maskrcnn-benchmark
  • face_recognition (dlib)
  • OpenCV
  • FFmpeg
  • MongoDB
  • scikit-learn
  • Cython
  • ECharts
  • jQuery
Company:Beijing Yunshangzuo Tech Open company page
China 2020

AI diagnostic online-class monitoring system

AI × education (online classes) ・ Stats-engine backend, admin frontend, part of the algorithm analysis

Details
  • Python
  • Tornado
  • Elasticsearch
  • Redis
  • Vue 2
  • Element UI
  • +4

For online English classes (lessons moved online because of the pandemic): teacher and student audio/video are captured live and structured by ASR / CV / VAD. Red-line behaviours (speaking Chinese, the teacher talking too long, too little student participation, leaving the camera, black screen or drop-out) trigger near-real-time alerts, and teaching-quality reports are compared and ranked by headquarters/branch/campus, course, teacher and student.

System architecture

From capture to alert display
Capture side Ingest · storage · events Structured algorithms (gRPC) Search · analysis · display Browser <video> web-video-capture.js 1 frame/s · audio every 10 s ~30 kbps up · <5% overhead IOAuthProxy Auth service :9001 Aliyun OSS Public cloud MinIO On-premise deployment Notification Hub OSS trigger → MNS ASR WorkerZH/EN speech-to-text CV WorkerFace · pose · expression Sound (VAD)Speech start / end ElasticsearchAs time-series DB Analyse TaskQueue Analyse Enginestats_engine :9002 ReportDB+ ClassDB timetable Management Backend Vue MQTT event queue 1883 / 8083 / 8084 Request token webpwebm Red-line event WebSocket push → alert on teacher page

Responsibilities

  • Stats-engine backend (Tornado, ~1,650 lines, 21 routes): lists, details and history trends for classes, teachers and students, teaching-attitude time series, model-class TopN
  • Elasticsearch queries: bool + terms + range, nested avg sub-aggregations under terms (per-class teacher happiness probability, word count, speech rate), scan/scroll for large result sets; CV and ASR results merged and sorted in the application layer
  • Admin frontend (vue-element-admin 4.4): role-based dynamic route permissions, data dashboard, class/teacher/student lists and details, rankings, trends, filters; ECharts visualisation, Docker and multi-environment config
  • Part of the algorithm analysis: combined speaking share, fluency and positive emotion to find ~30-second "highlight" clips, flagging noise, courseware audio interference and parent presence, for the progress report sent to parents

Data flow

Page-capture SDK → OSS → ASR / CV / VAD workers → Elasticsearch → analysis / stats engine → admin portal + MQTT live alerts

Scope: 機能設計 / 内部設計 / 製造 / 単体試験 / 結合試験
  • Python
  • Tornado
  • Elasticsearch
  • Redis
  • Vue 2
  • Element UI
  • ECharts
  • MQTT
  • Docker
  • Alibaba Cloud
Company:Beijing Yunshangzuo Tech Open company page
China 2020

FaceID face verification and search

AI × education (face verification) ・ Algorithm and service development

Details
  • Python
  • PyTorch
  • MXNet
  • dlib
  • ResNet18
  • Redis
  • +3

Face verification for an online-education customer: confirm from class video that the person on camera is the registered student, with full-gallery, incremental and per-person face search to catch one person with several accounts or several people sharing one.

System architecture

Verification & search inference flow (v3)
Video class video file Random frames resize to 320×240 Face detection YuFaceDetectNet · PyTorch 5 landmarks Affine alignment per face Quality filters (MXNet Gluon · CPU) Occlusion eyes / nose / mouth > 0.5 skip Pose / blur yaw / pitch / roll / blur over limit skip Age youngest (< 17) = the student ResNet18 features PyTorch · cosine similarity Matching & storage First time: enrol feature stored in a Redis hash Later: verify / search global · incremental · per person Licence control + Cython delivery AES quota · SETNX lock · .so

Responsibilities

  • Inference flow: random frame sampling → YuFaceDetectNet detection with 5 landmarks → affine alignment → occlusion / pose-blur / age models filter → ResNet18 features compared by cosine similarity; the youngest face (< 17 years) is taken as the student, excluding parents
  • Mixed-framework inference: PyTorch for detection and features, MXNet Gluon for occlusion, pose and age, all on CPU; iterated from v1.0 to v3.4 (dlib 68-point + Laplacian blur check → new models and alignment → three quality models → rewritten full-gallery search and video validation)
  • Features live in Redis with global, incremental and per-person search; a full pairwise pass is estimated at about 40 million comparisons per the code comments
  • Commercial licence control: call counts, expiry and daily quota are AES-encrypted in Redis, SETNX gives a distributed lock, and the device SN is verified; the core module ships as a Cython-built .so
  • Config is read in the order command line > environment variables > JSON/YAML; Docker deployment pulls model weights from OSS at build time

Data flow

Video → random frames → face detection / alignment → occlusion, pose, age filters → feature extraction → cosine matching / Redis feature store → verification / search result

Scope: 機能設計 / 内部設計 / 製造 / 単体試験 / 結合試験
  • Python
  • PyTorch
  • MXNet
  • dlib
  • ResNet18
  • Redis
  • Cython
  • Docker
  • OSS
Company:Beijing Yunshangzuo Tech Open company page
China 2020

WeChat screenshot recognition (Moments ad-delivery checks)

AI × ad-campaign verification ・ Training, inference, service and deployment

Details
  • Python
  • PyTorch
  • YOLOv5
  • PaddleOCR
  • PaddlePaddle
  • Tornado
  • +3

Automatic recognition of uploaded WeChat screenshots to verify Moments ad delivery: classify the screen type (chat / feed list / post detail) and extract the post time, ad copy, poster ID, QR-code link and like/comment counts.

System architecture

Screenshot recognition flow
Screenshot uploadTornado POST Validate + store in OSStoken · MD5 · nanoid YOLOv5s main detector7 icon classes / QR code Rule-basedBy position Chat · Plus or three-dot icon present Feed list · Camera icon → detect group visibility Other Post detail · QR code position on the detail page PaddleOCR (DB detection + CRNN recognition) Post time by position · copy by position relative to QR Poster ID via the "ID" keyword QR decoding Crop detected box → decode URL Like / comment counts Crop bottom-right → YOLOv5 finds icons → 3-layer CNN reads digits (98.25% validation) Aggregate and return JSON · log all results and latency to Elasticsearch · custom error codes (212 / 218 …)

Responsibilities

  • YOLOv5s as the main detector (7 UI-element classes) with rules to decide the screen type; labelled 10,000+ screenshots and 1,000+ like/comment icons myself, with k-means anchor boxes
  • Post detail: PaddleOCR (PP-OCR, DB detection + CRNN recognition) reads post time, ad copy and poster ID by layout position; QR decoding; the bottom-right is cropped, like/comment icons are detected with YOLOv5 and the digits read by a 3-layer CNN
  • Tornado + PyTorch + PaddlePaddle service: token and MD5 integrity checks, nanoid request tracing, originals in OSS, every result and latency written to Elasticsearch for debugging production errors
  • Upgraded the PP-OCR model release, improving poster-ID and post-time recognition

Outcomes

  • ✓ Digit-reading 3-layer CNN: 98.95% train / 98.25% validation / 84.45% test accuracy

Data flow

Screenshot upload → token / MD5 check → YOLOv5 element detection and classification → PaddleOCR + QR + like-count reading → JSON; all results to Elasticsearch

Scope: 機能設計 / 内部設計 / 製造 / 単体試験 / 結合試験
  • Python
  • PyTorch
  • YOLOv5
  • PaddleOCR
  • PaddlePaddle
  • Tornado
  • Elasticsearch
  • OSS
  • Docker
Company:Beijing Yunshangzuo Tech Open company page

Other projects

  • Live-stream moderation appliance
  • Style-image generation (Midjourney-like)
  • Vehicle behavior analysis
  • Congenital-disease screening from facial images
More projects (on Gitee) ↗

ARCHIVE

Early Work — 2019

Things I built on my own from university through my first year working (around 2019) — the period when I moved from a maths major into ML and web development by self-study. The full site is preserved as-is at /2020/.

2018.10 – 2019.01

Exam-administration & scoring system for music-major entrance exams

Covers drawing lots, check-in, scoring and result statistics, all on the venue LAN. Several USB keypads are told apart with Win32 Raw Input so each judge scores independently; ActiveX controls embed in the web pages, with a spread-limit warning and trimmed-mean scoring.

  • C#
  • ASP.NET MVC 5
  • SQL Server
  • Redis
  • ActiveX
Classroom-analytics product (admin UI)

Classroom-analytics product (admin UI)

For an English-conversation school: a dashboard visualizing student attention and teacher metrics from lesson videos.

  • Vue
  • ECharts
  • Tornado
Data wall / big screen

Data wall / big screen

A big-screen view summarizing metrics across classrooms, teachers and students.

  • Vue
  • ECharts
Per-student report

Per-student report

Aggregated behavior metrics (attendance, smiling, hand-raising, …) per student, generating weekly/monthly reports.

  • scikit-learn
  • Tornado
In-class behavior classification

In-class behavior classification

Image classification of postures — facing front, looking down, turning away, slumping, standing, etc. — trained and applied with ResNet.

  • PyTorch
  • ResNet
Action recognition from video

Action recognition from video

Used 3D-ResNet for classifying human actions that depend on temporal context.

  • PyTorch
  • 3D-ResNet
Keypoint detection (hand-raise / sit-up count)

Keypoint detection (hand-raise / sit-up count)

Human keypoints via Detectron2, used for hand-raise detection and counting sit-ups.

  • Detectron2
  • PyTorch
Facial analysis system

Facial analysis system

A prototype MVC web system doing facial-landmark detection and feature extraction with Dlib.

  • Dlib
  • Tornado
  • MongoDB

Awards ↗ See certificate images

  • 2018 China Undergraduate Mathematical Contest in Modeling — 2nd prize, Hebei province
  • 2018 MCM/ICM (Mathematical Contest in Modeling) — Successful Participant
  • 2018 National Market Research & Analysis Contest — 1st prize, Hebei province
  • 2017 Inner Mongolia Mathematical Modeling Contest — Participant / awarded
  • 2016–2019 Academic scholarship — 3rd class (sophomore–senior), plus a diligence award

My first résumé after graduating (image) — written as a 2019 graduate.

2019 · first-resume.png

Open the 2019 version ↗

The above is only a selection. Study notes, detailed screenshots and my profile at the time are all preserved on the 2020 site.

2020 · resume-master

Open the 2020 version ↗

The résumé I used in my 2023 job search (PDF, Chinese): my work and projects in China from 2019 to 2023.

2023 · jia_rui_2023.pdf

Open the 2023 PDF ↗

The résumé I used in my 2025 job search in Japan (Google Sheets, Japanese).

2025 · Google Sheets

Open the 2025 version ↗

CONTACT

Get in Touch

For work inquiries, please reach me by email.