Nhận dạng chữ số viết tay


22

Nhiệm vụ của bạn là đọc một hình ảnh có chứa một chữ số viết tay, nhận ra và in ra chữ số đó.

Đầu vào: Một hình ảnh thang độ 28 * 28, được đưa ra dưới dạng một chuỗi gồm 784 số văn bản thuần từ 0 đến 255, cách nhau bởi khoảng trắng. 0 có nghĩa là màu trắng và 255 có nghĩa là màu đen.

Đầu ra: Chữ số được công nhận.

Ghi điểm: Tôi sẽ kiểm tra chương trình của bạn với 1000 hình ảnh từ tập huấn luyện cơ sở dữ liệu MNIST (được chuyển đổi thành dạng ASCII). Tôi đã chọn hình ảnh (ngẫu nhiên), nhưng sẽ không công bố danh sách. Bài kiểm tra phải hoàn thành trong vòng 1 giờ và sẽ xác định n- số câu trả lời đúng.
nphải có ít nhất 200 để chương trình của bạn đủ điều kiện. Nếu kích thước của mã nguồn của bạn là s, thì điểm của bạn sẽ được tính là s * (1200 - n) / 1000. Điểm số thấp nhất chiến thắng.

Quy tắc:

  • Chương trình của bạn phải đọc hình ảnh từ đầu vào tiêu chuẩn và ghi chữ số vào đầu ra tiêu chuẩn
  • Không có chức năng OCR tích hợp
  • Không có thư viện của bên thứ ba
  • Không có tài nguyên bên ngoài (tệp, chương trình, trang web)
  • Chương trình của bạn phải có thể chạy được trong Linux bằng phần mềm có sẵn miễn phí (Wine có thể chấp nhận nếu cần thiết)
  • Mã nguồn chỉ được sử dụng các ký tự ASCII
  • Vui lòng gửi số điểm ước tính của bạn và số phiên bản duy nhất mỗi khi bạn sửa đổi câu trả lời của mình

Ví dụ đầu vào:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 18 18 18 126 136 175 26 166 255 247 127 0 0 0 0 0 0 0 0 0 0 0 0 30 36 94 154 170 253 253 253 253 253 225 172 253 242 195 64 0 0 0 0 0 0 0 0 0 0 0 49 238 253 253 253 253 253 253 253 253 251 93 82 82 56 39 0 0 0 0 0 0 0 0 0 0 0 0 18 219 253 253 253 253 253 198 182 247 241 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 80 156 107 253 253 205 11 0 43 154 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 1 154 253 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 139 253 190 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 190 253 70 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35 241 225 160 108 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 81 240 253 253 119 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 45 186 253 253 150 27 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 93 252 253 187 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 249 253 249 64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 130 183 253 253 207 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 148 229 253 253 253 250 182 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 24 114 221 253 253 253 253 201 78 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 66 213 253 253 253 253 198 81 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 171 219 253 253 253 253 195 80 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 55 172 226 253 253 253 253 244 133 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 136 253 253 253 212 135 132 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Nhân tiện, nếu bạn thêm dòng này vào đầu vào:

P2 28 28 255

bạn sẽ có được một tệp hình ảnh hợp lệ ở định dạng pgm, với các màu bị đảo ngược / phủ định.

Đây là những gì nó trông giống với màu sắc chính xác: chữ số

Ví dụ đầu ra:

5

Bảng xếp hạng:

No.| Name         | Language   | Alg | Ver | n   | s   |  Score
----------------------------------------------------------------
 1 | Peter Taylor | GolfScript | 6D  | v2  | 567 | 101 |  63.933
 2 | Peter Taylor | GolfScript | 3x3 | v1  | 414 | 207 | 162.702

Liên quan, nhưng không hoàn toàn giống nhau (không phải là một thách thức, nhưng rất hữu ích cho việc tìm mã latex): detexify.kirelabs.org/ classify.html . Nó cũng nhận ra con số.
Justin

