完成了,对两个函数的重构,放入了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
中午,我完成了对代码的重构,并完成对应的博客日志,积累自己当天的工作成果。
- 将目录path,改为dir2
- 发现,生成了9项,应该是10项才对。
- 有两张standing man,因此,我需要在保存的时候,重命名。
- 把相关的函数整理到模块中。也就是imagebox.py。save_ith_box,和save_10_boximg这两个函数。再修改一下循环引用的语句,把他们注释掉。比如。
# from imagebox import file_2_10_boxes_list - 注释掉 %matplotlib inline
- 将print,改为logger.info
- 写下这篇日志
最终我完成了,对两个函数的重构,放入了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)