Thứ năm, 13/09/2018 | 00:00 GMT+7

Cách thực hiện chuyển kiểu neural với Python 3 và PyTorch


Giới thiệu

Học máy, hay ML, là một lĩnh vực con của AI tập trung vào các thuật toán học mô hình từ dữ liệu.

Ta hãy xem xét một ứng dụng thực tế của học máy trong lĩnh vực Thị giác máy tính được gọi là truyền kiểu thần kinh . Vào năm 2015, các nhà nghiên cứu đã sử dụng kỹ thuật học sâu để tạo ra một thuật toán trộn lẫn nội dung của một hình ảnh với phong cách nghệ thuật của một hình ảnh khác. Thuật toán mới này đã tạo ra những hình ảnh độc đáo, nhưng cũng cung cấp một góc nhìn độc đáo về cách hệ thống hình ảnh của ta có thể suy ra các khái niệm nghệ thuật mới.

Như tên gọi của nó, truyền kiểu thần kinh dựa vào mạng nơ-ron để thực hiện nhiệm vụ này. Chi tiết chính xác của việc triển khai này nằm ngoài phạm vi của hướng dẫn này, nhưng bạn có thể tìm hiểu thêm trong bài đăng blog này về chuyển giao phong cách nghệ thuật hoặc từ bản thảo nghiên cứu ban đầu .

Trong hướng dẫn này, bạn sẽ áp dụng chuyển kiểu thần kinh bằng cách sử dụng Jupyter Notebook và dòng lệnh Linux để chụp ảnh như sau:

Hình ảnh của Rocket Sammy

và biến đổi nó bằng cách áp dụng phong cách nghệ thuật của "Đêm đầy sao" của Vincent van Gogh để tạo ra hình ảnh này:

Hình ảnh về phong cách Starry night được chuyển đến Rocket Sammy

Yêu cầu

Để hoàn thành hướng dẫn này, bạn cần :

Làm việc với các mô hình học máy có thể tốn nhiều bộ nhớ, vì vậy máy của bạn phải có bộ nhớ ít nhất 8GB để thực hiện một số phép tính trong hướng dẫn này.

Bước 1 - Cài đặt Phụ thuộc và Sao chép Kho lưu trữ GitHub của PyTorch-Style-Transfer

Trong hướng dẫn này, ta sẽ sử dụng triển khai open-souce của truyền kiểu thần kinh do Hang Zhang cung cấp có tên là PyTorch-Style-Transfer . Việc triển khai cụ thể này sử dụng thư viện PyTorch .

Kích hoạt môi trường lập trình của bạn và cài đặt PyTorch và gói torchvision bằng lệnh sau:

  • pip install http://download.pytorch.org/whl/cu75/torch-0.1.12.post1-cp35-cp35m-linux_x86_64.whl
  • pip install torchvision

Lưu ý đối với hướng dẫn này, ta cần torch-0.1.12_2 .

Để tránh làm lộn xộn folder chính của bạn với các file , hãy tạo một folder mới có tên style_transfer và sử dụng nó làm folder làm việc của bạn:

  • mkdir style_transfer
  • cd style_transfer

Tiếp theo, sao chép repository PyTorch-Style-Transfer vào folder làm việc của bạn bằng git clone . Bạn có thể tìm hiểu thêm về Git trong loạt bài hướng dẫn Git này .

  • git clone https://github.com/zhanghang1989/PyTorch-Style-Transfer.git

Tác giả của repository này đã đặt mã mà ta sẽ sử dụng trong folder experiments của repository PyTorch-Style-Transfer , vì vậy hãy chuyển sang folder này sau khi tất cả các file đã được nhân bản:

  • cd PyTorch-Style-Transfer/experiments

Hãy xem nội dung của folder experiments :

  • ls

Bạn sẽ thấy các folder sau:

Output
camera_demo.py dataset images main.py models net.py option.py utils.py

Trong hướng dẫn này, bạn sẽ làm việc với các images/ folder chứa các hình ảnh có sẵn và tập lệnh main.py , được sử dụng để áp dụng chuyển kiểu thần kinh cho hình ảnh của bạn.

Trước khi chuyển sang phần tiếp theo, bạn cũng cần download mô hình học sâu được đào tạo trước cần thiết để chạy truyền kiểu thần kinh. Các mô hình này có thể lớn và do đó không thích hợp để lưu trữ trên GitHub, vì vậy tác giả cung cấp một tập lệnh nhỏ để tải file xuống. Bạn sẽ tìm thấy tập lệnh tại models/download_model.sh .

