Python 实现 深度学习图片爬虫、以及批量处理工具

主要是作为深度学习Caffe SSD 数据预训练的工具
第一步 实现 爬虫(hexie)

这里 主要参考了 github 上的 大神的代码 二次开发,使用了多线程。
respect
http://lovenight.github.io/2015/11/15/Python-3-%E5%A4%9A%E7%BA%BF%E7%A8%8B%E4%B8%8B%E8%BD%BD%E7%99%BE%E5%BA%A6%E5%9B%BE%E7%89%87%E6%90%9C%E7%B4%A2%E7%BB%93%E6%9E%9C/

第二步 实现照片批处理

首先是界面UI使用 QT design 设计
mainwindow.ui


<ui version="4.0">
 <class>MainWindowclass>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0x>
    <y>0y>
    <width>1400width>
    <height>900height>
   rect>
  property>
  <property name="minimumSize">
   <size>
    <width>1400width>
    <height>900height>
   size>
  property>
  <property name="maximumSize">
   <size>
    <width>1400width>
    <height>900height>
   size>
  property>
  <property name="windowTitle">
   <string>MainWindowstring>
  property>
  <widget class="QWidget" name="centralWidget">
   <widget class="QWidget" name="verticalLayoutWidget_2">
    <property name="geometry">
     <rect>
      <x>0x>
      <y>0y>
      <width>1391width>
      <height>821height>
     rect>
    property>
    <layout class="QVBoxLayout" name="verticalLayout_2" stretch="2,1,1,1,16">
     <item>
      <layout class="QHBoxLayout" name="horizontalLayout_2" stretch="1,1,10,2,2,0">
       <item>
        <spacer name="horizontalSpacer_4">
         <property name="orientation">
          <enum>Qt::Horizontalenum>
         property>
         <property name="sizeType">
          <enum>QSizePolicy::Maximumenum>
         property>
         <property name="sizeHint" stdset="0">
          <size>
           <width>30width>
           <height>20height>
          size>
         property>
        spacer>
       item>
       <item>
        <widget class="QLabel" name="label_10">
         <property name="minimumSize">
          <size>
           <width>40width>
           <height>40height>
          size>
         property>
         <property name="text">
          <string> PATH   :string>
         property>
        widget>
       item>
       <item>
        <widget class="QLineEdit" name="lineEdit">
         <property name="minimumSize">
          <size>
           <width>40width>
           <height>50height>
          size>
         property>
        widget>
       item>
       <item>
        <widget class="QPushButton" name="scanButton">
         <property name="minimumSize">
          <size>
           <width>40width>
           <height>50height>
          size>
         property>
         <property name="styleSheet">
          <string notr="true"/>
         property>
         <property name="text">
          <string>Scanstring>
         property>
        widget>
       item>
       <item>
        <widget class="QPushButton" name="loadButton">
         <property name="minimumSize">
          <size>
           <width>40width>
           <height>50height>
          size>
         property>
         <property name="text">
          <string>Loadstring>
         property>
        widget>
       item>
       <item>
        <spacer name="horizontalSpacer_3">
         <property name="orientation">
          <enum>Qt::Horizontalenum>
         property>
         <property name="sizeType">
          <enum>QSizePolicy::Maximumenum>
         property>
         <property name="sizeHint" stdset="0">
          <size>
           <width>30width>
           <height>20height>
          size>
         property>
        spacer>
       item>
      layout>
     item>
     <item>
      <spacer name="verticalSpacer_15">
       <property name="orientation">
        <enum>Qt::Verticalenum>
       property>
       <property name="sizeType">
        <enum>QSizePolicy::Maximumenum>
       property>
       <property name="sizeHint" stdset="0">
        <size>
         <width>20width>
         <height>5height>
        size>
       property>
      spacer>
     item>
     <item>
      <layout class="QHBoxLayout" name="horizontalLayout_9">
       <item>
        <spacer name="horizontalSpacer_7">
         <property name="orientation">
          <enum>Qt::Horizontalenum>
         property>
         <property name="sizeType">
          <enum>QSizePolicy::Maximumenum>
         property>
         <property name="sizeHint" stdset="0">
          <size>
           <width>30width>
           <height>20height>
          size>
         property>
        spacer>
       item>
       <item>
        <widget class="QLabel" name="infoLabel">
         <property name="styleSheet">
          <string notr="true">background-color: rgb(211, 215, 207);string>
         property>
         <property name="text">
          <string>TextLabelstring>
         property>
        widget>
       item>
       <item>
        <spacer name="horizontalSpacer_8">
         <property name="orientation">
          <enum>Qt::Horizontalenum>
         property>
         <property name="sizeType">
          <enum>QSizePolicy::Maximumenum>
         property>
         <property name="sizeHint" stdset="0">
          <size>
           <width>30width>
           <height>20height>
          size>
         property>
        spacer>
       item>
      layout>
     item>
     <item>
      <spacer name="verticalSpacer">
       <property name="orientation">
        <enum>Qt::Verticalenum>
       property>
       <property name="sizeType">
        <enum>QSizePolicy::Maximumenum>
       property>
       <property name="sizeHint" stdset="0">
        <size>
         <width>20width>
         <height>5height>
        size>
       property>
      spacer>
     item>
     <item>
      <layout class="QHBoxLayout" name="horizontalLayout_4">
       <item>
        <spacer name="horizontalSpacer_6">
         <property name="orientation">
          <enum>Qt::Horizontalenum>
         property>
         <property name="sizeType">
          <enum>QSizePolicy::Maximumenum>
         property>
         <property name="sizeHint" stdset="0">
          <size>
           <width>30width>
           <height>20height>
          size>
         property>
        spacer>
       item>
       <item>
        <layout class="QVBoxLayout" name="verticalLayout" stretch="16,1">
         <item>
          <layout class="QGridLayout" name="imgLayout">
           <item row="0" column="0">
            <widget class="QLabel" name="label0">
             <property name="text">
              <string/>
             property>
            widget>
           item>
          layout>
         item>
         <item>
          <layout class="QHBoxLayout" name="horizontalLayout_3">
           <item>
            <spacer name="horizontalSpacer_2">
             <property name="orientation">
              <enum>Qt::Horizontalenum>
             property>
             <property name="sizeType">
              <enum>QSizePolicy::Maximumenum>
             property>
             <property name="sizeHint" stdset="0">
              <size>
               <width>10width>
               <height>20height>
              size>
             property>
            spacer>
           item>
           <item>
            <widget class="QLabel" name="label_11">
             <property name="text">
              <string>Processstring>
             property>
            widget>
           item>
           <item>
            <widget class="QProgressBar" name="progressBar">
             <property name="minimumSize">
              <size>
               <width>0width>
               <height>40height>
              size>
             property>
             <property name="maximumSize">
              <size>
               <width>166666width>
               <height>40height>
              size>
             property>
             <property name="value">
              <number>24number>
             property>
            widget>
           item>
           <item>
            <spacer name="horizontalSpacer_9">
             <property name="orientation">
              <enum>Qt::Horizontalenum>
             property>
             <property name="sizeType">
              <enum>QSizePolicy::Maximumenum>
             property>
             <property name="sizeHint" stdset="0">
              <size>
               <width>20width>
               <height>20height>
              size>
             property>
            spacer>
           item>
          layout>
         item>
        layout>
       item>
       <item>
        <layout class="QGridLayout" name="gridLayout">
         <item row="1" column="0">
          <widget class="QPushButton" name="startButton">
           <property name="minimumSize">
            <size>
             <width>200width>
             <height>60height>
            size>
           property>
           <property name="maximumSize">
            <size>
             <width>200width>
             <height>60height>
            size>
           property>
           <property name="text">
            <string>STARTstring>
           property>
          widget>
         item>
         <item row="17" column="0">
          <widget class="QPushButton" name="addButton">
           <property name="minimumSize">
            <size>
             <width>200width>
             <height>50height>
            size>
           property>
           <property name="maximumSize">
            <size>
             <width>200width>
             <height>50height>
            size>
           property>
           <property name="text">
            <string>BIGGERstring>
           property>
          widget>
         item>
         <item row="15" column="0">
          <layout class="QHBoxLayout" name="horizontalLayout">
           <item>
            <widget class="QPushButton" name="SButton">
             <property name="minimumSize">
              <size>
               <width>60width>
               <height>60height>
              size>
             property>
             <property name="maximumSize">
              <size>
               <width>60width>
               <height>60height>
              size>
             property>
             <property name="text">
              <string>Sstring>
             property>
            widget>
           item>
           <item>
            <widget class="QPushButton" name="MButton">
             <property name="minimumSize">
              <size>
               <width>60width>
               <height>60height>
              size>
             property>
             <property name="maximumSize">
              <size>
               <width>60width>
               <height>60height>
              size>
             property>
             <property name="text">
              <string>Mstring>
             property>
            widget>
           item>
           <item>
            <widget class="QPushButton" name="LButton">
             <property name="minimumSize">
              <size>
               <width>60width>
               <height>60height>
              size>
             property>
             <property name="maximumSize">
              <size>
               <width>60width>
               <height>60height>
              size>
             property>
             <property name="text">
              <string>Lstring>
             property>
            widget>
           item>
          layout>
         item>
         <item row="11" column="0">
          <widget class="QPushButton" name="saveButton">
           <property name="minimumSize">
            <size>
             <width>200width>
             <height>60height>
            size>
           property>
           <property name="maximumSize">
            <size>
             <width>200width>
             <height>60height>
            size>
           property>
           <property name="text">
            <string>SAVEstring>
           property>
          widget>
         item>
         <item row="18" column="0">
          <spacer name="verticalSpacer_11">
           <property name="orientation">
            <enum>Qt::Verticalenum>
           property>
           <property name="sizeType">
            <enum>QSizePolicy::Maximumenum>
           property>
           <property name="sizeHint" stdset="0">
            <size>
             <width>20width>
             <height>15height>
            size>
           property>
          spacer>
         item>
         <item row="12" column="0">
          <spacer name="verticalSpacer_9">
           <property name="orientation">
            <enum>Qt::Verticalenum>
           property>
           <property name="sizeType">
            <enum>QSizePolicy::Maximumenum>
           property>
           <property name="sizeHint" stdset="0">
            <size>
             <width>20width>
             <height>15height>
            size>
           property>
          spacer>
         item>
         <item row="5" column="0">
          <widget class="QPushButton" name="startButton_2">
           <property name="minimumSize">
            <size>
             <width>200width>
             <height>60height>
            size>
           property>
           <property name="maximumSize">
            <size>
             <width>200width>
             <height>60height>
            size>
           property>
           <property name="text">
            <string>NEXTstring>
           property>
          widget>
         item>
         <item row="2" column="0">
          <spacer name="verticalSpacer_14">
           <property name="orientation">
            <enum>Qt::Verticalenum>
           property>
           <property name="sizeType">
            <enum>QSizePolicy::Maximumenum>
           property>
           <property name="sizeHint" stdset="0">
            <size>
             <width>20width>
             <height>15height>
            size>
           property>
          spacer>
         item>
         <item row="11" column="1">
          <spacer name="horizontalSpacer">
           <property name="orientation">
            <enum>Qt::Horizontalenum>
           property>
           <property name="sizeType">
            <enum>QSizePolicy::Maximumenum>
           property>
           <property name="sizeHint" stdset="0">
            <size>
             <width>30width>
             <height>20height>
            size>
           property>
          spacer>
         item>
         <item row="8" column="0">
          <spacer name="verticalSpacer_3">
           <property name="orientation">
            <enum>Qt::Verticalenum>
           property>
           <property name="sizeType">
            <enum>QSizePolicy::Maximumenum>
           property>
           <property name="sizeHint" stdset="0">
            <size>
             <width>20width>
             <height>15height>
            size>
           property>
          spacer>
         item>
         <item row="3" column="0">
          <widget class="QPushButton" name="stopButton">
           <property name="minimumSize">
            <size>
             <width>200width>
             <height>60height>
            size>
           property>
           <property name="maximumSize">
            <size>
             <width>200width>
             <height>60height>
            size>
           property>
           <property name="text">
            <string>STOPstring>
           property>
          widget>
         item>
         <item row="7" column="0">
          <widget class="QPushButton" name="lastButton">
           <property name="minimumSize">
            <size>
             <width>200width>
             <height>60height>
            size>
           property>
           <property name="maximumSize">
            <size>
             <width>200width>
             <height>60height>
            size>
           property>
           <property name="text">
            <string>LASTstring>
           property>
          widget>
         item>
         <item row="19" column="0">
          <widget class="QPushButton" name="jianButton">
           <property name="minimumSize">
            <size>
             <width>200width>
             <height>50height>
            size>
           property>
           <property name="maximumSize">
            <size>
             <width>200width>
             <height>50height>
            size>
           property>
           <property name="text">
            <string>SMALLERstring>
           property>
          widget>
         item>
         <item row="16" column="0">
          <spacer name="verticalSpacer_10">
           <property name="orientation">
            <enum>Qt::Verticalenum>
           property>
           <property name="sizeType">
            <enum>QSizePolicy::Maximumenum>
           property>
           <property name="sizeHint" stdset="0">
            <size>
             <width>20width>
             <height>15height>
            size>
           property>
          spacer>
         item>
         <item row="14" column="0">
          <spacer name="verticalSpacer_13">
           <property name="orientation">
            <enum>Qt::Verticalenum>
           property>
           <property name="sizeType">
            <enum>QSizePolicy::Maximumenum>
           property>
           <property name="sizeHint" stdset="0">
            <size>
             <width>20width>
             <height>15height>
            size>
           property>
          spacer>
         item>
         <item row="13" column="0">
          <widget class="QPushButton" name="pushButton">
           <property name="minimumSize">
            <size>
             <width>200width>
             <height>60height>
            size>
           property>
           <property name="maximumSize">
            <size>
             <width>200width>
             <height>60height>
            size>
           property>
           <property name="text">
            <string>PLAYstring>
           property>
          widget>
         item>
         <item row="6" column="0">
          <spacer name="verticalSpacer_12">
           <property name="orientation">
            <enum>Qt::Verticalenum>
           property>
           <property name="sizeType">
            <enum>QSizePolicy::Maximumenum>
           property>
           <property name="sizeHint" stdset="0">
            <size>
             <width>20width>
             <height>15height>
            size>
           property>
          spacer>
         item>
         <item row="0" column="0">
          <spacer name="verticalSpacer_2">
           <property name="orientation">
            <enum>Qt::Verticalenum>
           property>
           <property name="sizeType">
            <enum>QSizePolicy::Maximumenum>
           property>
           <property name="sizeHint" stdset="0">
            <size>
             <width>20width>
             <height>40height>
            size>
           property>
          spacer>
         item>
         <item row="4" column="0">
          <spacer name="verticalSpacer_4">
           <property name="orientation">
            <enum>Qt::Verticalenum>
           property>
           <property name="sizeType">
            <enum>QSizePolicy::Maximumenum>
           property>
           <property name="sizeHint" stdset="0">
            <size>
             <width>20width>
             <height>15height>
            size>
           property>
          spacer>
         item>
        layout>
       item>
      layout>
     item>
    layout>
   widget>
  widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0x>
     <y>0y>
     <width>1400width>
     <height>25height>
    rect>
   property>
   <widget class="QMenu" name="menuEDIT">
    <property name="title">
     <string>EDITstring>
    property>
   widget>
   <widget class="QMenu" name="menuRDS">
    <property name="title">
     <string>RDSstring>
    property>
   widget>
   <addaction name="menuEDIT"/>
   <addaction name="menuRDS"/>
  widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarAreaenum>
   attribute>
   <attribute name="toolBarBreak">
    <bool>falsebool>
   attribute>
  widget>
  <widget class="QStatusBar" name="statusBar"/>
 widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