1
Chúng ta có thể giả định một cách an toàn rằng chúng ta chỉ cần xem xét các pixel đen không? > 127 pixel? Chúng ta có thể giả định cái gì?
Justin

2
Đặc biệt nếu đây là một câu hỏi golf mã, xin vui lòng hạn chế đầu vào đen và trắng. Mọi người làm cho toàn bộ sự nghiệp của họ ra khỏi việc giải quyết vấn đề này mà không phải đếm các ký tự trong mã của họ. Không xuất bản những nhân vật bạn đã chọn là một cách để ngăn chặn gian lận, và biến nó thành một trò đánh bạc ... và cho rằng thật vô lý khi mọi người viết AI ở đây, điều thú vị là làm một số heuristic kỳ lạ và sau đó thấy tốt như thế nào Nó làm trong giải đấu so với cạnh tranh.
Bác sĩ Rebmu

3
@aditsu Vâng, bất cứ ai cũng có thể làm điều đó kém. Nhưng bạn không yêu cầu nó được thực hiện kém, bạn muốn ai đó "chiến thắng" trong một cuộc thi, trong đó số lượng nhân vật được đo. Tôi nghĩ rằng giảm bớt vấn đề xuống một chút là thực tế hơn cho người giải câu đố sở thích. Hạn chế đầu vào có vẻ là một khởi đầu tốt để làm cho nó hợp lý. Tôi đề nghị vượt qua đầu vào để nói rằng đó là màu đen và trắng.
Bác sĩ Rebmu

2
@ Dr.Rebmu và bất kỳ ai khác muốn đầu vào đen trắng: thoải mái chuyển đổi đầu vào bằng cách sử dụng ngưỡng như 128. Tôi đã kiểm tra và các chữ số vẫn có thể nhận ra (bằng não của tôi). Bạn cũng có thể thử các ngưỡng khác, chúng có thể cho kết quả tốt hơn.
aditsu

Câu trả lời:


6

GolfScript 6D (v2: điểm ước tính 101 * 0,63 ~ = 64)

Đây là một cách tiếp cận rất khác với câu trả lời GolfScript trước đây của tôi, vì vậy sẽ có ý nghĩa hơn khi đăng nó dưới dạng một câu trả lời riêng biệt ở v1 hơn là chỉnh sửa câu trả lời khác và thực hiện v2 này.

~]:B;569'!EM,R.==|%NL2+^=1'{{32-}%95{base}:^~\^}:&~2/{~B=<}%2^10'#]8Y,;KiZfnnRsDzPsvQ!%4C&..z,g,$m'&=

Bị đánh cắp

~]:B;
[30 183 21 378 31 381 7 461 113 543 15 568]
2/{~B=<}%2base
7060456576664262556515119565486100005262700292623582181233639882 10base
=

Giải trình

Vấn đề thô là phân loại các điểm trong không gian 784 chiều. Một cách tiếp cận tiêu chuẩn là giảm kích thước: xác định một tập hợp con kích thước nhỏ cung cấp đủ sức mạnh phân biệt để thực hiện phân loại. Tôi đã đánh giá từng thứ nguyên và từng ngưỡng có thể để xác định 18 cặp (thứ nguyên, phạm vi ngưỡng) có vẻ hứa hẹn. Sau đó, tôi chọn trung tâm của từng phạm vi ngưỡng và đánh giá các tập hợp con gồm 6 phần tử của 18 cặp. Cuối cùng tôi đã tối ưu hóa ngưỡng cho từng chiều của phép chiếu 6 chiều tốt nhất, cải thiện độ chính xác của nó từ 56,3% lên 56,6%.

Vì phép chiếu có 6 chiều và với mỗi chiều tôi áp dụng một ngưỡng đơn giản, bảng tra cứu cuối cùng chỉ cần 64 yếu tố. Nó dường như không đặc biệt có thể nén được, do đó, việc chơi gôn chính là chuyển đổi cơ sở cả hai bảng tra cứu (danh sách các thứ nguyên và ngưỡng; và vectơ nửa không gian thành bản đồ chữ số) và chia sẻ mã chuyển đổi cơ sở.


