Đường đất

Tóm tắt

Đường đất là một thử nghiệm cho phép bạn khám phá hình ảnh vệ tinh của Google Earth thông qua cử chỉ. Nhờ sử dụng kết hợp công nghệ học máy, tính năng tối ưu hoá dữ liệu và sức mạnh của thẻ đồ hoạ, thử nghiệm có thể chạy hiệu quả trên trình duyệt web của điện thoại mà không cần máy chủ phụ trợ. Đây là quá trình phát triển của chúng tôi và nhiều phương pháp khác nhau mà chúng tôi đã thử dẫn đến kết quả cuối cùng.

https://g.co/LandLines

Khi nhóm Nghệ thuật dữ liệu tiếp cận tôi về việc khám phá tập dữ liệu hình ảnh trái đất, tôi khá hào hứng. Các hình ảnh rất đẹp, cho thấy tất cả các loại cấu trúc và kết cấu khác nhau, cả do con người tạo ra và tự nhiên. Tôi rất tò mò về cách kết nối tập dữ liệu này. Tôi đã thực hiện nhiều thử nghiệm ban đầu xem xét sự tương đồng của hình ảnh cũng như các cách khác nhau để lọc và sắp xếp chúng.

bố cục tương tự t-sne
Bố cục tương tự t-sne, độ phân giải cao 50 mb

Cùng với một nhóm, chúng tôi tiếp tục quay lại những đường kẻ đẹp mắt và nổi bật trong hình ảnh. Những tuyến này rất dễ phát hiện – đường cao tốc, sông, cạnh núi và lô đất – và chúng tôi đã thiết kế một vài dự án để khám phá những tuyến đường này. Là một nghệ sĩ, tôi được truyền cảm hứng từ những điều tuyệt vời mà bạn có thể làm với các bộ sưu tập đường kẻ - ví dụ như Tác phẩm của Cassandra C Jones với tia chớp và tôi rất hào hứng khi làm việc với tập dữ liệu này.

Phát hiện dòng

Một trong những thách thức ban đầu là làm thế nào để phát hiện các đường trong ảnh. Bạn có thể dễ dàng lấy một mảnh giấy theo dõi, đặt nó lên bản in của một trong những ảnh này và vẽ các đường mà mắt bạn nhìn thấy. Tuy nhiên, trong thuật toán thị giác của máy tính nói chung, việc tìm đường kẻ có xu hướng không hoạt động tốt trên những hình ảnh rất đa dạng.

Tôi đã phát triển một phiên bản trước của tìm kiếm bằng cách vẽ thuật toán trên một dự án bằng Local Projects (Dự án cục bộ) và chúng tôi đã chú thích các đường kẻ cần tìm kiếm bằng tay. Thật thú vị khi vẽ trên tác phẩm nghệ thuật, nhưng tẻ nhạt khi bạn chuyển từ hàng chục hình ảnh sang hàng nghìn hình ảnh. Tôi muốn thử tự động hoá quy trình tìm dòng.

Với những hình ảnh chụp từ trên không này, tôi đã thử các thuật toán phát hiện đường kẻ truyền thống như thuật toán phát hiện cạnh canny của OpenCv nhưng nhận thấy chúng tạo ra các đoạn đường rất gián đoạn hoặc nếu ngưỡng quá thoải mái, thì sẽ tạo vô số đường giả. Ngoài ra, ngưỡng để có được kết quả tốt là khác nhau trên các tập hợp hình ảnh khác nhau và tôi muốn có một thuật toán để tìm một tập hợp các dòng phù hợp nhất quán mà không cần giám sát.

Tôi đã thử nghiệm nhiều thuật toán phát hiện đường kẻ, bao gồm cả các thuật toán gần đây như gPb (PDF). Mặc dù tạo ra kết quả đáng kinh ngạc nhưng lại mất vài phút để chạy trên mỗi hình ảnh. Cuối cùng, tôi đã giải quyết xong phần Phát hiện cạnh rừng có cấu trúc, một thuật toán đi kèm với openCV.