ui>

执行 如下命令:

 pyuic4 mainwindow.ui >tform.py

接下来是pyqt4 的程序开发
主要实现了如下功能:
1、批处理 删除 重命名 大小缩放 翻页
2、照片自动播放预览

#coding=utf-8
import sys
from PyQt4.QtCore import *
from tform import *
from PyQt4.QtGui import *
import os
qtCreatorFile = "zhixi.py" # Enter file here.
#Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)
import time
#static parameter
stateButton=0
deleteList=[]

class MyLabel(QLabel):
    def __init__(self,st):
        super(MyLabel,self).__init__(None)
        #self.setText(a)
        self.st=st
        self.clickButton=0
        #global lis
        global stateButton


    def setB(self,st1):
        self.st=st1
        self.clickButton=0
        if self.st in deleteList:
            self.setFrameShape (QFrame.Box)
        self.setStyleSheet("border: 3px solid  #ff0000")
            self.clickButton=1
        else:
            self.setFrameShape (QFrame.Box)
            self.setStyleSheet("")

    ''' 
    def mousePressEvent(self, e):##重载一下鼠标事件
        #print "you clicked the label"
        pass
    '''

    #def mouseReleaseEvent(self, QMouseEvent):
    def mousePressEvent(self, QMouseEvent):
        if stateButton==1:
            self.clickButton=1-self.clickButton
            if self.clickButton==1:
                self.setFrameShape (QFrame.Box)
            self.setStyleSheet("border: 3px solid  #ff0000")
                if self.st not in deleteList: 
                    deleteList.append(self.st)
                else:
                    pass
            else:
                #self.setFrameShape (QFrame.Box)
                self.setStyleSheet("")
                if self.st in deleteList:
                    deleteList.remove(self.st)
                else:
                    pass

        elif stateButton==0:
            pass
        print "name",self.st,deleteList,self.clickButton