Đầu tiên, hãy thực thi tập lệnh:

  • chmod +x ./models/download_model.sh

Sau đó, thực thi tập lệnh để download mô hình:

  • ./models/download_model.sh

Bây giờ mọi thứ đã được download , hãy sử dụng các công cụ này để biến đổi một số hình ảnh.

Bước 2 - Chạy thử nghiệm chuyển kiểu đầu tiên của bạn

Để minh họa cách truyền kiểu thần kinh hoạt động, hãy bắt đầu bằng cách sử dụng ví dụ do tác giả của repository PyTorch-Style-Transfer . Vì ta cần hiển thị và xem hình ảnh, nên sẽ thuận tiện hơn khi sử dụng sổ ghi chép Jupyter.

Chạy Jupyter từ terminal của bạn:

  • jupyter notebook

Sau đó truy cập Jupyter theo các hướng dẫn được trình bày.

Sau khi Jupyter được hiển thị, hãy tạo sổ ghi chép mới bằng cách chọn Mới> Python 3 từ menu kéo xuống trên cùng bên phải:

 Notebook  Jupyter

Thao tác này sẽ mở ra một sổ ghi chép mới, nơi bạn có thể nhập mã của bạn .

Ở đầu sổ ghi chép, hãy thêm mã sau để tải các thư viện cần thiết.

Sổ tay
import torch import os import subprocess from IPython.display import Image from IPython.display import display 

Cùng với torch , ta cũng đang nhập khẩu các thư viện chuẩn ossubprocess , mà ta sẽ sử dụng để chạy các script Python trực tiếp từ notebook Jupyter. Ta cũng bao gồm thư viện IPython.display , cho phép ta hiển thị hình ảnh trong sổ ghi chép Jupyter.

Lưu ý : ALT+ENTER (hoặc SHIFT+ENTER trên macOS) để chạy mã và chuyển sang khối mã mới trong sổ ghi chép của bạn. Làm điều này sau mỗi khối mã trong hướng dẫn này để xem kết quả của bạn.

Ví dụ được cung cấp trong file README của repository PyTorch-Style-Transfer sử dụng các hình ảnh có sẵn trong folder images/ và script main.py Bạn cần cung cấp ít nhất năm đối số để chạy tập lệnh main.py :

  • Đường dẫn đến hình ảnh nội dung (nằm trong /images/content ).
  • Đường dẫn đến hình ảnh kiểu (nằm trong /images/21styles ).
  • Đường dẫn đến mô hình GAN (Generative Adversarial Network) được đào tạo trước được sử dụng để thực hiện chuyển kiểu (nằm trong /models ).
  • Đường dẫn và tên của hình ảnh kết quả .
  • Các mô hình học sâu chạy nhanh hơn nhiều trên GPU. Nếu bạn có thì hãy chỉ định tham số --cuda=1 , nếu không thì sử dụng --cuda=0 .

Để chạy mã truyền kiểu thần kinh, ta sẽ chỉ định các đối số bắt buộc và sử dụng thư viện quy subprocess để chạy lệnh trong shell .

Đầu tiên, hãy xác định đường dẫn đến folder làm việc của ta . Ta sẽ lưu trữ trong một biến có tên là workingdir :

Sổ tay
# define the path to the working directory experiment_dir = 'style_transfer/PyTorch-Style-Transfer/experiments' workingdir = '{}/{}'.format(os.environ['HOME'], experiment_dir) 

Ta sẽ sử dụng biến này trong suốt mã của bạn khi ta trỏ đến hình ảnh và các file khác.

Bây giờ, hãy xác định đường dẫn đến tập lệnh main.py , cũng như danh sách các đối số mà ta sẽ sử dụng làm đầu vào cho lần chạy thử nghiệm này. Ta sẽ chỉ định rằng hình ảnh nội dung là venice-boat.jpg , hình ảnh kiểu là starry_night.jpg và ta sẽ lưu kết quả của quá trình chuyển kiểu thần kinh của ta vào một file có tên là test.jpg :

Sổ tay
# specify the path to the main.py script path2script = '{}/main.py'.format(workingdir)  # specify the list of arguments to be used as input to main.py args = ['eval',         '--content-image',         '{}/images/content/venice-boat.jpg'.format(workingdir),         '--style-image',         '{}/images/21styles/starry_night.jpg'.format(workingdir),         '--model',         '{}/models/21styles.model'.format(workingdir),         '--output-image',         '{}/test.jpg'.format(workingdir),         '--cuda=0'] 