Sau khi có "hình ảnh đường kẻ" tốt, tôi vẫn gặp vấn đề khi thực sự lấy các đường kẻ và xác định các dòng riêng lẻ với nhau – tức là làm cách nào để lấy dữ liệu đường quét này và biến nó thành vectơ. Thông thường, khi xem xét các vấn đề về thị giác trên máy tính, tôi sẽ nghiên cứu imageJ, một môi trường xử lý hình ảnh nguồn mở dựa trên Java được sử dụng bởi các nhà khoa học và nhà nghiên cứu có một hệ sinh thái lành mạnh gồm các trình bổ trợ. Tôi đã tìm thấy một trình bổ trợ có tên là phát hiện đỉnh, giúp chụp hình ảnh cường độ và biến hình ảnh đó thành một tập hợp các đoạn thẳng. (Xin lưu ý thêm rằng, tôi cũng thấy mã phát hiện và gắn nhãn cạnh này trong Matlab rất hữu ích).

Hình ảnh có các đoạn được phát hiện
Hình ảnh có các đoạn được phát hiện

Không máy chủ

Tôi cũng muốn xem liệu có thể tạo một ứng dụng trực quan hoá dữ liệu mà về cơ bản là không có máy chủ hay không, trong đó, công việc so khớp và kết nối khó khăn sẽ diễn ra ở phía máy khách. Tôi thường làm việc trong openFrameworks, một khung C++ để lập trình mẫu quảng cáo, và bên cạnh dự án nút thỉnh thoảng mà tôi chưa thực hiện nhiều mã lập trình phía máy chủ. Tôi tò mò muốn biết liệu có thể thực hiện tất cả các bước tính toán ở phía máy khách và chỉ sử dụng máy chủ để phân phát dữ liệu json và hình ảnh hay không.

Đối với ứng dụng vẽ, so khớp là một thao tác rất phức tạp. Khi bạn vẽ một đường, chúng tôi cần tìm kết quả phù hợp nhất trong số hơn hàng chục nghìn phân đoạn đường thẳng. Để tính khoảng cách giữa các lần vẽ, chúng tôi sử dụng chỉ số từ trình nhận dạng cử chỉ đồng đô la, trong đó có nhiều phép tính khoảng cách. Trước đây, tôi đã sử dụng tính năng tạo luồng và các thủ thuật khác, nhưng để khiến nó hoạt động theo thời gian thực trên thiết bị khách (bao gồm cả điện thoại di động), tôi cần một thứ tốt hơn. Tôi đã xem xét cây chỉ số để tìm những người lân cận gần nhất/gần nhất và tôi đã chọn cây điểm thuận lợi (cách triển khai JavaScript). Về cơ bản, cây điểm thuận lợi được xây dựng dựa trên một tập hợp dữ liệu và chỉ số khoảng cách. Đồng thời, khi bạn đưa một dữ liệu mới vào, cây này sẽ nhanh chóng cung cấp cho bạn một danh sách các giá trị gần nhất. Lần đầu tiên tôi chứng kiến công việc này ngay lập tức trên điện thoại di động, tôi thấy choáng váng. Một trong những lợi ích to lớn của việc triển khai cây điểm lợi thế cụ thể này là bạn có thể lưu cây này sau khi tính toán và tiết kiệm chi phí tính toán cây này.

Kết quả gần nhất Kết quả đã rút ra
Ví dụ về kết quả từ cây điểm thuận lợi, dữ liệu đầu vào được vẽ nằm ở bên phải và kết quả gần nhất nằm ở bên trái.

Một thách thức khác khi thực hiện việc này mà không cần máy chủ là tải dữ liệu trên thiết bị di động. Đối với bản vẽ, dữ liệu phân đoạn cây và dòng vượt quá 12 MB và hình ảnh khá lớn, chúng tôi muốn trải nghiệm có cảm giác nhanh chóng và thích ứng, đồng thời mục tiêu là cố gắng giữ cho tệp tải xuống có kích thước nhỏ. Giải pháp của chúng tôi là tải dần dữ liệu. Trong ứng dụng vẽ, chúng tôi chia tập dữ liệu cây điểm lợi thế thành 5 phần và khi ứng dụng tải, ứng dụng chỉ tải đoạn đầu tiên và sau đó cứ 10 giây sẽ tải một đoạn dữ liệu khác trong nền. Vì vậy, về cơ bản, ứng dụng sẽ hoạt động hiệu quả hơn trong phút đầu tiên sử dụng. Ứng dụng kéo cũng đã nỗ lực lưu hình ảnh vào bộ nhớ đệm để khi bạn kéo, hình ảnh mới sẽ được tải trong nền.

