0
点赞
收藏
分享

微信扫一扫

处理一张图片生成10个子图片,而且读取语义文本,比如'red hat'

完成了,对两个函数的重构,放入了imagebox.py文件中

我从博客的文章日志,继续处理twitter数据集,重构代码。正向反馈,提高效率。

重构save_10_boximg函数

1.添加im_file参数

2.添加生成boxlist的流程,目的是,让接口只需要调用save_10_boximg函数,就可以完成对子图片的提取。这样就可以为下一步提取特征做准备。无论是文字还是图片的特征。

3.修改函数的功能,让他可以在指定的路径,生成一个以图片命名的目录。把子图片存储在这个子目录中。这样函数功能就符合预期了。

这就包含了创建目录的代码了。

from imagebox import file_2_10_boxes_list
box_list = file_2_10_boxes_list(im_file)

第三个部分即将完成,还剩下最后一个目录的修改

#将目录path,改为dir2,到了此处,重构完成。

   

#3.生成目的子目录
    print(f'im_file:  {im_file}')
    son_dir = im_file.split('/')[-1][:-4]
    obj_dir = path + son_dir +'/'
    print(f'obj_dir :  {obj_dir}')
    dir2 = obj_dir
    try:
        os.mkdir(dir2)
        print('mkdir ' + dir2)
    except FileExistsError:
        pass


可以先用print,后期改为logger.info

Nov,24

中午,我完成了对代码的重构,并完成对应的博客日志,积累自己当天的工作成果。

  1. 将目录path,改为dir2
  2. 发现,生成了9项,应该是10项才对。
  3. 有两张standing man,因此,我需要在保存的时候,重命名。
  4. 把相关的函数整理到模块中。也就是imagebox.py。save_ith_box,和save_10_boximg这两个函数。再修改一下循环引用的语句,把他们注释掉。比如。
    # from imagebox import file_2_10_boxes_list
  5. 注释掉 %matplotlib inline
  6. 将print,改为logger.info
  7. 写下这篇日志

最终我完成了,对两个函数的重构,放入了imagebox.py文件中。

#Nov,24
def save_ith_box(im, box_list,  i = 0, path = '/home/dn/'):
    '''
    save one of 10 box in a big picture
    i: 0 -- 9 ,10个目标框的序号
    box_list : 从预训练模型中的提取的语义信息,包含
    4个坐标值,一个带有感情色彩的字符串,形容词和
    名词组成。
    im :opencv读取的图片的数组值:numpy形式
    path:要存储的目标路径
    '''
    array , att_str= box_list[i]
    logger.info(array)
    logger.info(att_str)

    x1,y1,x2,y2 = array
    x1,y1,x2,y2 = int(x1),int(y1),int(x2),int(y2)
    logger.info('convert to int')

    logger.info('display img by cv2')

    import cv2
    # %matplotlib inline
    # im = cv2.imread(im_file)
    logger.info('cv2.imread return : ' + str(type(im)))
    logger.info('display cv2 to jupyter:')
    
    patch_img = im[y1:y2,x1:x2]
    logger.info(patch_img.shape)
    # cv2_show_img(patch_img, att_str)
    # 在这里需要对保存路径重修命名,因为有重名的部分。red hat.jpg 
    # 改为 0.red hat.jpg ,后期还可以用split()函数处理。聪明,yeah!
    # newpath = path + att_str + '.jpg'
    newpath = path + str(i) + '.' + att_str + '.jpg'
    cv2.imwrite(newpath,patch_img)
    logger.info('success saved : ' + newpath)


def save_10_boximg(im_file, path = '/home/dn/10boximg/'):
    '''
    save 10 box img to a path
    这个里面,需要传递box_list参数
    需要接口:
    im_file : 数据集中的每一张图片的路径。
    im_file可以经过cv2生成im
    因为box_list在for循环中是重复使用的。因此box_list可以放入该函数。
    path:是要要保存的目的路径
    
    '''
    # 测试box_list的生命周期
    # box_list = None
    # 这说明,局部变量box_list并不能进入函数 save_ith_box(i,path)
    # 1.生成im,保存子图片的时候有用
    import cv2
    im = cv2.imread(im_file)
    logger.info('handling img: ' + im_file)
    logger.info('read by opencv')
    #2.生成boxlist数组
    # from imagebox import file_2_10_boxes_list
    box_list = file_2_10_boxes_list(im_file)
    
    #3.生成目的子目录
    logger.info(f'im_file:  {im_file}')
    son_dir = im_file.split('/')[-1][:-4]
    obj_dir = path + son_dir +'/'
    logger.info(f'obj_dir :  {obj_dir}')
    dir2 = obj_dir
    import os
    try:
        os.mkdir(dir2)
        logger.info('mkdir ' + dir2)
    except FileExistsError:
        pass
    
    
    
    for i in range(10):
        logger.info('-'*40)
        logger.info('save ' +str(i)  + 'th img to ' + dir2 )
        #将目录path,改为dir2,到了此处,重构完成。
        save_ith_box(im, box_list,  i, dir2)




举报

相关推荐

0 条评论