Trước khi chạy ví dụ thử nghiệm, bạn có thể xem nhanh nội dung và hình ảnh kiểu mà bạn đã chọn cho ví dụ này bằng cách thực thi mã này trong sổ ghi chép của bạn:

Sổ tay
content_image = Image('{}/images/content/venice-boat.jpg'.format(workingdir)) style_image = Image('{}/images/21styles/starry_night.jpg'.format(workingdir)) display(content_image) display(style_image) 

Bạn sẽ thấy những hình ảnh này được hiển thị trong kết quả :

Hình ảnh nội dung cho ví dụ đầu tiên của bạn về chuyển kiểu thần kinh

Hình ảnh kiểu cho ví dụ đầu tiên của bạn về chuyển kiểu thần kinh

Cuối cùng, nối lời gọi đến main.py và danh sách các đối số của nó và chạy nó trong shell bằng cách sử dụng hàm subprocess.check_output :

Sổ tay
# build subprocess command cmd = ['python3', path2script] + args  # run the command x = subprocess.check_output(cmd, universal_newlines=True) 

Tùy thuộc vào dung lượng bộ nhớ có sẵn trên máy của bạn, quá trình này có thể mất một hoặc hai phút để chạy. Sau khi hoàn tất, bạn sẽ thấy file test.jpg trong folder làm việc của bạn . Từ sổ ghi chép Jupyter, bạn có thể sử dụng các lệnh ma thuật Ipython để hiển thị nội dung của folder làm việc của bạn trong sổ ghi chép Jupyter:

Sổ tay
!ls $workingdir 

Ngoài ra, bạn có thể sử dụng ls trong terminal của bạn . Dù bằng cách nào, bạn sẽ thấy kết quả sau:

Output
__pycache__ dataset main.py myutils option.py camera_demo.py images models net test.jpg

Bạn sẽ thấy một file mới có tên test.jpg , file này chứa kết quả của việc chuyển kiểu thần kinh bằng cách sử dụng nội dung đầu vào và hình ảnh kiểu của bạn.

Sử dụng chức năng Image để hiển thị nội dung của test.jpg :

Sổ tay
Image('{}/test.jpg'.format(workingdir)) 

Phong cách của đêm đầy sao được chuyển sang nội dung của hình ảnh những chiếc thuyền Venitian của  ta

Phong cách nghệ thuật của canvas Đêm đầy sao của Vincent van Vogh đã được ánh xạ vào nội dung của hình ảnh con thuyền Venitian của ta . Bạn đã áp dụng thành công kiểu chuyển kiểu thần kinh với một ví dụ trong sách giáo khoa, vì vậy hãy thử lặp lại bài tập này với các hình ảnh khác nhau.

Bước 3 - Chuyển đổi hình ảnh của bạn

Lúc này, bạn đã sử dụng các hình ảnh do tác giả của thư viện ta đang sử dụng cung cấp. Thay vào đó, hãy sử dụng hình ảnh của chính ta . Để làm điều này, bạn có thể tìm một hình ảnh bạn quan tâm và sử dụng URL cho hình ảnh trong lệnh sau hoặc sử dụng URL được cung cấp để sử dụng Sammy the Shark.

Ta sẽ sử dụng một số phép thuật IPython để tải hình ảnh xuống folder làm việc của ta và đặt nó vào một file có tên sammy.png .

Sổ tay
!wget -O - 'https://assets.digitalocean.com/blog/static/sammy-the-shark-gets-a-birthday-makeover-from-simon-oxley/sammy-jetpack.png' > $workingdir/sammy.png 

Khi bạn chạy lệnh này trong sổ ghi chép của bạn , bạn sẽ thấy kết quả sau:

Output
--2017-08-15 20:03:27-- https://assets.digitalocean.com/blog/static/sammy-the-shark-gets-a-birthday-makeover-from-simon-oxley/sammy-jetpack.png Resolving assets.digitalocean.com (assets.digitalocean.com)... 151.101.20.233 Connecting to assets.digitalocean.com (assets.digitalocean.com)|151.101.20.233|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 10483 (10K) [image/png] Saving to: 'STDOUT' - 100%[===================>] 10.24K --.-KB/s in 0.001s 2017-08-15 20:03:27 (12.9 MB/s) - written to stdout [10483/10483]

Sử dụng lệnh Image để hiển thị hình ảnh mới trong sổ ghi chép:

Sổ tay
Image('{}/sammy.png'.format(workingdir)) 

Hình ảnh của Rocket Sammy

Theo cùng quy trình làm việc với quá trình chạy thử nghiệm, hãy chạy mô hình chuyển phong cách nghệ thuật của ta bằng cách sử dụng Rocket Sammy làm hình ảnh nội dung và cùng một hình ảnh Đêm đầy sao làm hình ảnh phong cách của ta .

