TF数据增强

<div id="article_content" class="article_content tracking-ad" data-mod="popu_307" data-dsm="post">
        <div class="markdown_views"><h2 id="1原始状态"><a name="t0" target="_blank"></a>1、原始状态</h2>

<p>最初的图像是这个样子的 <br>
<img src="https://img-blog.csdn.net/20161123095005323" alt="这里写图片描述" title=""> <br>
.xml文件张下面这个样子</p>



<pre class="prettyprint" name="code"><code class="hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">annotation</span>></span>
    <span class="hljs-tag"><<span class="hljs-title">object</span>></span>
        <span class="hljs-tag"><<span class="hljs-title">name</span>></span>face<span class="hljs-tag"></<span class="hljs-title">name</span>></span>
        <span class="hljs-tag"><<span class="hljs-title">difficult</span>></span>0<span class="hljs-tag"></<span class="hljs-title">difficult</span>></span>
        <span class="hljs-tag"><<span class="hljs-title">bndbox</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">xmin</span>></span>315.307918<span class="hljs-tag"></<span class="hljs-title">xmin</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">ymin</span>></span>240.234604<span class="hljs-tag"></<span class="hljs-title">ymin</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">xmax</span>></span>693.677419<span class="hljs-tag"></<span class="hljs-title">xmax</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">ymax</span>></span>699.683284<span class="hljs-tag"></<span class="hljs-title">ymax</span>></span>
        <span class="hljs-tag"></<span class="hljs-title">bndbox</span>></span>
    <span class="hljs-tag"></<span class="hljs-title">object</span>></span>
<span class="hljs-tag"></<span class="hljs-title">annotation</span>></span></code><ul class="pre-numbering" style="opacity: 0;"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul></pre>



<h2 id="2旋转图像并修改对应的xml文件"><a name="t1" target="_blank"></a>2、旋转图像并修改对应的xml文件</h2>



<pre class="prettyprint" name="code"><code class="language-python hljs  has-numbering"><span class="hljs-keyword">import</span> cv2
<span class="hljs-keyword">import</span> math
<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np
<span class="hljs-keyword">import</span> os
<span class="hljs-comment"># pdb仅仅用于调试,不用管它</span>
<span class="hljs-keyword">import</span> pdb

<span class="hljs-comment">#旋转图像的函数</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">rotate_image</span><span class="hljs-params">(src, angle, scale=<span class="hljs-number">1.</span>)</span>:</span>
    w = src.shape[<span class="hljs-number">1</span>]
    h = src.shape[<span class="hljs-number">0</span>]
    <span class="hljs-comment"># 角度变弧度</span>
    rangle = np.deg2rad(angle)  <span class="hljs-comment"># angle in radians</span>
    <span class="hljs-comment"># now calculate new image width and height</span>
    nw = (abs(np.sin(rangle)*h) + abs(np.cos(rangle)*w))*scale
    nh = (abs(np.cos(rangle)*h) + abs(np.sin(rangle)*w))*scale
    <span class="hljs-comment"># ask OpenCV for the rotation matrix</span>
    rot_mat = cv2.getRotationMatrix2D((nw*<span class="hljs-number">0.5</span>, nh*<span class="hljs-number">0.5</span>), angle, scale)
    <span class="hljs-comment"># calculate the move from the old center to the new center combined</span>
    <span class="hljs-comment"># with the rotation</span>
    rot_move = np.dot(rot_mat, np.array([(nw-w)*<span class="hljs-number">0.5</span>, (nh-h)*<span class="hljs-number">0.5</span>,<span class="hljs-number">0</span>]))
    <span class="hljs-comment"># the move only affects the translation, so update the translation</span>
    <span class="hljs-comment"># part of the transform</span>
    rot_mat[<span class="hljs-number">0</span>,<span class="hljs-number">2</span>] += rot_move[<span class="hljs-number">0</span>]
    rot_mat[<span class="hljs-number">1</span>,<span class="hljs-number">2</span>] += rot_move[<span class="hljs-number">1</span>]
    <span class="hljs-comment"># 仿射变换</span>
    <span class="hljs-keyword">return</span> cv2.warpAffine(src, rot_mat, (int(math.ceil(nw)), int(math.ceil(nh))), flags=cv2.INTER_LANCZOS4)

