在自建的数据集上训练yolov3准备(二):树莓派自动采集图片,tensorflow_label_tool下载图片,yolo_mark标注与清洗数据(附python脚本)


前言


        上一篇文章写了如何在Google的open image v4上分类下载数据集并保存成yolo格式,这里接着写。为了确认标注没有问题,我们可以用yolo_mark来清洗一遍。而有时可能我们需要自己采集数据,这里我用树莓派加上一个广角摄像头完成了我的自动采集任务。如果可以,我们还可以在网上去爬一些数据回来,这里我用了github上的一个小工具,效果还不错。


工具



树莓派自动采集脚本


        树莓派加一个广角摄像头,树莓派由于我要比较大的场面,所以选择了170度(水平角143度)的广角摄像头,像素只有200万,这点导致了最后出来的照片损失了很多的细节。在树莓派上安装好opencv,插好usb摄像头,运行下面程序就可以实现自动采集图片,图片放在当前文件夹,以当前系统时间命名。不采集时拔掉摄像头即可退出程序。

import cv2
import datetime
cap = cv2.VideoCapture(0)
width = 1920
height = 1080
cap.set(cv2.CAP_PROP_FRAME_WIDTH,width)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT,height)
i = 1
while(cap.isOpened()):
    cv2.waitKey(5)
    i = i + 1
    ret, frame = cap.read()
    now_time = datetime.datetime.now()
    time_str = datetime.datetime.strftime(now_time,'%Y-%m-%d-%H:%M:%S')
    if frame is None:
        continue
    elif i > 15:
        i = 1
        cv2.imwrite(time_str+'.jpg' ,frame)
        cv2.imshow('cap',cv2.resize(frame,(480,270)))

cap.release()
cv2.destroyAllWindows()
    

tensorflow_label_tool工具下载图片


         tensorflow_label_tool就是一个运行在windows上的一个app。选择下载,输入关键字、下载张数,文件名、和缩放宽高(其值为0时表示不缩放,默认是300x300,表示在不改变原有形状的前提下把图片补黑底或者压缩到300x300)结果放在download目录下。

                                


tensorflow里的工具实现裁剪


        随机裁剪是在tensorflow里的一个数据增强的方法,输入图像和想要裁剪的大小就可以得到特定输出。每次裁剪只会得到一幅图片,所以我采用多次循环来得到多张裁剪图片。虽然我在每一次大循环后都有释放变量,但是随着输入图片的增多,依旧会出现内存不够的情况,一直没有解决,如果有知道解决方法的朋友有缘看到这里,还望不吝赐教。其他还有很多数据增强的方法,比如镜像,改变颜色等。另外,我这里裁剪的另一个目的是减少每张图片里目标的密度,便于标记。


import tensorflow as tf
import cv2
import os
import glob 
import gc
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

if __name__ == "__main__":
    WSI_MASK_PATH = 'G:\Yolo_mark-master'
    paths = glob.glob(os.path.join(WSI_MASK_PATH, '*.jpg'))
    paths.sort()
    for path in paths:
        img = cv2.imread(path)
        filename = os.path.basename(path)
        for cnt in range(4):
            crop_img = tf.random_crop(img,[550,550,3])
            sess = tf.InteractiveSession()
            cv2.imwrite("crop/" + str(cnt)+ "_"+ filename,crop_img.eval())
            img2 = cv2.imread("crop/" + str(cnt) + "_" + filename)
            cut_img = cv2.resize(img2,(608,608),interpolation = cv2.INTER_CUBIC)
            cv2.imwrite("cut/" + str(cnt) + "_" + filename,cut_img)
            sess.close()
            del crop_img,img2,cut_img,sess
            gc.collect()
            cv2.waitKey(100)   
        del filename,img,cnt,path
        gc.collect()
        cv2.waitKey(100)

yolo_mark标注与清洗


        这里用的yolo_mark小工具进行标记,它支持windows和linux,编译生成可执行文件就可以使用它。编译前先修改obj.names文件,按照一定顺序,使之适应你的任务要求。将你要标注的数据放在img文件夹里,然后双击yolo_mark.cmd打开yolo_mark就可以进行标注了。键盘输入“h”键查看一些操作命令,比如“c”是清除当前图片的所有标注,“r”是清除选中目标的标注。标注一张图片就会对应生成一个标注文本文件,并在train.txt文件里追加一条路径。

           


用yolo_mark清洗


        标注完成的数据可能出现错误,可以用yolo_mark清洗一遍,这样顺便还把所有的路径都添加到了train.txt里,一举两得


参考


https://blog.csdn.net/wulala789/article/details/80588424

https://blog.csdn.net/sinat_29957455/article/details/80629098

https://blog.csdn.net/chaipp0607/article/details/80009195

发布了28 篇原创文章 · 获赞 34 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/sinat_35907936/article/details/89086081