cardstream
Giới thiệu

Điều cốt lõi là hỏi một lần cho mỗi thẻ, không phải cho mỗi khung hình

Nhận diện thẻ vốn đã chạy tốt. Đưa một tấm thẻ bài cho một mô hình tốt, và tên, set cùng số thẻ sẽ trả về sau khoảng nửa giây. Áp dụng điều đó cho video mới là lúc mọi thứ đổ vỡ: không phải vì kỹ thuật, mà vì khối lượng quá lớn.

Video phần lớn là sự lặp lại. Một tấm thẻ được giơ lên bốn giây ở mười lăm khung hình mỗi giây là sáu mươi bức ảnh của cùng một tấm thẻ, và hỏi endpoint nhận diện sáu mươi lần thì nhận về cùng một câu trả lời sáu mươi lần. Mọi pipeline streaming đơn giản đều làm đúng như vậy, và đó là lý do việc phân tích stream mang tiếng là thứ chỉ một nền tảng được rót vốn mới kham nổi.

cardstream ra đời để xóa bỏ sự lặp lại đó. Nó là một máy trạng thái nhỏ nằm giữa video của bạn và lượt gọi nhận diện, được dựng gần như hoàn toàn từ những tín hiệu nó tự tính ra: cảnh đã đứng yên chưa, đây có phải tấm thẻ vừa nãy không, trong khung hình có thẻ hay không. Lượt gọi chỉ được gửi khi một tấm thẻ thật sự mới đã đứng yên, ngoài ra thì không. Mọi thứ còn lại chạy trên phần cứng bạn đã có sẵn.

Phép tính

Mỗi thẻ một lượt gọi, không phải mỗi khung hình

Một giờ live ở mười lăm khung hình mỗi giây, mức cao nhất mà dự án đã được kiểm chứng, với khoảng một trăm tấm thẻ khác nhau được đưa ra trước ống kính. Có hai cách phân tích cùng một video đó:

Từng khung hình 54.000

lượt gọi nhận diện: mỗi khung hình một lượt, phần lớn là hỏi lại một câu vừa được trả lời xong.

Với cardstream ~100

lượt gọi nhận diện: mỗi thẻ khác nhau một lượt, bất kể tốc độ khung hình của bạn là bao nhiêu và bạn giơ mỗi tấm thẻ lên bao lâu.

Khoảng ít hơn 540 lần số lượt gọi, và khoảng cách đó không phải là trò ảo thuật với con số: nó chính là toàn bộ thiết kế. Giữ yên một tấm thẻ, con số không nhúc nhích. Cho camera chạy nhanh hơn, con số cũng không nhúc nhích. Số lượt gọi đi theo số thẻ bạn đưa lên, chứ không theo số giờ bạn stream.

Duy trì

Ai giữ cho nó chạy

Do những người làm nghề nhận diện xây dựng

cardstream đến từ nhóm đứng sau dịch vụ nhận diện đồ sưu tầm của Ximilar. Các endpoint nhận diện mà nó gọi chính là những endpoint chúng tôi đang vận hành trong production, nên client và dịch vụ do cùng một nhóm người duy trì.

Mọi công việc đều công khai

Toàn bộ gói nằm trên GitHub: máy trạng thái, cả hai kiểu triển khai và giao diện trình duyệt. Không phần nào của logic quyết định bị giấu sau một dịch vụ mà bạn không thể xem xét.

Được test mà không cần mạng

Cả bộ test chạy offline, với các đối tượng giả thay cho tệp mô hình và các lượt gọi HTTP. Fork repo trên một chiếc laptop không có API key, bạn vẫn biết được mình có làm hỏng gì không.

Nguyên tắc