//对应修改xml文件
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">rotate_xml</span><span class="hljs-params">(src, xmin, ymin, xmax, ymax, angle, scale=<span class="hljs-number">1.</span>)</span>:</span>
    w = src.shape[<span class="hljs-number">1</span>]
    h = src.shape[<span class="hljs-number">0</span>]
    rangle = np.deg2rad(angle)  <span class="hljs-comment"># angle in radians</span>
    <span class="hljs-comment"># now calculate new image width and height</span>
    <span class="hljs-comment"># 获取旋转后图像的长和宽</span>
    nw = (abs(np.sin(rangle)*h) + abs(np.cos(rangle)*w))*scale
    nh = (abs(np.cos(rangle)*h) + abs(np.sin(rangle)*w))*scale
    <span class="hljs-comment"># ask OpenCV for the rotation matrix</span>
    rot_mat = cv2.getRotationMatrix2D((nw*<span class="hljs-number">0.5</span>, nh*<span class="hljs-number">0.5</span>), angle, scale)
    <span class="hljs-comment"># calculate the move from the old center to the new center combined</span>
    <span class="hljs-comment"># with the rotation</span>
    rot_move = np.dot(rot_mat, np.array([(nw-w)*<span class="hljs-number">0.5</span>, (nh-h)*<span class="hljs-number">0.5</span>,<span class="hljs-number">0</span>]))
    <span class="hljs-comment"># the move only affects the translation, so update the translation</span>
    <span class="hljs-comment"># part of the transform</span>
    rot_mat[<span class="hljs-number">0</span>,<span class="hljs-number">2</span>] += rot_move[<span class="hljs-number">0</span>]
    rot_mat[<span class="hljs-number">1</span>,<span class="hljs-number">2</span>] += rot_move[<span class="hljs-number">1</span>]
    <span class="hljs-comment"># rot_mat是最终的旋转矩阵</span>
    <span class="hljs-comment"># 获取原始矩形的四个中点,然后将这四个点转换到旋转后的坐标系下</span>
    point1 = np.dot(rot_mat, np.array([(xmin+xmax)/<span class="hljs-number">2</span>, ymin, <span class="hljs-number">1</span>]))
    point2 = np.dot(rot_mat, np.array([xmax, (ymin+ymax)/<span class="hljs-number">2</span>, <span class="hljs-number">1</span>]))
    point3 = np.dot(rot_mat, np.array([(xmin+xmax)/<span class="hljs-number">2</span>, ymax, <span class="hljs-number">1</span>]))
    point4 = np.dot(rot_mat, np.array([xmin, (ymin+ymax)/<span class="hljs-number">2</span>, <span class="hljs-number">1</span>]))
    <span class="hljs-comment"># 合并np.array</span>
    concat = np.vstack((point1, point2, point3, point4))
    <span class="hljs-comment"># 改变array类型</span>
    concat = concat.astype(np.int32)
    <span class="hljs-keyword">print</span> concat
    rx, ry, rw, rh = cv2.boundingRect(concat)
    <span class="hljs-keyword">return</span> rx, ry, rw, rh

