Auto Colorize GrayScale Image With Deep Learning

deep-learning
tutorial

#1

Auto Colorize Grayed Image With Deep Learning

I. Giới thiệu.

Hôm nay, mình tiếp tục viết bài này với mục đích chia sẻ chút kiến thức về chủ để Colorize grayscale image - Tự động tô màu ảnh với Deep learning. Đây là chủ đề mà mình đang tìm hiểu, khá hay và dự tính đây sẽ là đề tài khóa luận năm 4 của mình :3 . Mình vẫn đang trong giai đoạn tìm hiểu, mong mọi người đóng góp ý, bổ sung.

Chủ đề Colorize grayscale image còn khá mới, hơi ít nghiên cứu. Trước đây, những ảnh đen trắng, ảnh cổ được những người chuyên nghiệp dùng photoshop tô màu lại, tô màu và căn chỉnh từng pixel sao cho hợp lý. Công việc này khá là cực và tốn thời gian. Thời gian để phục chế 1 tấm ảnh có khi mất vài ngày, 1 đoạn film vài phút có thể mất cả tháng trời. Gần đây, 1 số nhà nghiên cứu muốn áp dụng deep learning vào việc này. Kq tuy không được như thủ công nhưng chất lượng khá ổn và tiết kiệm rất nhiều thời gian. Mình nghiên cứu cái này chơi chơi thôi, he he.

II. Một số thuật toán hiện nay.

Mình sẽ điểm qua một vài thuật toán hiện nay, cái này mình nhớ mang máng nên không nhớ tên, chỉ nói qua về ý tưởng thôi :blush: .

1. Đánh dấu màu 1 vài pixel và dùng thuật toán lan ra các pixel khác.

Như hình trên, có thể hiểu ý tưởng của thuật toán là từ ảnh input, vẽ 1 vài màu cơ bản nhằm định hướng cho thuật toán, ý tưởng thuật toán các pixel có độ sáng ngang nhau, gần nhau càng có độ tương tự cao, 2 pixel gần và có độ sáng như nhau sẽ giống nhau về màu.

Ý tưởng cơ bản là như vậy, mình sẽ không đi sâu vào vì mới tìm hiểu, thuật toán còn nhiều chỗ chưa hiểu bản chất nên chưa dám chém :stuck_out_tongue:

2. Dựa vào ảnh có màu tương tự

Thuật toán này mình chưa đọc sâu nên cũng không dám chém, chỉ nêu ra ý tưởng cơ bản thôi

Ý tưởng: chọn ra 1 ảnh (ảnh A) có bố cục tương tự ảnh cần tô (ảnh B), tách màu từ ảnh A, đưa sang ghép với ảnh B, dùng thuật toán để modify lại những chỗ chưa hợp lý .

3. áp dụng Deep learning.

Hai thuật toán trên có những ưu điểm và nhược điểm riêng của nó. Như việc áp dụng thuật toán 1 có thể định hướng màu cho ảnh VD: 1 quả táo có thể màu xanh hoặc đỏ, vàng. Người dùng có thể áp màu vào định hướng cho nó 1 màu cụ thể. Tuy nhiên 2 thuật toán này hơi thủ công trong việc tô màu định hướng và chọn ảnh tương tự.

Vậy nên mình đã tìm hiểu, nghiên cứu thuật toán thứ 3. Đây là thuật toán mình đang làm khóa luận, chi tiết ngay bên dưới nhé.

III. Auto Colorize with Deep Learning.

1. Cơ bản

Ý tưởng cơ bản: Huấn luyện mạng CNN, input là ảnh xám, output là màu sắc.

Thông thường, ảnh là 1 tập hợp các pixel trong đó mỗi pixel gồm 3 thông số RGB, 3 màu cơ bản Red, Green, Blue với cường độ khác nhau sẽ kết hợp tạo ra hàng triệu màu khác nhau. Tuy nhiên không gian màu này không phù hợp cho bài toán này. Ta sẽ chuyển 1 ảnh RGB -> LAB , trong đó L là cường độ sáng ( tức ảnh đen trắng ), A, B là màu sắc. (chi tiết về không gian màu LAB bạn có thể google, mình không giải thích quá chi tiết). Dưới đây là 1 ảnh màu được chuyển sang LAB.

Như ta có thể thấy, L là cường độ sáng, từ đen -> trắng => ảnh đen trắng. A là màu chạy từ xanh -> đỏ, B từ xanh -> vàng.

Như vậy, CNN network của chúng ta sẽ làm nhiệm vụ như hàm dưới đây: Screenshot%20(40)