class MyApp(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.ui=Ui_MainWindow()
        self.ui.setupUi(self)
    self.ui.infoLabel.setText('aaa')
    self.a=0
    self.imgLen=0
    self.imgBegin=0
    self.imgEnd=0

        self.imgPage=0
        self.avNum=0
        self.currentPage=1

    self.filename=""
    self.rate=None
    self.sizeW=3
    self.sizeH=2

        self.play=0
    self.ui.scanButton.clicked.connect(self.openFileDirectory)
    self.ui.loadButton.clicked.connect(self.loadFile)
    self.ui.startButton.clicked.connect(self.start)
    self.ui.stopButton.clicked.connect(self.stop)
        self.ui.saveButton.clicked.connect(self.saveFile)
        self.ui.startButton_2.clicked.connect(self.nextPage)
        self.ui.lastButton.clicked.connect(self.lastPage)
        self.ui.jianButton.clicked.connect(self.smaller)
        self.ui.addButton.clicked.connect(self.bigger)
    self.ui.SButton.clicked.connect(self.SSize)
    self.ui.MButton.clicked.connect(self.MSize)
        self.ui.LButton.clicked.connect(self.LSize)
        self.ui.pushButton.clicked.connect(self.playPhoto)

    self.imglist=[]
        self.labelList=[]
        self.setProgress()


    def openFileDirectory(self):
        f_name = QFileDialog.getExistingDirectory(self,"Please choose file directory","./")
        ##"open file Dialog "文件对话框的标题,第二个是打开的默认路径,第三个是文件类型
    self.filename=self.QString2PyString(f_name) 
    self.ui.lineEdit.setText(self.filename)

    def start(self):
        global stateButton
        stateButton=1
        self.play=0
        self.ui.startButton.setEnabled(True)
    self.ui.pushButton.setEnabled(False)


    def stop(self):
        global stateButton
        stateButton=0
        self.play=0
        self.ui.pushButton.setEnabled(True)
        self.ui.startButton.setEnabled(True)



        self.ui.startButton_2.setEnabled(True)
        self.ui.lastButton.setEnabled(True)
        self.ui.saveButton.setEnabled(True)
        #self.ui.startButton.setEnabled(False)


    def loadFile(self):
        self.imglist=[]
    self.saveFile()
    self.imgLen=len(self.imglist)
        self.calNum()
        self.setLay()
        self.setPhoto()
        self.setInfo()
        self.setProgress() 


    def calNum(self):
        self.avNum=self.sizeW*self.sizeH
        if self.imgLen%(self.sizeW*self.sizeH)>0:
            self.imgPage=int(self.imgLen/(self.sizeW*self.sizeH))+1
        else:
            self.imgPage=self.imgLen/(self.sizeW*self.sizeH)
        self.imgBegin=0
        self.currentPage=1
        self.imgEnd=max(min(self.avNum-1,self.imgLen-1),0)
        #print self.imgPage


    def nextPage(self):
    if self.currentPage==self.imgPage:
        self.WarnS("    Now is max Page      ")
    else:
            print self.currentPage
            if self.currentPage+1<=self.imgPage:
                self.currentPage+=1
                self.imgBegin=max(min(self.avNum+self.imgBegin,self.imgLen-1),0)
                self.imgEnd=max(min(self.imgBegin+self.avNum-1,self.imgLen-1),0)
                print self.imgBegin,self.imgEnd,self.imgPage
                self.setInfo()
                self.setProgress()  
                self.setPhoto()   



    def lastPage(self):
        if self.currentPage==1:
        self.WarnS("     Now is 1 Page      ")
        else:
            print self.currentPage
            if self.currentPage-1>0:
                self.currentPage-=1
                self.imgBegin=max(self.imgBegin-self.avNum,0)
                self.imgEnd=max(min(self.imgBegin+self.avNum-1,self.imgLen),0)
                self.setInfo()
                self.setProgress()
                self.setPhoto()


    def playPhoto(self):
        global stateButton
        stateButton=0
        self.play=1
        self.calNum()
        self.currentPage=1
        self.ui.pushButton.setEnabled(True)
        self.ui.startButton.setEnabled(False)
        self.ui.startButton_2.setEnabled(False)
        self.ui.lastButton.setEnabled(False)
        self.ui.saveButton.setEnabled(False)
        for i in range(1,self.imgPage):
            time.sleep(1)
            self.nextPage()



    def QString2PyString(self, qStr):
        # # QString,如果内容是中文,则直接使用会有问题,要转换成 python string
        return unicode(qStr.toUtf8(), 'utf-8', 'ignore')


    def setPhoto(self):
        #if self.imgEnd==self.imgLen:
        if self.imgLen==0:
            self.WarnS("    NO     photo    angmore ")
        else:
            for j in range(0,self.avNum):
                self.labelList[j].setText(" ")
                self.labelList[j].setB("  0 ")
            for i in range(self.imgBegin,self.imgEnd+1):
                s1=self.filename+'/'+self.imglist[i]

                self.labelList[i-self.imgBegin].setPixmap(QPixmap(s1))
                self.labelList[i-self.imgBegin].setB(self.imglist[i])


        '''    
        else:
            for j in range(0,self.avNum):
                self.labelList[j].setText(" ")
            for i in range(self.imgBegin,self.imgEnd+1):
                s1=self.filename+'/'+self.imglist[i]
                self.labelList[i-self.imgBegin].setPixmap(QPixmap(s1))
                self.labelList[i-self.imgBegin].setB(self.imglist[i])

        '''

    def setLay(self):
        try:
            self.ui.imgLayout.removeWidget(label0)
    except:
            pass
    pos = [(x, y) for x in range(self.sizeH) for y in range(self.sizeW)]

        for p in range(0,len(self.labelList)):
         self.ui.imgLayout.removeWidget(self.labelList[p])
             self.labelList[p].deleteLater() 

        self.labelList=[]
        for i in range(len(pos)):
            label =MyLabel(str(i))
        #label.setFrameShape (QFrame.Box)
        #label.setStyleSheet("border: 3px solid  #ff0000")
            #label.setPixmap(QPixmap(s1))
            self.labelList.append(label)
        self.ui.imgLayout.addWidget(label, pos[i][0], pos[i][1])


    def setProgress(self):
    if self.imgEnd==0:
            self.ui.progressBar.setValue(0)
        else:
            self.ui.progressBar.setValue(min(int(float(1.0*self.imgEnd/(self.imgLen-1))*100),100))




    def smaller(self):
    self.sizeW+=1
        self.sizeH+=1
        self.setLay()
        self.calNum()
        self.setPhoto()
        self.setInfo()
        self.setProgress()

    def bigger(self):
    self.sizeW=max(self.sizeW-1,1)
        self.sizeH=max(self.sizeH-1,1)
        self.setLay()
        self.calNum()
        self.setPhoto()
        self.setInfo()
        self.setProgress()

    def SSize(self):
        self.sizeW=8
        self.sizeH+=6
        self.setLay()
        self.calNum()
        self.setPhoto()
        self.setInfo()
        self.setProgress()

    def MSize(self):
        self.sizeW=4
        self.sizeH=3
        self.setLay()
        self.calNum()
        self.setPhoto()
        self.setInfo()
        self.setProgress()

    def LSize(self):
        self.sizeW=2
        self.sizeH=1
        self.setLay()
        self.calNum()
        self.setPhoto()
        self.setInfo()
        self.setProgress()

    def saveFile(self):
    #try:
        global deleteList
        if len(deleteList)==0:
            self.saveFile2()
            self.WarnS("     Load      Succeed      ")
        else:
            self.removeFile()
            self.saveFile2()
            deleteList=[]
            #deleteList=[]
            self.calNum()
            self.setLay()
            self.setPhoto()
            self.setInfo()
            self.setProgress()
            self.WarnS("     Save      Succeed      ")
        '''
        except:
            self.WarnS("     Save Failed      ")
        '''

    def removeFile(self):
        filename=self.filename+'/'
        global deleteList
        bd=[]
        k=len(os.listdir(filename))
        filenameC=filename+"rabbish"
    if os.path.exists(filenameC):   
        pass    
    else:
        os.mkdir(filenameC)
        for filestd in deleteList:
        if filestd[len(filestd)-3:len(filestd)]=='jpg' or filestd[len(filestd)-4:len(filestd)]=='jpeg' or filestd[len(filestd)-3:len(filestd)]=='png':
                bd.append(filestd)   
        for i in range(0,len(bd)):
            k+=1
            name2td=filename+bd[i]
            name2d=filename+'rabbish/'+str(k)+bd[i]
            #print name2td,name2d
            try:
                os.rename(name2td,name2d)
            except:
                pass      

    def saveFile2(self):
        filename=self.filename+'/'
        #print filename
        files = os.listdir(filename)
        b=[]
        b2=[]
        for filestr in files:
        if filestr[len(filestr)-3:len(filestr)]=='jpg' or filestr[len(filestr)-4:len(filestr)]=='jpeg' or filestr[len(filestr)-3:len(filestr)]=='png':
                b.append(filestr)
                #print len(b)
        sx=sorted(b)

        #print sx

        filenameTemp=filename+"temp"

        if os.path.exists(filenameTemp):    
        pass    
    else:
            os.mkdir(filenameTemp)

        for i in range(0,len(b)):
            if i<10:
            si='00'+str(i)
        elif i<100:
            si='0'+str(i)
        elif i<1000:
            si=str(i)
        name2=filename+'temp/'+si+'.jpg'
        name1=filename+sx[i]
        #print name1,name2
        b2.append(si+'.jpg')
        os.rename(name1,name2)
        for j in range(0,len(b2)):
            name22=filename+'temp/'+b2[j]
            name3=filename+b2[j]
            '''
            try:
            '''
            os.rename(name22,name3)
            '''
            except:
                pass
            '''
    os.rmdir(filenameTemp)
        self.imglist=b2
        self.imgLen=len(self.imglist)
        print "imgLen",self.imgLen
        print self.imglist


    def setInfo(self):
    self.ui.infoLabel.setText("  OPEN:   "+self.filename+"     "+"TOTAL: "+str(self.imgLen)+"    "+"Current: "+str(self.imgBegin)+"  to   "+str(self.imgEnd)+"    "+"CurrentPage      "+str(self.currentPage)+"    "+"    Total    "+str(self.imgPage))

    def WarnS(self,s):
        QMessageBox.information(self,QString.fromLocal8Bit("请确认"),QString.fromLocal8Bit(s))  




if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = MyApp()        
    window.show()
    print window.a
    sys.exit(app.exec_())


第三步 实现标注

最后是github 标注工具 bbox 的改进版本 主要改进了图像缩放转换和整体界面

#-------------------------------------------------------------------------------
# Name:        Object bounding box label tool
# Purpose:     Label object bboxes for ImageNet Detection data
# Author:      Qiushi
# Created:     06/06/2014

#
#-------------------------------------------------------------------------------
from __future__ import division
from Tkinter import *
import tkMessageBox
from PIL import Image, ImageTk
import os
import glob
import random

# colors for the bboxes
COLORS = ['red', 'blue', 'yellow', 'pink', 'cyan', 'green', 'black']
# image sizes for the examples
SIZE = 256, 256

class LabelTool():
    def __init__(self, master):
        # set up the main frame
        self.parent = master
        self.parent.title("LabelTool")
        self.frame = Frame(self.parent)
        self.frame.pack(fill=BOTH, expand=1)
        self.parent.resizable(width = FALSE, height = FALSE)

        # initialize global state
        self.imageDir = ''
        self.imageList= []
        self.egDir = ''
        self.egList = []
        self.outDir = ''
        self.cur = 0
        self.total = 0
        self.category = 0
        self.imagename = ''
        self.labelfilename = ''
    self.img = Image.open('index.jpg')
    self.tkimg = ImageTk.PhotoImage(self.img)
    self.img2=None
        # initialize mouse state
        self.STATE = {}
        self.STATE['click'] = 0
        self.STATE['x'], self.STATE['y'] = 0, 0

        # reference to bbox
        self.bboxIdList = []
        self.bboxId = None
        self.bboxList = []
        self.hl = None
        self.vl = None
        self.k=0
        # ----------------- GUI stuff ---------------------
        # dir entry & load
        self.label = Label(self.frame, text = "Image Dir:")
        self.label.grid(row = 0, column = 0, sticky = E)
        self.entry = Entry(self.frame)
        self.entry.grid(row = 0, column = 1, sticky = W+E)
        self.ldBtn = Button(self.frame, text = "Load", command = self.loadDir)
        self.ldBtn.grid(row = 0, column = 2, sticky = W+E)

        # main panel for labeling
        self.mainPanel = Canvas(self.frame, cursor='tcross')
        self.mainPanel.bind("", self.mouseClick)
        self.mainPanel.bind("", self.mouseMove)
        self.parent.bind("", self.cancelBBox)  # press  to cancel current bbox
        self.parent.bind("s", self.cancelBBox)
        self.parent.bind("a", self.prevImage) # press 'a' to go backforward
        self.parent.bind("d", self.nextImage) # press 'd' to go forward
        self.mainPanel.grid(row = 1, column = 1, rowspan = 4, sticky = W+N)

        # showing bbox info & delete bbox
        self.lb1 = Label(self.frame, text = 'Bounding boxes:')
        self.lb1.grid(row = 1, column = 2,  sticky = W+N)
        self.listbox = Listbox(self.frame, width = 22, height = 12)
        self.listbox.grid(row = 2, column = 2, sticky = N)
        self.btnDel = Button(self.frame, text = 'Delete', command = self.delBBox)
        self.btnDel.grid(row = 3, column = 2, sticky = W+E+N)
        self.btnClear = Button(self.frame, text = 'ClearAll', command = self.clearBBox)
        self.btnClear.grid(row = 4, column = 2, sticky = W+E+N)

        # control panel for image navigation
        self.ctrPanel = Frame(self.frame)
        self.ctrPanel.grid(row = 5, column = 1, columnspan = 2, sticky = W+E)
        self.prevBtn = Button(self.ctrPanel, text='<< Prev', width = 10, command = self.prevImage)
        self.prevBtn.pack(side = LEFT, padx = 5, pady = 3)
        self.nextBtn = Button(self.ctrPanel, text='Next >>', width = 10, command = self.nextImage)
        self.nextBtn.pack(side = LEFT, padx = 5, pady = 3)
        self.progLabel = Label(self.ctrPanel, text = "Progress:     /    ")
        self.progLabel.pack(side = LEFT, padx = 5)
        self.tmpLabel = Label(self.ctrPanel, text = "Go to Image No.")
        self.tmpLabel.pack(side = LEFT, padx = 5)
        self.idxEntry = Entry(self.ctrPanel, width = 5)
        self.idxEntry.pack(side = LEFT)
        self.goBtn = Button(self.ctrPanel, text = 'Go', command = self.gotoImage)
        self.goBtn.pack(side = LEFT)

        self.mainPanel.config(width = 800, height = 800)
        self.mainPanel.create_image(0, 0, image = self.tkimg, anchor=NW)
        # example pannel for illustration
    '''
        self.egPanel = Frame(self.frame, border = 10)
        self.egPanel.grid(row = 1, column = 0, rowspan = 5, sticky = N)
        self.tmpLabel2 = Label(self.egPanel, text = "Examples:")
        self.tmpLabel2.pack(side = TOP, pady = 5)
        self.egLabels = []
        for i in range(3):
            self.egLabels.append(Label(self.egPanel))
            self.egLabels[-1].pack(side = TOP)
    '''
        # display mouse position
        self.disp = Label(self.ctrPanel, text='')
        self.disp.pack(side = RIGHT)

        self.frame.columnconfigure(1, weight = 1)
        self.frame.rowconfigure(4, weight = 1)

        # for debugging
##        self.setImage()
##        self.loadDir()

    def loadDir(self, dbg = False):
        if not dbg:
            s = self.entry.get()
            self.parent.focus()
            self.category = int(s)
        else:
            s = r'D:\workspace\python\labelGUI'
##        if not os.path.isdir(s):
##            tkMessageBox.showerror("Error!", message = "The specified dir doesn't exist!")
##            return
        # get image list
        self.imageDir = os.path.join(r'./Images', '%03d' %(self.category))
        imglist1= glob.glob(os.path.join(self.imageDir, '*.jpg'))
    imglist2= glob.glob(os.path.join(self.imageDir, '*.jpeg'))
    imglist3= glob.glob(os.path.join(self.imageDir, '*.JPEG'))
    imglist4= glob.glob(os.path.join(self.imageDir, '*.png'))
    self.imageList= imglist1+imglist2+imglist3+imglist4
        if len(self.imageList) == 0:
            print 'No  images found in the specified dir!'
            return

        # default to the 1st image in the collection
        self.cur = 1
        self.total = len(self.imageList)

         # set up output dir
        self.outDir = os.path.join(r'./Labels', '%03d' %(self.category))
        if not os.path.exists(self.outDir):
            os.mkdir(self.outDir)

        # load example bboxes
    '''
        self.egDir = os.path.join(r'./Examples', '%03d' %(self.category))
        if not os.path.exists(self.egDir):
            return
        filelist = glob.glob(os.path.join(self.egDir, '*.JPEG'))
        self.tmp = []
        self.egList = []
        random.shuffle(filelist)
        for (i, f) in enumerate(filelist):
            if i == 3:
                break
            im = Image.open(f)
            r = min(SIZE[0] / im.size[0], SIZE[1] / im.size[1])
            new_size = int(r * im.size[0]), int(r * im.size[1])
            self.tmp.append(im.resize(new_size, Image.ANTIALIAS))
            self.egList.append(ImageTk.PhotoImage(self.tmp[-1]))
            self.egLabels[i].config(image = self.egList[-1], width = SIZE[0], height = SIZE[1])
    '''
        self.loadImage()
        print '%d images loaded from %s' %(self.total, s)

    def loadImage(self):
        # load image
        imagepath = self.imageList[self.cur - 1]
        self.img = Image.open(imagepath)
    w,h=self.img.size
    print w,h
    if w>h:
        self.k=float(800.0/w)
        print "w>h"
        img=self.img.resize((800,int(self.k*h)))
    else:
        print "w
        self.k=float(800.0/h) 
        img=self.img.resize((int(self.k*w),800))
        self.tkimg = ImageTk.PhotoImage(img)
        #self.mainPanel.config(width = max(self.tkimg.width(), 800), height = max(self.tkimg.height(), 800))
    self.mainPanel.config(width = 800, height = 800)
        self.mainPanel.create_image(0, 0, image = self.tkimg, anchor=NW)
        self.progLabel.config(text = "%04d/%04d" %(self.cur, self.total))

        # load labels
        self.clearBBox()
        self.imagename = os.path.split(imagepath)[-1].split('.')[0]
        labelname = self.imagename + '.txt'
        self.labelfilename = os.path.join(self.outDir, labelname)
        bbox_cnt = 0
        if os.path.exists(self.labelfilename):
            with open(self.labelfilename) as f:
                for (i, line) in enumerate(f):
                    if i == 0:
                        bbox_cnt = int(line.strip())
                        continue
                    tmp = [int(t.strip()) for t in line.split()]
##                  print tmp
                    self.bboxList.append(tuple(tmp))
                    tmpId = self.mainPanel.create_rectangle(tmp[0]*self.k, tmp[1]*self.k, \
                                                            tmp[2]*self.k, tmp[3]*self.k, \
                                                            width = 2, \
                                                            outline = COLORS[(len(self.bboxList)-1) % len(COLORS)])
                    self.bboxIdList.append(tmpId)
                    self.listbox.insert(END, '(%d, %d) -> (%d, %d)' %(tmp[0], tmp[1], tmp[2], tmp[3]))
                    self.listbox.itemconfig(len(self.bboxIdList) - 1, fg = COLORS[(len(self.bboxIdList) - 1) % len(COLORS)])

    def saveImage(self):
        with open(self.labelfilename, 'w') as f:
            f.write('%d\n' %len(self.bboxList))
            for bbox in self.bboxList:
                f.write(' '.join(map(str, bbox)) + '\n')
        print 'Image No. %d saved' %(self.cur)


    def mouseClick(self, event):
        if self.STATE['click'] == 0:
            self.STATE['x'], self.STATE['y'] = event.x, event.y
        else:
            x1, x2 = min(self.STATE['x'], event.x), max(self.STATE['x'], event.x)
            y1, y2 = min(self.STATE['y'], event.y), max(self.STATE['y'], event.y)
            self.bboxList.append((int(x1/self.k), int(y1/self.k), int(x2/self.k), int(y2/self.k)))
            self.bboxIdList.append(self.bboxId)
            self.bboxId = None
            self.listbox.insert(END, '(%d, %d) -> (%d, %d)' %(x1, y1, x2, y2))
            self.listbox.itemconfig(len(self.bboxIdList) - 1, fg = COLORS[(len(self.bboxIdList) - 1) % len(COLORS)])
        self.STATE['click'] = 1 - self.STATE['click']

    def mouseMove(self, event):
        self.disp.config(text = 'k: %.2f  x: %d  y: %d' %(self.k,event.x, event.y))
        if self.tkimg:
            if self.hl:
                self.mainPanel.delete(self.hl)
            self.hl = self.mainPanel.create_line(0, event.y, self.tkimg.width(), event.y, width = 2)
            if self.vl:
                self.mainPanel.delete(self.vl)
            self.vl = self.mainPanel.create_line(event.x, 0, event.x, self.tkimg.height(), width = 2)
        if 1 == self.STATE['click']:
            if self.bboxId:
                self.mainPanel.delete(self.bboxId)
            self.bboxId = self.mainPanel.create_rectangle(self.STATE['x'], self.STATE['y'], \
                                                            event.x, event.y, \
                                                            width = 2, \
                                                            outline = COLORS[len(self.bboxList) % len(COLORS)])

    def cancelBBox(self, event):
        if 1 == self.STATE['click']:
            if self.bboxId:
                self.mainPanel.delete(self.bboxId)
                self.bboxId = None
                self.STATE['click'] = 0

    def delBBox(self):
        sel = self.listbox.curselection()
        if len(sel) != 1 :
            return
        idx = int(sel[0])
        self.mainPanel.delete(self.bboxIdList[idx])
        self.bboxIdList.pop(idx)
        self.bboxList.pop(idx)
        self.listbox.delete(idx)

    def clearBBox(self):
        for idx in range(len(self.bboxIdList)):
            self.mainPanel.delete(self.bboxIdList[idx])
        self.listbox.delete(0, len(self.bboxList))
        self.bboxIdList = []
        self.bboxList = []

    def prevImage(self, event = None):
        self.saveImage()
        if self.cur > 1:
            self.cur -= 1
            self.loadImage()

    def nextImage(self, event = None):
        self.saveImage()
        if self.cur < self.total:
            self.cur += 1
            self.loadImage()

    def gotoImage(self):
        idx = int(self.idxEntry.get())
        if 1 <= idx and idx <= self.total:
            self.saveImage()
            self.cur = idx
            self.loadImage()

##    def setImage(self, imagepath = r'test2.png'):
##        self.img = Image.open(imagepath)
##        self.tkimg = ImageTk.PhotoImage(self.img)
##        self.mainPanel.config(width = self.tkimg.width())
##        self.mainPanel.config(height = self.tkimg.height())
##        self.mainPanel.create_image(0, 0, image = self.tkimg, anchor=NW)

if __name__ == '__main__':
    root = Tk()
    tool = LabelTool(root)
    root.resizable(width =  True, height = True)
    root.mainloop()

你可能感兴趣的:(Python,算法,python,深度学习,爬虫)