Ta sẽ sử dụng cùng một mã mà ta đã sử dụng trước đây, nhưng lần này ta sẽ chỉ định hình ảnh nội dung là sammy.png , hình ảnh kiểu là starry_night.jpg và ta ghi kết quả vào một file có tên starry_sammy.jpg . Sau đó, ta thực hiện lệnh:

Sổ tay
# specify the path to the main.py script path2script = '{}/main.py'.format(workingdir)  # specify the list of arguments to be used as input to main.py args = ['eval',         '--content-image',         '{}/sammy.png'.format(workingdir),         '--style-image',         '{}/images/21styles/starry_night.jpg'.format(workingdir),         '--model',         '{}/models/21styles.model'.format(workingdir),         '--output-image',         '{}/starry_sammy.jpg'.format(workingdir),         '--cuda=0']  # build subprocess command cmd = ['python3', path2script] + args  # run the bash command x = subprocess.check_output(cmd, universal_newlines=True) 

Sau đó, sử dụng chức năng Image để xem kết quả chuyển phong cách nghệ thuật trong Đêm đầy sao của Vincent van Vogh sang nội dung hình ảnh Rocket Sammy của bạn.

Sổ tay
Image('{}/starry_sammy.jpg'.format(workingdir)) 

Bạn sẽ thấy Rocket Sammy cách điệu mới:

Hình ảnh về phong cách Starry night được chuyển đến Rocket Sammy

Hãy thử lại điều này bằng cách ánh xạ một hình ảnh có phong cách khác với hình ảnh của ta về Rocket Sammy. Lần này ta sẽ sử dụng The Muse của Picasso. , ta sử dụng sammy.png làm hình ảnh nội dung của ta , nhưng ta sẽ thay đổi hình ảnh kiểu thành la_muse.jpg . Ta sẽ lưu kết quả vào musing_sammy.jpg :

Sổ tay
# specify the path to the main.py script path2script = '{}/main.py'.format(workingdir)  # specify the list of arguments to be used as input to main.py args = ['eval',         '--content-image',         '{}/sammy.png'.format(workingdir),         '--style-image',         '{}/images/21styles/la_muse.jpg'.format(workingdir),         '--model',         '{}/models/21styles.model'.format(workingdir),         '--output-image',         '{}/musing_sammy.jpg'.format(workingdir),         '--cuda=0']  # build subprocess command cmd = ['python3', path2script] + args  # run the bash command x = subprocess.check_output(cmd, universal_newlines=True) 

Khi mã đã chạy xong, hãy hiển thị kết quả công việc của bạn bằng tên file kết quả mà bạn đã chỉ định và chức năng Image :

Sổ tay
Image('{}/musing_sammy.jpg'.format(workingdir)) 

Hình ảnh về phong cách của Nàng thơ được chuyển sang Rocket Sammy

Bây giờ, bạn đã có một ý tưởng tốt về cách sử dụng các phép biến đổi này. Hãy thử sử dụng một số hình ảnh của bạn nếu bạn chưa có.

Kết luận

Trong hướng dẫn này, bạn đã sử dụng Python và triển khai PyTorch open-souce của mô hình truyền kiểu thần kinh để áp dụng chuyển kiểu cho hình ảnh. Lĩnh vực máy học và AI rất rộng lớn và đây chỉ là một trong những ứng dụng của nó. Dưới đây là một số điều bổ sung mà bạn có thể khám phá:


Tags:

Các tin liên quan

Cách thực hiện chuyển kiểu neural với Python 3 và PyTorch
2018-09-13
Cách cài đặt Python 3 và thiết lập môi trường lập trình cục bộ trên Windows 10
2018-09-11
Cách cài đặt Python 3 và thiết lập môi trường lập trình cục bộ trên Windows 10
2018-09-11
Cách thiết lập một sổ ghi chép Jupyter với Python 3 trên Debian 9
2018-09-07
Cách cài đặt phân phối Python Anaconda trên Debian 9
2018-09-06
Cách cài đặt Python 3 và thiết lập môi trường lập trình trên Debian 9
2018-09-04
Cách xác minh mã và mã hóa dữ liệu bằng Python-GnuPG và Python 3
2018-06-08
Kế thừa lớp trong Python 3
2018-03-09
Hiểu kế thừa lớp trong Python 3
2018-03-09
Cách viết lệnh Slash với Flask và Python 3 trên Ubuntu 16.04
2018-02-06