<span class="hljs-comment"># 使图像旋转60,90,120,150,210,240,300度</span>
<span class="hljs-keyword">for</span> angle <span class="hljs-keyword">in</span> (<span class="hljs-number">60</span>, <span class="hljs-number">90</span>, <span class="hljs-number">120</span>, <span class="hljs-number">150</span>, <span class="hljs-number">210</span>, <span class="hljs-number">240</span>, <span class="hljs-number">300</span>):
    <span class="hljs-comment"># 指向图片所在的文件夹</span>
    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> os.listdir(<span class="hljs-string">"/home/username/image"</span>):
        <span class="hljs-comment"># 分离文件名与后缀</span>
        a, b = os.path.splitext(i)
        <span class="hljs-comment"># 如果后缀名是“.jpg”就旋转图像</span>
        <span class="hljs-keyword">if</span> b == <span class="hljs-string">".jpg"</span>:
            img_path = os.path.join(<span class="hljs-string">"/home/username/image"</span>, i)
            img = cv2.imread(img_path)
            rotated_img = rotate_image(img, angle)
            <span class="hljs-comment"># 写入图像</span>
            cv2.imwrite(<span class="hljs-string">"/home/yourname/rotate/"</span> + a + <span class="hljs-string">"_"</span> + str(angle) +<span class="hljs-string">"d.jpg"</span>, rotated_img)
            <span class="hljs-keyword">print</span> <span class="hljs-string">"log: [%sd] %s is processed."</span> % (angle, i)
        <span class="hljs-keyword">else</span>:
            xml_path = os.path.join(<span class="hljs-string">"/home/username/xml"</span>, i)
            img_path = <span class="hljs-string">"/home/guoyana/varied_pose/"</span> + a + <span class="hljs-string">".jpg"</span>
            src = cv2.imread(img_path)
            tree = ET.parse(xml_path)
            root = tree.getroot()
            <span class="hljs-keyword">for</span> box <span class="hljs-keyword">in</span> root.iter(<span class="hljs-string">'bndbox'</span>):
                xmin = float(box.find(<span class="hljs-string">'xmin'</span>).text)
                ymin = float(box.find(<span class="hljs-string">'ymin'</span>).text)
                xmax = float(box.find(<span class="hljs-string">'xmax'</span>).text)
                ymax = float(box.find(<span class="hljs-string">'ymax'</span>).text)
                x, y, w, h = rotate_xml(src, xmin, ymin, xmax, ymax, angle)
                <span class="hljs-comment"># 改变xml中的人脸坐标值</span>
                box.find(<span class="hljs-string">'xmin'</span>).text = str(x)
                box.find(<span class="hljs-string">'ymin'</span>).text = str(y)
                box.find(<span class="hljs-string">'ymax'</span>).text = str(x+w)
                box.find(<span class="hljs-string">'ymax'</span>).text = str(y+h)
                box.set(<span class="hljs-string">'updated'</span>, <span class="hljs-string">'yes'</span>)
            <span class="hljs-comment"># 写入新的xml</span>
            tree.write(<span class="hljs-string">"/home/username/xml/"</span> + a + <span class="hljs-string">"_"</span> + str(angle) +<span class="hljs-string">".xml"</span>)
            <span class="hljs-keyword">print</span> <span class="hljs-string">"[%s] %s is processed."</span> % (angle, i)</code><ul class="pre-numbering" style="opacity: 0;"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li><li>95</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li><li>95</li></ul></pre>



<h2 id="3结果"><a name="t2" target="_blank"></a>3、结果</h2>

<p>我们来看下旋转后的图像和修改后的.xml文件 <br>
太多了,这里只放两张~ <br>
<img src="https://img-blog.csdn.net/20161123133858076" alt="这里写图片描述" title="">  <img src="https://img-blog.csdn.net/20161123133910139" alt="这里写图片描述" title=""> <br>
修改后的xml文件如下</p>



