精华内容
下载资源
问答
  • 原标题:教你如何用Python出心目中的自己引言:人脸图像生成在各个行业有着重要应用,例如刑事调查、人物设计、教育培训等。然而一幅逼真人脸肖像,对于职业画家也要至少数小时才能绘制出来;对于从未接触过...

    原标题:教你如何用Python画出心目中的自己

    引言:人脸图像的生成在各个行业有着重要应用,例如刑事调查、人物设计、教育培训等。然而一幅逼真的人脸肖像,对于职业画家也要至少数小时才能绘制出来;对于从未接触过绘画的新手,就更是难如登天了。新手绘制出来的人脸草图往往非常简陋抽象,甚至有不匀称、不完整。但如果使用智能人脸画板,无疑是有如神助。

    本项目主要来源于中科院和香港城市大学的一项研究DeepFaceDrawing,论文标题是《DeepFaceDrawing: DeepGeneration of Face Images from Sketches》

    具体效果如下图可见:

    实验前的准备

    首先我们使用的python版本是3.6.5所用到的模块如下:

    Pyqt5模块:PyQt5是基于Digia公司强大的图形程式框架Qt5的python接口,由一组python模块构成。PyQt5本身拥有超过620个类和6000函数及方法。在可以运行于多个平台,包括:Unix, Windows, and Mac OS。

    opencv是将用来进行图像处理和生成。

    numpy模块用来处理矩阵运算。

    Jittor模块国内清华大学开源的深度学习框架。

    _thread是多线程库。

    网络模型的定义和训练

    首先这个图像合成模块采用了一种利用发生器和鉴别器的GAN结构。从融合的特征图生成真实的人脸图像。鉴别器采用多尺度鉴别方式:对输入进行尺度划分,特征图和生成的图像在三个不同的层次上,经过三个不同的过程。:

    (1)权重网络层和损失定义:

    def weights_init_normal(m):

    classname = m.__class__.__name__

    ifclassname.find("Conv") != -1:

    jt.init.gauss_(m.weight,0.0, 0.02)

    elifclassname.find("BatchNorm") != -1:

    jt.init.gauss_(m.weight,1.0, 0.02)

    jt.init.constant_(m.bias,0.0)

    def get_norm_layer(norm_type='instance'):

    if (norm_type == 'batch'):

    norm_layer = nn.BatchNorm

    elif (norm_type == 'instance'):

    norm_layer =nn.InstanceNorm2d

    else:

    raiseNotImplementedError(('normalization layer [%s] is not found' % norm_type))

    return norm_layer

    class MSELoss:

    def __init__(self):

    pass

    def __call__(self, output,target):

    from jittor.nn importmse_loss

    return mse_loss(output,target)

    class BCELoss:

    def __init__(self):

    pass

    def __call__(self, output,target):

    from jittor.nn importbce_loss

    return bce_loss(output,target)

    (2)模型特征编解码:

    特征匹配模块包含5个译码网络,以compact作为输入由分量流形得到的特征向量,并将其转换为对应的特征向量为后续生成的特征图的大小。

    def define_part_encoder(model='mouth', norm='instance', input_nc=1,latent_dim=512):

    norm_layer =get_norm_layer(norm_type=norm)

    image_size = 512

    if 'eye' in model:

    image_size = 128

    elif 'mouth' in model:

    image_size = 192

    elif 'nose' in model:

    image_size = 160

    elif 'face' in model:

    image_size = 512

    else:

    print("Whole Image!!")

    net_encoder =EncoderGenerator_Res(norm_layer,image_size,input_nc, latent_dim) # input longsize 256 to 512*4*4

    print("net_encoder of part"+model+" is:",image_size)

    return net_encoder

    def define_part_decoder(model='mouth', norm='instance', output_nc=1,latent_dim=512):

    norm_layer =get_norm_layer(norm_type=norm)

    image_size = 512

    if 'eye' in model:

    image_size = 128

    elif 'mouth' in model:

    image_size = 192

    elif 'nose' in model:

    image_size = 160

    else:

    print("Whole Image!!")

    net_decoder =DecoderGenerator_image_Res(norm_layer,image_size,output_nc, latent_dim) # input longsize 256 to 512*4*4

    print("net_decoder to imageof part "+model+" is:",image_size)

    return net_decoder

    def define_feature_decoder(model='mouth', norm='instance', output_nc=1,latent_dim=512):

    norm_layer =get_norm_layer(norm_type=norm)

    image_size = 512

    if 'eye' in model:

    image_size = 128

    elif 'mouth' in model:

    image_size = 192

    elif 'nose' in model:

    image_size = 160

    else:

    print("Whole Image!!")

    net_decoder =DecoderGenerator_feature_Res(norm_layer,image_size,output_nc, latent_dim) # input longsize 256 to 512*4*4

    print("net_decoder to imageof part "+model+" is:",image_size)

    # print(net_decoder)

    return net_decoder

    def define_G(input_nc, output_nc, ngf, n_downsample_global=3,n_blocks_global=9, norm='instance'):

    norm_layer =get_norm_layer(norm_type=norm)

    netG = GlobalGenerator(input_nc,output_nc, ngf, n_downsample_global, n_blocks_global, norm_layer)

    return netG

    图形界面的定义

    在这篇论文中,作者一方面将人脸关键区域(双眼、鼻、嘴和其他区域)作为面元,学习其特征嵌入,将输入草图的对应部分送到由数据库样本中面元的特征向量构成的流形空间进行校准。另一方面,参考 pix2pixHD [5]的网络模型设计,使用 conditional GAN 来学习从编码的面元特征到真实图像的映射生成结果。

    (1)鼠标绘制函数的定义:

    class OutputGraphicsScene(QGraphicsScene):

    def __init__(self, parent=None):

    QGraphicsScene.__init__(self, parent)

    # self.modes = mode_list

    self.mouse_clicked = False

    self.prev_pt = None

    self.setSceneRect(0,0,self.width(),self.height())

    # self.masked_image = None

    self.selectMode = 0

    # save the history of edit

    self.history = []

    self.ori_img = np.ones((512,512, 3),dtype=np.uint8)*255

    self.mask_put = 1 # 1 marksuse brush while 0 user erase

    self.convert = False

    # self.setPos(0 ,0)

    self.firstDisplay = True

    self.convert_on = False

    def reset(self):

    self.convert = False

    self.ori_img = np.ones((512,512, 3),dtype=np.uint8)*255

    self.updatePixmap(True)

    self.prev_pt = None

    def setSketchImag(self,sketch_mat, mouse_up=False):

    self.ori_img =sketch_mat.copy()

    self.image_list = []

    self.image_list.append(self.ori_img.copy() )

    def mousePressEvent(self,event):

    if not self.mask_put orself.selectMode == 1:

    self.mouse_clicked =True

    self.prev_pt = None

    else:

    self.make_sketch(event.scenePos())

    def make_sketch_Eraser(self,pts):

    if len(pts)>0:

    for pt in pts:

    cv2.line(self.color_img,pt['prev'],pt['curr'],self.paint_color,self.paint_size)

    cv2.line(self.mask_img,pt['prev'],pt['curr'],(0,0,0),self.paint_size )

    self.updatePixmap()

    def modify_sketch(self, pts):

    if len(pts)>0:

    for pt in pts:

    cv2.line(self.ori_img,pt['prev'],pt['curr'],self.paint_color,self.paint_size)

    self.updatePixmap()

    def get_stk_color(self, color):

    self.stk_color = color

    def erase_prev_pt(self):

    self.prev_pt = None

    def reset_items(self):

    for i inrange(len(self.items())):

    item = self.items()[0]

    self.removeItem(item)

    def undo(self):

    iflen(self.image_list)>1:

    num =len(self.image_list)-2

    self.ori_img =self.image_list[num].copy()

    self.image_list.pop(num+1)

    self.updatePixmap(True)

    def getImage(self):

    returnself.ori_img*(1-self.mask_img) +self.color_img*self.mask_img

    defupdatePixmap(self,mouse_up=False):

    sketch = self.ori_img

    qim = QImage(sketch.data,sketch.shape[1], sketch.shape[0], QImage.Format_RGB888)

    if self.firstDisplay :

    self.reset_items()

    self.imItem =self.addPixmap(QPixmap.fromImage(qim))

    self.firstDispla = False

    else:

    self.imItem.setPixmap(QPixmap.fromImage(qim))

    def fresh_board(self):

    print('======================================================')

    while(True):

    if(self.convert_on):

    print('======================================================')

    time.sleep(100)

    iter_start_time =time.time()

    self.updatePixmap()

    print('TimeSketch:',time.time() - iter_start_time)

    (2)GUI界面:其核心思路并非直接用输入草图作为网络生成条件,而是将人脸进行分块操作后利用数据驱动的思想对抽象的草图特征空间进行隐式建模,并在这个流形空间中找到输入草图特征的近邻组合来重构特征,进而合成人脸图像。

    class WindowUI(QtWidgets.QMainWindow,Ui_SketchGUI):

    def __init__(self):

    super(WindowUI,self).__init__()

    self.setupUi(self)

    self.setEvents()

    self._translate =QtCore.QCoreApplication.translate

    self.output_img = None

    self.brush_size =self.BrushSize.value()

    self.eraser_size =self.EraseSize.value()

    self.modes = [0,1,0] #0marks the eraser, 1 marks the brush

    self.Modify_modes = [0,1,0]#0 marks the eraser, 1 marks the brush

    self.output_scene =OutputGraphicsScene()

    self.output.setScene(self.output_scene)

    self.output.setAlignment(Qt.AlignTop | Qt.AlignLeft)

    self.output.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

    self.output.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

    self.output_view =QGraphicsView(self.output_scene)

    #self.output_view.fitInView(self.output_scene.updatePixmap())

    self.input_scene =InputGraphicsScene(self.modes, self.brush_size,self.output_scene)

    self.input.setScene(self.input_scene)

    self.input.setAlignment(Qt.AlignTop | Qt.AlignLeft)

    self.input.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

    self.input.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

    self.input_scene.convert_on= self.RealTime_checkBox.isChecked()

    self.output_scene.convert_on= self.RealTime_checkBox.isChecked()

    self.BrushNum_label.setText(self._translate("SketchGUI",str(self.brush_size)))

    self.EraserNum_label.setText(self._translate("SketchGUI",str(self.eraser_size)))

    self.start_time =time.time()

    # self.

    # try:

    # # thread.start_new_thread(self.output_scene.fresh_board,())

    # thread.start_new_thread(self.input_scene.thread_shadow,())

    # except:

    # print("Error: unable to startthread")

    # print("Finish")

    def setEvents(self):

    self.Undo_Button.clicked.connect(self.undo)

    self.Brush_Button.clicked.connect(self.brush_mode)

    self.BrushSize.valueChanged.connect(self.brush_change)

    self.Clear_Button.clicked.connect(self.clear)

    self.Eraser_Button.clicked.connect(self.eraser_mode)

    self.EraseSize.valueChanged.connect(self.eraser_change)

    self.Save_Button.clicked.connect(self.saveFile)

    #weight bar

    self.part0_Slider.valueChanged.connect(self.changePart)

    self.part1_Slider.valueChanged.connect(self.changePart)

    self.part2_Slider.valueChanged.connect(self.changePart)

    self.part3_Slider.valueChanged.connect(self.changePart)

    self.part4_Slider.valueChanged.connect(self.changePart)

    self.part5_Slider.valueChanged.connect(self.changAllPart)

    self.Load_Button.clicked.connect(self.open)

    self.Convert_Sketch.clicked.connect(self.convert)

    self.RealTime_checkBox.clicked.connect(self.convert_on)

    self.Shadow_checkBox.clicked.connect(self.shadow_on)

    self.Female_Button.clicked.connect(self.choose_Gender)

    self.Man_Button.clicked.connect(self.choose_Gender)

    self.actionSave.triggered.connect(self.saveFile)

    def mode_select(self, mode):

    for i inrange(len(self.modes)):

    self.modes[i] = 0

    self.modes[mode] = 1

    def brush_mode(self):

    self.mode_select(1)

    self.brush_change()

    self.statusBar().showMessage("Brush")

    def eraser_mode(self):

    self.mode_select(0)

    self.eraser_change()

    self.statusBar().showMessage("Eraser")

    def undo(self):

    self.input_scene.undo()

    self.output_scene.undo()

    def brush_change(self):

    self.brush_size =self.BrushSize.value()

    self.BrushNum_label.setText(self._translate("SketchGUI",str(self.brush_size)))

    if self.modes[1]:

    self.input_scene.paint_size = self.brush_size

    self.input_scene.paint_color = (0,0,0)

    self.statusBar().showMessage("Change Brush Size in ",self.brush_size)

    def eraser_change(self):

    self.eraser_size =self.EraseSize.value()

    self.EraserNum_label.setText(self._translate("SketchGUI",str(self.eraser_size)))

    if self.modes[0]:

    print( self.eraser_size)

    self.input_scene.paint_size = self.eraser_size

    self.input_scene.paint_color = (1,1,1)

    self.statusBar().showMessage("Change Eraser Size in ",self.eraser_size)

    def changePart(self):

    self.input_scene.part_weight['eye1'] = self.part0_Slider.value()/100

    self.input_scene.part_weight['eye2']= self.part1_Slider.value()/100

    self.input_scene.part_weight['nose'] = self.part2_Slider.value()/100

    self.input_scene.part_weight['mouth'] = self.part3_Slider.value()/100

    self.input_scene.part_weight[''] = self.part4_Slider.value()/100

    self.input_scene.start_Shadow()

    #self.input_scene.updatePixmap()

    def changAllPart(self):

    value =self.part5_Slider.value()

    self.part0_Slider.setProperty("value", value)

    self.part1_Slider.setProperty("value", value)

    self.part2_Slider.setProperty("value", value)

    self.part3_Slider.setProperty("value", value)

    self.part4_Slider.setProperty("value", value)

    self.changePart()

    def clear(self):

    self.input_scene.reset()

    self.output_scene.reset()

    self.start_time =time.time()

    self.input_scene.start_Shadow()

    self.statusBar().showMessage("Clear Drawing Board")

    def convert(self):

    self.statusBar().showMessage("Press Convert")

    self.input_scene.convert_RGB()

    self.output_scene.updatePixmap()

    def open(self):

    fileName, _ =QFileDialog.getOpenFileName(self, "Open File",

    QDir.currentPath(),"Images Files (*.*)") #jpg;*.jpeg;*.png

    if fileName:

    image =QPixmap(fileName)

    mat_img =cv2.imread(fileName)

    mat_img = cv2.resize(mat_img,(512, 512), interpolation=cv2.INTER_CUBIC)

    mat_img =cv2.cvtColor(mat_img, cv2.COLOR_RGB2BGR)

    if image.isNull():

    QMessageBox.information(self, "Image Viewer",

    "Cannotload %s." % fileName)

    return

    #cv2.imshow('open',mat_img)

    self.input_scene.start_Shadow()

    self.input_scene.setSketchImag(mat_img)

    def saveFile(self):

    cur_time =strftime("%Y-%m-%d-%H-%M-%S", gmtime())

    file_dir ='./saveImage/'+cur_time

    if notos.path.isdir(file_dir) :

    os.makedirs(file_dir)

    cv2.imwrite(file_dir+'/hand-draw.jpg',self.input_scene.sketch_img*255)

    cv2.imwrite(file_dir+'/colorized.jpg',cv2.cvtColor(self.output_scene.ori_img,cv2.COLOR_BGR2RGB))

    print(file_dir)

    def convert_on(self):

    # ifself.RealTime_checkBox.isCheched():

    print('self.RealTime_checkBox',self.input_scene.convert_on)

    self.input_scene.convert_on= self.RealTime_checkBox.isChecked()

    self.output_scene.convert_on= self.RealTime_checkBox.isChecked()

    def shadow_on(self):

    _translate =QtCore.QCoreApplication.translate

    self.input_scene.shadow_on =not self.input_scene.shadow_on

    self.input_scene.updatePixmap()

    ifself.input_scene.shadow_on:

    self.statusBar().showMessage("Shadow ON")

    else:

    self.statusBar().showMessage("Shadow OFF")

    def choose_Gender(self):

    ifself.Female_Button.isChecked():

    self.input_scene.sex = 1

    else:

    self.input_scene.sex = 0

    self.input_scene.start_Shadow()

    总结

    这里给出模型的体验网址:

    http://www.geometrylearning.com:3000/index_621.html

    该方法核心亮点之一,便是以多通道特征图作为中间结果来改善信息流。从本质上看,这是将输入草图作为软约束来替代传统方法中的硬约束,因此能够用粗糙甚至不完整的草图来生成高质量的完整人脸图像。

    反思DeepFaceDrawing

    1)画不出丑脸:

    从图中可以看出,即使给出丑陋的草图,输出的也会是平均来说漂亮的人脸,这大概是因为所用的训练数据集都是名人,平均“颜值”较高,因此神经网络学到了一种漂亮的平均;这能算是一种在“颜值上的”数据不平衡问题吗。

    2)安全问题

    比如人脸支付场景中,可能存在利用该项技术盗刷的问题。随着人脸活体检测技术的发展,这种隐患应该能得以有效避免。

    3)技术攻击性

    相比于Deepfake,本文的DeepFaceDrawing应该算是相对无害的。

    4)商业价值

    如论文作者所说,这项技术在犯罪侦查、人物设计、教育培训等方面都可以有所作为。期待有一天这项技术更加通用,这样一来其商业价值会更大。

    [声明]本文版权归原作者所有,内容为作者个人观点,转载目的在于传递更多信息,如涉及作品内容、版权等问题,可联系本站删除,谢谢。

    更多内容可关注微信公众号:成都CDA数据分析师。返回搜狐,查看更多

    责任编辑:

    展开全文
  • 最近看到一个特别有意思开源项目,能把照片自动转化成漫画效果,经过半个小时调试,终于跑通了。正先给大家看下实际效果,我在网上随便搜了一张帅哥证件照片试了下。基本上会把脑袋切出来,然后放大眼睛。 ...

    最近看到一个特别有意思的开源项目,能把照片自动转化成漫画效果,经过半个小时的调试,终于跑通了。正先给大家看下实际效果,我在网上的随便搜了一张帅哥的证件照片试了下。基本上会把脑袋切出来,然后放大眼睛。

    原照:

    IMG_2843.JPG

    漫画效果后:

    cartoon_result.png

    使用的是开源项目:https://github.com/minivision-ai/photo2cartoon

    具体原理直接摘录read.me的一段描述:

    人像卡通风格渲染的目标是,在保持原图像ID信息和纹理细节的同时,将真实照片转换为卡通风格的非真实感图像。我们的思路是,从大量照片/卡通数据中习得照片到卡通画的映射。一般而言,基于成对数据的pix2pix方法能达到较好的图像转换效果,但本任务的输入输出轮廓并非一一对应,例如卡通风格的眼睛更大、下巴更瘦;且成对的数据绘制难度大、成本较高,因此我们采用unpaired image translation方法来实现。

    Unpaired image translation流派最经典方法是CycleGAN,但原始CycleGAN的生成结果往往存在较为明显的伪影且不稳定。近期的论文U-GAT-IT提出了一种归一化方法——AdaLIN,能够自动调节Instance Norm和Layer Norm的比重,再结合attention机制能够实现精美的人像日漫风格转换。

    与夸张的日漫风不同,我们的卡通风格更偏写实,要求既有卡通画的简洁Q萌,又有明确的身份信息。为此我们增加了Face ID Loss,使用预训练的人脸识别模型提取照片和卡通画的ID特征,通过余弦距离来约束生成的卡通画。

    此外,我们提出了一种Soft-AdaLIN(Soft Adaptive Layer-Instance Normalization)归一化方法,在反规范化时将编码器的均值方差(照片特征)与解码器的均值方差(卡通特征)相融合。

    模型结构方面,在U-GAT-IT的基础上,我们在编码器之前和解码器之后各增加了2个hourglass模块,渐进地提升模型特征抽象和重建能力。

    由于实验数据较为匮乏,为了降低训练难度,我们将数据处理成固定的模式。首先检测图像中的人脸及关键点,根据人脸关键点旋转校正图像,并按统一标准裁剪,再将裁剪后的头像输入人像分割模型去除背景。

    实际操作也很简单:

    1. Clone 上述项目

    2. 安装python 3.6、pytorch 1.4、tensorflow-gpu 1.14、face-alignment、dlib一定要用conda

    3. 安装过程中有很多坑,比如pillow的版本要调整之类的

    4. 下载pretrain的模型(提取码:z2nm)放到model路径下:https://pan.baidu.com/s/1DxWWBAoaBpsei_rynZUZzw

    5. 执行以下命令,生成图片会在save_path路径下找到:python3 test.py --photo_path ./images/photo_test.jpg --save_path ./images/cartoon_result.png

    展开全文
  • 最近看到一个特别有意思开源项目,能把照片自动转化成漫画效果,经过半个小时调试,终于跑通了。正先给大家看下实际效果,我在网上随便搜了一张帅哥...我们思路是,从大量照片/卡通数据中习得照片到卡通

    最近看到一个特别有意思的开源项目,能把照片自动转化成漫画效果,经过半个小时的调试,终于跑通了。正先给大家看下实际效果,我在网上的随便搜了一张帅哥的证件照片试了下。基本上会把脑袋切出来,然后放大眼睛。

    使用的是开源项目:https://github.com/minivision-ai/photo2cartoon

    具体原理直接摘录read.me的一段描述:

    人像卡通风格渲染的目标是,在保持原图像ID信息和纹理细节的同时,将真实照片转换为卡通风格的非真实感图像。我们的思路是,从大量照片/卡通数据中习得照片到卡通画的映射。一般而言,基于成对数据的pix2pix方法能达到较好的图像转换效果,但本任务的输入输出轮廓并非一一对应,例如卡通风格的眼睛更大、下巴更瘦;且成对的数据绘制难度大、成本较高,因此我们采用unpaired image translation方法来实现。

    Unpaired image translation流派最经典方法是CycleGAN,但原始CycleGAN的生成结果往往存在较为明显的伪影且不稳定。近期的论文U-GAT-IT提出了一种归一化方法——AdaLIN,能够自动调节Instance Norm和Layer Norm的比重,再结合attention机制能够实现精美的人像日漫风格转换。

    与夸张的日漫风不同,我们的卡通风格更偏写实,要求既有卡通画的简洁Q萌,又有明确的身份信息。为此我们增加了Face ID Loss,使用预训练的人脸识别模型提取照片和卡通画的ID特征,通过余弦距离来约束生成的卡通画。

    此外,我们提出了一种Soft-AdaLIN(Soft Adaptive Layer-Instance Normalization)归一化方法,在反规范化时将编码器的均值方差(照片特征)与解码器的均值方差(卡通特征)相融合。

    模型结构方面,在U-GAT-IT的基础上,我们在编码器之前和解码器之后各增加了2个hourglass模块,渐进地提升模型特征抽象和重建能力。

    由于实验数据较为匮乏,为了降低训练难度,我们将数据处理成固定的模式。首先检测图像中的人脸及关键点,根据人脸关键点旋转校正图像,并按统一标准裁剪,再将裁剪后的头像输入人像分割模型去除背景。

    实际操作也很简单:

    Clone 上述项目

    安装python 3.6、pytorch 1.4、tensorflow-gpu 1.14、face-alignment、dlib一定要用conda

    安装过程中有很多坑,比如pillow的版本要调整之类的

    下载pretrain的模型(提取码:z2nm)放到model路径下:https://pan.baidu.com/s/1DxWWBAoaBpsei_rynZUZzw

    执行以下命令,生成图片会在save_path路径下找到:python3 test.py --photo_path ./images/photo_test.jpg --save_path ./images/cartoon_result.png

    原文链接:https://blog.csdn.net/buptgshengod/article/details/105715345

    展开全文
  • 寻找目标客户,主要有以下几个方法:1、先要明确目标客户的画像、了解目标客户的属性、标签、特征和大概数据2、锁定一类特征的人群作为目标客户,找到这类客户经常出现的时间和场景3、定点投放自己的广告、实地到...

    寻找目标客户,主要有以下几个方法:

    1、先要明确目标客户的画像、了解目标客户的属性、标签、特征和大概数据

    2、锁定一类特征的人群作为目标客户,找到这类客户经常出现的时间和场景

    3、定点投放自己的广告、实地到场景中去触达目标客户,去实际验证和确认

    4、通过反复的推演和实践、不断精细化、精准化目标客户的特征,锁定他们

    5、进入目标客户的社交圈,建立自己的社交圈,不断筛选客户、沉淀老客户

    下面我们深入分享:

    39e4c6b42a7a3f85ca2449663e4c968c.png

    01 先要明确目标客户的画像、了解目标客户的属性、标签、特征和大概数据

    寻找目标客户的第一步是明确目标客户是谁,长什么样,有什么特征、属性和标签,通过明确目标客户的画像来做到这一点。

    使用客户画像的作用是根据产品和服务,预先圈定统一具备某些特征的用户作为目标,把这个目标当作自己的准目标客户。

    这样我们会得到以下一些客户特征:

    1. 什么年龄段的人,年龄在多少到多少岁之间
    2. 什么性别为主的人,是女性还是男性为主
    3. 具备什么学历、教育背景、知识、经验等
    4. 在消费习惯、数据上有什么样的特点
    5. 他们有什么共同的兴趣、爱好等
    a0ea4d3e5a065816ff3a824079dfcbfa.png

    02 锁定一类特征的人群作为目标客户,找到这类客户经常出现的时间和场景

    利用客户画像我们得到了一类人群,接下来一步要做的的是找到他们。

    通过分析这类人群的行为习惯,我们会得出几个他们经常出没的场景,比如:

    1. 是坐公共交通为主,还是以自驾和打车为主
    2. 日常吃饭是居家为主,还是大排档、快餐店,或是餐馆酒店
    3. 获取相关产品信息,是通过某度搜索居多,还是通过微信群朋友圈居多
    4. 采取消费行动,是线下实体店居多,还是线上网店、或看直播购物居多

    寻找目标客户就要了解客户,了解客户的特征,更要了解客户的行为习惯。

    fa1fe460cf352e289083de982f943103.png

    03 定点投放自己的广告、实地到场景中去触达目标客户,去实际验证和确认

    明确锁定了客户习惯出没的场景,接下来一步要实地到场景中去触达目标客户。

    这个实地场景不光指线下实体店面、展会、商场,还包括兴趣社群、贴吧、搜索引擎、新闻App、直播平台等等。

    所谓触达目标客户是指要借助一定的信息、广告、工具吸引目标客户观看、了解、拍照、点击、阅读、收藏、转发等等。

    只有通过有效地触达客户,才能根据客户反馈的信息数据验证和确认客户的精准度和兴趣度。

    在客户有效反馈之前,所有的努力都只是臆测和推断,只有得到了客户的反馈,才能让臆测和推论有了进一步精准推进的依据。

    2479c801af2052a1da7ba43c5e102c51.png

    04 通过反复的推演和实践、不断精细化、精准化目标客户的特征,锁定他们

    如果客户的反馈信息非常好,那说明之前的工作是准确和有效的。

    如果客户的反馈信息很差,那就需要从几个方面入手解决问题:

    1. 客户画像的描述是否出了主观臆断的错误
    2. 客户的行为分析是否出现了主观推断的偏差
    3. 客户的场景选择是否不合适、不精准、缺乏有效的客户
    4. 触达客户的信息、广告、工具是否不够精准、不够有效

    寻找目标客户要在这些步骤中不断反复推演和实践、不断精细化、精准化目标客户的特征,逐步锁定精准客户。

    cdbc7e0d99337289734474b329e5b6d7.png

    05 进入目标客户的社交圈,建立自己的社交圈,不断筛选客户、沉淀老客户

    一旦找到一部分目标客户,接下来的步骤是进入目标客户的社交圈。

    通过成交和有效交付的客户,在他们的社交圈里寻找和他们类似的目标客户,这是最有效的。

    真正要和客户建立长期、持续、有粘性的关系,还需要建立自己的社交圈,让自己成为这类目标客户欢迎的人或企业,让客户确定他们某些特定的需求,可以有效地在你的社交圈里得到解决,这是个人或企业不断筛选客户、沉淀老客户、发展新客户的秘诀。

    这就不难理解为什么很多企业老板经常看似不务正业,不是组局出游、就是搞茶会、酒局,甚至自己搞协会、联盟、俱乐部等等。

    其实对于老板而言寻找目标客户是日常工作,但要把这种工作隐藏在各种社交中,才是高手!


    头条号作者:策划人子禾
    定位和价值:帮你找到内心的热爱和快乐,让你工作开窍,业务开窍,商业头脑开窍!

    展开全文
  • 还有画像二字,也是很懵逼,画像,什么一个僵尸吗。选完题目之后,后面就组队,不得不说我们团队还是配合相当不错,师姐,师兄,师妹,个个都很给力,通过我们团队合作,可以说是相当完美了。...
  • 用户画像是真实用户的虚拟代表,是建立在一系列真实数据之上的目标用户模型,是一个一个标签的集合将标签组合起来,把一个群体具象成一个“人”的形象;...,就是因为你很了解你自己的朋友,同时很清楚他的需求!2.构...
  • 前言:在平常生活中,我们可能会遇到别人有自己的好看的卡通头像,这时候我们可以自己设计。准备工作:Photoshop CC 2019及以上版本素材图片一张Ctrl+N 新建画布高度 宽度定颜色为白色打卡新图片,套索工具选中...
  • 尤其是当几人合做一个大型场景项目时,各种文件交接替换,让你应接不暇,每天手忙脚乱,又没干多少实事儿?为此小编深受折磨,经过搜索和学习,总结出来一些心得,自如有更加方便快捷管理方式,请各位不吝赐教。...
  • 本周内容一览▼周一:这样拼贴,很...本篇文章教大家来制作出融球效果,这种效果在我们学习当代首饰、配饰,以及服装中都有可能出现或运用到,那么该如何利用我们熟悉软件和工具来制作出这种熔融效果呢?接下...
  • 作者 | 李秋键责编 |晋兆雨本文转| AI科技大本营引言:人脸图像生成在各个行业有着重要应用,例如刑事调查、人物设计、教育培训等。然而一幅逼真人脸肖像,对于职业画家也要至少数小时才能绘制出来;对于从未...
  • 面对如此海量信息,用户很难快速找到自己感兴趣内容。于是制作用户用户画像,计算兴趣类标签变得越来越重要。今天,本文作者就为我们分享了“用户兴趣偏好”标签计算方法。今天分享一下“用户兴趣偏好”标签...
  • 前言 记得以前看到过一个很赞文字效果动画,类似于这样: 当时被惊艳到了,最近偶然间又再次见到,依然还是那么喜欢。假设我们现在需要实现这样...选轮子就选姑娘,你不知道后面等着你是什么 —–罪恶
  • 大家应该前段时间都被StyleGan生成动漫(老婆)头像的新闻刷屏了,但是基本上玩的起来的都是比较核心的程序猿,本文的主旨意思是希望每一个热爱...想要生成属于自己的头像,首先要在自己的电脑上部署CUDA和tensorflow...
  • 如何快速全面建立自己的大数据知识体系? 大数据 ETL 用户画像 机器学习 阅读232  作者经过研发多个大数据产品,将自己形成关于大数据知识体系的干货分享出来,...
  • 用户画像的准则(用户画像的建模)将自己的企业数据进行一个白描。知道用户都是谁,从哪里来,到哪里去; 1知道用户从哪里来,需要统一标识用户ID,以便对用户进行后续跟踪; 知道用户是谁,需要对用户进行标签化...
  • ZBrush中贴图纹理怎么...可、智、点、道、看看zbrush这种遮罩效果如何制作出来 就是花纹遮罩...看这个花纹很迷彩,不过这类遮罩都有一个方法。1、首先保证模型有足够细分级别。2、在tool工具下找到surfac...
  • 卡通雕像以及如何开始你自己的收藏 的动漫现象起源于日本,它是受漫画和日本漫画影响的动画风格。该字符有大眼睛,长长的四肢,大发,过于夸张的面部表情,以及其他鲜明的特点。动漫是广受欢迎的世界各地,它是在...
  • 其实,我们的问题大多出在对客户了解不全面,或用消自己的主观意识去判断客户。在大数据时代,用户画像便是了解客户的宝器!收集费者信息生成用户画像是我们实现精准营销,赋能营销增长的重要手段。一、什么是用户...
  • 用户画像

    2020-03-20 18:32:29
    我写这个博文只是为了记录自己找到资料,也为其他人参考 首先如果要找用户画像定义,百度百科等地方描述过于单调,可以参考 定义:数据驱动与用户画像 构建用户画像中所用到AI算法 如何构建电商用户画像 .....
  • 但是应该如何知道自己的账号上有多少精准流量呢?我在这里给大家分享两个看粉丝数据的方式。第一个就是你在手机版抖音上点“我”,然后在设置里面找到“创作者服务中心”,里面就有对数据的一些采集,如下图这样的。...
  • 对方也提供了非常多思想值得自己很好思考。 先是和他聊了下我们现在做内容标签进展,其实就是在做内容画像。我们一般都是在谈用户画像,其实内容也是要画像。 我之前说,内容和用户是现在互联网企业核心两...
  • 不管做什么产品的销售,最理想的状况就是找到源源不断的客户。...所以,能够准确地构建自己的客户画像,会大大提升成交率!1、用户画像的定义用户画像,通俗地理解,就是购买我们产品和品牌的客户,他们的共同特...
  • 面对如此海量信息,用户很难快速找到自己感兴趣内容。于是制作用户用户画像,计算兴趣类标签变得越来越重要。今天,本文作者就为我们分享了“用户兴趣偏好”标签计算方法。今天分享一下“用户兴趣偏好”标签...
  • 简单素描人物图片1简单素描人物图片2简单素描人物图片3简单素描人物图片4简单素描人物图片5人物素描技巧与绘画步骤第一步,构思、构图在开始人物素描前要养成观察对象特征、酝酿自己情绪...
  • 如果说有什么能力是产品经理最需要具备核心能力,那么答案一定是“了解用户”,而要说如何体现产品经理对用户了解程度,那一定是能输出一份合格用户画像。——黄瀚星作为一个产品经理,我们总是希望自己...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 747
精华内容 298
关键字:

如何画自己的自画像