Cuối cùng, một điều tôi thấy khó hơn mong đợi là tạo trình tải trước cho cả hai ứng dụng, vì vậy bạn có thể hiểu được độ trễ ban đầu vì tải dữ liệu. Tôi đã sử dụng lệnh gọi lại tiến trình trên các yêu cầu ajax và ở phía pixi.js, đã kiểm tra các hình ảnh đang tải không đồng bộ thực sự đã tải và sử dụng hình ảnh đó để thúc đẩy thông báo tải trước.

Đường kết nối

Đối với thao tác kéo, tôi muốn tạo một đường vô tận từ các đường chúng tôi tìm thấy trong tính năng phát hiện cạnh. Bước đầu tiên là lọc các đường khỏi thuật toán phát hiện đường kẻ và xác định các đường dài bắt đầu trên một cạnh và kết thúc ở một trong ba cạnh còn lại.

Đường kẻ tốt để kết nối được đánh dấu bằng màu đỏ Đường kẻ tốt để kết nối được đánh dấu bằng màu đỏ
Các đường phù hợp để kết nối được đánh dấu bằng màu đỏ

Sau khi có một tập hợp các đường dài (hoặc sử dụng một thuật ngữ chính xác hơn, hình nhiều đường, một tập hợp các điểm được kết nối) để kết nối chúng, tôi đã chuyển đổi các đường thẳng này thành một tập hợp các thay đổi về góc. Thông thường, khi nghĩ về một hình nhiều đường, bạn hãy hình dung nó là một tập hợp các điểm: điểm a nối với điểm b nối với điểm c. Thay vào đó, bạn có thể coi đường thẳng này là một tập hợp các thay đổi về góc: Di chuyển về phía trước và xoay một khoảng, di chuyển về phía trước và xoay một khoảng. Một cách hay để trực quan hoá vấn đề này là xem xét máy uốn dây. Máy này lấy một đoạn dây và thực hiện việc xoay khi đang được ép lên. Hình dạng của bản vẽ là do việc xoay.

Nếu bạn coi đường thẳng đó là góc thay đổi chứ không phải là điểm, thì việc kết hợp các đường thành một đường lớn hơn với ít gián đoạn hơn sẽ dễ dàng hơn – thay vì ghép các điểm về cơ bản, bạn đang thêm các thay đổi về góc tương đối. Để thêm một đường, bạn lấy góc hiện tại của đường chính aimage0 và thêm vào đó các thay đổi tương đối của đường bạn muốn thêm.

Xin lưu ý thêm rằng, tôi đã sử dụng kỹ thuật chuyển đổi một đường thẳng thành một tập hợp các thay đổi góc để khai thác nghệ thuật. Bạn có thể làm cho các bản vẽ "không cuộn" tương tự như cách dây có thể cuộn và làm giãn ra. Một số ví dụ: một, hai, ba

Phương pháp tính toán góc này cho phép chúng ta điều hướng đường thẳng khi kéo – chúng ta tính toán độ lệch góc chính từ vị trí mà chúng ta muốn đến và tìm kiếm một hình ảnh giúp đường thẳng đi đúng hướng. Đây là vấn đề về việc suy nghĩ một cách tương đối.

Cuối cùng, tôi chỉ muốn nói rằng đây là một dự án thực sự thú vị khi được tham gia. Thật thú vị với một nghệ sĩ khi được yêu cầu sử dụng tập dữ liệu đáng yêu như những hình ảnh này và tôi rất vinh dự được nhóm Data Arts hỗ trợ. Tôi hy vọng bạn sẽ thích thử nghiệm với tính năng này!