手把手教你玩转黑白图片上色【玩转华为云】
我们都知道,有很多经典的老照片,受限于那个时代的技术,只能以黑白的形式传世。尽管黑白照片别有一番风味,但是彩色照片有时候能给人更强的代入感。今天在这里为大家提供一种基于华为云ModelArts的AI技术,智能给黑白图片上色的方法,下面就紧跟小编的步骤,一步一步的来实现吧!
实验准备
华为云ModelArts平台,如对该平台不是很了解,请参考文档信息成长地图_AI开发平台ModelArts_华为云 (huaweicloud.com) ,这些文档资料可以让你完成从AI小白到AI大神的蜕变!
实验流程
一、实验环境配置
点击下方连接进入 实例感知图像上色 的 JupyterLab 页面,进入代码操作界面
不要使用默认的配置信息,这里我们选择GPU: 1*V100|CPU: 8核 64GB的环境,默认的信息在配置 Detectron2时,会报错。
切换流程见下图:
切换完成后,点击确定
2、 实验步骤
2.1下载代码和数据
import os
!wget https://obs-aigallery-zc.obs.cn-north-4.myhuaweicloud.com/clf/code/InstColorization.zip
os.system('unzip InstColorization.zip')
选择代码后,按crtl + enter 键运行,或者点击工具栏的开始按钮
运行成功后,[*]会变成对应的[1]值,或者工具栏左下方的 Busy 变成 Idle
2.2安装依赖库
!gcc --version
!pip install torch==1.5 torchvision==0.6
!pip install cython pyyaml==5.1
!pip install -U 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'
!pip install dominate==2.4.0
!pip install detectron2==0.1.3 -f https://dl.fbaipublicfiles.com/detectron2/wheels/cu101/index.html
!pip install opencv-python
!pip install scikit-image
import torch, torchvision
print(torch.__version__, torch.cuda.is_available())
2.3准备上色
2.3.1切换目录
cd InstColorization/
2.3.2配置 Detectron2
from os.path import join, isfile, isdir
from os import listdir
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
from argparse import ArgumentParser
import detectron2
from detectron2.utils.logger import setup_logger
setup_logger()
import numpy as np
import cv2
# import some common detectron2 utilities
from detectron2 import model_zoo
from detectron2.engine import DefaultPredictor
from detectron2.config import get_cfg
import torch
cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_X_101_32x8d_FPN_3x.yaml"))
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.7
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_X_101_32x8d_FPN_3x.yaml")
predictor = DefaultPredictor(cfg)
input_dir = "example"
image_list = [f for f in listdir(input_dir) if isfile(join(input_dir, f))]
output_npz_dir = "{0}_bbox".format(input_dir)
if os.path.isdir(output_npz_dir) is False:
print('Create path: {0}'.format(output_npz_dir))
os.makedirs(output_npz_dir)
for image_path in image_list:
img = cv2.imread(join(input_dir, image_path))
lab_image = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
l_channel, a_channel, b_channel = cv2.split(lab_image)
l_stack = np.stack([l_channel, l_channel, l_channel], axis=2)
outputs = predictor(l_stack)
save_path = join(output_npz_dir, image_path.split('.')[0])
pred_bbox = outputs["instances"].pred_boxes.to(torch.device('cpu')).tensor.numpy()
pred_scores = outputs["instances"].scores.cpu().data.numpy()
np.savez(save_path, bbox = pred_bbox, scores = pred_scores)
!ls example_bbox
2.4图像上色
import sys
import time
from options.train_options import TestOptions
from models import create_model
import torch
from tqdm import tqdm_notebook
from fusion_dataset import Fusion_Testing_Dataset
from util import util
import multiprocessing
multiprocessing.set_start_method('spawn', True)
torch.backends.cudnn.benchmark = True
sys.argv = [sys.argv[0]]
opt = TestOptions().parse()
save_img_path = opt.results_img_dir
if os.path.isdir(save_img_path) is False:
print('Create path: {0}'.format(save_img_path))
os.makedirs(save_img_path)
opt.batch_size = 1
dataset = Fusion_Testing_Dataset(opt, -1)
dataset_loader = torch.utils.data.DataLoader(dataset, batch_size=opt.batch_size)
dataset_size = len(dataset)
print('#Testing images = %d' % dataset_size)
model = create_model(opt)
model.setup_to_test('coco_finetuned_mask_256_ffs')
count_empty = 0
for data_raw in tqdm_notebook(dataset_loader):
data_raw['full_img'][0] = data_raw['full_img'][0].cuda()
if data_raw['empty_box'][0] == 0:
data_raw['cropped_img'][0] = data_raw['cropped_img'][0].cuda()
box_info = data_raw['box_info'][0]
box_info_2x = data_raw['box_info_2x'][0]
box_info_4x = data_raw['box_info_4x'][0]
box_info_8x = data_raw['box_info_8x'][0]
cropped_data = util.get_colorization_data(data_raw['cropped_img'], opt, ab_thresh=0, p=opt.sample_p)
full_img_data = util.get_colorization_data(data_raw['full_img'], opt, ab_thresh=0, p=opt.sample_p)
model.set_input(cropped_data)
model.set_fusion_input(full_img_data, [box_info, box_info_2x, box_info_4x, box_info_8x])
model.forward()
else:
count_empty += 1
full_img_data = util.get_colorization_data(data_raw['full_img'], opt, ab_thresh=0, p=opt.sample_p)
model.set_forward_without_box(full_img_data)
model.save_current_imgs(join(save_img_path, data_raw['file_id'][0] + '.png'))
print('{0} images without bounding boxes'.format(count_empty))
2.5展示上色结果
def imshow(img):
import IPython
import cv2
_, ret = cv2.imencode('.jpg', img)
i = IPython.display.Image(data=ret)
IPython.display.display(i)
img_name_list = ['000000022969', '000000023781', '000000046872', '000000050145']
# 修改对应索引使用不同图片 0-3
show_index = 1
img = cv2.imread('example/'+img_name_list[show_index]+'.jpg')
lab_image = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
l_channel, _, _ = cv2.split(lab_image)
img = cv2.imread('results/'+img_name_list[show_index]+'.png')
lab_image = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
_, a_pred, b_pred = cv2.split(lab_image)
a_pred = cv2.resize(a_pred, (l_channel.shape[1], l_channel.shape[0]))
b_pred = cv2.resize(b_pred, (l_channel.shape[1], l_channel.shape[0]))
gray_color = np.ones_like(a_pred) * 128
gray_image = cv2.cvtColor(np.stack([l_channel, gray_color, gray_color], 2), cv2.COLOR_LAB2BGR)
color_image = cv2.cvtColor(np.stack([l_channel, a_pred, b_pred], 2), cv2.COLOR_LAB2BGR)
# save_img_path = 'results_origin/'
# if os.path.isdir(save_img_path) is False:
# print('Create path: {0}'.format(save_img_path))
# os.makedirs(save_img_path)
# cv2.imwrite('results_origin/'+img_name_list[show_index]+'.png', color_image)
imshow(np.concatenate([gray_image, color_image], 1))
到此为止,一个官方的示例,就算完成了!
如果想要给其他的黑白图片上色,又该怎么完成呢?继续往下看,嘿嘿
在2.5步骤中,有这样几句代码,通过对比可以发现,原始图集在example文件夹下,通过切换下标,可以给不同的图片完成上色操作,
img_name_list = ['000000022969', '000000023781', '000000046872', '000000050145']
# 修改对应索引使用不同图片 0-3
show_index = 1
img = cv2.imread('example/'+img_name_list[show_index]+'.jpg')
lab_image = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
l_channel, _, _ = cv2.split(lab_image)
img = cv2.imread('results/'+img_name_list[show_index]+'.png')
lab_image = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
_, a_pred, b_pred = cv2.split(lab_image)
将本地图片,通过菜单栏的upload files按钮,上传到example文件夹下
重复步骤2.3,2.4,2.5,其中2.5中需要修改照片的信息,将照片123加入数组中,同时指定上色图片索引为4
def imshow(img):
import IPython
import cv2
_, ret = cv2.imencode('.jpg', img)
i = IPython.display.Image(data=ret)
IPython.display.display(i)
img_name_list = ['000000022969', '000000023781', '000000046872', '000000050145', '123']
# 修改对应索引使用不同图片 0-3
show_index = 4
img = cv2.imread('example/'+img_name_list[show_index]+'.jpg')
lab_image = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
l_channel, _, _ = cv2.split(lab_image)
img = cv2.imread('results/'+img_name_list[show_index]+'.png')
lab_image = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
_, a_pred, b_pred = cv2.split(lab_image)
a_pred = cv2.resize(a_pred, (l_channel.shape[1], l_channel.shape[0]))
b_pred = cv2.resize(b_pred, (l_channel.shape[1], l_channel.shape[0]))
gray_color = np.ones_like(a_pred) * 128
gray_image = cv2.cvtColor(np.stack([l_channel, gray_color, gray_color], 2), cv2.COLOR_LAB2BGR)
color_image = cv2.cvtColor(np.stack([l_channel, a_pred, b_pred], 2), cv2.COLOR_LAB2BGR)
# save_img_path = 'results_origin/'
# if os.path.isdir(save_img_path) is False:
# print('Create path: {0}'.format(save_img_path))
# os.makedirs(save_img_path)
# cv2.imwrite('results_origin/'+img_name_list[show_index]+'.png', color_image)
imshow(np.concatenate([gray_image, color_image], 1))
就能完整展示自己的上色图片啦
- 点赞
- 收藏
- 关注作者
评论(0)