7
Bạn đã mất tôi tại "không gian 784 chiều" ;-)
Chấn thương kỹ thuật số

Tôi sợ có một sai lầm ở đâu đó, tôi chỉ nhận được 37 câu trả lời đúng. Ngoài ra, bạn đang làm mọi thứ hơi mơ hồ, bạn có thể vui lòng thêm (1) và (2) (như tôi đã làm) hoặc một cái gì đó tương tự như tiêu đề của bạn không?
aditsu

@aditsu, lỗi logic đơn giản. Bây giờ đã sửa.
Peter Taylor

Vì vậy, về cơ bản, bạn đang lấy mẫu 6 pixel "có liên quan", mỗi pixel có một ngưỡng khác nhau, thu được 6 bit?
aditsu

@aditsu, chính xác.
Peter Taylor

5

GolfScript 3x3 (v1: điểm ước tính 207 * 0.8 ~ = 166)

~]28/10:?/{zip?/{[]*0-!!}/}%2{base}:^~'"yN(YZ5B 7k{&w,M`f>wMb>}F2A#.{E6T9kNP_s 3Q?V`;Z\'C-z*kA5M@?l=^3ASH/@*@HeI@A<^)YN_bDI^hgD>jI"OUWiGct%7/U($*;h*<"r@xdTz6x~,/M:gT|\\:#cII8[lBr<%0r&y4'{32-}%95^?^2/{))*~}%=

Hoặc trong tổng quan,

~]28/10:?/{zip?/{[]*0-!!}/}%2{base}:^~'MAGIC STRING'{32-}%95^?^2/{))*~}%=

Giải trình

Cách tiếp cận của tôi ở mức cao là:

  1. Ngưỡng các pixel: nếu pixel ở trên t1thì đặt nó thành 1; mặt khác để 0.
  2. Nhóm các pixel. Ban đầu, tôi đã phá lưới 28x28 thành lưới 4 x 4 (mỗi subgrid là 7x7 pixel); nhưng phá vỡ nó thành một lưới 3x3 (các lớp con là 10 x10, 10 x 8 hoặc 8 x 8 pixel) giúp giảm đáng kể kích thước bảng tra cứu trong khi giảm tỷ lệ chính xác từ khoảng 56% xuống còn khoảng 40%.
  3. Tính tổng các pixel trong mỗi nhóm và ngưỡng lại: nếu số pixel được đặt ở trên t2thì điểm số của nhóm là 1; khác như 0.
  4. Thực hiện tra cứu bảng theo vectơ của điểm nhóm. (Bảng được nén bằng mã hóa độ dài chạy và thủ thuật chuyển đổi cơ sở tiêu chuẩn. Hầu hết các lựa chọn t1t2để lại từ 50% đến 63% của bảng dưới dạng giá trị "không quan tâm", có thể kết hợp với các giá trị liền kề để tăng độ dài chạy, chiều dài chạy trung bình trong bảng v1 của tôi là 3,6).

Nó chỉ ra rằng cài đặt t1=t2=0, mặc dù không tối ưu, nhưng không vượt quá các giá trị tốt nhất t1t2về độ chính xác; là khá tốt về khả năng nén bảng; và cho phép tôi kết hợp hai thao tác ngưỡng thành []*0-!!(làm phẳng mảng 2D thành 1D; xóa 0s; kiểm tra xem nó có trống không).

Bảng tra cứu đưa ra ứng cử viên có khả năng nhất cho vectơ cho điểm của nhóm. Cũng có thể cải thiện điểm số bằng cách xác định các mục trong bảng có thể thay đổi sao cho độ nén được cải thiện của bảng vượt xa độ chính xác giảm.


Thật tuyệt vời, tôi đã có một ý tưởng tương tự nhưng không tưởng tượng được nó có thể nén tốt đến vậy. Bây giờ tôi nghĩ tôi cần nhấn mạnh hơn vào độ chính xác: p nhưng tôi không có kế hoạch thay đổi nó.
aditsu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.