CNN network: từ L => dự đoán ra A, B

Mạng CNN này cơ bản sẽ gồm các convolution layer chồng lên nhau, mạng không có Dense Layer như mạng Classify. Mạng có ý tưởng cơ bản của Auto encoder. Hình dạng mạng cơ bản như dưới:

Screenshot%20(41)

Mạng có tính chất đối xứng, qua mỗi filter, chiều dữ liệu được giảm dần tới giữa để trích xuất các đặc trưng. từ giữa trở đi, kích thước dữ liệu được tăng dần lên, đối lập và đối xứng với mạng nửa trước. Việc tăng kích thước data lên nhờ thuật toán Upsampling, trái ngước với Conv (stride = 2)

Mình gọi nửa đầu của mạng là encode layers, nửa sau là decode layers. Bạn tự Google thuật toán Upsampling nhé :smiley:

Input là ảnh (256 x 256 x 1) - đường nét, output (256 x 256 x 2 ) - màu sắc -> gộp input và output ta được ảnh đã tô màu.

Một mạng đơn giản sẽ có hình dáng như vậy. Khá dễ hiểu nhỉ. Tuy nhiên nếu chỉ làm như thế, chất lượng sẽ rất kém. Hiện nay có nhiều cải tiến, đã cải thiện chất lượng khá nhiều

2. ý tưởng nâng cấp

a. Thêm thông tin phân loại.

Có một ý tưởng ở đây là ảnh còn được đưa vào 1 mạng pretrain như VGG, Inception, thông tin đầu ra là 1 vector ( 1 x 1000) là thông tin của vật thể chứa trong ảnh. Kết hợp vector này với layer giữa mạng, upsampling về 2 khung AB. Có thể hiểu mạng có thể nhận biết được vật nào trong ảnh sẽ tốt hơn cho việc tô màu. Minh họa dưới

Lưu ý, input hầu hết các pretrain net đều là ảnh 3 chiều, input của chúng ta là ảnh 1 chiều, v nên có thể gấp 3 lần (gán R = G = B = Grayscale Pixel) để được kích thước 3 chiều

b. Thay các layer đầu bằng các layer của mạng Pretrain

Mình nhận thấy mạng VGG phù hợp với mô hình này nên mình đã tận dung, các encode layers chính là các tầng đầu tiên của VGG. Những layer này mình đã cho freeze ( tức train_able = False)

c. áp dụng hyperColumns

Nói qua về ý tưởng của hyper Columns, 1 layer không chỉ nhận tiếp nhận output của tầng ngay trước nó mà nhận output của nhiều tầng trước, trước nữa :3 , output 1 vài tầng dưới được concat (ghép) vào thành input cho tầng tiếp

Screenshot%20(41)

Mình áp dụng hyper column ở đây là ghép các output của encode layers sang decode layers

dưới đây là mô hình mạng mình đang làm.

Như vậy, mạng của mình đã kết hợp cả 3 cách cải tiến trên, cái kí hiệu tròn có dấu + ở giữa nghĩa là “concat” , ám chỉ ghép nối vector bên encode layer sang decode layer, sau đó Upsampling lên, ta được layer có kích thước lớn hơn.

Tạm thời mạng của mình đang ở version này, tuy nhiên do dùng các layer đầu của VGG nên khối lượng parameter khá lớn. => tốc độ train hơi chậm 1 tý. Mình vẫn đang train trên google colab , hy vọng chất lượng tốt hơn. ( Sử dụng Google Colab với Tesla K80 GPU miễn phí),

Dưới đây là thành quả tạm thời mình thu được, :smiley: , tuy chưa hoàn hảo lắm nhưng cũng vui. Mong mọi người góp ý cho mạng được tốt hơn.

download%20(2)


[05/03/2019 10:05] Hi mọi người, Mình muốn nhờ mọi người tư vấn về . . .
#2

Cho em hỏi về dataset, nếu muốn tạo dataset mình sẽ tạo theo hướng cho ảnh màu thành ảnh trắng đen rồi cộng thêm vài phép biến hình đúng hk ạ?


#3

Mình không làm thế, data của mình là ảnh thường, mình sử dụng keras nên có áp dụng generator vào (có các phép biến hình như xoay ảnh, zoom, resize …, xáo trộn ), ảnh sau quá trình đó mới được tách thành 2 phần là chanel L và chanel AB, L mình cho vào input, AB cho vào output


#4

Cho mình xin link github để tham khảo được không bạn?