手把手教你玩转黑白图片上色【玩转华为云】

网友投稿 698 2022-05-30

我们都知道,有很多经典的老照片,受限于那个时代的技术,只能以黑白的形式传世。尽管黑白照片别有一番风味,但是彩色照片有时候能给人更强的代入感。今天在这里为大家提供一种基于华为云ModelArts的AI技术,智能给黑白图片上色的方法,下面就紧跟小编的步骤,一步一步的来实现吧!

实验准备

华为云ModelArts平台,如对该平台不是很了解,请参考文档信息成长地图_AI开发平台ModelArts_华为云 (huaweicloud.com) ,这些文档资料可以让你完成从AI小白到AI大神的蜕变!

实验流程

一、实验环境配置

点击下方连接进入 实例感知图像上色 的 JupyterLab 页面,进入代码操作界面

https://authoring-modelarts-cnnorth4.huaweicloud.com/console/lab?share-url-b64=aHR0cHM6Ly9jbm5vcnRoNC1tb2RlbGh1Yi1tb2RlbHMub2JzLmNuLW5vcnRoLTQubXlod2Nsb3Vkcy5jb20vaXRlbS83OTJjNzlhNS1jYzI5LTRhNjUtYmUzNy01MTRhYjk1OWE2OTIvMS4wLjAvSW5zdENvbG9yaXphdGlvbi5pcHluYg%3D%3D&galleryitemid=792c79a5-cc29-4a65-be37-514ab959a692

不要使用默认的配置信息,这里我们选择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))

就能完整展示自己的上色图片啦

AI开发平台ModelArts

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Mysql5.7版本中数据表字段可用的类型
下一篇:智慧停车场-车牌识别自动计费系统丨【我的华为云体验之旅】
相关文章