<pre class="prettyprint" name="code"><code class="hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">annotation</span>></span>
    <span class="hljs-tag"><<span class="hljs-title">object</span>></span>
        <span class="hljs-tag"><<span class="hljs-title">name</span>></span>face<span class="hljs-tag"></<span class="hljs-title">name</span>></span>
        <span class="hljs-tag"><<span class="hljs-title">difficult</span>></span>0<span class="hljs-tag"></<span class="hljs-title">difficult</span>></span>
        <span class="hljs-tag"><<span class="hljs-title">bndbox</span> <span class="hljs-attribute">updated</span>=<span class="hljs-value">"yes"</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">xmin</span>></span>460<span class="hljs-tag"></<span class="hljs-title">xmin</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">ymin</span>></span>521<span class="hljs-tag"></<span class="hljs-title">ymin</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">xmax</span>></span>693.677419<span class="hljs-tag"></<span class="hljs-title">xmax</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">ymax</span>></span>849<span class="hljs-tag"></<span class="hljs-title">ymax</span>></span>
        <span class="hljs-tag"></<span class="hljs-title">bndbox</span>></span>
    <span class="hljs-tag"></<span class="hljs-title">object</span>></span>
<span class="hljs-tag"></<span class="hljs-title">annotation</span>></span></code><ul class="pre-numbering" style="opacity: 0;"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul></pre>

<p>效果怎么样呢?我们来写个小程序看一下</p>



<pre class="prettyprint" name="code"><code class="language-python hljs  has-numbering"><span class="hljs-keyword">import</span> cv2
<span class="hljs-keyword">import</span> os
<span class="hljs-keyword">import</span> xml.etree.ElementTree <span class="hljs-keyword">as</span> ET
<span class="hljs-keyword">import</span> pdb

<span class="hljs-keyword">for</span> img <span class="hljs-keyword">in</span> os.listdir(<span class="hljs-string">"/home/mi/rotate/"</span>):
    a, b = os.path.splitext(img)
    <span class="hljs-keyword">if</span> b == <span class="hljs-string">".jpg"</span>:
        img = cv2.imread(<span class="hljs-string">"/home/yourname/rotate/"</span> + img)
        tree = ET.parse(<span class="hljs-string">"/home/yourname/xml/"</span> + a + <span class="hljs-string">".xml"</span>)
        root = tree.getroot()
        <span class="hljs-keyword">for</span> box <span class="hljs-keyword">in</span> root.iter(<span class="hljs-string">'bndbox'</span>):
            x1 = float(box.find(<span class="hljs-string">'xmin'</span>).text)
            y1 = float(box.find(<span class="hljs-string">'ymin'</span>).text)
            x2 = float(box.find(<span class="hljs-string">'xmax'</span>).text)
            y2 = float(box.find(<span class="hljs-string">'ymax'</span>).text)

            x1 = int(x1)
            y1 = int(y1)
            x2 = int(x2)
            y2 = int(y2)
            cv2.rectangle(img, (x1, y1), (x2, y2), [<span class="hljs-number">0</span>,<span class="hljs-number">255</span>,<span class="hljs-number">0</span>], <span class="hljs-number">2</span>)
            cv2.imshow(<span class="hljs-string">"test"</span>, img)
        <span class="hljs-keyword">if</span> <span class="hljs-number">1</span> == cv2.waitKey(<span class="hljs-number">0</span>):
            <span class="hljs-keyword">pass</span></code><ul class="pre-numbering" style="opacity: 0;"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li></ul></pre>

<p><img src="https://img-blog.csdn.net/20161123134058734" alt="这里写图片描述" title="">          <img src="https://img-blog.csdn.net/20161123133656970" alt="这里写图片描述" title=""></p>

<hr>

<p>(end)</p></div>
        <script type="text/javascript">
            $(function () {
                $('pre.prettyprint code').each(function () {
                    var lines = $(this).text().split('\n').length;
                    var $numbering = $('<ul></ul>').addClass('pre-numbering').hide();
                    $(this).addClass('has-numbering').parent().append($numbering);
                    for (i = 1; i <= lines; i++) {
                        $numbering.append($('<li></li>').text(i));
                    };
                    $numbering.fadeIn(1700);
                });
            });
        </script>
   
</div>

猜你喜欢

转载自blog.csdn.net/judyqing/article/details/77833413
今日推荐