Nơi làm việc của tôi đang có một thử thách mã 2 tuần liên quan đến việc tạo ra một thuật toán để tái tạo 100 bức tranh Bob Ross mẫu càng sát càng tốt với một số hạn chế:
- "Tranh" được gửi dưới dạng tệp JSON chứa màu nền và một loạt "nét cọ".
- Nét cọ có điểm bắt đầu, điểm kết thúc, bán kính và màu sắc.
- Có giới hạn 500 nét trên mỗi bức tranh.
- Tất cả 100 bức tranh tham khảo có cùng kích thước và tỷ lệ khung hình chính xác: 450x337.
Máy chủ "vẽ" mỗi lần gửi và sau đó thực hiện một khác biệt cho mỗi pixel với bức tranh tham chiếu. Mỗi pixel trong bức tranh được gửi được ghi trên phạm vi 0-1 vô hướng dựa trên mức độ tương tự với giá trị của pixel nguồn và điểm cho bức tranh là trung bình của tất cả các điểm pixel. Những người điều hành cuộc thi đã phát hành các thư viện cho cả vẽ và ghi hình ảnh có thể chạy trên dòng lệnh trong MacOS / Linux.
Tôi cảm thấy vấn đề này có thể tuân theo ML vì chúng tôi có cơ chế chấm điểm chính xác cho từng lần thử mà thuật toán thử. Tạo và ghi một bức tranh chỉ mất khoảng 200ms. Thật không may, tôi chủ yếu chỉ là một fanboy ML (tôi nghe rất nhiều podcast) và không biết tôi nên mô hình hóa vấn đề như thế nào.
Để thuật toán tạo ra 500 nét hoàn toàn ngẫu nhiên và sau đó chấm điểm đầu ra sẽ mất mãi mãi để hội tụ một cái gì đó hữu ích. Tôi đã nghĩ đến việc giới hạn không gian màu của các nét thành một bộ 64 màu thường xuyên nhất trong mỗi bức tranh (bằng cách chạy biểu đồ trước khi tôi bắt đầu vẽ) và cũng giới hạn lựa chọn kích thước cọ của thuật toán.
Đối với bản ghi, chỉ cần gửi một hình ảnh là một trường rắn có màu phổ biến nhất đã mang lại cho tôi điểm 65%. Các thuật toán hiện đang chiến thắng chủ yếu chỉ là chuyển đổi các bức tranh thành các lưới và đặt một chấm màu trung bình trong mỗi khu vực lên trên mỗi khu vực.