Những điều mã nguồn không được phép quên

  1. Mỗi thẻ một lượt gọi, không phải mỗi khung hình

    Mọi quyết định thiết kế đều bắt đầu từ đây. Tín hiệu nào tính được cục bộ thì chạy trước lượt gọi duy nhất rời khỏi máy.

  2. Logic quyết định chỉ có một bản

    Việc khi nào gọi nằm trong đúng một module. Không rải rác qua một driver, một tầng truyền tải và một giao diện, nơi ba người có thể sửa theo ba kiểu: chỉ một tệp, đọc một lèo là hết.

  3. Driver luôn mỏng

    Lập lịch, ghi log và I/O thuộc về driver; còn thế nào là một tấm thẻ mới thì thuộc về bộ máy. Đổi cách khung hình đi vào không bao giờ âm thầm làm thay đổi thời điểm một lượt gọi được gửi đi.

  4. Không gì được chặn vòng lặp khung hình

    Giải mã, phát hiện, HTTP và ghi đĩa đều chạy ngoài vòng lặp. Một lượt nhận diện chậm chỉ làm rớt một khung hình; nó không bao giờ biến stream của bạn thành một độ trễ ngày càng phình ra.

  5. Không khóa vào nhà cung cấp nào, kể cả chúng tôi

    Lượt gọi nhận diện là một bước có thể thay thế, nằm sau một interface nhỏ. Mọi bộ lọc, cơ chế điều tiết và bộ nhớ đệm vẫn hoạt động nếu bạn trỏ nó sang một nơi hoàn toàn khác.

  6. Mặc định là tự host

    Phần cứng của bạn, key của bạn, video của bạn. Ở chế độ client-side, thứ duy nhất rời khỏi máy là một ảnh cắt cho mỗi thẻ khác nhau, trừ khi bạn chọn lưu buổi live vào tài khoản Ximilar của chính mình.

Ghi chép thực tế

Những điều các tấm thẻ đã dạy chúng tôi

Có những điều trái với trực giác đến mức chúng tôi phải ghi lại ở nơi người đến sau sẽ tìm thấy: trong repo, ngay cạnh đoạn mã mà nó ràng buộc.

Một gợi ý có ích vẫn có thể làm giảm độ chính xác

Báo cho endpoint biết thẻ thuộc game nào sẽ tắt bộ phân loại hệ chữ viết của chính nó, và nó sẽ quay về mặc định là latin, nên một tấm thẻ tiếng Nhật lặng lẽ khớp với bản in tiếng Anh. Điều này đã được đo chứ không phải đoán, và vì thế đặt game mà không đặt hệ chữ viết bị coi là một lỗi.

Ảnh cắt hơi rộng một chút lại khớp tốt hơn

Một đường cắt sát quanh tấm thẻ trông thì đúng nhưng cho kết quả kém hơn. Ảnh cắt được gửi đi có chừa lề một cách có chủ ý, vì một chút bối cảnh thắng một đường mép gọn gàng.

Tự phục hồi tốt hơn giả vờ

Khi một lượt gọi treo quá thời gian chờ, pipeline tự gỡ kẹt và đi tiếp thay vì ngồi đợi một kết quả có thể chẳng bao giờ đến. Giới hạn này được ghi rõ trong repo chứ không bị che đi.

Mã nguồn và đóng góp

Đọc nó, chạy nó, gửi bản vá

Repository là công khai: một gói Python cài đặt được, với các extra độc lập và một giao diện trình duyệt. Trọng số của bộ định vị và của embedding là của chúng tôi, được huấn luyện và công bố theo Apache-2.0 cùng với các bản phát hành. Issue và pull request luôn được chào đón, nhất là các báo cáo từ những buổi live thật, vì chúng làm lộ ra những thứ không dàn test nào bắt được.

Bản thân việc nhận diện là endpoint của Ximilar và sẽ luôn như vậy; đó là phần có cơ sở dữ liệu thẻ đứng sau. Mọi thứ xung quanh nó, bạn được tùy ý thay đổi.

Mã nguồn mở. Tự host. Stream của bạn, hệ thống của bạn.

Không có nền tảng trung gian, không có giấy phép tính theo người dùng: kết nối API của Ximilar hoặc hệ thống nhận diện của riêng bạn, và cardstream chỉ gọi một lượt cho mỗi thẻ khác nhau chứ không phải cho mỗi khung hình. Dù bạn break trên Whatnot, chạy một buổi live kiểu Fanatics Live hay tự livestream bán hàng trên kênh riêng, hãy chạy cardstream ngay tối nay trên chiếc máy bạn đang có.